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
package/src/styles.ts DELETED
@@ -1,343 +0,0 @@
1
- import type { ICDPSession } from './cdp-session.js'
2
- import type { Locator } from '@xmorse/playwright-core'
3
-
4
- export interface StyleSource {
5
- url: string
6
- line: number
7
- column: number
8
- }
9
-
10
- export type StyleDeclarations = Record<string, string>
11
-
12
- export interface StyleRule {
13
- selector: string
14
- source: StyleSource | null
15
- origin: 'regular' | 'user-agent' | 'injected' | 'inspector'
16
- declarations: StyleDeclarations
17
- inheritedFrom: string | null
18
- }
19
-
20
- export interface StylesResult {
21
- element: string
22
- inlineStyle: StyleDeclarations | null
23
- rules: StyleRule[]
24
- }
25
-
26
- interface CSSProperty {
27
- name: string
28
- value: string
29
- important?: boolean
30
- }
31
-
32
- interface CSSStyle {
33
- cssProperties: CSSProperty[]
34
- cssText?: string
35
- }
36
-
37
- interface CSSRule {
38
- selectorList: { text: string }
39
- style: CSSStyle
40
- styleSheetId?: string
41
- origin: string
42
- }
43
-
44
- interface RuleMatch {
45
- rule: CSSRule
46
- matchingSelectors: number[]
47
- }
48
-
49
- interface InheritedStyleEntry {
50
- inlineStyle?: CSSStyle
51
- matchedCSSRules: RuleMatch[]
52
- }
53
-
54
- interface SourceRange {
55
- startLine: number
56
- startColumn: number
57
- endLine: number
58
- endColumn: number
59
- }
60
-
61
- interface CSSStyleSheetHeader {
62
- styleSheetId: string
63
- sourceURL?: string
64
- origin: string
65
- }
66
-
67
- export async function getStylesForLocator({
68
- locator,
69
- cdp: cdpSession,
70
- includeUserAgentStyles = false,
71
- }: {
72
- locator: Locator
73
- cdp: ICDPSession
74
- includeUserAgentStyles?: boolean
75
- }): Promise<StylesResult> {
76
- const cdp = cdpSession
77
- await cdp.send('DOM.enable')
78
- await cdp.send('CSS.enable')
79
-
80
- const elementHandle = await locator.elementHandle()
81
- if (!elementHandle) {
82
- throw new Error('Could not get element handle from locator')
83
- }
84
-
85
- const remoteObject = (elementHandle as any)._channel?.objectId
86
- ? { objectId: (elementHandle as any)._channel.objectId }
87
- : null
88
-
89
- let backendNodeId: number
90
- if (remoteObject?.objectId) {
91
- const nodeInfo = await cdp.send('DOM.describeNode', {
92
- objectId: remoteObject.objectId,
93
- })
94
- backendNodeId = nodeInfo.node.backendNodeId
95
- } else {
96
- const box = await elementHandle.boundingBox()
97
- if (!box) {
98
- throw new Error('Element has no bounding box')
99
- }
100
- const docResult = await cdp.send('DOM.getDocument', { depth: 0 })
101
- const nodeAtPoint = await cdp.send('DOM.getNodeForLocation', {
102
- x: Math.round(box.x + box.width / 2),
103
- y: Math.round(box.y + box.height / 2),
104
- })
105
- backendNodeId = nodeAtPoint.backendNodeId
106
- }
107
-
108
- const pushResult = await cdp.send('DOM.pushNodesByBackendIdsToFrontend', {
109
- backendNodeIds: [backendNodeId],
110
- })
111
- const nodeId = pushResult.nodeIds[0]
112
-
113
- if (!nodeId) {
114
- throw new Error('Could not get nodeId for element')
115
- }
116
-
117
- const nodeInfo = await cdp.send('DOM.describeNode', { nodeId })
118
- const elementDescription = formatElementDescription(nodeInfo.node)
119
-
120
- const matchedStyles = await cdp.send('CSS.getMatchedStylesForNode', { nodeId })
121
-
122
- const stylesheetUrls = new Map<string, string>()
123
-
124
- const processStyleSheetId = async (styleSheetId: string | undefined): Promise<StyleSource | null> => {
125
- if (!styleSheetId) {
126
- return null
127
- }
128
-
129
- if (!stylesheetUrls.has(styleSheetId)) {
130
- try {
131
- const header = await cdp.send('CSS.getStyleSheetText', { styleSheetId })
132
- stylesheetUrls.set(styleSheetId, '')
133
- } catch {
134
- stylesheetUrls.set(styleSheetId, '')
135
- }
136
- }
137
-
138
- return null
139
- }
140
-
141
- const rules: StyleRule[] = []
142
-
143
- if (matchedStyles.matchedCSSRules) {
144
- for (const ruleMatch of matchedStyles.matchedCSSRules) {
145
- const rule = ruleMatch.rule
146
- const sourceRange = (rule as any).selectorList?.range as SourceRange | undefined
147
- const styleSheetId = rule.styleSheetId
148
-
149
- let source: StyleSource | null = null
150
- if (styleSheetId && sourceRange) {
151
- const styleSheet = (matchedStyles as any).cssStyleSheetHeaders?.find(
152
- (h: CSSStyleSheetHeader) => h.styleSheetId === styleSheetId,
153
- )
154
- const url =
155
- styleSheet?.sourceURL || (rule as any).origin === 'user-agent' ? 'user-agent' : `stylesheet:${styleSheetId}`
156
-
157
- source = {
158
- url: (rule as any).styleSheetId ? await getStylesheetUrl(cdp, styleSheetId) : 'user-agent',
159
- line: sourceRange.startLine + 1,
160
- column: sourceRange.startColumn,
161
- }
162
- }
163
-
164
- rules.push({
165
- selector: rule.selectorList.text,
166
- source,
167
- origin: rule.origin as StyleRule['origin'],
168
- declarations: extractDeclarations(rule.style),
169
- inheritedFrom: null,
170
- })
171
- }
172
- }
173
-
174
- if (matchedStyles.inherited) {
175
- for (let i = 0; i < matchedStyles.inherited.length; i++) {
176
- const inheritedEntry = matchedStyles.inherited[i] as InheritedStyleEntry
177
- const ancestorDesc = `ancestor[${i + 1}]`
178
-
179
- if (inheritedEntry.inlineStyle) {
180
- const declarations = extractDeclarations(inheritedEntry.inlineStyle)
181
- if (Object.keys(declarations).length > 0) {
182
- rules.push({
183
- selector: 'element.style',
184
- source: null,
185
- origin: 'regular',
186
- declarations,
187
- inheritedFrom: ancestorDesc,
188
- })
189
- }
190
- }
191
-
192
- for (const ruleMatch of inheritedEntry.matchedCSSRules) {
193
- const rule = ruleMatch.rule
194
- const sourceRange = (rule as any).selectorList?.range as SourceRange | undefined
195
- const styleSheetId = rule.styleSheetId
196
-
197
- let source: StyleSource | null = null
198
- if (styleSheetId && sourceRange) {
199
- source = {
200
- url: await getStylesheetUrl(cdp, styleSheetId),
201
- line: sourceRange.startLine + 1,
202
- column: sourceRange.startColumn,
203
- }
204
- }
205
-
206
- const declarations = extractDeclarations(rule.style)
207
- if (Object.keys(declarations).length > 0) {
208
- rules.push({
209
- selector: rule.selectorList.text,
210
- source,
211
- origin: rule.origin as StyleRule['origin'],
212
- declarations,
213
- inheritedFrom: ancestorDesc,
214
- })
215
- }
216
- }
217
- }
218
- }
219
-
220
- let inlineStyle: StyleDeclarations | null = null
221
- if (matchedStyles.inlineStyle) {
222
- const declarations = extractDeclarations(matchedStyles.inlineStyle as CSSStyle)
223
- if (Object.keys(declarations).length > 0) {
224
- inlineStyle = declarations
225
- }
226
- }
227
-
228
- const filteredRules = includeUserAgentStyles ? rules : rules.filter((r) => r.origin !== 'user-agent')
229
-
230
- return {
231
- element: elementDescription,
232
- inlineStyle,
233
- rules: filteredRules,
234
- }
235
- }
236
-
237
- function extractDeclarations(style: CSSStyle): StyleDeclarations {
238
- if (!style?.cssProperties) {
239
- return {}
240
- }
241
-
242
- const result: StyleDeclarations = {}
243
- for (const prop of style.cssProperties) {
244
- if (!prop.value || prop.value === 'initial' || prop.name.startsWith('-webkit-')) {
245
- continue
246
- }
247
- const value = prop.important ? `${prop.value} !important` : prop.value
248
- result[prop.name] = value
249
- }
250
- return result
251
- }
252
-
253
- function formatElementDescription(node: any): string {
254
- let desc = node.localName || node.nodeName?.toLowerCase() || 'element'
255
-
256
- if (node.attributes) {
257
- const attrs: Record<string, string> = {}
258
- for (let i = 0; i < node.attributes.length; i += 2) {
259
- attrs[node.attributes[i]] = node.attributes[i + 1]
260
- }
261
-
262
- if (attrs.id) {
263
- desc += `#${attrs.id}`
264
- }
265
- if (attrs.class) {
266
- desc += `.${attrs.class.split(' ').join('.')}`
267
- }
268
- }
269
-
270
- return desc
271
- }
272
-
273
- async function getStylesheetUrl(cdp: ICDPSession, styleSheetId: string): Promise<string> {
274
- try {
275
- await cdp.send('CSS.getStyleSheetText', { styleSheetId })
276
- return `stylesheet:${styleSheetId}`
277
- } catch {
278
- return `stylesheet:${styleSheetId}`
279
- }
280
- }
281
-
282
- export function formatStylesAsText(styles: StylesResult): string {
283
- const lines: string[] = []
284
-
285
- lines.push(`Element: ${styles.element}`)
286
- lines.push('')
287
-
288
- if (styles.inlineStyle) {
289
- lines.push('Inline styles:')
290
- for (const [prop, value] of Object.entries(styles.inlineStyle)) {
291
- lines.push(` ${prop}: ${value}`)
292
- }
293
- lines.push('')
294
- }
295
-
296
- const directRules = styles.rules.filter((r) => !r.inheritedFrom)
297
- const inheritedRules = styles.rules.filter((r) => r.inheritedFrom)
298
-
299
- if (directRules.length > 0) {
300
- lines.push('Matched rules:')
301
- for (const rule of directRules) {
302
- lines.push(` ${rule.selector} {`)
303
- const sourceInfo = rule.source ? ` /* ${rule.source.url}:${rule.source.line}:${rule.source.column} */` : ''
304
- if (sourceInfo) {
305
- lines.push(` ${sourceInfo}`)
306
- }
307
- for (const [prop, value] of Object.entries(rule.declarations)) {
308
- lines.push(` ${prop}: ${value};`)
309
- }
310
- lines.push(' }')
311
- }
312
- lines.push('')
313
- }
314
-
315
- if (inheritedRules.length > 0) {
316
- const byAncestor = new Map<string, StyleRule[]>()
317
- for (const rule of inheritedRules) {
318
- const key = rule.inheritedFrom!
319
- if (!byAncestor.has(key)) {
320
- byAncestor.set(key, [])
321
- }
322
- byAncestor.get(key)!.push(rule)
323
- }
324
-
325
- for (const [ancestor, rules] of byAncestor) {
326
- lines.push(`Inherited from ${ancestor}:`)
327
- for (const rule of rules) {
328
- lines.push(` ${rule.selector} {`)
329
- const sourceInfo = rule.source ? ` /* ${rule.source.url}:${rule.source.line}:${rule.source.column} */` : ''
330
- if (sourceInfo) {
331
- lines.push(` ${sourceInfo}`)
332
- }
333
- for (const [prop, value] of Object.entries(rule.declarations)) {
334
- lines.push(` ${prop}: ${value};`)
335
- }
336
- lines.push(' }')
337
- }
338
- lines.push('')
339
- }
340
- }
341
-
342
- return lines.join('\n')
343
- }
@@ -1,61 +0,0 @@
1
- import fs from 'node:fs'
2
- import path from 'node:path'
3
- import { afterEach, describe, expect, test } from 'vitest'
4
- import { getTabwrightAgentSkillStatus, installTabwrightAgentSkill } from './tabwright-agent-skill.js'
5
-
6
- const tempDirs: string[] = []
7
-
8
- afterEach(() => {
9
- tempDirs.splice(0).map((dir) => {
10
- fs.rmSync(dir, { recursive: true, force: true })
11
- return dir
12
- })
13
- })
14
-
15
- function createFixture(): { bundledSkillPath: string; codexHome: string } {
16
- const tmpRoot = path.resolve(process.cwd(), '..', 'tmp')
17
- fs.mkdirSync(tmpRoot, { recursive: true })
18
- const dir = fs.mkdtempSync(path.join(tmpRoot, 'tabwright-agent-skill-test-'))
19
- tempDirs.push(dir)
20
- const bundledSkillPath = path.join(dir, 'bundled', 'SKILL.md')
21
- fs.mkdirSync(path.dirname(bundledSkillPath), { recursive: true })
22
- fs.writeFileSync(bundledSkillPath, '---\nname: tabwright\ndescription: Test skill\n---\n\nUse Tabwright.\n')
23
- return { bundledSkillPath, codexHome: path.join(dir, 'codex-home') }
24
- }
25
-
26
- describe('Tabwright agent skill installation', () => {
27
- test('installs the bundled skill and reports it current', () => {
28
- const fixture = createFixture()
29
- const missing = getTabwrightAgentSkillStatus(fixture)
30
- expect(missing.state).toBe('missing')
31
- expect(missing.installCommand).toBe('tabwright skill install --target codex')
32
-
33
- const installed = installTabwrightAgentSkill(fixture)
34
- expect(installed.fileStatus).toBe('created')
35
- expect(installed.state).toBe('current')
36
- expect(fs.readFileSync(installed.installedPath, 'utf-8')).toBe(
37
- fs.readFileSync(fixture.bundledSkillPath, 'utf-8'),
38
- )
39
-
40
- const unchanged = installTabwrightAgentSkill(fixture)
41
- expect(unchanged.fileStatus).toBe('unchanged')
42
- })
43
-
44
- test('requires force before replacing a different installed skill', () => {
45
- const fixture = createFixture()
46
- const installedPath = path.join(fixture.codexHome, 'skills', 'tabwright', 'SKILL.md')
47
- fs.mkdirSync(path.dirname(installedPath), { recursive: true })
48
- fs.writeFileSync(installedPath, 'locally edited skill\n')
49
-
50
- const outdated = getTabwrightAgentSkillStatus(fixture)
51
- expect(outdated.state).toBe('outdated')
52
- expect(outdated.installCommand).toBe('tabwright skill install --target codex --force')
53
- expect(() => {
54
- installTabwrightAgentSkill(fixture)
55
- }).toThrow(/Use --force to overwrite/)
56
-
57
- const updated = installTabwrightAgentSkill({ ...fixture, overwrite: true })
58
- expect(updated.fileStatus).toBe('updated')
59
- expect(updated.state).toBe('current')
60
- })
61
- })
@@ -1,105 +0,0 @@
1
- import crypto from 'node:crypto'
2
- import fs from 'node:fs'
3
- import os from 'node:os'
4
- import path from 'node:path'
5
- import { getInstalledTabwrightPackageDir } from './package-paths.js'
6
-
7
- export type TabwrightAgentSkillTarget = 'codex'
8
- export type TabwrightAgentSkillState = 'missing' | 'current' | 'outdated'
9
-
10
- export interface TabwrightAgentSkillStatus {
11
- target: TabwrightAgentSkillTarget
12
- state: TabwrightAgentSkillState
13
- bundledPath: string
14
- installedPath: string
15
- bundledSha256: string
16
- installedSha256?: string
17
- installCommand: string
18
- }
19
-
20
- export interface TabwrightAgentSkillInstallResult extends TabwrightAgentSkillStatus {
21
- fileStatus: 'created' | 'updated' | 'unchanged'
22
- next: string[]
23
- }
24
-
25
- export function getBundledTabwrightAgentSkillPath(options: { bundledSkillPath?: string } = {}): string {
26
- if (options.bundledSkillPath) {
27
- return options.bundledSkillPath
28
- }
29
- const packageDir = getInstalledTabwrightPackageDir()
30
- const repositoryRoot = path.join(packageDir, '..')
31
- const packagedSkillPath = path.join(packageDir, 'dist', 'agent-skills', 'tabwright', 'SKILL.md')
32
- const repositorySkillPath = path.join(repositoryRoot, 'skills', 'tabwright', 'SKILL.md')
33
- const candidates = fs.existsSync(path.join(repositoryRoot, '.git'))
34
- ? [repositorySkillPath, packagedSkillPath]
35
- : [packagedSkillPath]
36
- const bundledPath = candidates.find((candidate) => {
37
- return fs.existsSync(candidate)
38
- })
39
- if (!bundledPath) {
40
- throw new Error(`Bundled Tabwright skill not found under ${packageDir}. Rebuild or reinstall the CLI.`)
41
- }
42
- return bundledPath
43
- }
44
-
45
- export function getTabwrightAgentSkillStatus(options: {
46
- target?: TabwrightAgentSkillTarget
47
- codexHome?: string
48
- bundledSkillPath?: string
49
- } = {}): TabwrightAgentSkillStatus {
50
- const target = options.target || 'codex'
51
- const bundledPath = getBundledTabwrightAgentSkillPath({ bundledSkillPath: options.bundledSkillPath })
52
- const installedPath = path.join(getCodexHome(options.codexHome), 'skills', 'tabwright', 'SKILL.md')
53
- const bundledContent = fs.readFileSync(bundledPath, 'utf-8')
54
- const installedContent = fs.existsSync(installedPath) ? fs.readFileSync(installedPath, 'utf-8') : undefined
55
- const state: TabwrightAgentSkillState = (() => {
56
- if (installedContent === undefined) {
57
- return 'missing'
58
- }
59
- return installedContent === bundledContent ? 'current' : 'outdated'
60
- })()
61
- return {
62
- target,
63
- state,
64
- bundledPath,
65
- installedPath,
66
- bundledSha256: sha256(bundledContent),
67
- ...(installedContent === undefined ? {} : { installedSha256: sha256(installedContent) }),
68
- installCommand: `tabwright skill install --target ${target}${state === 'outdated' ? ' --force' : ''}`,
69
- }
70
- }
71
-
72
- export function installTabwrightAgentSkill(options: {
73
- target?: TabwrightAgentSkillTarget
74
- codexHome?: string
75
- bundledSkillPath?: string
76
- overwrite?: boolean
77
- } = {}): TabwrightAgentSkillInstallResult {
78
- const before = getTabwrightAgentSkillStatus(options)
79
- if (before.state === 'current') {
80
- return {
81
- ...before,
82
- fileStatus: 'unchanged',
83
- next: ['Restart or open a new Codex thread so it can load the Tabwright skill.'],
84
- }
85
- }
86
- if (before.state === 'outdated' && !options.overwrite) {
87
- throw new Error(`Installed Tabwright skill differs from this CLI: ${before.installedPath}. Use --force to overwrite.`)
88
- }
89
- fs.mkdirSync(path.dirname(before.installedPath), { recursive: true })
90
- fs.copyFileSync(before.bundledPath, before.installedPath)
91
- const after = getTabwrightAgentSkillStatus(options)
92
- return {
93
- ...after,
94
- fileStatus: before.state === 'missing' ? 'created' : 'updated',
95
- next: ['Restart or open a new Codex thread so it can load the Tabwright skill.'],
96
- }
97
- }
98
-
99
- function getCodexHome(codexHome?: string): string {
100
- return path.resolve(codexHome || process.env.CODEX_HOME || path.join(os.homedir(), '.codex'))
101
- }
102
-
103
- function sha256(content: string): string {
104
- return crypto.createHash('sha256').update(content).digest('hex')
105
- }
@@ -1,13 +0,0 @@
1
- import type { ExtensionState } from 'mcp-extension/src/types.js'
2
-
3
- declare global {
4
- var toggleExtensionForActiveTab: () => Promise<{ isConnected: boolean; state: ExtensionState }>
5
- var getExtensionState: () => ExtensionState
6
- var disconnectEverything: () => Promise<void>
7
-
8
- // Browser globals used in evaluate() calls
9
- var window: any
10
- var document: any
11
- }
12
-
13
- export {}
@@ -1,70 +0,0 @@
1
- import fs from 'node:fs'
2
- import path from 'node:path'
3
- import { describe, expect, test } from 'vitest'
4
- import { startTabwrightCDPRelayServer } from './cdp-relay.js'
5
- import {
6
- getExtensionServiceWorker,
7
- getLegacyExtensionLaunchArgs,
8
- isExtensionLoadUnavailableError,
9
- launchPersistentContextWithExtensions,
10
- } from './test-utils.js'
11
-
12
- describe('extension test browser launch', () => {
13
- test('builds the legacy extension launch fallback flags', () => {
14
- const extensionPaths = ['./extension-one', './extension-two']
15
- const args = getLegacyExtensionLaunchArgs({ extensionPaths })
16
- const resolvedPaths = extensionPaths.map((extensionPath) => {
17
- return path.resolve(extensionPath)
18
- })
19
-
20
- expect(args).toContain(`--disable-extensions-except=${resolvedPaths.join(',')}`)
21
- expect(args).toContain(`--load-extension=${resolvedPaths.join(',')}`)
22
- })
23
-
24
- test('recognizes older browsers without Extensions.loadUnpacked', () => {
25
- expect(
26
- isExtensionLoadUnavailableError(
27
- new Error("Protocol error (Extensions.loadUnpacked): 'Extensions.loadUnpacked' wasn't found"),
28
- ),
29
- ).toBe(true)
30
- expect(isExtensionLoadUnavailableError(new Error('Method not found'))).toBe(true)
31
- expect(isExtensionLoadUnavailableError(new Error('Manifest is invalid'))).toBe(false)
32
- })
33
-
34
- test.runIf(Boolean(process.env.PLAYWRITER_TEST_EXTENSION_PATH))(
35
- 'loads an unpacked extension in the installed Chrome build',
36
- async () => {
37
- const extensionPath = process.env.PLAYWRITER_TEST_EXTENSION_PATH
38
- if (!extensionPath) {
39
- throw new Error('PLAYWRITER_TEST_EXTENSION_PATH is required')
40
- }
41
-
42
- const tempRoot = path.join(process.cwd(), 'tmp')
43
- fs.mkdirSync(tempRoot, { recursive: true })
44
- const userDataDir = fs.mkdtempSync(path.join(tempRoot, 'pw-extension-load-test-'))
45
- const relayServer = await startTabwrightCDPRelayServer({
46
- port: Number(process.env.PLAYWRITER_TEST_RELAY_PORT) || 19_997,
47
- })
48
- try {
49
- const browserContext = await launchPersistentContextWithExtensions({
50
- userDataDir,
51
- extensionPaths: [extensionPath],
52
- })
53
- try {
54
- const serviceWorker = await getExtensionServiceWorker(browserContext).catch(async (error: unknown) => {
55
- const session = await browserContext.browser()?.newBrowserCDPSession()
56
- const targets = session ? await session.send('Target.getTargets') : null
57
- throw new Error(`No extension service worker target was visible: ${JSON.stringify(targets)}`, { cause: error })
58
- })
59
- expect(serviceWorker.url()).toMatch(/^chrome-extension:\/\//)
60
- } finally {
61
- await browserContext.close()
62
- }
63
- } finally {
64
- relayServer.close()
65
- fs.rmSync(userDataDir, { recursive: true, force: true })
66
- }
67
- },
68
- 60_000,
69
- )
70
- })