tabwright 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. package/dist/aria-snapshot.d.ts +0 -1
  2. package/dist/aria-snapshot.js +9 -1
  3. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +0 -1
  4. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +0 -1
  5. package/dist/bippy.js +1 -1
  6. package/dist/browser-config.d.ts +0 -1
  7. package/dist/browser-config.js +0 -1
  8. package/dist/browser-install.d.ts +0 -1
  9. package/dist/browser-install.js +0 -1
  10. package/dist/browser-launch.d.ts +0 -1
  11. package/dist/browser-launch.js +0 -1
  12. package/dist/builtin-capabilities.d.ts +0 -1
  13. package/dist/builtin-capabilities.js +0 -1
  14. package/dist/capability-agent-skill.d.ts +0 -1
  15. package/dist/capability-agent-skill.js +0 -1
  16. package/dist/capability-auth-state.d.ts +0 -1
  17. package/dist/capability-auth-state.js +0 -1
  18. package/dist/capability-auth.d.ts +0 -1
  19. package/dist/capability-auth.js +0 -1
  20. package/dist/capability-options.d.ts +0 -1
  21. package/dist/capability-options.js +0 -1
  22. package/dist/capability-package.d.ts +0 -1
  23. package/dist/capability-package.js +0 -1
  24. package/dist/capability-registry.d.ts +0 -1
  25. package/dist/capability-registry.js +0 -1
  26. package/dist/capability-runner.d.ts +0 -1
  27. package/dist/capability-runner.js +0 -1
  28. package/dist/capability-studio.d.ts +0 -1
  29. package/dist/capability-studio.js +0 -1
  30. package/dist/cdp-log.d.ts +0 -1
  31. package/dist/cdp-log.js +0 -1
  32. package/dist/cdp-relay.d.ts +0 -1
  33. package/dist/cdp-relay.js +0 -1
  34. package/dist/cdp-session.d.ts +0 -1
  35. package/dist/cdp-session.js +0 -1
  36. package/dist/cdp-types.d.ts +0 -1
  37. package/dist/cdp-types.js +0 -1
  38. package/dist/chrome-discovery.d.ts +0 -1
  39. package/dist/chrome-discovery.js +0 -1
  40. package/dist/clean-html.d.ts +0 -1
  41. package/dist/clean-html.js +0 -1
  42. package/dist/cli.d.ts +0 -1
  43. package/dist/cli.js +9 -2
  44. package/dist/cloud-client.d.ts +0 -1
  45. package/dist/cloud-client.js +0 -1
  46. package/dist/create-logger.d.ts +0 -1
  47. package/dist/create-logger.js +0 -1
  48. package/dist/debugger-examples-types.d.ts +0 -1
  49. package/dist/debugger-examples-types.js +0 -1
  50. package/dist/debugger-examples.d.ts +0 -1
  51. package/dist/debugger-examples.js +0 -1
  52. package/dist/debugger.d.ts +0 -1
  53. package/dist/debugger.js +0 -1
  54. package/dist/diff-utils.d.ts +0 -1
  55. package/dist/diff-utils.js +0 -1
  56. package/dist/doctor.d.ts +0 -1
  57. package/dist/doctor.js +5 -7
  58. package/dist/editor-examples.d.ts +0 -1
  59. package/dist/editor-examples.js +0 -1
  60. package/dist/editor.d.ts +0 -1
  61. package/dist/editor.js +0 -1
  62. package/dist/env-compat.d.ts +0 -1
  63. package/dist/env-compat.js +0 -1
  64. package/dist/executor.d.ts +0 -1
  65. package/dist/executor.js +1 -2
  66. package/dist/extension/background.js +7 -3
  67. package/dist/extension/manifest.json +1 -1
  68. package/dist/ghost-browser.d.ts +0 -1
  69. package/dist/ghost-browser.js +0 -1
  70. package/dist/ghost-cursor-controller.d.ts +0 -1
  71. package/dist/ghost-cursor-controller.js +0 -1
  72. package/dist/ghost-cursor.d.ts +0 -1
  73. package/dist/ghost-cursor.js +0 -1
  74. package/dist/htmlrewrite.d.ts +0 -1
  75. package/dist/htmlrewrite.js +0 -1
  76. package/dist/index.d.ts +0 -1
  77. package/dist/index.js +0 -1
  78. package/dist/kill-port.d.ts +0 -1
  79. package/dist/kill-port.js +0 -1
  80. package/dist/kitty-graphics.d.ts +0 -1
  81. package/dist/kitty-graphics.js +0 -1
  82. package/dist/mcp.d.ts +0 -1
  83. package/dist/mcp.js +0 -1
  84. package/dist/package-paths.d.ts +0 -1
  85. package/dist/package-paths.js +0 -1
  86. package/dist/page-markdown.d.ts +0 -1
  87. package/dist/page-markdown.js +0 -1
  88. package/dist/performance-examples.d.ts +0 -1
  89. package/dist/performance-examples.js +0 -1
  90. package/dist/playwright-import.d.ts +0 -1
  91. package/dist/playwright-import.js +0 -1
  92. package/dist/product-paths.d.ts +0 -1
  93. package/dist/product-paths.js +0 -1
  94. package/dist/protocol.d.ts +0 -1
  95. package/dist/protocol.js +0 -1
  96. package/dist/react-source.d.ts +0 -1
  97. package/dist/react-source.js +0 -1
  98. package/dist/readability.js +1 -1
  99. package/dist/relay-client.d.ts +0 -1
  100. package/dist/relay-client.js +0 -1
  101. package/dist/relay-state.d.ts +0 -1
  102. package/dist/relay-state.js +0 -1
  103. package/dist/replay-ai-index.d.ts +0 -1
  104. package/dist/replay-ai-index.js +0 -1
  105. package/dist/replay-eval.d.ts +0 -1
  106. package/dist/replay-eval.js +0 -1
  107. package/dist/replay-handoff.d.ts +0 -1
  108. package/dist/replay-handoff.js +0 -1
  109. package/dist/replay-workflow-compiler.d.ts +0 -1
  110. package/dist/replay-workflow-compiler.js +0 -1
  111. package/dist/rrweb-recording-relay.d.ts +0 -1
  112. package/dist/rrweb-recording-relay.js +0 -1
  113. package/dist/rrweb-recording.d.ts +0 -1
  114. package/dist/rrweb-recording.js +0 -1
  115. package/dist/scoped-fs.d.ts +0 -1
  116. package/dist/scoped-fs.js +0 -1
  117. package/dist/selector-generator.js +1 -1
  118. package/dist/start-relay-server.d.ts +0 -1
  119. package/dist/start-relay-server.js +0 -1
  120. package/dist/styles-examples.d.ts +0 -1
  121. package/dist/styles-examples.js +0 -1
  122. package/dist/styles.d.ts +0 -1
  123. package/dist/styles.js +0 -1
  124. package/dist/tabwright-agent-skill.d.ts +0 -1
  125. package/dist/tabwright-agent-skill.js +0 -1
  126. package/dist/test-declarations.d.ts +0 -1
  127. package/dist/test-declarations.js +0 -1
  128. package/dist/utils.d.ts +0 -1
  129. package/dist/utils.js +2 -2
  130. package/dist/wait-for-page-load.d.ts +0 -1
  131. package/dist/wait-for-page-load.js +0 -1
  132. package/dist/workflow-capability.d.ts +0 -1
  133. package/dist/workflow-capability.js +0 -1
  134. package/package.json +9 -4
  135. package/readme.md +35 -0
  136. package/dist/aria-snapshot.d.ts.map +0 -1
  137. package/dist/aria-snapshot.js.map +0 -1
  138. package/dist/aria-snapshot.test.d.ts +0 -2
  139. package/dist/aria-snapshot.test.d.ts.map +0 -1
  140. package/dist/aria-snapshot.test.js +0 -270
  141. package/dist/aria-snapshot.test.js.map +0 -1
  142. package/dist/aria-snapshot.unit.test.d.ts +0 -2
  143. package/dist/aria-snapshot.unit.test.d.ts.map +0 -1
  144. package/dist/aria-snapshot.unit.test.js +0 -542
  145. package/dist/aria-snapshot.unit.test.js.map +0 -1
  146. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +0 -1
  147. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +0 -1
  148. package/dist/browser-config.d.ts.map +0 -1
  149. package/dist/browser-config.js.map +0 -1
  150. package/dist/browser-install.d.ts.map +0 -1
  151. package/dist/browser-install.js.map +0 -1
  152. package/dist/browser-launch.d.ts.map +0 -1
  153. package/dist/browser-launch.js.map +0 -1
  154. package/dist/builtin-capabilities.d.ts.map +0 -1
  155. package/dist/builtin-capabilities.js.map +0 -1
  156. package/dist/capability-agent-skill.d.ts.map +0 -1
  157. package/dist/capability-agent-skill.js.map +0 -1
  158. package/dist/capability-auth-state.d.ts.map +0 -1
  159. package/dist/capability-auth-state.js.map +0 -1
  160. package/dist/capability-auth.d.ts.map +0 -1
  161. package/dist/capability-auth.js.map +0 -1
  162. package/dist/capability-cli-confirmation.test.d.ts +0 -2
  163. package/dist/capability-cli-confirmation.test.d.ts.map +0 -1
  164. package/dist/capability-cli-confirmation.test.js +0 -79
  165. package/dist/capability-cli-confirmation.test.js.map +0 -1
  166. package/dist/capability-options.d.ts.map +0 -1
  167. package/dist/capability-options.js.map +0 -1
  168. package/dist/capability-options.test.d.ts +0 -2
  169. package/dist/capability-options.test.d.ts.map +0 -1
  170. package/dist/capability-options.test.js +0 -81
  171. package/dist/capability-options.test.js.map +0 -1
  172. package/dist/capability-package.d.ts.map +0 -1
  173. package/dist/capability-package.js.map +0 -1
  174. package/dist/capability-package.test.d.ts +0 -2
  175. package/dist/capability-package.test.d.ts.map +0 -1
  176. package/dist/capability-package.test.js +0 -179
  177. package/dist/capability-package.test.js.map +0 -1
  178. package/dist/capability-registry.d.ts.map +0 -1
  179. package/dist/capability-registry.js.map +0 -1
  180. package/dist/capability-registry.test.d.ts +0 -2
  181. package/dist/capability-registry.test.d.ts.map +0 -1
  182. package/dist/capability-registry.test.js +0 -1683
  183. package/dist/capability-registry.test.js.map +0 -1
  184. package/dist/capability-runner.d.ts.map +0 -1
  185. package/dist/capability-runner.js.map +0 -1
  186. package/dist/capability-search-relevance.test.d.ts +0 -2
  187. package/dist/capability-search-relevance.test.d.ts.map +0 -1
  188. package/dist/capability-search-relevance.test.js +0 -67
  189. package/dist/capability-search-relevance.test.js.map +0 -1
  190. package/dist/capability-studio.d.ts.map +0 -1
  191. package/dist/capability-studio.js.map +0 -1
  192. package/dist/capability-studio.test.d.ts +0 -2
  193. package/dist/capability-studio.test.d.ts.map +0 -1
  194. package/dist/capability-studio.test.js +0 -41
  195. package/dist/capability-studio.test.js.map +0 -1
  196. package/dist/cdp-log.d.ts.map +0 -1
  197. package/dist/cdp-log.js.map +0 -1
  198. package/dist/cdp-log.test.d.ts +0 -2
  199. package/dist/cdp-log.test.d.ts.map +0 -1
  200. package/dist/cdp-log.test.js +0 -109
  201. package/dist/cdp-log.test.js.map +0 -1
  202. package/dist/cdp-relay.d.ts.map +0 -1
  203. package/dist/cdp-relay.js.map +0 -1
  204. package/dist/cdp-session.d.ts.map +0 -1
  205. package/dist/cdp-session.js.map +0 -1
  206. package/dist/cdp-types.d.ts.map +0 -1
  207. package/dist/cdp-types.js.map +0 -1
  208. package/dist/channel-owner-inspect.test.d.ts +0 -2
  209. package/dist/channel-owner-inspect.test.d.ts.map +0 -1
  210. package/dist/channel-owner-inspect.test.js +0 -75
  211. package/dist/channel-owner-inspect.test.js.map +0 -1
  212. package/dist/chrome-discovery.d.ts.map +0 -1
  213. package/dist/chrome-discovery.js.map +0 -1
  214. package/dist/chrome-discovery.test.d.ts +0 -2
  215. package/dist/chrome-discovery.test.d.ts.map +0 -1
  216. package/dist/chrome-discovery.test.js +0 -41
  217. package/dist/chrome-discovery.test.js.map +0 -1
  218. package/dist/clean-html.d.ts.map +0 -1
  219. package/dist/clean-html.js.map +0 -1
  220. package/dist/cli-help.test.d.ts +0 -2
  221. package/dist/cli-help.test.d.ts.map +0 -1
  222. package/dist/cli-help.test.js +0 -98
  223. package/dist/cli-help.test.js.map +0 -1
  224. package/dist/cli.d.ts.map +0 -1
  225. package/dist/cli.js.map +0 -1
  226. package/dist/cloud-client.d.ts.map +0 -1
  227. package/dist/cloud-client.js.map +0 -1
  228. package/dist/create-logger.d.ts.map +0 -1
  229. package/dist/create-logger.js.map +0 -1
  230. package/dist/debugger-examples-types.d.ts.map +0 -1
  231. package/dist/debugger-examples-types.js.map +0 -1
  232. package/dist/debugger-examples.d.ts.map +0 -1
  233. package/dist/debugger-examples.js.map +0 -1
  234. package/dist/debugger.d.ts.map +0 -1
  235. package/dist/debugger.js.map +0 -1
  236. package/dist/diff-utils.d.ts.map +0 -1
  237. package/dist/diff-utils.js.map +0 -1
  238. package/dist/diff-utils.test.d.ts +0 -2
  239. package/dist/diff-utils.test.d.ts.map +0 -1
  240. package/dist/diff-utils.test.js +0 -137
  241. package/dist/diff-utils.test.js.map +0 -1
  242. package/dist/doctor.d.ts.map +0 -1
  243. package/dist/doctor.js.map +0 -1
  244. package/dist/doctor.test.d.ts +0 -2
  245. package/dist/doctor.test.d.ts.map +0 -1
  246. package/dist/doctor.test.js +0 -208
  247. package/dist/doctor.test.js.map +0 -1
  248. package/dist/editor-examples.d.ts.map +0 -1
  249. package/dist/editor-examples.js.map +0 -1
  250. package/dist/editor.d.ts.map +0 -1
  251. package/dist/editor.js.map +0 -1
  252. package/dist/env-compat.d.ts.map +0 -1
  253. package/dist/env-compat.js.map +0 -1
  254. package/dist/executor.d.ts.map +0 -1
  255. package/dist/executor.js.map +0 -1
  256. package/dist/executor.unit.test.d.ts +0 -2
  257. package/dist/executor.unit.test.d.ts.map +0 -1
  258. package/dist/executor.unit.test.js +0 -143
  259. package/dist/executor.unit.test.js.map +0 -1
  260. package/dist/extension-connection.test.d.ts +0 -2
  261. package/dist/extension-connection.test.d.ts.map +0 -1
  262. package/dist/extension-connection.test.js +0 -708
  263. package/dist/extension-connection.test.js.map +0 -1
  264. package/dist/extension-icon-warning.test.d.ts +0 -2
  265. package/dist/extension-icon-warning.test.d.ts.map +0 -1
  266. package/dist/extension-icon-warning.test.js +0 -33
  267. package/dist/extension-icon-warning.test.js.map +0 -1
  268. package/dist/ghost-browser.d.ts.map +0 -1
  269. package/dist/ghost-browser.js.map +0 -1
  270. package/dist/ghost-cursor-controller.d.ts.map +0 -1
  271. package/dist/ghost-cursor-controller.js.map +0 -1
  272. package/dist/ghost-cursor.d.ts.map +0 -1
  273. package/dist/ghost-cursor.js.map +0 -1
  274. package/dist/htmlrewrite.d.ts.map +0 -1
  275. package/dist/htmlrewrite.js.map +0 -1
  276. package/dist/htmlrewrite.test.d.ts +0 -2
  277. package/dist/htmlrewrite.test.d.ts.map +0 -1
  278. package/dist/htmlrewrite.test.js +0 -7975
  279. package/dist/htmlrewrite.test.js.map +0 -1
  280. package/dist/index.d.ts.map +0 -1
  281. package/dist/index.js.map +0 -1
  282. package/dist/kill-port.d.ts.map +0 -1
  283. package/dist/kill-port.js.map +0 -1
  284. package/dist/kitty-graphics.d.ts.map +0 -1
  285. package/dist/kitty-graphics.js.map +0 -1
  286. package/dist/kitty-graphics.test.d.ts +0 -2
  287. package/dist/kitty-graphics.test.d.ts.map +0 -1
  288. package/dist/kitty-graphics.test.js +0 -125
  289. package/dist/kitty-graphics.test.js.map +0 -1
  290. package/dist/locator-selector.test.d.ts +0 -2
  291. package/dist/locator-selector.test.d.ts.map +0 -1
  292. package/dist/locator-selector.test.js +0 -98
  293. package/dist/locator-selector.test.js.map +0 -1
  294. package/dist/mcp-client.d.ts +0 -20
  295. package/dist/mcp-client.d.ts.map +0 -1
  296. package/dist/mcp-client.js +0 -56
  297. package/dist/mcp-client.js.map +0 -1
  298. package/dist/mcp.d.ts.map +0 -1
  299. package/dist/mcp.js.map +0 -1
  300. package/dist/on-mouse-action.test.d.ts +0 -2
  301. package/dist/on-mouse-action.test.d.ts.map +0 -1
  302. package/dist/on-mouse-action.test.js +0 -180
  303. package/dist/on-mouse-action.test.js.map +0 -1
  304. package/dist/options-page.test.d.ts +0 -2
  305. package/dist/options-page.test.d.ts.map +0 -1
  306. package/dist/options-page.test.js +0 -773
  307. package/dist/options-page.test.js.map +0 -1
  308. package/dist/package-paths.d.ts.map +0 -1
  309. package/dist/package-paths.js.map +0 -1
  310. package/dist/page-markdown.d.ts.map +0 -1
  311. package/dist/page-markdown.js.map +0 -1
  312. package/dist/performance-examples.d.ts.map +0 -1
  313. package/dist/performance-examples.js.map +0 -1
  314. package/dist/playwright-import.d.ts.map +0 -1
  315. package/dist/playwright-import.js.map +0 -1
  316. package/dist/popup-relocation.test.d.ts +0 -7
  317. package/dist/popup-relocation.test.d.ts.map +0 -1
  318. package/dist/popup-relocation.test.js +0 -139
  319. package/dist/popup-relocation.test.js.map +0 -1
  320. package/dist/product-paths.d.ts.map +0 -1
  321. package/dist/product-paths.js.map +0 -1
  322. package/dist/product-paths.test.d.ts +0 -2
  323. package/dist/product-paths.test.d.ts.map +0 -1
  324. package/dist/product-paths.test.js +0 -39
  325. package/dist/product-paths.test.js.map +0 -1
  326. package/dist/protocol.d.ts.map +0 -1
  327. package/dist/protocol.js.map +0 -1
  328. package/dist/protocol.test.d.ts +0 -2
  329. package/dist/protocol.test.d.ts.map +0 -1
  330. package/dist/protocol.test.js +0 -31
  331. package/dist/protocol.test.js.map +0 -1
  332. package/dist/react-source.d.ts.map +0 -1
  333. package/dist/react-source.js.map +0 -1
  334. package/dist/relay-client.d.ts.map +0 -1
  335. package/dist/relay-client.js.map +0 -1
  336. package/dist/relay-client.test.d.ts +0 -2
  337. package/dist/relay-client.test.d.ts.map +0 -1
  338. package/dist/relay-client.test.js +0 -305
  339. package/dist/relay-client.test.js.map +0 -1
  340. package/dist/relay-core.test.d.ts +0 -2
  341. package/dist/relay-core.test.d.ts.map +0 -1
  342. package/dist/relay-core.test.js +0 -1427
  343. package/dist/relay-core.test.js.map +0 -1
  344. package/dist/relay-navigation.test.d.ts +0 -2
  345. package/dist/relay-navigation.test.d.ts.map +0 -1
  346. package/dist/relay-navigation.test.js +0 -661
  347. package/dist/relay-navigation.test.js.map +0 -1
  348. package/dist/relay-session.test.d.ts +0 -2
  349. package/dist/relay-session.test.d.ts.map +0 -1
  350. package/dist/relay-session.test.js +0 -1121
  351. package/dist/relay-session.test.js.map +0 -1
  352. package/dist/relay-state.d.ts.map +0 -1
  353. package/dist/relay-state.js.map +0 -1
  354. package/dist/relay-state.test.d.ts +0 -2
  355. package/dist/relay-state.test.d.ts.map +0 -1
  356. package/dist/relay-state.test.js +0 -594
  357. package/dist/relay-state.test.js.map +0 -1
  358. package/dist/replay-ai-index.d.ts.map +0 -1
  359. package/dist/replay-ai-index.js.map +0 -1
  360. package/dist/replay-ai-index.test.d.ts +0 -2
  361. package/dist/replay-ai-index.test.d.ts.map +0 -1
  362. package/dist/replay-ai-index.test.js +0 -255
  363. package/dist/replay-ai-index.test.js.map +0 -1
  364. package/dist/replay-cli.test.d.ts +0 -2
  365. package/dist/replay-cli.test.d.ts.map +0 -1
  366. package/dist/replay-cli.test.js +0 -275
  367. package/dist/replay-cli.test.js.map +0 -1
  368. package/dist/replay-eval.d.ts.map +0 -1
  369. package/dist/replay-eval.js.map +0 -1
  370. package/dist/replay-handoff.d.ts.map +0 -1
  371. package/dist/replay-handoff.js.map +0 -1
  372. package/dist/replay-handoff.test.d.ts +0 -2
  373. package/dist/replay-handoff.test.d.ts.map +0 -1
  374. package/dist/replay-handoff.test.js +0 -123
  375. package/dist/replay-handoff.test.js.map +0 -1
  376. package/dist/replay-workflow-compiler.d.ts.map +0 -1
  377. package/dist/replay-workflow-compiler.js.map +0 -1
  378. package/dist/replay-workflow-compiler.test.d.ts +0 -2
  379. package/dist/replay-workflow-compiler.test.d.ts.map +0 -1
  380. package/dist/replay-workflow-compiler.test.js +0 -223
  381. package/dist/replay-workflow-compiler.test.js.map +0 -1
  382. package/dist/rrweb-recording-relay.d.ts.map +0 -1
  383. package/dist/rrweb-recording-relay.js.map +0 -1
  384. package/dist/rrweb-recording-relay.test.d.ts +0 -2
  385. package/dist/rrweb-recording-relay.test.d.ts.map +0 -1
  386. package/dist/rrweb-recording-relay.test.js +0 -85
  387. package/dist/rrweb-recording-relay.test.js.map +0 -1
  388. package/dist/rrweb-recording.d.ts.map +0 -1
  389. package/dist/rrweb-recording.js.map +0 -1
  390. package/dist/scoped-fs.d.ts.map +0 -1
  391. package/dist/scoped-fs.js.map +0 -1
  392. package/dist/scoped-fs.test.d.ts +0 -5
  393. package/dist/scoped-fs.test.d.ts.map +0 -1
  394. package/dist/scoped-fs.test.js +0 -73
  395. package/dist/scoped-fs.test.js.map +0 -1
  396. package/dist/skill-stub.test.d.ts +0 -2
  397. package/dist/skill-stub.test.d.ts.map +0 -1
  398. package/dist/skill-stub.test.js +0 -22
  399. package/dist/skill-stub.test.js.map +0 -1
  400. package/dist/snapshot-tools.test.d.ts +0 -2
  401. package/dist/snapshot-tools.test.d.ts.map +0 -1
  402. package/dist/snapshot-tools.test.js +0 -856
  403. package/dist/snapshot-tools.test.js.map +0 -1
  404. package/dist/start-relay-server.d.ts.map +0 -1
  405. package/dist/start-relay-server.js.map +0 -1
  406. package/dist/styles-examples.d.ts.map +0 -1
  407. package/dist/styles-examples.js.map +0 -1
  408. package/dist/styles.d.ts.map +0 -1
  409. package/dist/styles.js.map +0 -1
  410. package/dist/tabwright-agent-skill.d.ts.map +0 -1
  411. package/dist/tabwright-agent-skill.js.map +0 -1
  412. package/dist/tabwright-agent-skill.test.d.ts +0 -2
  413. package/dist/tabwright-agent-skill.test.d.ts.map +0 -1
  414. package/dist/tabwright-agent-skill.test.js +0 -51
  415. package/dist/tabwright-agent-skill.test.js.map +0 -1
  416. package/dist/test-declarations.d.ts.map +0 -1
  417. package/dist/test-declarations.js.map +0 -1
  418. package/dist/test-utils.d.ts +0 -69
  419. package/dist/test-utils.d.ts.map +0 -1
  420. package/dist/test-utils.js +0 -448
  421. package/dist/test-utils.js.map +0 -1
  422. package/dist/test-utils.test.d.ts +0 -2
  423. package/dist/test-utils.test.d.ts.map +0 -1
  424. package/dist/test-utils.test.js +0 -55
  425. package/dist/test-utils.test.js.map +0 -1
  426. package/dist/utils.d.ts.map +0 -1
  427. package/dist/utils.js.map +0 -1
  428. package/dist/wait-for-page-load.d.ts.map +0 -1
  429. package/dist/wait-for-page-load.js.map +0 -1
  430. package/dist/workflow-capability.d.ts.map +0 -1
  431. package/dist/workflow-capability.js.map +0 -1
  432. package/dist/workflow-script-flow.test.d.ts +0 -2
  433. package/dist/workflow-script-flow.test.d.ts.map +0 -1
  434. package/dist/workflow-script-flow.test.js +0 -285
  435. package/dist/workflow-script-flow.test.js.map +0 -1
  436. package/src/__snapshots__/x.com.processed.html +0 -1003
  437. package/src/__snapshots__/x.com.processed.withStyles.html +0 -2720
  438. package/src/a11y-client.ts +0 -241
  439. package/src/aria-snapshot.test.ts +0 -311
  440. package/src/aria-snapshot.ts +0 -1681
  441. package/src/aria-snapshot.unit.test.ts +0 -615
  442. package/src/aria-snapshots/github-interactive.txt +0 -193
  443. package/src/aria-snapshots/github-raw.txt +0 -309
  444. package/src/aria-snapshots/hackernews-interactive.txt +0 -477
  445. package/src/aria-snapshots/hackernews-raw.txt +0 -428
  446. package/src/aria-snapshots/prosemirror-interactive.txt +0 -66
  447. package/src/aria-snapshots/prosemirror-raw.txt +0 -145
  448. package/src/assets/aria-labels-hacker-news.png +0 -0
  449. package/src/assets/aria-labels-old-reddit.png +0 -0
  450. package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +0 -5
  451. package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +0 -18
  452. package/src/assets/x.com.html +0 -32946
  453. package/src/browser-config.ts +0 -179
  454. package/src/browser-install.ts +0 -284
  455. package/src/browser-launch.ts +0 -75
  456. package/src/builtin-capabilities.ts +0 -2765
  457. package/src/capability-agent-skill.ts +0 -305
  458. package/src/capability-auth-state.ts +0 -197
  459. package/src/capability-auth.ts +0 -249
  460. package/src/capability-cli-confirmation.test.ts +0 -90
  461. package/src/capability-options.test.ts +0 -89
  462. package/src/capability-options.ts +0 -57
  463. package/src/capability-package.test.ts +0 -204
  464. package/src/capability-package.ts +0 -555
  465. package/src/capability-registry.test.ts +0 -1905
  466. package/src/capability-registry.ts +0 -1234
  467. package/src/capability-runner.ts +0 -801
  468. package/src/capability-search-relevance.test.ts +0 -73
  469. package/src/capability-studio.test.ts +0 -45
  470. package/src/capability-studio.ts +0 -641
  471. package/src/cdp-log.test.ts +0 -131
  472. package/src/cdp-log.ts +0 -112
  473. package/src/cdp-relay.ts +0 -2944
  474. package/src/cdp-session.ts +0 -77
  475. package/src/cdp-types.ts +0 -158
  476. package/src/channel-owner-inspect.test.ts +0 -94
  477. package/src/chrome-discovery.test.ts +0 -50
  478. package/src/chrome-discovery.ts +0 -220
  479. package/src/clean-html.ts +0 -141
  480. package/src/cli-help.test.ts +0 -123
  481. package/src/cli.ts +0 -3181
  482. package/src/cloud-client.ts +0 -179
  483. package/src/create-logger.ts +0 -38
  484. package/src/debugger-examples-types.ts +0 -16
  485. package/src/debugger-examples.ts +0 -66
  486. package/src/debugger.ts +0 -708
  487. package/src/diff-utils.test.ts +0 -152
  488. package/src/diff-utils.ts +0 -70
  489. package/src/doctor.test.ts +0 -244
  490. package/src/doctor.ts +0 -321
  491. package/src/editor-examples.ts +0 -158
  492. package/src/editor.ts +0 -426
  493. package/src/env-compat.ts +0 -28
  494. package/src/executor.ts +0 -1824
  495. package/src/executor.unit.test.ts +0 -168
  496. package/src/extension-connection.test.ts +0 -855
  497. package/src/extension-icon-warning.test.ts +0 -45
  498. package/src/ghost-browser.ts +0 -149
  499. package/src/ghost-cursor-client.ts +0 -494
  500. package/src/ghost-cursor-controller.ts +0 -129
  501. package/src/ghost-cursor.ts +0 -123
  502. package/src/htmlrewrite.test.ts +0 -8008
  503. package/src/htmlrewrite.ts +0 -390
  504. package/src/index.ts +0 -53
  505. package/src/kill-port.ts +0 -219
  506. package/src/kitty-graphics.test.ts +0 -139
  507. package/src/kitty-graphics.ts +0 -79
  508. package/src/locator-selector.test.ts +0 -119
  509. package/src/mcp-client.ts +0 -78
  510. package/src/mcp.ts +0 -629
  511. package/src/on-mouse-action.test.ts +0 -226
  512. package/src/options-page.test.ts +0 -839
  513. package/src/package-paths.ts +0 -38
  514. package/src/page-markdown.ts +0 -240
  515. package/src/performance-examples.ts +0 -186
  516. package/src/playwright-import.ts +0 -59
  517. package/src/popup-relocation.test.ts +0 -163
  518. package/src/product-paths.test.ts +0 -47
  519. package/src/product-paths.ts +0 -28
  520. package/src/protocol.test.ts +0 -52
  521. package/src/protocol.ts +0 -351
  522. package/src/react-source.ts +0 -379
  523. package/src/relay-client.test.ts +0 -375
  524. package/src/relay-client.ts +0 -572
  525. package/src/relay-core.test.ts +0 -1603
  526. package/src/relay-navigation.test.ts +0 -790
  527. package/src/relay-session.test.ts +0 -1375
  528. package/src/relay-state.test.ts +0 -729
  529. package/src/relay-state.ts +0 -561
  530. package/src/replay-ai-index.test.ts +0 -278
  531. package/src/replay-ai-index.ts +0 -872
  532. package/src/replay-cli.test.ts +0 -325
  533. package/src/replay-eval.ts +0 -1039
  534. package/src/replay-handoff.test.ts +0 -163
  535. package/src/replay-handoff.ts +0 -109
  536. package/src/replay-workflow-compiler.test.ts +0 -250
  537. package/src/replay-workflow-compiler.ts +0 -700
  538. package/src/resource.md +0 -409
  539. package/src/rrweb-recording-relay.test.ts +0 -99
  540. package/src/rrweb-recording-relay.ts +0 -400
  541. package/src/rrweb-recording.ts +0 -322
  542. package/src/scoped-fs.test.ts +0 -80
  543. package/src/scoped-fs.ts +0 -420
  544. package/src/skill-stub.test.ts +0 -24
  545. package/src/snapshot-tools.test.ts +0 -1017
  546. package/src/snapshots/hacker-news-accessibility-full.md +0 -81
  547. package/src/snapshots/hacker-news-accessibility-interactive.md +0 -43
  548. package/src/snapshots/page-markdown-output.txt +0 -16
  549. package/src/snapshots/shadcn-ui-accessibility-full.md +0 -201
  550. package/src/snapshots/shadcn-ui-accessibility-interactive.md +0 -109
  551. package/src/start-relay-server.ts +0 -69
  552. package/src/styles-examples.ts +0 -84
  553. package/src/styles.ts +0 -343
  554. package/src/tabwright-agent-skill.test.ts +0 -61
  555. package/src/tabwright-agent-skill.ts +0 -105
  556. package/src/test-declarations.ts +0 -13
  557. package/src/test-utils.test.ts +0 -70
  558. package/src/test-utils.ts +0 -566
  559. package/src/utils.ts +0 -78
  560. package/src/wait-for-page-load.ts +0 -198
  561. package/src/workflow-capability.ts +0 -417
  562. package/src/workflow-script-flow.test.ts +0 -388
