tabwright 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/LICENSE +21 -0
  2. package/bin.js +4 -0
  3. package/dist/a11y-client.js +204 -0
  4. package/dist/agent-skills/tabwright/SKILL.md +119 -0
  5. package/dist/aria-snapshot.d.ts +262 -0
  6. package/dist/aria-snapshot.d.ts.map +1 -0
  7. package/dist/aria-snapshot.js +1256 -0
  8. package/dist/aria-snapshot.js.map +1 -0
  9. package/dist/aria-snapshot.test.d.ts +2 -0
  10. package/dist/aria-snapshot.test.d.ts.map +1 -0
  11. package/dist/aria-snapshot.test.js +270 -0
  12. package/dist/aria-snapshot.test.js.map +1 -0
  13. package/dist/aria-snapshot.unit.test.d.ts +2 -0
  14. package/dist/aria-snapshot.unit.test.d.ts.map +1 -0
  15. package/dist/aria-snapshot.unit.test.js +542 -0
  16. package/dist/aria-snapshot.unit.test.js.map +1 -0
  17. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +5 -0
  18. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +1 -0
  19. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +5 -0
  20. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +1 -0
  21. package/dist/bippy.js +894 -0
  22. package/dist/browser-config.d.ts +13 -0
  23. package/dist/browser-config.d.ts.map +1 -0
  24. package/dist/browser-config.js +126 -0
  25. package/dist/browser-config.js.map +1 -0
  26. package/dist/browser-install.d.ts +16 -0
  27. package/dist/browser-install.d.ts.map +1 -0
  28. package/dist/browser-install.js +238 -0
  29. package/dist/browser-install.js.map +1 -0
  30. package/dist/browser-launch.d.ts +17 -0
  31. package/dist/browser-launch.d.ts.map +1 -0
  32. package/dist/browser-launch.js +44 -0
  33. package/dist/browser-launch.js.map +1 -0
  34. package/dist/builtin-capabilities.d.ts +28 -0
  35. package/dist/builtin-capabilities.d.ts.map +1 -0
  36. package/dist/builtin-capabilities.js +2673 -0
  37. package/dist/builtin-capabilities.js.map +1 -0
  38. package/dist/capability-agent-skill.d.ts +60 -0
  39. package/dist/capability-agent-skill.d.ts.map +1 -0
  40. package/dist/capability-agent-skill.js +225 -0
  41. package/dist/capability-agent-skill.js.map +1 -0
  42. package/dist/capability-auth-state.d.ts +34 -0
  43. package/dist/capability-auth-state.d.ts.map +1 -0
  44. package/dist/capability-auth-state.js +157 -0
  45. package/dist/capability-auth-state.js.map +1 -0
  46. package/dist/capability-auth.d.ts +36 -0
  47. package/dist/capability-auth.d.ts.map +1 -0
  48. package/dist/capability-auth.js +198 -0
  49. package/dist/capability-auth.js.map +1 -0
  50. package/dist/capability-cli-confirmation.test.d.ts +2 -0
  51. package/dist/capability-cli-confirmation.test.d.ts.map +1 -0
  52. package/dist/capability-cli-confirmation.test.js +79 -0
  53. package/dist/capability-cli-confirmation.test.js.map +1 -0
  54. package/dist/capability-options.d.ts +20 -0
  55. package/dist/capability-options.d.ts.map +1 -0
  56. package/dist/capability-options.js +31 -0
  57. package/dist/capability-options.js.map +1 -0
  58. package/dist/capability-options.test.d.ts +2 -0
  59. package/dist/capability-options.test.d.ts.map +1 -0
  60. package/dist/capability-options.test.js +81 -0
  61. package/dist/capability-options.test.js.map +1 -0
  62. package/dist/capability-package.d.ts +27 -0
  63. package/dist/capability-package.d.ts.map +1 -0
  64. package/dist/capability-package.js +444 -0
  65. package/dist/capability-package.js.map +1 -0
  66. package/dist/capability-package.test.d.ts +2 -0
  67. package/dist/capability-package.test.d.ts.map +1 -0
  68. package/dist/capability-package.test.js +179 -0
  69. package/dist/capability-package.test.js.map +1 -0
  70. package/dist/capability-registry.d.ts +262 -0
  71. package/dist/capability-registry.d.ts.map +1 -0
  72. package/dist/capability-registry.js +931 -0
  73. package/dist/capability-registry.js.map +1 -0
  74. package/dist/capability-registry.test.d.ts +2 -0
  75. package/dist/capability-registry.test.d.ts.map +1 -0
  76. package/dist/capability-registry.test.js +1683 -0
  77. package/dist/capability-registry.test.js.map +1 -0
  78. package/dist/capability-runner.d.ts +99 -0
  79. package/dist/capability-runner.d.ts.map +1 -0
  80. package/dist/capability-runner.js +608 -0
  81. package/dist/capability-runner.js.map +1 -0
  82. package/dist/capability-search-relevance.test.d.ts +2 -0
  83. package/dist/capability-search-relevance.test.d.ts.map +1 -0
  84. package/dist/capability-search-relevance.test.js +67 -0
  85. package/dist/capability-search-relevance.test.js.map +1 -0
  86. package/dist/capability-studio.d.ts +11 -0
  87. package/dist/capability-studio.d.ts.map +1 -0
  88. package/dist/capability-studio.js +593 -0
  89. package/dist/capability-studio.js.map +1 -0
  90. package/dist/capability-studio.test.d.ts +2 -0
  91. package/dist/capability-studio.test.d.ts.map +1 -0
  92. package/dist/capability-studio.test.js +41 -0
  93. package/dist/capability-studio.test.js.map +1 -0
  94. package/dist/cdp-log.d.ts +19 -0
  95. package/dist/cdp-log.d.ts.map +1 -0
  96. package/dist/cdp-log.js +83 -0
  97. package/dist/cdp-log.js.map +1 -0
  98. package/dist/cdp-log.test.d.ts +2 -0
  99. package/dist/cdp-log.test.d.ts.map +1 -0
  100. package/dist/cdp-log.test.js +109 -0
  101. package/dist/cdp-log.test.js.map +1 -0
  102. package/dist/cdp-relay.d.ts +19 -0
  103. package/dist/cdp-relay.d.ts.map +1 -0
  104. package/dist/cdp-relay.js +2375 -0
  105. package/dist/cdp-relay.js.map +1 -0
  106. package/dist/cdp-session.d.ts +37 -0
  107. package/dist/cdp-session.d.ts.map +1 -0
  108. package/dist/cdp-session.js +36 -0
  109. package/dist/cdp-session.js.map +1 -0
  110. package/dist/cdp-types.d.ts +65 -0
  111. package/dist/cdp-types.d.ts.map +1 -0
  112. package/dist/cdp-types.js +91 -0
  113. package/dist/cdp-types.js.map +1 -0
  114. package/dist/channel-owner-inspect.test.d.ts +2 -0
  115. package/dist/channel-owner-inspect.test.d.ts.map +1 -0
  116. package/dist/channel-owner-inspect.test.js +75 -0
  117. package/dist/channel-owner-inspect.test.js.map +1 -0
  118. package/dist/chrome-discovery.d.ts +65 -0
  119. package/dist/chrome-discovery.d.ts.map +1 -0
  120. package/dist/chrome-discovery.js +173 -0
  121. package/dist/chrome-discovery.js.map +1 -0
  122. package/dist/chrome-discovery.test.d.ts +2 -0
  123. package/dist/chrome-discovery.test.d.ts.map +1 -0
  124. package/dist/chrome-discovery.test.js +41 -0
  125. package/dist/chrome-discovery.test.js.map +1 -0
  126. package/dist/clean-html.d.ts +11 -0
  127. package/dist/clean-html.d.ts.map +1 -0
  128. package/dist/clean-html.js +106 -0
  129. package/dist/clean-html.js.map +1 -0
  130. package/dist/cli-help.test.d.ts +2 -0
  131. package/dist/cli-help.test.d.ts.map +1 -0
  132. package/dist/cli-help.test.js +98 -0
  133. package/dist/cli-help.test.js.map +1 -0
  134. package/dist/cli.d.ts +3 -0
  135. package/dist/cli.d.ts.map +1 -0
  136. package/dist/cli.js +2709 -0
  137. package/dist/cli.js.map +1 -0
  138. package/dist/cloud-client.d.ts +56 -0
  139. package/dist/cloud-client.d.ts.map +1 -0
  140. package/dist/cloud-client.js +127 -0
  141. package/dist/cloud-client.js.map +1 -0
  142. package/dist/create-logger.d.ts +9 -0
  143. package/dist/create-logger.d.ts.map +1 -0
  144. package/dist/create-logger.js +27 -0
  145. package/dist/create-logger.js.map +1 -0
  146. package/dist/debugger-api.md +458 -0
  147. package/dist/debugger-examples-types.d.ts +24 -0
  148. package/dist/debugger-examples-types.d.ts.map +1 -0
  149. package/dist/debugger-examples-types.js +2 -0
  150. package/dist/debugger-examples-types.js.map +1 -0
  151. package/dist/debugger-examples.d.ts +6 -0
  152. package/dist/debugger-examples.d.ts.map +1 -0
  153. package/dist/debugger-examples.js +53 -0
  154. package/dist/debugger-examples.js.map +1 -0
  155. package/dist/debugger.d.ts +381 -0
  156. package/dist/debugger.d.ts.map +1 -0
  157. package/dist/debugger.js +630 -0
  158. package/dist/debugger.js.map +1 -0
  159. package/dist/diff-utils.d.ts +20 -0
  160. package/dist/diff-utils.d.ts.map +1 -0
  161. package/dist/diff-utils.js +50 -0
  162. package/dist/diff-utils.js.map +1 -0
  163. package/dist/diff-utils.test.d.ts +2 -0
  164. package/dist/diff-utils.test.d.ts.map +1 -0
  165. package/dist/diff-utils.test.js +137 -0
  166. package/dist/diff-utils.test.js.map +1 -0
  167. package/dist/doctor.d.ts +44 -0
  168. package/dist/doctor.d.ts.map +1 -0
  169. package/dist/doctor.js +246 -0
  170. package/dist/doctor.js.map +1 -0
  171. package/dist/doctor.test.d.ts +2 -0
  172. package/dist/doctor.test.d.ts.map +1 -0
  173. package/dist/doctor.test.js +208 -0
  174. package/dist/doctor.test.js.map +1 -0
  175. package/dist/editor-api.md +374 -0
  176. package/dist/editor-examples.d.ts +11 -0
  177. package/dist/editor-examples.d.ts.map +1 -0
  178. package/dist/editor-examples.js +124 -0
  179. package/dist/editor-examples.js.map +1 -0
  180. package/dist/editor.d.ts +203 -0
  181. package/dist/editor.d.ts.map +1 -0
  182. package/dist/editor.js +363 -0
  183. package/dist/editor.js.map +1 -0
  184. package/dist/env-compat.d.ts +2 -0
  185. package/dist/env-compat.d.ts.map +1 -0
  186. package/dist/env-compat.js +27 -0
  187. package/dist/env-compat.js.map +1 -0
  188. package/dist/executor.d.ts +229 -0
  189. package/dist/executor.d.ts.map +1 -0
  190. package/dist/executor.js +1465 -0
  191. package/dist/executor.js.map +1 -0
  192. package/dist/executor.unit.test.d.ts +2 -0
  193. package/dist/executor.unit.test.d.ts.map +1 -0
  194. package/dist/executor.unit.test.js +143 -0
  195. package/dist/executor.unit.test.js.map +1 -0
  196. package/dist/extension/_locales/en/messages.json +278 -0
  197. package/dist/extension/_locales/zh_CN/messages.json +256 -0
  198. package/dist/extension/assets/options-CYH96Lcx.css +1349 -0
  199. package/dist/extension/background.js +3994 -0
  200. package/dist/extension/icons/SolarCursorSquareBold.png +0 -0
  201. package/dist/extension/icons/icon-black-128.png +0 -0
  202. package/dist/extension/icons/icon-black-16.png +0 -0
  203. package/dist/extension/icons/icon-black-32.png +0 -0
  204. package/dist/extension/icons/icon-black-48.png +0 -0
  205. package/dist/extension/icons/icon-gray-128.png +0 -0
  206. package/dist/extension/icons/icon-gray-16.png +0 -0
  207. package/dist/extension/icons/icon-gray-32.png +0 -0
  208. package/dist/extension/icons/icon-gray-48.png +0 -0
  209. package/dist/extension/icons/icon-green-128.png +0 -0
  210. package/dist/extension/icons/icon-green-16.png +0 -0
  211. package/dist/extension/icons/icon-green-32.png +0 -0
  212. package/dist/extension/icons/icon-green-48.png +0 -0
  213. package/dist/extension/icons/tabwright-icon-black.png +0 -0
  214. package/dist/extension/icons/tabwright-icon-gray-disabled.png +0 -0
  215. package/dist/extension/icons/tabwright-icon-gray-disabled.svg +1 -0
  216. package/dist/extension/manifest.json +54 -0
  217. package/dist/extension/options.js +16145 -0
  218. package/dist/extension/rrweb-recorder.js +12952 -0
  219. package/dist/extension/src/options.html +165 -0
  220. package/dist/extension/src/prism-bash.min.js +1 -0
  221. package/dist/extension/src/prism.min.js +1 -0
  222. package/dist/extension/src/welcome.html +396 -0
  223. package/dist/extension-connection.test.d.ts +2 -0
  224. package/dist/extension-connection.test.d.ts.map +1 -0
  225. package/dist/extension-connection.test.js +708 -0
  226. package/dist/extension-connection.test.js.map +1 -0
  227. package/dist/extension-icon-warning.test.d.ts +2 -0
  228. package/dist/extension-icon-warning.test.d.ts.map +1 -0
  229. package/dist/extension-icon-warning.test.js +33 -0
  230. package/dist/extension-icon-warning.test.js.map +1 -0
  231. package/dist/ghost-browser.d.ts +62 -0
  232. package/dist/ghost-browser.d.ts.map +1 -0
  233. package/dist/ghost-browser.js +107 -0
  234. package/dist/ghost-browser.js.map +1 -0
  235. package/dist/ghost-cursor-client.js +374 -0
  236. package/dist/ghost-cursor-controller.d.ts +46 -0
  237. package/dist/ghost-cursor-controller.d.ts.map +1 -0
  238. package/dist/ghost-cursor-controller.js +98 -0
  239. package/dist/ghost-cursor-controller.js.map +1 -0
  240. package/dist/ghost-cursor.d.ts +27 -0
  241. package/dist/ghost-cursor.d.ts.map +1 -0
  242. package/dist/ghost-cursor.js +79 -0
  243. package/dist/ghost-cursor.js.map +1 -0
  244. package/dist/htmlrewrite.d.ts +8 -0
  245. package/dist/htmlrewrite.d.ts.map +1 -0
  246. package/dist/htmlrewrite.js +339 -0
  247. package/dist/htmlrewrite.js.map +1 -0
  248. package/dist/htmlrewrite.test.d.ts +2 -0
  249. package/dist/htmlrewrite.test.d.ts.map +1 -0
  250. package/dist/htmlrewrite.test.js +7975 -0
  251. package/dist/htmlrewrite.test.js.map +1 -0
  252. package/dist/index.d.ts +20 -0
  253. package/dist/index.d.ts.map +1 -0
  254. package/dist/index.js +11 -0
  255. package/dist/index.js.map +1 -0
  256. package/dist/kill-port.d.ts +29 -0
  257. package/dist/kill-port.d.ts.map +1 -0
  258. package/dist/kill-port.js +190 -0
  259. package/dist/kill-port.js.map +1 -0
  260. package/dist/kitty-graphics.d.ts +22 -0
  261. package/dist/kitty-graphics.d.ts.map +1 -0
  262. package/dist/kitty-graphics.js +71 -0
  263. package/dist/kitty-graphics.js.map +1 -0
  264. package/dist/kitty-graphics.test.d.ts +2 -0
  265. package/dist/kitty-graphics.test.d.ts.map +1 -0
  266. package/dist/kitty-graphics.test.js +125 -0
  267. package/dist/kitty-graphics.test.js.map +1 -0
  268. package/dist/locator-selector.test.d.ts +2 -0
  269. package/dist/locator-selector.test.d.ts.map +1 -0
  270. package/dist/locator-selector.test.js +98 -0
  271. package/dist/locator-selector.test.js.map +1 -0
  272. package/dist/mcp-client.d.ts +20 -0
  273. package/dist/mcp-client.d.ts.map +1 -0
  274. package/dist/mcp-client.js +56 -0
  275. package/dist/mcp-client.js.map +1 -0
  276. package/dist/mcp.d.ts +6 -0
  277. package/dist/mcp.d.ts.map +1 -0
  278. package/dist/mcp.js +511 -0
  279. package/dist/mcp.js.map +1 -0
  280. package/dist/on-mouse-action.test.d.ts +2 -0
  281. package/dist/on-mouse-action.test.d.ts.map +1 -0
  282. package/dist/on-mouse-action.test.js +180 -0
  283. package/dist/on-mouse-action.test.js.map +1 -0
  284. package/dist/options-page.test.d.ts +2 -0
  285. package/dist/options-page.test.d.ts.map +1 -0
  286. package/dist/options-page.test.js +773 -0
  287. package/dist/options-page.test.js.map +1 -0
  288. package/dist/package-paths.d.ts +4 -0
  289. package/dist/package-paths.d.ts.map +1 -0
  290. package/dist/package-paths.js +30 -0
  291. package/dist/package-paths.js.map +1 -0
  292. package/dist/page-markdown.d.ts +40 -0
  293. package/dist/page-markdown.d.ts.map +1 -0
  294. package/dist/page-markdown.js +181 -0
  295. package/dist/page-markdown.js.map +1 -0
  296. package/dist/performance-examples.d.ts +5 -0
  297. package/dist/performance-examples.d.ts.map +1 -0
  298. package/dist/performance-examples.js +112 -0
  299. package/dist/performance-examples.js.map +1 -0
  300. package/dist/performance-profiling.md +417 -0
  301. package/dist/playwright-import.d.ts +19 -0
  302. package/dist/playwright-import.d.ts.map +1 -0
  303. package/dist/playwright-import.js +40 -0
  304. package/dist/playwright-import.js.map +1 -0
  305. package/dist/popup-relocation.test.d.ts +7 -0
  306. package/dist/popup-relocation.test.d.ts.map +1 -0
  307. package/dist/popup-relocation.test.js +139 -0
  308. package/dist/popup-relocation.test.js.map +1 -0
  309. package/dist/product-paths.d.ts +9 -0
  310. package/dist/product-paths.d.ts.map +1 -0
  311. package/dist/product-paths.js +24 -0
  312. package/dist/product-paths.js.map +1 -0
  313. package/dist/product-paths.test.d.ts +2 -0
  314. package/dist/product-paths.test.d.ts.map +1 -0
  315. package/dist/product-paths.test.js +39 -0
  316. package/dist/product-paths.test.js.map +1 -0
  317. package/dist/prompt.md +1004 -0
  318. package/dist/protocol.d.ts +248 -0
  319. package/dist/protocol.d.ts.map +1 -0
  320. package/dist/protocol.js +59 -0
  321. package/dist/protocol.js.map +1 -0
  322. package/dist/protocol.test.d.ts +2 -0
  323. package/dist/protocol.test.d.ts.map +1 -0
  324. package/dist/protocol.test.js +31 -0
  325. package/dist/protocol.test.js.map +1 -0
  326. package/dist/react-source.d.ts +57 -0
  327. package/dist/react-source.d.ts.map +1 -0
  328. package/dist/react-source.js +254 -0
  329. package/dist/react-source.js.map +1 -0
  330. package/dist/readability.js +1674 -0
  331. package/dist/relay-client.d.ts +104 -0
  332. package/dist/relay-client.d.ts.map +1 -0
  333. package/dist/relay-client.js +426 -0
  334. package/dist/relay-client.js.map +1 -0
  335. package/dist/relay-client.test.d.ts +2 -0
  336. package/dist/relay-client.test.d.ts.map +1 -0
  337. package/dist/relay-client.test.js +305 -0
  338. package/dist/relay-client.test.js.map +1 -0
  339. package/dist/relay-core.test.d.ts +2 -0
  340. package/dist/relay-core.test.d.ts.map +1 -0
  341. package/dist/relay-core.test.js +1427 -0
  342. package/dist/relay-core.test.js.map +1 -0
  343. package/dist/relay-navigation.test.d.ts +2 -0
  344. package/dist/relay-navigation.test.d.ts.map +1 -0
  345. package/dist/relay-navigation.test.js +661 -0
  346. package/dist/relay-navigation.test.js.map +1 -0
  347. package/dist/relay-session.test.d.ts +2 -0
  348. package/dist/relay-session.test.d.ts.map +1 -0
  349. package/dist/relay-session.test.js +1121 -0
  350. package/dist/relay-session.test.js.map +1 -0
  351. package/dist/relay-state.d.ts +178 -0
  352. package/dist/relay-state.d.ts.map +1 -0
  353. package/dist/relay-state.js +346 -0
  354. package/dist/relay-state.js.map +1 -0
  355. package/dist/relay-state.test.d.ts +2 -0
  356. package/dist/relay-state.test.d.ts.map +1 -0
  357. package/dist/relay-state.test.js +594 -0
  358. package/dist/relay-state.test.js.map +1 -0
  359. package/dist/replay-ai-index.d.ts +99 -0
  360. package/dist/replay-ai-index.d.ts.map +1 -0
  361. package/dist/replay-ai-index.js +677 -0
  362. package/dist/replay-ai-index.js.map +1 -0
  363. package/dist/replay-ai-index.test.d.ts +2 -0
  364. package/dist/replay-ai-index.test.d.ts.map +1 -0
  365. package/dist/replay-ai-index.test.js +255 -0
  366. package/dist/replay-ai-index.test.js.map +1 -0
  367. package/dist/replay-cli.test.d.ts +2 -0
  368. package/dist/replay-cli.test.d.ts.map +1 -0
  369. package/dist/replay-cli.test.js +275 -0
  370. package/dist/replay-cli.test.js.map +1 -0
  371. package/dist/replay-eval.d.ts +44 -0
  372. package/dist/replay-eval.d.ts.map +1 -0
  373. package/dist/replay-eval.js +902 -0
  374. package/dist/replay-eval.js.map +1 -0
  375. package/dist/replay-handoff.d.ts +29 -0
  376. package/dist/replay-handoff.d.ts.map +1 -0
  377. package/dist/replay-handoff.js +83 -0
  378. package/dist/replay-handoff.js.map +1 -0
  379. package/dist/replay-handoff.test.d.ts +2 -0
  380. package/dist/replay-handoff.test.d.ts.map +1 -0
  381. package/dist/replay-handoff.test.js +123 -0
  382. package/dist/replay-handoff.test.js.map +1 -0
  383. package/dist/replay-workflow-compiler.d.ts +44 -0
  384. package/dist/replay-workflow-compiler.d.ts.map +1 -0
  385. package/dist/replay-workflow-compiler.js +601 -0
  386. package/dist/replay-workflow-compiler.js.map +1 -0
  387. package/dist/replay-workflow-compiler.test.d.ts +2 -0
  388. package/dist/replay-workflow-compiler.test.d.ts.map +1 -0
  389. package/dist/replay-workflow-compiler.test.js +223 -0
  390. package/dist/replay-workflow-compiler.test.js.map +1 -0
  391. package/dist/rrweb-recording-relay.d.ts +56 -0
  392. package/dist/rrweb-recording-relay.d.ts.map +1 -0
  393. package/dist/rrweb-recording-relay.js +299 -0
  394. package/dist/rrweb-recording-relay.js.map +1 -0
  395. package/dist/rrweb-recording-relay.test.d.ts +2 -0
  396. package/dist/rrweb-recording-relay.test.d.ts.map +1 -0
  397. package/dist/rrweb-recording-relay.test.js +85 -0
  398. package/dist/rrweb-recording-relay.test.js.map +1 -0
  399. package/dist/rrweb-recording.d.ts +104 -0
  400. package/dist/rrweb-recording.d.ts.map +1 -0
  401. package/dist/rrweb-recording.js +180 -0
  402. package/dist/rrweb-recording.js.map +1 -0
  403. package/dist/scoped-fs.d.ts +95 -0
  404. package/dist/scoped-fs.d.ts.map +1 -0
  405. package/dist/scoped-fs.js +358 -0
  406. package/dist/scoped-fs.js.map +1 -0
  407. package/dist/scoped-fs.test.d.ts +5 -0
  408. package/dist/scoped-fs.test.d.ts.map +1 -0
  409. package/dist/scoped-fs.test.js +73 -0
  410. package/dist/scoped-fs.test.js.map +1 -0
  411. package/dist/selector-generator.js +7378 -0
  412. package/dist/skill-stub.test.d.ts +2 -0
  413. package/dist/skill-stub.test.d.ts.map +1 -0
  414. package/dist/skill-stub.test.js +22 -0
  415. package/dist/skill-stub.test.js.map +1 -0
  416. package/dist/snapshot-tools.test.d.ts +2 -0
  417. package/dist/snapshot-tools.test.d.ts.map +1 -0
  418. package/dist/snapshot-tools.test.js +856 -0
  419. package/dist/snapshot-tools.test.js.map +1 -0
  420. package/dist/start-relay-server.d.ts +6 -0
  421. package/dist/start-relay-server.d.ts.map +1 -0
  422. package/dist/start-relay-server.js +57 -0
  423. package/dist/start-relay-server.js.map +1 -0
  424. package/dist/styles-api.md +124 -0
  425. package/dist/styles-examples.d.ts +8 -0
  426. package/dist/styles-examples.d.ts.map +1 -0
  427. package/dist/styles-examples.js +64 -0
  428. package/dist/styles-examples.js.map +1 -0
  429. package/dist/styles.d.ts +27 -0
  430. package/dist/styles.d.ts.map +1 -0
  431. package/dist/styles.js +231 -0
  432. package/dist/styles.js.map +1 -0
  433. package/dist/tabwright-agent-skill.d.ts +30 -0
  434. package/dist/tabwright-agent-skill.d.ts.map +1 -0
  435. package/dist/tabwright-agent-skill.js +74 -0
  436. package/dist/tabwright-agent-skill.js.map +1 -0
  437. package/dist/tabwright-agent-skill.test.d.ts +2 -0
  438. package/dist/tabwright-agent-skill.test.d.ts.map +1 -0
  439. package/dist/tabwright-agent-skill.test.js +51 -0
  440. package/dist/tabwright-agent-skill.test.js.map +1 -0
  441. package/dist/test-declarations.d.ts +13 -0
  442. package/dist/test-declarations.d.ts.map +1 -0
  443. package/dist/test-declarations.js +2 -0
  444. package/dist/test-declarations.js.map +1 -0
  445. package/dist/test-utils.d.ts +69 -0
  446. package/dist/test-utils.d.ts.map +1 -0
  447. package/dist/test-utils.js +448 -0
  448. package/dist/test-utils.js.map +1 -0
  449. package/dist/test-utils.test.d.ts +2 -0
  450. package/dist/test-utils.test.d.ts.map +1 -0
  451. package/dist/test-utils.test.js +55 -0
  452. package/dist/test-utils.test.js.map +1 -0
  453. package/dist/utils.d.ts +26 -0
  454. package/dist/utils.d.ts.map +1 -0
  455. package/dist/utils.js +60 -0
  456. package/dist/utils.js.map +1 -0
  457. package/dist/wait-for-page-load.d.ts +16 -0
  458. package/dist/wait-for-page-load.d.ts.map +1 -0
  459. package/dist/wait-for-page-load.js +146 -0
  460. package/dist/wait-for-page-load.js.map +1 -0
  461. package/dist/workflow-capability.d.ts +72 -0
  462. package/dist/workflow-capability.d.ts.map +1 -0
  463. package/dist/workflow-capability.js +316 -0
  464. package/dist/workflow-capability.js.map +1 -0
  465. package/dist/workflow-script-flow.test.d.ts +2 -0
  466. package/dist/workflow-script-flow.test.d.ts.map +1 -0
  467. package/dist/workflow-script-flow.test.js +285 -0
  468. package/dist/workflow-script-flow.test.js.map +1 -0
  469. package/package.json +80 -0
  470. package/src/__snapshots__/x.com.processed.html +1003 -0
  471. package/src/__snapshots__/x.com.processed.withStyles.html +2720 -0
  472. package/src/a11y-client.ts +241 -0
  473. package/src/agent-skills/conan-config/SKILL.md +141 -0
  474. package/src/agent-skills/conan-config/agents/openai.yaml +4 -0
  475. package/src/aria-snapshot.test.ts +311 -0
  476. package/src/aria-snapshot.ts +1681 -0
  477. package/src/aria-snapshot.unit.test.ts +615 -0
  478. package/src/aria-snapshots/github-interactive.txt +193 -0
  479. package/src/aria-snapshots/github-raw.txt +309 -0
  480. package/src/aria-snapshots/hackernews-interactive.txt +477 -0
  481. package/src/aria-snapshots/hackernews-raw.txt +428 -0
  482. package/src/aria-snapshots/prosemirror-interactive.txt +66 -0
  483. package/src/aria-snapshots/prosemirror-raw.txt +145 -0
  484. package/src/assets/aria-labels-hacker-news.png +0 -0
  485. package/src/assets/aria-labels-old-reddit.png +0 -0
  486. package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +5 -0
  487. package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +18 -0
  488. package/src/assets/x.com.html +32946 -0
  489. package/src/browser-config.ts +179 -0
  490. package/src/browser-install.ts +284 -0
  491. package/src/browser-launch.ts +75 -0
  492. package/src/builtin-capabilities.ts +2765 -0
  493. package/src/capability-agent-skill.ts +305 -0
  494. package/src/capability-auth-state.ts +197 -0
  495. package/src/capability-auth.ts +249 -0
  496. package/src/capability-cli-confirmation.test.ts +90 -0
  497. package/src/capability-options.test.ts +89 -0
  498. package/src/capability-options.ts +57 -0
  499. package/src/capability-package.test.ts +204 -0
  500. package/src/capability-package.ts +555 -0
  501. package/src/capability-registry.test.ts +1905 -0
  502. package/src/capability-registry.ts +1234 -0
  503. package/src/capability-runner.ts +801 -0
  504. package/src/capability-search-relevance.test.ts +73 -0
  505. package/src/capability-studio.test.ts +45 -0
  506. package/src/capability-studio.ts +641 -0
  507. package/src/cdp-log.test.ts +131 -0
  508. package/src/cdp-log.ts +112 -0
  509. package/src/cdp-relay.ts +2944 -0
  510. package/src/cdp-session.ts +77 -0
  511. package/src/cdp-types.ts +158 -0
  512. package/src/channel-owner-inspect.test.ts +94 -0
  513. package/src/chrome-discovery.test.ts +50 -0
  514. package/src/chrome-discovery.ts +220 -0
  515. package/src/clean-html.ts +141 -0
  516. package/src/cli-help.test.ts +123 -0
  517. package/src/cli.ts +3181 -0
  518. package/src/cloud-client.ts +179 -0
  519. package/src/create-logger.ts +38 -0
  520. package/src/debugger-examples-types.ts +16 -0
  521. package/src/debugger-examples.ts +66 -0
  522. package/src/debugger.ts +708 -0
  523. package/src/diff-utils.test.ts +152 -0
  524. package/src/diff-utils.ts +70 -0
  525. package/src/doctor.test.ts +244 -0
  526. package/src/doctor.ts +321 -0
  527. package/src/editor-examples.ts +158 -0
  528. package/src/editor.ts +426 -0
  529. package/src/env-compat.ts +28 -0
  530. package/src/executor.ts +1824 -0
  531. package/src/executor.unit.test.ts +168 -0
  532. package/src/extension-connection.test.ts +855 -0
  533. package/src/extension-icon-warning.test.ts +45 -0
  534. package/src/ghost-browser.ts +149 -0
  535. package/src/ghost-cursor-client.ts +494 -0
  536. package/src/ghost-cursor-controller.ts +129 -0
  537. package/src/ghost-cursor.ts +123 -0
  538. package/src/htmlrewrite.test.ts +8008 -0
  539. package/src/htmlrewrite.ts +390 -0
  540. package/src/index.ts +53 -0
  541. package/src/kill-port.ts +219 -0
  542. package/src/kitty-graphics.test.ts +139 -0
  543. package/src/kitty-graphics.ts +79 -0
  544. package/src/locator-selector.test.ts +119 -0
  545. package/src/mcp-client.ts +78 -0
  546. package/src/mcp.ts +629 -0
  547. package/src/on-mouse-action.test.ts +226 -0
  548. package/src/options-page.test.ts +839 -0
  549. package/src/package-paths.ts +38 -0
  550. package/src/page-markdown.ts +240 -0
  551. package/src/performance-examples.ts +186 -0
  552. package/src/playwright-import.ts +59 -0
  553. package/src/popup-relocation.test.ts +163 -0
  554. package/src/product-paths.test.ts +47 -0
  555. package/src/product-paths.ts +28 -0
  556. package/src/protocol.test.ts +52 -0
  557. package/src/protocol.ts +351 -0
  558. package/src/react-source.ts +379 -0
  559. package/src/relay-client.test.ts +375 -0
  560. package/src/relay-client.ts +572 -0
  561. package/src/relay-core.test.ts +1603 -0
  562. package/src/relay-navigation.test.ts +790 -0
  563. package/src/relay-session.test.ts +1375 -0
  564. package/src/relay-state.test.ts +729 -0
  565. package/src/relay-state.ts +561 -0
  566. package/src/replay-ai-index.test.ts +278 -0
  567. package/src/replay-ai-index.ts +872 -0
  568. package/src/replay-cli.test.ts +325 -0
  569. package/src/replay-eval.ts +1039 -0
  570. package/src/replay-handoff.test.ts +163 -0
  571. package/src/replay-handoff.ts +109 -0
  572. package/src/replay-workflow-compiler.test.ts +250 -0
  573. package/src/replay-workflow-compiler.ts +700 -0
  574. package/src/resource.md +409 -0
  575. package/src/rrweb-recording-relay.test.ts +99 -0
  576. package/src/rrweb-recording-relay.ts +400 -0
  577. package/src/rrweb-recording.ts +322 -0
  578. package/src/scoped-fs.test.ts +80 -0
  579. package/src/scoped-fs.ts +420 -0
  580. package/src/skill-stub.test.ts +24 -0
  581. package/src/skill.md +1413 -0
  582. package/src/snapshot-tools.test.ts +1017 -0
  583. package/src/snapshots/hacker-news-accessibility-full.md +81 -0
  584. package/src/snapshots/hacker-news-accessibility-interactive.md +43 -0
  585. package/src/snapshots/page-markdown-output.txt +16 -0
  586. package/src/snapshots/shadcn-ui-accessibility-full.md +201 -0
  587. package/src/snapshots/shadcn-ui-accessibility-interactive.md +109 -0
  588. package/src/start-relay-server.ts +69 -0
  589. package/src/styles-examples.ts +84 -0
  590. package/src/styles.ts +343 -0
  591. package/src/tabwright-agent-skill.test.ts +61 -0
  592. package/src/tabwright-agent-skill.ts +105 -0
  593. package/src/test-declarations.ts +13 -0
  594. package/src/test-utils.test.ts +70 -0
  595. package/src/test-utils.ts +566 -0
  596. package/src/utils.ts +78 -0
  597. package/src/wait-for-page-load.ts +198 -0
  598. package/src/workflow-capability.ts +417 -0
  599. package/src/workflow-script-flow.test.ts +388 -0
