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/mcp.ts DELETED
@@ -1,629 +0,0 @@
1
- import './env-compat.js'
2
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
3
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
4
- import { z } from 'zod'
5
- import fs from 'node:fs'
6
- import path from 'node:path'
7
- import util from 'node:util'
8
- import { fileURLToPath } from 'node:url'
9
- import { createRequire } from 'node:module'
10
-
11
- // Prevent Buffers from dumping hex bytes in util.inspect output.
12
- // Without this, returning a screenshot Buffer would log ~400+ chars of useless hex.
13
- Buffer.prototype[util.inspect.custom] = function () {
14
- return `<Buffer ${this.length} bytes>`
15
- }
16
-
17
- import dedent from 'string-dedent'
18
- import { LOG_FILE_PATH, VERSION, parseRelayHost } from './utils.js'
19
- import { ensureRelayServer, getLocalRelayHttpBaseUrl, RELAY_PORT } from './relay-client.js'
20
- import { PlaywrightExecutor, CodeExecutionTimeoutError, type ExecuteResult } from './executor.js'
21
- import { discoverChromeInstances, resolveDirectInput, appendSessionToWsUrl } from './chrome-discovery.js'
22
- import crypto from 'node:crypto'
23
- import {
24
- listCapabilities,
25
- readCapabilityScript,
26
- routeCapabilities,
27
- searchCapabilities,
28
- toCapabilityContract,
29
- toCapabilitySummary,
30
- } from './capability-registry.js'
31
- import { refreshCapabilityAuthWithExecutor } from './capability-auth.js'
32
- import { runCapabilityWithExecutor, runNodeCapability } from './capability-runner.js'
33
-
34
- const __filename = fileURLToPath(import.meta.url)
35
- const __dirname = path.dirname(__filename)
36
- const require = createRequire(import.meta.url)
37
-
38
- // Single executor instance for MCP (created lazily)
39
- let executor: PlaywrightExecutor | null = null
40
-
41
- interface RemoteConfig {
42
- host: string
43
- port: number
44
- token?: string
45
- }
46
-
47
- function getRemoteConfig(): RemoteConfig | null {
48
- const host = process.env.TABWRIGHT_HOST
49
- if (!host) {
50
- return null
51
- }
52
- return {
53
- host,
54
- port: RELAY_PORT,
55
- token: process.env.TABWRIGHT_TOKEN,
56
- }
57
- }
58
-
59
- function getLogServerUrl(): string {
60
- const remote = getRemoteConfig()
61
- if (remote) {
62
- const { httpBaseUrl } = parseRelayHost(remote.host, remote.port)
63
- return `${httpBaseUrl}/mcp-log`
64
- }
65
- return `http://127.0.0.1:${RELAY_PORT}/mcp-log`
66
- }
67
-
68
- async function sendLogToRelayServer(level: string, ...args: any[]) {
69
- try {
70
- const headers: Record<string, string> = { 'Content-Type': 'application/json' }
71
- const token = process.env.TABWRIGHT_TOKEN
72
- if (token) {
73
- headers['Authorization'] = `Bearer ${token}`
74
- }
75
- await fetch(getLogServerUrl(), {
76
- method: 'POST',
77
- headers,
78
- body: JSON.stringify({ level, args }),
79
- signal: AbortSignal.timeout(1000),
80
- })
81
- } catch {
82
- // Silently fail if relay server is not available
83
- }
84
- }
85
-
86
- /**
87
- * Log to both console.error (for early startup) and relay server log file.
88
- * Fire-and-forget to avoid blocking.
89
- */
90
- function mcpLog(...args: any[]) {
91
- console.error(...args)
92
- sendLogToRelayServer('log', ...args)
93
- }
94
-
95
- /** MCP-specific logger for executor */
96
- const mcpLogger = {
97
- log: (...args: any[]) => mcpLog(...args),
98
- error: (...args: any[]) => {
99
- console.error(...args)
100
- sendLogToRelayServer('error', ...args)
101
- },
102
- }
103
-
104
- async function ensureRelayServerForMcp(): Promise<void> {
105
- await ensureRelayServer({ logger: mcpLogger })
106
- }
107
-
108
- /**
109
- * Resolve direct CDP config from TABWRIGHT_DIRECT env var.
110
- * - "auto" / "1" / "true": auto-discover Chrome on default port 9222
111
- * - "ws://..." / "wss://...": use explicit WebSocket endpoint
112
- * - "host:port": resolve to ws:// URL via HTTP probe + DevToolsActivePort fallback
113
- */
114
- async function getDirectCdpConfig(): Promise<{ directCdpUrl: string } | null> {
115
- const directEnv = process.env.TABWRIGHT_DIRECT
116
- if (!directEnv) {
117
- return null
118
- }
119
-
120
- // Auto-discover: check default port 9222
121
- if (directEnv === '1') {
122
- const instances = await discoverChromeInstances()
123
- if (instances.length === 0) {
124
- throw new Error(
125
- 'TABWRIGHT_DIRECT is set but no Chrome found on port 9222. ' +
126
- 'Enable debugging at chrome://inspect/#remote-debugging or launch with --remote-debugging-port=9222.',
127
- )
128
- }
129
- const sessionId = crypto.randomUUID()
130
- const wsUrl = appendSessionToWsUrl(instances[0].wsUrl, sessionId)
131
- mcpLog(`Direct CDP: using ${instances[0].browser} on port ${instances[0].port}`)
132
- return { directCdpUrl: wsUrl }
133
- }
134
-
135
- // ws://, wss://, or host:port — resolveDirectInput handles all three
136
- const resolved = await resolveDirectInput(directEnv)
137
- const sessionId = crypto.randomUUID()
138
- const directCdpUrl = appendSessionToWsUrl(resolved, sessionId)
139
- mcpLog(`Direct CDP: resolved ${directEnv} → ${directCdpUrl}`)
140
- return { directCdpUrl }
141
- }
142
-
143
- async function getOrCreateExecutor(): Promise<PlaywrightExecutor> {
144
- if (executor) {
145
- return executor
146
- }
147
-
148
- // Direct CDP mode takes priority over relay/remote
149
- const directConfig = await getDirectCdpConfig()
150
- if (directConfig) {
151
- executor = new PlaywrightExecutor({
152
- cdpConfig: directConfig,
153
- logger: mcpLogger,
154
- cwd: process.cwd(),
155
- })
156
- return executor
157
- }
158
-
159
- const remote = getRemoteConfig()
160
- if (!remote) {
161
- await ensureRelayServerForMcp()
162
- }
163
-
164
- // Pass config instead of pre-generated URL so executor can generate unique URLs for each connection
165
- const cdpConfig = remote || { host: await getLocalRelayHttpBaseUrl(RELAY_PORT), port: RELAY_PORT }
166
- executor = new PlaywrightExecutor({
167
- cdpConfig,
168
- logger: mcpLogger,
169
- cwd: process.cwd(),
170
- })
171
-
172
- return executor
173
- }
174
-
175
- async function checkRemoteServer({ host, port }: { host: string; port: number }): Promise<void> {
176
- const { httpBaseUrl } = parseRelayHost(host, port)
177
- const versionUrl = `${httpBaseUrl}/version`
178
- try {
179
- const response = await fetch(versionUrl, { signal: AbortSignal.timeout(3000) })
180
- if (!response.ok) {
181
- throw new Error(`Server responded with status ${response.status}`)
182
- }
183
- } catch (error: any) {
184
- const isConnectionError = error.cause?.code === 'ECONNREFUSED' || error.name === 'TimeoutError'
185
- if (isConnectionError) {
186
- throw new Error(
187
- `Cannot connect to remote relay server at ${host}. ` +
188
- `Make sure 'npx -y tabwright serve' is running on the host machine.`,
189
- )
190
- }
191
- throw new Error(`Failed to connect to remote relay server: ${error.message}`)
192
- }
193
- }
194
-
195
- const server = new McpServer({
196
- name: 'tabwright',
197
- title: 'The better playwright MCP: works as a browser extension. No context bloat. More capable.',
198
- version: VERSION,
199
- })
200
-
201
- const promptContent =
202
- fs.readFileSync(path.join(__dirname, '..', 'dist', 'prompt.md'), 'utf-8') +
203
- `\n\nfor debugging internal Tabwright errors, check Tabwright relay server logs at: ${LOG_FILE_PATH}`
204
-
205
- server.resource(
206
- 'debugger-api',
207
- 'https://playwriter.dev/resources/debugger-api.md',
208
- { mimeType: 'text/plain' },
209
- async () => {
210
- const packageJsonPath = require.resolve('tabwright/package.json')
211
- const packageDir = path.dirname(packageJsonPath)
212
- const content = fs.readFileSync(path.join(packageDir, 'dist', 'debugger-api.md'), 'utf-8')
213
- return {
214
- contents: [{ uri: 'https://playwriter.dev/resources/debugger-api.md', text: content, mimeType: 'text/plain' }],
215
- }
216
- },
217
- )
218
-
219
- server.resource(
220
- 'editor-api',
221
- 'https://playwriter.dev/resources/editor-api.md',
222
- { mimeType: 'text/plain' },
223
- async () => {
224
- const packageJsonPath = require.resolve('tabwright/package.json')
225
- const packageDir = path.dirname(packageJsonPath)
226
- const content = fs.readFileSync(path.join(packageDir, 'dist', 'editor-api.md'), 'utf-8')
227
- return {
228
- contents: [{ uri: 'https://playwriter.dev/resources/editor-api.md', text: content, mimeType: 'text/plain' }],
229
- }
230
- },
231
- )
232
-
233
- server.resource(
234
- 'styles-api',
235
- 'https://playwriter.dev/resources/styles-api.md',
236
- { mimeType: 'text/plain' },
237
- async () => {
238
- const packageJsonPath = require.resolve('tabwright/package.json')
239
- const packageDir = path.dirname(packageJsonPath)
240
- const content = fs.readFileSync(path.join(packageDir, 'dist', 'styles-api.md'), 'utf-8')
241
- return {
242
- contents: [{ uri: 'https://playwriter.dev/resources/styles-api.md', text: content, mimeType: 'text/plain' }],
243
- }
244
- },
245
- )
246
-
247
- server.resource(
248
- 'capabilities',
249
- 'tabwright://capabilities',
250
- { mimeType: 'application/json' },
251
- async () => {
252
- const capabilities = listCapabilities({ cwd: process.cwd() }).map(toCapabilityContract)
253
- return {
254
- contents: [
255
- {
256
- uri: 'tabwright://capabilities',
257
- text: JSON.stringify(capabilities, null, 2),
258
- mimeType: 'application/json',
259
- },
260
- ],
261
- }
262
- },
263
- )
264
-
265
- function executeResultToMcpContent(options: {
266
- result: ExecuteResult
267
- prefix?: string
268
- }): Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }> {
269
- const MAX_TEXT = 10000
270
- let text = options.prefix ? `${options.prefix}\n\n${options.result.text}` : options.result.text
271
- for (const s of options.result.screenshots) {
272
- text += `\nScreenshot saved to: ${s.path} (image included below, ${s.labelCount} labels)\n`
273
- text += `Accessibility snapshot:\n${s.snapshot}\n`
274
- }
275
- if (text.length > MAX_TEXT) {
276
- text = text.slice(0, MAX_TEXT) + '\n\n[Truncated]'
277
- }
278
-
279
- const content: Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }> = [
280
- { type: 'text', text },
281
- ]
282
- for (const image of options.result.images) {
283
- content.push({ type: 'image', data: image.data, mimeType: image.mimeType })
284
- }
285
- return content
286
- }
287
-
288
- server.tool(
289
- 'capability',
290
- dedent`
291
- Search, inspect, refresh auth for, or run saved Tabwright capabilities. Capabilities are reusable Tabwright scripts with AI-readable contracts, local secrets, and run logs.
292
-
293
- For concrete user tasks, use action "route" first. If it returns an exact-match direct-run capability, use action "run" directly with the returned input; do not search, describe, or open a page first.
294
- Capability ids are not shell commands. If route output includes shellCommand, use that exact Tabwright CLI command; never run the capability id directly as a binary.
295
- Do not treat every URL as a direct-run signal. If "route" returns no match, use action "search" before creating new browser code and action "describe" before running. Only use action "refresh_auth" after explicit user confirmation because it updates local credentials.
296
- If a capability operation requires confirmation, stop and ask the user. Only after explicit approval may you retry action "run" with confirmation set to the operation's exact confirmationToken. force never bypasses this gate.
297
- `,
298
- {
299
- action: z.enum(['list', 'route', 'search', 'show', 'describe', 'run', 'refresh_auth']).describe('Capability action'),
300
- id: z.string().optional().describe('Capability id for show/describe/run/refresh_auth'),
301
- query: z.string().optional().describe('Task or URL for action "route"; search query for action "search"'),
302
- limit: z.number().default(10).describe('Maximum number of search results'),
303
- input: z.record(z.string(), z.unknown()).optional().describe('JSON input for run'),
304
- force: z.boolean().optional().describe('Run draft capabilities or bypass URL match checks'),
305
- confirmation: z.string().optional().describe('Exact confirmationToken, supplied only after explicit user approval'),
306
- timeout: z.number().default(10000).describe('Timeout in milliseconds'),
307
- },
308
- async ({ action, id, query, limit, input, force, confirmation, timeout }) => {
309
- try {
310
- if (action === 'list') {
311
- return {
312
- content: [
313
- {
314
- type: 'text',
315
- text: JSON.stringify(listCapabilities({ cwd: process.cwd() }).map(toCapabilityContract), null, 2),
316
- },
317
- ],
318
- }
319
- }
320
-
321
- if (action === 'search') {
322
- return {
323
- content: [
324
- {
325
- type: 'text',
326
- text: JSON.stringify(
327
- searchCapabilities({ query: query || '', cwd: process.cwd(), limit }).map((result) => {
328
- return {
329
- score: result.score,
330
- reasons: result.reasons,
331
- ...toCapabilityContract(result.capability),
332
- }
333
- }),
334
- null,
335
- 2,
336
- ),
337
- },
338
- ],
339
- }
340
- }
341
-
342
- if (action === 'route') {
343
- return {
344
- content: [
345
- {
346
- type: 'text',
347
- text: JSON.stringify(
348
- routeCapabilities({ task: query || '', cwd: process.cwd(), limit }).map((route) => {
349
- return {
350
- shellCommand: route.shellCommand,
351
- command: route.command,
352
- capabilityId: route.capability.manifest.id,
353
- operation: route.operation,
354
- id: route.capability.manifest.id,
355
- title: route.capability.manifest.title,
356
- location: route.capability.location,
357
- routingHint:
358
- route.operation === undefined
359
- ? route.capability.manifest.routingHint
360
- : route.capability.manifest.operations[route.operation]?.routingHint,
361
- input: route.input,
362
- commandWarning: route.commandWarning,
363
- executionHint: route.executionHint,
364
- reasons: route.reasons,
365
- matchedText: route.matchedText,
366
- }
367
- }),
368
- null,
369
- 2,
370
- ),
371
- },
372
- ],
373
- }
374
- }
375
-
376
- if (!id) {
377
- return { content: [{ type: 'text', text: 'id is required' }], isError: true }
378
- }
379
-
380
- if (action === 'show' || action === 'describe') {
381
- const capability = listCapabilities({ cwd: process.cwd() }).find((candidate) => {
382
- return candidate.manifest.id === id
383
- })
384
- if (!capability) {
385
- return { content: [{ type: 'text', text: `Capability not found: ${id}` }], isError: true }
386
- }
387
- return {
388
- content: [
389
- {
390
- type: 'text',
391
- text: JSON.stringify(
392
- {
393
- ...(action === 'describe' ? toCapabilityContract(capability) : toCapabilitySummary(capability)),
394
- ...(action === 'show' ? { script: readCapabilityScript({ id, cwd: process.cwd() }) } : {}),
395
- },
396
- null,
397
- 2,
398
- ),
399
- },
400
- ],
401
- }
402
- }
403
-
404
- if (action === 'refresh_auth') {
405
- const exec = await getOrCreateExecutor()
406
- const result = await refreshCapabilityAuthWithExecutor({
407
- executor: exec,
408
- id,
409
- cwd: process.cwd(),
410
- timeout,
411
- })
412
- return {
413
- content: [
414
- {
415
- type: 'text',
416
- text: JSON.stringify(
417
- {
418
- capability: result.capability.manifest.id,
419
- saved: result.saved,
420
- secretKey: result.secretKey,
421
- cookieCount: result.cookieCount,
422
- cookieNames: result.cookieNames,
423
- urls: result.urls,
424
- expiresAt: result.expiresAt,
425
- path: result.path,
426
- },
427
- null,
428
- 2,
429
- ),
430
- },
431
- ],
432
- }
433
- }
434
-
435
- const capability = listCapabilities({ cwd: process.cwd() }).find((candidate) => {
436
- return candidate.manifest.id === id
437
- })
438
- if (!capability) {
439
- return { content: [{ type: 'text', text: `Capability not found: ${id}` }], isError: true }
440
- }
441
- if (capability.manifest.runtime === 'node') {
442
- const result = await runNodeCapability({
443
- id,
444
- input: input || {},
445
- cwd: process.cwd(),
446
- timeout,
447
- force,
448
- confirmation,
449
- })
450
- return {
451
- content: [
452
- {
453
- type: 'text',
454
- text: `Capability output:\n${JSON.stringify(result.output, null, 2)}\n\n${result.text}`,
455
- },
456
- ],
457
- isError: result.isError,
458
- }
459
- }
460
-
461
- const exec = await getOrCreateExecutor()
462
- const result = await runCapabilityWithExecutor({
463
- executor: exec,
464
- id,
465
- input: input || {},
466
- cwd: process.cwd(),
467
- timeout,
468
- force,
469
- confirmation,
470
- })
471
- return {
472
- content: executeResultToMcpContent({
473
- result: result.executeResult,
474
- prefix: `Capability output:\n${JSON.stringify(result.output, null, 2)}`,
475
- }),
476
- isError: result.executeResult.isError,
477
- }
478
- } catch (error) {
479
- const errorStack = error instanceof Error ? error.stack || error.message : String(error)
480
- console.error('Error in capability tool:', errorStack)
481
- return {
482
- content: [{ type: 'text', text: `Error running capability: ${error instanceof Error ? error.message : String(error)}` }],
483
- isError: true,
484
- }
485
- }
486
- },
487
- )
488
-
489
- server.tool(
490
- 'execute',
491
- promptContent,
492
- {
493
- code: z
494
- .string()
495
- .describe(
496
- 'js playwright code, has {page, state, context} in scope. Should be one line, using ; to execute multiple statements. you MUST call execute multiple times instead of writing complex scripts in a single tool call.',
497
- ),
498
- timeout: z.number().default(10000).describe('Timeout in milliseconds for code execution (default: 10000ms)'),
499
- },
500
- async ({ code, timeout }) => {
501
- try {
502
- // Check relay server on every execute to auto-recover from crashes
503
- // (skip in direct CDP mode — no relay involved)
504
- if (!process.env.TABWRIGHT_DIRECT) {
505
- const remote = getRemoteConfig()
506
- if (!remote) {
507
- await ensureRelayServerForMcp()
508
- }
509
- }
510
-
511
- const exec = await getOrCreateExecutor()
512
- const result = await exec.execute(code, timeout)
513
-
514
- // Transform executor result to MCP format
515
- // Append screenshot metadata to text for MCP (image is included inline as content)
516
- const MAX_TEXT = 10000
517
- let text = result.text
518
- for (const s of result.screenshots) {
519
- text += `\nScreenshot saved to: ${s.path} (image included below, ${s.labelCount} labels)\n`
520
- text += `Accessibility snapshot:\n${s.snapshot}\n`
521
- }
522
- if (text.length > MAX_TEXT) {
523
- text = text.slice(0, MAX_TEXT) + '\n\n[Truncated]'
524
- }
525
-
526
- const content: Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }> = [
527
- { type: 'text', text },
528
- ]
529
-
530
- for (const image of result.images) {
531
- content.push({ type: 'image', data: image.data, mimeType: image.mimeType })
532
- }
533
-
534
- if (result.isError) {
535
- return { content, isError: true }
536
- }
537
-
538
- return { content }
539
- } catch (error: any) {
540
- const errorStack = error.stack || error.message
541
- const isTimeoutError =
542
- error instanceof CodeExecutionTimeoutError || error?.name === 'TimeoutError' || error?.name === 'AbortError'
543
-
544
- console.error('Error in execute tool:', errorStack)
545
- if (!isTimeoutError) {
546
- sendLogToRelayServer('error', 'Error in execute tool:', errorStack)
547
- }
548
-
549
- const resetHint = isTimeoutError
550
- ? ''
551
- : '\n\n[HINT: If this is an internal Playwright error, page/browser closed, or connection issue, call the `reset` tool to reconnect. Do NOT reset for other non-connection non-internal errors.]'
552
-
553
- // timeout stacks are internal noise (Promise.race / setTimeout); only show the message
554
- const errorText = isTimeoutError ? error.message : errorStack
555
- return {
556
- content: [{ type: 'text', text: `Error executing code: ${errorText}${resetHint}` }],
557
- isError: true,
558
- }
559
- }
560
- },
561
- )
562
-
563
- server.tool(
564
- 'reset',
565
- dedent`
566
- Recreates the CDP connection and resets the browser/page/context. Use this when the MCP stops responding, you get connection errors, if there are no pages in context, assertion failures, page closed, or other issues.
567
-
568
- After calling this tool, the page and context variables are automatically updated in the execution environment.
569
-
570
- This tools also removes any custom properties you may have added to the global scope AND clearing all keys from the \`state\` object. Only \`page\`, \`context\`, \`state\` (empty), \`console\`, and utility functions will remain.
571
-
572
- if playwright always returns all pages as about:blank urls and evaluate does not work you should ask the user to restart Chrome. This is a known Chrome bug.
573
- `,
574
- {},
575
- async () => {
576
- try {
577
- // Check relay server to auto-recover from crashes
578
- // (skip in direct CDP mode — no relay involved)
579
- if (!process.env.TABWRIGHT_DIRECT) {
580
- const remote = getRemoteConfig()
581
- if (!remote) {
582
- await ensureRelayServerForMcp()
583
- }
584
- }
585
-
586
- const exec = await getOrCreateExecutor()
587
- const { page, context } = await exec.reset()
588
- const pagesCount = context.pages().length
589
- return {
590
- content: [
591
- {
592
- type: 'text',
593
- text: `Connection reset successfully. ${pagesCount} page(s) available. Current page URL: ${page.url()}`,
594
- },
595
- ],
596
- }
597
- } catch (error: any) {
598
- return {
599
- content: [{ type: 'text', text: `Failed to reset connection: ${error.message}` }],
600
- isError: true,
601
- }
602
- }
603
- },
604
- )
605
-
606
- export async function startMcp(options: { host?: string; token?: string } = {}) {
607
- if (options.host) {
608
- process.env.TABWRIGHT_HOST = options.host
609
- }
610
- if (options.token) {
611
- process.env.TABWRIGHT_TOKEN = options.token
612
- }
613
-
614
- // In direct CDP mode (TABWRIGHT_DIRECT env var), no relay server needed
615
- if (process.env.TABWRIGHT_DIRECT) {
616
- mcpLog(`Using direct CDP connection: ${process.env.TABWRIGHT_DIRECT}`)
617
- } else {
618
- const remote = getRemoteConfig()
619
- if (!remote) {
620
- await ensureRelayServerForMcp()
621
- } else {
622
- mcpLog(`Using remote CDP relay server: ${remote.host}`)
623
- await checkRemoteServer(remote)
624
- }
625
- }
626
-
627
- const transport = new StdioServerTransport()
628
- await server.connect(transport)
629
- }