browser-debugger-cli 0.3.0 → 0.5.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 (484) hide show
  1. package/README.md +137 -126
  2. package/dist/__tests__/smoke/error-handling.smoke.test.d.ts +8 -0
  3. package/dist/__tests__/smoke/error-handling.smoke.test.d.ts.map +1 -0
  4. package/dist/__tests__/smoke/error-handling.smoke.test.js +106 -0
  5. package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -0
  6. package/dist/__tests__/smoke/session-lifecycle.smoke.test.d.ts +8 -0
  7. package/dist/__tests__/smoke/session-lifecycle.smoke.test.d.ts.map +1 -0
  8. package/dist/__tests__/smoke/session-lifecycle.smoke.test.js +109 -0
  9. package/dist/__tests__/smoke/session-lifecycle.smoke.test.js.map +1 -0
  10. package/dist/__testutils__/commandRunner.d.ts +45 -0
  11. package/dist/__testutils__/commandRunner.d.ts.map +1 -0
  12. package/dist/__testutils__/commandRunner.js +108 -0
  13. package/dist/__testutils__/commandRunner.js.map +1 -0
  14. package/dist/__testutils__/daemonHelpers.d.ts +81 -0
  15. package/dist/__testutils__/daemonHelpers.d.ts.map +1 -0
  16. package/dist/__testutils__/daemonHelpers.js +206 -0
  17. package/dist/__testutils__/daemonHelpers.js.map +1 -0
  18. package/dist/__testutils__/index.d.ts +1 -0
  19. package/dist/__testutils__/index.d.ts.map +1 -1
  20. package/dist/__testutils__/index.js +1 -0
  21. package/dist/__testutils__/index.js.map +1 -1
  22. package/dist/__testutils__/testCleanup.d.ts +45 -0
  23. package/dist/__testutils__/testCleanup.d.ts.map +1 -0
  24. package/dist/__testutils__/testCleanup.js +87 -0
  25. package/dist/__testutils__/testCleanup.js.map +1 -0
  26. package/dist/__testutils__/testHome.d.ts +26 -0
  27. package/dist/__testutils__/testHome.d.ts.map +1 -0
  28. package/dist/__testutils__/testHome.js +57 -0
  29. package/dist/__testutils__/testHome.js.map +1 -0
  30. package/dist/__testutils__/testProcess.d.ts.map +1 -1
  31. package/dist/__testutils__/testProcess.js +11 -3
  32. package/dist/__testutils__/testProcess.js.map +1 -1
  33. package/dist/cli/commands/__tests__/start.unit.test.d.ts +2 -0
  34. package/dist/cli/commands/__tests__/start.unit.test.d.ts.map +1 -0
  35. package/dist/cli/commands/__tests__/start.unit.test.js +131 -0
  36. package/dist/cli/commands/__tests__/start.unit.test.js.map +1 -0
  37. package/dist/cli/commands/cleanup.d.ts +1 -0
  38. package/dist/cli/commands/cleanup.d.ts.map +1 -1
  39. package/dist/cli/commands/cleanup.js +80 -61
  40. package/dist/cli/commands/cleanup.js.map +1 -1
  41. package/dist/cli/commands/details.d.ts +2 -1
  42. package/dist/cli/commands/details.d.ts.map +1 -1
  43. package/dist/cli/commands/details.js +104 -52
  44. package/dist/cli/commands/details.js.map +1 -1
  45. package/dist/cli/commands/peek.d.ts +2 -1
  46. package/dist/cli/commands/peek.d.ts.map +1 -1
  47. package/dist/cli/commands/peek.js +22 -67
  48. package/dist/cli/commands/peek.js.map +1 -1
  49. package/dist/cli/commands/query.d.ts +9 -0
  50. package/dist/cli/commands/query.d.ts.map +1 -0
  51. package/dist/cli/commands/query.js +125 -0
  52. package/dist/cli/commands/query.js.map +1 -0
  53. package/dist/cli/commands/start.d.ts +74 -0
  54. package/dist/cli/commands/start.d.ts.map +1 -1
  55. package/dist/cli/commands/start.js +147 -38
  56. package/dist/cli/commands/start.js.map +1 -1
  57. package/dist/cli/commands/status.d.ts.map +1 -1
  58. package/dist/cli/commands/status.js +37 -49
  59. package/dist/cli/commands/status.js.map +1 -1
  60. package/dist/cli/commands/stop.d.ts +1 -0
  61. package/dist/cli/commands/stop.d.ts.map +1 -1
  62. package/dist/cli/commands/stop.js +106 -120
  63. package/dist/cli/commands/stop.js.map +1 -1
  64. package/dist/cli/formatters/detailsFormatter.d.ts +1 -1
  65. package/dist/cli/formatters/previewFormatter.d.ts +7 -7
  66. package/dist/cli/formatters/previewFormatter.d.ts.map +1 -1
  67. package/dist/cli/formatters/previewFormatter.js +5 -10
  68. package/dist/cli/formatters/previewFormatter.js.map +1 -1
  69. package/dist/cli/formatters/statusFormatter.d.ts +13 -10
  70. package/dist/cli/formatters/statusFormatter.d.ts.map +1 -1
  71. package/dist/cli/formatters/statusFormatter.js +26 -53
  72. package/dist/cli/formatters/statusFormatter.js.map +1 -1
  73. package/dist/cli/handlers/ChromeBootstrap.d.ts +24 -0
  74. package/dist/cli/handlers/ChromeBootstrap.d.ts.map +1 -0
  75. package/dist/cli/handlers/ChromeBootstrap.js +50 -0
  76. package/dist/cli/handlers/ChromeBootstrap.js.map +1 -0
  77. package/dist/cli/handlers/OutputBuilder.d.ts +2 -3
  78. package/dist/cli/handlers/OutputBuilder.d.ts.map +1 -1
  79. package/dist/cli/handlers/OutputBuilder.js +2 -4
  80. package/dist/cli/handlers/OutputBuilder.js.map +1 -1
  81. package/dist/cli/handlers/OutputWriter.d.ts +15 -0
  82. package/dist/cli/handlers/OutputWriter.d.ts.map +1 -0
  83. package/dist/cli/handlers/OutputWriter.js +34 -0
  84. package/dist/cli/handlers/OutputWriter.js.map +1 -0
  85. package/dist/cli/handlers/PreviewWriter.d.ts +52 -0
  86. package/dist/cli/handlers/PreviewWriter.d.ts.map +1 -0
  87. package/dist/cli/handlers/PreviewWriter.js +118 -0
  88. package/dist/cli/handlers/PreviewWriter.js.map +1 -0
  89. package/dist/cli/handlers/SessionLock.d.ts +16 -0
  90. package/dist/cli/handlers/SessionLock.d.ts.map +1 -0
  91. package/dist/cli/handlers/SessionLock.js +35 -0
  92. package/dist/cli/handlers/SessionLock.js.map +1 -0
  93. package/dist/cli/handlers/SessionLoop.d.ts +19 -0
  94. package/dist/cli/handlers/SessionLoop.d.ts.map +1 -0
  95. package/dist/cli/handlers/SessionLoop.js +47 -0
  96. package/dist/cli/handlers/SessionLoop.js.map +1 -0
  97. package/dist/cli/handlers/ShutdownController.d.ts +41 -0
  98. package/dist/cli/handlers/ShutdownController.d.ts.map +1 -0
  99. package/dist/cli/handlers/ShutdownController.js +94 -0
  100. package/dist/cli/handlers/ShutdownController.js.map +1 -0
  101. package/dist/cli/handlers/SignalHandler.d.ts +35 -0
  102. package/dist/cli/handlers/SignalHandler.d.ts.map +1 -0
  103. package/dist/cli/handlers/SignalHandler.js +81 -0
  104. package/dist/cli/handlers/SignalHandler.js.map +1 -0
  105. package/dist/cli/handlers/TargetSetup.d.ts +42 -0
  106. package/dist/cli/handlers/TargetSetup.d.ts.map +1 -0
  107. package/dist/cli/handlers/TargetSetup.js +87 -0
  108. package/dist/cli/handlers/TargetSetup.js.map +1 -0
  109. package/dist/cli/handlers/sessionController.d.ts +41 -0
  110. package/dist/cli/handlers/sessionController.d.ts.map +1 -1
  111. package/dist/cli/handlers/sessionController.js +266 -5
  112. package/dist/cli/handlers/sessionController.js.map +1 -1
  113. package/dist/cli/registry.d.ts +2 -2
  114. package/dist/cli/registry.d.ts.map +1 -1
  115. package/dist/cli/registry.js +12 -37
  116. package/dist/cli/registry.js.map +1 -1
  117. package/dist/collectors/console.d.ts +1 -1
  118. package/dist/collectors/console.js +2 -2
  119. package/dist/collectors/console.js.map +1 -1
  120. package/dist/collectors/dom.d.ts +1 -1
  121. package/dist/collectors/network.d.ts +1 -2
  122. package/dist/collectors/network.d.ts.map +1 -1
  123. package/dist/collectors/network.js +3 -3
  124. package/dist/collectors/network.js.map +1 -1
  125. package/dist/commands/cdp.js +1 -1
  126. package/dist/commands/cdp.js.map +1 -1
  127. package/dist/commands/cleanup.d.ts.map +1 -1
  128. package/dist/commands/cleanup.js +12 -15
  129. package/dist/commands/cleanup.js.map +1 -1
  130. package/dist/commands/dom.d.ts.map +1 -1
  131. package/dist/commands/dom.js +13 -19
  132. package/dist/commands/dom.js.map +1 -1
  133. package/dist/commands/domEvalHelpers.d.ts +1 -1
  134. package/dist/commands/domEvalHelpers.d.ts.map +1 -1
  135. package/dist/commands/domEvalHelpers.js +56 -7
  136. package/dist/commands/domEvalHelpers.js.map +1 -1
  137. package/dist/commands/domOptionsBuilder.d.ts +32 -0
  138. package/dist/commands/domOptionsBuilder.d.ts.map +1 -1
  139. package/dist/commands/domOptionsBuilder.js +35 -0
  140. package/dist/commands/domOptionsBuilder.js.map +1 -1
  141. package/dist/commands/machineReadableHelp.d.ts +98 -0
  142. package/dist/commands/machineReadableHelp.d.ts.map +1 -0
  143. package/dist/commands/machineReadableHelp.js +137 -0
  144. package/dist/commands/machineReadableHelp.js.map +1 -0
  145. package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
  146. package/dist/commands/shared/CommandRunner.js +2 -3
  147. package/dist/commands/shared/CommandRunner.js.map +1 -1
  148. package/dist/commands/shared/OutputBuilder.js +1 -1
  149. package/dist/commands/shared/OutputBuilder.js.map +1 -1
  150. package/dist/commands/shared/commonOptions.d.ts.map +1 -1
  151. package/dist/commands/shared/commonOptions.js +9 -3
  152. package/dist/commands/shared/commonOptions.js.map +1 -1
  153. package/dist/commands/shared/daemonSessionController.d.ts +2 -0
  154. package/dist/commands/shared/daemonSessionController.d.ts.map +1 -1
  155. package/dist/commands/shared/daemonSessionController.js +13 -16
  156. package/dist/commands/shared/daemonSessionController.js.map +1 -1
  157. package/dist/commands/shared/sessionController.js +1 -1
  158. package/dist/commands/shared/sessionController.js.map +1 -1
  159. package/dist/commands/start.d.ts.map +1 -1
  160. package/dist/commands/start.js +16 -1
  161. package/dist/commands/start.js.map +1 -1
  162. package/dist/commands/status.d.ts.map +1 -1
  163. package/dist/commands/status.js +72 -55
  164. package/dist/commands/status.js.map +1 -1
  165. package/dist/commands/stop.d.ts.map +1 -1
  166. package/dist/commands/stop.js +11 -25
  167. package/dist/commands/stop.js.map +1 -1
  168. package/dist/commands/tail.d.ts +11 -0
  169. package/dist/commands/tail.d.ts.map +1 -0
  170. package/dist/commands/tail.js +114 -0
  171. package/dist/commands/tail.js.map +1 -0
  172. package/dist/commands.d.ts.map +1 -1
  173. package/dist/commands.js +2 -0
  174. package/dist/commands.js.map +1 -1
  175. package/dist/connection/cdp.d.ts +46 -2
  176. package/dist/connection/cdp.d.ts.map +1 -1
  177. package/dist/connection/cdp.js +71 -5
  178. package/dist/connection/cdp.js.map +1 -1
  179. package/dist/connection/diagnostics.d.ts +16 -0
  180. package/dist/connection/diagnostics.d.ts.map +1 -0
  181. package/dist/connection/diagnostics.js +37 -0
  182. package/dist/connection/diagnostics.js.map +1 -0
  183. package/dist/connection/errors.d.ts +74 -0
  184. package/dist/connection/errors.d.ts.map +1 -0
  185. package/dist/connection/errors.js +83 -0
  186. package/dist/connection/errors.js.map +1 -0
  187. package/dist/connection/handlers.d.ts +31 -0
  188. package/dist/connection/handlers.d.ts.map +1 -0
  189. package/dist/connection/handlers.js +38 -0
  190. package/dist/connection/handlers.js.map +1 -0
  191. package/dist/connection/launcher.d.ts +3 -20
  192. package/dist/connection/launcher.d.ts.map +1 -1
  193. package/dist/connection/launcher.js +130 -32
  194. package/dist/connection/launcher.js.map +1 -1
  195. package/dist/connection/pageReadiness.d.ts +46 -0
  196. package/dist/connection/pageReadiness.d.ts.map +1 -0
  197. package/dist/connection/pageReadiness.js +270 -0
  198. package/dist/connection/pageReadiness.js.map +1 -0
  199. package/dist/connection/tabs.d.ts +52 -0
  200. package/dist/connection/tabs.d.ts.map +1 -0
  201. package/dist/connection/tabs.js +227 -0
  202. package/dist/connection/tabs.js.map +1 -0
  203. package/dist/constants.d.ts +20 -40
  204. package/dist/constants.d.ts.map +1 -1
  205. package/dist/constants.js +26 -40
  206. package/dist/constants.js.map +1 -1
  207. package/dist/daemon/ipcServer.d.ts +5 -7
  208. package/dist/daemon/ipcServer.d.ts.map +1 -1
  209. package/dist/daemon/ipcServer.js +178 -143
  210. package/dist/daemon/ipcServer.js.map +1 -1
  211. package/dist/daemon/launcher.js +1 -1
  212. package/dist/daemon/launcher.js.map +1 -1
  213. package/dist/daemon/server/SocketServer.d.ts +22 -0
  214. package/dist/daemon/server/SocketServer.d.ts.map +1 -0
  215. package/dist/daemon/server/SocketServer.js +67 -0
  216. package/dist/daemon/server/SocketServer.js.map +1 -0
  217. package/dist/daemon/server/WorkerManager.d.ts +36 -0
  218. package/dist/daemon/server/WorkerManager.d.ts.map +1 -0
  219. package/dist/daemon/server/WorkerManager.js +98 -0
  220. package/dist/daemon/server/WorkerManager.js.map +1 -0
  221. package/dist/daemon/startSession.d.ts +2 -0
  222. package/dist/daemon/startSession.d.ts.map +1 -1
  223. package/dist/daemon/startSession.js +4 -2
  224. package/dist/daemon/startSession.js.map +1 -1
  225. package/dist/daemon/worker/TelemetryStore.d.ts +18 -0
  226. package/dist/daemon/worker/TelemetryStore.d.ts.map +1 -0
  227. package/dist/daemon/worker/TelemetryStore.js +49 -0
  228. package/dist/daemon/worker/TelemetryStore.js.map +1 -0
  229. package/dist/daemon/worker/collectors.d.ts +8 -0
  230. package/dist/daemon/worker/collectors.d.ts.map +1 -0
  231. package/dist/daemon/worker/collectors.js +19 -0
  232. package/dist/daemon/worker/collectors.js.map +1 -0
  233. package/dist/daemon/worker/commandRegistry.d.ts +10 -0
  234. package/dist/daemon/worker/commandRegistry.d.ts.map +1 -0
  235. package/dist/daemon/worker/commandRegistry.js +289 -0
  236. package/dist/daemon/worker/commandRegistry.js.map +1 -0
  237. package/dist/daemon/worker/plugins.d.ts +21 -0
  238. package/dist/daemon/worker/plugins.d.ts.map +1 -0
  239. package/dist/daemon/worker/plugins.js +71 -0
  240. package/dist/daemon/worker/plugins.js.map +1 -0
  241. package/dist/daemon/worker/types.d.ts +13 -0
  242. package/dist/daemon/worker/types.d.ts.map +1 -0
  243. package/dist/daemon/worker/types.js +2 -0
  244. package/dist/daemon/worker/types.js.map +1 -0
  245. package/dist/daemon/worker.js +206 -529
  246. package/dist/daemon/worker.js.map +1 -1
  247. package/dist/help/machineReadableHelp.d.ts +100 -0
  248. package/dist/help/machineReadableHelp.d.ts.map +1 -0
  249. package/dist/help/machineReadableHelp.js +139 -0
  250. package/dist/help/machineReadableHelp.js.map +1 -0
  251. package/dist/index.js +18 -9
  252. package/dist/index.js.map +1 -1
  253. package/dist/ipc/__tests__/client.contract.test.js +2 -2
  254. package/dist/ipc/__tests__/client.contract.test.js.map +1 -1
  255. package/dist/ipc/client.d.ts +3 -1
  256. package/dist/ipc/client.d.ts.map +1 -1
  257. package/dist/ipc/client.js +27 -14
  258. package/dist/ipc/client.js.map +1 -1
  259. package/dist/ipc/commands.d.ts +1 -0
  260. package/dist/ipc/commands.d.ts.map +1 -1
  261. package/dist/ipc/commands.js.map +1 -1
  262. package/dist/ipc/types.d.ts +2 -0
  263. package/dist/ipc/types.d.ts.map +1 -1
  264. package/dist/session/BdgSession.d.ts +91 -0
  265. package/dist/session/BdgSession.d.ts.map +1 -0
  266. package/dist/session/BdgSession.js +230 -0
  267. package/dist/session/BdgSession.js.map +1 -0
  268. package/dist/session/cleanup.d.ts.map +1 -1
  269. package/dist/session/cleanup.js +67 -65
  270. package/dist/session/cleanup.js.map +1 -1
  271. package/dist/session/fileOps.d.ts +25 -0
  272. package/dist/session/fileOps.d.ts.map +1 -0
  273. package/dist/session/fileOps.js +39 -0
  274. package/dist/session/fileOps.js.map +1 -0
  275. package/dist/session/metadata.js +2 -2
  276. package/dist/session/metadata.js.map +1 -1
  277. package/dist/session/paths.d.ts +2 -7
  278. package/dist/session/paths.d.ts.map +1 -1
  279. package/dist/session/paths.js +8 -8
  280. package/dist/session/paths.js.map +1 -1
  281. package/dist/session/queryCache.js +1 -1
  282. package/dist/session/queryCache.js.map +1 -1
  283. package/dist/telemetry/__tests__/filters.unit.test.d.ts +2 -0
  284. package/dist/telemetry/__tests__/filters.unit.test.d.ts.map +1 -0
  285. package/dist/telemetry/__tests__/filters.unit.test.js +239 -0
  286. package/dist/telemetry/__tests__/filters.unit.test.js.map +1 -0
  287. package/dist/telemetry/console.d.ts +1 -1
  288. package/dist/telemetry/console.d.ts.map +1 -1
  289. package/dist/telemetry/console.js +5 -3
  290. package/dist/telemetry/console.js.map +1 -1
  291. package/dist/telemetry/dialogs.d.ts +27 -0
  292. package/dist/telemetry/dialogs.d.ts.map +1 -0
  293. package/dist/telemetry/dialogs.js +51 -0
  294. package/dist/telemetry/dialogs.js.map +1 -0
  295. package/dist/telemetry/filters.d.ts +148 -0
  296. package/dist/telemetry/filters.d.ts.map +1 -0
  297. package/dist/telemetry/filters.js +358 -0
  298. package/dist/telemetry/filters.js.map +1 -0
  299. package/dist/telemetry/navigation.d.ts +49 -0
  300. package/dist/telemetry/navigation.d.ts.map +1 -0
  301. package/dist/telemetry/navigation.js +69 -0
  302. package/dist/telemetry/navigation.js.map +1 -0
  303. package/dist/telemetry/network.d.ts +1 -0
  304. package/dist/telemetry/network.d.ts.map +1 -1
  305. package/dist/telemetry/network.js +23 -34
  306. package/dist/telemetry/network.js.map +1 -1
  307. package/dist/types.d.ts +2 -0
  308. package/dist/types.d.ts.map +1 -1
  309. package/dist/ui/errors/CommandError.d.ts +39 -0
  310. package/dist/ui/errors/CommandError.d.ts.map +1 -0
  311. package/dist/ui/errors/CommandError.js +48 -0
  312. package/dist/ui/errors/CommandError.js.map +1 -0
  313. package/dist/ui/errors/SystemErrors.d.ts +22 -0
  314. package/dist/ui/errors/SystemErrors.d.ts.map +1 -0
  315. package/dist/ui/errors/SystemErrors.js +23 -0
  316. package/dist/ui/errors/SystemErrors.js.map +1 -0
  317. package/dist/ui/errors/index.d.ts +9 -0
  318. package/dist/ui/errors/index.d.ts.map +1 -0
  319. package/dist/ui/errors/index.js +12 -0
  320. package/dist/ui/errors/index.js.map +1 -0
  321. package/dist/ui/errors/utils.d.ts +24 -0
  322. package/dist/ui/errors/utils.d.ts.map +1 -0
  323. package/dist/ui/errors/utils.js +28 -0
  324. package/dist/ui/errors/utils.js.map +1 -0
  325. package/dist/ui/formatters/status.d.ts.map +1 -1
  326. package/dist/ui/formatters/status.js +1 -1
  327. package/dist/ui/formatters/status.js.map +1 -1
  328. package/dist/ui/logging/index.d.ts +7 -0
  329. package/dist/ui/logging/index.d.ts.map +1 -0
  330. package/dist/ui/logging/index.js +7 -0
  331. package/dist/ui/logging/index.js.map +1 -0
  332. package/dist/ui/logging/logger.d.ts +98 -0
  333. package/dist/ui/logging/logger.d.ts.map +1 -0
  334. package/dist/ui/logging/logger.js +93 -0
  335. package/dist/ui/logging/logger.js.map +1 -0
  336. package/dist/ui/messages/chrome.d.ts +50 -1
  337. package/dist/ui/messages/chrome.d.ts.map +1 -1
  338. package/dist/ui/messages/chrome.js +77 -0
  339. package/dist/ui/messages/chrome.js.map +1 -1
  340. package/dist/ui/messages/deprecation.d.ts +30 -0
  341. package/dist/ui/messages/deprecation.d.ts.map +1 -0
  342. package/dist/ui/messages/deprecation.js +49 -0
  343. package/dist/ui/messages/deprecation.js.map +1 -0
  344. package/dist/ui/messages/preview.js +1 -1
  345. package/dist/ui/messages/preview.js.map +1 -1
  346. package/dist/ui/messages/session.d.ts.map +1 -1
  347. package/dist/ui/messages/session.js +21 -7
  348. package/dist/ui/messages/session.js.map +1 -1
  349. package/dist/utils/__tests__/session.contract.test.js +15 -1
  350. package/dist/utils/__tests__/session.contract.test.js.map +1 -1
  351. package/dist/utils/filters.d.ts +40 -0
  352. package/dist/utils/filters.d.ts.map +1 -1
  353. package/dist/utils/filters.js +54 -0
  354. package/dist/utils/filters.js.map +1 -1
  355. package/dist/utils/pageReadiness.js +24 -25
  356. package/dist/utils/pageReadiness.js.map +1 -1
  357. package/dist/utils/session.d.ts +200 -0
  358. package/dist/utils/session.d.ts.map +1 -0
  359. package/dist/utils/session.js +498 -0
  360. package/dist/utils/session.js.map +1 -0
  361. package/dist/utils/url.d.ts.map +1 -1
  362. package/dist/utils/url.js +10 -0
  363. package/dist/utils/url.js.map +1 -1
  364. package/dist/utils/validation.d.ts +12 -0
  365. package/dist/utils/validation.d.ts.map +1 -0
  366. package/dist/utils/validation.js +20 -0
  367. package/dist/utils/validation.js.map +1 -0
  368. package/package.json +2 -1
  369. package/dist/cli/commands/__tests__/cdp.contract.test.d.ts +0 -24
  370. package/dist/cli/commands/__tests__/cdp.contract.test.d.ts.map +0 -1
  371. package/dist/cli/commands/__tests__/cdp.contract.test.js +0 -467
  372. package/dist/cli/commands/__tests__/cdp.contract.test.js.map +0 -1
  373. package/dist/cli/commands/cdp.d.ts +0 -8
  374. package/dist/cli/commands/cdp.d.ts.map +0 -1
  375. package/dist/cli/commands/cdp.js +0 -45
  376. package/dist/cli/commands/cdp.js.map +0 -1
  377. package/dist/cli/commands/console.d.ts +0 -8
  378. package/dist/cli/commands/console.d.ts.map +0 -1
  379. package/dist/cli/commands/console.js +0 -97
  380. package/dist/cli/commands/console.js.map +0 -1
  381. package/dist/cli/commands/dom/helpers/domCache.d.ts +0 -36
  382. package/dist/cli/commands/dom/helpers/domCache.d.ts.map +0 -1
  383. package/dist/cli/commands/dom/helpers/domCache.js +0 -65
  384. package/dist/cli/commands/dom/helpers/domCache.js.map +0 -1
  385. package/dist/cli/commands/dom/helpers/domQuery.d.ts +0 -48
  386. package/dist/cli/commands/dom/helpers/domQuery.d.ts.map +0 -1
  387. package/dist/cli/commands/dom/helpers/domQuery.js +0 -104
  388. package/dist/cli/commands/dom/helpers/domQuery.js.map +0 -1
  389. package/dist/cli/commands/dom/helpers/errorHandler.d.ts +0 -45
  390. package/dist/cli/commands/dom/helpers/errorHandler.d.ts.map +0 -1
  391. package/dist/cli/commands/dom/helpers/errorHandler.js +0 -71
  392. package/dist/cli/commands/dom/helpers/errorHandler.js.map +0 -1
  393. package/dist/cli/commands/dom/helpers/evalHelpers.d.ts +0 -52
  394. package/dist/cli/commands/dom/helpers/evalHelpers.d.ts.map +0 -1
  395. package/dist/cli/commands/dom/helpers/evalHelpers.js +0 -75
  396. package/dist/cli/commands/dom/helpers/evalHelpers.js.map +0 -1
  397. package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts +0 -35
  398. package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts.map +0 -1
  399. package/dist/cli/commands/dom/helpers/optionsBuilder.js +0 -51
  400. package/dist/cli/commands/dom/helpers/optionsBuilder.js.map +0 -1
  401. package/dist/cli/commands/dom/helpers/selectorParser.d.ts +0 -20
  402. package/dist/cli/commands/dom/helpers/selectorParser.d.ts.map +0 -1
  403. package/dist/cli/commands/dom/helpers/selectorParser.js +0 -20
  404. package/dist/cli/commands/dom/helpers/selectorParser.js.map +0 -1
  405. package/dist/cli/commands/dom/index.d.ts +0 -8
  406. package/dist/cli/commands/dom/index.d.ts.map +0 -1
  407. package/dist/cli/commands/dom/index.js +0 -257
  408. package/dist/cli/commands/dom/index.js.map +0 -1
  409. package/dist/cli/commands/dom.d.ts +0 -8
  410. package/dist/cli/commands/dom.d.ts.map +0 -1
  411. package/dist/cli/commands/dom.js +0 -257
  412. package/dist/cli/commands/dom.js.map +0 -1
  413. package/dist/cli/commands/domErrorHandler.d.ts +0 -45
  414. package/dist/cli/commands/domErrorHandler.d.ts.map +0 -1
  415. package/dist/cli/commands/domErrorHandler.js +0 -71
  416. package/dist/cli/commands/domErrorHandler.js.map +0 -1
  417. package/dist/cli/commands/domEvalHelpers.d.ts +0 -52
  418. package/dist/cli/commands/domEvalHelpers.d.ts.map +0 -1
  419. package/dist/cli/commands/domEvalHelpers.js +0 -76
  420. package/dist/cli/commands/domEvalHelpers.js.map +0 -1
  421. package/dist/cli/commands/domOptionsBuilder.d.ts +0 -35
  422. package/dist/cli/commands/domOptionsBuilder.d.ts.map +0 -1
  423. package/dist/cli/commands/domOptionsBuilder.js +0 -51
  424. package/dist/cli/commands/domOptionsBuilder.js.map +0 -1
  425. package/dist/cli/commands/domSelectorParser.d.ts +0 -20
  426. package/dist/cli/commands/domSelectorParser.d.ts.map +0 -1
  427. package/dist/cli/commands/domSelectorParser.js +0 -20
  428. package/dist/cli/commands/domSelectorParser.js.map +0 -1
  429. package/dist/cli/commands/network.d.ts +0 -8
  430. package/dist/cli/commands/network.d.ts.map +0 -1
  431. package/dist/cli/commands/network.js +0 -43
  432. package/dist/cli/commands/network.js.map +0 -1
  433. package/dist/cli/handlers/CommandRunner.d.ts +0 -60
  434. package/dist/cli/handlers/CommandRunner.d.ts.map +0 -1
  435. package/dist/cli/handlers/CommandRunner.js +0 -81
  436. package/dist/cli/handlers/CommandRunner.js.map +0 -1
  437. package/dist/cli/handlers/commonOptions.d.ts +0 -54
  438. package/dist/cli/handlers/commonOptions.d.ts.map +0 -1
  439. package/dist/cli/handlers/commonOptions.js +0 -64
  440. package/dist/cli/handlers/commonOptions.js.map +0 -1
  441. package/dist/cli/handlers/daemonSessionController.d.ts +0 -23
  442. package/dist/cli/handlers/daemonSessionController.d.ts.map +0 -1
  443. package/dist/cli/handlers/daemonSessionController.js +0 -79
  444. package/dist/cli/handlers/daemonSessionController.js.map +0 -1
  445. package/dist/cli/handlers/landingPage.d.ts +0 -8
  446. package/dist/cli/handlers/landingPage.d.ts.map +0 -1
  447. package/dist/cli/handlers/landingPage.js +0 -8
  448. package/dist/cli/handlers/landingPage.js.map +0 -1
  449. package/dist/collectors/__tests__/network.contract.test.d.ts +0 -28
  450. package/dist/collectors/__tests__/network.contract.test.d.ts.map +0 -1
  451. package/dist/collectors/__tests__/network.contract.test.js +0 -540
  452. package/dist/collectors/__tests__/network.contract.test.js.map +0 -1
  453. package/dist/commandRegistry.d.ts +0 -11
  454. package/dist/commandRegistry.d.ts.map +0 -1
  455. package/dist/commandRegistry.js +0 -45
  456. package/dist/commandRegistry.js.map +0 -1
  457. package/dist/commands/domErrorHandler.d.ts +0 -45
  458. package/dist/commands/domErrorHandler.d.ts.map +0 -1
  459. package/dist/commands/domErrorHandler.js +0 -71
  460. package/dist/commands/domErrorHandler.js.map +0 -1
  461. package/dist/dom/cache.d.ts +0 -36
  462. package/dist/dom/cache.d.ts.map +0 -1
  463. package/dist/dom/cache.js +0 -65
  464. package/dist/dom/cache.js.map +0 -1
  465. package/dist/dom/index.d.ts +0 -9
  466. package/dist/dom/index.d.ts.map +0 -1
  467. package/dist/dom/index.js +0 -9
  468. package/dist/dom/index.js.map +0 -1
  469. package/dist/dom/query.d.ts +0 -48
  470. package/dist/dom/query.d.ts.map +0 -1
  471. package/dist/dom/query.js +0 -104
  472. package/dist/dom/query.js.map +0 -1
  473. package/dist/utils/formatters/network.d.ts +0 -23
  474. package/dist/utils/formatters/network.d.ts.map +0 -1
  475. package/dist/utils/formatters/network.js +0 -35
  476. package/dist/utils/formatters/network.js.map +0 -1
  477. package/dist/utils/ui.d.ts +0 -36
  478. package/dist/utils/ui.d.ts.map +0 -1
  479. package/dist/utils/ui.js +0 -47
  480. package/dist/utils/ui.js.map +0 -1
  481. package/dist/utils/url/safeParseUrl.d.ts +0 -63
  482. package/dist/utils/url/safeParseUrl.d.ts.map +0 -1
  483. package/dist/utils/url/safeParseUrl.js +0 -84
  484. package/dist/utils/url/safeParseUrl.js.map +0 -1
