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,38 +0,0 @@
1
- import fs from 'node:fs'
2
- import path from 'node:path'
3
- import { fileURLToPath } from 'node:url'
4
- import { createRequire } from 'node:module'
5
-
6
- const require = createRequire(import.meta.url)
7
-
8
- export function getInstalledTabwrightPackageDir(): string {
9
- const localPackageDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
10
- const localPackageJsonPath = path.join(localPackageDir, 'package.json')
11
- if (fs.existsSync(localPackageJsonPath)) {
12
- return localPackageDir
13
- }
14
-
15
- const packageJsonPath = require.resolve('tabwright/package.json')
16
- return path.dirname(packageJsonPath)
17
- }
18
-
19
- export function getBundledExtensionPath(): string {
20
- const packageDir = getInstalledTabwrightPackageDir()
21
- const candidates = [
22
- path.join(packageDir, 'dist', 'extension'),
23
- path.join(packageDir, '..', 'extension', 'dist'),
24
- ]
25
-
26
- for (const extensionPath of candidates) {
27
- const manifestPath = path.join(extensionPath, 'manifest.json')
28
- if (fs.existsSync(manifestPath)) {
29
- return extensionPath
30
- }
31
- }
32
-
33
- throw new Error(
34
- `Bundled Tabwright extension not found under ${packageDir}. Rebuild or reinstall the tabwright package.`,
35
- )
36
- }
37
-
38
- export const getInstalledPlaywriterPackageDir = getInstalledTabwrightPackageDir
@@ -1,240 +0,0 @@
1
- /**
2
- * Extract page content as markdown using Mozilla Readability.
3
- *
4
- * This utility injects the Readability library into the page and extracts
5
- * the main content, similar to Firefox Reader View.
6
- */
7
-
8
- import fs from 'node:fs'
9
- import path from 'node:path'
10
- import { fileURLToPath } from 'node:url'
11
- import type { Page } from '@xmorse/playwright-core'
12
- import { createSmartDiff } from './diff-utils.js'
13
-
14
- export interface PageMarkdownResult {
15
- /** Extracted content as plain text (HTML tags stripped) */
16
- content: string
17
- /** Article title */
18
- title: string | null
19
- /** Article author/byline */
20
- author: string | null
21
- /** Article excerpt/description */
22
- excerpt: string | null
23
- /** Site name */
24
- siteName: string | null
25
- /** Content language */
26
- lang: string | null
27
- /** Published time */
28
- publishedTime: string | null
29
- /** Word count */
30
- wordCount: number
31
- }
32
-
33
- export interface GetPageMarkdownOptions {
34
- page: Page
35
- /** String or regex to filter content (returns matching lines with context) */
36
- search?: string | RegExp
37
- /** Return diff since last call for this page */
38
- showDiffSinceLastCall?: boolean
39
- }
40
-
41
- // Cache for the bundled readability code
42
- let readabilityCode: string | null = null
43
-
44
- function getReadabilityCode(): string {
45
- if (readabilityCode) {
46
- return readabilityCode
47
- }
48
- const currentDir = path.dirname(fileURLToPath(import.meta.url))
49
- const readabilityPath = path.join(currentDir, '..', 'dist', 'readability.js')
50
- readabilityCode = fs.readFileSync(readabilityPath, 'utf-8')
51
- return readabilityCode
52
- }
53
-
54
- // Store last snapshots per page for diffing
55
- const lastMarkdownSnapshots: WeakMap<Page, string> = new WeakMap()
56
-
57
- function isRegExp(value: unknown): value is RegExp {
58
- return (
59
- typeof value === 'object' &&
60
- value !== null &&
61
- typeof (value as RegExp).test === 'function' &&
62
- typeof (value as RegExp).exec === 'function'
63
- )
64
- }
65
-
66
- /**
67
- * Extract page content as markdown using Mozilla Readability.
68
- *
69
- * Injects Readability into the page if not already present, then extracts
70
- * the main content. Returns plain text content (no HTML).
71
- */
72
- export async function getPageMarkdown(options: GetPageMarkdownOptions): Promise<string> {
73
- const { page, search, showDiffSinceLastCall = !search } = options
74
-
75
- // Check if readability is already injected
76
- const hasReadability = await page.evaluate(() => !!(globalThis as any).__readability)
77
-
78
- if (!hasReadability) {
79
- const code = getReadabilityCode()
80
- await page.evaluate(code)
81
- }
82
-
83
- // Extract content using Readability
84
- const result = (await page.evaluate(() => {
85
- const readability = (globalThis as any).__readability
86
- if (!readability) {
87
- throw new Error('Readability not loaded')
88
- }
89
-
90
- // Clone document to avoid modifying the original
91
- const documentClone = document.cloneNode(true)
92
-
93
- // Check if page is probably readable
94
- if (!readability.isProbablyReaderable(documentClone)) {
95
- return {
96
- content: document.body?.innerText || '',
97
- title: document.title || null,
98
- author: null,
99
- excerpt: null,
100
- siteName: null,
101
- lang: document.documentElement?.lang || null,
102
- publishedTime: null,
103
- wordCount: (document.body?.innerText || '').split(/\s+/).filter(Boolean).length,
104
- _notReadable: true,
105
- }
106
- }
107
-
108
- const article = new readability.Readability(documentClone).parse()
109
-
110
- if (!article) {
111
- return {
112
- content: document.body?.innerText || '',
113
- title: document.title || null,
114
- author: null,
115
- excerpt: null,
116
- siteName: null,
117
- lang: document.documentElement?.lang || null,
118
- publishedTime: null,
119
- wordCount: (document.body?.innerText || '').split(/\s+/).filter(Boolean).length,
120
- _notReadable: true,
121
- }
122
- }
123
-
124
- return {
125
- content: article.textContent || '',
126
- title: article.title || null,
127
- author: article.byline || null,
128
- excerpt: article.excerpt || null,
129
- siteName: article.siteName || null,
130
- lang: article.lang || null,
131
- publishedTime: article.publishedTime || null,
132
- wordCount: (article.textContent || '').split(/\s+/).filter(Boolean).length,
133
- }
134
- })) as PageMarkdownResult & { _notReadable?: boolean }
135
-
136
- // Format output
137
- const lines: string[] = []
138
-
139
- if (result.title) {
140
- lines.push(`# ${result.title}`)
141
- lines.push('')
142
- }
143
-
144
- const metadata: string[] = []
145
- if (result.author) {
146
- metadata.push(`Author: ${result.author}`)
147
- }
148
- if (result.siteName) {
149
- metadata.push(`Site: ${result.siteName}`)
150
- }
151
- if (result.publishedTime) {
152
- metadata.push(`Published: ${result.publishedTime}`)
153
- }
154
- if (metadata.length > 0) {
155
- lines.push(metadata.join(' | '))
156
- lines.push('')
157
- }
158
-
159
- if (result.excerpt && result.excerpt !== result.content.slice(0, result.excerpt.length)) {
160
- lines.push(`> ${result.excerpt}`)
161
- lines.push('')
162
- }
163
-
164
- lines.push(result.content)
165
-
166
- let markdown = lines.join('\n').trim()
167
-
168
- // Sanitize to remove unpaired surrogates that break JSON encoding
169
- markdown = markdown.toWellFormed?.() ?? markdown
170
-
171
- // Store snapshot and handle diffing
172
- const previousSnapshot = lastMarkdownSnapshots.get(page)
173
- lastMarkdownSnapshots.set(page, markdown)
174
-
175
- // Diff defaults off when search is provided, but agent can explicitly enable both
176
- if (showDiffSinceLastCall && previousSnapshot) {
177
- const diffResult = createSmartDiff({
178
- oldContent: previousSnapshot,
179
- newContent: markdown,
180
- label: 'content',
181
- })
182
- if (diffResult.type === 'no-change') {
183
- return 'No changes since last call. Use showDiffSinceLastCall: false to see full content.'
184
- }
185
- return diffResult.content
186
- }
187
-
188
- // Handle search
189
- if (search) {
190
- const contentLines = markdown.split('\n')
191
- const matchIndices: number[] = []
192
-
193
- for (let i = 0; i < contentLines.length; i++) {
194
- const line = contentLines[i]
195
- let isMatch = false
196
- if (isRegExp(search)) {
197
- isMatch = search.test(line)
198
- } else {
199
- isMatch = line.toLowerCase().includes(search.toLowerCase())
200
- }
201
-
202
- if (isMatch) {
203
- matchIndices.push(i)
204
- if (matchIndices.length >= 10) {
205
- break
206
- }
207
- }
208
- }
209
-
210
- if (matchIndices.length === 0) {
211
- return 'No matches found'
212
- }
213
-
214
- // Collect lines with 5 lines of context above and below each match
215
- const CONTEXT_LINES = 5
216
- const includedLines = new Set<number>()
217
- for (const idx of matchIndices) {
218
- const start = Math.max(0, idx - CONTEXT_LINES)
219
- const end = Math.min(contentLines.length - 1, idx + CONTEXT_LINES)
220
- for (let i = start; i <= end; i++) {
221
- includedLines.add(i)
222
- }
223
- }
224
-
225
- // Build result with separators between non-contiguous sections
226
- const sortedIndices = [...includedLines].sort((a, b) => a - b)
227
- const resultLines: string[] = []
228
- for (let i = 0; i < sortedIndices.length; i++) {
229
- const lineIdx = sortedIndices[i]
230
- if (i > 0 && sortedIndices[i - 1] !== lineIdx - 1) {
231
- resultLines.push('---')
232
- }
233
- resultLines.push(contentLines[lineIdx])
234
- }
235
-
236
- return resultLines.join('\n')
237
- }
238
-
239
- return markdown
240
- }
@@ -1,186 +0,0 @@
1
- // Example snippets for profiling website performance with Tabwright and CDP.
2
-
3
- import { console, getCDPSession, page } from './debugger-examples-types.js'
4
-
5
- type PerfMetrics = {
6
- paints: Record<string, number>
7
- lcp: number
8
- cls: number
9
- }
10
-
11
- type ObservedPerfEntry = {
12
- name: string
13
- startTime: number
14
- duration: number
15
- hadRecentInput?: boolean
16
- value?: number
17
- interactionId?: number
18
- }
19
-
20
- type NavigationTimingEntry = {
21
- responseStart: number
22
- domContentLoadedEventEnd: number
23
- loadEventEnd: number
24
- }
25
-
26
- type LongTaskEntry = {
27
- startTime: number
28
- duration: number
29
- }
30
-
31
- type EventTimingEntry = {
32
- name: string
33
- duration: number
34
- interactionId: number
35
- }
36
-
37
- // Example: Collect navigation timing and basic web vitals from the current page
38
- async function collectWebVitals() {
39
- await page.evaluate(() => {
40
- const metrics: PerfMetrics = {
41
- paints: {},
42
- lcp: 0,
43
- cls: 0,
44
- }
45
-
46
- const perfGlobal = globalThis as typeof globalThis & {
47
- __pwPerfMetrics?: PerfMetrics
48
- }
49
-
50
- perfGlobal.__pwPerfMetrics = metrics
51
-
52
- new PerformanceObserver((list) => {
53
- for (const entry of list.getEntries() as ObservedPerfEntry[]) {
54
- metrics.paints[entry.name] = entry.startTime
55
- }
56
- }).observe({ type: 'paint', buffered: true } as never)
57
-
58
- new PerformanceObserver((list) => {
59
- const entries = list.getEntries() as ObservedPerfEntry[]
60
- const lastEntry = entries[entries.length - 1]
61
- if (!lastEntry) {
62
- return
63
- }
64
- metrics.lcp = lastEntry.startTime
65
- }).observe({ type: 'largest-contentful-paint', buffered: true } as never)
66
-
67
- new PerformanceObserver((list) => {
68
- for (const entry of list.getEntries() as ObservedPerfEntry[]) {
69
- if (entry.hadRecentInput) {
70
- continue
71
- }
72
- metrics.cls += entry.value || 0
73
- }
74
- }).observe({ type: 'layout-shift', buffered: true } as never)
75
- })
76
-
77
- await page.reload({ waitUntil: 'domcontentloaded' })
78
-
79
- const report = await page.evaluate(() => {
80
- const perfGlobal = globalThis as typeof globalThis & {
81
- __pwPerfMetrics?: PerfMetrics
82
- }
83
- const nav = performance.getEntriesByType('navigation' as never)[0] as unknown as
84
- | NavigationTimingEntry
85
- | undefined
86
- const metrics = perfGlobal.__pwPerfMetrics
87
-
88
- return {
89
- ttfb: nav?.responseStart || 0,
90
- domContentLoaded: nav?.domContentLoadedEventEnd || 0,
91
- load: nav?.loadEventEnd || 0,
92
- fcp: metrics?.paints['first-contentful-paint'] || 0,
93
- lcp: metrics?.lcp || 0,
94
- cls: metrics?.cls || 0,
95
- }
96
- })
97
-
98
- console.log(report)
99
- }
100
-
101
- // Example: Measure the biggest transferred requests with raw CDP network events
102
- async function collectHeaviestRequests() {
103
- const cdp = await getCDPSession({ page })
104
- await cdp.send('Network.enable')
105
- await cdp.send('Network.setCacheDisabled', { cacheDisabled: true })
106
-
107
- const responses = new Map<string, { url: string; mimeType: string }>()
108
- const finished = new Map<string, number>()
109
-
110
- cdp.on('Network.responseReceived', (event) => {
111
- responses.set(event.requestId, {
112
- url: event.response.url,
113
- mimeType: event.response.mimeType,
114
- })
115
- })
116
-
117
- cdp.on('Network.loadingFinished', (event) => {
118
- finished.set(event.requestId, event.encodedDataLength)
119
- })
120
-
121
- await page.reload({ waitUntil: 'domcontentloaded' })
122
-
123
- const largest = [...responses.entries()]
124
- .map(([requestId, response]) => {
125
- return {
126
- url: response.url,
127
- mimeType: response.mimeType,
128
- bytes: finished.get(requestId) || 0,
129
- }
130
- })
131
- .sort((a, b) => b.bytes - a.bytes)
132
- .slice(0, 10)
133
-
134
- console.log(largest)
135
- }
136
-
137
- // Example: Check whether interactivity is blocked by long tasks or slow events
138
- async function measureInteractivity() {
139
- await page.evaluate(() => {
140
- const perfGlobal = globalThis as typeof globalThis & {
141
- __pwLongTasks?: LongTaskEntry[]
142
- __pwEventTimings?: EventTimingEntry[]
143
- }
144
-
145
- perfGlobal.__pwLongTasks = []
146
- perfGlobal.__pwEventTimings = []
147
-
148
- new PerformanceObserver((list) => {
149
- perfGlobal.__pwLongTasks?.push(
150
- ...(list.getEntries() as ObservedPerfEntry[]).map((entry) => ({
151
- startTime: entry.startTime,
152
- duration: entry.duration,
153
- })),
154
- )
155
- }).observe({ type: 'longtask', buffered: true } as never)
156
-
157
- new PerformanceObserver((list) => {
158
- perfGlobal.__pwEventTimings?.push(
159
- ...(list.getEntries() as ObservedPerfEntry[]).map((entry) => ({
160
- name: entry.name,
161
- duration: entry.duration,
162
- interactionId: entry.interactionId || 0,
163
- })),
164
- )
165
- }).observe({ type: 'event', buffered: true, durationThreshold: 16 } as never)
166
- })
167
-
168
- const button = page.getByRole('button').first()
169
- await button.click()
170
-
171
- const report = await page.evaluate(() => {
172
- const perfGlobal = globalThis as typeof globalThis & {
173
- __pwLongTasks?: LongTaskEntry[]
174
- __pwEventTimings?: EventTimingEntry[]
175
- }
176
-
177
- return {
178
- longTasks: (perfGlobal.__pwLongTasks || []).filter((entry) => entry.duration >= 50),
179
- events: (perfGlobal.__pwEventTimings || []).filter((entry) => entry.interactionId !== 0),
180
- }
181
- })
182
-
183
- console.log(report)
184
- }
185
-
186
- export { collectWebVitals, collectHeaviestRequests, measureInteractivity }
@@ -1,59 +0,0 @@
1
- /**
2
- * Conditional playwright-core import. When patchright mode is enabled via
3
- * TABWRIGHT_PATCHRIGHT=1 env var, imports from @playwriter/patchright-core
4
- * instead of @xmorse/playwright-core. Both packages expose identical APIs.
5
- *
6
- * Type imports continue to use @xmorse/playwright-core directly (types are
7
- * the same in both packages) so TypeScript resolution works without the
8
- * optional patchright dep being installed.
9
- */
10
-
11
- export type {
12
- Page,
13
- Frame,
14
- Browser,
15
- BrowserContext,
16
- Locator,
17
- FrameLocator,
18
- ElementHandle,
19
- CDPSession,
20
- MouseActionEvent,
21
- } from '@xmorse/playwright-core'
22
-
23
- export type { BrowserType } from '@xmorse/playwright-core'
24
-
25
- type Chromium = typeof import('@xmorse/playwright-core').chromium
26
-
27
- let _chromium: Chromium | undefined
28
-
29
- /**
30
- * Returns the chromium BrowserType, loading from patchright-core if enabled.
31
- * Caches after first call.
32
- */
33
- export async function getChromium(): Promise<Chromium> {
34
- if (_chromium) {
35
- return _chromium
36
- }
37
- if (isPatchrightEnabled()) {
38
- try {
39
- // Dynamic import — @playwriter/patchright-core is an optional dependency.
40
- // Types come from @xmorse/playwright-core (identical API surface).
41
- const mod: { chromium: Chromium } = await import('@playwriter/patchright-core' as string)
42
- _chromium = mod.chromium
43
- } catch (e: unknown) {
44
- throw new Error(
45
- '@playwriter/patchright-core is not installed. Install it with: pnpm add @playwriter/patchright-core',
46
- { cause: e },
47
- )
48
- }
49
- } else {
50
- const mod = await import('@xmorse/playwright-core')
51
- _chromium = mod.chromium
52
- }
53
- return _chromium!
54
- }
55
-
56
- export function isPatchrightEnabled(): boolean {
57
- const value = process.env.TABWRIGHT_PATCHRIGHT || process.env.PLAYWRITER_PATCHRIGHT
58
- return value === '1' || value === 'true'
59
- }
@@ -1,163 +0,0 @@
1
- /**
2
- * Tests for auto-relocation of popup windows to tabs.
3
- * - Connected source tab → popup gets relocated + auto-attached.
4
- * - No source tab connected → popup is left alone.
5
- */
6
-
7
- import { createMCPClient } from './mcp-client.js'
8
- import { describe, it, expect, beforeAll, afterAll } from 'vitest'
9
- import {
10
- setupTestContext,
11
- cleanupTestContext,
12
- getExtensionServiceWorker,
13
- createSimpleServer,
14
- type TestContext,
15
- type SimpleServer,
16
- js,
17
- } from './test-utils.js'
18
- import './test-declarations.js'
19
-
20
- const TEST_PORT = 19995
21
-
22
- describe('Popup window relocation', () => {
23
- let client: Awaited<ReturnType<typeof createMCPClient>>['client']
24
- let cleanup: (() => Promise<void>) | null = null
25
- let testCtx: TestContext | null = null
26
- let htmlServer: SimpleServer | null = null
27
-
28
- beforeAll(async () => {
29
- testCtx = await setupTestContext({
30
- port: TEST_PORT,
31
- tempDirPrefix: 'pw-popup-test-',
32
- toggleExtension: true,
33
- })
34
-
35
- const result = await createMCPClient({ port: TEST_PORT })
36
- client = result.client
37
- cleanup = result.cleanup
38
-
39
- htmlServer = await createSimpleServer({
40
- routes: {
41
- '/opener': `<!doctype html>
42
- <html>
43
- <body>
44
- <button id="open-popup" onclick="window.open('/target', '', 'width=400,height=300,popup=1')">Open popup</button>
45
- </body>
46
- </html>`,
47
- '/target': `<!doctype html>
48
- <html>
49
- <body>
50
- <h1 id="target-heading">Popup target page</h1>
51
- </body>
52
- </html>`,
53
- },
54
- })
55
- }, 600000)
56
-
57
- afterAll(async () => {
58
- if (htmlServer) {
59
- await htmlServer.close()
60
- }
61
- await cleanupTestContext(testCtx, cleanup)
62
- cleanup = null
63
- testCtx = null
64
- })
65
-
66
- it('relocates popup window into main browser context as a tab', async () => {
67
- if (!htmlServer) throw new Error('html server not initialized')
68
- const browserContext = testCtx!.browserContext
69
- const serviceWorker = await getExtensionServiceWorker(browserContext)
70
-
71
- await client.callTool({
72
- name: 'execute',
73
- arguments: {
74
- code: js`
75
- state.popupTestPage = context.pages().find((p) => p.url() === 'about:blank') ?? (await context.newPage());
76
- await state.popupTestPage.goto('${htmlServer.baseUrl}/opener', { waitUntil: 'domcontentloaded' });
77
- return { url: state.popupTestPage.url(), pagesBefore: context.pages().length };
78
- `,
79
- },
80
- })
81
-
82
- const clickResult = await client.callTool({
83
- name: 'execute',
84
- arguments: {
85
- code: js`
86
- await state.popupTestPage.click('#open-popup');
87
- await state.popupTestPage.waitForTimeout(1500);
88
- return { pagesAfter: context.pages().length, allUrls: context.pages().map((p) => p.url()) };
89
- `,
90
- },
91
- })
92
-
93
- const clickOutput = (clickResult as any).content[0].text as string
94
-
95
- expect(clickOutput).toContain('/target')
96
- expect((clickResult as any).isError).not.toBe(true)
97
- expect(clickOutput).toContain('[WARNING] New page opened from current page')
98
- expect(clickOutput).not.toContain('Popup window detected')
99
- expect(clickOutput).not.toContain('cannot be controlled by playwriter')
100
-
101
- const windowTypes = await serviceWorker.evaluate(async () => {
102
- const windows = await chrome.windows.getAll({ populate: false })
103
- return windows.map((w) => w.type)
104
- })
105
- expect(windowTypes).not.toContain('popup')
106
- expect(windowTypes).toContain('normal')
107
-
108
- await client.callTool({
109
- name: 'execute',
110
- arguments: {
111
- code: js`
112
- const targetPage = context.pages().find((p) => p.url().endsWith('/target'));
113
- if (targetPage) { await targetPage.close(); }
114
- await state.popupTestPage.close();
115
- delete state.popupTestPage;
116
- `,
117
- },
118
- })
119
- }, 60000)
120
-
121
- it('leaves popup windows alone when no Tabwright tab is connected', async () => {
122
- if (!htmlServer) throw new Error('html server not initialized')
123
- const browserContext = testCtx!.browserContext
124
- const serviceWorker = await getExtensionServiceWorker(browserContext)
125
-
126
- await serviceWorker.evaluate(async () => {
127
- await globalThis.disconnectEverything()
128
- })
129
- await new Promise((r) => {
130
- setTimeout(r, 200)
131
- })
132
-
133
- // Drive the browser directly via browserContext (not MCP/extension) so
134
- // the opener tab stays unconnected.
135
- const unconnectedPage = await browserContext.newPage()
136
- await unconnectedPage.goto(`${htmlServer.baseUrl}/opener`, { waitUntil: 'domcontentloaded' })
137
- await unconnectedPage.bringToFront()
138
- await unconnectedPage.click('#open-popup')
139
- // If relocation DID happen, the popup window would be gone by now.
140
- await new Promise((r) => {
141
- setTimeout(r, 1500)
142
- })
143
-
144
- const windowTypes = await serviceWorker.evaluate(async () => {
145
- const windows = await chrome.windows.getAll({ populate: false })
146
- return windows.map((w) => w.type)
147
- })
148
- expect(windowTypes).toContain('popup')
149
-
150
- const windowIdsToClose = await serviceWorker.evaluate(async () => {
151
- const windows = await chrome.windows.getAll({ populate: false })
152
- return windows.filter((w) => w.type === 'popup').map((w) => w.id)
153
- })
154
- for (const windowId of windowIdsToClose) {
155
- if (windowId !== undefined) {
156
- await serviceWorker.evaluate(async (id: number) => {
157
- await chrome.windows.remove(id)
158
- }, windowId)
159
- }
160
- }
161
- await unconnectedPage.close()
162
- }, 60000)
163
- })