@@ -0,0 +1,708 @@
1
+ import type { ICDPSession } from './cdp-session.js'
2
+ import type { Protocol } from 'devtools-protocol'
3
+
4
+ export interface BreakpointInfo {
5
+ id: string
6
+ file: string
7
+ line: number
8
+ }
9
+
10
+ export interface LocationInfo {
11
+ url: string
12
+ lineNumber: number
13
+ columnNumber: number
14
+ callstack: Array<{
15
+ functionName: string
16
+ url: string
17
+ lineNumber: number
18
+ columnNumber: number
19
+ }>
20
+ sourceContext: string
21
+ }
22
+
23
+ export interface EvaluateResult {
24
+ value: unknown
25
+ }
26
+
27
+ export interface ScriptInfo {
28
+ scriptId: string
29
+ url: string
30
+ }
31
+
32
+ /**
33
+ * A class for debugging JavaScript code via Chrome DevTools Protocol.
34
+ * Works with both Node.js (--inspect) and browser debugging.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const cdp = await getCDPSessionForPage({ page, wsUrl })
39
+ * const dbg = new Debugger({ cdp })
40
+ *
41
+ * await dbg.setBreakpoint({ file: 'https://example.com/app.js', line: 42 })
42
+ * // trigger the code path, then:
43
+ * const location = await dbg.getLocation()
44
+ * const vars = await dbg.inspectLocalVariables()
45
+ * await dbg.resume()
46
+ * ```
47
+ */
48
+ export class Debugger {
49
+ private cdp: ICDPSession
50
+ private debuggerEnabled = false
51
+ private paused = false
52
+ private currentCallFrames: Protocol.Debugger.CallFrame[] = []
53
+ private breakpoints = new Map<string, BreakpointInfo>()
54
+ private scripts = new Map<string, ScriptInfo>()
55
+ private xhrBreakpoints = new Set<string>()
56
+ private blackboxPatterns: string[] = []
57
+
58
+ /**
59
+ * Creates a new Debugger instance.
60
+ *
61
+ * @param options - Configuration options
62
+ * @param options.cdp - A CDPSession instance for sending CDP commands (works with both
63
+ * our CDPSession and Playwright's CDPSession)
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * const cdp = await getCDPSessionForPage({ page, wsUrl })
68
+ * const dbg = new Debugger({ cdp })
69
+ * ```
70
+ */
71
+ constructor({ cdp }: { cdp: ICDPSession }) {
72
+ this.cdp = cdp
73
+ this.setupEventListeners()
74
+ }
75
+
76
+ private setupEventListeners() {
77
+ this.cdp.on('Debugger.paused', (params) => {
78
+ this.paused = true
79
+ this.currentCallFrames = params.callFrames
80
+ })
81
+
82
+ this.cdp.on('Debugger.resumed', () => {
83
+ this.paused = false
84
+ this.currentCallFrames = []
85
+ })
86
+
87
+ this.cdp.on('Debugger.scriptParsed', (params) => {
88
+ if (params.url && !params.url.startsWith('chrome') && !params.url.startsWith('devtools')) {
89
+ this.scripts.set(params.scriptId, {
90
+ scriptId: params.scriptId,
91
+ url: params.url,
92
+ })
93
+ }
94
+ })
95
+ }
96
+
97
+ /**
98
+ * Enables the debugger and runtime domains. Called automatically by other methods.
99
+ * Also resumes execution if the target was started with --inspect-brk.
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * await dbg.enable()
104
+ * ```
105
+ */
106
+ async enable(): Promise<void> {
107
+ if (this.debuggerEnabled) {
108
+ return
109
+ }
110
+ await this.cdp.send('Debugger.disable')
111
+ await this.cdp.send('Runtime.disable')
112
+ this.scripts.clear()
113
+ const scriptsReady = new Promise<void>((resolve) => {
114
+ let timeout: ReturnType<typeof setTimeout>
115
+ const listener = () => {
116
+ clearTimeout(timeout)
117
+ timeout = setTimeout(() => {
118
+ this.cdp.off('Debugger.scriptParsed', listener)
119
+ resolve()
120
+ }, 100)
121
+ }
122
+ this.cdp.on('Debugger.scriptParsed', listener)
123
+ timeout = setTimeout(() => {
124
+ this.cdp.off('Debugger.scriptParsed', listener)
125
+ resolve()
126
+ }, 100)
127
+ })
128
+ await this.cdp.send('Debugger.enable')
129
+ await this.cdp.send('Runtime.enable')
130
+ await this.cdp.send('Runtime.runIfWaitingForDebugger')
131
+ await scriptsReady
132
+ this.debuggerEnabled = true
133
+ }
134
+
135
+ /**
136
+ * Sets a breakpoint at a specified URL and line number.
137
+ * Use the URL from listScripts() to find available scripts.
138
+ *
139
+ * @param options - Breakpoint options
140
+ * @param options.file - Script URL (e.g. https://example.com/app.js)
141
+ * @param options.line - Line number (1-based)
142
+ * @param options.condition - Optional JS expression; only pause when it evaluates to true
143
+ * @returns The breakpoint ID for later removal
144
+ *
145
+ * @example
146
+ * ```ts
147
+ * const id = await dbg.setBreakpoint({ file: 'https://example.com/app.js', line: 42 })
148
+ * // later:
149
+ * await dbg.deleteBreakpoint({ breakpointId: id })
150
+ *
151
+ * // Conditional breakpoint - only pause when userId is 123
152
+ * await dbg.setBreakpoint({
153
+ * file: 'https://example.com/app.js',
154
+ * line: 42,
155
+ * condition: 'userId === 123'
156
+ * })
157
+ * ```
158
+ */
159
+ async setBreakpoint({ file, line, condition }: { file: string; line: number; condition?: string }): Promise<string> {
160
+ await this.enable()
161
+
162
+ const response = await this.cdp.send('Debugger.setBreakpointByUrl', {
163
+ lineNumber: line - 1,
164
+ urlRegex: file.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'),
165
+ columnNumber: 0,
166
+ condition,
167
+ })
168
+
169
+ this.breakpoints.set(response.breakpointId, { id: response.breakpointId, file, line })
170
+ return response.breakpointId
171
+ }
172
+
173
+ /**
174
+ * Removes a breakpoint by its ID.
175
+ *
176
+ * @param options - Options
177
+ * @param options.breakpointId - The breakpoint ID returned by setBreakpoint
178
+ *
179
+ * @example
180
+ * ```ts
181
+ * await dbg.deleteBreakpoint({ breakpointId: 'bp-123' })
182
+ * ```
183
+ */
184
+ async deleteBreakpoint({ breakpointId }: { breakpointId: string }): Promise<void> {
185
+ await this.enable()
186
+ await this.cdp.send('Debugger.removeBreakpoint', { breakpointId })
187
+ this.breakpoints.delete(breakpointId)
188
+ }
189
+
190
+ /**
191
+ * Returns a list of all active breakpoints set by this debugger instance.
192
+ *
193
+ * @returns Array of breakpoint info objects
194
+ *
195
+ * @example
196
+ * ```ts
197
+ * const breakpoints = dbg.listBreakpoints()
198
+ * // [{ id: 'bp-123', file: 'https://example.com/index.js', line: 42 }]
199
+ * ```
200
+ */
201
+ listBreakpoints(): BreakpointInfo[] {
202
+ return Array.from(this.breakpoints.values())
203
+ }
204
+
205
+ /**
206
+ * Inspects local variables in the current call frame.
207
+ * Must be paused at a breakpoint. String values over 1000 chars are truncated.
208
+ * Use evaluate() for full control over reading specific values.
209
+ *
210
+ * @returns Record of variable names to values
211
+ * @throws Error if not paused or no active call frames
212
+ *
213
+ * @example
214
+ * ```ts
215
+ * const vars = await dbg.inspectLocalVariables()
216
+ * // { myVar: 'hello', count: 42 }
217
+ * ```
218
+ */
219
+ async inspectLocalVariables(): Promise<Record<string, unknown>> {
220
+ await this.enable()
221
+
222
+ if (!this.paused || this.currentCallFrames.length === 0) {
223
+ throw new Error('Debugger is not paused at a breakpoint')
224
+ }
225
+
226
+ const frame = this.currentCallFrames[0]
227
+ const result: Record<string, unknown> = {}
228
+
229
+ for (const scopeObj of frame.scopeChain) {
230
+ if (scopeObj.type === 'global') {
231
+ continue
232
+ }
233
+
234
+ if (!scopeObj.object.objectId) {
235
+ continue
236
+ }
237
+
238
+ const objProperties = await this.cdp.send('Runtime.getProperties', {
239
+ objectId: scopeObj.object.objectId,
240
+ ownProperties: true,
241
+ accessorPropertiesOnly: false,
242
+ generatePreview: true,
243
+ })
244
+
245
+ for (const prop of objProperties.result) {
246
+ if (prop.value && prop.configurable) {
247
+ result[prop.name] = this.formatPropertyValue(prop.value)
248
+ }
249
+ }
250
+ }
251
+
252
+ return result
253
+ }
254
+
255
+ /**
256
+ * Returns global lexical scope variable names.
257
+ *
258
+ * @returns Array of global variable names
259
+ *
260
+ * @example
261
+ * ```ts
262
+ * const globals = await dbg.inspectGlobalVariables()
263
+ * // ['myGlobal', 'CONFIG']
264
+ * ```
265
+ */
266
+ async inspectGlobalVariables(): Promise<string[]> {
267
+ await this.enable()
268
+
269
+ const response = await this.cdp.send('Runtime.globalLexicalScopeNames', {})
270
+
271
+ return response.names
272
+ }
273
+
274
+ /**
275
+ * Evaluates a JavaScript expression and returns the result.
276
+ * When paused at a breakpoint, evaluates in the current stack frame scope,
277
+ * allowing access to local variables. Otherwise evaluates in global scope.
278
+ * Values are not truncated, use this for full control over reading specific variables.
279
+ *
280
+ * @param options - Options
281
+ * @param options.expression - JavaScript expression to evaluate
282
+ * @returns The result value
283
+ *
284
+ * @example
285
+ * ```ts
286
+ * // When paused, can access local variables:
287
+ * const result = await dbg.evaluate({ expression: 'localVar + 1' })
288
+ *
289
+ * // Read a large string that would be truncated in inspectLocalVariables:
290
+ * const full = await dbg.evaluate({ expression: 'largeStringVar' })
291
+ * ```
292
+ */
293
+ async evaluate({ expression }: { expression: string }): Promise<EvaluateResult> {
294
+ await this.enable()
295
+
296
+ const wrappedExpression = `
297
+ try {
298
+ ${expression}
299
+ } catch (e) {
300
+ e;
301
+ }
302
+ `
303
+
304
+ let response: Protocol.Debugger.EvaluateOnCallFrameResponse | Protocol.Runtime.EvaluateResponse
305
+
306
+ if (this.paused && this.currentCallFrames.length > 0) {
307
+ const frame = this.currentCallFrames[0]
308
+ response = await this.cdp.send('Debugger.evaluateOnCallFrame', {
309
+ callFrameId: frame.callFrameId,
310
+ expression: wrappedExpression,
311
+ objectGroup: 'console',
312
+ includeCommandLineAPI: true,
313
+ silent: false,
314
+ returnByValue: true,
315
+ generatePreview: true,
316
+ })
317
+ } else {
318
+ response = await this.cdp.send('Runtime.evaluate', {
319
+ expression: wrappedExpression,
320
+ objectGroup: 'console',
321
+ includeCommandLineAPI: true,
322
+ silent: false,
323
+ returnByValue: true,
324
+ generatePreview: true,
325
+ awaitPromise: true,
326
+ })
327
+ }
328
+
329
+ const value = await this.processRemoteObject(response.result)
330
+
331
+ return { value }
332
+ }
333
+
334
+ /**
335
+ * Gets the current execution location when paused at a breakpoint.
336
+ * Includes the call stack and surrounding source code for context.
337
+ *
338
+ * @returns Location info with URL, line number, call stack, and source context
339
+ * @throws Error if debugger is not paused
340
+ *
341
+ * @example
342
+ * ```ts
343
+ * const location = await dbg.getLocation()
344
+ * console.log(location.url) // 'https://example.com/src/index.js'
345
+ * console.log(location.lineNumber) // 42
346
+ * console.log(location.callstack) // [{ functionName: 'handleRequest', ... }]
347
+ * console.log(location.sourceContext)
348
+ * // ' 40: function handleRequest(req) {
349
+ * // 41: const data = req.body
350
+ * // > 42: processData(data)
351
+ * // 43: }'
352
+ * ```
353
+ */
354
+ async getLocation(): Promise<LocationInfo> {
355
+ await this.enable()
356
+
357
+ if (!this.paused || this.currentCallFrames.length === 0) {
358
+ throw new Error('Debugger is not paused at a breakpoint')
359
+ }
360
+
361
+ const frame = this.currentCallFrames[0]
362
+ const { scriptId, lineNumber, columnNumber } = frame.location
363
+
364
+ const callstack = this.currentCallFrames.map((f) => ({
365
+ functionName: f.functionName || '(anonymous)',
366
+ url: f.url,
367
+ lineNumber: f.location.lineNumber + 1,
368
+ columnNumber: f.location.columnNumber || 0,
369
+ }))
370
+
371
+ let sourceContext = ''
372
+ try {
373
+ const scriptSource = await this.cdp.send('Debugger.getScriptSource', { scriptId })
374
+ const lines = scriptSource.scriptSource.split('\n')
375
+ const startLine = Math.max(0, lineNumber - 3)
376
+ const endLine = Math.min(lines.length - 1, lineNumber + 3)
377
+
378
+ for (let i = startLine; i <= endLine; i++) {
379
+ const prefix = i === lineNumber ? '> ' : ' '
380
+ sourceContext += `${prefix}${i + 1}: ${lines[i]}\n`
381
+ }
382
+ } catch {
383
+ sourceContext = 'Unable to retrieve source code'
384
+ }
385
+
386
+ return {
387
+ url: frame.url,
388
+ lineNumber: lineNumber + 1,
389
+ columnNumber: columnNumber || 0,
390
+ callstack,
391
+ sourceContext,
392
+ }
393
+ }
394
+
395
+ /**
396
+ * Steps over to the next line of code, not entering function calls.
397
+ *
398
+ * @throws Error if debugger is not paused
399
+ *
400
+ * @example
401
+ * ```ts
402
+ * await dbg.stepOver()
403
+ * const newLocation = await dbg.getLocation()
404
+ * ```
405
+ */
406
+ async stepOver(): Promise<void> {
407
+ await this.enable()
408
+ if (!this.paused) {
409
+ throw new Error('Debugger is not paused')
410
+ }
411
+ await this.cdp.send('Debugger.stepOver')
412
+ }
413
+
414
+ /**
415
+ * Steps into a function call on the current line.
416
+ *
417
+ * @throws Error if debugger is not paused
418
+ *
419
+ * @example
420
+ * ```ts
421
+ * await dbg.stepInto()
422
+ * const location = await dbg.getLocation()
423
+ * // now inside the called function
424
+ * ```
425
+ */
426
+ async stepInto(): Promise<void> {
427
+ await this.enable()
428
+ if (!this.paused) {
429
+ throw new Error('Debugger is not paused')
430
+ }
431
+ await this.cdp.send('Debugger.stepInto')
432
+ }
433
+
434
+ /**
435
+ * Steps out of the current function, returning to the caller.
436
+ *
437
+ * @throws Error if debugger is not paused
438
+ *
439
+ * @example
440
+ * ```ts
441
+ * await dbg.stepOut()
442
+ * const location = await dbg.getLocation()
443
+ * // back in the calling function
444
+ * ```
445
+ */
446
+ async stepOut(): Promise<void> {
447
+ await this.enable()
448
+ if (!this.paused) {
449
+ throw new Error('Debugger is not paused')
450
+ }
451
+ await this.cdp.send('Debugger.stepOut')
452
+ }
453
+
454
+ /**
455
+ * Resumes code execution until the next breakpoint or completion.
456
+ *
457
+ * @throws Error if debugger is not paused
458
+ *
459
+ * @example
460
+ * ```ts
461
+ * await dbg.resume()
462
+ * // execution continues
463
+ * ```
464
+ */
465
+ async resume(): Promise<void> {
466
+ await this.enable()
467
+ if (!this.paused) {
468
+ throw new Error('Debugger is not paused')
469
+ }
470
+ await this.cdp.send('Debugger.resume')
471
+ }
472
+
473
+ /**
474
+ * Returns whether the debugger is currently paused at a breakpoint.
475
+ *
476
+ * @returns true if paused, false otherwise
477
+ *
478
+ * @example
479
+ * ```ts
480
+ * if (dbg.isPaused()) {
481
+ * const vars = await dbg.inspectLocalVariables()
482
+ * }
483
+ * ```
484
+ */
485
+ isPaused(): boolean {
486
+ return this.paused
487
+ }
488
+
489
+ /**
490
+ * Configures the debugger to pause on exceptions.
491
+ *
492
+ * @param options - Options
493
+ * @param options.state - When to pause: 'none' (never), 'uncaught' (only uncaught), or 'all' (all exceptions)
494
+ *
495
+ * @example
496
+ * ```ts
497
+ * // Pause only on uncaught exceptions
498
+ * await dbg.setPauseOnExceptions({ state: 'uncaught' })
499
+ *
500
+ * // Pause on all exceptions (caught and uncaught)
501
+ * await dbg.setPauseOnExceptions({ state: 'all' })
502
+ *
503
+ * // Disable pausing on exceptions
504
+ * await dbg.setPauseOnExceptions({ state: 'none' })
505
+ * ```
506
+ */
507
+ async setPauseOnExceptions({ state }: { state: 'none' | 'uncaught' | 'all' }): Promise<void> {
508
+ await this.enable()
509
+ await this.cdp.send('Debugger.setPauseOnExceptions', { state })
510
+ }
511
+
512
+ /**
513
+ * Lists available scripts where breakpoints can be set.
514
+ * Automatically enables the debugger if not already enabled.
515
+ *
516
+ * @param options - Options
517
+ * @param options.search - Optional string to filter scripts by URL (case-insensitive)
518
+ * @returns Array of up to 20 matching scripts with scriptId and url
519
+ *
520
+ * @example
521
+ * ```ts
522
+ * // List all scripts
523
+ * const scripts = await dbg.listScripts()
524
+ * // [{ scriptId: '1', url: 'https://example.com/app.js' }, ...]
525
+ *
526
+ * // Search for specific files
527
+ * const handlers = await dbg.listScripts({ search: 'handler' })
528
+ * // [{ scriptId: '5', url: 'https://example.com/handlers.js' }]
529
+ * ```
530
+ */
531
+ async listScripts({ search }: { search?: string } = {}): Promise<ScriptInfo[]> {
532
+ await this.enable()
533
+ const scripts = Array.from(this.scripts.values())
534
+ const filtered = search ? scripts.filter((s) => s.url.toLowerCase().includes(search.toLowerCase())) : scripts
535
+ return filtered.slice(0, 20)
536
+ }
537
+
538
+ async setXHRBreakpoint({ url }: { url: string }): Promise<void> {
539
+ await this.enable()
540
+ await this.cdp.send('DOMDebugger.setXHRBreakpoint', { url })
541
+ this.xhrBreakpoints.add(url)
542
+ }
543
+
544
+ async removeXHRBreakpoint({ url }: { url: string }): Promise<void> {
545
+ await this.enable()
546
+ await this.cdp.send('DOMDebugger.removeXHRBreakpoint', { url })
547
+ this.xhrBreakpoints.delete(url)
548
+ }
549
+
550
+ listXHRBreakpoints(): string[] {
551
+ return Array.from(this.xhrBreakpoints)
552
+ }
553
+
554
+ /**
555
+ * Sets regex patterns for scripts to blackbox (skip when stepping).
556
+ * Blackboxed scripts are hidden from the call stack and stepped over automatically.
557
+ * Useful for ignoring framework/library code during debugging.
558
+ *
559
+ * @param options - Options
560
+ * @param options.patterns - Array of regex patterns to match script URLs
561
+ *
562
+ * @example
563
+ * ```ts
564
+ * // Skip all node_modules
565
+ * await dbg.setBlackboxPatterns({ patterns: ['node_modules'] })
566
+ *
567
+ * // Skip React and other frameworks
568
+ * await dbg.setBlackboxPatterns({
569
+ * patterns: [
570
+ * 'node_modules/react',
571
+ * 'node_modules/react-dom',
572
+ * 'node_modules/next',
573
+ * 'webpack://',
574
+ * ]
575
+ * })
576
+ *
577
+ * // Skip all third-party scripts
578
+ * await dbg.setBlackboxPatterns({ patterns: ['^https://cdn\\.'] })
579
+ *
580
+ * // Clear all blackbox patterns
581
+ * await dbg.setBlackboxPatterns({ patterns: [] })
582
+ * ```
583
+ */
584
+ async setBlackboxPatterns({ patterns }: { patterns: string[] }): Promise<void> {
585
+ await this.enable()
586
+ this.blackboxPatterns = patterns
587
+ await this.cdp.send('Debugger.setBlackboxPatterns', { patterns })
588
+ }
589
+
590
+ /**
591
+ * Adds a single regex pattern to the blackbox list.
592
+ *
593
+ * @param options - Options
594
+ * @param options.pattern - Regex pattern to match script URLs
595
+ *
596
+ * @example
597
+ * ```ts
598
+ * await dbg.addBlackboxPattern({ pattern: 'node_modules/lodash' })
599
+ * await dbg.addBlackboxPattern({ pattern: 'node_modules/axios' })
600
+ * ```
601
+ */
602
+ async addBlackboxPattern({ pattern }: { pattern: string }): Promise<void> {
603
+ await this.enable()
604
+ if (!this.blackboxPatterns.includes(pattern)) {
605
+ this.blackboxPatterns.push(pattern)
606
+ await this.cdp.send('Debugger.setBlackboxPatterns', { patterns: this.blackboxPatterns })
607
+ }
608
+ }
609
+
610
+ /**
611
+ * Removes a pattern from the blackbox list.
612
+ *
613
+ * @param options - Options
614
+ * @param options.pattern - The exact pattern string to remove
615
+ */
616
+ async removeBlackboxPattern({ pattern }: { pattern: string }): Promise<void> {
617
+ await this.enable()
618
+ this.blackboxPatterns = this.blackboxPatterns.filter((p) => p !== pattern)
619
+ await this.cdp.send('Debugger.setBlackboxPatterns', { patterns: this.blackboxPatterns })
620
+ }
621
+
622
+ /**
623
+ * Returns the current list of blackbox patterns.
624
+ */
625
+ listBlackboxPatterns(): string[] {
626
+ return [...this.blackboxPatterns]
627
+ }
628
+
629
+ private truncateValue(value: unknown): unknown {
630
+ if (typeof value === 'string' && value.length > 1000) {
631
+ return value.slice(0, 1000) + `... (${value.length} chars)`
632
+ }
633
+ return value
634
+ }
635
+
636
+ private formatPropertyValue(value: Protocol.Runtime.RemoteObject): unknown {
637
+ if (value.type === 'object' && value.subtype !== 'null') {
638
+ return `[${value.subtype || value.type}]`
639
+ }
640
+ if (value.type === 'function') {
641
+ return '[function]'
642
+ }
643
+ if (value.value !== undefined) {
644
+ return this.truncateValue(value.value)
645
+ }
646
+ return `[${value.type}]`
647
+ }
648
+
649
+ private async processRemoteObject(obj: Protocol.Runtime.RemoteObject): Promise<unknown> {
650
+ if (obj.type === 'undefined') {
651
+ return undefined
652
+ }
653
+
654
+ if (obj.value !== undefined) {
655
+ return obj.value
656
+ }
657
+
658
+ if (obj.type === 'object' && obj.objectId) {
659
+ try {
660
+ const props = await this.cdp.send('Runtime.getProperties', {
661
+ objectId: obj.objectId,
662
+ ownProperties: true,
663
+ accessorPropertiesOnly: false,
664
+ generatePreview: true,
665
+ })
666
+
667
+ const result: Record<string, unknown> = {}
668
+ for (const prop of props.result) {
669
+ if (prop.value) {
670
+ if (prop.value.type === 'object' && prop.value.objectId && prop.value.subtype !== 'null') {
671
+ try {
672
+ const nestedProps = await this.cdp.send('Runtime.getProperties', {
673
+ objectId: prop.value.objectId,
674
+ ownProperties: true,
675
+ accessorPropertiesOnly: false,
676
+ generatePreview: true,
677
+ })
678
+ const nestedObj: Record<string, unknown> = {}
679
+ for (const nestedProp of nestedProps.result) {
680
+ if (nestedProp.value) {
681
+ nestedObj[nestedProp.name] =
682
+ nestedProp.value.value !== undefined
683
+ ? nestedProp.value.value
684
+ : nestedProp.value.description || `[${nestedProp.value.subtype || nestedProp.value.type}]`
685
+ }
686
+ }
687
+ result[prop.name] = nestedObj
688
+ } catch {
689
+ result[prop.name] = prop.value.description || `[${prop.value.subtype || prop.value.type}]`
690
+ }
691
+ } else if (prop.value.type === 'function') {
692
+ result[prop.name] = '[function]'
693
+ } else if (prop.value.value !== undefined) {
694
+ result[prop.name] = prop.value.value
695
+ } else {
696
+ result[prop.name] = `[${prop.value.type}]`
697
+ }
698
+ }
699
+ }
700
+ return result
701
+ } catch {
702
+ return obj.description || `[${obj.subtype || obj.type}]`
703
+ }
704
+ }
705
+
706
+ return obj.description || `[${obj.type}]`
707
+ }
708
+ }