browser-debugger-cli 0.5.1 → 0.6.0

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 (266) hide show
  1. package/README.md +50 -4
  2. package/dist/__tests__/smoke/error-handling.smoke.test.js +0 -11
  3. package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -1
  4. package/dist/cdp/protocol.d.ts +121 -0
  5. package/dist/cdp/protocol.d.ts.map +1 -0
  6. package/dist/cdp/protocol.js +215 -0
  7. package/dist/cdp/protocol.js.map +1 -0
  8. package/dist/cdp/schema.d.ts +159 -0
  9. package/dist/cdp/schema.d.ts.map +1 -0
  10. package/dist/cdp/schema.js +256 -0
  11. package/dist/cdp/schema.js.map +1 -0
  12. package/dist/cdp/types.d.ts +139 -0
  13. package/dist/cdp/types.d.ts.map +1 -0
  14. package/dist/cdp/types.js +7 -0
  15. package/dist/cdp/types.js.map +1 -0
  16. package/dist/commands/cdp.d.ts +10 -1
  17. package/dist/commands/cdp.d.ts.map +1 -1
  18. package/dist/commands/cdp.js +363 -26
  19. package/dist/commands/cdp.js.map +1 -1
  20. package/dist/commands/cleanup.js +3 -3
  21. package/dist/commands/cleanup.js.map +1 -1
  22. package/dist/commands/dom.d.ts.map +1 -1
  23. package/dist/commands/dom.js +1 -0
  24. package/dist/commands/dom.js.map +1 -1
  25. package/dist/commands/domEvalHelpers.d.ts +2 -15
  26. package/dist/commands/domEvalHelpers.d.ts.map +1 -1
  27. package/dist/commands/domEvalHelpers.js +1 -1
  28. package/dist/commands/domEvalHelpers.js.map +1 -1
  29. package/dist/commands/peek.d.ts.map +1 -1
  30. package/dist/commands/peek.js +12 -6
  31. package/dist/commands/peek.js.map +1 -1
  32. package/dist/commands/shared/CommandRunner.d.ts +2 -0
  33. package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
  34. package/dist/commands/shared/CommandRunner.js +13 -1
  35. package/dist/commands/shared/CommandRunner.js.map +1 -1
  36. package/dist/commands/shared/commonOptions.d.ts.map +1 -1
  37. package/dist/commands/shared/commonOptions.js +2 -2
  38. package/dist/commands/shared/commonOptions.js.map +1 -1
  39. package/dist/commands/start.d.ts.map +1 -1
  40. package/dist/commands/start.js +21 -12
  41. package/dist/commands/start.js.map +1 -1
  42. package/dist/commands/status.js +2 -2
  43. package/dist/commands/status.js.map +1 -1
  44. package/dist/commands/stop.js +2 -2
  45. package/dist/commands/stop.js.map +1 -1
  46. package/dist/commands/tail.d.ts.map +1 -1
  47. package/dist/commands/tail.js +9 -6
  48. package/dist/commands/tail.js.map +1 -1
  49. package/dist/connection/cdp.d.ts.map +1 -1
  50. package/dist/connection/cdp.js +15 -2
  51. package/dist/connection/cdp.js.map +1 -1
  52. package/dist/connection/domOperations.d.ts.map +1 -1
  53. package/dist/connection/domOperations.js +3 -1
  54. package/dist/connection/domOperations.js.map +1 -1
  55. package/dist/connection/handlers.d.ts +34 -2
  56. package/dist/connection/handlers.d.ts.map +1 -1
  57. package/dist/connection/handlers.js +28 -2
  58. package/dist/connection/handlers.js.map +1 -1
  59. package/dist/connection/launcher.d.ts.map +1 -1
  60. package/dist/connection/launcher.js +14 -2
  61. package/dist/connection/launcher.js.map +1 -1
  62. package/dist/connection/pageReadiness.d.ts.map +1 -1
  63. package/dist/connection/pageReadiness.js +6 -6
  64. package/dist/connection/pageReadiness.js.map +1 -1
  65. package/dist/connection/typed-cdp.d.ts +144 -0
  66. package/dist/connection/typed-cdp.d.ts.map +1 -0
  67. package/dist/connection/typed-cdp.js +120 -0
  68. package/dist/connection/typed-cdp.js.map +1 -0
  69. package/dist/daemon/worker/commandRegistry.d.ts.map +1 -1
  70. package/dist/daemon/worker/commandRegistry.js.map +1 -1
  71. package/dist/telemetry/__tests__/network.contract.test.js +124 -93
  72. package/dist/telemetry/__tests__/network.contract.test.js.map +1 -1
  73. package/dist/telemetry/console.d.ts.map +1 -1
  74. package/dist/telemetry/console.js +3 -2
  75. package/dist/telemetry/console.js.map +1 -1
  76. package/dist/telemetry/dialogs.d.ts.map +1 -1
  77. package/dist/telemetry/dialogs.js.map +1 -1
  78. package/dist/telemetry/dom.d.ts.map +1 -1
  79. package/dist/telemetry/dom.js +3 -1
  80. package/dist/telemetry/dom.js.map +1 -1
  81. package/dist/telemetry/navigation.d.ts.map +1 -1
  82. package/dist/telemetry/navigation.js.map +1 -1
  83. package/dist/telemetry/network.d.ts.map +1 -1
  84. package/dist/telemetry/network.js.map +1 -1
  85. package/dist/types.d.ts +0 -141
  86. package/dist/types.d.ts.map +1 -1
  87. package/dist/ui/messages/commands.d.ts +1 -0
  88. package/dist/ui/messages/commands.d.ts.map +1 -1
  89. package/dist/ui/messages/commands.js +1 -0
  90. package/dist/ui/messages/commands.js.map +1 -1
  91. package/dist/ui/messages/errors.d.ts +30 -3
  92. package/dist/ui/messages/errors.d.ts.map +1 -1
  93. package/dist/ui/messages/errors.js +36 -8
  94. package/dist/ui/messages/errors.js.map +1 -1
  95. package/dist/ui/messages/session.d.ts.map +1 -1
  96. package/dist/ui/messages/session.js +5 -4
  97. package/dist/ui/messages/session.js.map +1 -1
  98. package/dist/ui/messages/validation.d.ts +22 -4
  99. package/dist/ui/messages/validation.d.ts.map +1 -1
  100. package/dist/ui/messages/validation.js +26 -5
  101. package/dist/ui/messages/validation.js.map +1 -1
  102. package/package.json +2 -1
  103. package/dist/cli/commands/__tests__/start.unit.test.d.ts +0 -2
  104. package/dist/cli/commands/__tests__/start.unit.test.d.ts.map +0 -1
  105. package/dist/cli/commands/__tests__/start.unit.test.js +0 -131
  106. package/dist/cli/commands/__tests__/start.unit.test.js.map +0 -1
  107. package/dist/cli/commands/cleanup.d.ts +0 -9
  108. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  109. package/dist/cli/commands/cleanup.js +0 -148
  110. package/dist/cli/commands/cleanup.js.map +0 -1
  111. package/dist/cli/commands/details.d.ts +0 -9
  112. package/dist/cli/commands/details.d.ts.map +0 -1
  113. package/dist/cli/commands/details.js +0 -120
  114. package/dist/cli/commands/details.js.map +0 -1
  115. package/dist/cli/commands/peek.d.ts +0 -9
  116. package/dist/cli/commands/peek.d.ts.map +0 -1
  117. package/dist/cli/commands/peek.js +0 -64
  118. package/dist/cli/commands/peek.js.map +0 -1
  119. package/dist/cli/commands/query.d.ts +0 -9
  120. package/dist/cli/commands/query.d.ts.map +0 -1
  121. package/dist/cli/commands/query.js +0 -125
  122. package/dist/cli/commands/query.js.map +0 -1
  123. package/dist/cli/commands/start.d.ts +0 -83
  124. package/dist/cli/commands/start.d.ts.map +0 -1
  125. package/dist/cli/commands/start.js +0 -204
  126. package/dist/cli/commands/start.js.map +0 -1
  127. package/dist/cli/commands/status.d.ts +0 -9
  128. package/dist/cli/commands/status.d.ts.map +0 -1
  129. package/dist/cli/commands/status.js +0 -75
  130. package/dist/cli/commands/status.js.map +0 -1
  131. package/dist/cli/commands/stop.d.ts +0 -9
  132. package/dist/cli/commands/stop.d.ts.map +0 -1
  133. package/dist/cli/commands/stop.js +0 -133
  134. package/dist/cli/commands/stop.js.map +0 -1
  135. package/dist/cli/formatters/detailsFormatter.d.ts +0 -10
  136. package/dist/cli/formatters/detailsFormatter.d.ts.map +0 -1
  137. package/dist/cli/formatters/detailsFormatter.js +0 -63
  138. package/dist/cli/formatters/detailsFormatter.js.map +0 -1
  139. package/dist/cli/formatters/previewFormatter.d.ts +0 -27
  140. package/dist/cli/formatters/previewFormatter.d.ts.map +0 -1
  141. package/dist/cli/formatters/previewFormatter.js +0 -155
  142. package/dist/cli/formatters/previewFormatter.js.map +0 -1
  143. package/dist/cli/formatters/statusFormatter.d.ts +0 -42
  144. package/dist/cli/formatters/statusFormatter.d.ts.map +0 -1
  145. package/dist/cli/formatters/statusFormatter.js +0 -126
  146. package/dist/cli/formatters/statusFormatter.js.map +0 -1
  147. package/dist/cli/handlers/ChromeBootstrap.d.ts +0 -24
  148. package/dist/cli/handlers/ChromeBootstrap.d.ts.map +0 -1
  149. package/dist/cli/handlers/ChromeBootstrap.js +0 -50
  150. package/dist/cli/handlers/ChromeBootstrap.js.map +0 -1
  151. package/dist/cli/handlers/OutputBuilder.d.ts +0 -59
  152. package/dist/cli/handlers/OutputBuilder.d.ts.map +0 -1
  153. package/dist/cli/handlers/OutputBuilder.js +0 -136
  154. package/dist/cli/handlers/OutputBuilder.js.map +0 -1
  155. package/dist/cli/handlers/OutputWriter.d.ts +0 -15
  156. package/dist/cli/handlers/OutputWriter.d.ts.map +0 -1
  157. package/dist/cli/handlers/OutputWriter.js +0 -34
  158. package/dist/cli/handlers/OutputWriter.js.map +0 -1
  159. package/dist/cli/handlers/PreviewWriter.d.ts +0 -52
  160. package/dist/cli/handlers/PreviewWriter.d.ts.map +0 -1
  161. package/dist/cli/handlers/PreviewWriter.js +0 -118
  162. package/dist/cli/handlers/PreviewWriter.js.map +0 -1
  163. package/dist/cli/handlers/SessionLock.d.ts +0 -16
  164. package/dist/cli/handlers/SessionLock.d.ts.map +0 -1
  165. package/dist/cli/handlers/SessionLock.js +0 -35
  166. package/dist/cli/handlers/SessionLock.js.map +0 -1
  167. package/dist/cli/handlers/SessionLoop.d.ts +0 -19
  168. package/dist/cli/handlers/SessionLoop.d.ts.map +0 -1
  169. package/dist/cli/handlers/SessionLoop.js +0 -47
  170. package/dist/cli/handlers/SessionLoop.js.map +0 -1
  171. package/dist/cli/handlers/ShutdownController.d.ts +0 -41
  172. package/dist/cli/handlers/ShutdownController.d.ts.map +0 -1
  173. package/dist/cli/handlers/ShutdownController.js +0 -94
  174. package/dist/cli/handlers/ShutdownController.js.map +0 -1
  175. package/dist/cli/handlers/SignalHandler.d.ts +0 -35
  176. package/dist/cli/handlers/SignalHandler.d.ts.map +0 -1
  177. package/dist/cli/handlers/SignalHandler.js +0 -81
  178. package/dist/cli/handlers/SignalHandler.js.map +0 -1
  179. package/dist/cli/handlers/TargetSetup.d.ts +0 -42
  180. package/dist/cli/handlers/TargetSetup.d.ts.map +0 -1
  181. package/dist/cli/handlers/TargetSetup.js +0 -87
  182. package/dist/cli/handlers/TargetSetup.js.map +0 -1
  183. package/dist/cli/handlers/sessionController.d.ts +0 -62
  184. package/dist/cli/handlers/sessionController.d.ts.map +0 -1
  185. package/dist/cli/handlers/sessionController.js +0 -316
  186. package/dist/cli/handlers/sessionController.js.map +0 -1
  187. package/dist/cli/registry.d.ts +0 -11
  188. package/dist/cli/registry.d.ts.map +0 -1
  189. package/dist/cli/registry.js +0 -21
  190. package/dist/cli/registry.js.map +0 -1
  191. package/dist/collectors/console.d.ts +0 -19
  192. package/dist/collectors/console.d.ts.map +0 -1
  193. package/dist/collectors/console.js +0 -87
  194. package/dist/collectors/console.js.map +0 -1
  195. package/dist/collectors/dom.d.ts +0 -21
  196. package/dist/collectors/dom.d.ts.map +0 -1
  197. package/dist/collectors/dom.js +0 -99
  198. package/dist/collectors/dom.js.map +0 -1
  199. package/dist/collectors/network.d.ts +0 -32
  200. package/dist/collectors/network.d.ts.map +0 -1
  201. package/dist/collectors/network.js +0 -191
  202. package/dist/collectors/network.js.map +0 -1
  203. package/dist/connection/tabs.d.ts +0 -52
  204. package/dist/connection/tabs.d.ts.map +0 -1
  205. package/dist/connection/tabs.js +0 -227
  206. package/dist/connection/tabs.js.map +0 -1
  207. package/dist/help/machineReadableHelp.d.ts +0 -100
  208. package/dist/help/machineReadableHelp.d.ts.map +0 -1
  209. package/dist/help/machineReadableHelp.js +0 -139
  210. package/dist/help/machineReadableHelp.js.map +0 -1
  211. package/dist/session/BdgSession.d.ts +0 -91
  212. package/dist/session/BdgSession.d.ts.map +0 -1
  213. package/dist/session/BdgSession.js +0 -230
  214. package/dist/session/BdgSession.js.map +0 -1
  215. package/dist/ui/errors/SystemErrors.d.ts +0 -22
  216. package/dist/ui/errors/SystemErrors.d.ts.map +0 -1
  217. package/dist/ui/errors/SystemErrors.js +0 -23
  218. package/dist/ui/errors/SystemErrors.js.map +0 -1
  219. package/dist/ui/errors.d.ts +0 -39
  220. package/dist/ui/errors.d.ts.map +0 -1
  221. package/dist/ui/errors.js +0 -48
  222. package/dist/ui/errors.js.map +0 -1
  223. package/dist/ui/messages/deprecation.d.ts +0 -30
  224. package/dist/ui/messages/deprecation.d.ts.map +0 -1
  225. package/dist/ui/messages/deprecation.js +0 -49
  226. package/dist/ui/messages/deprecation.js.map +0 -1
  227. package/dist/ui/messages/index.d.ts +0 -12
  228. package/dist/ui/messages/index.d.ts.map +0 -1
  229. package/dist/ui/messages/index.js +0 -12
  230. package/dist/ui/messages/index.js.map +0 -1
  231. package/dist/utils/__tests__/filters.unit.test.d.ts +0 -2
  232. package/dist/utils/__tests__/filters.unit.test.d.ts.map +0 -1
  233. package/dist/utils/__tests__/filters.unit.test.js +0 -239
  234. package/dist/utils/__tests__/filters.unit.test.js.map +0 -1
  235. package/dist/utils/cdpHandlers.d.ts +0 -31
  236. package/dist/utils/cdpHandlers.d.ts.map +0 -1
  237. package/dist/utils/cdpHandlers.js +0 -38
  238. package/dist/utils/cdpHandlers.js.map +0 -1
  239. package/dist/utils/chromeDiagnostics.d.ts +0 -16
  240. package/dist/utils/chromeDiagnostics.d.ts.map +0 -1
  241. package/dist/utils/chromeDiagnostics.js +0 -37
  242. package/dist/utils/chromeDiagnostics.js.map +0 -1
  243. package/dist/utils/errors.d.ts +0 -82
  244. package/dist/utils/errors.d.ts.map +0 -1
  245. package/dist/utils/errors.js +0 -88
  246. package/dist/utils/errors.js.map +0 -1
  247. package/dist/utils/filters.d.ts +0 -148
  248. package/dist/utils/filters.d.ts.map +0 -1
  249. package/dist/utils/filters.js +0 -358
  250. package/dist/utils/filters.js.map +0 -1
  251. package/dist/utils/logger.d.ts +0 -98
  252. package/dist/utils/logger.d.ts.map +0 -1
  253. package/dist/utils/logger.js +0 -93
  254. package/dist/utils/logger.js.map +0 -1
  255. package/dist/utils/pageReadiness.d.ts +0 -46
  256. package/dist/utils/pageReadiness.d.ts.map +0 -1
  257. package/dist/utils/pageReadiness.js +0 -270
  258. package/dist/utils/pageReadiness.js.map +0 -1
  259. package/dist/utils/session.d.ts +0 -200
  260. package/dist/utils/session.d.ts.map +0 -1
  261. package/dist/utils/session.js +0 -498
  262. package/dist/utils/session.js.map +0 -1
  263. package/dist/utils/validation.d.ts +0 -12
  264. package/dist/utils/validation.d.ts.map +0 -1
  265. package/dist/utils/validation.js +0 -20
  266. package/dist/utils/validation.js.map +0 -1
