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