tabwright 1.0.0 → 2.0.0

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 (568) hide show
  1. package/dist/agent-skills/tabwright/SKILL.md +3 -0
  2. package/dist/aria-snapshot.d.ts +0 -1
  3. package/dist/aria-snapshot.js +9 -1
  4. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +0 -1
  5. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +0 -1
  6. package/dist/bippy.js +5 -5
  7. package/dist/browser-config.d.ts +0 -1
  8. package/dist/browser-config.js +0 -1
  9. package/dist/browser-install.d.ts +0 -1
  10. package/dist/browser-install.js +0 -1
  11. package/dist/browser-launch.d.ts +0 -1
  12. package/dist/browser-launch.js +0 -1
  13. package/dist/capability-agent-skill.d.ts +0 -1
  14. package/dist/capability-agent-skill.js +0 -1
  15. package/dist/capability-auth-state.d.ts +0 -1
  16. package/dist/capability-auth-state.js +0 -1
  17. package/dist/capability-auth.d.ts +0 -1
  18. package/dist/capability-auth.js +0 -1
  19. package/dist/capability-options.d.ts +0 -1
  20. package/dist/capability-options.js +0 -1
  21. package/dist/capability-package.d.ts +0 -1
  22. package/dist/capability-package.js +47 -2
  23. package/dist/capability-registry.d.ts +0 -1
  24. package/dist/capability-registry.js +0 -1
  25. package/dist/capability-runner.d.ts +0 -1
  26. package/dist/capability-runner.js +0 -1
  27. package/dist/capability-studio.d.ts +0 -1
  28. package/dist/capability-studio.js +0 -1
  29. package/dist/cdp-log.d.ts +0 -1
  30. package/dist/cdp-log.js +0 -1
  31. package/dist/cdp-relay.d.ts +0 -1
  32. package/dist/cdp-relay.js +0 -1
  33. package/dist/cdp-session.d.ts +0 -1
  34. package/dist/cdp-session.js +0 -1
  35. package/dist/cdp-types.d.ts +0 -1
  36. package/dist/cdp-types.js +0 -1
  37. package/dist/chrome-discovery.d.ts +0 -1
  38. package/dist/chrome-discovery.js +0 -1
  39. package/dist/clean-html.d.ts +0 -1
  40. package/dist/clean-html.js +0 -1
  41. package/dist/cli.d.ts +0 -1
  42. package/dist/cli.js +10 -56
  43. package/dist/cloud-client.d.ts +0 -1
  44. package/dist/cloud-client.js +0 -1
  45. package/dist/create-logger.d.ts +0 -1
  46. package/dist/create-logger.js +0 -1
  47. package/dist/debugger-examples-types.d.ts +0 -1
  48. package/dist/debugger-examples-types.js +0 -1
  49. package/dist/debugger-examples.d.ts +0 -1
  50. package/dist/debugger-examples.js +0 -1
  51. package/dist/debugger.d.ts +0 -1
  52. package/dist/debugger.js +0 -1
  53. package/dist/diff-utils.d.ts +0 -1
  54. package/dist/diff-utils.js +0 -1
  55. package/dist/doctor.d.ts +0 -1
  56. package/dist/doctor.js +5 -7
  57. package/dist/editor-examples.d.ts +0 -1
  58. package/dist/editor-examples.js +0 -1
  59. package/dist/editor.d.ts +0 -1
  60. package/dist/editor.js +0 -1
  61. package/dist/env-compat.d.ts +0 -1
  62. package/dist/env-compat.js +0 -1
  63. package/dist/executor.d.ts +0 -1
  64. package/dist/executor.js +1 -2
  65. package/dist/extension/background.js +10 -6
  66. package/dist/extension/manifest.json +1 -1
  67. package/dist/extension/options.js +1 -1
  68. package/dist/extension/rrweb-recorder.js +1 -1
  69. package/dist/ghost-browser.d.ts +0 -1
  70. package/dist/ghost-browser.js +0 -1
  71. package/dist/ghost-cursor-controller.d.ts +0 -1
  72. package/dist/ghost-cursor-controller.js +0 -1
  73. package/dist/ghost-cursor.d.ts +0 -1
  74. package/dist/ghost-cursor.js +0 -1
  75. package/dist/htmlrewrite.d.ts +0 -1
  76. package/dist/htmlrewrite.js +0 -1
  77. package/dist/index.d.ts +0 -1
  78. package/dist/index.js +0 -1
  79. package/dist/kill-port.d.ts +0 -1
  80. package/dist/kill-port.js +0 -1
  81. package/dist/kitty-graphics.d.ts +0 -1
  82. package/dist/kitty-graphics.js +0 -1
  83. package/dist/mcp.d.ts +0 -1
  84. package/dist/mcp.js +0 -1
  85. package/dist/package-paths.d.ts +0 -1
  86. package/dist/package-paths.js +0 -1
  87. package/dist/page-markdown.d.ts +0 -1
  88. package/dist/page-markdown.js +0 -1
  89. package/dist/performance-examples.d.ts +0 -1
  90. package/dist/performance-examples.js +0 -1
  91. package/dist/playwright-import.d.ts +0 -1
  92. package/dist/playwright-import.js +0 -1
  93. package/dist/product-paths.d.ts +0 -1
  94. package/dist/product-paths.js +0 -1
  95. package/dist/protocol.d.ts +0 -1
  96. package/dist/protocol.js +0 -1
  97. package/dist/react-source.d.ts +0 -1
  98. package/dist/react-source.js +0 -1
  99. package/dist/readability.js +4 -4
  100. package/dist/relay-client.d.ts +0 -1
  101. package/dist/relay-client.js +0 -1
  102. package/dist/relay-state.d.ts +0 -1
  103. package/dist/relay-state.js +0 -1
  104. package/dist/replay-ai-index.d.ts +0 -1
  105. package/dist/replay-ai-index.js +0 -1
  106. package/dist/replay-eval.d.ts +0 -1
  107. package/dist/replay-eval.js +0 -1
  108. package/dist/replay-handoff.d.ts +0 -1
  109. package/dist/replay-handoff.js +0 -1
  110. package/dist/replay-workflow-compiler.d.ts +0 -1
  111. package/dist/replay-workflow-compiler.js +0 -1
  112. package/dist/rrweb-recording-relay.d.ts +0 -1
  113. package/dist/rrweb-recording-relay.js +0 -1
  114. package/dist/rrweb-recording.d.ts +0 -1
  115. package/dist/rrweb-recording.js +0 -1
  116. package/dist/scoped-fs.d.ts +0 -1
  117. package/dist/scoped-fs.js +0 -1
  118. package/dist/selector-generator.js +2 -2
  119. package/dist/start-relay-server.d.ts +0 -1
  120. package/dist/start-relay-server.js +0 -1
  121. package/dist/styles-examples.d.ts +0 -1
  122. package/dist/styles-examples.js +0 -1
  123. package/dist/styles.d.ts +0 -1
  124. package/dist/styles.js +0 -1
  125. package/dist/tabwright-agent-skill.d.ts +0 -1
  126. package/dist/tabwright-agent-skill.js +0 -1
  127. package/dist/test-declarations.d.ts +0 -1
  128. package/dist/test-declarations.js +0 -1
  129. package/dist/utils.d.ts +0 -1
  130. package/dist/utils.js +2 -2
  131. package/dist/wait-for-page-load.d.ts +0 -1
  132. package/dist/wait-for-page-load.js +0 -1
  133. package/dist/workflow-capability.d.ts +0 -1
  134. package/dist/workflow-capability.js +0 -1
  135. package/package.json +8 -4
  136. package/readme.md +43 -0
  137. package/src/skill.md +5 -2
  138. package/dist/aria-snapshot.d.ts.map +0 -1
  139. package/dist/aria-snapshot.js.map +0 -1
  140. package/dist/aria-snapshot.test.d.ts +0 -2
  141. package/dist/aria-snapshot.test.d.ts.map +0 -1
  142. package/dist/aria-snapshot.test.js +0 -270
  143. package/dist/aria-snapshot.test.js.map +0 -1
  144. package/dist/aria-snapshot.unit.test.d.ts +0 -2
  145. package/dist/aria-snapshot.unit.test.d.ts.map +0 -1
  146. package/dist/aria-snapshot.unit.test.js +0 -542
  147. package/dist/aria-snapshot.unit.test.js.map +0 -1
  148. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +0 -1
  149. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +0 -1
  150. package/dist/browser-config.d.ts.map +0 -1
  151. package/dist/browser-config.js.map +0 -1
  152. package/dist/browser-install.d.ts.map +0 -1
  153. package/dist/browser-install.js.map +0 -1
  154. package/dist/browser-launch.d.ts.map +0 -1
  155. package/dist/browser-launch.js.map +0 -1
  156. package/dist/builtin-capabilities.d.ts +0 -28
  157. package/dist/builtin-capabilities.d.ts.map +0 -1
  158. package/dist/builtin-capabilities.js +0 -2673
  159. package/dist/builtin-capabilities.js.map +0 -1
  160. package/dist/capability-agent-skill.d.ts.map +0 -1
  161. package/dist/capability-agent-skill.js.map +0 -1
  162. package/dist/capability-auth-state.d.ts.map +0 -1
  163. package/dist/capability-auth-state.js.map +0 -1
  164. package/dist/capability-auth.d.ts.map +0 -1
  165. package/dist/capability-auth.js.map +0 -1
  166. package/dist/capability-cli-confirmation.test.d.ts +0 -2
  167. package/dist/capability-cli-confirmation.test.d.ts.map +0 -1
  168. package/dist/capability-cli-confirmation.test.js +0 -79
  169. package/dist/capability-cli-confirmation.test.js.map +0 -1
  170. package/dist/capability-options.d.ts.map +0 -1
  171. package/dist/capability-options.js.map +0 -1
  172. package/dist/capability-options.test.d.ts +0 -2
  173. package/dist/capability-options.test.d.ts.map +0 -1
  174. package/dist/capability-options.test.js +0 -81
  175. package/dist/capability-options.test.js.map +0 -1
  176. package/dist/capability-package.d.ts.map +0 -1
  177. package/dist/capability-package.js.map +0 -1
  178. package/dist/capability-package.test.d.ts +0 -2
  179. package/dist/capability-package.test.d.ts.map +0 -1
  180. package/dist/capability-package.test.js +0 -179
  181. package/dist/capability-package.test.js.map +0 -1
  182. package/dist/capability-registry.d.ts.map +0 -1
  183. package/dist/capability-registry.js.map +0 -1
  184. package/dist/capability-registry.test.d.ts +0 -2
  185. package/dist/capability-registry.test.d.ts.map +0 -1
  186. package/dist/capability-registry.test.js +0 -1683
  187. package/dist/capability-registry.test.js.map +0 -1
  188. package/dist/capability-runner.d.ts.map +0 -1
  189. package/dist/capability-runner.js.map +0 -1
  190. package/dist/capability-search-relevance.test.d.ts +0 -2
  191. package/dist/capability-search-relevance.test.d.ts.map +0 -1
  192. package/dist/capability-search-relevance.test.js +0 -67
  193. package/dist/capability-search-relevance.test.js.map +0 -1
  194. package/dist/capability-studio.d.ts.map +0 -1
  195. package/dist/capability-studio.js.map +0 -1
  196. package/dist/capability-studio.test.d.ts +0 -2
  197. package/dist/capability-studio.test.d.ts.map +0 -1
  198. package/dist/capability-studio.test.js +0 -41
  199. package/dist/capability-studio.test.js.map +0 -1
  200. package/dist/cdp-log.d.ts.map +0 -1
  201. package/dist/cdp-log.js.map +0 -1
  202. package/dist/cdp-log.test.d.ts +0 -2
  203. package/dist/cdp-log.test.d.ts.map +0 -1
  204. package/dist/cdp-log.test.js +0 -109
  205. package/dist/cdp-log.test.js.map +0 -1
  206. package/dist/cdp-relay.d.ts.map +0 -1
  207. package/dist/cdp-relay.js.map +0 -1
  208. package/dist/cdp-session.d.ts.map +0 -1
  209. package/dist/cdp-session.js.map +0 -1
  210. package/dist/cdp-types.d.ts.map +0 -1
  211. package/dist/cdp-types.js.map +0 -1
  212. package/dist/channel-owner-inspect.test.d.ts +0 -2
  213. package/dist/channel-owner-inspect.test.d.ts.map +0 -1
  214. package/dist/channel-owner-inspect.test.js +0 -75
  215. package/dist/channel-owner-inspect.test.js.map +0 -1
  216. package/dist/chrome-discovery.d.ts.map +0 -1
  217. package/dist/chrome-discovery.js.map +0 -1
  218. package/dist/chrome-discovery.test.d.ts +0 -2
  219. package/dist/chrome-discovery.test.d.ts.map +0 -1
  220. package/dist/chrome-discovery.test.js +0 -41
  221. package/dist/chrome-discovery.test.js.map +0 -1
  222. package/dist/clean-html.d.ts.map +0 -1
  223. package/dist/clean-html.js.map +0 -1
  224. package/dist/cli-help.test.d.ts +0 -2
  225. package/dist/cli-help.test.d.ts.map +0 -1
  226. package/dist/cli-help.test.js +0 -98
  227. package/dist/cli-help.test.js.map +0 -1
  228. package/dist/cli.d.ts.map +0 -1
  229. package/dist/cli.js.map +0 -1
  230. package/dist/cloud-client.d.ts.map +0 -1
  231. package/dist/cloud-client.js.map +0 -1
  232. package/dist/create-logger.d.ts.map +0 -1
  233. package/dist/create-logger.js.map +0 -1
  234. package/dist/debugger-examples-types.d.ts.map +0 -1
  235. package/dist/debugger-examples-types.js.map +0 -1
  236. package/dist/debugger-examples.d.ts.map +0 -1
  237. package/dist/debugger-examples.js.map +0 -1
  238. package/dist/debugger.d.ts.map +0 -1
  239. package/dist/debugger.js.map +0 -1
  240. package/dist/diff-utils.d.ts.map +0 -1
  241. package/dist/diff-utils.js.map +0 -1
  242. package/dist/diff-utils.test.d.ts +0 -2
  243. package/dist/diff-utils.test.d.ts.map +0 -1
  244. package/dist/diff-utils.test.js +0 -137
  245. package/dist/diff-utils.test.js.map +0 -1
  246. package/dist/doctor.d.ts.map +0 -1
  247. package/dist/doctor.js.map +0 -1
  248. package/dist/doctor.test.d.ts +0 -2
  249. package/dist/doctor.test.d.ts.map +0 -1
  250. package/dist/doctor.test.js +0 -208
  251. package/dist/doctor.test.js.map +0 -1
  252. package/dist/editor-examples.d.ts.map +0 -1
  253. package/dist/editor-examples.js.map +0 -1
  254. package/dist/editor.d.ts.map +0 -1
  255. package/dist/editor.js.map +0 -1
  256. package/dist/env-compat.d.ts.map +0 -1
  257. package/dist/env-compat.js.map +0 -1
  258. package/dist/executor.d.ts.map +0 -1
  259. package/dist/executor.js.map +0 -1
  260. package/dist/executor.unit.test.d.ts +0 -2
  261. package/dist/executor.unit.test.d.ts.map +0 -1
  262. package/dist/executor.unit.test.js +0 -143
  263. package/dist/executor.unit.test.js.map +0 -1
  264. package/dist/extension-connection.test.d.ts +0 -2
  265. package/dist/extension-connection.test.d.ts.map +0 -1
  266. package/dist/extension-connection.test.js +0 -708
  267. package/dist/extension-connection.test.js.map +0 -1
  268. package/dist/extension-icon-warning.test.d.ts +0 -2
  269. package/dist/extension-icon-warning.test.d.ts.map +0 -1
  270. package/dist/extension-icon-warning.test.js +0 -33
  271. package/dist/extension-icon-warning.test.js.map +0 -1
  272. package/dist/ghost-browser.d.ts.map +0 -1
  273. package/dist/ghost-browser.js.map +0 -1
  274. package/dist/ghost-cursor-controller.d.ts.map +0 -1
  275. package/dist/ghost-cursor-controller.js.map +0 -1
  276. package/dist/ghost-cursor.d.ts.map +0 -1
  277. package/dist/ghost-cursor.js.map +0 -1
  278. package/dist/htmlrewrite.d.ts.map +0 -1
  279. package/dist/htmlrewrite.js.map +0 -1
  280. package/dist/htmlrewrite.test.d.ts +0 -2
  281. package/dist/htmlrewrite.test.d.ts.map +0 -1
  282. package/dist/htmlrewrite.test.js +0 -7975
  283. package/dist/htmlrewrite.test.js.map +0 -1
  284. package/dist/index.d.ts.map +0 -1
  285. package/dist/index.js.map +0 -1
  286. package/dist/kill-port.d.ts.map +0 -1
  287. package/dist/kill-port.js.map +0 -1
  288. package/dist/kitty-graphics.d.ts.map +0 -1
  289. package/dist/kitty-graphics.js.map +0 -1
  290. package/dist/kitty-graphics.test.d.ts +0 -2
  291. package/dist/kitty-graphics.test.d.ts.map +0 -1
  292. package/dist/kitty-graphics.test.js +0 -125
  293. package/dist/kitty-graphics.test.js.map +0 -1
  294. package/dist/locator-selector.test.d.ts +0 -2
  295. package/dist/locator-selector.test.d.ts.map +0 -1
  296. package/dist/locator-selector.test.js +0 -98
  297. package/dist/locator-selector.test.js.map +0 -1
  298. package/dist/mcp-client.d.ts +0 -20
  299. package/dist/mcp-client.d.ts.map +0 -1
  300. package/dist/mcp-client.js +0 -56
  301. package/dist/mcp-client.js.map +0 -1
  302. package/dist/mcp.d.ts.map +0 -1
  303. package/dist/mcp.js.map +0 -1
  304. package/dist/on-mouse-action.test.d.ts +0 -2
  305. package/dist/on-mouse-action.test.d.ts.map +0 -1
  306. package/dist/on-mouse-action.test.js +0 -180
  307. package/dist/on-mouse-action.test.js.map +0 -1
  308. package/dist/options-page.test.d.ts +0 -2
  309. package/dist/options-page.test.d.ts.map +0 -1
  310. package/dist/options-page.test.js +0 -773
  311. package/dist/options-page.test.js.map +0 -1
  312. package/dist/package-paths.d.ts.map +0 -1
  313. package/dist/package-paths.js.map +0 -1
  314. package/dist/page-markdown.d.ts.map +0 -1
  315. package/dist/page-markdown.js.map +0 -1
  316. package/dist/performance-examples.d.ts.map +0 -1
  317. package/dist/performance-examples.js.map +0 -1
  318. package/dist/playwright-import.d.ts.map +0 -1
  319. package/dist/playwright-import.js.map +0 -1
  320. package/dist/popup-relocation.test.d.ts +0 -7
  321. package/dist/popup-relocation.test.d.ts.map +0 -1
  322. package/dist/popup-relocation.test.js +0 -139
  323. package/dist/popup-relocation.test.js.map +0 -1
  324. package/dist/product-paths.d.ts.map +0 -1
  325. package/dist/product-paths.js.map +0 -1
  326. package/dist/product-paths.test.d.ts +0 -2
  327. package/dist/product-paths.test.d.ts.map +0 -1
  328. package/dist/product-paths.test.js +0 -39
  329. package/dist/product-paths.test.js.map +0 -1
  330. package/dist/protocol.d.ts.map +0 -1
  331. package/dist/protocol.js.map +0 -1
  332. package/dist/protocol.test.d.ts +0 -2
  333. package/dist/protocol.test.d.ts.map +0 -1
  334. package/dist/protocol.test.js +0 -31
  335. package/dist/protocol.test.js.map +0 -1
  336. package/dist/react-source.d.ts.map +0 -1
  337. package/dist/react-source.js.map +0 -1
  338. package/dist/relay-client.d.ts.map +0 -1
  339. package/dist/relay-client.js.map +0 -1
  340. package/dist/relay-client.test.d.ts +0 -2
  341. package/dist/relay-client.test.d.ts.map +0 -1
  342. package/dist/relay-client.test.js +0 -305
  343. package/dist/relay-client.test.js.map +0 -1
  344. package/dist/relay-core.test.d.ts +0 -2
  345. package/dist/relay-core.test.d.ts.map +0 -1
  346. package/dist/relay-core.test.js +0 -1427
  347. package/dist/relay-core.test.js.map +0 -1
  348. package/dist/relay-navigation.test.d.ts +0 -2
  349. package/dist/relay-navigation.test.d.ts.map +0 -1
  350. package/dist/relay-navigation.test.js +0 -661
  351. package/dist/relay-navigation.test.js.map +0 -1
  352. package/dist/relay-session.test.d.ts +0 -2
  353. package/dist/relay-session.test.d.ts.map +0 -1
  354. package/dist/relay-session.test.js +0 -1121
  355. package/dist/relay-session.test.js.map +0 -1
  356. package/dist/relay-state.d.ts.map +0 -1
  357. package/dist/relay-state.js.map +0 -1
  358. package/dist/relay-state.test.d.ts +0 -2
  359. package/dist/relay-state.test.d.ts.map +0 -1
  360. package/dist/relay-state.test.js +0 -594
  361. package/dist/relay-state.test.js.map +0 -1
  362. package/dist/replay-ai-index.d.ts.map +0 -1
  363. package/dist/replay-ai-index.js.map +0 -1
  364. package/dist/replay-ai-index.test.d.ts +0 -2
  365. package/dist/replay-ai-index.test.d.ts.map +0 -1
  366. package/dist/replay-ai-index.test.js +0 -255
  367. package/dist/replay-ai-index.test.js.map +0 -1
  368. package/dist/replay-cli.test.d.ts +0 -2
  369. package/dist/replay-cli.test.d.ts.map +0 -1
  370. package/dist/replay-cli.test.js +0 -275
  371. package/dist/replay-cli.test.js.map +0 -1
  372. package/dist/replay-eval.d.ts.map +0 -1
  373. package/dist/replay-eval.js.map +0 -1
  374. package/dist/replay-handoff.d.ts.map +0 -1
  375. package/dist/replay-handoff.js.map +0 -1
  376. package/dist/replay-handoff.test.d.ts +0 -2
  377. package/dist/replay-handoff.test.d.ts.map +0 -1
  378. package/dist/replay-handoff.test.js +0 -123
  379. package/dist/replay-handoff.test.js.map +0 -1
  380. package/dist/replay-workflow-compiler.d.ts.map +0 -1
  381. package/dist/replay-workflow-compiler.js.map +0 -1
  382. package/dist/replay-workflow-compiler.test.d.ts +0 -2
  383. package/dist/replay-workflow-compiler.test.d.ts.map +0 -1
  384. package/dist/replay-workflow-compiler.test.js +0 -223
  385. package/dist/replay-workflow-compiler.test.js.map +0 -1
  386. package/dist/rrweb-recording-relay.d.ts.map +0 -1
  387. package/dist/rrweb-recording-relay.js.map +0 -1
  388. package/dist/rrweb-recording-relay.test.d.ts +0 -2
  389. package/dist/rrweb-recording-relay.test.d.ts.map +0 -1
  390. package/dist/rrweb-recording-relay.test.js +0 -85
  391. package/dist/rrweb-recording-relay.test.js.map +0 -1
  392. package/dist/rrweb-recording.d.ts.map +0 -1
  393. package/dist/rrweb-recording.js.map +0 -1
  394. package/dist/scoped-fs.d.ts.map +0 -1
  395. package/dist/scoped-fs.js.map +0 -1
  396. package/dist/scoped-fs.test.d.ts +0 -5
  397. package/dist/scoped-fs.test.d.ts.map +0 -1
  398. package/dist/scoped-fs.test.js +0 -73
  399. package/dist/scoped-fs.test.js.map +0 -1
  400. package/dist/skill-stub.test.d.ts +0 -2
  401. package/dist/skill-stub.test.d.ts.map +0 -1
  402. package/dist/skill-stub.test.js +0 -22
  403. package/dist/skill-stub.test.js.map +0 -1
  404. package/dist/snapshot-tools.test.d.ts +0 -2
  405. package/dist/snapshot-tools.test.d.ts.map +0 -1
  406. package/dist/snapshot-tools.test.js +0 -856
  407. package/dist/snapshot-tools.test.js.map +0 -1
  408. package/dist/start-relay-server.d.ts.map +0 -1
  409. package/dist/start-relay-server.js.map +0 -1
  410. package/dist/styles-examples.d.ts.map +0 -1
  411. package/dist/styles-examples.js.map +0 -1
  412. package/dist/styles.d.ts.map +0 -1
  413. package/dist/styles.js.map +0 -1
  414. package/dist/tabwright-agent-skill.d.ts.map +0 -1
  415. package/dist/tabwright-agent-skill.js.map +0 -1
  416. package/dist/tabwright-agent-skill.test.d.ts +0 -2
  417. package/dist/tabwright-agent-skill.test.d.ts.map +0 -1
  418. package/dist/tabwright-agent-skill.test.js +0 -51
  419. package/dist/tabwright-agent-skill.test.js.map +0 -1
  420. package/dist/test-declarations.d.ts.map +0 -1
  421. package/dist/test-declarations.js.map +0 -1
  422. package/dist/test-utils.d.ts +0 -69
  423. package/dist/test-utils.d.ts.map +0 -1
  424. package/dist/test-utils.js +0 -448
  425. package/dist/test-utils.js.map +0 -1
  426. package/dist/test-utils.test.d.ts +0 -2
  427. package/dist/test-utils.test.d.ts.map +0 -1
  428. package/dist/test-utils.test.js +0 -55
  429. package/dist/test-utils.test.js.map +0 -1
  430. package/dist/utils.d.ts.map +0 -1
  431. package/dist/utils.js.map +0 -1
  432. package/dist/wait-for-page-load.d.ts.map +0 -1
  433. package/dist/wait-for-page-load.js.map +0 -1
  434. package/dist/workflow-capability.d.ts.map +0 -1
  435. package/dist/workflow-capability.js.map +0 -1
  436. package/dist/workflow-script-flow.test.d.ts +0 -2
  437. package/dist/workflow-script-flow.test.d.ts.map +0 -1
  438. package/dist/workflow-script-flow.test.js +0 -285
  439. package/dist/workflow-script-flow.test.js.map +0 -1
  440. package/src/__snapshots__/x.com.processed.html +0 -1003
  441. package/src/__snapshots__/x.com.processed.withStyles.html +0 -2720
  442. package/src/a11y-client.ts +0 -241
  443. package/src/agent-skills/conan-config/SKILL.md +0 -141
  444. package/src/agent-skills/conan-config/agents/openai.yaml +0 -4
  445. package/src/aria-snapshot.test.ts +0 -311
  446. package/src/aria-snapshot.ts +0 -1681
  447. package/src/aria-snapshot.unit.test.ts +0 -615
  448. package/src/aria-snapshots/github-interactive.txt +0 -193
  449. package/src/aria-snapshots/github-raw.txt +0 -309
  450. package/src/aria-snapshots/hackernews-interactive.txt +0 -477
  451. package/src/aria-snapshots/hackernews-raw.txt +0 -428
  452. package/src/aria-snapshots/prosemirror-interactive.txt +0 -66
  453. package/src/aria-snapshots/prosemirror-raw.txt +0 -145
  454. package/src/assets/aria-labels-hacker-news.png +0 -0
  455. package/src/assets/aria-labels-old-reddit.png +0 -0
  456. package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +0 -5
  457. package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +0 -18
  458. package/src/assets/x.com.html +0 -32946
  459. package/src/browser-config.ts +0 -179
  460. package/src/browser-install.ts +0 -284
  461. package/src/browser-launch.ts +0 -75
  462. package/src/builtin-capabilities.ts +0 -2765
  463. package/src/capability-agent-skill.ts +0 -305
  464. package/src/capability-auth-state.ts +0 -197
  465. package/src/capability-auth.ts +0 -249
  466. package/src/capability-cli-confirmation.test.ts +0 -90
  467. package/src/capability-options.test.ts +0 -89
  468. package/src/capability-options.ts +0 -57
  469. package/src/capability-package.test.ts +0 -204
  470. package/src/capability-package.ts +0 -555
  471. package/src/capability-registry.test.ts +0 -1905
  472. package/src/capability-registry.ts +0 -1234
  473. package/src/capability-runner.ts +0 -801
  474. package/src/capability-search-relevance.test.ts +0 -73
  475. package/src/capability-studio.test.ts +0 -45
  476. package/src/capability-studio.ts +0 -641
  477. package/src/cdp-log.test.ts +0 -131
  478. package/src/cdp-log.ts +0 -112
  479. package/src/cdp-relay.ts +0 -2944
  480. package/src/cdp-session.ts +0 -77
  481. package/src/cdp-types.ts +0 -158
  482. package/src/channel-owner-inspect.test.ts +0 -94
  483. package/src/chrome-discovery.test.ts +0 -50
  484. package/src/chrome-discovery.ts +0 -220
  485. package/src/clean-html.ts +0 -141
  486. package/src/cli-help.test.ts +0 -123
  487. package/src/cli.ts +0 -3181
  488. package/src/cloud-client.ts +0 -179
  489. package/src/create-logger.ts +0 -38
  490. package/src/debugger-examples-types.ts +0 -16
  491. package/src/debugger-examples.ts +0 -66
  492. package/src/debugger.ts +0 -708
  493. package/src/diff-utils.test.ts +0 -152
  494. package/src/diff-utils.ts +0 -70
  495. package/src/doctor.test.ts +0 -244
  496. package/src/doctor.ts +0 -321
  497. package/src/editor-examples.ts +0 -158
  498. package/src/editor.ts +0 -426
  499. package/src/env-compat.ts +0 -28
  500. package/src/executor.ts +0 -1824
  501. package/src/executor.unit.test.ts +0 -168
  502. package/src/extension-connection.test.ts +0 -855
  503. package/src/extension-icon-warning.test.ts +0 -45
  504. package/src/ghost-browser.ts +0 -149
  505. package/src/ghost-cursor-client.ts +0 -494
  506. package/src/ghost-cursor-controller.ts +0 -129
  507. package/src/ghost-cursor.ts +0 -123
  508. package/src/htmlrewrite.test.ts +0 -8008
  509. package/src/htmlrewrite.ts +0 -390
  510. package/src/index.ts +0 -53
  511. package/src/kill-port.ts +0 -219
  512. package/src/kitty-graphics.test.ts +0 -139
  513. package/src/kitty-graphics.ts +0 -79
  514. package/src/locator-selector.test.ts +0 -119
  515. package/src/mcp-client.ts +0 -78
  516. package/src/mcp.ts +0 -629
  517. package/src/on-mouse-action.test.ts +0 -226
  518. package/src/options-page.test.ts +0 -839
  519. package/src/package-paths.ts +0 -38
  520. package/src/page-markdown.ts +0 -240
  521. package/src/performance-examples.ts +0 -186
  522. package/src/playwright-import.ts +0 -59
  523. package/src/popup-relocation.test.ts +0 -163
  524. package/src/product-paths.test.ts +0 -47
  525. package/src/product-paths.ts +0 -28
  526. package/src/protocol.test.ts +0 -52
  527. package/src/protocol.ts +0 -351
  528. package/src/react-source.ts +0 -379
  529. package/src/relay-client.test.ts +0 -375
  530. package/src/relay-client.ts +0 -572
  531. package/src/relay-core.test.ts +0 -1603
  532. package/src/relay-navigation.test.ts +0 -790
  533. package/src/relay-session.test.ts +0 -1375
  534. package/src/relay-state.test.ts +0 -729
  535. package/src/relay-state.ts +0 -561
  536. package/src/replay-ai-index.test.ts +0 -278
  537. package/src/replay-ai-index.ts +0 -872
  538. package/src/replay-cli.test.ts +0 -325
  539. package/src/replay-eval.ts +0 -1039
  540. package/src/replay-handoff.test.ts +0 -163
  541. package/src/replay-handoff.ts +0 -109
  542. package/src/replay-workflow-compiler.test.ts +0 -250
  543. package/src/replay-workflow-compiler.ts +0 -700
  544. package/src/resource.md +0 -409
  545. package/src/rrweb-recording-relay.test.ts +0 -99
  546. package/src/rrweb-recording-relay.ts +0 -400
  547. package/src/rrweb-recording.ts +0 -322
  548. package/src/scoped-fs.test.ts +0 -80
  549. package/src/scoped-fs.ts +0 -420
  550. package/src/skill-stub.test.ts +0 -24
  551. package/src/snapshot-tools.test.ts +0 -1017
  552. package/src/snapshots/hacker-news-accessibility-full.md +0 -81
  553. package/src/snapshots/hacker-news-accessibility-interactive.md +0 -43
  554. package/src/snapshots/page-markdown-output.txt +0 -16
  555. package/src/snapshots/shadcn-ui-accessibility-full.md +0 -201
  556. package/src/snapshots/shadcn-ui-accessibility-interactive.md +0 -109
  557. package/src/start-relay-server.ts +0 -69
  558. package/src/styles-examples.ts +0 -84
  559. package/src/styles.ts +0 -343
  560. package/src/tabwright-agent-skill.test.ts +0 -61
  561. package/src/tabwright-agent-skill.ts +0 -105
  562. package/src/test-declarations.ts +0 -13
  563. package/src/test-utils.test.ts +0 -70
  564. package/src/test-utils.ts +0 -566
  565. package/src/utils.ts +0 -78
  566. package/src/wait-for-page-load.ts +0 -198
  567. package/src/workflow-capability.ts +0 -417
  568. 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
- }