@@ -1,316 +0,0 @@
1
- import { getChromeDiagnostics, formatDiagnosticsForError } from '../../utils/chromeDiagnostics.js';
2
- import { ChromeLaunchError } from '../../utils/errors.js';
3
- import { getExitCodeForError } from '../../utils/exitCodes.js';
4
- import { writePid, writeSessionMetadata, writeChromePid } from '../../utils/session.js';
5
- import { ChromeBootstrap } from './ChromeBootstrap.js';
6
- import { OutputBuilder } from './OutputBuilder.js';
7
- import { PreviewWriter } from './PreviewWriter.js';
8
- import { SessionLock } from './SessionLock.js';
9
- import { SessionLoop } from './SessionLoop.js';
10
- import { ShutdownController } from './ShutdownController.js';
11
- import { SignalHandler } from './SignalHandler.js';
12
- import { TargetSetup } from './TargetSetup.js';
13
- /**
14
- * Report detailed diagnostic information when Chrome fails to launch.
15
- *
16
- * Uses chrome-launcher APIs to detect available Chrome installations and
17
- * provide actionable error messages to help users troubleshoot.
18
- *
19
- * @param error Original error that caused the failure
20
- */
21
- function reportLauncherFailure(error) {
22
- console.error('\n--- Chrome Launch Diagnostics ---\n');
23
- // Show original error
24
- const errorMessage = error instanceof Error ? error.message : String(error);
25
- console.error(`Error: ${errorMessage}\n`);
26
- // Get diagnostics using shared utility (cached to avoid repeated scans)
27
- const diagnostics = getChromeDiagnostics();
28
- const diagnosticLines = formatDiagnosticsForError(diagnostics);
29
- diagnosticLines.forEach((line) => console.error(line));
30
- // Provide troubleshooting steps
31
- console.error('Troubleshooting:');
32
- console.error(' 1. Verify Chrome is installed and accessible');
33
- console.error(' 2. Check file permissions for Chrome binary');
34
- console.error(' 3. Try specifying a custom port: bdg <url> --port 9223');
35
- console.error(' 4. Use strict port mode: bdg <url> --port-strict');
36
- console.error(' 5. Check if another process is using the debugging port\n');
37
- }
38
- /**
39
- * Aggressively cleanup stale Chrome processes launched by bdg.
40
- *
41
- * This function kills Chrome instances that were launched by bdg by:
42
- * 1. Reading the Chrome PID from persistent cache (~/.bdg/chrome.pid)
43
- * 2. Killing that specific Chrome process using cross-platform kill logic
44
- *
45
- * The cache survives session cleanup, so this works even after a normal session end.
46
- *
47
- * Cross-platform killing:
48
- * - Windows: Uses `taskkill /pid <pid> /T /F` to kill process tree
49
- * - Unix/macOS: Uses `process.kill(-pid, 'SIGKILL')` to kill process group
50
- *
51
- * Note: We can't use chromeLauncher.killAll() because it only tracks instances
52
- * created via chromeLauncher.launch(), but we use new chromeLauncher.Launcher()
53
- * which doesn't register in that tracking set.
54
- *
55
- * @returns Number of errors encountered during cleanup
56
- */
57
- export async function cleanupStaleChrome() {
58
- console.error('\nAttempting to kill stale Chrome processes...');
59
- try {
60
- // Import session utilities (dynamic import for ES modules)
61
- const sessionModule = await import('../../utils/session.js');
62
- const { readChromePid, clearChromePid, killChromeProcess } = sessionModule;
63
- // Read Chrome PID from persistent cache
64
- const chromePid = readChromePid();
65
- if (!chromePid) {
66
- console.error('Warning: No Chrome PID found in cache');
67
- console.error(' Either Chrome was already running, or no Chrome was launched by bdg\n');
68
- return 0;
69
- }
70
- // Kill Chrome process (cross-platform)
71
- console.error(`Killing Chrome process (PID: ${chromePid})...`);
72
- try {
73
- // Use SIGKILL for aggressive cleanup (force kill)
74
- killChromeProcess(chromePid, 'SIGKILL');
75
- console.error('Chrome process killed successfully');
76
- // Clear the cache after successful kill
77
- clearChromePid();
78
- return 0;
79
- }
80
- catch (killError) {
81
- const errorMessage = killError instanceof Error ? killError.message : String(killError);
82
- console.error(`Error: Failed to kill Chrome process: ${errorMessage}`);
83
- console.error(' Try manually killing Chrome processes if issues persist\n');
84
- return 1;
85
- }
86
- }
87
- catch (error) {
88
- console.error(`Error: Failed to cleanup Chrome processes: ${error instanceof Error ? error.message : String(error)}\n`);
89
- return 1;
90
- }
91
- }
92
- /**
93
- * Encapsulates session state and lifecycle management
94
- */
95
- class SessionContext {
96
- session = null;
97
- launchedChrome = null;
98
- isShuttingDown = false;
99
- previewWriter = null;
100
- startTime;
101
- target = null;
102
- compact;
103
- shutdownController;
104
- /**
105
- * Create a new session context and track the start timestamp.
106
- * The context is shared with signal handlers so they can orchestrate shutdown.
107
- *
108
- * @param compact - If true, use compact JSON format (no indentation)
109
- */
110
- constructor(compact = false) {
111
- this.startTime = Date.now();
112
- this.compact = compact;
113
- this.shutdownController = new ShutdownController(this);
114
- }
115
- /**
116
- * Handle graceful shutdown: stops collectors, writes output, and exits.
117
- *
118
- * Idempotent — repeated calls after shutdown has started are ignored.
119
- */
120
- async stop() {
121
- await this.shutdownController.shutdown();
122
- }
123
- /**
124
- * Cleanup on error paths without exiting the process.
125
- * Clears timers, tears down Chrome if bdg launched it, and removes session files.
126
- */
127
- async cleanup() {
128
- await this.shutdownController.cleanup();
129
- }
130
- }
131
- /**
132
- * Phase 4: start requested collectors and persist session metadata for tooling.
133
- *
134
- * @param session Active BDG session instance
135
- * @param collectors Collector types requested by the CLI
136
- * @param startTime Timestamp when the session began
137
- * @param port Chrome debugging port in use
138
- * @param target Target metadata (includes websocket URL)
139
- * @param chromePid PID of Chrome if bdg launched it (optional)
140
- */
141
- async function startCollectorsAndMetadata(session, collectors, startTime, port, target, chromePid) {
142
- // Start collectors with timing
143
- const collectorStartTime = Date.now();
144
- for (const collector of collectors) {
145
- const individualStart = Date.now();
146
- await session.startCollector(collector);
147
- const individualDuration = Date.now() - individualStart;
148
- console.error(`[PERF] Collector '${collector}' initialized: ${individualDuration}ms`);
149
- }
150
- const totalCollectorDuration = Date.now() - collectorStartTime;
151
- console.error(`[PERF] All collectors initialized: ${totalCollectorDuration}ms`);
152
- // Write session metadata
153
- writePid(process.pid);
154
- writeSessionMetadata({
155
- bdgPid: process.pid,
156
- chromePid,
157
- startTime,
158
- port,
159
- targetId: target.id,
160
- webSocketDebuggerUrl: target.webSocketDebuggerUrl,
161
- activeCollectors: collectors,
162
- });
163
- // Note: Chrome PID cache is written immediately after launch (Phase 2)
164
- // to ensure it's available even if later phases fail
165
- }
166
- /**
167
- * Phase 5: Start preview writer with two-tier system
168
- *
169
- * Uses async I/O with mutex to prevent event loop blocking and overlapping writes.
170
- */
171
- function startPreviewWriter(context, compact) {
172
- if (!context.session) {
173
- return;
174
- }
175
- // Create and start preview writer
176
- context.previewWriter = new PreviewWriter(context.session, context.startTime, 5000, // intervalMs
177
- compact);
178
- context.previewWriter.start();
179
- }
180
- /**
181
- * Print collection status message
182
- */
183
- function printCollectionStatus(collectors, timeout) {
184
- const collectorNames = collectors.length === 3 ? 'network, console, and DOM' : collectors.join(', ');
185
- if (timeout) {
186
- console.error(`Collecting ${collectorNames}... (Ctrl+C to stop and output, or wait ${timeout}s for timeout)`);
187
- }
188
- else {
189
- console.error(`Collecting ${collectorNames}... (Ctrl+C to stop and output, or use 'bdg stop')`);
190
- }
191
- }
192
- /**
193
- * Start a new session
194
- *
195
- * @param url - Target URL to navigate to
196
- * @param options - Session configuration options
197
- * @param options.port - Chrome debugging port
198
- * @param options.timeout - Auto-stop after timeout (seconds)
199
- * @param options.reuseTab - Navigate existing tab instead of creating new one
200
- * @param options.userDataDir - Chrome user data directory
201
- * @param options.includeAll - Include all data (disable filtering)
202
- * @param options.logLevel - Chrome launcher log level
203
- * @param options.prefs - Chrome preferences as object
204
- * @param options.prefsFile - Path to JSON file containing Chrome preferences
205
- * @param options.chromeFlags - Additional Chrome command-line flags
206
- * @param options.connectionPollInterval - Milliseconds between CDP readiness checks
207
- * @param options.maxConnectionRetries - Maximum retry attempts before failing
208
- * @param options.portStrictMode - Fail if Chrome debugging port is already in use
209
- * @param collectors - Array of collector types to enable ('dom', 'network', 'console')
210
- * @returns Promise that resolves when session completes
211
- */
212
- export async function startSession(url, options, collectors) {
213
- const context = new SessionContext(options.compact ?? false);
214
- // Setup signal handlers for graceful shutdown
215
- const signalHandler = new SignalHandler({
216
- onShutdown: async () => {
217
- await context.stop();
218
- },
219
- });
220
- signalHandler.register();
221
- try {
222
- // Phase 1: Lock acquisition and validation
223
- const targetUrl = SessionLock.acquire(url, collectors);
224
- // Phase 2: Chrome bootstrap
225
- // Build launcher options, filtering out undefined values
226
- const launchOptions = Object.fromEntries(Object.entries({
227
- userDataDir: options.userDataDir,
228
- logLevel: options.logLevel,
229
- prefs: options.prefs,
230
- prefsFile: options.prefsFile,
231
- chromeFlags: options.chromeFlags,
232
- connectionPollInterval: options.connectionPollInterval,
233
- maxConnectionRetries: options.maxConnectionRetries,
234
- portStrictMode: options.portStrictMode,
235
- }).filter(([, value]) => value !== undefined));
236
- context.launchedChrome = await ChromeBootstrap.launch(options.port, targetUrl, launchOptions);
237
- // Write Chrome PID to persistent cache immediately after launch
238
- // This must happen before Phase 3 so it's available even if setup fails
239
- if (context.launchedChrome?.pid) {
240
- writeChromePid(context.launchedChrome.pid);
241
- }
242
- // Phase 3: CDP connection and target setup
243
- const setupStart = Date.now();
244
- const sessionOptions = {
245
- includeAll: options.includeAll ?? false,
246
- fetchAllBodies: options.fetchAllBodies ?? false,
247
- compact: options.compact ?? false,
248
- };
249
- if (options.fetchBodiesInclude !== undefined) {
250
- sessionOptions.fetchBodiesInclude = options.fetchBodiesInclude;
251
- }
252
- if (options.fetchBodiesExclude !== undefined) {
253
- sessionOptions.fetchBodiesExclude = options.fetchBodiesExclude;
254
- }
255
- if (options.networkInclude !== undefined) {
256
- sessionOptions.networkInclude = options.networkInclude;
257
- }
258
- if (options.networkExclude !== undefined) {
259
- sessionOptions.networkExclude = options.networkExclude;
260
- }
261
- const setupResult = await TargetSetup.setup(url, targetUrl, options.port, options.reuseTab ?? false, sessionOptions);
262
- const session = setupResult.session;
263
- const target = setupResult.target;
264
- context.session = session;
265
- context.target = target;
266
- console.error(`[PERF] CDP connection and target setup: ${Date.now() - setupStart}ms`);
267
- // Phase 4: Start collectors and write metadata
268
- await startCollectorsAndMetadata(session, collectors, context.startTime, options.port, target, context.launchedChrome?.pid);
269
- // Log active collectors for forensic tracking and optimization prioritization
270
- console.error(`[bdg] active collectors: ${collectors.join(', ')} (${url}, port ${options.port})`);
271
- // Total session startup time
272
- const totalStartupTime = Date.now() - context.startTime;
273
- console.error(`[PERF] Total session startup: ${totalStartupTime}ms`);
274
- // Print status
275
- printCollectionStatus(collectors, options.timeout);
276
- // Set timeout if explicitly provided
277
- if (options.timeout) {
278
- setTimeout(() => {
279
- console.error(`\nTimeout reached (${options.timeout}s)`);
280
- void context.stop();
281
- }, options.timeout * 1000);
282
- }
283
- // Phase 5: Start preview writer
284
- startPreviewWriter(context, options.compact ?? false);
285
- // Optional: Log memory usage periodically (every 30s)
286
- const memoryLogInterval = setInterval(() => {
287
- const usage = process.memoryUsage();
288
- const heapUsedMB = (usage.heapUsed / 1024 / 1024).toFixed(2);
289
- const heapTotalMB = (usage.heapTotal / 1024 / 1024).toFixed(2);
290
- const rssMB = (usage.rss / 1024 / 1024).toFixed(2);
291
- console.error(`[PERF] Memory: Heap ${heapUsedMB}/${heapTotalMB} MB, RSS ${rssMB} MB`);
292
- }, 30000);
293
- // Store interval in context for cleanup
294
- const originalCleanup = context.cleanup.bind(context);
295
- context.cleanup = async () => {
296
- clearInterval(memoryLogInterval);
297
- await originalCleanup();
298
- };
299
- // Phase 6: Run session loop
300
- await SessionLoop.run(session, target);
301
- }
302
- catch (error) {
303
- // Show diagnostic information for Chrome launch failures
304
- if (error instanceof ChromeLaunchError) {
305
- reportLauncherFailure(error);
306
- }
307
- const errorOutput = OutputBuilder.buildError(error, context.startTime, context.target ?? undefined);
308
- console.log(JSON.stringify(errorOutput, null, 2));
309
- // Cleanup on error
310
- await context.cleanup();
311
- // Use semantic exit codes based on error type
312
- const exitCode = getExitCodeForError(error);
313
- process.exit(exitCode);
314
- }
315
- }
316
- //# sourceMappingURL=sessionController.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessionController.js","sourceRoot":"","sources":["../../../src/cli/handlers/sessionController.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { Command } from 'commander';
2
- /**
3
- * Command registration function type
4
- */
5
- export type CommandRegistrar = (program: Command) => void;
6
- /**
7
- * Registry of all CLI commands
8
- * Order matters: start commands first (includes default), then others
9
- */
10
- export declare const commandRegistry: CommandRegistrar[];
11
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,gBAAgB,EAQ7C,CAAC"}
@@ -1,21 +0,0 @@
1
- import { registerCleanupCommand } from './commands/cleanup.js';
2
- import { registerDetailsCommand } from './commands/details.js';
3
- import { registerPeekCommand } from './commands/peek.js';
4
- import { registerQueryCommand } from './commands/query.js';
5
- import { registerStartCommands } from './commands/start.js';
6
- import { registerStatusCommand } from './commands/status.js';
7
- import { registerStopCommand } from './commands/stop.js';
8
- /**
9
- * Registry of all CLI commands
10
- * Order matters: start commands first (includes default), then others
11
- */
12
- export const commandRegistry = [
13
- registerStartCommands, // Default + dom/network/console
14
- registerQueryCommand,
15
- registerStopCommand,
16
- registerStatusCommand,
17
- registerCleanupCommand,
18
- registerDetailsCommand,
19
- registerPeekCommand,
20
- ];
21
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAO7D;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAuB;IACjD,qBAAqB,EAAE,gCAAgC;IACvD,oBAAoB;IACpB,mBAAmB;IACnB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;IACtB,mBAAmB;CACpB,CAAC"}
@@ -1,19 +0,0 @@
1
- import type { CDPConnection } from '../connection/cdp.js';
2
- import type { ConsoleMessage, CleanupFunction } from '../types.js';
3
- /**
4
- * Start collecting console messages and exceptions via CDP Runtime domain.
5
- *
6
- * Captures console.log, console.error, etc. and JavaScript exceptions thrown in the page.
7
- *
8
- * @param cdp - CDP connection instance
9
- * @param messages - Array to populate with console messages
10
- * @param includeAll - If true, disable default pattern filtering (default: false)
11
- * @returns Cleanup function to remove event handlers
12
- *
13
- * @remarks
14
- * - Message limit of 10,000 prevents memory issues in long-running sessions
15
- * - After limit is reached, new messages are silently dropped (warning logged once)
16
- * - By default, common dev server noise patterns are filtered out (use includeAll to disable)
17
- */
18
- export declare function startConsoleCollection(cdp: CDPConnection, messages: ConsoleMessage[], includeAll?: boolean): Promise<CleanupFunction>;
19
- //# sourceMappingURL=console.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/collectors/console.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAGhB,MAAM,SAAS,CAAC;AAIjB;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,cAAc,EAAE,EAC1B,UAAU,GAAE,OAAe,GAC1B,OAAO,CAAC,eAAe,CAAC,CAoF1B"}
@@ -1,87 +0,0 @@
1
- import { MAX_CONSOLE_MESSAGES } from '../constants.js';
2
- import { CDPHandlerRegistry } from '../utils/cdpHandlers.js';
3
- import { shouldExcludeConsoleMessage } from '../utils/filters.js';
4
- /**
5
- * Start collecting console messages and exceptions via CDP Runtime domain.
6
- *
7
- * Captures console.log, console.error, etc. and JavaScript exceptions thrown in the page.
8
- *
9
- * @param cdp - CDP connection instance
10
- * @param messages - Array to populate with console messages
11
- * @param includeAll - If true, disable default pattern filtering (default: false)
12
- * @returns Cleanup function to remove event handlers
13
- *
14
- * @remarks
15
- * - Message limit of 10,000 prevents memory issues in long-running sessions
16
- * - After limit is reached, new messages are silently dropped (warning logged once)
17
- * - By default, common dev server noise patterns are filtered out (use includeAll to disable)
18
- */
19
- export async function startConsoleCollection(cdp, messages, includeAll = false) {
20
- const registry = new CDPHandlerRegistry();
21
- // Enable runtime
22
- await cdp.send('Runtime.enable');
23
- await cdp.send('Log.enable');
24
- // Listen for console API calls
25
- registry.register(cdp, 'Runtime.consoleAPICalled', (params) => {
26
- const text = params.args
27
- .map((arg) => {
28
- // arg type already defined in CDPConsoleAPICalledParams
29
- if (arg.value !== undefined) {
30
- // Handle different value types - primitives only, objects use description
31
- const value = arg.value;
32
- if (typeof value === 'string' ||
33
- typeof value === 'number' ||
34
- typeof value === 'boolean') {
35
- return String(value);
36
- }
37
- // For objects/arrays, use description if available
38
- return arg.description ?? '[object]';
39
- }
40
- if (arg.description !== undefined) {
41
- return arg.description;
42
- }
43
- return '';
44
- })
45
- .join(' ');
46
- // Apply pattern filtering
47
- if (shouldExcludeConsoleMessage(text, includeAll)) {
48
- return;
49
- }
50
- const message = {
51
- type: params.type,
52
- text,
53
- timestamp: params.timestamp,
54
- args: params.args,
55
- };
56
- if (messages.length < MAX_CONSOLE_MESSAGES) {
57
- messages.push(message);
58
- }
59
- else if (messages.length === MAX_CONSOLE_MESSAGES) {
60
- console.error(`Warning: Console message limit reached (${MAX_CONSOLE_MESSAGES})`);
61
- }
62
- });
63
- // Listen for exceptions
64
- registry.register(cdp, 'Runtime.exceptionThrown', (params) => {
65
- const exception = params.exceptionDetails;
66
- const text = exception.text ?? exception.exception?.description ?? 'Unknown error';
67
- // Apply pattern filtering (but don't filter errors by default)
68
- // Errors are usually important, only filter if they match noise patterns
69
- if (shouldExcludeConsoleMessage(text, includeAll)) {
70
- return;
71
- }
72
- const message = {
73
- type: 'error',
74
- text,
75
- timestamp: exception.timestamp ?? Date.now(),
76
- };
77
- if (messages.length < MAX_CONSOLE_MESSAGES) {
78
- messages.push(message);
79
- }
80
- });
81
- // Return cleanup function
82
- return () => {
83
- // Remove event handlers
84
- registry.cleanup(cdp);
85
- };
86
- }
87
- //# sourceMappingURL=console.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/collectors/console.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import type { CDPConnection } from '../connection/cdp.js';
2
- import type { DOMData, CleanupFunction } from '../types.js';
3
- /**
4
- * Prepare CDP domains for DOM collection.
5
- *
6
- * Enables Page, DOM, and Runtime domains required for capturing DOM snapshots.
7
- *
8
- * @param cdp - CDP connection instance
9
- * @returns Cleanup function that disables Runtime domain
10
- */
11
- export declare function prepareDOMCollection(cdp: CDPConnection): Promise<CleanupFunction>;
12
- /**
13
- * Capture a complete DOM snapshot of the current page.
14
- *
15
- * Called during session shutdown to get the final state of the page.
16
- *
17
- * @param cdp - CDP connection instance
18
- * @returns DOM data including URL, title, and full HTML
19
- */
20
- export declare function collectDOM(cdp: CDPConnection): Promise<DOMData>;
21
- //# sourceMappingURL=dom.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/collectors/dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EAKhB,MAAM,SAAS,CAAC;AAEjB;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAsBvF;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAoFrE"}
@@ -1,99 +0,0 @@
1
- /**
2
- * Prepare CDP domains for DOM collection.
3
- *
4
- * Enables Page, DOM, and Runtime domains required for capturing DOM snapshots.
5
- *
6
- * @param cdp - CDP connection instance
7
- * @returns Cleanup function that disables Runtime domain
8
- */
9
- export async function prepareDOMCollection(cdp) {
10
- // Enable Page domain for frame tree
11
- await cdp.send('Page.enable');
12
- // Enable DOM domain for document access
13
- await cdp.send('DOM.enable');
14
- // Enable Runtime domain for document.title evaluation
15
- await cdp.send('Runtime.enable');
16
- // Return cleanup function that disables Runtime domain
17
- return () => {
18
- // Disable Runtime domain to clean up resources
19
- // Note: This is best-effort during shutdown; errors are ignored
20
- try {
21
- cdp.send('Runtime.disable').catch(() => {
22
- // Ignore errors during cleanup (Chrome may be closing)
23
- });
24
- }
25
- catch {
26
- // Ignore synchronous errors
27
- }
28
- };
29
- }
30
- /**
31
- * Capture a complete DOM snapshot of the current page.
32
- *
33
- * Called during session shutdown to get the final state of the page.
34
- *
35
- * @param cdp - CDP connection instance
36
- * @returns DOM data including URL, title, and full HTML
37
- */
38
- export async function collectDOM(cdp) {
39
- const domCaptureStart = Date.now();
40
- try {
41
- // Add a timeout wrapper to prevent hanging
42
- const timeout = 5000; // 5 seconds should be plenty for DOM capture
43
- const captureWithTimeout = async (promise, label) => {
44
- return Promise.race([
45
- promise,
46
- new Promise((_, reject) => setTimeout(() => reject(new Error(`${label} timed out after ${timeout}ms`)), timeout)),
47
- ]);
48
- };
49
- // Get document
50
- console.error('Getting document...');
51
- const docStart = Date.now();
52
- const documentResponse = await captureWithTimeout(cdp.send('DOM.getDocument', { depth: -1 }), 'DOM.getDocument');
53
- const root = documentResponse.root;
54
- console.error(`[PERF] DOM.getDocument: ${Date.now() - docStart}ms (nodeId: ${root.nodeId})`);
55
- // Get outer HTML
56
- console.error('Getting outer HTML...');
57
- const htmlStart = Date.now();
58
- const htmlResponse = await captureWithTimeout(cdp.send('DOM.getOuterHTML', { nodeId: root.nodeId }), 'DOM.getOuterHTML');
59
- const outerHTML = htmlResponse.outerHTML;
60
- console.error(`[PERF] DOM.getOuterHTML: ${Date.now() - htmlStart}ms (${outerHTML.length} chars)`);
61
- // Get page info
62
- console.error('Getting page info...');
63
- const frameStart = Date.now();
64
- const frameTreeResponse = await captureWithTimeout(cdp.send('Page.getFrameTree'), 'Page.getFrameTree');
65
- const frame = frameTreeResponse.frameTree.frame;
66
- console.error(`[PERF] Page.getFrameTree: ${Date.now() - frameStart}ms (url: ${frame.url})`);
67
- // Get real document title using Runtime.evaluate
68
- console.error('Getting document title...');
69
- let title = 'Untitled';
70
- try {
71
- const titleStart = Date.now();
72
- const titleResult = await captureWithTimeout(cdp.send('Runtime.evaluate', {
73
- expression: 'document.title',
74
- returnByValue: true,
75
- }), 'Runtime.evaluate (document.title)');
76
- if (titleResult.result.value !== undefined && typeof titleResult.result.value === 'string') {
77
- title = titleResult.result.value;
78
- }
79
- console.error(`[PERF] Runtime.evaluate (title): ${Date.now() - titleStart}ms`);
80
- }
81
- catch (titleError) {
82
- console.error('Failed to get document title, using fallback:', titleError);
83
- }
84
- console.error(`Got document title: ${title}`);
85
- const url = frame.url;
86
- const totalDuration = Date.now() - domCaptureStart;
87
- console.error(`[PERF] Total DOM capture: ${totalDuration}ms`);
88
- return {
89
- url,
90
- title,
91
- outerHTML,
92
- };
93
- }
94
- catch (error) {
95
- console.error('Error in collectDOM:', error);
96
- throw error;
97
- }
98
- }
99
- //# sourceMappingURL=dom.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/collectors/dom.ts"],"names":[],"mappings":"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"}