@@ -15,445 +15,77 @@
15
15
  * - Worker handles SIGTERM for graceful shutdown
16
16
  */
17
17
  import { CDPConnection } from '../connection/cdp.js';
18
- import { queryBySelector, getNodeInfo, createNodePreview } from '../connection/domOperations.js';
19
18
  import { launchChrome } from '../connection/launcher.js';
19
+ import { waitForPageReady } from '../connection/pageReadiness.js';
20
20
  import { DEFAULT_PAGE_READINESS_TIMEOUT_MS } from '../constants.js';
21
+ import { TelemetryStore } from '../daemon/worker/TelemetryStore.js';
22
+ import { startTelemetryCollectors } from '../daemon/worker/collectors.js';
23
+ import { createCommandRegistry } from '../daemon/worker/commandRegistry.js';
24
+ import { writeChromePid } from '../session/chrome.js';
21
25
  import { writeSessionMetadata } from '../session/metadata.js';
22
26
  import { writeSessionOutput } from '../session/output.js';
23
27
  import { writePid } from '../session/pid.js';
24
- import { writeQueryCache, getNodeIdByIndex } from '../session/queryCache.js';
25
- import { startConsoleCollection } from '../telemetry/console.js';
26
- import { prepareDOMCollection, collectDOM } from '../telemetry/dom.js';
27
- import { startNetworkCollection } from '../telemetry/network.js';
28
- import { workerActivatingCollector, workerCollectorsActivated, workerUnknownCommand, workerHandlingCommand, workerCommandResponse, workerIPCParseError, workerStdinClosed, workerStdinListenerSetup, workerReadySignalSent, workerShutdownStarted, workerCollectingDOM, workerDOMCollected, workerDOMCollectionFailed, workerWritingOutput, workerRunningCleanup, workerClosingCDP, workerShutdownComplete, workerExitingConnectionLoss, workerReceivedSIGTERM, workerReceivedSIGINT, workerTimeoutReached, workerSessionActive, } from '../ui/messages/debug.js';
29
- import { getErrorMessage } from '../utils/errors.js';
28
+ import { isProcessAlive, killChromeProcess } from '../session/process.js';
29
+ import { collectDOM } from '../telemetry/dom.js';
30
+ import { getErrorMessage } from '../ui/errors/index.js';
31
+ import { createLogger } from '../ui/logging/index.js';
32
+ import { chromeExternalConnectionMessage, chromeExternalWebSocketMessage, chromeExternalNoPidMessage, chromeExternalSkipTerminationMessage, noPageTargetFoundError, } from '../ui/messages/chrome.js';
33
+ import { workerUnknownCommand, workerHandlingCommand, workerCommandResponse, workerIPCParseError, workerStdinClosed, workerStdinListenerSetup, workerReadySignalSent, workerCollectingDOM, workerDOMCollected, workerDOMCollectionFailed, workerWritingOutput, workerRunningCleanup, workerClosingCDP, workerShutdownComplete, workerExitingConnectionLoss, workerReceivedSIGTERM, workerReceivedSIGINT, workerTimeoutReached, workerSessionActive, } from '../ui/messages/debug.js';
30
34
  import { fetchCDPTargets } from '../utils/http.js';