@@ -1,561 +0,0 @@
1
- /**
2
- * Centralized relay state: one immutable atom for domain state + runtime resources.
3
- *
4
- * Follows the zustand-centralized-state skill pattern:
5
- * - Single Zustand vanilla store holds all relay state
6
- * - setState() callbacks remain deterministic data transitions
7
- * - Runtime resources (WebSocket/timers/pending callbacks) are co-located on
8
- * each extension entry in the same map
9
- *
10
- * See docs/plan-centralize-relay-state.md for the full refactor plan.
11
- */
12
- import { createStore, type StoreApi } from 'zustand/vanilla'
13
- import type { WSContext } from 'hono/ws'
14
- import type WebSocket from 'ws'
15
- import type { Protocol } from './cdp-types.js'
16
- import { EXTENSION_FEATURE } from './protocol.js'
17
-
18
- // ---------------------------------------------------------------------------
19
- // Types
20
- // ---------------------------------------------------------------------------
21
-
22
- export type ConnectedTarget = {
23
- sessionId: string
24
- targetId: string
25
- targetInfo: Protocol.Target.TargetInfo
26
- frameIds: Set<string>
27
- }
28
-
29
- export type ExtensionInfo = {
30
- browser?: string
31
- email?: string
32
- id?: string
33
- installId?: string
34
- /** Tabwright package version the extension was built with (sent as ?v= query param) */
35
- version?: string
36
- /** Extension/relay protocol version sent during the additive query-string handshake. */
37
- protocolVersion?: number
38
- /** Optional features supported by this extension. Missing means a legacy connection. */
39
- features?: string[]
40
- }
41
-
42
- export type ExtensionPendingRequest = {
43
- resolve: (result: unknown) => void
44
- reject: (error: Error) => void
45
- }
46
-
47
- /**
48
- * Single aggregated extension object: domain state + runtime I/O.
49
- */
50
- export type ExtensionEntry = {
51
- id: string
52
- info: ExtensionInfo
53
- stableKey: string
54
- connectedTargets: Map<string, ConnectedTarget>
55
- // Runtime I/O fields
56
- ws: WSContext<WebSocket> | null
57
- pendingRequests: Map<number, ExtensionPendingRequest>
58
- messageId: number
59
- pingInterval: ReturnType<typeof setInterval> | null
60
- lastPongAt: number | null
61
- }
62
-
63
- export type PlaywrightClient = {
64
- id: string
65
- extensionId: string | null
66
- ws: WSContext
67
- }
68
-
69
- export type RelayState = {
70
- extensions: Map<string, ExtensionEntry>
71
- playwrightClients: Map<string, PlaywrightClient>
72
- }
73
-
74
- export const EXTENSION_HEARTBEAT_TIMEOUT_MS = 15_000
75
-
76
- export type ExtensionNegotiationStatus = {
77
- connectionHealth: 'ready' | 'limited' | 'legacy'
78
- missingFeatures: string[]
79
- }
80
-
81
- // ---------------------------------------------------------------------------
82
- // Store factory
83
- // ---------------------------------------------------------------------------
84
-
85
- export function createRelayStore(): StoreApi<RelayState> {
86
- return createStore<RelayState>(() => ({
87
- extensions: new Map(),
88
- playwrightClients: new Map(),
89
- }))
90
- }
91
-
92
- // ---------------------------------------------------------------------------
93
- // Derivation helpers
94
- // ---------------------------------------------------------------------------
95
-
96
- export function getExtensionNegotiationStatus(info: ExtensionInfo | undefined): ExtensionNegotiationStatus {
97
- if (!info?.features) {
98
- return { connectionHealth: 'legacy', missingFeatures: [] }
99
- }
100
- const missingFeatures = Object.values(EXTENSION_FEATURE).filter((feature) => {
101
- return !info.features?.includes(feature)
102
- })
103
- return {
104
- connectionHealth: missingFeatures.length === 0 ? 'ready' : 'limited',
105
- missingFeatures,
106
- }
107
- }
108
-
109
- /**
110
- * Linear scan over extensions to find one by stableKey. With <10 extensions this is free.
111
- * Returns the LAST (newest) match because during reconnect both old and new connections
112
- * coexist briefly. Map iteration order is insertion order, so last wins.
113
- */
114
- export function findExtensionByStableKey(state: RelayState, stableKey: string): ExtensionEntry | undefined {
115
- let match: ExtensionEntry | undefined
116
- for (const ext of state.extensions.values()) {
117
- if (ext.stableKey === stableKey) {
118
- match = ext
119
- }
120
- }
121
- return match
122
- }
123
-
124
- export function buildStableExtensionKey(info: ExtensionInfo, connectionId: string): string {
125
- // chrome.identity ids and emails identify the signed-in Google account, not
126
- // the Chrome profile. Use the per-profile extension storage install id first
127
- // so two profiles signed into the same account never replace each other.
128
- if (info.installId) {
129
- return `install:${info.browser || 'unknown'}:${info.installId}`
130
- }
131
- if (info.id) {
132
- return `profile:${info.id}`
133
- }
134
- if (info.email) {
135
- return `email:${info.email}`
136
- }
137
- if (info.browser) {
138
- return `browser:${info.browser}`
139
- }
140
- return `connection:${connectionId}`
141
- }
142
-
143
- /** Find which extension owns a CDP tab sessionId (e.g. "pw-tab-1"). */
144
- export function findExtensionIdByCdpSession(state: RelayState, cdpSessionId: string): string | null {
145
- for (const [connectionId, ext] of state.extensions.entries()) {
146
- if (ext.connectedTargets.has(cdpSessionId)) {
147
- return connectionId
148
- }
149
- }
150
- return null
151
- }
152
-
153
- export function hasExtensionHeartbeatExpired({
154
- lastPongAt,
155
- now,
156
- timeoutMs = EXTENSION_HEARTBEAT_TIMEOUT_MS,
157
- }: {
158
- lastPongAt: number | null
159
- now: number
160
- timeoutMs?: number
161
- }): boolean {
162
- if (lastPongAt === null) {
163
- return false
164
- }
165
- return now - lastPongAt > timeoutMs
166
- }
167
-
168
- // ---------------------------------------------------------------------------
169
- // Pure state transition functions
170
- //
171
- // Each takes RelayState + event data and returns a new RelayState.
172
- // No I/O, no side effects. Testable with data in / data out.
173
- // ---------------------------------------------------------------------------
174
-
175
- /**
176
- * Add a new extension connection.
177
- * Does NOT remove an existing connection with the same stableKey — that old
178
- * connection stays routable until its WebSocket onClose fires and calls
179
- * removeExtension(). This preserves in-flight message routing during reconnect.
180
- * findExtensionByStableKey() returns the newest match so stableKey lookups
181
- * resolve to the new connection immediately.
182
- */
183
- export function addExtension(
184
- state: RelayState,
185
- {
186
- id,
187
- info,
188
- stableKey,
189
- ws,
190
- }: {
191
- id: string
192
- info: ExtensionInfo
193
- stableKey: string
194
- ws: WSContext<WebSocket> | null
195
- },
196
- ): RelayState {
197
- const newExtensions = new Map(state.extensions)
198
-
199
- newExtensions.set(id, {
200
- id,
201
- info,
202
- stableKey,
203
- connectedTargets: new Map(),
204
- ws,
205
- pendingRequests: new Map(),
206
- messageId: 0,
207
- pingInterval: null,
208
- lastPongAt: null,
209
- })
210
- return { ...state, extensions: newExtensions }
211
- }
212
-
213
- /** Remove an extension, its targets, and any playwright clients bound to it. */
214
- export function removeExtension(state: RelayState, { extensionId }: { extensionId: string }): RelayState {
215
- if (!state.extensions.has(extensionId)) {
216
- return state
217
- }
218
- const newExtensions = new Map(state.extensions)
219
- newExtensions.delete(extensionId)
220
-
221
- // Also remove playwright clients bound to this extension
222
- const clientsToRemove = Array.from(state.playwrightClients.values())
223
- .filter((client) => client.extensionId === extensionId)
224
- if (clientsToRemove.length === 0) {
225
- return { ...state, extensions: newExtensions }
226
- }
227
-
228
- const newClients = new Map(state.playwrightClients)
229
- for (const client of clientsToRemove) {
230
- newClients.delete(client.id)
231
- }
232
- return { ...state, extensions: newExtensions, playwrightClients: newClients }
233
- }
234
-
235
- /** Add a playwright client (state + ws handle co-located). */
236
- export function addPlaywrightClient(
237
- state: RelayState,
238
- { id, extensionId, ws }: { id: string; extensionId: string | null; ws: WSContext },
239
- ): RelayState {
240
- const newClients = new Map(state.playwrightClients)
241
- newClients.set(id, { id, extensionId, ws })
242
- return { ...state, playwrightClients: newClients }
243
- }
244
-
245
- /** Remove a playwright client. */
246
- export function removePlaywrightClient(state: RelayState, { clientId }: { clientId: string }): RelayState {
247
- if (!state.playwrightClients.has(clientId)) {
248
- return state
249
- }
250
- const newClients = new Map(state.playwrightClients)
251
- newClients.delete(clientId)
252
- return { ...state, playwrightClients: newClients }
253
- }
254
-
255
- /** Rebind all clients from one extension id to another. */
256
- export function rebindClientsToExtension(
257
- state: RelayState,
258
- { fromExtensionId, toExtensionId }: { fromExtensionId: string; toExtensionId: string },
259
- ): RelayState {
260
- if (fromExtensionId === toExtensionId) {
261
- return state
262
- }
263
-
264
- let updated = false
265
- const newClients = new Map(state.playwrightClients)
266
- for (const [clientId, client] of newClients) {
267
- if (client.extensionId !== fromExtensionId) {
268
- continue
269
- }
270
- newClients.set(clientId, { ...client, extensionId: toExtensionId })
271
- updated = true
272
- }
273
-
274
- if (!updated) {
275
- return state
276
- }
277
-
278
- return { ...state, playwrightClients: newClients }
279
- }
280
-
281
- /** Update an extension entry's I/O fields (ws, pingInterval, lastPongAt). */
282
- export function updateExtensionIO(
283
- state: RelayState,
284
- {
285
- extensionId,
286
- ws,
287
- pingInterval,
288
- lastPongAt,
289
- }: {
290
- extensionId: string
291
- ws?: WSContext<WebSocket> | null
292
- pingInterval?: ReturnType<typeof setInterval> | null
293
- lastPongAt?: number | null
294
- },
295
- ): RelayState {
296
- const ext = state.extensions.get(extensionId)
297
- if (!ext) {
298
- return state
299
- }
300
- const newExtensions = new Map(state.extensions)
301
- newExtensions.set(extensionId, {
302
- ...ext,
303
- ...(ws !== undefined ? { ws } : {}),
304
- ...(pingInterval !== undefined ? { pingInterval } : {}),
305
- ...(lastPongAt !== undefined ? { lastPongAt } : {}),
306
- })
307
- return { ...state, extensions: newExtensions }
308
- }
309
-
310
- /** Add or replace one pending extension request callback pair. */
311
- export function addExtensionPendingRequest(
312
- state: RelayState,
313
- {
314
- extensionId,
315
- requestId,
316
- pendingRequest,
317
- }: {
318
- extensionId: string
319
- requestId: number
320
- pendingRequest: ExtensionPendingRequest
321
- },
322
- ): RelayState {
323
- const ext = state.extensions.get(extensionId)
324
- if (!ext) {
325
- return state
326
- }
327
-
328
- const pendingRequests = new Map(ext.pendingRequests)
329
- pendingRequests.set(requestId, pendingRequest)
330
- const newExtensions = new Map(state.extensions)
331
- newExtensions.set(extensionId, { ...ext, pendingRequests })
332
- return { ...state, extensions: newExtensions }
333
- }
334
-
335
- /** Remove one pending extension request callback pair. */
336
- export function removeExtensionPendingRequest(
337
- state: RelayState,
338
- { extensionId, requestId }: { extensionId: string; requestId: number },
339
- ): RelayState {
340
- const ext = state.extensions.get(extensionId)
341
- if (!ext || !ext.pendingRequests.has(requestId)) {
342
- return state
343
- }
344
-
345
- const pendingRequests = new Map(ext.pendingRequests)
346
- pendingRequests.delete(requestId)
347
- const newExtensions = new Map(state.extensions)
348
- newExtensions.set(extensionId, { ...ext, pendingRequests })
349
- return { ...state, extensions: newExtensions }
350
- }
351
-
352
- /** Add a target to an extension's connectedTargets. No-op if extension doesn't exist. */
353
- export function addTarget(
354
- state: RelayState,
355
- {
356
- extensionId,
357
- sessionId,
358
- targetId,
359
- targetInfo,
360
- existingFrameIds,
361
- }: {
362
- extensionId: string
363
- sessionId: string
364
- targetId: string
365
- targetInfo: Protocol.Target.TargetInfo
366
- /** Preserve existing frameIds if target already existed (update scenario). */
367
- existingFrameIds?: Set<string>
368
- },
369
- ): RelayState {
370
- const ext = state.extensions.get(extensionId)
371
- if (!ext) {
372
- return state
373
- }
374
-
375
- const existingTarget = ext.connectedTargets.get(sessionId)
376
- const newTargets = new Map(ext.connectedTargets)
377
- newTargets.set(sessionId, {
378
- sessionId,
379
- targetId,
380
- targetInfo,
381
- frameIds: existingFrameIds ?? existingTarget?.frameIds ?? new Set(),
382
- })
383
-
384
- const newExtensions = new Map(state.extensions)
385
- newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
386
- return { ...state, extensions: newExtensions }
387
- }
388
-
389
- /** Remove a target by sessionId. No-op if extension or target doesn't exist. */
390
- export function removeTarget(
391
- state: RelayState,
392
- { extensionId, sessionId }: { extensionId: string; sessionId: string },
393
- ): RelayState {
394
- const ext = state.extensions.get(extensionId)
395
- if (!ext || !ext.connectedTargets.has(sessionId)) {
396
- return state
397
- }
398
-
399
- const newTargets = new Map(ext.connectedTargets)
400
- newTargets.delete(sessionId)
401
-
402
- const newExtensions = new Map(state.extensions)
403
- newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
404
- return { ...state, extensions: newExtensions }
405
- }
406
-
407
- /** Remove a crashed target by targetId (not sessionId). */
408
- export function removeTargetByCrash(
409
- state: RelayState,
410
- { extensionId, targetId }: { extensionId: string; targetId: string },
411
- ): RelayState {
412
- const ext = state.extensions.get(extensionId)
413
- if (!ext) {
414
- return state
415
- }
416
-
417
- let found = false
418
- const newTargets = new Map(ext.connectedTargets)
419
- for (const [sid, target] of newTargets) {
420
- if (target.targetId === targetId) {
421
- newTargets.delete(sid)
422
- found = true
423
- break
424
- }
425
- }
426
-
427
- if (!found) {
428
- return state
429
- }
430
-
431
- const newExtensions = new Map(state.extensions)
432
- newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
433
- return { ...state, extensions: newExtensions }
434
- }
435
-
436
- /** Update targetInfo on a target matched by targetId. */
437
- export function updateTargetInfo(
438
- state: RelayState,
439
- { extensionId, targetInfo }: { extensionId: string; targetInfo: Protocol.Target.TargetInfo },
440
- ): RelayState {
441
- const ext = state.extensions.get(extensionId)
442
- if (!ext) {
443
- return state
444
- }
445
-
446
- let updated = false
447
- const newTargets = new Map(ext.connectedTargets)
448
- for (const [sid, target] of newTargets) {
449
- if (target.targetId === targetInfo.targetId) {
450
- newTargets.set(sid, { ...target, targetInfo })
451
- updated = true
452
- break
453
- }
454
- }
455
-
456
- if (!updated) {
457
- return state
458
- }
459
-
460
- const newExtensions = new Map(state.extensions)
461
- newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
462
- return { ...state, extensions: newExtensions }
463
- }
464
-
465
- /** Add a frameId to a target's frameIds set. */
466
- export function addFrameId(
467
- state: RelayState,
468
- { extensionId, sessionId, frameId }: { extensionId: string; sessionId: string; frameId: string },
469
- ): RelayState {
470
- const ext = state.extensions.get(extensionId)
471
- if (!ext) {
472
- return state
473
- }
474
- const target = ext.connectedTargets.get(sessionId)
475
- if (!target) {
476
- return state
477
- }
478
-
479
- // Already present — no-op
480
- if (target.frameIds.has(frameId)) {
481
- return state
482
- }
483
-
484
- const newFrameIds = new Set(target.frameIds)
485
- newFrameIds.add(frameId)
486
-
487
- const newTargets = new Map(ext.connectedTargets)
488
- newTargets.set(sessionId, { ...target, frameIds: newFrameIds })
489
-
490
- const newExtensions = new Map(state.extensions)
491
- newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
492
- return { ...state, extensions: newExtensions }
493
- }
494
-
495
- /** Remove a frameId from the target that owns it (scans all targets in the extension). */
496
- export function removeFrameId(
497
- state: RelayState,
498
- { extensionId, frameId }: { extensionId: string; frameId: string },
499
- ): RelayState {
500
- const ext = state.extensions.get(extensionId)
501
- if (!ext) {
502
- return state
503
- }
504
-
505
- for (const [sid, target] of ext.connectedTargets) {
506
- if (target.frameIds.has(frameId)) {
507
- const newFrameIds = new Set(target.frameIds)
508
- newFrameIds.delete(frameId)
509
-
510
- const newTargets = new Map(ext.connectedTargets)
511
- newTargets.set(sid, { ...target, frameIds: newFrameIds })
512
-
513
- const newExtensions = new Map(state.extensions)
514
- newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
515
- return { ...state, extensions: newExtensions }
516
- }
517
- }
518
-
519
- return state
520
- }
521
-
522
- /**
523
- * Update URL (and optionally title) on a target.
524
- * Used by Page.frameNavigated (top-level) and Page.navigatedWithinDocument.
525
- */
526
- export function updateTargetUrl(
527
- state: RelayState,
528
- {
529
- extensionId,
530
- sessionId,
531
- url,
532
- title,
533
- }: {
534
- extensionId: string
535
- sessionId: string
536
- url: string
537
- title?: string
538
- },
539
- ): RelayState {
540
- const ext = state.extensions.get(extensionId)
541
- if (!ext) {
542
- return state
543
- }
544
- const target = ext.connectedTargets.get(sessionId)
545
- if (!target) {
546
- return state
547
- }
548
-
549
- const newTargetInfo = {
550
- ...target.targetInfo,
551
- url,
552
- ...(title !== undefined ? { title } : {}),
553
- }
554
-
555
- const newTargets = new Map(ext.connectedTargets)
556
- newTargets.set(sessionId, { ...target, targetInfo: newTargetInfo })
557
-
558
- const newExtensions = new Map(state.extensions)
559
- newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
560
- return { ...state, extensions: newExtensions }
561
- }