tabwright 1.0.0 → 1.0.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 (562) hide show
  1. package/dist/aria-snapshot.d.ts +0 -1
  2. package/dist/aria-snapshot.js +9 -1
  3. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +0 -1
  4. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +0 -1
  5. package/dist/bippy.js +1 -1
  6. package/dist/browser-config.d.ts +0 -1
  7. package/dist/browser-config.js +0 -1
  8. package/dist/browser-install.d.ts +0 -1
  9. package/dist/browser-install.js +0 -1
  10. package/dist/browser-launch.d.ts +0 -1
  11. package/dist/browser-launch.js +0 -1
  12. package/dist/builtin-capabilities.d.ts +0 -1
  13. package/dist/builtin-capabilities.js +0 -1
  14. package/dist/capability-agent-skill.d.ts +0 -1
  15. package/dist/capability-agent-skill.js +0 -1
  16. package/dist/capability-auth-state.d.ts +0 -1
  17. package/dist/capability-auth-state.js +0 -1
  18. package/dist/capability-auth.d.ts +0 -1
  19. package/dist/capability-auth.js +0 -1
  20. package/dist/capability-options.d.ts +0 -1
  21. package/dist/capability-options.js +0 -1
  22. package/dist/capability-package.d.ts +0 -1
  23. package/dist/capability-package.js +0 -1
  24. package/dist/capability-registry.d.ts +0 -1
  25. package/dist/capability-registry.js +0 -1
  26. package/dist/capability-runner.d.ts +0 -1
  27. package/dist/capability-runner.js +0 -1
  28. package/dist/capability-studio.d.ts +0 -1
  29. package/dist/capability-studio.js +0 -1
  30. package/dist/cdp-log.d.ts +0 -1
  31. package/dist/cdp-log.js +0 -1
  32. package/dist/cdp-relay.d.ts +0 -1
  33. package/dist/cdp-relay.js +0 -1
  34. package/dist/cdp-session.d.ts +0 -1
  35. package/dist/cdp-session.js +0 -1
  36. package/dist/cdp-types.d.ts +0 -1
  37. package/dist/cdp-types.js +0 -1
  38. package/dist/chrome-discovery.d.ts +0 -1
  39. package/dist/chrome-discovery.js +0 -1
  40. package/dist/clean-html.d.ts +0 -1
  41. package/dist/clean-html.js +0 -1
  42. package/dist/cli.d.ts +0 -1
  43. package/dist/cli.js +9 -2
  44. package/dist/cloud-client.d.ts +0 -1
  45. package/dist/cloud-client.js +0 -1
  46. package/dist/create-logger.d.ts +0 -1
  47. package/dist/create-logger.js +0 -1
  48. package/dist/debugger-examples-types.d.ts +0 -1
  49. package/dist/debugger-examples-types.js +0 -1
  50. package/dist/debugger-examples.d.ts +0 -1
  51. package/dist/debugger-examples.js +0 -1
  52. package/dist/debugger.d.ts +0 -1
  53. package/dist/debugger.js +0 -1
  54. package/dist/diff-utils.d.ts +0 -1
  55. package/dist/diff-utils.js +0 -1
  56. package/dist/doctor.d.ts +0 -1
  57. package/dist/doctor.js +5 -7
  58. package/dist/editor-examples.d.ts +0 -1
  59. package/dist/editor-examples.js +0 -1
  60. package/dist/editor.d.ts +0 -1
  61. package/dist/editor.js +0 -1
  62. package/dist/env-compat.d.ts +0 -1
  63. package/dist/env-compat.js +0 -1
  64. package/dist/executor.d.ts +0 -1
  65. package/dist/executor.js +1 -2
  66. package/dist/extension/background.js +7 -3
  67. package/dist/extension/manifest.json +1 -1
  68. package/dist/ghost-browser.d.ts +0 -1
  69. package/dist/ghost-browser.js +0 -1
  70. package/dist/ghost-cursor-controller.d.ts +0 -1
  71. package/dist/ghost-cursor-controller.js +0 -1
  72. package/dist/ghost-cursor.d.ts +0 -1
  73. package/dist/ghost-cursor.js +0 -1
  74. package/dist/htmlrewrite.d.ts +0 -1
  75. package/dist/htmlrewrite.js +0 -1
  76. package/dist/index.d.ts +0 -1
  77. package/dist/index.js +0 -1
  78. package/dist/kill-port.d.ts +0 -1
  79. package/dist/kill-port.js +0 -1
  80. package/dist/kitty-graphics.d.ts +0 -1
  81. package/dist/kitty-graphics.js +0 -1
  82. package/dist/mcp.d.ts +0 -1
  83. package/dist/mcp.js +0 -1
  84. package/dist/package-paths.d.ts +0 -1
  85. package/dist/package-paths.js +0 -1
  86. package/dist/page-markdown.d.ts +0 -1
  87. package/dist/page-markdown.js +0 -1
  88. package/dist/performance-examples.d.ts +0 -1
  89. package/dist/performance-examples.js +0 -1
  90. package/dist/playwright-import.d.ts +0 -1
  91. package/dist/playwright-import.js +0 -1
  92. package/dist/product-paths.d.ts +0 -1
  93. package/dist/product-paths.js +0 -1
  94. package/dist/protocol.d.ts +0 -1
  95. package/dist/protocol.js +0 -1
  96. package/dist/react-source.d.ts +0 -1
  97. package/dist/react-source.js +0 -1
  98. package/dist/readability.js +1 -1
  99. package/dist/relay-client.d.ts +0 -1
  100. package/dist/relay-client.js +0 -1
  101. package/dist/relay-state.d.ts +0 -1
  102. package/dist/relay-state.js +0 -1
  103. package/dist/replay-ai-index.d.ts +0 -1
  104. package/dist/replay-ai-index.js +0 -1
  105. package/dist/replay-eval.d.ts +0 -1
  106. package/dist/replay-eval.js +0 -1
  107. package/dist/replay-handoff.d.ts +0 -1
  108. package/dist/replay-handoff.js +0 -1
  109. package/dist/replay-workflow-compiler.d.ts +0 -1
  110. package/dist/replay-workflow-compiler.js +0 -1
  111. package/dist/rrweb-recording-relay.d.ts +0 -1
  112. package/dist/rrweb-recording-relay.js +0 -1
  113. package/dist/rrweb-recording.d.ts +0 -1
  114. package/dist/rrweb-recording.js +0 -1
  115. package/dist/scoped-fs.d.ts +0 -1
  116. package/dist/scoped-fs.js +0 -1
  117. package/dist/selector-generator.js +1 -1
  118. package/dist/start-relay-server.d.ts +0 -1
  119. package/dist/start-relay-server.js +0 -1
  120. package/dist/styles-examples.d.ts +0 -1
  121. package/dist/styles-examples.js +0 -1
  122. package/dist/styles.d.ts +0 -1
  123. package/dist/styles.js +0 -1
  124. package/dist/tabwright-agent-skill.d.ts +0 -1
  125. package/dist/tabwright-agent-skill.js +0 -1
  126. package/dist/test-declarations.d.ts +0 -1
  127. package/dist/test-declarations.js +0 -1
  128. package/dist/utils.d.ts +0 -1
  129. package/dist/utils.js +2 -2
  130. package/dist/wait-for-page-load.d.ts +0 -1
  131. package/dist/wait-for-page-load.js +0 -1
  132. package/dist/workflow-capability.d.ts +0 -1
  133. package/dist/workflow-capability.js +0 -1
  134. package/package.json +9 -4
  135. package/readme.md +35 -0
  136. package/dist/aria-snapshot.d.ts.map +0 -1
  137. package/dist/aria-snapshot.js.map +0 -1
  138. package/dist/aria-snapshot.test.d.ts +0 -2
  139. package/dist/aria-snapshot.test.d.ts.map +0 -1
  140. package/dist/aria-snapshot.test.js +0 -270
  141. package/dist/aria-snapshot.test.js.map +0 -1
  142. package/dist/aria-snapshot.unit.test.d.ts +0 -2
  143. package/dist/aria-snapshot.unit.test.d.ts.map +0 -1
  144. package/dist/aria-snapshot.unit.test.js +0 -542
  145. package/dist/aria-snapshot.unit.test.js.map +0 -1
  146. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +0 -1
  147. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +0 -1
  148. package/dist/browser-config.d.ts.map +0 -1
  149. package/dist/browser-config.js.map +0 -1
  150. package/dist/browser-install.d.ts.map +0 -1
  151. package/dist/browser-install.js.map +0 -1
  152. package/dist/browser-launch.d.ts.map +0 -1
  153. package/dist/browser-launch.js.map +0 -1
  154. package/dist/builtin-capabilities.d.ts.map +0 -1
  155. package/dist/builtin-capabilities.js.map +0 -1
  156. package/dist/capability-agent-skill.d.ts.map +0 -1
  157. package/dist/capability-agent-skill.js.map +0 -1
  158. package/dist/capability-auth-state.d.ts.map +0 -1
  159. package/dist/capability-auth-state.js.map +0 -1
  160. package/dist/capability-auth.d.ts.map +0 -1
  161. package/dist/capability-auth.js.map +0 -1
  162. package/dist/capability-cli-confirmation.test.d.ts +0 -2
  163. package/dist/capability-cli-confirmation.test.d.ts.map +0 -1
  164. package/dist/capability-cli-confirmation.test.js +0 -79
  165. package/dist/capability-cli-confirmation.test.js.map +0 -1
  166. package/dist/capability-options.d.ts.map +0 -1
  167. package/dist/capability-options.js.map +0 -1
  168. package/dist/capability-options.test.d.ts +0 -2
  169. package/dist/capability-options.test.d.ts.map +0 -1
  170. package/dist/capability-options.test.js +0 -81
  171. package/dist/capability-options.test.js.map +0 -1
  172. package/dist/capability-package.d.ts.map +0 -1
  173. package/dist/capability-package.js.map +0 -1
  174. package/dist/capability-package.test.d.ts +0 -2
  175. package/dist/capability-package.test.d.ts.map +0 -1
  176. package/dist/capability-package.test.js +0 -179
  177. package/dist/capability-package.test.js.map +0 -1
  178. package/dist/capability-registry.d.ts.map +0 -1
  179. package/dist/capability-registry.js.map +0 -1
  180. package/dist/capability-registry.test.d.ts +0 -2
  181. package/dist/capability-registry.test.d.ts.map +0 -1
  182. package/dist/capability-registry.test.js +0 -1683
  183. package/dist/capability-registry.test.js.map +0 -1
  184. package/dist/capability-runner.d.ts.map +0 -1
  185. package/dist/capability-runner.js.map +0 -1
  186. package/dist/capability-search-relevance.test.d.ts +0 -2
  187. package/dist/capability-search-relevance.test.d.ts.map +0 -1
  188. package/dist/capability-search-relevance.test.js +0 -67
  189. package/dist/capability-search-relevance.test.js.map +0 -1
  190. package/dist/capability-studio.d.ts.map +0 -1
  191. package/dist/capability-studio.js.map +0 -1
  192. package/dist/capability-studio.test.d.ts +0 -2
  193. package/dist/capability-studio.test.d.ts.map +0 -1
  194. package/dist/capability-studio.test.js +0 -41
  195. package/dist/capability-studio.test.js.map +0 -1
  196. package/dist/cdp-log.d.ts.map +0 -1
  197. package/dist/cdp-log.js.map +0 -1
  198. package/dist/cdp-log.test.d.ts +0 -2
  199. package/dist/cdp-log.test.d.ts.map +0 -1
  200. package/dist/cdp-log.test.js +0 -109
  201. package/dist/cdp-log.test.js.map +0 -1
  202. package/dist/cdp-relay.d.ts.map +0 -1
  203. package/dist/cdp-relay.js.map +0 -1
  204. package/dist/cdp-session.d.ts.map +0 -1
  205. package/dist/cdp-session.js.map +0 -1
  206. package/dist/cdp-types.d.ts.map +0 -1
  207. package/dist/cdp-types.js.map +0 -1
  208. package/dist/channel-owner-inspect.test.d.ts +0 -2
  209. package/dist/channel-owner-inspect.test.d.ts.map +0 -1
  210. package/dist/channel-owner-inspect.test.js +0 -75
  211. package/dist/channel-owner-inspect.test.js.map +0 -1
  212. package/dist/chrome-discovery.d.ts.map +0 -1
  213. package/dist/chrome-discovery.js.map +0 -1
  214. package/dist/chrome-discovery.test.d.ts +0 -2
  215. package/dist/chrome-discovery.test.d.ts.map +0 -1
  216. package/dist/chrome-discovery.test.js +0 -41
  217. package/dist/chrome-discovery.test.js.map +0 -1
  218. package/dist/clean-html.d.ts.map +0 -1
  219. package/dist/clean-html.js.map +0 -1
  220. package/dist/cli-help.test.d.ts +0 -2
  221. package/dist/cli-help.test.d.ts.map +0 -1
  222. package/dist/cli-help.test.js +0 -98
  223. package/dist/cli-help.test.js.map +0 -1
  224. package/dist/cli.d.ts.map +0 -1
  225. package/dist/cli.js.map +0 -1
  226. package/dist/cloud-client.d.ts.map +0 -1
  227. package/dist/cloud-client.js.map +0 -1
  228. package/dist/create-logger.d.ts.map +0 -1
  229. package/dist/create-logger.js.map +0 -1
  230. package/dist/debugger-examples-types.d.ts.map +0 -1
  231. package/dist/debugger-examples-types.js.map +0 -1
  232. package/dist/debugger-examples.d.ts.map +0 -1
  233. package/dist/debugger-examples.js.map +0 -1
  234. package/dist/debugger.d.ts.map +0 -1
  235. package/dist/debugger.js.map +0 -1
  236. package/dist/diff-utils.d.ts.map +0 -1
  237. package/dist/diff-utils.js.map +0 -1
  238. package/dist/diff-utils.test.d.ts +0 -2
  239. package/dist/diff-utils.test.d.ts.map +0 -1
  240. package/dist/diff-utils.test.js +0 -137
  241. package/dist/diff-utils.test.js.map +0 -1
  242. package/dist/doctor.d.ts.map +0 -1
  243. package/dist/doctor.js.map +0 -1
  244. package/dist/doctor.test.d.ts +0 -2
  245. package/dist/doctor.test.d.ts.map +0 -1
  246. package/dist/doctor.test.js +0 -208
  247. package/dist/doctor.test.js.map +0 -1
  248. package/dist/editor-examples.d.ts.map +0 -1
  249. package/dist/editor-examples.js.map +0 -1
  250. package/dist/editor.d.ts.map +0 -1
  251. package/dist/editor.js.map +0 -1
  252. package/dist/env-compat.d.ts.map +0 -1
  253. package/dist/env-compat.js.map +0 -1
  254. package/dist/executor.d.ts.map +0 -1
  255. package/dist/executor.js.map +0 -1
  256. package/dist/executor.unit.test.d.ts +0 -2
  257. package/dist/executor.unit.test.d.ts.map +0 -1
  258. package/dist/executor.unit.test.js +0 -143
  259. package/dist/executor.unit.test.js.map +0 -1
  260. package/dist/extension-connection.test.d.ts +0 -2
  261. package/dist/extension-connection.test.d.ts.map +0 -1
  262. package/dist/extension-connection.test.js +0 -708
  263. package/dist/extension-connection.test.js.map +0 -1
  264. package/dist/extension-icon-warning.test.d.ts +0 -2
  265. package/dist/extension-icon-warning.test.d.ts.map +0 -1
  266. package/dist/extension-icon-warning.test.js +0 -33
  267. package/dist/extension-icon-warning.test.js.map +0 -1
  268. package/dist/ghost-browser.d.ts.map +0 -1
  269. package/dist/ghost-browser.js.map +0 -1
  270. package/dist/ghost-cursor-controller.d.ts.map +0 -1
  271. package/dist/ghost-cursor-controller.js.map +0 -1
  272. package/dist/ghost-cursor.d.ts.map +0 -1
  273. package/dist/ghost-cursor.js.map +0 -1
  274. package/dist/htmlrewrite.d.ts.map +0 -1
  275. package/dist/htmlrewrite.js.map +0 -1
  276. package/dist/htmlrewrite.test.d.ts +0 -2
  277. package/dist/htmlrewrite.test.d.ts.map +0 -1
  278. package/dist/htmlrewrite.test.js +0 -7975
  279. package/dist/htmlrewrite.test.js.map +0 -1
  280. package/dist/index.d.ts.map +0 -1
  281. package/dist/index.js.map +0 -1
  282. package/dist/kill-port.d.ts.map +0 -1
  283. package/dist/kill-port.js.map +0 -1
  284. package/dist/kitty-graphics.d.ts.map +0 -1
  285. package/dist/kitty-graphics.js.map +0 -1
  286. package/dist/kitty-graphics.test.d.ts +0 -2
  287. package/dist/kitty-graphics.test.d.ts.map +0 -1
  288. package/dist/kitty-graphics.test.js +0 -125
  289. package/dist/kitty-graphics.test.js.map +0 -1
  290. package/dist/locator-selector.test.d.ts +0 -2
  291. package/dist/locator-selector.test.d.ts.map +0 -1
  292. package/dist/locator-selector.test.js +0 -98
  293. package/dist/locator-selector.test.js.map +0 -1
  294. package/dist/mcp-client.d.ts +0 -20
  295. package/dist/mcp-client.d.ts.map +0 -1
  296. package/dist/mcp-client.js +0 -56
  297. package/dist/mcp-client.js.map +0 -1
  298. package/dist/mcp.d.ts.map +0 -1
  299. package/dist/mcp.js.map +0 -1
  300. package/dist/on-mouse-action.test.d.ts +0 -2
  301. package/dist/on-mouse-action.test.d.ts.map +0 -1
  302. package/dist/on-mouse-action.test.js +0 -180
  303. package/dist/on-mouse-action.test.js.map +0 -1
  304. package/dist/options-page.test.d.ts +0 -2
  305. package/dist/options-page.test.d.ts.map +0 -1
  306. package/dist/options-page.test.js +0 -773
  307. package/dist/options-page.test.js.map +0 -1
  308. package/dist/package-paths.d.ts.map +0 -1
  309. package/dist/package-paths.js.map +0 -1
  310. package/dist/page-markdown.d.ts.map +0 -1
  311. package/dist/page-markdown.js.map +0 -1
  312. package/dist/performance-examples.d.ts.map +0 -1
  313. package/dist/performance-examples.js.map +0 -1
  314. package/dist/playwright-import.d.ts.map +0 -1
  315. package/dist/playwright-import.js.map +0 -1
  316. package/dist/popup-relocation.test.d.ts +0 -7
  317. package/dist/popup-relocation.test.d.ts.map +0 -1
  318. package/dist/popup-relocation.test.js +0 -139
  319. package/dist/popup-relocation.test.js.map +0 -1
  320. package/dist/product-paths.d.ts.map +0 -1
  321. package/dist/product-paths.js.map +0 -1
  322. package/dist/product-paths.test.d.ts +0 -2
  323. package/dist/product-paths.test.d.ts.map +0 -1
  324. package/dist/product-paths.test.js +0 -39
  325. package/dist/product-paths.test.js.map +0 -1
  326. package/dist/protocol.d.ts.map +0 -1
  327. package/dist/protocol.js.map +0 -1
  328. package/dist/protocol.test.d.ts +0 -2
  329. package/dist/protocol.test.d.ts.map +0 -1
  330. package/dist/protocol.test.js +0 -31
  331. package/dist/protocol.test.js.map +0 -1
  332. package/dist/react-source.d.ts.map +0 -1
  333. package/dist/react-source.js.map +0 -1
  334. package/dist/relay-client.d.ts.map +0 -1
  335. package/dist/relay-client.js.map +0 -1
  336. package/dist/relay-client.test.d.ts +0 -2
  337. package/dist/relay-client.test.d.ts.map +0 -1
  338. package/dist/relay-client.test.js +0 -305
  339. package/dist/relay-client.test.js.map +0 -1
  340. package/dist/relay-core.test.d.ts +0 -2
  341. package/dist/relay-core.test.d.ts.map +0 -1
  342. package/dist/relay-core.test.js +0 -1427
  343. package/dist/relay-core.test.js.map +0 -1
  344. package/dist/relay-navigation.test.d.ts +0 -2
  345. package/dist/relay-navigation.test.d.ts.map +0 -1
  346. package/dist/relay-navigation.test.js +0 -661
  347. package/dist/relay-navigation.test.js.map +0 -1
  348. package/dist/relay-session.test.d.ts +0 -2
  349. package/dist/relay-session.test.d.ts.map +0 -1
  350. package/dist/relay-session.test.js +0 -1121
  351. package/dist/relay-session.test.js.map +0 -1
  352. package/dist/relay-state.d.ts.map +0 -1
  353. package/dist/relay-state.js.map +0 -1
  354. package/dist/relay-state.test.d.ts +0 -2
  355. package/dist/relay-state.test.d.ts.map +0 -1
  356. package/dist/relay-state.test.js +0 -594
  357. package/dist/relay-state.test.js.map +0 -1
  358. package/dist/replay-ai-index.d.ts.map +0 -1
  359. package/dist/replay-ai-index.js.map +0 -1
  360. package/dist/replay-ai-index.test.d.ts +0 -2
  361. package/dist/replay-ai-index.test.d.ts.map +0 -1
  362. package/dist/replay-ai-index.test.js +0 -255
  363. package/dist/replay-ai-index.test.js.map +0 -1
  364. package/dist/replay-cli.test.d.ts +0 -2
  365. package/dist/replay-cli.test.d.ts.map +0 -1
  366. package/dist/replay-cli.test.js +0 -275
  367. package/dist/replay-cli.test.js.map +0 -1
  368. package/dist/replay-eval.d.ts.map +0 -1
  369. package/dist/replay-eval.js.map +0 -1
  370. package/dist/replay-handoff.d.ts.map +0 -1
  371. package/dist/replay-handoff.js.map +0 -1
  372. package/dist/replay-handoff.test.d.ts +0 -2
  373. package/dist/replay-handoff.test.d.ts.map +0 -1
  374. package/dist/replay-handoff.test.js +0 -123
  375. package/dist/replay-handoff.test.js.map +0 -1
  376. package/dist/replay-workflow-compiler.d.ts.map +0 -1
  377. package/dist/replay-workflow-compiler.js.map +0 -1
  378. package/dist/replay-workflow-compiler.test.d.ts +0 -2
  379. package/dist/replay-workflow-compiler.test.d.ts.map +0 -1
  380. package/dist/replay-workflow-compiler.test.js +0 -223
  381. package/dist/replay-workflow-compiler.test.js.map +0 -1
  382. package/dist/rrweb-recording-relay.d.ts.map +0 -1
  383. package/dist/rrweb-recording-relay.js.map +0 -1
  384. package/dist/rrweb-recording-relay.test.d.ts +0 -2
  385. package/dist/rrweb-recording-relay.test.d.ts.map +0 -1
  386. package/dist/rrweb-recording-relay.test.js +0 -85
  387. package/dist/rrweb-recording-relay.test.js.map +0 -1
  388. package/dist/rrweb-recording.d.ts.map +0 -1
  389. package/dist/rrweb-recording.js.map +0 -1
  390. package/dist/scoped-fs.d.ts.map +0 -1
  391. package/dist/scoped-fs.js.map +0 -1
  392. package/dist/scoped-fs.test.d.ts +0 -5
  393. package/dist/scoped-fs.test.d.ts.map +0 -1
  394. package/dist/scoped-fs.test.js +0 -73
  395. package/dist/scoped-fs.test.js.map +0 -1
  396. package/dist/skill-stub.test.d.ts +0 -2
  397. package/dist/skill-stub.test.d.ts.map +0 -1
  398. package/dist/skill-stub.test.js +0 -22
  399. package/dist/skill-stub.test.js.map +0 -1
  400. package/dist/snapshot-tools.test.d.ts +0 -2
  401. package/dist/snapshot-tools.test.d.ts.map +0 -1
  402. package/dist/snapshot-tools.test.js +0 -856
  403. package/dist/snapshot-tools.test.js.map +0 -1
  404. package/dist/start-relay-server.d.ts.map +0 -1
  405. package/dist/start-relay-server.js.map +0 -1
  406. package/dist/styles-examples.d.ts.map +0 -1
  407. package/dist/styles-examples.js.map +0 -1
  408. package/dist/styles.d.ts.map +0 -1
  409. package/dist/styles.js.map +0 -1
  410. package/dist/tabwright-agent-skill.d.ts.map +0 -1
  411. package/dist/tabwright-agent-skill.js.map +0 -1
  412. package/dist/tabwright-agent-skill.test.d.ts +0 -2
  413. package/dist/tabwright-agent-skill.test.d.ts.map +0 -1
  414. package/dist/tabwright-agent-skill.test.js +0 -51
  415. package/dist/tabwright-agent-skill.test.js.map +0 -1
  416. package/dist/test-declarations.d.ts.map +0 -1
  417. package/dist/test-declarations.js.map +0 -1
  418. package/dist/test-utils.d.ts +0 -69
  419. package/dist/test-utils.d.ts.map +0 -1
  420. package/dist/test-utils.js +0 -448
  421. package/dist/test-utils.js.map +0 -1
  422. package/dist/test-utils.test.d.ts +0 -2
  423. package/dist/test-utils.test.d.ts.map +0 -1
  424. package/dist/test-utils.test.js +0 -55
  425. package/dist/test-utils.test.js.map +0 -1
  426. package/dist/utils.d.ts.map +0 -1
  427. package/dist/utils.js.map +0 -1
  428. package/dist/wait-for-page-load.d.ts.map +0 -1
  429. package/dist/wait-for-page-load.js.map +0 -1
  430. package/dist/workflow-capability.d.ts.map +0 -1
  431. package/dist/workflow-capability.js.map +0 -1
  432. package/dist/workflow-script-flow.test.d.ts +0 -2
  433. package/dist/workflow-script-flow.test.d.ts.map +0 -1
  434. package/dist/workflow-script-flow.test.js +0 -285
  435. package/dist/workflow-script-flow.test.js.map +0 -1
  436. package/src/__snapshots__/x.com.processed.html +0 -1003
  437. package/src/__snapshots__/x.com.processed.withStyles.html +0 -2720
  438. package/src/a11y-client.ts +0 -241
  439. package/src/aria-snapshot.test.ts +0 -311
  440. package/src/aria-snapshot.ts +0 -1681
  441. package/src/aria-snapshot.unit.test.ts +0 -615
  442. package/src/aria-snapshots/github-interactive.txt +0 -193
  443. package/src/aria-snapshots/github-raw.txt +0 -309
  444. package/src/aria-snapshots/hackernews-interactive.txt +0 -477
  445. package/src/aria-snapshots/hackernews-raw.txt +0 -428
  446. package/src/aria-snapshots/prosemirror-interactive.txt +0 -66
  447. package/src/aria-snapshots/prosemirror-raw.txt +0 -145
  448. package/src/assets/aria-labels-hacker-news.png +0 -0
  449. package/src/assets/aria-labels-old-reddit.png +0 -0
  450. package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +0 -5
  451. package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +0 -18
  452. package/src/assets/x.com.html +0 -32946
  453. package/src/browser-config.ts +0 -179
  454. package/src/browser-install.ts +0 -284
  455. package/src/browser-launch.ts +0 -75
  456. package/src/builtin-capabilities.ts +0 -2765
  457. package/src/capability-agent-skill.ts +0 -305
  458. package/src/capability-auth-state.ts +0 -197
  459. package/src/capability-auth.ts +0 -249
  460. package/src/capability-cli-confirmation.test.ts +0 -90
  461. package/src/capability-options.test.ts +0 -89
  462. package/src/capability-options.ts +0 -57
  463. package/src/capability-package.test.ts +0 -204
  464. package/src/capability-package.ts +0 -555
  465. package/src/capability-registry.test.ts +0 -1905
  466. package/src/capability-registry.ts +0 -1234
  467. package/src/capability-runner.ts +0 -801
  468. package/src/capability-search-relevance.test.ts +0 -73
  469. package/src/capability-studio.test.ts +0 -45
  470. package/src/capability-studio.ts +0 -641
  471. package/src/cdp-log.test.ts +0 -131
  472. package/src/cdp-log.ts +0 -112
  473. package/src/cdp-relay.ts +0 -2944
  474. package/src/cdp-session.ts +0 -77
  475. package/src/cdp-types.ts +0 -158
  476. package/src/channel-owner-inspect.test.ts +0 -94
  477. package/src/chrome-discovery.test.ts +0 -50
  478. package/src/chrome-discovery.ts +0 -220
  479. package/src/clean-html.ts +0 -141
  480. package/src/cli-help.test.ts +0 -123
  481. package/src/cli.ts +0 -3181
  482. package/src/cloud-client.ts +0 -179
  483. package/src/create-logger.ts +0 -38
  484. package/src/debugger-examples-types.ts +0 -16
  485. package/src/debugger-examples.ts +0 -66
  486. package/src/debugger.ts +0 -708
  487. package/src/diff-utils.test.ts +0 -152
  488. package/src/diff-utils.ts +0 -70
  489. package/src/doctor.test.ts +0 -244
  490. package/src/doctor.ts +0 -321
  491. package/src/editor-examples.ts +0 -158
  492. package/src/editor.ts +0 -426
  493. package/src/env-compat.ts +0 -28
  494. package/src/executor.ts +0 -1824
  495. package/src/executor.unit.test.ts +0 -168
  496. package/src/extension-connection.test.ts +0 -855
  497. package/src/extension-icon-warning.test.ts +0 -45
  498. package/src/ghost-browser.ts +0 -149
  499. package/src/ghost-cursor-client.ts +0 -494
  500. package/src/ghost-cursor-controller.ts +0 -129
  501. package/src/ghost-cursor.ts +0 -123
  502. package/src/htmlrewrite.test.ts +0 -8008
  503. package/src/htmlrewrite.ts +0 -390
  504. package/src/index.ts +0 -53
  505. package/src/kill-port.ts +0 -219
  506. package/src/kitty-graphics.test.ts +0 -139
  507. package/src/kitty-graphics.ts +0 -79
  508. package/src/locator-selector.test.ts +0 -119
  509. package/src/mcp-client.ts +0 -78
  510. package/src/mcp.ts +0 -629
  511. package/src/on-mouse-action.test.ts +0 -226
  512. package/src/options-page.test.ts +0 -839
  513. package/src/package-paths.ts +0 -38
  514. package/src/page-markdown.ts +0 -240
  515. package/src/performance-examples.ts +0 -186
  516. package/src/playwright-import.ts +0 -59
  517. package/src/popup-relocation.test.ts +0 -163
  518. package/src/product-paths.test.ts +0 -47
  519. package/src/product-paths.ts +0 -28
  520. package/src/protocol.test.ts +0 -52
  521. package/src/protocol.ts +0 -351
  522. package/src/react-source.ts +0 -379
  523. package/src/relay-client.test.ts +0 -375
  524. package/src/relay-client.ts +0 -572
  525. package/src/relay-core.test.ts +0 -1603
  526. package/src/relay-navigation.test.ts +0 -790
  527. package/src/relay-session.test.ts +0 -1375
  528. package/src/relay-state.test.ts +0 -729
  529. package/src/relay-state.ts +0 -561
  530. package/src/replay-ai-index.test.ts +0 -278
  531. package/src/replay-ai-index.ts +0 -872
  532. package/src/replay-cli.test.ts +0 -325
  533. package/src/replay-eval.ts +0 -1039
  534. package/src/replay-handoff.test.ts +0 -163
  535. package/src/replay-handoff.ts +0 -109
  536. package/src/replay-workflow-compiler.test.ts +0 -250
  537. package/src/replay-workflow-compiler.ts +0 -700
  538. package/src/resource.md +0 -409
  539. package/src/rrweb-recording-relay.test.ts +0 -99
  540. package/src/rrweb-recording-relay.ts +0 -400
  541. package/src/rrweb-recording.ts +0 -322
  542. package/src/scoped-fs.test.ts +0 -80
  543. package/src/scoped-fs.ts +0 -420
  544. package/src/skill-stub.test.ts +0 -24
  545. package/src/snapshot-tools.test.ts +0 -1017
  546. package/src/snapshots/hacker-news-accessibility-full.md +0 -81
  547. package/src/snapshots/hacker-news-accessibility-interactive.md +0 -43
  548. package/src/snapshots/page-markdown-output.txt +0 -16
  549. package/src/snapshots/shadcn-ui-accessibility-full.md +0 -201
  550. package/src/snapshots/shadcn-ui-accessibility-interactive.md +0 -109
  551. package/src/start-relay-server.ts +0 -69
  552. package/src/styles-examples.ts +0 -84
  553. package/src/styles.ts +0 -343
  554. package/src/tabwright-agent-skill.test.ts +0 -61
  555. package/src/tabwright-agent-skill.ts +0 -105
  556. package/src/test-declarations.ts +0 -13
  557. package/src/test-utils.test.ts +0 -70
  558. package/src/test-utils.ts +0 -566
  559. package/src/utils.ts +0 -78
  560. package/src/wait-for-page-load.ts +0 -198
  561. package/src/workflow-capability.ts +0 -417
  562. package/src/workflow-script-flow.test.ts +0 -388