31
- import { createLogger } from '../utils/logger.js';
32
- import { waitForPageReady } from '../utils/pageReadiness.js';
35
+ import { filterDefined } from '../utils/objects.js';
33
36
  import { normalizeUrl } from '../utils/url.js';
34
- import { VERSION } from '../utils/version.js';
35
37
  const log = createLogger('worker');
36
- /**
37
- * Color presets for highlight overlay
38
- */
39
- const HIGHLIGHT_COLORS = {
40
- red: { r: 255, g: 0, b: 0, a: 0.5 },
41
- blue: { r: 0, g: 0, b: 255, a: 0.5 },
42
- green: { r: 0, g: 255, b: 0, a: 0.5 },
43
- yellow: { r: 255, g: 255, b: 0, a: 0.5 },
44
- orange: { r: 255, g: 165, b: 0, a: 0.5 },
45
- purple: { r: 128, g: 0, b: 128, a: 0.5 },
46
- };
47
- // Global state for cleanup
38
+ const telemetryStore = new TelemetryStore();
39
+ const commandRegistry = createCommandRegistry(telemetryStore);
48
40
  let chrome = null;
49
41
  let cdp = null;
50
42
  let cleanupFunctions = [];
51
- // Telemetry data storage
52
- const networkRequests = [];
53
- const consoleMessages = [];
54
- let domData = null;
55
- // Session metadata
56
- let sessionStartTime = Date.now();
57
- let targetInfo = null;
58
- let activeTelemetry = [];
59
43
  /**
60
44
  * Parse worker configuration from environment variables or argv.
61
45
  */
62
46
  function parseWorkerConfig() {
63
- // For MVP: parse from argv (future: could use env vars or stdin)
64
47
  const args = process.argv.slice(2);
65
48
  if (args.length === 0) {
66
49
  throw new Error('Worker requires configuration arguments');
67
50
  }
68
- // Parse simple JSON config from first argument
69
51
  try {
70
52
  const configArg = args[0];
71
53
  if (!configArg) {
72
54
  throw new Error('Missing configuration argument');
73
55
  }
74
56
  const config = JSON.parse(configArg);
75
- return {
57
+ const normalized = {
76
58
  url: config.url,
77
59
  port: config.port ?? 9222,
78
- timeout: config.timeout ?? undefined,
79
60
  telemetry: config.telemetry ?? ['network', 'console', 'dom'],
80
61
  includeAll: config.includeAll ?? false,
81
- userDataDir: config.userDataDir ?? undefined,
82
- maxBodySize: config.maxBodySize ?? undefined,
62
+ headless: config.headless ?? false,
83
63
  };
64
+ if (config.timeout !== undefined) {
65
+ normalized.timeout = config.timeout;
66
+ }
67
+ if (config.userDataDir !== undefined) {
68
+ normalized.userDataDir = config.userDataDir;
69
+ }
70
+ if (config.maxBodySize !== undefined) {
71
+ normalized.maxBodySize = config.maxBodySize;
72
+ }
73
+ if (config.chromeWsUrl !== undefined) {
74
+ normalized.chromeWsUrl = config.chromeWsUrl;
75
+ }
76
+ return normalized;
84
77
  }
85
78
  catch (error) {
86
79
  throw new Error(`Failed to parse worker config: ${getErrorMessage(error)}`);
87
80
  }
88
81
  }
89
- /**
90
- * Activate telemetry modules based on configuration.
91
- */
92
- async function activateCollectors(config) {
93
- if (!cdp) {
94
- throw new Error('CDP connection not initialized');
95
- }
96
- activeTelemetry = config.telemetry ?? ['network', 'console', 'dom'];
97
- for (const collector of activeTelemetry) {
98
- log.debug(workerActivatingCollector(collector));
99
- switch (collector) {
100
- case 'network':
101
- {
102
- const networkOptions = {
103
- includeAll: config.includeAll ?? false,
104
- ...(config.maxBodySize !== undefined && { maxBodySize: config.maxBodySize }),
105
- };
106
- const cleanup = await startNetworkCollection(cdp, networkRequests, networkOptions);
107
- cleanupFunctions.push(cleanup);
108
- }
109
- break;
110
- case 'console':
111
- {
112
- const cleanup = await startConsoleCollection(cdp, consoleMessages, config.includeAll ?? false);
113
- cleanupFunctions.push(cleanup);
114
- }
115
- break;
116
- case 'dom':
117
- {
118
- const cleanup = await prepareDOMCollection(cdp);
119
- cleanupFunctions.push(cleanup);
120
- }
121
- break;
122
- }
123
- }
124
- log.debug(workerCollectorsActivated(activeTelemetry));
125
- }
126
- /**
127
- * Command handler registry - maps command names to their business logic.
128
- */
129
- const commandHandlers = {
130
- /**
131
- * DOM Query Handler - Find elements by CSS selector
132
- */
133
- dom_query: async (cdp, params) => {
134
- // Ensure DOM is enabled
135
- await cdp.send('DOM.enable');
136
- // Query elements
137
- const nodeIds = await queryBySelector(cdp, params.selector);
138
- // Get information for each node
139
- const nodes = [];
140
- for (let i = 0; i < nodeIds.length; i++) {
141
- const nodeId = nodeIds[i];
142
- if (nodeId === undefined)
143
- continue;
144
- const nodeInfo = await getNodeInfo(cdp, nodeId);
145
- nodes.push({
146
- index: i + 1,
147
- nodeId: nodeInfo.nodeId,
148
- ...(nodeInfo.tag !== undefined && { tag: nodeInfo.tag }),
149
- ...(nodeInfo.classes !== undefined && { classes: nodeInfo.classes }),
150
- preview: createNodePreview(nodeInfo),
151
- });
152
- }
153
- // Write cache for index-based lookups
154
- writeQueryCache({
155
- selector: params.selector,
156
- timestamp: new Date().toISOString(),
157
- nodes,
158
- });
159
- return {
160
- selector: params.selector,
161
- count: nodes.length,
162
- nodes,
163
- };
164
- },
165
- /**
166
- * DOM Highlight Handler - Highlight elements in browser
167
- */
168
- dom_highlight: async (cdp, params) => {
169
- // Ensure DOM and Overlay are enabled
170
- await cdp.send('DOM.enable');
171
- await cdp.send('Overlay.enable');
172
- let nodeIds = [];
173
- // Direct nodeId provided
174
- if (params.nodeId !== undefined) {
175
- nodeIds = [params.nodeId];
176
- }
177
- else if (params.index !== undefined) {
178
- // Look up nodeId from cache
179
- const nodeId = getNodeIdByIndex(params.index);
180
- if (!nodeId) {
181
- throw new Error(`No cached element at index ${params.index}. Run 'bdg dom query <selector>' first.`);
182
- }
183
- nodeIds = [nodeId];
184
- }
185
- else if (params.selector) {
186
- // Query by selector
187
- nodeIds = await queryBySelector(cdp, params.selector);
188
- if (nodeIds.length === 0) {
189
- throw new Error(`No elements found matching "${params.selector}"`);
190
- }
191
- // Apply selector filters
192
- if (params.first) {
193
- const firstNode = nodeIds[0];
194
- if (firstNode === undefined) {
195
- throw new Error('No elements found');
196
- }
197
- nodeIds = [firstNode];
198
- }
199
- else if (params.nth !== undefined) {
200
- if (params.nth < 1 || params.nth > nodeIds.length) {
201
- throw new Error(`--nth ${params.nth} out of range (found ${nodeIds.length} elements)`);
202
- }
203
- const nthNode = nodeIds[params.nth - 1];
204
- if (nthNode === undefined) {
205
- throw new Error(`Element at index ${params.nth} not found`);
206
- }
207
- nodeIds = [nthNode];
208
- }
209
- }
210
- else {
211
- throw new Error('Either selector, index, or nodeId must be provided');
212
- }
213
- // Prepare highlight color
214
- const colorName = (params.color ?? 'red');
215
- const color = HIGHLIGHT_COLORS[colorName] ?? HIGHLIGHT_COLORS.red;
216
- const opacity = params.opacity ?? color.a;
217
- // Highlight each node
218
- for (const nodeId of nodeIds) {
219
- await cdp.send('Overlay.highlightNode', {
220
- highlightConfig: {
221
- contentColor: { ...color, a: opacity },
222
- },
223
- nodeId,
224
- });
225
- }
226
- return {
227
- highlighted: nodeIds.length,
228
- nodeIds,
229
- };
230
- },
231
- /**
232
- * DOM Get Handler - Get full HTML and attributes for elements
233
- */
234
- dom_get: async (cdp, params) => {
235
- // Ensure DOM is enabled
236
- await cdp.send('DOM.enable');
237
- let nodeIds = [];
238
- // Direct nodeId provided
239
- if (params.nodeId !== undefined) {
240
- nodeIds = [params.nodeId];
241
- }
242
- else if (params.index !== undefined) {
243
- // Look up nodeId from cache
244
- const nodeId = getNodeIdByIndex(params.index);
245
- if (!nodeId) {
246
- throw new Error(`No cached element at index ${params.index}. Run 'bdg dom query <selector>' first.`);
247
- }
248
- nodeIds = [nodeId];
249
- }
250
- else if (params.selector) {
251
- // Query by selector
252
- nodeIds = await queryBySelector(cdp, params.selector);
253
- if (nodeIds.length === 0) {
254
- throw new Error(`No elements found matching "${params.selector}"`);
255
- }
256
- // Apply selector filters
257
- if (params.nth !== undefined) {
258
- if (params.nth < 1 || params.nth > nodeIds.length) {
259
- throw new Error(`--nth ${params.nth} out of range (found ${nodeIds.length} elements)`);
260
- }
261
- const nthNode = nodeIds[params.nth - 1];
262
- if (nthNode === undefined) {
263
- throw new Error(`Element at index ${params.nth} not found`);
264
- }
265
- nodeIds = [nthNode];
266
- }
267
- else if (!params.all) {
268
- // Default: first match only
269
- const firstNode = nodeIds[0];
270
- if (firstNode === undefined) {
271
- throw new Error('No elements found');
272
- }
273
- nodeIds = [firstNode];
274
- }
275
- }
276
- else {
277
- throw new Error('Either selector, index, or nodeId must be provided');
278
- }
279
- // Get information for each node
280
- const nodes = [];
281
- for (const nodeId of nodeIds) {
282
- const info = await getNodeInfo(cdp, nodeId);
283
- nodes.push({
284
- nodeId: info.nodeId,
285
- ...(info.tag !== undefined && { tag: info.tag }),
286
- ...(info.attributes !== undefined && { attributes: info.attributes }),
287
- ...(info.classes !== undefined && { classes: info.classes }),
288
- ...(info.outerHTML !== undefined && { outerHTML: info.outerHTML }),
289
- });
290
- }
291
- return {
292
- nodes,
293
- };
294
- },
295
- /**
296
- * DOM Screenshot Handler - Capture page screenshot
297
- */
298
- dom_screenshot: async (cdp, params) => {
299
- const fs = await import('node:fs/promises');
300
- const path = await import('node:path');
301
- // Validate path
302
- const absolutePath = path.resolve(params.path);
303
- // Ensure parent directory exists
304
- const parentDir = path.dirname(absolutePath);
305
- try {
306
- await fs.mkdir(parentDir, { recursive: true });
307
- }
308
- catch (error) {
309
- if (error && typeof error === 'object' && 'code' in error && error.code !== 'EEXIST') {
310
- throw new Error(`Cannot create directory ${parentDir}: ${getErrorMessage(error)}`);
311
- }
312
- }
313
- // Set defaults
314
- const format = params.format ?? 'png';
315
- const quality = params.quality;
316
- const fullPage = params.fullPage ?? true;
317
- // Validate quality for JPEG
318
- if (format === 'jpeg' && quality !== undefined && (quality < 0 || quality > 100)) {
319
- throw new Error('JPEG quality must be between 0 and 100');
320
- }
321
- // Capture screenshot via CDP
322
- const screenshotParams = {
323
- format,
324
- ...(format === 'jpeg' && quality !== undefined && { quality }),
325
- ...(fullPage && { captureBeyondViewport: true }),
326
- };
327
- const response = (await cdp.send('Page.captureScreenshot', screenshotParams));
328
- const imageData = Buffer.from(response.data, 'base64');
329
- // Write file
330
- await fs.writeFile(absolutePath, imageData);
331
- // Get file stats
332
- const stats = await fs.stat(absolutePath);
333
- // Get viewport dimensions if not full page
334
- let viewport;
335
- if (!fullPage) {
336
- const metrics = (await cdp.send('Page.getLayoutMetrics'));
337
- viewport = {
338
- width: metrics.layoutViewport.clientWidth,
339
- height: metrics.layoutViewport.clientHeight,
340
- };
341
- }
342
- const layoutMetrics = (await cdp.send('Page.getLayoutMetrics'));
343
- return {
344
- path: absolutePath,
345
- format,
346
- ...(format === 'jpeg' && quality !== undefined && { quality }),
347
- width: layoutMetrics.contentSize.width,
348
- height: layoutMetrics.contentSize.height,
349
- size: stats.size,
350
- ...(viewport && { viewport }),
351
- fullPage,
352
- };
353
- },
354
- /**
355
- * Worker Peek Handler - Return lightweight preview of collected data
356
- */
357
- worker_peek: async (_cdp, params) => {
358
- const lastN = Math.min(params.lastN ?? 10, 100); // Cap at 100
359
- const duration = Date.now() - sessionStartTime;
360
- // Get last N items (slice from end)
361
- const recentNetwork = networkRequests.slice(-lastN).map((req) => ({
362
- requestId: req.requestId,
363
- timestamp: req.timestamp,
364
- method: req.method,
365
- url: req.url,
366
- ...(req.status !== undefined && { status: req.status }),
367
- ...(req.mimeType !== undefined && { mimeType: req.mimeType }),
368
- }));
369
- const recentConsole = consoleMessages.slice(-lastN).map((msg) => ({
370
- timestamp: msg.timestamp,
371
- type: msg.type,
372
- text: msg.text,
373
- }));
374
- // Return as resolved Promise to satisfy async handler contract
375
- return Promise.resolve({
376
- version: VERSION,
377
- startTime: sessionStartTime,
378
- duration,
379
- target: {
380
- url: targetInfo?.url ?? '',
381
- title: targetInfo?.title ?? '',
382
- },
383
- activeTelemetry,
384
- network: recentNetwork,
385
- console: recentConsole,
386
- });
387
- },
388
- /**
389
- * Worker Details Handler - Return full object for specific item
390
- */
391
- worker_details: async (_cdp, params) => {
392
- if (params.itemType === 'network') {
393
- const request = networkRequests.find((r) => r.requestId === params.id);
394
- if (!request) {
395
- return Promise.reject(new Error(`Network request not found: ${params.id}`));
396
- }
397
- return Promise.resolve({ item: request });
398
- }
399
- else if (params.itemType === 'console') {
400
- const index = parseInt(params.id, 10);
401
- if (isNaN(index) || index < 0 || index >= consoleMessages.length) {
402
- return Promise.reject(new Error(`Console message not found at index: ${params.id} (available: 0-${consoleMessages.length - 1})`));
403
- }
404
- return Promise.resolve({ item: consoleMessages[index] });
405
- }
406
- // Unreachable due to type narrowing, but TypeScript doesn't see it
407
- return Promise.reject(new Error(`Unknown itemType: ${String(params.itemType)}. Expected 'network' or 'console'.`));
408
- },
409
- /**
410
- * Worker Status Handler - Return live activity metrics and session state
411
- *
412
- * Provides comprehensive status information including activity counts,
413
- * last activity timestamps, current page state, and active telemetry modules.
414
- * Used by the status command to show detailed session information.
415
- */
416
- worker_status: async (_cdp, _params) => {
417
- const duration = Date.now() - sessionStartTime;
418
- // Get last activity timestamps
419
- const lastNetworkRequest = networkRequests[networkRequests.length - 1];
420
- const lastConsoleMessage = consoleMessages[consoleMessages.length - 1];
421
- const result = {
422
- startTime: sessionStartTime,
423
- duration,
424
- target: {
425
- url: targetInfo?.url ?? '',
426
- title: targetInfo?.title ?? '',
427
- },
428
- activeTelemetry,
429
- activity: {
430
- networkRequestsCaptured: networkRequests.length,
431
- consoleMessagesCaptured: consoleMessages.length,
432
- ...(lastNetworkRequest?.timestamp !== undefined && {
433
- lastNetworkRequestAt: lastNetworkRequest.timestamp,
434
- }),
435
- ...(lastConsoleMessage?.timestamp !== undefined && {
436
- lastConsoleMessageAt: lastConsoleMessage.timestamp,
437
- }),
438
- },
439
- };
440
- return Promise.resolve(result);
441
- },
442
- /**
443
- * CDP Call Handler - Execute arbitrary CDP method
444
- */
445
- cdp_call: async (cdp, params) => {
446
- // Execute CDP method with provided parameters
447
- const result = await cdp.send(params.method, params.params ?? {});
448
- return { result };
449
- },
450
- };
82
+ // Command handlers are defined via createCommandRegistry for modularity.
451
83
  /**
452
84
  * Handle incoming IPC message from daemon via stdin.
453
85
  */
454
86
  async function handleWorkerIPC(message) {
455
87
  const commandName = message.type.replace('_request', '');
456
- const handler = commandHandlers[commandName];
88
+ const handler = commandRegistry[commandName];
457
89
  if (!handler) {
458
90
  log.debug(workerUnknownCommand(commandName));
459
91
  return;
@@ -462,9 +94,7 @@ async function handleWorkerIPC(message) {
462
94
  try {
463
95
  if (!cdp)
464
96
  throw new Error('CDP connection not initialized');
465
- // Extract params by removing IPC metadata fields
466
97
  const { type: _type, requestId: _requestId, ...params } = message;
467
- // Call handler with properly typed params
468
98
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument
469
99
  const data = await handler(cdp, params);
470
100
  const response = {
@@ -494,7 +124,6 @@ function setupStdinListener() {
494
124
  let buffer = '';
495
125
  process.stdin.on('data', (chunk) => {
496
126
  buffer += chunk.toString('utf-8');
497
- // Process complete JSONL frames (separated by newlines)
498
127
  const lines = buffer.split('\n');
499
128
  buffer = lines.pop() ?? ''; // Keep incomplete line in buffer
500
129
  for (const line of lines) {
@@ -518,74 +147,59 @@ function setupStdinListener() {
518
147
  * Send worker_ready signal to parent via stdout.
519
148
  */
520
149
  function sendReadySignal(config) {
521
- if (!chrome || !targetInfo) {
522
- throw new Error('Cannot send ready signal: Chrome or target not initialized');
150
+ const targetInfo = telemetryStore.targetInfo;
151
+ if (!targetInfo) {
152
+ throw new Error('Cannot send ready signal: Target not initialized');
523
153
  }
154
+ const chromePid = chrome?.pid ?? 0;
524
155
  const message = {
525
156
  type: 'worker_ready',
526
157
  requestId: 'ready', // Special requestId for ready signal
527
158
  workerPid: process.pid,
528
- chromePid: chrome.pid,
159
+ chromePid,
529
160
  port: config.port,
530
161
  target: {
531
162
  url: targetInfo.url,
532
163
  title: targetInfo.title,
533
164
  },
534
165
  };
535
- // Send JSON line to stdout for parent to parse
536
166
  console.log(JSON.stringify(message));
537
- log.debug(workerReadySignalSent(process.pid, chrome.pid));
167
+ log.debug(workerReadySignalSent(process.pid, chromePid));
538
168
  }
539
169
  /**
540
- * Build BdgOutput structure from collected data.
170
+ * Graceful shutdown: collect final DOM, write session.json, cleanup.
541
171
  */
542
- function buildOutput(partial = false) {
543
- const duration = Date.now() - sessionStartTime;
544
- const data = {};
545
- if (networkRequests.length > 0) {
546
- data.network = networkRequests;
547
- }
548
- if (consoleMessages.length > 0) {
549
- data.console = consoleMessages;
550
- }
551
- if (domData) {
552
- data.dom = domData;
553
- }
554
- return {
555
- version: VERSION,
556
- success: true,
557
- timestamp: new Date(sessionStartTime).toISOString(),
558
- duration,
559
- target: {
560
- url: targetInfo?.url ?? '',
561
- title: targetInfo?.title ?? '',
562
- },
563
- data,
564
- ...(partial && { partial: true }),
565
- };
566
- }
567
172
  /**
568
- * Graceful shutdown: collect final DOM, write session.json, cleanup.
173
+ * Unified cleanup handler for all exit scenarios.
174
+ *
175
+ * Handles cleanup for normal shutdown, crashes, and timeouts.
176
+ * Ensures Chrome is always killed and verified dead.
177
+ *
178
+ * @param reason - Why cleanup is happening
569
179
  */
570
- async function gracefulShutdown() {
571
- log.debug(workerShutdownStarted());
180
+ async function cleanupWorker(reason) {
181
+ log.debug(`[worker] Cleanup started (reason: ${reason})`);
572
182
  try {
573
- // Collect final DOM snapshot if DOM telemetry is active
574
- if (activeTelemetry.includes('dom') && cdp) {
183
+ const chromePid = chrome?.pid;
184
+ if (chromePid) {
185
+ try {
186
+ writeChromePid(chromePid);
187
+ log.debug(`[worker] Chrome PID ${chromePid} cached for cleanup`);
188
+ }
189
+ catch (error) {
190
+ console.error(`[worker] Failed to cache Chrome PID: ${getErrorMessage(error)}`);
191
+ }
192
+ }
193
+ if (reason === 'normal' && telemetryStore.activeTelemetry.includes('dom') && cdp) {
575
194
  log.debug(workerCollectingDOM());
576
195
  try {
577
- domData = await collectDOM(cdp);
196
+ telemetryStore.setDomData(await collectDOM(cdp));
578
197
  log.debug(workerDOMCollected());
579
198
  }
580
199
  catch (error) {
581
200
  log.debug(workerDOMCollectionFailed(getErrorMessage(error)));
582
201
  }
583
202
  }
584
- // Write final output
585
- log.debug(workerWritingOutput());
586
- const finalOutput = buildOutput(false);
587
- writeSessionOutput(finalOutput);
588
- // Run cleanup functions
589
203
  log.debug(workerRunningCleanup());
590
204
  for (const cleanup of cleanupFunctions) {
591
205
  try {
@@ -595,23 +209,79 @@ async function gracefulShutdown() {
595
209
  console.error(`[worker] Cleanup function error: ${getErrorMessage(error)}`);
596
210
  }
597
211
  }
598
- // Close CDP connection
599
212
  if (cdp) {
600
- log.debug(workerClosingCDP());
601
- cdp.close();
602
- cdp = null;
213
+ try {
214
+ log.debug(workerClosingCDP());
215
+ cdp.close();
216
+ cdp = null;
217
+ }
218
+ catch (error) {
219
+ console.error(`[worker] Error closing CDP: ${getErrorMessage(error)}`);
220
+ }
603
221
  }
604
- // Kill Chrome
605
- if (chrome) {
606
- console.error(`[worker] Terminating Chrome (PID ${chrome.pid})...`);
607
- await chrome.kill();
608
- chrome = null;
222
+ if (chrome && chromePid) {
223
+ try {
224
+ console.error(`[worker] Terminating Chrome (PID ${chromePid})...`);
225
+ await chrome.kill();
226
+ let attempts = 0;
227
+ const maxAttempts = 10;
228
+ while (attempts < maxAttempts) {
229
+ if (!isProcessAlive(chromePid)) {
230
+ log.debug(`[worker] Chrome process ${chromePid} confirmed dead`);
231
+ break;
232
+ }
233
+ await new Promise((resolve) => setTimeout(resolve, 500));
234
+ attempts++;
235
+ }
236
+ if (isProcessAlive(chromePid)) {
237
+ console.error(`[worker] Chrome did not die gracefully, force killing...`);
238
+ try {
239
+ killChromeProcess(chromePid, 'SIGKILL');
240
+ await new Promise((resolve) => setTimeout(resolve, 500));
241
+ if (isProcessAlive(chromePid)) {
242
+ console.error(`[worker] WARNING: Chrome process ${chromePid} survived SIGKILL`);
243
+ }
244
+ else {
245
+ log.debug(`[worker] Chrome process ${chromePid} force killed successfully`);
246
+ }
247
+ }
248
+ catch (error) {
249
+ console.error(`[worker] Failed to force kill Chrome: ${getErrorMessage(error)}`);
250
+ }
251
+ }
252
+ chrome = null;
253
+ }
254
+ catch (error) {
255
+ console.error(`[worker] Error killing Chrome: ${getErrorMessage(error)}`);
256
+ }
257
+ }
258
+ else if (!chrome) {
259
+ console.error(`[worker] ${chromeExternalSkipTerminationMessage()}`);
260
+ }
261
+ if (reason === 'normal') {
262
+ try {
263
+ log.debug(workerWritingOutput());
264
+ const finalOutput = telemetryStore.buildOutput(false);
265
+ writeSessionOutput(finalOutput);
266
+ }
267
+ catch (error) {
268
+ console.error(`[worker] Error writing final output: ${getErrorMessage(error)}`);
269
+ }
270
+ }
271
+ else {
272
+ try {
273
+ log.debug(`[worker] Writing partial output (reason: ${reason})`);
274
+ const partialOutput = telemetryStore.buildOutput(true); // partial=true
275
+ writeSessionOutput(partialOutput);
276
+ }
277
+ catch (error) {
278
+ console.error(`[worker] Error writing partial output: ${getErrorMessage(error)}`);
279
+ }
609
280
  }
610
281
  log.debug(workerShutdownComplete());
611
282
  }
612
283
  catch (error) {
613
- console.error(`[worker] Error during shutdown: ${getErrorMessage(error)}`);
614
- throw error;
284
+ console.error(`[worker] Error during cleanup: ${getErrorMessage(error)}`);
615
285
  }
616
286
  }
617
287
  /**
@@ -621,130 +291,137 @@ async function main() {
621
291
  console.error(`[worker] Starting (PID ${process.pid})`);
622
292
  let config;
623
293
  try {
624
- // Parse configuration
625
294
  config = parseWorkerConfig();
626
295
  console.error(`[worker] Config: ${JSON.stringify(config)}`);
627
- // Write worker PID immediately
296
+ telemetryStore.resetSessionStart();
297
+ telemetryStore.setDomData(null);
298
+ telemetryStore.networkRequests.length = 0;
299
+ telemetryStore.consoleMessages.length = 0;
300
+ telemetryStore.navigationEvents.length = 0;
301
+ telemetryStore.setTargetInfo(null);
628
302
  writePid(process.pid);
629
- // Launch Chrome WITHOUT a URL - we'll navigate after collectors are ready
630
- // WHY: Collectors must be enabled BEFORE navigation to capture initial requests
631
- console.error(`[worker] Launching Chrome on port ${config.port}...`);
632
- const launchOptions = {
633
- port: config.port,
634
- // DO NOT pass url here - navigation happens after collectors are active
635
- ...(config.userDataDir !== undefined && { userDataDir: config.userDataDir }),
636
- };
637
- chrome = await launchChrome(launchOptions);
638
- console.error(`[worker] Chrome launched (PID ${chrome.pid})`);
639
- // Connect to Chrome via CDP
640
- console.error(`[worker] Connecting to Chrome via CDP...`);
641
- const targets = await fetchCDPTargets(config.port);
642
- // Find the blank page target (Chrome auto-creates one on launch)
643
- let target = targets.find((t) => t.type === 'page');
644
- if (!target) {
645
- // Enhanced error message with available targets and diagnostics
646
- const availableTargets = targets
647
- .map((t, i) => ` ${i + 1}. ${t.title || '(no title)'}\n URL: ${t.url}\n Type: ${t.type}`)
648
- .join('\n');
649
- throw new Error(`No page target found after Chrome launch\n\n` +
650
- `Possible causes:\n` +
651
- ` 1. Port conflict (${config.port})\n` +
652
- ` → Check: lsof -ti:${config.port}\n` +
653
- ` → Kill: pkill -f "chrome.*${config.port}"\n` +
654
- ` 2. Chrome failed to create default target\n` +
655
- ` 3. Stale session\n` +
656
- ` → Fix: bdg cleanup && bdg <url>\n\n` +
657
- `Available Chrome targets:\n${availableTargets || ' (none)'}\n\n` +
658
- `Try:\n` +
659
- ` - Clean up and retry: bdg cleanup && bdg <url>\n` +
660
- ` - Use different port: bdg <url> --port ${config.port + 1}`);
303
+ if (config.chromeWsUrl) {
304
+ console.error(`[worker] ${chromeExternalConnectionMessage()}`);
305
+ console.error(`[worker] ${chromeExternalWebSocketMessage(config.chromeWsUrl)}`);
306
+ chrome = null;
307
+ const targetId = config.chromeWsUrl.split('/').pop() ?? 'external';
308
+ telemetryStore.setTargetInfo({
309
+ id: targetId,
310
+ type: 'page',
311
+ title: 'External Chrome',
312
+ url: config.url,
313
+ webSocketDebuggerUrl: config.chromeWsUrl,
314
+ });
315
+ console.error(`[worker] ${chromeExternalNoPidMessage()}`);
316
+ }
317
+ else {
318
+ console.error(`[worker] Launching Chrome on port ${config.port}...`);
319
+ const launchOptions = {
320
+ port: config.port,
321
+ ...filterDefined({
322
+ userDataDir: config.userDataDir,
323
+ headless: config.headless,
324
+ }),
325
+ };
326
+ chrome = await launchChrome(launchOptions);
327
+ console.error(`[worker] Chrome launched (PID ${chrome.pid})`);
328
+ writeChromePid(chrome.pid);
329
+ console.error(`[worker] Chrome PID ${chrome.pid} cached for emergency cleanup`);
330
+ console.error(`[worker] Connecting to Chrome via CDP...`);
331
+ const targets = await fetchCDPTargets(config.port);
332
+ const foundTarget = targets.find((t) => t.type === 'page');
333
+ if (!foundTarget) {
334
+ const availableTargets = targets.length
335
+ ? targets
336
+ .map((t, i) => ` ${i + 1}. ${t.title || '(no title)'}\n URL: ${t.url}\n Type: ${t.type}`)
337
+ .join('\n')
338
+ : null;
339
+ throw new Error(noPageTargetFoundError(config.port, availableTargets));
340
+ }
341
+ telemetryStore.setTargetInfo(foundTarget);
342
+ console.error(`[worker] Found target: ${foundTarget.title} (${foundTarget.url})`);
343
+ }
344
+ if (!telemetryStore.targetInfo) {
345
+ throw new Error('Failed to obtain target information');
661
346
  }
662
- targetInfo = target;
663
- console.error(`[worker] Found target: ${target.title} (${target.url})`);
664
- // Establish CDP connection
665
347
  cdp = new CDPConnection();
666
- await cdp.connect(target.webSocketDebuggerUrl, {
348
+ await cdp.connect(telemetryStore.targetInfo.webSocketDebuggerUrl, {
667
349
  autoReconnect: false,
668
350
  maxRetries: 10,
669
- // P1.1: Exit gracefully if Chrome dies unexpectedly
670
- // WHY: Prevents zombie worker processes when Chrome crashes/closes
351
+ // P1.1: Run cleanup if Chrome dies unexpectedly
352
+ // WHY: Prevents zombie worker processes and ensures Chrome cleanup
671
353
  onDisconnect: (code, reason) => {
672
354
  console.error(`[worker] Chrome connection lost (code: ${code}, reason: ${reason})`);
673
355
  log.debug(workerExitingConnectionLoss());
674
- process.exit(0);
356
+ void cleanupWorker('crash').then(() => process.exit(1));
675
357
  },
676
358
  });
677
359
  console.error(`[worker] CDP connection established`);
678
360
  // CRITICAL: Activate telemetry modules BEFORE navigating to target URL
679
361
  // WHY: Network/Console events are only captured for requests that start
680
- // AFTER Network.enable/Runtime.enable are called. If we navigate first,
681
- // we miss all initial page load requests and console messages.
682
362
  console.error(`[worker] Activating collectors before navigation...`);
683
- await activateCollectors(config);
363
+ const telemetryCleanups = await startTelemetryCollectors(cdp, config, telemetryStore, log);
364
+ cleanupFunctions.push(...telemetryCleanups);
684
365
  console.error(`[worker] Collectors active and ready to capture telemetry`);
685
- // NOW navigate to the target URL
686
366
  const normalizedUrl = normalizeUrl(config.url);
687
367
  console.error(`[worker] Navigating to ${normalizedUrl}...`);
688
368
  await cdp.send('Page.navigate', { url: normalizedUrl });
689
- // Wait for page to be ready using smart detection
690
369
  await waitForPageReady(cdp, {
691
370
  maxWaitMs: DEFAULT_PAGE_READINESS_TIMEOUT_MS,
692
371
  });
693
372
  console.error(`[worker] Page ready`);
694
- // Update targetInfo with actual loaded URL (may differ from normalized URL due to redirects)
695
- const updatedTargets = await fetchCDPTargets(config.port);
696
- const updatedTarget = updatedTargets.find((t) => t.id === target.id);
697
- if (updatedTarget) {
698
- targetInfo = updatedTarget;
699
- console.error(`[worker] Target updated: ${updatedTarget.title} (${updatedTarget.url})`);
373
+ if (chrome && telemetryStore.targetInfo) {
374
+ const currentTargetId = telemetryStore.targetInfo.id;
375
+ const updatedTargets = await fetchCDPTargets(config.port);
376
+ const updatedTarget = updatedTargets.find((t) => t.id === currentTargetId);
377
+ if (updatedTarget) {
378
+ telemetryStore.setTargetInfo(updatedTarget);
379
+ console.error(`[worker] Target updated: ${updatedTarget.title} (${updatedTarget.url})`);
380
+ }
700
381
  }
701
- // Write session metadata for status command
702
382
  writeSessionMetadata({
703
383
  bdgPid: process.pid,
704
- chromePid: chrome.pid,
705
- startTime: sessionStartTime,
384
+ chromePid: chrome?.pid ?? 0, // 0 indicates external Chrome (not managed by bdg)
385
+ startTime: telemetryStore.sessionStartTime,
706
386
  port: config.port,
707
- targetId: target.id,
708
- webSocketDebuggerUrl: target.webSocketDebuggerUrl,
709
- activeTelemetry,
387
+ targetId: telemetryStore.targetInfo?.id,
388
+ webSocketDebuggerUrl: telemetryStore.targetInfo?.webSocketDebuggerUrl,
389
+ activeTelemetry: telemetryStore.activeTelemetry,
710
390
  });
711
391
  console.error(`[worker] Session metadata written`);
712
- // Send ready signal to parent
713
392
  sendReadySignal(config);
714
- // Set up stdin listener for IPC commands from daemon
715
393
  setupStdinListener();
716
- // Set up shutdown handlers
717
394
  process.on('SIGTERM', () => {
718
395
  log.debug(workerReceivedSIGTERM());
719
- void gracefulShutdown().then(() => process.exit(0));
396
+ void (async () => {
397
+ await cleanupWorker('normal');
398
+ process.exit(0);
399
+ })();
720
400
  });
721
401
  process.on('SIGINT', () => {
722
402
  log.debug(workerReceivedSIGINT());
723
- void gracefulShutdown().then(() => process.exit(0));
403
+ void (async () => {
404
+ await cleanupWorker('normal');
405
+ process.exit(0);
406
+ })();
724
407
  });
725
- // Handle timeout if specified
726
408
  if (config.timeout) {
727
409
  console.error(`[worker] Auto-stop after ${config.timeout}s`);
728
410
  setTimeout(() => {
729
411
  log.debug(workerTimeoutReached());
730
- void gracefulShutdown().then(() => process.exit(0));
412
+ void (async () => {
413
+ await cleanupWorker('timeout');
414
+ process.exit(0);
415
+ })();
731
416
  }, config.timeout * 1000);
732
417
  }
733
- // Keep process alive
734
418
  log.debug(workerSessionActive());
735
419
  }
736
420
  catch (error) {
737
421
  console.error(`[worker] Fatal error: ${getErrorMessage(error)}`);
738
- // Cleanup on error
739
- if (cdp) {
740
- cdp.close();
741
- }
742
- if (chrome) {
743
- await chrome.kill();
744
- }
422
+ await cleanupWorker('crash');
745
423
  process.exit(1);
746
424
  }
747
425
  }
748
- // Start worker
749
426
  void main();
750
427
  //# sourceMappingURL=worker.js.map