@@ -1,179 +0,0 @@
1
- import fs from 'node:fs'
2
- import os from 'node:os'
3
- import path from 'node:path'
4
- import { chromium } from '@xmorse/playwright-core'
5
- import { findInstalledChrome } from './browser-install.js'
6
- // NOTE: browser-config uses chromium synchronously (executablePath) during browser start.
7
- // Patchright mode only affects connectOverCDP in executor.ts, not browser binary lookup.
8
-
9
- type BrowserLookupOptions = {
10
- browserPath?: string
11
- env?: NodeJS.ProcessEnv
12
- platform?: NodeJS.Platform
13
- homeDir?: string
14
- existsSync?: (filePath: string) => boolean
15
- }
16
-
17
- function expandHomeDirectory({ filePath, homeDir }: { filePath: string; homeDir: string }): string {
18
- if (!filePath.startsWith('~/')) {
19
- return filePath
20
- }
21
- return path.join(homeDir, filePath.slice(2))
22
- }
23
-
24
- function dedupePaths(pathsToCheck: string[]): string[] {
25
- return Array.from(new Set(pathsToCheck))
26
- }
27
-
28
- function getPlaywrightChromiumCandidate(): string[] {
29
- const executablePath = chromium.executablePath()
30
- if (!executablePath) {
31
- return []
32
- }
33
- return [executablePath]
34
- }
35
-
36
- function getPathEntries(env: NodeJS.ProcessEnv): string[] {
37
- const rawPath = env.PATH || env.Path || ''
38
- return rawPath
39
- .split(path.delimiter)
40
- .filter(Boolean)
41
- .map((entry) => {
42
- return entry.trim()
43
- })
44
- }
45
-
46
- function getExecutableNames(platform: NodeJS.Platform): string[] {
47
- if (platform === 'win32') {
48
- return ['chrome.exe', 'chromium.exe']
49
- }
50
- return ['chrome', 'chromium', 'chromium-browser']
51
- }
52
-
53
- function getPathExecutableCandidates({
54
- platform,
55
- env,
56
- }: {
57
- platform: NodeJS.Platform
58
- env: NodeJS.ProcessEnv
59
- }): string[] {
60
- const executableNames = getExecutableNames(platform)
61
- return getPathEntries(env).flatMap((entry) => {
62
- return executableNames.map((name) => {
63
- return path.join(entry, name)
64
- })
65
- })
66
- }
67
-
68
- export function getBrowserExecutableCandidates({
69
- platform = os.platform(),
70
- env = process.env,
71
- homeDir = os.homedir(),
72
- }: Omit<BrowserLookupOptions, 'browserPath' | 'existsSync'> = {}): string[] {
73
- const platformCandidates = (() => {
74
- if (platform === 'darwin') {
75
- return [
76
- '/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing',
77
- '~/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing',
78
- '/Applications/Chromium.app/Contents/MacOS/Chromium',
79
- '~/Applications/Chromium.app/Contents/MacOS/Chromium',
80
- ]
81
- }
82
-
83
- if (platform === 'win32') {
84
- const localAppData = env.LOCALAPPDATA || ''
85
- const programFiles = env.PROGRAMFILES || 'C:\\Program Files'
86
- const programFilesX86 = env['PROGRAMFILES(X86)'] || 'C:\\Program Files (x86)'
87
-
88
- return [
89
- path.join(programFiles, 'Google', 'Chrome for Testing', 'Application', 'chrome.exe'),
90
- path.join(programFilesX86, 'Google', 'Chrome for Testing', 'Application', 'chrome.exe'),
91
- path.join(localAppData, 'Google', 'Chrome for Testing', 'Application', 'chrome.exe'),
92
- path.join(programFiles, 'Chromium', 'Application', 'chromium.exe'),
93
- path.join(programFilesX86, 'Chromium', 'Application', 'chromium.exe'),
94
- path.join(localAppData, 'Chromium', 'Application', 'chromium.exe'),
95
- ]
96
- }
97
-
98
- return [
99
- '/opt/google/chrome-for-testing/chrome',
100
- '/usr/local/bin/chrome',
101
- '/usr/bin/chrome',
102
- '/usr/bin/chromium',
103
- '/usr/bin/chromium-browser',
104
- '/snap/bin/chromium',
105
- ]
106
- })()
107
-
108
- const pathCandidates = getPathExecutableCandidates({ platform, env })
109
- return dedupePaths(
110
- [...platformCandidates, ...pathCandidates, ...getPlaywrightChromiumCandidate()].map((filePath) => {
111
- return expandHomeDirectory({ filePath, homeDir })
112
- }),
113
- )
114
- }
115
-
116
- export function resolveBrowserExecutablePath({
117
- browserPath,
118
- env = process.env,
119
- platform = os.platform(),
120
- homeDir = os.homedir(),
121
- existsSync = fs.existsSync,
122
- }: BrowserLookupOptions = {}): string {
123
- const explicitPath = browserPath?.trim()
124
- if (explicitPath) {
125
- const resolvedExplicitPath = expandHomeDirectory({ filePath: explicitPath, homeDir })
126
- if (!existsSync(resolvedExplicitPath)) {
127
- throw new Error(`Browser binary not found at: ${resolvedExplicitPath}`)
128
- }
129
- return resolvedExplicitPath
130
- }
131
-
132
- const envPath = env.TABWRIGHT_BROWSER_PATH?.trim() || env.PLAYWRITER_BROWSER_PATH?.trim()
133
- if (envPath) {
134
- const resolvedEnvPath = expandHomeDirectory({ filePath: envPath, homeDir })
135
- if (!existsSync(resolvedEnvPath)) {
136
- throw new Error(`TABWRIGHT_BROWSER_PATH does not exist: ${resolvedEnvPath}`)
137
- }
138
- return resolvedEnvPath
139
- }
140
-
141
- // Check Chrome downloaded by `tabwright browser install` first (highest priority)
142
- const installedChrome = findInstalledChrome()
143
- if (installedChrome) {
144
- return installedChrome
145
- }
146
-
147
- const candidates = getBrowserExecutableCandidates({ platform, env, homeDir })
148
- const resolvedPath = candidates.find((candidate) => {
149
- return existsSync(candidate)
150
- })
151
-
152
- if (resolvedPath) {
153
- return resolvedPath
154
- }
155
-
156
- const searchedPathsText = candidates.map((candidate) => {
157
- return `- ${candidate}`
158
- })
159
-
160
- throw new Error(
161
- 'Could not find a supported browser binary. Run `tabwright browser install` to download Chrome for Testing, or pass a binary path.' +
162
- `\n\nSearched paths:\n- ~/.tabwright/browsers/ (tabwright browser install)\n${searchedPathsText.join('\n')}`,
163
- )
164
- }
165
-
166
- export function shouldUseHeadlessByDefault({
167
- platform = os.platform(),
168
- env = process.env,
169
- }: Omit<BrowserLookupOptions, 'browserPath' | 'homeDir' | 'existsSync'> = {}): boolean {
170
- if (platform !== 'linux') {
171
- return false
172
- }
173
-
174
- return !env.DISPLAY && !env.WAYLAND_DISPLAY
175
- }
176
-
177
- export function getBrowserExecutablePath(browserPath?: string): string {
178
- return resolveBrowserExecutablePath({ browserPath })
179
- }
@@ -1,284 +0,0 @@
1
- /**
2
- * Download and install Chrome for Testing into ~/.tabwright/browsers/.
3
- * Similar to agent-browser's install command: fetches the latest stable
4
- * Chrome for Testing build from Google's official automation channel.
5
- */
6
-
7
- import fs from 'node:fs'
8
- import os from 'node:os'
9
- import path from 'node:path'
10
- import { pipeline } from 'node:stream/promises'
11
- import { Readable } from 'node:stream'
12
- import { execFileSync } from 'node:child_process'
13
- import { getTabwrightUserDataDir } from './product-paths.js'
14
-
15
- const LAST_KNOWN_GOOD_URL =
16
- 'https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json'
17
-
18
- export function getBrowsersDir(): string {
19
- return path.join(getTabwrightUserDataDir(), 'browsers')
20
- }
21
-
22
- function getPlatformKey(): string {
23
- const platform = os.platform()
24
- const arch = os.arch()
25
- if (platform === 'darwin' && arch === 'arm64') {
26
- return 'mac-arm64'
27
- }
28
- if (platform === 'darwin' && arch === 'x64') {
29
- return 'mac-x64'
30
- }
31
- if (platform === 'linux' && arch === 'x64') {
32
- return 'linux64'
33
- }
34
- if (platform === 'win32' && arch === 'x64') {
35
- return 'win64'
36
- }
37
- throw new Error(
38
- `Unsupported platform for Chrome for Testing download: ${platform}/${arch}. ` +
39
- `Install Chromium manually and use TABWRIGHT_BROWSER_PATH to point to it.`,
40
- )
41
- }
42
-
43
- /**
44
- * Find the Chrome binary inside a downloaded Chrome for Testing directory.
45
- */
46
- function findChromeBinaryInDir(dir: string): string | null {
47
- const platform = os.platform()
48
-
49
- if (platform === 'darwin') {
50
- const candidates = [
51
- path.join(dir, 'Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing'),
52
- path.join(dir, `chrome-${getPlatformKey()}/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing`),
53
- ]
54
- for (const candidate of candidates) {
55
- if (fs.existsSync(candidate)) {
56
- return candidate
57
- }
58
- }
59
- }
60
-
61
- if (platform === 'linux') {
62
- const candidates = [
63
- path.join(dir, 'chrome'),
64
- path.join(dir, 'chrome-linux64/chrome'),
65
- ]
66
- for (const candidate of candidates) {
67
- if (fs.existsSync(candidate)) {
68
- return candidate
69
- }
70
- }
71
- }
72
-
73
- if (platform === 'win32') {
74
- const candidates = [
75
- path.join(dir, 'chrome.exe'),
76
- path.join(dir, 'chrome-win64/chrome.exe'),
77
- ]
78
- for (const candidate of candidates) {
79
- if (fs.existsSync(candidate)) {
80
- return candidate
81
- }
82
- }
83
- }
84
-
85
- return null
86
- }
87
-
88
- /**
89
- * Find Chrome installed by `tabwright browser install` in ~/.tabwright/browsers/.
90
- * Returns the path to the Chrome binary, or null if not found.
91
- */
92
- export function findInstalledChrome(): string | null {
93
- const browsersDir = getBrowsersDir()
94
- if (!fs.existsSync(browsersDir)) {
95
- return null
96
- }
97
-
98
- const entries = fs.readdirSync(browsersDir, { withFileTypes: true })
99
- .filter((e) => {
100
- return e.isDirectory() && e.name.startsWith('chrome-')
101
- })
102
- .sort((a, b) => {
103
- // Sort descending so newest version is first
104
- return b.name.localeCompare(a.name)
105
- })
106
-
107
- for (const entry of entries) {
108
- const dir = path.join(browsersDir, entry.name)
109
- const binary = findChromeBinaryInDir(dir)
110
- if (binary) {
111
- return binary
112
- }
113
- }
114
-
115
- return null
116
- }
117
-
118
- interface VersionInfo {
119
- version: string
120
- downloadUrl: string
121
- }
122
-
123
- async function fetchDownloadUrl(): Promise<VersionInfo> {
124
- const response = await fetch(LAST_KNOWN_GOOD_URL, {
125
- signal: AbortSignal.timeout(30000),
126
- })
127
- if (!response.ok) {
128
- throw new Error(`Failed to fetch Chrome version info: HTTP ${response.status}`)
129
- }
130
-
131
- const data = (await response.json()) as {
132
- channels: {
133
- Stable: {
134
- version: string
135
- downloads: {
136
- chrome: Array<{ platform: string; url: string }>
137
- }
138
- }
139
- }
140
- }
141
-
142
- const channel = data.channels?.Stable
143
- if (!channel) {
144
- throw new Error('No Stable channel found in Chrome for Testing version info')
145
- }
146
-
147
- const platformKey = getPlatformKey()
148
- const download = channel.downloads?.chrome?.find((d) => {
149
- return d.platform === platformKey
150
- })
151
- if (!download) {
152
- throw new Error(`No Chrome for Testing download found for platform: ${platformKey}`)
153
- }
154
-
155
- return { version: channel.version, downloadUrl: download.url }
156
- }
157
-
158
- async function downloadFile(url: string, destPath: string): Promise<void> {
159
- // 5-minute timeout per attempt, 3 retries for transient errors
160
- const maxAttempts = 3
161
- let lastError: Error | null = null
162
-
163
- for (let attempt = 1; attempt <= maxAttempts; attempt++) {
164
- try {
165
- await downloadFileAttempt(url, destPath)
166
- return
167
- } catch (error) {
168
- lastError = error instanceof Error ? error : new Error(String(error))
169
- // Don't retry on 4xx (permanent errors)
170
- if (lastError.message.includes('HTTP 4')) {
171
- throw lastError
172
- }
173
- if (attempt < maxAttempts) {
174
- const delay = attempt * 2000
175
- console.log(` Download attempt ${attempt} failed, retrying in ${delay / 1000}s...`)
176
- await new Promise((resolve) => {
177
- return setTimeout(resolve, delay)
178
- })
179
- }
180
- }
181
- }
182
- throw lastError!
183
- }
184
-
185
- async function downloadFileAttempt(url: string, destPath: string): Promise<void> {
186
- const response = await fetch(url, {
187
- signal: AbortSignal.timeout(300_000), // 5 minute timeout
188
- })
189
- if (!response.ok) {
190
- throw new Error(`Download failed: HTTP ${response.status} for ${url}`)
191
- }
192
- if (!response.body) {
193
- throw new Error('Download failed: no response body')
194
- }
195
-
196
- const totalBytes = Number(response.headers.get('content-length') || 0)
197
- let downloadedBytes = 0
198
- let lastPct = 0
199
-
200
- const progressStream = new TransformStream({
201
- transform(chunk, controller) {
202
- downloadedBytes += chunk.byteLength
203
- if (totalBytes > 0) {
204
- const pct = Math.floor((downloadedBytes / totalBytes) * 100)
205
- if (pct >= lastPct + 5) {
206
- lastPct = pct
207
- const mb = (downloadedBytes / 1_048_576).toFixed(0)
208
- const totalMb = (totalBytes / 1_048_576).toFixed(0)
209
- process.stderr.write(`\r ${mb}/${totalMb} MB (${pct}%)`)
210
- }
211
- }
212
- controller.enqueue(chunk)
213
- },
214
- })
215
-
216
- const readableStream = response.body.pipeThrough(progressStream)
217
- const nodeReadable = Readable.fromWeb(readableStream as any)
218
- const writeStream = fs.createWriteStream(destPath)
219
- await pipeline(nodeReadable, writeStream)
220
- process.stderr.write('\n')
221
- }
222
-
223
- function extractZip(zipPath: string, destDir: string): void {
224
- fs.mkdirSync(destDir, { recursive: true })
225
- const platform = os.platform()
226
-
227
- if (platform === 'win32') {
228
- execFileSync('powershell', [
229
- '-Command',
230
- `Expand-Archive -Path '${zipPath}' -DestinationPath '${destDir}' -Force`,
231
- ], { stdio: 'pipe' })
232
- } else {
233
- execFileSync('unzip', ['-o', '-q', zipPath, '-d', destDir], { stdio: 'pipe' })
234
- }
235
- }
236
-
237
- export async function installChrome(): Promise<{ version: string; binaryPath: string }> {
238
- console.log('Fetching latest Chrome for Testing version...')
239
- const { version, downloadUrl } = await fetchDownloadUrl()
240
-
241
- const browsersDir = getBrowsersDir()
242
- const destDir = path.join(browsersDir, `chrome-${version}`)
243
-
244
- // Check if already installed
245
- const existingBinary = findChromeBinaryInDir(destDir)
246
- if (existingBinary) {
247
- console.log(`Chrome ${version} is already installed.`)
248
- console.log(` Location: ${existingBinary}`)
249
- return { version, binaryPath: existingBinary }
250
- }
251
-
252
- console.log(`Downloading Chrome ${version} for ${getPlatformKey()}...`)
253
- console.log(` ${downloadUrl}`)
254
-
255
- const tmpZip = path.join(os.tmpdir(), `tabwright-chrome-${version}.zip`)
256
- try {
257
- await downloadFile(downloadUrl, tmpZip)
258
- console.log('Extracting...')
259
- extractZip(tmpZip, destDir)
260
- } finally {
261
- // Clean up temp zip
262
- try {
263
- fs.unlinkSync(tmpZip)
264
- } catch {
265
- // ignore cleanup errors
266
- }
267
- }
268
-
269
- const binaryPath = findChromeBinaryInDir(destDir)
270
- if (!binaryPath) {
271
- // Clean up failed extraction
272
- fs.rmSync(destDir, { recursive: true, force: true })
273
- throw new Error('Chrome was downloaded but the binary could not be found in the extracted archive.')
274
- }
275
-
276
- // Ensure binary is executable on Unix
277
- if (os.platform() !== 'win32') {
278
- fs.chmodSync(binaryPath, 0o755)
279
- }
280
-
281
- console.log(`Chrome ${version} installed successfully.`)
282
- console.log(` Location: ${binaryPath}`)
283
- return { version, binaryPath }
284
- }
@@ -1,75 +0,0 @@
1
- import fs from 'node:fs'
2
- import path from 'node:path'
3
- import { spawn } from 'node:child_process'
4
- import { EXTENSION_IDS } from './utils.js'
5
- import { getTabwrightUserDataDir } from './product-paths.js'
6
-
7
- export type BrowserLaunchOptions = {
8
- extensionPath: string
9
- userDataDir: string
10
- headless: boolean
11
- noSandbox?: boolean
12
- url?: string
13
- }
14
-
15
- export function getDefaultBrowserUserDataDir(): string {
16
- return path.join(getTabwrightUserDataDir(), 'browser-profile')
17
- }
18
-
19
- export function getBrowserLaunchArgs({
20
- extensionPath,
21
- userDataDir,
22
- headless,
23
- noSandbox = false,
24
- url = 'about:blank',
25
- }: BrowserLaunchOptions): string[] {
26
- const recordingFlags = EXTENSION_IDS.map((extensionId) => {
27
- return `--allowlisted-extension-id=${extensionId}`
28
- })
29
-
30
- const args = [
31
- `--user-data-dir=${path.resolve(userDataDir)}`,
32
- '--profile-directory=Default',
33
- '--no-first-run',
34
- '--no-default-browser-check',
35
- '--auto-accept-this-tab-capture',
36
- ...recordingFlags,
37
- `--disable-extensions-except=${path.resolve(extensionPath)}`,
38
- `--load-extension=${path.resolve(extensionPath)}`,
39
- ]
40
-
41
- if (headless) {
42
- args.push('--headless=new')
43
- }
44
-
45
- if (noSandbox) {
46
- args.push('--no-sandbox', '--disable-setuid-sandbox')
47
- }
48
-
49
- args.push(url)
50
- return args
51
- }
52
-
53
- export function startBrowserProcess({
54
- browserPath,
55
- args,
56
- userDataDir,
57
- }: {
58
- browserPath: string
59
- args: string[]
60
- userDataDir: string
61
- }): { pid: number } {
62
- fs.mkdirSync(path.resolve(userDataDir), { recursive: true })
63
-
64
- const browserProcess = spawn(browserPath, args, {
65
- detached: true,
66
- stdio: 'ignore',
67
- })
68
- browserProcess.unref()
69
-
70
- if (!browserProcess.pid) {
71
- throw new Error(`Failed to start browser process for ${browserPath}`)
72
- }
73
-
74
- return { pid: browserProcess.pid }
75
- }