@opengeni/react 4.3.3-canary.39786771332001 → 4.5.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 (710) hide show
  1. package/dist/app/app-state.js +29 -29
  2. package/dist/app/components/Composer.js +27 -27
  3. package/dist/app/components/agent/agent-capability-picker.js +4 -4
  4. package/dist/app/components/artifacts/artifact-browse-controls.js +2 -2
  5. package/dist/app/components/artifacts/artifact-library.js +19 -19
  6. package/dist/app/components/artifacts/artifact-page-chrome.js +2 -2
  7. package/dist/app/components/artifacts/chat-interactive-block.js +16 -16
  8. package/dist/app/components/artifacts/inline-chat-image.js +31 -30
  9. package/dist/app/components/artifacts/retained-file-preview.js +35 -34
  10. package/dist/app/components/artifacts/retained-text-preview.js +5 -5
  11. package/dist/app/components/artifacts/site-audience.js +4 -4
  12. package/dist/app/components/artifacts/site-conversations.js +22 -21
  13. package/dist/app/components/artifacts/site-data.js +19 -19
  14. package/dist/app/components/artifacts/site-publishing.js +41 -41
  15. package/dist/app/components/artifacts/site-settings.js +50 -50
  16. package/dist/app/components/billing-class-mark.js +5 -5
  17. package/dist/app/components/capabilities/capability-detail-sheet.js +9 -9
  18. package/dist/app/components/capabilities/capability-logo-source.js +12 -12
  19. package/dist/app/components/capabilities/connector-tool-permissions.js +3 -3
  20. package/dist/app/components/capabilities/native-connect-setup.js +14 -14
  21. package/dist/app/components/capabilities/perform-capability-action.js +1 -1
  22. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +16 -16
  23. package/dist/app/components/capabilities/session-capability-card.js +94 -76
  24. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  25. package/dist/app/components/capabilities/session-chrome-card.css +1023 -0
  26. package/dist/app/components/capabilities/session-chrome-card.css.map +1 -0
  27. package/dist/app/components/capabilities/session-chrome-card.d.ts +18 -0
  28. package/dist/app/components/capabilities/session-chrome-card.js +72 -0
  29. package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -20
  30. package/dist/app/components/capabilities/session-github-card.js +24 -24
  31. package/dist/app/components/capabilities/session-machine-card.d.ts +27 -1
  32. package/dist/app/components/capabilities/session-machine-card.js +40 -36
  33. package/dist/app/components/capabilities/use-capabilities-catalog.js +3 -3
  34. package/dist/app/components/capabilities/use-connection-accounts.js +1 -1
  35. package/dist/app/components/command-menu/chat-status.js +18 -17
  36. package/dist/app/components/command-menu/chat-switcher.js +19 -18
  37. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  38. package/dist/app/components/command-menu/command-menu.js +36 -114
  39. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  40. package/dist/app/components/command-menu/shortcut-sheet.js +17 -17
  41. package/dist/app/components/composer-capabilities-menu-body.js +3 -3
  42. package/dist/app/components/composer-mobile-plus-panel.js +20 -20
  43. package/dist/app/components/composer-mobile-plus.js +1 -1
  44. package/dist/app/components/credit-required-gate.js +1 -1
  45. package/dist/app/components/credit-required-prompt.js +12 -12
  46. package/dist/app/components/credits/coupon-redeem.js +2 -2
  47. package/dist/app/components/credits/credit-refusal-notice.js +2 -2
  48. package/dist/app/components/desktop/app-shots.js +7 -7
  49. package/dist/app/components/desktop/this-computer.js +4 -4
  50. package/dist/app/components/feedback.js +4 -4
  51. package/dist/app/components/follow-up-repository-menu-body.js +5 -5
  52. package/dist/app/components/follow-up-repository-picker.js +1 -1
  53. package/dist/app/components/github-app-connect-launcher.js +2 -2
  54. package/dist/app/components/in-app-help-link.js +2 -2
  55. package/dist/app/components/knowledge/agent-learning-settings.js +3 -3
  56. package/dist/app/components/machines/connect-machine-dialog.js +18 -18
  57. package/dist/app/components/markdown.js +9 -9
  58. package/dist/app/components/message-context-pills.js +2 -2
  59. package/dist/app/components/models/models-ui.js +8 -8
  60. package/dist/app/components/new-session-starters.js +2 -2
  61. package/dist/app/components/pickers.js +9 -9
  62. package/dist/app/components/rail/rail-context.js +2 -2
  63. package/dist/app/components/rail/rail-sections.js +69 -66
  64. package/dist/app/components/rail/session-header.js +49 -48
  65. package/dist/app/components/rail/session-list.js +68 -65
  66. package/dist/app/components/rail/session-row-content.d.ts +6 -2
  67. package/dist/app/components/rail/session-row-content.js +1 -1
  68. package/dist/app/components/rail/session-row-hover-details.js +24 -23
  69. package/dist/app/components/rail/session-shell.js +107 -104
  70. package/dist/app/components/rail/site-session-group-heading.d.ts +7 -1
  71. package/dist/app/components/rail/site-session-group-heading.js +20 -3
  72. package/dist/app/components/repository-picker.js +5 -5
  73. package/dist/app/components/secrets/session-secrets-panel.js +3 -3
  74. package/dist/app/components/session/agent-configuration-panel.js +38 -38
  75. package/dist/app/components/session/artifact-link-boundary.js +2 -2
  76. package/dist/app/components/session/artifact-session-page.js +4 -4
  77. package/dist/app/components/session/banners.js +11 -11
  78. package/dist/app/components/session/codex-account-indicator.js +12 -12
  79. package/dist/app/components/session/editable-artifacts-workspace.js +45 -45
  80. package/dist/app/components/session/failed-session-banner.js +11 -11
  81. package/dist/app/components/session/human-input.js +59 -55
  82. package/dist/app/components/session/inspector.js +91 -87
  83. package/dist/app/components/session/inspector.js.map +1 -1
  84. package/dist/app/components/session/message-actions.js +4 -4
  85. package/dist/app/components/session/message-resource-attachments.js +21 -20
  86. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  87. package/dist/app/components/session/model-account-indicator.js +11 -11
  88. package/dist/app/components/session/model-context-inspector.js +2 -2
  89. package/dist/app/components/session/model-recovery-notice.js +3 -3
  90. package/dist/app/components/session/new-session-settings-menu.js +12 -12
  91. package/dist/app/components/session/sandbox-switcher.js +16 -16
  92. package/dist/app/components/session/sandbox-workspace.js +83 -79
  93. package/dist/app/components/session/search-markdown-highlight.js +10 -10
  94. package/dist/app/components/session/search-results-view.js +11 -11
  95. package/dist/app/components/session/session-admin-access.js +9 -9
  96. package/dist/app/components/session/session-admission-notice.js +6 -6
  97. package/dist/app/components/session/session-machine-access-notice.js +6 -6
  98. package/dist/app/components/session/session-retention.js +4 -4
  99. package/dist/app/components/session/session-search-dialog.js +12 -12
  100. package/dist/app/components/session/session-skill-reviews.js +1 -1
  101. package/dist/app/components/session/session-tenancy-control.d.ts +2 -0
  102. package/dist/app/components/session/session-tenancy-control.js +41 -26
  103. package/dist/app/components/session/session-tenancy-control.js.map +1 -1
  104. package/dist/app/components/session/session-usage-limit-section.js +11 -11
  105. package/dist/app/components/session/session-wait-status.js +10 -9
  106. package/dist/app/components/session/session-wait-status.js.map +1 -1
  107. package/dist/app/components/session/site-origin-link.d.ts +1 -0
  108. package/dist/app/components/session/site-origin-link.js +2 -2
  109. package/dist/app/components/session/subagents.js +17 -16
  110. package/dist/app/components/session-connectors-menu-body.js +5 -5
  111. package/dist/app/components/settings/row-select.js +1 -1
  112. package/dist/app/components/transcription-settings.js +2 -2
  113. package/dist/app/components/ui/destructive-confirm.js +6 -6
  114. package/dist/app/components/usage/usage-entry.js +8 -8
  115. package/dist/app/components/workspace-composer-plus.js +22 -22
  116. package/dist/app/embed/memory-navigation.js +2 -2
  117. package/dist/app/embed/session-app.js +275 -269
  118. package/dist/app/lib/actions/actions-provider.js +14 -14
  119. package/dist/app/lib/actions/held-modifier.d.ts +11 -0
  120. package/dist/app/lib/app-surfaces.js +2 -2
  121. package/dist/app/lib/codex-usage-query.js +6 -6
  122. package/dist/app/lib/composer-connectors.js +13 -13
  123. package/dist/app/lib/console-site.d.ts +6 -0
  124. package/dist/app/lib/console-site.js +14 -0
  125. package/dist/app/lib/console-text.js +2 -2
  126. package/dist/app/lib/events.js +18 -17
  127. package/dist/app/lib/failed-session-copy.js +3 -3
  128. package/dist/app/lib/model-access-onboarding.js +3 -3
  129. package/dist/app/lib/move-chat-to-machine.js +3 -3
  130. package/dist/app/lib/navigation.d.ts +5 -0
  131. package/dist/app/lib/navigation.js +1 -1
  132. package/dist/app/lib/routes.d.ts +17 -0
  133. package/dist/app/lib/routes.js +9 -3
  134. package/dist/app/lib/session-branch-cache.js +14 -13
  135. package/dist/app/lib/session-create.js +2 -2
  136. package/dist/app/lib/session-deep-link.js +2 -2
  137. package/dist/app/lib/session-failure-toasts.d.ts +8 -0
  138. package/dist/app/lib/session-group-pagination.js +14 -13
  139. package/dist/app/lib/session-hover-facts.js +15 -14
  140. package/dist/app/lib/session-model.js +3 -3
  141. package/dist/app/lib/session-rail.js +10 -9
  142. package/dist/app/lib/session-rename.js +3 -3
  143. package/dist/app/lib/session-ui-features.d.ts +6 -1
  144. package/dist/app/lib/session-ui-features.js +1 -1
  145. package/dist/app/lib/sessions-group.d.ts +43 -3
  146. package/dist/app/lib/sessions-group.js +22 -15
  147. package/dist/app/lib/shared-query.js +3 -3
  148. package/dist/app/lib/site-opened.d.ts +6 -0
  149. package/dist/app/lib/site-opened.js +10 -0
  150. package/dist/app/lib/turn-failure-analytics.js +5 -5
  151. package/dist/app/lib/use-duplicate-site.js +3 -3
  152. package/dist/app/lib/use-follow-up-repositories.js +4 -4
  153. package/dist/app/lib/use-session-list-hint-refresh.d.ts +20 -2
  154. package/dist/app/lib/use-session-list-hint-refresh.js +5 -1
  155. package/dist/app/lib/use-workspace-machines.js +6 -6
  156. package/dist/app/lib/use-workspace-model-catalog.js +8 -8
  157. package/dist/app/lib/use-workspace-rigs.js +8 -8
  158. package/dist/app/lib/workspace-navigation-preference.js +5 -5
  159. package/dist/app/lib/workspace-scope-context.js +4 -4
  160. package/dist/app/routes/artifacts.js +136 -153
  161. package/dist/app/routes/artifacts.js.map +1 -1
  162. package/dist/app/routes/retained-artifact.js +63 -62
  163. package/dist/app/routes/retained-artifact.js.map +1 -1
  164. package/dist/app/routes/session-unavailable.js +7 -5
  165. package/dist/app/routes/session.js +177 -173
  166. package/dist/app/routes/sessions-index-hydration.js +3 -3
  167. package/dist/app/routes/sessions-index.js +123 -121
  168. package/dist/app/routes/site-view.d.ts +11 -0
  169. package/dist/app/routes/site-view.js +597 -0
  170. package/dist/app/routes/site-view.js.map +1 -0
  171. package/dist/artifacts-document.js +4 -4
  172. package/dist/artifacts-presentation.js +4 -4
  173. package/dist/artifacts-spreadsheet.js +4 -4
  174. package/dist/artifacts.js +39 -39
  175. package/dist/{browser-viewer-RYYQSRTC.js → browser-viewer-QMCNV4RI.js} +9 -7
  176. package/dist/{chat-interactive-block-ABCRKXJ4.js → chat-interactive-block-PMIAUXSO.js} +6 -6
  177. package/dist/{chunk-GIZGNFIX.js → chunk-22FFOHPT.js} +11 -11
  178. package/dist/chunk-22GTC4MZ.js +15 -0
  179. package/dist/chunk-22GTC4MZ.js.map +1 -0
  180. package/dist/{chunk-Z5WMLJKI.js → chunk-22JFMNMF.js} +92 -4
  181. package/dist/chunk-22JFMNMF.js.map +1 -0
  182. package/dist/{chunk-UHFWF6ZU.js → chunk-2FPS5H2D.js} +2 -2
  183. package/dist/{chunk-NAWXARTY.js → chunk-2KO2G3RI.js} +72 -6
  184. package/dist/chunk-2KO2G3RI.js.map +1 -0
  185. package/dist/{chunk-5POTDNQT.js → chunk-2NC7NZCE.js} +6 -6
  186. package/dist/{chunk-ZKYYZH6L.js → chunk-2QBYDGWO.js} +9 -9
  187. package/dist/{chunk-TWXIFWBD.js → chunk-34EU25RL.js} +2 -2
  188. package/dist/{chunk-LQKKSUCR.js → chunk-35BC2FU2.js} +19 -19
  189. package/dist/{chunk-PTGRFAMH.js → chunk-3ABPIUCK.js} +2 -2
  190. package/dist/{chunk-S4SC5SSV.js → chunk-3GU7AWG7.js} +18 -18
  191. package/dist/{chunk-722UO6YQ.js → chunk-3PEXVG4D.js} +2 -2
  192. package/dist/{chunk-OQAAI33Y.js → chunk-3RMKPHBL.js} +3 -3
  193. package/dist/{chunk-6JKZILLF.js → chunk-3RQUWFZT.js} +67 -67
  194. package/dist/{chunk-6JKZILLF.js.map → chunk-3RQUWFZT.js.map} +1 -1
  195. package/dist/{chunk-GCGTYXJJ.js → chunk-3STBLX4O.js} +9 -9
  196. package/dist/{chunk-YXIW7H4N.js → chunk-3X5FKDYQ.js} +28 -28
  197. package/dist/{chunk-KTRKZRID.js → chunk-4GLLWX33.js} +11 -11
  198. package/dist/{chunk-ROQOVH4N.js → chunk-4HEXNAFI.js} +20 -20
  199. package/dist/chunk-4HEXNAFI.js.map +1 -0
  200. package/dist/{chunk-SD2K5ZN5.js → chunk-4LPA25NQ.js} +4 -4
  201. package/dist/{chunk-DKCX643S.js → chunk-4RMN4E2Y.js} +13 -13
  202. package/dist/{chunk-E5FCEDMU.js → chunk-4SAGYEVB.js} +2 -2
  203. package/dist/{chunk-HTT3FB7T.js → chunk-4VK2R5QC.js} +3 -3
  204. package/dist/{chunk-CKG2EG62.js → chunk-4XQC7VLT.js} +14 -14
  205. package/dist/{chunk-IVOA3DXA.js → chunk-4YXAQMTD.js} +12 -12
  206. package/dist/{chunk-HOJGAJAB.js → chunk-52WK2GGK.js} +8 -8
  207. package/dist/{chunk-NYZQ7LO7.js → chunk-552UYIQ7.js} +20 -20
  208. package/dist/{chunk-LEXPBQ56.js → chunk-5DSKMG2I.js} +4 -4
  209. package/dist/{chunk-WNG757ID.js → chunk-5FA455GR.js} +4 -4
  210. package/dist/{chunk-MNWQAYY3.js → chunk-5FEN3KYH.js} +11 -11
  211. package/dist/{chunk-OSVHU2WU.js → chunk-5JHRMUAZ.js} +12 -12
  212. package/dist/{chunk-PM3OSANE.js → chunk-5MJHH72T.js} +14 -3
  213. package/dist/chunk-5MJHH72T.js.map +1 -0
  214. package/dist/{chunk-RKB2Z457.js → chunk-5VGJXWQ2.js} +2 -2
  215. package/dist/{chunk-GFUUFM2O.js → chunk-5W6ZDKRR.js} +6 -6
  216. package/dist/{chunk-NDETTZQA.js → chunk-5W7KJ5NQ.js} +37 -37
  217. package/dist/{chunk-Q35YZVDZ.js → chunk-5Y2FPLZE.js} +9 -9
  218. package/dist/{chunk-6W3LF3DB.js → chunk-5YFY4SFC.js} +2 -12
  219. package/dist/chunk-5YFY4SFC.js.map +1 -0
  220. package/dist/{chunk-F3NERYBQ.js → chunk-62VER7O4.js} +6 -6
  221. package/dist/{chunk-FBMU3VK5.js → chunk-6DCEDIF6.js} +2 -2
  222. package/dist/{chunk-WUHB422G.js → chunk-73WI7FL2.js} +18 -18
  223. package/dist/chunk-756MKA2J.js +45 -0
  224. package/dist/chunk-756MKA2J.js.map +1 -0
  225. package/dist/{chunk-QECZVL7S.js → chunk-7FJMRJDG.js} +2 -2
  226. package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
  227. package/dist/{chunk-XVM566II.js → chunk-7KIENXRE.js} +2 -2
  228. package/dist/{chunk-CBY5CXBD.js → chunk-7NPCEBZE.js} +5 -5
  229. package/dist/{chunk-46VBQG2D.js → chunk-7P4AQMGA.js} +13 -13
  230. package/dist/{chunk-CKZW7A5S.js → chunk-7TCT7KPQ.js} +742 -644
  231. package/dist/chunk-7TCT7KPQ.js.map +1 -0
  232. package/dist/{chunk-O77Q4NG2.js → chunk-7XO7YKPC.js} +283 -1038
  233. package/dist/chunk-7XO7YKPC.js.map +1 -0
  234. package/dist/{chunk-S7PVL7XH.js → chunk-A4BD4ZVB.js} +4 -4
  235. package/dist/{chunk-VSQHDBHU.js → chunk-ACL2V2KE.js} +68 -35
  236. package/dist/chunk-ACL2V2KE.js.map +1 -0
  237. package/dist/{chunk-73SOCVLS.js → chunk-AIEXYO2X.js} +3 -3
  238. package/dist/{chunk-U7TC2XJQ.js → chunk-AJPW3SV4.js} +3 -3
  239. package/dist/{chunk-HRJQAFKR.js → chunk-AX6YJA5U.js} +2 -2
  240. package/dist/{chunk-P5WABK2H.js → chunk-BCM7C3MJ.js} +9 -9
  241. package/dist/{chunk-DT7BORXG.js → chunk-BMJTNPWK.js} +2 -2
  242. package/dist/{chunk-HIHO2QE7.js → chunk-BT2MVGHT.js} +2 -2
  243. package/dist/{chunk-3XOISKZC.js → chunk-BXQYAAVE.js} +4 -4
  244. package/dist/{chunk-IBTXYLBW.js → chunk-CCFWY4GF.js} +2 -2
  245. package/dist/{chunk-ZOC3OP6F.js → chunk-CCR33J7L.js} +2 -2
  246. package/dist/{chunk-GTQ3SNEI.js → chunk-CD3MO3IC.js} +2 -2
  247. package/dist/{chunk-WSMYOLHG.js → chunk-CDEXRJB6.js} +5 -5
  248. package/dist/{chunk-3GLAPCVI.js → chunk-CFFNT2OY.js} +8 -8
  249. package/dist/{chunk-FUSFVUIJ.js → chunk-CMLJSF2F.js} +12 -12
  250. package/dist/{chunk-O4DYOSOL.js → chunk-CP7ZQHBW.js} +13 -13
  251. package/dist/{chunk-IOKSNX74.js → chunk-D5OWJZQR.js} +2 -2
  252. package/dist/{chunk-SQGXMHJO.js → chunk-DGLRZMXL.js} +3 -3
  253. package/dist/{chunk-GNEHAPKV.js → chunk-DJFTH2DI.js} +3 -3
  254. package/dist/{chunk-HQG4SLTE.js → chunk-DYJGYGPB.js} +2 -2
  255. package/dist/{chunk-4EAF3HSD.js → chunk-EJ7WARW7.js} +2 -2
  256. package/dist/{chunk-3AA6RNGE.js → chunk-ENS6E4RZ.js} +2 -2
  257. package/dist/{chunk-OOEO4MKY.js → chunk-EPWD4KRA.js} +2 -2
  258. package/dist/{chunk-V5RJAWRP.js → chunk-EQE3MNQN.js} +5 -5
  259. package/dist/{chunk-TSBE4KOQ.js → chunk-EWL6NDOO.js} +3 -3
  260. package/dist/{chunk-OO2T63BY.js → chunk-EYS4ZOF5.js} +2 -2
  261. package/dist/{chunk-IC7KNOBB.js → chunk-FDAV72IX.js} +7 -7
  262. package/dist/{chunk-AG7VGUIW.js → chunk-FFNPUSVO.js} +7 -7
  263. package/dist/{chunk-P5T36BA3.js → chunk-FRP64DEK.js} +2 -2
  264. package/dist/{chunk-KBF3SE7G.js → chunk-FSP334UU.js} +2 -2
  265. package/dist/{chunk-ZHFKMMOT.js → chunk-FTX5CNHA.js} +6 -6
  266. package/dist/{chunk-KYBALSWW.js → chunk-FWOBNL2A.js} +1 -1
  267. package/dist/{chunk-HJ5XWW62.js → chunk-FWYEZ3LE.js} +34 -34
  268. package/dist/{chunk-WSLPZ43N.js → chunk-G4HQUBO4.js} +12 -12
  269. package/dist/{chunk-CSHBR2IZ.js → chunk-GDLDBR6B.js} +2 -2
  270. package/dist/chunk-GGV4NSG3.js +792 -0
  271. package/dist/chunk-GGV4NSG3.js.map +1 -0
  272. package/dist/{chunk-G3S2F35T.js → chunk-GHHM6WN4.js} +3 -3
  273. package/dist/{chunk-OANSIX34.js → chunk-GRSODLVO.js} +4 -4
  274. package/dist/{chunk-DDIBZA4X.js → chunk-GT7JFQ4E.js} +405 -148
  275. package/dist/chunk-GT7JFQ4E.js.map +1 -0
  276. package/dist/{chunk-EU6XSQFM.js → chunk-GXW2I2M2.js} +2 -2
  277. package/dist/{chunk-4246UYVG.js → chunk-GZS37O3G.js} +1 -1
  278. package/dist/{chunk-XFNLU7EW.js → chunk-H5M33DAL.js} +15 -6
  279. package/dist/chunk-H5M33DAL.js.map +1 -0
  280. package/dist/{chunk-Y7WMW74G.js → chunk-HQWVDQXW.js} +7 -7
  281. package/dist/{chunk-YTZQV2DD.js → chunk-HU6JTNWF.js} +2 -2
  282. package/dist/{chunk-QRVNI5V6.js → chunk-I6KIQKU6.js} +3 -3
  283. package/dist/{chunk-Q262Y2YX.js → chunk-IBA5FMRE.js} +141 -137
  284. package/dist/chunk-IBA5FMRE.js.map +1 -0
  285. package/dist/{chunk-BNUPYHHZ.js → chunk-IDXTASGN.js} +4 -4
  286. package/dist/{chunk-KF3MF6FP.js → chunk-IECRGM6K.js} +3 -2
  287. package/dist/chunk-IECRGM6K.js.map +1 -0
  288. package/dist/chunk-IJYL5BZM.js +38 -0
  289. package/dist/chunk-IJYL5BZM.js.map +1 -0
  290. package/dist/{chunk-L6RXRRN3.js → chunk-ILDOW2IQ.js} +3 -3
  291. package/dist/{chunk-VUHPA3XQ.js → chunk-ITX2TB4K.js} +6 -6
  292. package/dist/{chunk-ETCB6SUJ.js → chunk-J22HD2PB.js} +6 -6
  293. package/dist/{chunk-U47YDYLQ.js → chunk-J5MEDX7C.js} +8 -8
  294. package/dist/{chunk-6VQTHC4W.js → chunk-J7FBBLHF.js} +36 -36
  295. package/dist/{chunk-5JZYPZ72.js → chunk-JFK7NTEA.js} +4 -4
  296. package/dist/chunk-JFK7NTEA.js.map +1 -0
  297. package/dist/{chunk-QZRDCFHI.js → chunk-JM4HQPAI.js} +5 -5
  298. package/dist/{chunk-PIVGX42P.js → chunk-JNY5MT3I.js} +2 -2
  299. package/dist/{chunk-XWWXIZFP.js → chunk-JO6R5EXF.js} +7 -7
  300. package/dist/{chunk-MM7OKOTE.js → chunk-JQCGPTZ6.js} +9 -9
  301. package/dist/chunk-JRSNCSZN.js +37 -0
  302. package/dist/chunk-JRSNCSZN.js.map +1 -0
  303. package/dist/{chunk-KNFDWNCH.js → chunk-JXT5QDJC.js} +5 -5
  304. package/dist/{chunk-OR37STQZ.js → chunk-KEXYBG7Q.js} +3 -3
  305. package/dist/{chunk-AZVANYMB.js → chunk-KUNFUSZ7.js} +2 -2
  306. package/dist/{chunk-DXZNDKQD.js → chunk-LEEJBZ5B.js} +2 -2
  307. package/dist/{chunk-STUCI6QA.js → chunk-LEKBNKLD.js} +1 -1
  308. package/dist/{chunk-STUCI6QA.js.map → chunk-LEKBNKLD.js.map} +1 -1
  309. package/dist/{chunk-C535KSTY.js → chunk-LF5CBAOS.js} +4 -4
  310. package/dist/{chunk-BJIZ7PL7.js → chunk-LHLK7FUA.js} +145 -29
  311. package/dist/chunk-LHLK7FUA.js.map +1 -0
  312. package/dist/{chunk-RIMKJBCD.js → chunk-LMPTC4CX.js} +2 -2
  313. package/dist/{chunk-3KVWXKD6.js → chunk-LQ47YL6E.js} +2 -2
  314. package/dist/{chunk-H5WGWAYX.js → chunk-LT4J7RHI.js} +13 -13
  315. package/dist/{chunk-DSGMYES6.js → chunk-MCTTONOW.js} +28 -28
  316. package/dist/{chunk-IGHELZI7.js → chunk-MIECLOQC.js} +9 -9
  317. package/dist/{chunk-FM4OUCC2.js → chunk-MOKYT3X3.js} +3 -3
  318. package/dist/{chunk-GZ64CASI.js → chunk-MVZYNZXE.js} +5 -4
  319. package/dist/chunk-MVZYNZXE.js.map +1 -0
  320. package/dist/{chunk-RKILMLA7.js → chunk-MXLKI7BI.js} +3 -3
  321. package/dist/{chunk-45WYYFP6.js → chunk-N3ZP4IDU.js} +2 -2
  322. package/dist/{chunk-XRRSFQEV.js → chunk-NAZZLAWX.js} +2 -2
  323. package/dist/{chunk-UWJ5P5CU.js → chunk-NEK4WB5P.js} +3 -3
  324. package/dist/{chunk-6L7U46Y2.js → chunk-NKNVIO66.js} +2 -2
  325. package/dist/{chunk-JKUICTLM.js → chunk-NLAFNMPK.js} +2 -2
  326. package/dist/{chunk-4LKNIGHB.js → chunk-O2SBHS2N.js} +2 -2
  327. package/dist/{chunk-D3RK3NGM.js → chunk-PCFK7HKD.js} +17 -17
  328. package/dist/{chunk-VVCDB2T7.js → chunk-PCJLH45G.js} +3 -3
  329. package/dist/{chunk-PZ24CYDO.js → chunk-PFAUGEV5.js} +2 -2
  330. package/dist/{chunk-HGMWMK5K.js → chunk-PO3BH3KQ.js} +2 -2
  331. package/dist/{chunk-B74GSYR6.js → chunk-PUTS4DYW.js} +2 -2
  332. package/dist/{chunk-JSIDLTTG.js → chunk-PZ2V2XIK.js} +2 -2
  333. package/dist/{chunk-TMEQPODK.js → chunk-PZ37VDB5.js} +2 -2
  334. package/dist/{chunk-QIYBOFUV.js → chunk-QFMLAT7L.js} +246 -237
  335. package/dist/chunk-QFMLAT7L.js.map +1 -0
  336. package/dist/{chunk-LVONK3YQ.js → chunk-QRKTESVE.js} +2 -2
  337. package/dist/{chunk-HT5WSUC7.js → chunk-QXEDIDBZ.js} +3 -3
  338. package/dist/{chunk-WURSS6MP.js → chunk-R66YMYJU.js} +2 -2
  339. package/dist/{chunk-HDHK3SXK.js → chunk-RFLYID6H.js} +5 -5
  340. package/dist/{chunk-V77JK73U.js → chunk-RIYZFKIM.js} +37 -35
  341. package/dist/chunk-RIYZFKIM.js.map +1 -0
  342. package/dist/{chunk-VMFID36H.js → chunk-RQNZDTKT.js} +19 -19
  343. package/dist/{chunk-EHCUFCXM.js → chunk-RYSRFAHN.js} +32 -22
  344. package/dist/chunk-RYSRFAHN.js.map +1 -0
  345. package/dist/{chunk-I6VUUEXH.js → chunk-S2U4CDAC.js} +150 -150
  346. package/dist/chunk-S2U4CDAC.js.map +1 -0
  347. package/dist/chunk-S37GP7LX.js +204 -0
  348. package/dist/chunk-S37GP7LX.js.map +1 -0
  349. package/dist/{chunk-A2EWJQXX.js → chunk-SM5QX6UK.js} +4 -4
  350. package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
  351. package/dist/{chunk-Q4NM77K7.js → chunk-SSOO4GWN.js} +193 -194
  352. package/dist/chunk-SSOO4GWN.js.map +1 -0
  353. package/dist/{chunk-PFKTGZKE.js → chunk-SY2AAZNB.js} +2 -2
  354. package/dist/{chunk-DFZMKCVP.js → chunk-TIQPKOFW.js} +4 -4
  355. package/dist/{chunk-HPPKLBTJ.js → chunk-TJQDL3JH.js} +2 -2
  356. package/dist/chunk-TL7BOFFL.js +89 -0
  357. package/dist/chunk-TL7BOFFL.js.map +1 -0
  358. package/dist/{chunk-FD4Q5KFL.js → chunk-TLL22FFO.js} +2 -2
  359. package/dist/{chunk-QM5H4FPT.js → chunk-TV6BWONY.js} +3 -3
  360. package/dist/{chunk-EDFJBX3V.js → chunk-U6MPB3K6.js} +9 -9
  361. package/dist/{chunk-TZD3U2S5.js → chunk-ULJAOMJA.js} +4 -4
  362. package/dist/chunk-ULYQEFNH.js +529 -0
  363. package/dist/chunk-ULYQEFNH.js.map +1 -0
  364. package/dist/{chunk-H5EVWF6L.js → chunk-UNNJUJVD.js} +2 -2
  365. package/dist/{chunk-324X6T6G.js → chunk-UP7I3W6O.js} +57 -55
  366. package/dist/chunk-UP7I3W6O.js.map +1 -0
  367. package/dist/{chunk-VU2EWALC.js → chunk-UUGR3X5I.js} +19 -12
  368. package/dist/chunk-UUGR3X5I.js.map +1 -0
  369. package/dist/{chunk-Z6DKXQG7.js → chunk-UXXFMF4X.js} +2 -2
  370. package/dist/{chunk-OBQVTCTW.js → chunk-UYNCMZX5.js} +4 -4
  371. package/dist/{chunk-RGPYMHKI.js → chunk-V3K4RQO7.js} +9 -3
  372. package/dist/chunk-V3K4RQO7.js.map +1 -0
  373. package/dist/{chunk-KZHW27BV.js → chunk-V4QZ7UBK.js} +2 -2
  374. package/dist/{chunk-NEVRLD77.js → chunk-VH5EGTH2.js} +3 -3
  375. package/dist/{chunk-MYNUBDU7.js → chunk-VYKW6TB2.js} +1 -1
  376. package/dist/chunk-VYKW6TB2.js.map +1 -0
  377. package/dist/{chunk-QEJTQTF5.js → chunk-W6T5HR3Z.js} +3 -3
  378. package/dist/{chunk-H6WWEKEV.js → chunk-WCMG4HYI.js} +10 -10
  379. package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
  380. package/dist/{chunk-VW3BBTMA.js → chunk-WKHUZIOW.js} +1 -1
  381. package/dist/{chunk-ANHUMDJX.js → chunk-WNDTLK44.js} +2 -2
  382. package/dist/{chunk-2DS4UOYQ.js → chunk-WSZQNTVN.js} +2 -2
  383. package/dist/{chunk-Z2DAWUO3.js → chunk-XMNUZUUA.js} +6 -6
  384. package/dist/{chunk-GAIM5RNE.js → chunk-XN7NSPE6.js} +3 -3
  385. package/dist/chunk-XV6ZYRHK.js +59 -0
  386. package/dist/chunk-XV6ZYRHK.js.map +1 -0
  387. package/dist/{chunk-FLGUVRR7.js → chunk-Y5BSA3I7.js} +5 -5
  388. package/dist/{chunk-WRLWLGEF.js → chunk-Y5E3XQ2S.js} +25 -2
  389. package/dist/{chunk-WRLWLGEF.js.map → chunk-Y5E3XQ2S.js.map} +1 -1
  390. package/dist/{chunk-QILLL4JE.js → chunk-YEROLKOA.js} +16 -16
  391. package/dist/{chunk-NDF3SH3X.js → chunk-YJPKDRI2.js} +15 -15
  392. package/dist/{chunk-TQGJN5UZ.js → chunk-YV56F4UP.js} +318 -700
  393. package/dist/chunk-YV56F4UP.js.map +1 -0
  394. package/dist/{chunk-VAIESMPY.js → chunk-YVBHGMKC.js} +4 -4
  395. package/dist/{chunk-AD22P5X3.js → chunk-YXA2EKV3.js} +3 -3
  396. package/dist/{chunk-FDNJVZRE.js → chunk-YYCOSTUU.js} +17 -17
  397. package/dist/{chunk-NLMTNEWW.js → chunk-Z6E6TUAE.js} +2 -2
  398. package/dist/{chunk-BJW7G6EF.js → chunk-Z7IGO5EA.js} +3 -3
  399. package/dist/{chunk-N7JKT4ZU.js → chunk-ZEIFJ6PX.js} +7 -7
  400. package/dist/{chunk-Q4OHNGGB.js → chunk-ZS2UQ3DV.js} +68 -11
  401. package/dist/chunk-ZS2UQ3DV.js.map +1 -0
  402. package/dist/{chunk-VRGOOVDB.js → chunk-ZVVT72MT.js} +2 -2
  403. package/dist/components/browser-viewer.d.ts +1 -1
  404. package/dist/composer.js +14 -14
  405. package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-25AJIDYA.js} +9 -9
  406. package/dist/connect.js +11 -11
  407. package/dist/desktop.js +2 -2
  408. package/dist/editor.js +2 -2
  409. package/dist/{embedded-new-voice-5PYRDZ6T.js → embedded-new-voice-RZZEJT6M.js} +8 -8
  410. package/dist/{embedded-voice-PABC5NBD.js → embedded-voice-6OKSSPLW.js} +8 -8
  411. package/dist/{fleet-decision-row-QNSTP3VX.js → fleet-decision-row-NN2HXDX3.js} +2 -2
  412. package/dist/hooks/internal.d.ts +38 -0
  413. package/dist/hooks/use-client-config-flags.d.ts +12 -0
  414. package/dist/hooks/use-workspace-sessions.d.ts +10 -1
  415. package/dist/index.js +233 -227
  416. package/dist/interaction.js +11 -9
  417. package/dist/interaction.js.map +1 -1
  418. package/dist/{latest-question-5LIRVG4G.js → latest-question-2PFWQSSG.js} +4 -3
  419. package/dist/{latest-question-5LIRVG4G.js.map → latest-question-2PFWQSSG.js.map} +1 -1
  420. package/dist/machines.js +5 -5
  421. package/dist/messages/en.d.ts +3 -3
  422. package/dist/messages.js +1 -1
  423. package/dist/{model-policy-picker-menu-CURJ247L.js → model-policy-picker-menu-VVFGGAI6.js} +6 -6
  424. package/dist/model-policy-picker-menu-VVFGGAI6.js.map +1 -0
  425. package/dist/native-previews.js +3 -3
  426. package/dist/{platform-activity-row-BMXXNZKX.js → platform-activity-row-ENQVIFTL.js} +2 -2
  427. package/dist/{queue-surface-implementation-2X5AXB6I.js → queue-surface-implementation-4SHOQPQQ.js} +10 -8
  428. package/dist/{queue-surface-implementation-2X5AXB6I.js.map → queue-surface-implementation-4SHOQPQQ.js.map} +1 -1
  429. package/dist/realtime.js +7 -7
  430. package/dist/{sandbox-files-4FBG3GS2.js → sandbox-files-CCOTGXXA.js} +11 -11
  431. package/dist/sandbox-files-CCOTGXXA.js.map +1 -0
  432. package/dist/session-app.js +277 -271
  433. package/dist/session-list-model.d.ts +1 -0
  434. package/dist/session-list-model.js +8 -2
  435. package/dist/{session-realtime-2XIB254N.js → session-realtime-JNKDSGH7.js} +3 -3
  436. package/dist/session-realtime-JNKDSGH7.js.map +1 -0
  437. package/dist/session-realtime.js +2 -2
  438. package/dist/session-ui.js +77 -72
  439. package/dist/session.js +27 -25
  440. package/dist/sites.js +2 -2
  441. package/dist/terminal.js +2 -2
  442. package/dist/this-computer.js +3 -3
  443. package/dist/timeline/invoked-tool.d.ts +5 -0
  444. package/dist/timeline/tool-display-name.d.ts +2 -2
  445. package/dist/timeline/tool-icon.d.ts +14 -0
  446. package/dist/timeline/tool-presentation.d.ts +8 -3
  447. package/dist/timeline/types.d.ts +2 -0
  448. package/dist/{timeline-annotation-markers-X4K2IEOO.js → timeline-annotation-markers-KHNYNY2J.js} +5 -5
  449. package/dist/{timeline-annotation-selection-MEHBW676.js → timeline-annotation-selection-AXEDJHBP.js} +7 -7
  450. package/dist/{timeline-annotations-dialog-U2FPQ3UY.js → timeline-annotations-dialog-AV4ZBXRC.js} +9 -9
  451. package/dist/timeline-model.js +28 -26
  452. package/dist/ui/access-list.js +20 -20
  453. package/dist/ui/choice-cards.js +2 -2
  454. package/dist/ui/detail-page.js +2 -2
  455. package/dist/ui/detail-sheet.js +2 -2
  456. package/dist/ui/diff-view.js +2 -2
  457. package/dist/ui/disclosure.js +4 -4
  458. package/dist/ui/flush-form-page.js +3 -3
  459. package/dist/ui/form-dialog.js +2 -2
  460. package/dist/ui/list-row.js +5 -5
  461. package/dist/ui/revision-history.js +11 -11
  462. package/dist/ui/role-select.js +6 -6
  463. package/dist/ui/settings-nav.js +3 -3
  464. package/dist/usage.js +3 -3
  465. package/dist/workbench.js +11 -11
  466. package/package.json +4 -4
  467. package/src/app/app-state.tsx +3 -1
  468. package/src/app/components/capabilities/session-capability-card.tsx +14 -1
  469. package/src/app/components/capabilities/session-chrome-card.dom-fixture.tsx +377 -0
  470. package/src/app/components/capabilities/session-chrome-card.test.tsx +18 -0
  471. package/src/app/components/capabilities/session-chrome-card.tsx +243 -0
  472. package/src/app/components/capabilities/session-machine-card.dom-fixture.tsx +2 -0
  473. package/src/app/components/capabilities/session-machine-card.tsx +74 -16
  474. package/src/app/components/rail/session-list.tsx +254 -44
  475. package/src/app/components/rail/session-row-content.tsx +24 -2
  476. package/src/app/components/rail/session-shell.tsx +14 -9
  477. package/src/app/components/rail/site-session-group-heading.tsx +59 -20
  478. package/src/app/components/session/session-tenancy-control.tsx +18 -0
  479. package/src/app/components/session/site-origin-link.test.tsx +73 -0
  480. package/src/app/components/session/site-origin-link.tsx +4 -2
  481. package/src/app/embed/memory-navigation.tsx +1 -0
  482. package/src/app/lib/actions/held-modifier.test.ts +101 -0
  483. package/src/app/lib/actions/held-modifier.ts +108 -0
  484. package/src/app/lib/console-site.tsx +38 -0
  485. package/src/app/lib/navigation.tsx +4 -0
  486. package/src/app/lib/routes.tsx +42 -0
  487. package/src/app/lib/session-failure-toasts.ts +26 -0
  488. package/src/app/lib/session-ui-features.tsx +18 -4
  489. package/src/app/lib/sessions-group.tsx +219 -30
  490. package/src/app/lib/site-opened.tsx +48 -0
  491. package/src/app/lib/site-session-groups.test.ts +173 -6
  492. package/src/app/lib/site-view-routes.test.ts +55 -0
  493. package/src/app/lib/use-session-list-hint-refresh.tsx +44 -4
  494. package/src/app/routes/artifacts.tsx +2 -29
  495. package/src/app/routes/session-transient-failures.test.tsx +343 -0
  496. package/src/app/routes/session-unavailable.tsx +74 -3
  497. package/src/app/routes/session.tsx +4 -13
  498. package/src/app/routes/sessions-index.tsx +13 -9
  499. package/src/app/routes/site-view.test.tsx +476 -0
  500. package/src/app/routes/site-view.tsx +583 -0
  501. package/src/components/browser-viewer.tsx +16 -2
  502. package/src/hooks/internal.ts +129 -6
  503. package/src/hooks/use-client-config-flags.ts +8 -0
  504. package/src/hooks/use-session-events.ts +83 -9
  505. package/src/hooks/use-workspace-sessions.ts +21 -1
  506. package/src/messages/en.ts +3 -3
  507. package/src/session-list-model.ts +4 -0
  508. package/src/timeline/activity-rail.tsx +3 -2
  509. package/src/timeline/invoked-tool.ts +14 -4
  510. package/src/timeline/projection.ts +15 -8
  511. package/src/timeline/rolling-activity.tsx +6 -2
  512. package/src/timeline/tool-display-name.ts +2 -2
  513. package/src/timeline/tool-icon.tsx +165 -0
  514. package/src/timeline/tool-presentation.ts +207 -48
  515. package/src/timeline/tool-renderers.tsx +1 -70
  516. package/src/timeline/types.ts +2 -0
  517. package/styles/compiled.css +38 -0
  518. package/dist/chunk-22ZBT6CN.js +0 -50
  519. package/dist/chunk-22ZBT6CN.js.map +0 -1
  520. package/dist/chunk-324X6T6G.js.map +0 -1
  521. package/dist/chunk-5JZYPZ72.js.map +0 -1
  522. package/dist/chunk-6W3LF3DB.js.map +0 -1
  523. package/dist/chunk-BJIZ7PL7.js.map +0 -1
  524. package/dist/chunk-CKZW7A5S.js.map +0 -1
  525. package/dist/chunk-DDIBZA4X.js.map +0 -1
  526. package/dist/chunk-EHCUFCXM.js.map +0 -1
  527. package/dist/chunk-GZ64CASI.js.map +0 -1
  528. package/dist/chunk-I6VUUEXH.js.map +0 -1
  529. package/dist/chunk-KF3MF6FP.js.map +0 -1
  530. package/dist/chunk-MYNUBDU7.js.map +0 -1
  531. package/dist/chunk-NAWXARTY.js.map +0 -1
  532. package/dist/chunk-O77Q4NG2.js.map +0 -1
  533. package/dist/chunk-PM3OSANE.js.map +0 -1
  534. package/dist/chunk-Q262Y2YX.js.map +0 -1
  535. package/dist/chunk-Q4NM77K7.js.map +0 -1
  536. package/dist/chunk-Q4OHNGGB.js.map +0 -1
  537. package/dist/chunk-QIYBOFUV.js.map +0 -1
  538. package/dist/chunk-R25ZKOZR.js +0 -24
  539. package/dist/chunk-R25ZKOZR.js.map +0 -1
  540. package/dist/chunk-RGPYMHKI.js.map +0 -1
  541. package/dist/chunk-ROQOVH4N.js.map +0 -1
  542. package/dist/chunk-TQGJN5UZ.js.map +0 -1
  543. package/dist/chunk-V77JK73U.js.map +0 -1
  544. package/dist/chunk-VSQHDBHU.js.map +0 -1
  545. package/dist/chunk-VU2EWALC.js.map +0 -1
  546. package/dist/chunk-XFNLU7EW.js.map +0 -1
  547. package/dist/chunk-Z5WMLJKI.js.map +0 -1
  548. /package/dist/{browser-viewer-RYYQSRTC.js.map → app/components/capabilities/session-chrome-card.js.map} +0 -0
  549. /package/dist/{chat-interactive-block-ABCRKXJ4.js.map → app/lib/console-site.js.map} +0 -0
  550. /package/dist/{computer-viewer-KEDVLD42.js.map → app/lib/site-opened.js.map} +0 -0
  551. /package/dist/{embedded-new-voice-5PYRDZ6T.js.map → browser-viewer-QMCNV4RI.js.map} +0 -0
  552. /package/dist/{embedded-voice-PABC5NBD.js.map → chat-interactive-block-PMIAUXSO.js.map} +0 -0
  553. /package/dist/{chunk-GIZGNFIX.js.map → chunk-22FFOHPT.js.map} +0 -0
  554. /package/dist/{chunk-UHFWF6ZU.js.map → chunk-2FPS5H2D.js.map} +0 -0
  555. /package/dist/{chunk-5POTDNQT.js.map → chunk-2NC7NZCE.js.map} +0 -0
  556. /package/dist/{chunk-ZKYYZH6L.js.map → chunk-2QBYDGWO.js.map} +0 -0
  557. /package/dist/{chunk-TWXIFWBD.js.map → chunk-34EU25RL.js.map} +0 -0
  558. /package/dist/{chunk-LQKKSUCR.js.map → chunk-35BC2FU2.js.map} +0 -0
  559. /package/dist/{chunk-PTGRFAMH.js.map → chunk-3ABPIUCK.js.map} +0 -0
  560. /package/dist/{chunk-S4SC5SSV.js.map → chunk-3GU7AWG7.js.map} +0 -0
  561. /package/dist/{chunk-722UO6YQ.js.map → chunk-3PEXVG4D.js.map} +0 -0
  562. /package/dist/{chunk-OQAAI33Y.js.map → chunk-3RMKPHBL.js.map} +0 -0
  563. /package/dist/{chunk-GCGTYXJJ.js.map → chunk-3STBLX4O.js.map} +0 -0
  564. /package/dist/{chunk-YXIW7H4N.js.map → chunk-3X5FKDYQ.js.map} +0 -0
  565. /package/dist/{chunk-KTRKZRID.js.map → chunk-4GLLWX33.js.map} +0 -0
  566. /package/dist/{chunk-SD2K5ZN5.js.map → chunk-4LPA25NQ.js.map} +0 -0
  567. /package/dist/{chunk-DKCX643S.js.map → chunk-4RMN4E2Y.js.map} +0 -0
  568. /package/dist/{chunk-E5FCEDMU.js.map → chunk-4SAGYEVB.js.map} +0 -0
  569. /package/dist/{chunk-HTT3FB7T.js.map → chunk-4VK2R5QC.js.map} +0 -0
  570. /package/dist/{chunk-CKG2EG62.js.map → chunk-4XQC7VLT.js.map} +0 -0
  571. /package/dist/{chunk-IVOA3DXA.js.map → chunk-4YXAQMTD.js.map} +0 -0
  572. /package/dist/{chunk-HOJGAJAB.js.map → chunk-52WK2GGK.js.map} +0 -0
  573. /package/dist/{chunk-NYZQ7LO7.js.map → chunk-552UYIQ7.js.map} +0 -0
  574. /package/dist/{chunk-LEXPBQ56.js.map → chunk-5DSKMG2I.js.map} +0 -0
  575. /package/dist/{chunk-WNG757ID.js.map → chunk-5FA455GR.js.map} +0 -0
  576. /package/dist/{chunk-MNWQAYY3.js.map → chunk-5FEN3KYH.js.map} +0 -0
  577. /package/dist/{chunk-OSVHU2WU.js.map → chunk-5JHRMUAZ.js.map} +0 -0
  578. /package/dist/{chunk-RKB2Z457.js.map → chunk-5VGJXWQ2.js.map} +0 -0
  579. /package/dist/{chunk-GFUUFM2O.js.map → chunk-5W6ZDKRR.js.map} +0 -0
  580. /package/dist/{chunk-NDETTZQA.js.map → chunk-5W7KJ5NQ.js.map} +0 -0
  581. /package/dist/{chunk-Q35YZVDZ.js.map → chunk-5Y2FPLZE.js.map} +0 -0
  582. /package/dist/{chunk-F3NERYBQ.js.map → chunk-62VER7O4.js.map} +0 -0
  583. /package/dist/{chunk-FBMU3VK5.js.map → chunk-6DCEDIF6.js.map} +0 -0
  584. /package/dist/{chunk-WUHB422G.js.map → chunk-73WI7FL2.js.map} +0 -0
  585. /package/dist/{chunk-QECZVL7S.js.map → chunk-7FJMRJDG.js.map} +0 -0
  586. /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
  587. /package/dist/{chunk-XVM566II.js.map → chunk-7KIENXRE.js.map} +0 -0
  588. /package/dist/{chunk-CBY5CXBD.js.map → chunk-7NPCEBZE.js.map} +0 -0
  589. /package/dist/{chunk-46VBQG2D.js.map → chunk-7P4AQMGA.js.map} +0 -0
  590. /package/dist/{chunk-S7PVL7XH.js.map → chunk-A4BD4ZVB.js.map} +0 -0
  591. /package/dist/{chunk-73SOCVLS.js.map → chunk-AIEXYO2X.js.map} +0 -0
  592. /package/dist/{chunk-U7TC2XJQ.js.map → chunk-AJPW3SV4.js.map} +0 -0
  593. /package/dist/{chunk-HRJQAFKR.js.map → chunk-AX6YJA5U.js.map} +0 -0
  594. /package/dist/{chunk-P5WABK2H.js.map → chunk-BCM7C3MJ.js.map} +0 -0
  595. /package/dist/{chunk-DT7BORXG.js.map → chunk-BMJTNPWK.js.map} +0 -0
  596. /package/dist/{chunk-HIHO2QE7.js.map → chunk-BT2MVGHT.js.map} +0 -0
  597. /package/dist/{chunk-3XOISKZC.js.map → chunk-BXQYAAVE.js.map} +0 -0
  598. /package/dist/{chunk-IBTXYLBW.js.map → chunk-CCFWY4GF.js.map} +0 -0
  599. /package/dist/{chunk-ZOC3OP6F.js.map → chunk-CCR33J7L.js.map} +0 -0
  600. /package/dist/{chunk-GTQ3SNEI.js.map → chunk-CD3MO3IC.js.map} +0 -0
  601. /package/dist/{chunk-WSMYOLHG.js.map → chunk-CDEXRJB6.js.map} +0 -0
  602. /package/dist/{chunk-3GLAPCVI.js.map → chunk-CFFNT2OY.js.map} +0 -0
  603. /package/dist/{chunk-FUSFVUIJ.js.map → chunk-CMLJSF2F.js.map} +0 -0
  604. /package/dist/{chunk-O4DYOSOL.js.map → chunk-CP7ZQHBW.js.map} +0 -0
  605. /package/dist/{chunk-IOKSNX74.js.map → chunk-D5OWJZQR.js.map} +0 -0
  606. /package/dist/{chunk-SQGXMHJO.js.map → chunk-DGLRZMXL.js.map} +0 -0
  607. /package/dist/{chunk-GNEHAPKV.js.map → chunk-DJFTH2DI.js.map} +0 -0
  608. /package/dist/{chunk-HQG4SLTE.js.map → chunk-DYJGYGPB.js.map} +0 -0
  609. /package/dist/{chunk-4EAF3HSD.js.map → chunk-EJ7WARW7.js.map} +0 -0
  610. /package/dist/{chunk-3AA6RNGE.js.map → chunk-ENS6E4RZ.js.map} +0 -0
  611. /package/dist/{chunk-OOEO4MKY.js.map → chunk-EPWD4KRA.js.map} +0 -0
  612. /package/dist/{chunk-V5RJAWRP.js.map → chunk-EQE3MNQN.js.map} +0 -0
  613. /package/dist/{chunk-TSBE4KOQ.js.map → chunk-EWL6NDOO.js.map} +0 -0
  614. /package/dist/{chunk-OO2T63BY.js.map → chunk-EYS4ZOF5.js.map} +0 -0
  615. /package/dist/{chunk-IC7KNOBB.js.map → chunk-FDAV72IX.js.map} +0 -0
  616. /package/dist/{chunk-AG7VGUIW.js.map → chunk-FFNPUSVO.js.map} +0 -0
  617. /package/dist/{chunk-P5T36BA3.js.map → chunk-FRP64DEK.js.map} +0 -0
  618. /package/dist/{chunk-KBF3SE7G.js.map → chunk-FSP334UU.js.map} +0 -0
  619. /package/dist/{chunk-ZHFKMMOT.js.map → chunk-FTX5CNHA.js.map} +0 -0
  620. /package/dist/{chunk-KYBALSWW.js.map → chunk-FWOBNL2A.js.map} +0 -0
  621. /package/dist/{chunk-HJ5XWW62.js.map → chunk-FWYEZ3LE.js.map} +0 -0
  622. /package/dist/{chunk-WSLPZ43N.js.map → chunk-G4HQUBO4.js.map} +0 -0
  623. /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
  624. /package/dist/{chunk-G3S2F35T.js.map → chunk-GHHM6WN4.js.map} +0 -0
  625. /package/dist/{chunk-OANSIX34.js.map → chunk-GRSODLVO.js.map} +0 -0
  626. /package/dist/{chunk-EU6XSQFM.js.map → chunk-GXW2I2M2.js.map} +0 -0
  627. /package/dist/{chunk-4246UYVG.js.map → chunk-GZS37O3G.js.map} +0 -0
  628. /package/dist/{chunk-Y7WMW74G.js.map → chunk-HQWVDQXW.js.map} +0 -0
  629. /package/dist/{chunk-YTZQV2DD.js.map → chunk-HU6JTNWF.js.map} +0 -0
  630. /package/dist/{chunk-QRVNI5V6.js.map → chunk-I6KIQKU6.js.map} +0 -0
  631. /package/dist/{chunk-BNUPYHHZ.js.map → chunk-IDXTASGN.js.map} +0 -0
  632. /package/dist/{chunk-L6RXRRN3.js.map → chunk-ILDOW2IQ.js.map} +0 -0
  633. /package/dist/{chunk-VUHPA3XQ.js.map → chunk-ITX2TB4K.js.map} +0 -0
  634. /package/dist/{chunk-ETCB6SUJ.js.map → chunk-J22HD2PB.js.map} +0 -0
  635. /package/dist/{chunk-U47YDYLQ.js.map → chunk-J5MEDX7C.js.map} +0 -0
  636. /package/dist/{chunk-6VQTHC4W.js.map → chunk-J7FBBLHF.js.map} +0 -0
  637. /package/dist/{chunk-QZRDCFHI.js.map → chunk-JM4HQPAI.js.map} +0 -0
  638. /package/dist/{chunk-PIVGX42P.js.map → chunk-JNY5MT3I.js.map} +0 -0
  639. /package/dist/{chunk-XWWXIZFP.js.map → chunk-JO6R5EXF.js.map} +0 -0
  640. /package/dist/{chunk-MM7OKOTE.js.map → chunk-JQCGPTZ6.js.map} +0 -0
  641. /package/dist/{chunk-KNFDWNCH.js.map → chunk-JXT5QDJC.js.map} +0 -0
  642. /package/dist/{chunk-OR37STQZ.js.map → chunk-KEXYBG7Q.js.map} +0 -0
  643. /package/dist/{chunk-AZVANYMB.js.map → chunk-KUNFUSZ7.js.map} +0 -0
  644. /package/dist/{chunk-DXZNDKQD.js.map → chunk-LEEJBZ5B.js.map} +0 -0
  645. /package/dist/{chunk-C535KSTY.js.map → chunk-LF5CBAOS.js.map} +0 -0
  646. /package/dist/{chunk-RIMKJBCD.js.map → chunk-LMPTC4CX.js.map} +0 -0
  647. /package/dist/{chunk-3KVWXKD6.js.map → chunk-LQ47YL6E.js.map} +0 -0
  648. /package/dist/{chunk-H5WGWAYX.js.map → chunk-LT4J7RHI.js.map} +0 -0
  649. /package/dist/{chunk-DSGMYES6.js.map → chunk-MCTTONOW.js.map} +0 -0
  650. /package/dist/{chunk-IGHELZI7.js.map → chunk-MIECLOQC.js.map} +0 -0
  651. /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
  652. /package/dist/{chunk-RKILMLA7.js.map → chunk-MXLKI7BI.js.map} +0 -0
  653. /package/dist/{chunk-45WYYFP6.js.map → chunk-N3ZP4IDU.js.map} +0 -0
  654. /package/dist/{chunk-XRRSFQEV.js.map → chunk-NAZZLAWX.js.map} +0 -0
  655. /package/dist/{chunk-UWJ5P5CU.js.map → chunk-NEK4WB5P.js.map} +0 -0
  656. /package/dist/{chunk-6L7U46Y2.js.map → chunk-NKNVIO66.js.map} +0 -0
  657. /package/dist/{chunk-JKUICTLM.js.map → chunk-NLAFNMPK.js.map} +0 -0
  658. /package/dist/{chunk-4LKNIGHB.js.map → chunk-O2SBHS2N.js.map} +0 -0
  659. /package/dist/{chunk-D3RK3NGM.js.map → chunk-PCFK7HKD.js.map} +0 -0
  660. /package/dist/{chunk-VVCDB2T7.js.map → chunk-PCJLH45G.js.map} +0 -0
  661. /package/dist/{chunk-PZ24CYDO.js.map → chunk-PFAUGEV5.js.map} +0 -0
  662. /package/dist/{chunk-HGMWMK5K.js.map → chunk-PO3BH3KQ.js.map} +0 -0
  663. /package/dist/{chunk-B74GSYR6.js.map → chunk-PUTS4DYW.js.map} +0 -0
  664. /package/dist/{chunk-JSIDLTTG.js.map → chunk-PZ2V2XIK.js.map} +0 -0
  665. /package/dist/{chunk-TMEQPODK.js.map → chunk-PZ37VDB5.js.map} +0 -0
  666. /package/dist/{chunk-LVONK3YQ.js.map → chunk-QRKTESVE.js.map} +0 -0
  667. /package/dist/{chunk-HT5WSUC7.js.map → chunk-QXEDIDBZ.js.map} +0 -0
  668. /package/dist/{chunk-WURSS6MP.js.map → chunk-R66YMYJU.js.map} +0 -0
  669. /package/dist/{chunk-HDHK3SXK.js.map → chunk-RFLYID6H.js.map} +0 -0
  670. /package/dist/{chunk-VMFID36H.js.map → chunk-RQNZDTKT.js.map} +0 -0
  671. /package/dist/{chunk-A2EWJQXX.js.map → chunk-SM5QX6UK.js.map} +0 -0
  672. /package/dist/{chunk-FBE6AIIW.js.map → chunk-SOKNCW5U.js.map} +0 -0
  673. /package/dist/{chunk-PFKTGZKE.js.map → chunk-SY2AAZNB.js.map} +0 -0
  674. /package/dist/{chunk-DFZMKCVP.js.map → chunk-TIQPKOFW.js.map} +0 -0
  675. /package/dist/{chunk-HPPKLBTJ.js.map → chunk-TJQDL3JH.js.map} +0 -0
  676. /package/dist/{chunk-FD4Q5KFL.js.map → chunk-TLL22FFO.js.map} +0 -0
  677. /package/dist/{chunk-QM5H4FPT.js.map → chunk-TV6BWONY.js.map} +0 -0
  678. /package/dist/{chunk-EDFJBX3V.js.map → chunk-U6MPB3K6.js.map} +0 -0
  679. /package/dist/{chunk-TZD3U2S5.js.map → chunk-ULJAOMJA.js.map} +0 -0
  680. /package/dist/{chunk-H5EVWF6L.js.map → chunk-UNNJUJVD.js.map} +0 -0
  681. /package/dist/{chunk-Z6DKXQG7.js.map → chunk-UXXFMF4X.js.map} +0 -0
  682. /package/dist/{chunk-OBQVTCTW.js.map → chunk-UYNCMZX5.js.map} +0 -0
  683. /package/dist/{chunk-KZHW27BV.js.map → chunk-V4QZ7UBK.js.map} +0 -0
  684. /package/dist/{chunk-NEVRLD77.js.map → chunk-VH5EGTH2.js.map} +0 -0
  685. /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
  686. /package/dist/{chunk-H6WWEKEV.js.map → chunk-WCMG4HYI.js.map} +0 -0
  687. /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
  688. /package/dist/{chunk-VW3BBTMA.js.map → chunk-WKHUZIOW.js.map} +0 -0
  689. /package/dist/{chunk-ANHUMDJX.js.map → chunk-WNDTLK44.js.map} +0 -0
  690. /package/dist/{chunk-2DS4UOYQ.js.map → chunk-WSZQNTVN.js.map} +0 -0
  691. /package/dist/{chunk-Z2DAWUO3.js.map → chunk-XMNUZUUA.js.map} +0 -0
  692. /package/dist/{chunk-GAIM5RNE.js.map → chunk-XN7NSPE6.js.map} +0 -0
  693. /package/dist/{chunk-FLGUVRR7.js.map → chunk-Y5BSA3I7.js.map} +0 -0
  694. /package/dist/{chunk-QILLL4JE.js.map → chunk-YEROLKOA.js.map} +0 -0
  695. /package/dist/{chunk-NDF3SH3X.js.map → chunk-YJPKDRI2.js.map} +0 -0
  696. /package/dist/{chunk-VAIESMPY.js.map → chunk-YVBHGMKC.js.map} +0 -0
  697. /package/dist/{chunk-AD22P5X3.js.map → chunk-YXA2EKV3.js.map} +0 -0
  698. /package/dist/{chunk-FDNJVZRE.js.map → chunk-YYCOSTUU.js.map} +0 -0
  699. /package/dist/{chunk-NLMTNEWW.js.map → chunk-Z6E6TUAE.js.map} +0 -0
  700. /package/dist/{chunk-BJW7G6EF.js.map → chunk-Z7IGO5EA.js.map} +0 -0
  701. /package/dist/{chunk-N7JKT4ZU.js.map → chunk-ZEIFJ6PX.js.map} +0 -0
  702. /package/dist/{chunk-VRGOOVDB.js.map → chunk-ZVVT72MT.js.map} +0 -0
  703. /package/dist/{model-policy-picker-menu-CURJ247L.js.map → computer-viewer-25AJIDYA.js.map} +0 -0
  704. /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-new-voice-RZZEJT6M.js.map} +0 -0
  705. /package/dist/{session-realtime-2XIB254N.js.map → embedded-voice-6OKSSPLW.js.map} +0 -0
  706. /package/dist/{fleet-decision-row-QNSTP3VX.js.map → fleet-decision-row-NN2HXDX3.js.map} +0 -0
  707. /package/dist/{platform-activity-row-BMXXNZKX.js.map → platform-activity-row-ENQVIFTL.js.map} +0 -0
  708. /package/dist/{timeline-annotation-markers-X4K2IEOO.js.map → timeline-annotation-markers-KHNYNY2J.js.map} +0 -0
  709. /package/dist/{timeline-annotation-selection-MEHBW676.js.map → timeline-annotation-selection-AXEDJHBP.js.map} +0 -0
  710. /package/dist/{timeline-annotations-dialog-U2FPQ3UY.js.map → timeline-annotations-dialog-AV4ZBXRC.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/browser-viewer.tsx","../src/hooks/use-browser-frame-stream.ts","../src/hooks/use-attached-browsers.ts","../src/hooks/use-browser-identities.ts","../src/hooks/use-browser-downloads.ts","../src/hooks/use-browser-session.ts","../src/hooks/use-browser-sessions.ts","../src/hooks/use-site-auth-connections.ts","../src/components/browser-input.ts","../src/components/browser-select-control.tsx"],"sourcesContent":["import type {\n AttachedBrowserBridge,\n AttachedBrowserDevice,\n BrowserAction,\n BrowserActionBatch,\n BrowserActionReceipt,\n BrowserDiagnosticBatch,\n BrowserDownload,\n BrowserDownloadSaveResponse,\n BrowserFrame,\n BrowserIdentity,\n BrowserObservation,\n BrowserRevision,\n BrowserSession,\n BrowserTarget,\n ComputerSession,\n InteractionPlacement,\n InteractionIntervention,\n InteractionSemanticNode,\n SiteAuthConnection,\n} from \"@opengeni/sdk/interaction\";\nimport { interactionControlFailureFromError } from \"@opengeni/sdk/interaction\";\nimport {\n BugIcon,\n ArchiveIcon,\n ArrowLeftIcon,\n ArrowRightIcon,\n CheckIcon,\n ChevronDownIcon,\n CircleAlertIcon,\n DownloadIcon,\n FileCheck2Icon,\n Globe2Icon,\n LoaderCircleIcon,\n MonitorIcon,\n PlusIcon,\n RefreshCwIcon,\n RotateCcwIcon,\n SaveIcon,\n UserRoundIcon,\n XIcon,\n ZapIcon,\n} from \"lucide-react\";\nimport {\n type FormEvent,\n type ClipboardEvent,\n type CompositionEvent,\n type KeyboardEvent,\n type MouseEvent,\n type PointerEvent,\n type ReactNode,\n type WheelEvent,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n useBrowserFrameStream,\n type BrowserFrameWebSocketFactory,\n} from \"../hooks/use-browser-frame-stream\";\nimport { useAttachedBrowsers } from \"../hooks/use-attached-browsers\";\nimport { useBrowserIdentities } from \"../hooks/use-browser-identities\";\nimport { useBrowserDownloads } from \"../hooks/use-browser-downloads\";\nimport { useBrowserSession, type BrowserFrameInputFence } from \"../hooks/use-browser-session\";\nimport { useBrowserSessions } from \"../hooks/use-browser-sessions\";\nimport { useInteractionInterventions } from \"../hooks/use-interaction-interventions\";\nimport { useSiteAuthConnections } from \"../hooks/use-site-auth-connections\";\nimport { cn } from \"../lib/cn\";\nimport { copyTextToClipboard } from \"../lib/clipboard\";\nimport { formatBytes } from \"../lib/format\";\nimport {\n isInteractionControlUnavailable,\n isSourcePlacementChangedError,\n} from \"../lib/interaction-errors\";\nimport type { EmbeddedBrowserInteractionClientOverride } from \"../session-context\";\nimport { browserKey, HUMAN_BROWSER_HOME_URL, normalizeBrowserAddress } from \"./browser-input\";\nimport { InteractionInterventionBanner } from \"./interaction-intervention-banner\";\nimport { BrowserSelectControl } from \"./browser-select-control\";\nimport { useViewerMenuDismiss } from \"./use-viewer-menu-dismiss\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\n/** Auto-ending a lost attached-device browser: bounded retries for transient failures only. */\nconst STALE_BROWSER_END_MAX_ATTEMPTS = 3;\nconst STALE_BROWSER_END_RETRY_BASE_MS = 5_000;\n\n/**\n * Delay before retrying an automatic end of a lost attached-device browser, or null to stop.\n * A refusal (4xx, e.g. 409 when the server will not end it) is never retried: re-sending it on\n * every registry refresh looped about one request per second on prod.\n */\nexport function staleBrowserEndRetryDelayMs(cause: unknown, failedAttempts: number): number | null {\n const status = (cause as { status?: unknown } | null)?.status;\n if (typeof status === \"number\" && status >= 400 && status < 500) return null;\n if (failedAttempts >= STALE_BROWSER_END_MAX_ATTEMPTS) return null;\n return STALE_BROWSER_END_RETRY_BASE_MS * 2 ** (failedAttempts - 1);\n}\n\nexport type BrowserViewerNotification = {\n kind: \"error\" | \"info\";\n message: string;\n};\n\nexport type BrowserViewerProps = EmbeddedBrowserInteractionClientOverride & {\n /** The selected Opengeni agent/session. Peer BrowserSessions stay discoverable. */\n sessionId: string;\n enabled?: boolean | undefined;\n /** Whether the Browser tab is selected. Keeps the mounted media stream warm\n * while pausing semantic reads behind other dock tabs. */\n active?: boolean | undefined;\n className?: string | undefined;\n onNotify?: ((notification: BrowserViewerNotification) => void) | undefined;\n /** Tests/demos only. Production uses the browser's native WebSocket. */\n webSocketFactory?: BrowserFrameWebSocketFactory | undefined;\n renderEmpty?: ((create: () => void, creating: boolean) => ReactNode) | undefined;\n /** Optional host capability for placing a human-created headed browser inside\n * an exact ComputerSession. Browser-only embedders still create a headed\n * browser; they simply omit the linked desktop resource. */\n createLinkedComputer?:\n | ((\n name: string,\n placement?: InteractionPlacement,\n ) => Promise<Pick<ComputerSession, \"id\" | \"placement\">>)\n | undefined;\n /** Navigate to the exact linked ComputerSession; never a lookalike desktop. */\n onOpenComputer?: ((computerSessionId: string) => void) | undefined;\n /** Restore and report the BrowserSession selected in this task's dock. */\n initialBrowserSessionId?: string | null | undefined;\n onBrowserSessionIdChange?: ((browserSessionId: string | null) => void) | undefined;\n /** Host-owned install/setup surface for attaching an existing Chrome profile.\n * The machine bridge remains discoverable even when this URL is omitted. */\n browserExtensionSetupUrl?: string | undefined;\n};\n\ntype BrowserSelection = { sessionId: string; pinned: boolean } | null;\ntype BrowserLaunchChoice =\n | { kind: \"clean\" }\n | { kind: \"profile\"; identityId: string; baseRevisionId?: string }\n | { kind: \"attached\"; device: AttachedBrowserDevice };\n// ArrayBuffer is opaque to React development prop diagnostics; a Uint8Array\n// exposes every image byte as an enumerable property retained in timing entries.\ntype BrowserViewportFrame = Omit<BrowserFrame, \"data\"> & { data: ArrayBuffer };\n\ntype PointerStart = {\n x: number;\n y: number;\n pointerId: number;\n frame: BrowserViewportFrame;\n};\ntype BrowserResumeAttempt = {\n operationId: string;\n running: boolean;\n terminal: boolean;\n error: Error | null;\n};\ntype BrowserDiagnosticsView = {\n browserSessionId: string;\n targetId: string;\n loading: boolean;\n batch: BrowserDiagnosticBatch | null;\n error: Error | null;\n};\n\n/**\n * Complete browser-native session surface: workspace discovery, agent relevance,\n * browser/tab switching, live frames, semantic fallback, direct human input,\n * address navigation, diagnostics, and reconnect. Closing it never closes the browser.\n */\nexport function BrowserViewer({\n sessionId,\n enabled = true,\n active = true,\n className,\n onNotify,\n webSocketFactory,\n renderEmpty,\n createLinkedComputer,\n onOpenComputer,\n initialBrowserSessionId,\n onBrowserSessionIdChange,\n browserExtensionSetupUrl,\n ...override\n}: BrowserViewerProps) {\n const t = useOpenGeniText();\n const registry = useBrowserSessions({ ...override, sessionId, enabled });\n const attached = useAttachedBrowsers({ ...override, enabled });\n const onlineAttachedBridges = useMemo(\n () => attached.bridges.filter((bridge) => bridge.state === \"online\"),\n [attached.bridges],\n );\n const profiles = useBrowserIdentities({ ...override, enabled, includeArchived: true });\n const siteAuth = useSiteAuthConnections({\n ...override,\n enabled: enabled && profiles.identities.length > 0,\n });\n const createRegistryBrowser = registry.create;\n const refreshRegistry = registry.refresh;\n const loadProfileRevisions = profiles.revisions;\n const liveSessions = useMemo(\n () => registry.sessions.filter((session) => isLiveBrowser(session)),\n [registry.sessions],\n );\n const attachedGenerationLoss = useMemo(\n () => attachedChromeGenerationLoss(registry.sessions),\n [registry.sessions],\n );\n const endedGenerationLossRef = useRef(new Set<string>());\n const endStaleBrowserAttemptsRef = useRef(new Map<string, number>());\n const endStaleBrowser = registry.end;\n useEffect(() => {\n if (!enabled) return;\n for (const session of registry.sessions) {\n if (\n session.lifecycle !== \"lost\" ||\n session.failureCode !== \"controller_transition_expired\" ||\n session.placement.kind !== \"attached_device\"\n ) {\n continue;\n }\n if (endedGenerationLossRef.current.has(session.id)) continue;\n endedGenerationLossRef.current.add(session.id);\n void endStaleBrowser(session.id).catch((cause: unknown) => {\n const attempts = (endStaleBrowserAttemptsRef.current.get(session.id) ?? 0) + 1;\n endStaleBrowserAttemptsRef.current.set(session.id, attempts);\n const delay = staleBrowserEndRetryDelayMs(cause, attempts);\n if (delay === null) return;\n setTimeout(() => endedGenerationLossRef.current.delete(session.id), delay);\n });\n }\n }, [enabled, endStaleBrowser, registry.sessions]);\n const relevant = useMemo(\n () => registry.relevantSessions.filter((session) => isLiveBrowser(session)),\n [registry.relevantSessions],\n );\n const latestRelevantBrowser = registry.relevantSessions[0];\n const unavailableBrowser =\n latestRelevantBrowser?.lifecycle === \"lost\" || latestRelevantBrowser?.lifecycle === \"failed\"\n ? latestRelevantBrowser\n : undefined;\n const [selection, setSelection] = useState<BrowserSelection>(() =>\n initialBrowserSessionId ? { sessionId: initialBrowserSessionId, pinned: true } : null,\n );\n const selectBrowserSession = useCallback(\n (next: BrowserSelection) => {\n setSelection(next);\n onBrowserSessionIdChange?.(next?.sessionId ?? null);\n },\n [onBrowserSessionIdChange],\n );\n const interventions = useInteractionInterventions({\n ...override,\n enabled,\n resourceKind: \"browser_session\",\n });\n const [creating, setCreating] = useState(false);\n const [savingProfile, setSavingProfile] = useState(false);\n const [baseRevisionOrdinal, setBaseRevisionOrdinal] = useState<number | null>(null);\n const [profileHistory, setProfileHistory] = useState<{\n identityId: string;\n loading: boolean;\n revisions: BrowserRevision[];\n } | null>(null);\n const [resumeAttempt, setResumeAttempt] = useState<{\n sessionId: string;\n attempt: BrowserResumeAttempt;\n } | null>(null);\n const resumeAttemptsRef = useRef(new Map<string, BrowserResumeAttempt>());\n const previousSessionIdRef = useRef(sessionId);\n const seenInterventionIdsRef = useRef(new Set<string>());\n const diagnosticRequestRef = useRef(0);\n const viewportFocusHandoffRef = useRef<string | null>(null);\n const [diagnosticsView, setDiagnosticsView] = useState<BrowserDiagnosticsView | null>(null);\n\n const notifyError = useCallback(\n (cause: unknown, fallback: string) => {\n const message = cause instanceof Error ? cause.message : fallback;\n onNotify?.({ kind: \"error\", message });\n },\n [onNotify],\n );\n\n useEffect(() => {\n if (previousSessionIdRef.current !== sessionId) {\n previousSessionIdRef.current = sessionId;\n setSelection(\n initialBrowserSessionId ? { sessionId: initialBrowserSessionId, pinned: true } : null,\n );\n }\n }, [initialBrowserSessionId, sessionId]);\n\n useEffect(() => {\n if (!enabled || registry.loading) return;\n const selectedStillLive = liveSessions.some((session) => session.id === selection?.sessionId);\n // A manually selected workspace browser stays selected, but an unrelated\n // browser must never become the implicit browser for this agent. That made\n // a Modal session appear to own a connected Mac browser.\n if (selection?.pinned && selectedStillLive) return;\n const preferred = relevant[0] ?? null;\n if (!preferred) {\n if (selection) selectBrowserSession(null);\n return;\n }\n if (!selectedStillLive || !selection?.pinned) {\n if (selection?.sessionId !== preferred.id || selection.pinned) {\n selectBrowserSession({ sessionId: preferred.id, pinned: false });\n }\n }\n }, [enabled, liveSessions, registry.loading, relevant, selectBrowserSession, selection]);\n\n const selectedRegistrySession = useMemo(\n () => liveSessions.find((session) => session.id === selection?.sessionId) ?? null,\n [liveSessions, selection?.sessionId],\n );\n const interventionCounts = useMemo(\n () => countInterventions(interventions.interventions),\n [interventions.interventions],\n );\n const selectedInterventions = useMemo(\n () =>\n interventions.interventions.filter(\n (intervention) => intervention.resourceId === selection?.sessionId,\n ),\n [interventions.interventions, selection?.sessionId],\n );\n const controllerReady = selectedRegistrySession?.lifecycle === \"active\";\n const resumeSession = registry.resume;\n const [hasLiveFrame, setHasLiveFrame] = useState(false);\n\n const wakeBrowser = useCallback(\n async (session: BrowserSession, retry = false): Promise<void> => {\n const current = resumeAttemptsRef.current.get(session.id);\n if (current?.running || (!retry && current)) return;\n const operationId = current && !current.terminal ? current.operationId : crypto.randomUUID();\n const attempt: BrowserResumeAttempt = {\n operationId,\n running: true,\n terminal: false,\n error: null,\n };\n resumeAttemptsRef.current.set(session.id, attempt);\n setResumeAttempt({ sessionId: session.id, attempt });\n try {\n const response = await resumeSession(session.id, operationId);\n if (response.operation.state !== \"completed\") {\n throw Object.assign(\n new Error(\n response.operation.error?.message ?? t(\"browserViewer.browserCouldNotReopen2\"),\n ),\n { terminal: true },\n );\n }\n resumeAttemptsRef.current.delete(session.id);\n setResumeAttempt((visible) => (visible?.sessionId === session.id ? null : visible));\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n const failed: BrowserResumeAttempt = {\n operationId,\n running: false,\n terminal:\n typeof cause === \"object\" && cause !== null && \"terminal\" in cause\n ? cause.terminal === true\n : false,\n error,\n };\n resumeAttemptsRef.current.set(session.id, failed);\n setResumeAttempt({ sessionId: session.id, attempt: failed });\n notifyError(error, t(\"browserViewer.couldNotReopenThisBrowser\"));\n }\n },\n [notifyError, resumeSession, t],\n );\n\n useEffect(() => {\n if (!selectedRegistrySession) return;\n if (selectedRegistrySession.lifecycle === \"active\") {\n resumeAttemptsRef.current.delete(selectedRegistrySession.id);\n setResumeAttempt((visible) =>\n visible?.sessionId === selectedRegistrySession.id ? null : visible,\n );\n }\n }, [selectedRegistrySession]);\n\n const browser = useBrowserSession({\n ...override,\n browserSessionId: selection?.sessionId ?? null,\n enabled: enabled && selection !== null && controllerReady,\n semanticObservationEnabled: active && !hasLiveFrame,\n });\n useEffect(() => {\n if (!isSourcePlacementChangedError(browser.error, \"browser_session\")) return;\n void refreshRegistry();\n }, [browser.error, refreshRegistry]);\n const downloads = useBrowserDownloads({\n ...override,\n browserSessionId: selection?.sessionId ?? null,\n enabled:\n enabled &&\n diagnosticsView !== null &&\n controllerReady &&\n browser.session?.capabilities.downloads === true,\n });\n const loadBrowserDiagnostics = browser.diagnostics;\n\n useEffect(() => {\n for (const intervention of interventions.interventions) {\n if (seenInterventionIdsRef.current.has(intervention.id)) continue;\n seenInterventionIdsRef.current.add(intervention.id);\n onNotify?.({\n kind: \"info\",\n message: `${interventionTitle(t, intervention)}: ${intervention.reason}`,\n });\n }\n }, [interventions.interventions, onNotify, t]);\n\n const resolveIntervention = useCallback(\n (intervention: InteractionIntervention, outcome: \"completed\" | \"dismissed\") => {\n void interventions\n .resolve(intervention.id, {\n expectedVersion: intervention.version,\n outcome,\n })\n .then(() => {\n onNotify?.({\n kind: \"info\",\n message:\n outcome === \"completed\"\n ? t(\"browserViewer.agentNotifiedContinuingWork\")\n : t(\"browserViewer.requestCancelled\"),\n });\n })\n .catch((cause) => notifyError(cause, t(\"browserViewer.couldNotUpdateTheBrowser\")));\n },\n [interventions, notifyError, onNotify, t],\n );\n const frames = useBrowserFrameStream({\n ...override,\n browserSessionId: selection?.sessionId ?? null,\n targetId: browser.selectedTarget?.id ?? null,\n enabled:\n enabled &&\n selection !== null &&\n controllerReady &&\n browser.selectedTarget !== null &&\n browser.session?.capabilities.liveFrames === true,\n stream: { format: \"jpeg\", quality: 76, maxWidth: 1_920, maxHeight: 1_200 },\n ...(webSocketFactory ? { webSocketFactory } : {}),\n });\n const receivedFrame = frameMatchesSelectedTarget(\n frames.frame,\n browser.session,\n browser.selectedTarget,\n )\n ? frames.frame\n : null;\n const displayedFrame = useMemo<BrowserViewportFrame | null>(\n () => (receivedFrame ? { ...receivedFrame, data: receivedFrame.data.slice().buffer } : null),\n [receivedFrame],\n );\n const frameIsLive = frames.state === \"live\" && displayedFrame !== null;\n useEffect(() => {\n setHasLiveFrame(frameIsLive);\n }, [frameIsLive]);\n const supportsLiveFrames =\n (browser.session ?? selectedRegistrySession)?.capabilities.liveFrames === true;\n const controlUnavailable = isInteractionControlUnavailable(browser.error);\n const connectionError = controlUnavailable ? browser.error : (frames.error ?? browser.error);\n // A managed controller can reject a stale attachment while the same browser\n // remains healthy. Only extension-attached Chrome requires a new browser on\n // connection-generation loss; an unrelated lost Chrome must not poison the\n // selected managed browser's recovery UI.\n const selectedPlacement = (browser.session ?? selectedRegistrySession)?.placement;\n const selectedChromeGenerationLoss =\n selectedPlacement?.kind === \"attached_device\" &&\n isAttachedChromeGenerationLossError(connectionError);\n const replacementChromeDevice =\n selectedChromeGenerationLoss && selectedPlacement.kind === \"attached_device\"\n ? attached.devices.find((candidate) => candidate.id === selectedPlacement.deviceId)\n : null;\n const displayConnectionState =\n connectionError && (!frameIsLive || controlUnavailable)\n ? \"error\"\n : !browser.session\n ? \"connecting\"\n : supportsLiveFrames\n ? frames.state === \"live\" && !displayedFrame\n ? \"connecting\"\n : frames.state\n : \"semantic\";\n const selectedProfile = useMemo(\n () =>\n profiles.identities.find(\n (identity) =>\n identity.id === (browser.session?.identityId ?? selectedRegistrySession?.identityId),\n ) ?? null,\n [browser.session?.identityId, profiles.identities, selectedRegistrySession?.identityId],\n );\n const selectedProfileAuth = useMemo(\n () =>\n selectedProfile\n ? siteAuth.connections.filter(\n (connection) => connection.preferredIdentityId === selectedProfile.id,\n )\n : [],\n [selectedProfile, siteAuth.connections],\n );\n\n useEffect(() => {\n diagnosticRequestRef.current += 1;\n setDiagnosticsView(null);\n }, [browser.session?.id, browser.selectedTarget?.id]);\n\n const loadDiagnostics = useCallback(() => {\n const browserSessionId = browser.session?.id;\n const targetId = browser.selectedTarget?.id;\n if (!browserSessionId || !targetId) return;\n const requestId = diagnosticRequestRef.current + 1;\n diagnosticRequestRef.current = requestId;\n setDiagnosticsView((current) => ({\n browserSessionId,\n targetId,\n loading: true,\n batch:\n current?.browserSessionId === browserSessionId && current.targetId === targetId\n ? current.batch\n : null,\n error: null,\n }));\n void loadBrowserDiagnostics({ limit: 100 })\n .then((batch) => {\n if (diagnosticRequestRef.current !== requestId) return;\n setDiagnosticsView({ browserSessionId, targetId, loading: false, batch, error: null });\n })\n .catch((cause) => {\n if (diagnosticRequestRef.current !== requestId) return;\n setDiagnosticsView({\n browserSessionId,\n targetId,\n loading: false,\n batch: null,\n error: cause instanceof Error ? cause : new Error(String(cause)),\n });\n });\n }, [browser.selectedTarget?.id, browser.session?.id, loadBrowserDiagnostics]);\n\n const closeDiagnostics = useCallback(() => {\n diagnosticRequestRef.current += 1;\n setDiagnosticsView(null);\n }, []);\n\n const refreshDiagnostics = useCallback(() => {\n loadDiagnostics();\n if (browser.session?.capabilities.downloads) void downloads.refresh();\n }, [browser.session?.capabilities.downloads, downloads, loadDiagnostics]);\n\n const saveDownload = useCallback(\n async (\n downloadId: string,\n destinationPath: string,\n overwrite: boolean,\n ): Promise<BrowserDownloadSaveResponse> => {\n const response = await downloads.saveToWorkspace(downloadId, destinationPath, { overwrite });\n onNotify?.({\n kind: \"info\",\n message: t(\"browserViewer.filenameSavedToDestinationpath\", {\n filename: response.download.filename,\n destinationPath: response.destinationPath,\n }),\n });\n return response;\n },\n [downloads, onNotify, t],\n );\n\n useEffect(() => {\n const identityId = browser.session?.identityId ?? selectedRegistrySession?.identityId;\n const revisionId = browser.session?.baseRevisionId ?? selectedRegistrySession?.baseRevisionId;\n if (!identityId) {\n setBaseRevisionOrdinal(null);\n setProfileHistory(null);\n return;\n }\n let disposed = false;\n setBaseRevisionOrdinal(null);\n setProfileHistory({ identityId, loading: true, revisions: [] });\n void loadProfileRevisions(identityId)\n .then((response) => {\n if (!disposed) {\n setBaseRevisionOrdinal(\n revisionId\n ? (response.revisions.find((revision) => revision.id === revisionId)?.ordinal ?? null)\n : null,\n );\n setProfileHistory({ identityId, loading: false, revisions: response.revisions });\n }\n })\n .catch(() => {\n if (!disposed) setProfileHistory({ identityId, loading: false, revisions: [] });\n });\n return () => {\n disposed = true;\n };\n }, [\n browser.session?.baseRevisionId,\n browser.session?.identityId,\n loadProfileRevisions,\n selectedRegistrySession?.baseRevisionId,\n selectedRegistrySession?.identityId,\n ]);\n\n const createBrowser = useCallback(\n (choice: BrowserLaunchChoice = { kind: \"clean\" }) => {\n if (creating) return;\n const identity =\n choice.kind === \"profile\"\n ? profiles.identities.find((candidate) => candidate.id === choice.identityId)\n : null;\n if (choice.kind === \"profile\" && (!identity || identity.status !== \"active\")) {\n onNotify?.({\n kind: \"error\",\n message: t(\"browserViewer.thisBrowserProfileIsNo\"),\n });\n return;\n }\n const device = choice.kind === \"attached\" ? choice.device : null;\n const browserName =\n device?.profileLabel ??\n device?.name ??\n (identity ? `${identity.name} browser` : t(\"browserViewer.browser\"));\n setCreating(true);\n void (async () => {\n let linkedComputer: Pick<ComputerSession, \"id\" | \"placement\"> | null = null;\n let computerViewUnavailable = false;\n if (createLinkedComputer) {\n try {\n linkedComputer = await createLinkedComputer(\n `${browserName} desktop`,\n device ? { kind: \"attached_device\", deviceId: device.id } : undefined,\n );\n } catch {\n // Browser control is independently useful on locked/headless placements.\n // A linked ComputerSession is an optional visual enhancement and must not\n // prevent the canonical BrowserSession from starting.\n computerViewUnavailable = true;\n }\n }\n const response = await createRegistryBrowser({\n sessionId,\n name: browserName,\n // Human-created browsers are always ordinary visual Chromium/Chrome.\n // Lightpanda remains an agent-only optimization requested explicitly\n // through browser_open; if an agent creates one it is still visible in\n // the shared BrowserSession switcher.\n headless: false,\n initialUrl: HUMAN_BROWSER_HOME_URL,\n ...(device\n ? {\n placement: {\n kind: \"attached_device\" as const,\n deviceId: device.id,\n },\n }\n : {}),\n ...(linkedComputer\n ? {\n linkedComputerSessionId: linkedComputer.id,\n placement: linkedComputer.placement,\n }\n : {}),\n ...(identity\n ? {\n identityId: identity.id,\n ...(choice.kind === \"profile\" && choice.baseRevisionId\n ? { baseRevisionId: choice.baseRevisionId }\n : {}),\n }\n : {}),\n });\n selectBrowserSession({ sessionId: response.session.id, pinned: true });\n if (computerViewUnavailable) {\n onNotify?.({\n kind: \"info\",\n message: t(\"browserViewer.browserOpenedDesktopViewIs\"),\n });\n }\n })()\n .catch((cause) => notifyError(cause, t(\"browserViewer.couldNotOpenABrowser\")))\n .finally(() => setCreating(false));\n },\n [\n createLinkedComputer,\n createRegistryBrowser,\n creating,\n notifyError,\n onNotify,\n selectBrowserSession,\n profiles.identities,\n sessionId,\n t,\n ],\n );\n\n const saveProfileVersion = useCallback(\n async (newProfileName?: string): Promise<boolean> => {\n const session = browser.session;\n if (!session || savingProfile || !session.capabilities.identityPublication) return false;\n setSavingProfile(true);\n try {\n let identity = selectedProfile;\n if (!identity) {\n const name = newProfileName?.trim() ?? \"\";\n if (!name) return false;\n // First-save is intentionally two-phase: the named identity exists\n // before its first immutable revision. If capture/upload failed after\n // that create, retry into the same empty identity instead of turning\n // the recoverable draft into a permanent name conflict.\n identity =\n profiles.identities.find(\n (candidate) =>\n candidate.status === \"active\" &&\n candidate.revisionCount === 0 &&\n candidate.name.localeCompare(name, undefined, { sensitivity: \"base\" }) === 0,\n ) ?? (await profiles.create({ name })).identity;\n }\n const response = await profiles.publish(session.id, {\n identityId: identity.id,\n expectedHeadGeneration: identity.headGeneration,\n advanceDefault: true,\n });\n setBaseRevisionOrdinal(response.revision.ordinal);\n setProfileHistory((current) => ({\n identityId: response.identity.id,\n loading: false,\n revisions:\n current?.identityId === response.identity.id\n ? [\n ...current.revisions.filter((revision) => revision.id !== response.revision.id),\n response.revision,\n ]\n : [response.revision],\n }));\n await Promise.all([browser.refresh(), registry.refresh()]);\n onNotify?.({\n kind: \"info\",\n message:\n response.outcome === \"saved_as_default\"\n ? t(\"browserViewer.nameVersionOrdinalSavedFor\", {\n name: response.identity.name,\n ordinal: response.revision.ordinal,\n })\n : t(\"browserViewer.nameVersionOrdinalSavedAnother\", {\n name: response.identity.name,\n ordinal: response.revision.ordinal,\n }),\n });\n return true;\n } catch (cause) {\n notifyError(cause, t(\"browserViewer.couldNotSaveThisBrowser\"));\n return false;\n } finally {\n setSavingProfile(false);\n }\n },\n [browser, notifyError, onNotify, profiles, registry, savingProfile, selectedProfile, t],\n );\n\n const updateProfile = useCallback(\n async (\n identity: BrowserIdentity,\n update: { name?: string; status?: \"active\" | \"archived\"; defaultRevisionId?: string },\n ): Promise<boolean> => {\n if (savingProfile) return false;\n setSavingProfile(true);\n try {\n const response = await profiles.update(identity.id, {\n expectedVersion: identity.version,\n ...update,\n });\n if (update.defaultRevisionId) {\n const ordinal = profileHistory?.revisions.find(\n (revision) => revision.id === update.defaultRevisionId,\n )?.ordinal;\n onNotify?.({\n kind: \"info\",\n message: ordinal\n ? t(\"browserViewer.nameVersionOpensByDefault\", {\n name: response.identity.name,\n ordinal,\n })\n : t(\"browserViewer.nameOpensByDefault\", { name: response.identity.name }),\n });\n } else if (update.status === \"archived\") {\n onNotify?.({\n kind: \"info\",\n message: t(\"browserViewer.nameHiddenFromNewBrowsers\", { name: response.identity.name }),\n });\n } else if (update.status === \"active\") {\n onNotify?.({ kind: \"info\", message: `${response.identity.name} restored.` });\n }\n return true;\n } catch (cause) {\n notifyError(cause, t(\"browserViewer.couldNotUpdateThisBrowser\"));\n await profiles.refresh().catch(() => undefined);\n return false;\n } finally {\n setSavingProfile(false);\n }\n },\n [notifyError, onNotify, profileHistory?.revisions, profiles, savingProfile, t],\n );\n\n if (!enabled) return null;\n if (registry.loading && liveSessions.length === 0) {\n return (\n <BrowserNotice\n icon={<LoaderCircleIcon className=\"animate-spin\" />}\n text={t(\"browserViewer.findingBrowsers\")}\n {...(className ? { className } : {})}\n />\n );\n }\n if (liveSessions.length === 0) {\n if (renderEmpty && !unavailableBrowser)\n return <>{renderEmpty(() => createBrowser(), creating)}</>;\n return (\n <div\n className={cn(\"flex h-full min-h-0 items-center justify-center bg-og-bg p-6\", className)}\n >\n <div className=\"max-w-sm text-center\">\n <span className=\"mx-auto grid size-10 place-items-center rounded-og-md border border-og-border bg-og-surface-1 text-og-fg-muted\">\n <Globe2Icon className=\"size-4.5\" />\n </span>\n {unavailableBrowser && !attachedGenerationLoss ? (\n <BrowserUnavailableNotice session={unavailableBrowser} />\n ) : (\n <>\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">\n {attachedGenerationLoss\n ? t(\"browserViewer.chromeReconnectedOpenAFresh\")\n : t(\"browserViewer.noBrowserOpen\")}\n </p>\n <p className=\"mt-1 text-og-control leading-5 text-og-fg-muted\">\n {attachedGenerationLoss\n ? t(\"browserViewer.thisChromeProfileIsLive\")\n : t(\"browserViewer.aBrowserAppearsHereWhen\")}\n </p>\n </>\n )}\n <BrowserLaunchMenu\n attachedBridges={onlineAttachedBridges}\n attachedDevices={attached.devices}\n identities={profiles.identities}\n creating={creating}\n mutatingProfile={savingProfile}\n onCreate={createBrowser}\n onRestore={(identity) => updateProfile(identity, { status: \"active\" })}\n setupUrl={browserExtensionSetupUrl}\n prominent\n />\n {registry.error ? (\n <p className=\"mt-3 text-og-control text-og-danger\">{registry.error.message}</p>\n ) : null}\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"relative flex h-full min-h-0 flex-col overflow-hidden bg-og-bg\", className)}\n >\n <BrowserToolbar\n sessions={liveSessions}\n relevantSessionIds={new Set(relevant.map((session) => session.id))}\n selectedSessionId={selection?.sessionId ?? null}\n identities={profiles.identities}\n attachedBridges={onlineAttachedBridges}\n attachedDevices={attached.devices}\n selectedProfile={selectedProfile}\n baseRevisionOrdinal={baseRevisionOrdinal}\n profileHistory={profileHistory}\n authConnections={selectedProfileAuth}\n creating={creating}\n savingProfile={savingProfile}\n refreshing={registry.refreshing || attached.refreshing}\n interventionCounts={interventionCounts}\n onSelect={(browserSessionId) =>\n selectBrowserSession({ sessionId: browserSessionId, pinned: true })\n }\n onFollow={() => {\n const preferred = relevant[0];\n if (preferred) selectBrowserSession({ sessionId: preferred.id, pinned: false });\n }}\n onCreate={createBrowser}\n onSaveProfile={saveProfileVersion}\n onUpdateProfile={updateProfile}\n onOpenProfileVersion={(identityId, baseRevisionId) =>\n createBrowser({ kind: \"profile\", identityId, baseRevisionId })\n }\n onRefresh={() => void Promise.all([registry.refresh(), attached.refresh()])}\n setupUrl={browserExtensionSetupUrl}\n />\n <InteractionInterventionBanner\n interventions={selectedInterventions}\n activeTargetId={browser.selectedTarget?.id ?? null}\n mutating={interventions.mutating}\n onOpen={(intervention) =>\n void browser\n .selectTarget(intervention.targetId)\n .catch((cause) => notifyError(cause, t(\"browserViewer.couldNotOpenTheRequested\")))\n }\n onResolve={resolveIntervention}\n />\n {!selectedRegistrySession ? (\n <BrowserUnselectedPanel\n unavailableBrowser={unavailableBrowser}\n peerCount={liveSessions.length}\n creating={creating}\n onCreate={() => createBrowser()}\n />\n ) : !controllerReady ? (\n <BrowserLifecyclePanel\n session={selectedRegistrySession}\n attempt={\n resumeAttempt?.sessionId === selectedRegistrySession.id ? resumeAttempt.attempt : null\n }\n onResume={() => void wakeBrowser(selectedRegistrySession, true)}\n />\n ) : (\n <>\n <BrowserTabs\n targets={browser.targets}\n selectedTargetId={browser.selectedTarget?.id ?? null}\n mutating={savingProfile}\n tabControl={browser.session?.capabilities.tabs === true}\n onSelect={(targetId) =>\n void browser\n .selectTarget(targetId)\n .catch((cause) => notifyError(cause, t(\"browserViewer.couldNotSwitchTabs\")))\n }\n onClose={(targetId) =>\n void browser\n .closeTarget(targetId)\n .catch((cause) => notifyError(cause, t(\"browserViewer.couldNotCloseTheTab\")))\n }\n onOpen={() =>\n void browser\n .openTarget(HUMAN_BROWSER_HOME_URL)\n .catch((cause) => notifyError(cause, t(\"browserViewer.couldNotOpenATab\")))\n }\n />\n <BrowserAddressBar\n target={browser.selectedTarget}\n loading={browser.loading || browser.mutating || savingProfile}\n onNavigate={(url) =>\n void browser\n .act({ type: \"navigate\", url })\n .catch((cause) => notifyError(cause, t(\"browserViewer.couldNotNavigate\")))\n }\n onHistory={async (direction) => {\n try {\n const action = { type: \"history\", direction } as const;\n if (receivedFrame) await browser.actFromFrame(action, receivedFrame);\n else {\n if (!browser.observation)\n throw new Error(\"The browser page is not ready for input.\");\n await browser.actFromObservation(action, browser.observation);\n }\n } catch (cause) {\n notifyError(\n cause,\n direction === \"back\"\n ? t(\"browserViewer.couldNotGoBack\")\n : t(\"browserViewer.couldNotGoForward\"),\n );\n }\n }}\n onReload={() => {\n const url = browser.selectedTarget?.url;\n if (url)\n void browser\n .act({ type: \"navigate\", url })\n .catch((cause) => notifyError(cause, t(\"browserViewer.couldNotReload\")));\n }}\n />\n {browser.inputFailure ? (\n <div\n role=\"alert\"\n aria-label={t(\"browserViewer.browserInputStatus\")}\n className=\"flex shrink-0 items-center gap-2 border-t border-og-border bg-og-surface-1 px-3 py-2 text-og-xs\"\n >\n <CircleAlertIcon className=\"size-4 shrink-0 text-og-status-failed\" />\n <div className=\"min-w-0 flex-1\">\n <span className=\"font-medium\">\n {browser.inputFailure.state === \"failed\"\n ? t(\"browserViewer.browserInputFailed\")\n : t(\"browserViewer.inputResultUnknown\")}\n </span>\n <p className=\"text-og-fg-subtle\">\n {browser.inputFailure.error?.message ??\n t(\"browserViewer.inspectThePageBeforeContinuing\")}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => void browser.refresh()}\n className=\"shrink-0 rounded border border-og-border px-2 py-1 transition hover:bg-og-surface-2\"\n >\n {t(\"browserViewer.checkBrowser\")}\n </button>\n </div>\n ) : null}\n <div className=\"relative flex min-h-0 min-w-0 flex-1 overflow-hidden\">\n <BrowserViewport\n // A new control scope must discard every buffered gesture and queued action.\n key={JSON.stringify([\n selection?.sessionId,\n browser.selectedTarget?.id,\n browser.selectedTarget?.targetGeneration,\n browser.selectedTarget?.documentGeneration,\n frames.attachment?.controllerGeneration,\n ])}\n focusHandoffRef={viewportFocusHandoffRef}\n focusScope={JSON.stringify([\n selection?.sessionId,\n browser.selectedTarget?.id,\n browser.selectedTarget?.targetGeneration,\n ])}\n frame={displayedFrame}\n connectionState={displayConnectionState}\n supportsLiveFrames={supportsLiveFrames}\n connectionError={connectionError}\n controlUnavailable={controlUnavailable}\n observation={browser.observation}\n mutating={browser.mutating || savingProfile}\n activityLabel={savingProfile ? t(\"browserViewer.savingBrowserVersion\") : undefined}\n clipboardEnabled={browser.session?.capabilities.clipboard === true}\n inputBatchAttachment={frames.attachment}\n onAction={async (action, frame) => {\n const focusedInput =\n frame &&\n action.type === \"pointer\" &&\n action.action === \"click\" &&\n (action.button === undefined || action.button === \"left\") &&\n frames.attachment?.focusedInputObservations === true &&\n frames.attachment.browserSessionId === frame.browserSessionId &&\n frames.attachment.controllerGeneration === frame.controllerGeneration &&\n frames.attachment.targetId === frame.targetId &&\n Date.parse(frames.attachment.expiresAt) > Date.now();\n const receipt = frame\n ? await browser.actFromFrame(\n action,\n frame,\n undefined,\n focusedInput ? \"input\" : \"none\",\n )\n : await browser.act(action);\n if (receipt.state !== \"completed\") {\n throw new Error(\n receipt.error?.message ?? t(\"browserViewer.browserInputDidNotComplete\"),\n );\n }\n return receipt;\n }}\n onReadClipboard={browser.readClipboard}\n onObserveForInput={browser.observeForInput}\n onSelectFromObservation={browser.actFromObservation}\n onReconnect={\n selectedChromeGenerationLoss\n ? () => {\n if (replacementChromeDevice) {\n createBrowser({ kind: \"attached\", device: replacementChromeDevice });\n }\n }\n : () => {\n void browser.refresh();\n frames.reconnect();\n }\n }\n reconnectLabel={\n selectedChromeGenerationLoss && replacementChromeDevice\n ? t(\"browserViewer.openAFreshConnectedChrome\")\n : undefined\n }\n reconnectMessage={\n selectedChromeGenerationLoss\n ? t(\"browserViewer.chromeReconnectedOpenAFresh\")\n : undefined\n }\n onError={(cause) => notifyError(cause, t(\"browserViewer.browserInputFailed2\"))}\n />\n {diagnosticsView ? (\n <BrowserDiagnosticsDrawer\n session={browser.session}\n profile={selectedProfile}\n target={browser.selectedTarget}\n observation={browser.observation}\n baseRevisionOrdinal={baseRevisionOrdinal}\n state={diagnosticsView}\n downloads={downloads.downloads}\n downloadsEnabled={browser.session?.capabilities.downloads === true}\n downloadsLoading={downloads.loading}\n downloadsRefreshing={downloads.refreshing}\n downloadsError={downloads.error}\n savingDownloadIds={downloads.savingDownloadIds}\n onSaveDownload={saveDownload}\n onRefreshDownloads={() => void downloads.refresh()}\n onRefresh={refreshDiagnostics}\n onClose={closeDiagnostics}\n />\n ) : null}\n </div>\n <BrowserStatusBar\n session={browser.session}\n profile={selectedProfile}\n target={browser.selectedTarget}\n observation={browser.observation}\n inputFailure={browser.inputFailure}\n connectionState={displayConnectionState}\n refreshing={registry.refreshing}\n diagnosticsOpen={diagnosticsView !== null}\n onOpenComputer={\n browser.session?.linkedComputerSessionId && onOpenComputer\n ? () => {\n const computerSessionId = browser.session?.linkedComputerSessionId;\n if (computerSessionId) onOpenComputer(computerSessionId);\n }\n : undefined\n }\n onDiagnostics={diagnosticsView ? closeDiagnostics : loadDiagnostics}\n />\n </>\n )}\n </div>\n );\n}\n\nfunction BrowserLifecyclePanel(props: {\n session: BrowserSession;\n attempt: BrowserResumeAttempt | null;\n onResume: () => void;\n}) {\n const t = useOpenGeniText();\n const failed = props.attempt?.error ?? null;\n const label = failed\n ? t(\"browserViewer.browserCouldNotReopen\")\n : props.session.lifecycle === \"suspending\"\n ? t(\"browserViewer.savingBrowserState\")\n : props.session.lifecycle === \"restoring\" || props.attempt?.running\n ? t(\"browserViewer.openingBrowser\")\n : props.session.lifecycle === \"starting\"\n ? t(\"browserViewer.startingBrowser\")\n : t(\"browserViewer.browserIsSleeping\");\n const detail = failed\n ? failed.message\n : props.session.lifecycle === \"suspended\"\n ? t(\"browserViewer.itsPrivateStateIsSaved\")\n : t(\"browserViewer.theBrowserWillReconnectHere\");\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center bg-og-bg p-6 text-center\">\n <div className=\"max-w-sm\">\n <span className=\"mx-auto grid size-10 place-items-center rounded-og-md border border-og-border bg-og-surface-1 text-og-fg-muted\">\n {failed ? (\n <CircleAlertIcon className=\"size-4.5 text-og-danger\" />\n ) : (\n <LoaderCircleIcon className=\"size-4.5 animate-spin\" />\n )}\n </span>\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">{label}</p>\n <p className=\"mt-1 text-og-control leading-5 text-og-fg-muted\">{detail}</p>\n {failed || (props.session.lifecycle === \"suspended\" && !props.attempt?.running) ? (\n <button\n type=\"button\"\n onClick={props.onResume}\n className=\"mt-4 inline-flex h-8 items-center rounded-og-sm border border-og-primary-border bg-og-primary px-3 text-og-control font-medium text-og-primary-fg transition hover:bg-og-primary-hover\"\n >\n {t(\"browserViewer.openBrowser\")}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction BrowserToolbar(props: {\n sessions: BrowserSession[];\n relevantSessionIds: Set<string>;\n selectedSessionId: string | null;\n attachedBridges: AttachedBrowserBridge[];\n attachedDevices: AttachedBrowserDevice[];\n identities: BrowserIdentity[];\n selectedProfile: BrowserIdentity | null;\n baseRevisionOrdinal: number | null;\n profileHistory: { identityId: string; loading: boolean; revisions: BrowserRevision[] } | null;\n authConnections: SiteAuthConnection[];\n creating: boolean;\n savingProfile: boolean;\n refreshing: boolean;\n interventionCounts: Map<string, number>;\n onSelect: (id: string) => void;\n onFollow: () => void;\n onCreate: (choice?: BrowserLaunchChoice) => void;\n onSaveProfile: (newProfileName?: string) => Promise<boolean>;\n onUpdateProfile: (\n identity: BrowserIdentity,\n update: { name?: string; status?: \"active\" | \"archived\"; defaultRevisionId?: string },\n ) => Promise<boolean>;\n onOpenProfileVersion: (identityId: string, baseRevisionId: string) => void;\n onRefresh: () => void;\n setupUrl?: string | undefined;\n}) {\n const t = useOpenGeniText();\n const detailsRef = useViewerMenuDismiss();\n const selected = props.sessions.find((session) => session.id === props.selectedSessionId);\n const current = props.sessions.filter((session) => props.relevantSessionIds.has(session.id));\n const others = props.sessions.filter((session) => !props.relevantSessionIds.has(session.id));\n const choose = (id: string) => {\n props.onSelect(id);\n detailsRef.current?.removeAttribute(\"open\");\n };\n return (\n <div className=\"flex h-10 shrink-0 items-center gap-1.5 border-b border-og-border bg-og-surface-1 px-2\">\n <details ref={detailsRef} className=\"min-w-0\">\n <summary className=\"flex h-7 max-w-52 cursor-pointer list-none items-center gap-2 rounded-og-sm px-2 text-og-control text-og-fg transition hover:bg-og-surface-2 [&::-webkit-details-marker]:hidden\">\n <Globe2Icon className=\"size-3.5 shrink-0 text-og-fg-muted\" />\n <span className=\"truncate font-medium\">\n {selected?.name ?? t(\"browserViewer.browser\")}\n </span>\n {(props.interventionCounts.get(selected?.id ?? \"\") ?? 0) > 0 ? (\n <span className=\"size-1.5 shrink-0 rounded-full bg-og-status-waiting\" />\n ) : null}\n <ChevronDownIcon className=\"size-3 shrink-0 text-og-fg-subtle\" />\n </summary>\n <div className=\"absolute left-2 top-10 z-30 flex max-h-[calc(100%-3rem)] w-72 max-w-[calc(100%-1rem)] flex-col overflow-hidden rounded-og-md border border-og-border bg-og-surface-1 p-1 shadow-xl\">\n <div className=\"min-h-0 max-h-96 overflow-y-auto overscroll-contain\">\n <BrowserSessionGroup\n label={t(\"browserViewer.currentAgent\")}\n sessions={current}\n identities={props.identities}\n selectedId={props.selectedSessionId}\n interventionCounts={props.interventionCounts}\n onSelect={choose}\n />\n <BrowserSessionGroup\n label={t(\"browserViewer.workspaceBrowsers\")}\n sessions={others}\n identities={props.identities}\n selectedId={props.selectedSessionId}\n interventionCounts={props.interventionCounts}\n onSelect={choose}\n />\n </div>\n <div className=\"mt-1 flex shrink-0 gap-1 border-t border-og-border pt-1\">\n {current.length > 0 ? (\n <MenuButton onClick={props.onFollow}>{t(\"browserViewer.followAgent\")}</MenuButton>\n ) : null}\n <MenuButton onClick={() => props.onCreate()} disabled={props.creating}>\n <PlusIcon className=\"size-3.5\" /> {t(\"browserViewer.newBrowser\")}\n </MenuButton>\n </div>\n </div>\n </details>\n <span className=\"min-w-0 flex-1 truncate text-og-xs text-og-fg-subtle\">\n {placementLabel(t, selected)}\n </span>\n <BrowserProfileMenu\n session={selected ?? null}\n identity={props.selectedProfile}\n baseRevisionOrdinal={props.baseRevisionOrdinal}\n history={props.profileHistory}\n authConnections={props.authConnections}\n saving={props.savingProfile}\n onSave={props.onSaveProfile}\n onUpdate={props.onUpdateProfile}\n onOpenVersion={props.onOpenProfileVersion}\n />\n <button\n type=\"button\"\n onClick={props.onRefresh}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted transition hover:bg-og-surface-2 hover:text-og-fg\"\n aria-label={t(\"browserViewer.refreshBrowsers\")}\n >\n <RefreshCwIcon className={cn(\"size-3.5\", props.refreshing && \"animate-spin\")} />\n </button>\n <BrowserLaunchMenu\n attachedBridges={props.attachedBridges}\n attachedDevices={props.attachedDevices}\n identities={props.identities}\n creating={props.creating}\n mutatingProfile={props.savingProfile}\n onCreate={props.onCreate}\n onRestore={(identity) => props.onUpdateProfile(identity, { status: \"active\" })}\n setupUrl={props.setupUrl}\n />\n </div>\n );\n}\n\nfunction BrowserUnselectedPanel(props: {\n unavailableBrowser: BrowserSession | undefined;\n peerCount: number;\n creating: boolean;\n onCreate: () => void;\n}) {\n const t = useOpenGeniText();\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center bg-og-bg p-6 text-center\">\n <div className=\"max-w-sm\">\n <span className=\"mx-auto grid size-10 place-items-center rounded-og-md border border-og-border bg-og-surface-1 text-og-fg-muted\">\n <Globe2Icon className=\"size-4.5\" />\n </span>\n {props.unavailableBrowser ? (\n <BrowserUnavailableNotice session={props.unavailableBrowser} />\n ) : (\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">\n {t(\"browserViewer.noBrowserForThisAgent\")}\n </p>\n )}\n <p className=\"mt-1 text-og-control leading-5 text-og-fg-muted\">\n {props.peerCount === 1\n ? t(\"browserViewer.oneWorkspaceBrowserIsAvailable\")\n : t(\"browserViewer.peercountWorkspaceBrowsersAreAvailable\", {\n peerCount: props.peerCount,\n })}\n </p>\n <button\n type=\"button\"\n disabled={props.creating}\n onClick={props.onCreate}\n className=\"mt-4 inline-flex h-8 items-center gap-1.5 rounded-og-sm border border-og-primary-border bg-og-primary px-3 text-og-control font-medium text-og-primary-fg transition hover:bg-og-primary-hover disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <PlusIcon className=\"size-3.5\" />\n {props.creating ? t(\"browserViewer.opening\") : t(\"browserViewer.newBrowser\")}\n </button>\n </div>\n </div>\n );\n}\n\nfunction BrowserUnavailableNotice({ session }: { session: BrowserSession }) {\n const t = useOpenGeniText();\n const reason =\n session.failureCode === \"provider_deadline_rotation\"\n ? t(\"browserViewer.theComputerRunningItReached\")\n : session.failureCode === \"source_placement_changed\"\n ? t(\"browserViewer.thisChatMovedToAnother\")\n : session.failureCode === \"idle_released\"\n ? t(\"browserViewer.itStoppedAfterItWent\")\n : session.lifecycle === \"failed\"\n ? t(\"browserViewer.itStoppedUnexpectedly\")\n : t(\"browserViewer.theConnectionToItWas\");\n return (\n <div role=\"status\">\n <p className=\"mt-3 text-og-menu font-medium text-og-fg\">\n {t(\"browserViewer.browserUnavailable\")}\n </p>\n <p className=\"mt-1 break-words text-og-control leading-5 text-og-fg-muted\">\n {t(\"browserViewer.nameReasonOpenANew\", { name: session.name, reason })}\n </p>\n </div>\n );\n}\n\nfunction BrowserSessionGroup(props: {\n label: string;\n sessions: BrowserSession[];\n identities: BrowserIdentity[];\n selectedId: string | null;\n interventionCounts: Map<string, number>;\n onSelect: (id: string) => void;\n}) {\n const t = useOpenGeniText();\n if (props.sessions.length === 0) return null;\n return (\n <div className=\"py-1\">\n <p className=\"px-2 pb-1 text-[10px] font-medium uppercase tracking-[0.12em] text-og-fg-subtle\">\n {props.label}\n </p>\n {props.sessions.map((session) => {\n const identity = props.identities.find((candidate) => candidate.id === session.identityId);\n const interventionCount = props.interventionCounts.get(session.id) ?? 0;\n return (\n <button\n key={session.id}\n type=\"button\"\n aria-label={`${session.name}${identity ? ` · ${identity.name}` : \"\"} · ${placementLabel(t, session)}`}\n aria-pressed={session.id === props.selectedId}\n onClick={() => props.onSelect(session.id)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-og-sm px-2 py-1.5 text-left transition hover:bg-og-surface-2\",\n session.id === props.selectedId && \"bg-og-surface-2\",\n )}\n >\n <span\n className={cn(\n \"size-1.5 rounded-full\",\n session.lifecycle === \"active\" ? \"bg-og-status-running\" : \"bg-og-muted\",\n )}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-og-control text-og-fg\">{session.name}</span>\n <span className=\"block truncate text-og-xs text-og-fg-subtle\">\n {identity ? `${identity.name} · ` : \"\"}\n {placementLabel(t, session)}\n </span>\n </span>\n {interventionCount > 0 ? (\n <span className=\"rounded-full bg-og-status-waiting/12 px-1.5 py-0.5 text-[10px] font-medium text-og-status-waiting\">\n {interventionCount}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction BrowserLaunchMenu(props: {\n attachedBridges: AttachedBrowserBridge[];\n attachedDevices: AttachedBrowserDevice[];\n identities: BrowserIdentity[];\n creating: boolean;\n mutatingProfile: boolean;\n onCreate: (choice?: BrowserLaunchChoice) => void;\n onRestore: (identity: BrowserIdentity) => Promise<boolean>;\n setupUrl?: string | undefined;\n prominent?: boolean;\n}) {\n const t = useOpenGeniText();\n const detailsRef = useViewerMenuDismiss();\n const choose = (choice?: BrowserLaunchChoice) => {\n detailsRef.current?.removeAttribute(\"open\");\n props.onCreate(choice);\n };\n const restore = async (identity: BrowserIdentity) => {\n if (await props.onRestore(identity)) detailsRef.current?.removeAttribute(\"open\");\n };\n const busy = props.creating || props.mutatingProfile;\n const activeIdentities = props.identities.filter((identity) => identity.status === \"active\");\n const archivedIdentities = props.identities.filter((identity) => identity.status === \"archived\");\n return (\n <details ref={detailsRef} className={cn(props.prominent && \"mt-4 inline-block\")}>\n <summary\n onClick={(event) => {\n if (busy) event.preventDefault();\n }}\n className={cn(\n \"cursor-pointer list-none items-center justify-center gap-1.5 text-og-fg-muted transition hover:bg-og-surface-2 hover:text-og-fg [&::-webkit-details-marker]:hidden\",\n props.prominent\n ? \"inline-flex h-8 rounded-og-sm border border-og-border bg-og-surface-1 px-3 text-og-control font-medium text-og-fg\"\n : \"grid size-7 place-items-center rounded-og-sm\",\n busy && \"pointer-events-none opacity-50\",\n )}\n aria-label={t(\"browserViewer.newBrowser\")}\n >\n {busy ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />\n ) : (\n <PlusIcon className=\"size-3.5\" />\n )}\n {props.prominent ? t(\"browserViewer.newBrowser\") : null}\n {props.prominent ? <ChevronDownIcon className=\"size-3\" /> : null}\n </summary>\n <div\n className={cn(\n \"absolute z-40 max-h-[calc(100%-3rem)] w-72 max-w-[calc(100%-1rem)] overflow-y-auto rounded-og-md border border-og-border bg-og-surface-1 p-1 text-left shadow-xl\",\n props.prominent ? \"left-1/2 top-2 -translate-x-1/2\" : \"right-2 top-10\",\n )}\n >\n {props.attachedDevices.length > 0 || props.attachedBridges.length > 0 ? (\n <div className=\"pb-1\">\n <p className=\"px-2 pb-1 pt-1 text-[10px] font-medium uppercase tracking-[0.12em] text-og-fg-subtle\">\n {t(\"browserViewer.connectedChrome\")}\n </p>\n {props.attachedDevices.map((device) => (\n <button\n key={device.id}\n type=\"button\"\n onClick={() => choose({ kind: \"attached\", device })}\n className=\"flex w-full items-center gap-2 rounded-og-sm px-2 py-2 text-left transition hover:bg-og-surface-2\"\n >\n <MonitorIcon className=\"size-3.5 shrink-0 text-og-fg-muted\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-og-control text-og-fg\">\n {device.profileLabel ?? device.name}\n </span>\n <span className=\"block truncate text-og-xs text-og-fg-subtle\">\n {t(\"browserViewer.openTabs\", {\n browserName: device.browserName,\n count: device.tabCount,\n })}\n </span>\n </span>\n <span className=\"size-1.5 shrink-0 rounded-full bg-og-status-running\" />\n </button>\n ))}\n {props.attachedBridges.length > 0 ? (\n props.setupUrl ? (\n <a\n href={props.setupUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={() => detailsRef.current?.removeAttribute(\"open\")}\n className=\"flex w-full items-center gap-2 rounded-og-sm px-2 py-2 text-left transition hover:bg-og-surface-2\"\n >\n <PlusIcon className=\"size-3.5 shrink-0 text-og-fg-muted\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-og-control text-og-fg\">\n {props.attachedDevices.length > 0\n ? t(\"browserViewer.connectAnotherChromeProfile\")\n : t(\"browserViewer.connectThisChromeProfile\")}\n </span>\n <span className=\"block truncate text-og-xs text-og-fg-subtle\">\n {t(\"browserViewer.machineConnectedChromeExtensionMissing\")}\n </span>\n </span>\n </a>\n ) : (\n <div className=\"flex w-full items-center gap-2 px-2 py-2 text-left\">\n <MonitorIcon className=\"size-3.5 shrink-0 text-og-fg-muted\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-og-control text-og-fg\">\n {t(\"browserViewer.chromeConnectionReady\")}\n </span>\n <span className=\"block text-og-xs leading-4 text-og-fg-subtle\">\n {t(\"browserViewer.installTheOpengeniBrowserExtension\")}\n </span>\n </span>\n </div>\n )\n ) : null}\n </div>\n ) : null}\n <p\n className={cn(\n \"px-2 pb-1 pt-1 text-[10px] font-medium uppercase tracking-[0.12em] text-og-fg-subtle\",\n (props.attachedDevices.length > 0 || props.attachedBridges.length > 0) &&\n \"border-t border-og-border\",\n )}\n >\n {t(\"browserViewer.openIsolatedBrowser\")}\n </p>\n <button\n type=\"button\"\n onClick={() => choose({ kind: \"clean\" })}\n className=\"flex w-full items-center gap-2 rounded-og-sm px-2 py-2 text-left transition hover:bg-og-surface-2\"\n >\n <Globe2Icon className=\"size-3.5 text-og-fg-muted\" />\n <span>\n <span className=\"block text-og-control text-og-fg\">\n {t(\"browserViewer.freshBrowser\")}\n </span>\n <span className=\"block text-og-xs text-og-fg-subtle\">\n {t(\"browserViewer.visualBrowserNoSavedState\")}\n </span>\n </span>\n </button>\n {activeIdentities.length > 0 ? (\n <div className=\"mt-1 border-t border-og-border pt-1\">\n {activeIdentities.map((identity) => (\n <button\n key={identity.id}\n type=\"button\"\n onClick={() => choose({ kind: \"profile\", identityId: identity.id })}\n className=\"flex w-full items-center gap-2 rounded-og-sm px-2 py-2 text-left transition hover:bg-og-surface-2\"\n >\n <UserRoundIcon className=\"size-3.5 text-og-fg-muted\" />\n <span className=\"min-w-0\">\n <span className=\"block truncate text-og-control text-og-fg\">{identity.name}</span>\n <span className=\"block text-og-xs text-og-fg-subtle\">\n {identity.defaultRevisionId\n ? t(\"browserViewer.savedVersions\", { count: identity.revisionCount })\n : t(\"browserViewer.readyForFirstSignIn\")}\n </span>\n </span>\n </button>\n ))}\n </div>\n ) : null}\n {archivedIdentities.length > 0 ? (\n <details className=\"mt-1 border-t border-og-border pt-1\">\n <summary className=\"flex cursor-pointer list-none items-center gap-1.5 rounded-og-sm px-2 py-1.5 text-og-xs text-og-fg-subtle transition hover:bg-og-surface-2 hover:text-og-fg [&::-webkit-details-marker]:hidden\">\n <ArchiveIcon className=\"size-3\" />{\" \"}\n {t(\"browserViewer.hiddenProfilesLength\", { length: archivedIdentities.length })}\n <ChevronDownIcon className=\"ml-auto size-3\" />\n </summary>\n {archivedIdentities.map((identity) => (\n <button\n key={identity.id}\n type=\"button\"\n disabled={busy}\n onClick={() => void restore(identity)}\n className=\"flex w-full items-center gap-2 rounded-og-sm px-2 py-2 text-left transition hover:bg-og-surface-2 disabled:opacity-50\"\n >\n <RotateCcwIcon className=\"size-3.5 text-og-fg-muted\" />\n <span className=\"min-w-0 flex-1 truncate text-og-control text-og-fg\">\n {t(\"browserViewer.restoreName\", { name: identity.name })}\n </span>\n </button>\n ))}\n </details>\n ) : null}\n </div>\n </details>\n );\n}\n\nfunction BrowserProfileMenu(props: {\n session: BrowserSession | null;\n identity: BrowserIdentity | null;\n baseRevisionOrdinal: number | null;\n history: { identityId: string; loading: boolean; revisions: BrowserRevision[] } | null;\n authConnections: SiteAuthConnection[];\n saving: boolean;\n onSave: (newProfileName?: string) => Promise<boolean>;\n onUpdate: (\n identity: BrowserIdentity,\n update: { name?: string; status?: \"active\" | \"archived\"; defaultRevisionId?: string },\n ) => Promise<boolean>;\n onOpenVersion: (identityId: string, baseRevisionId: string) => void;\n}) {\n const t = useOpenGeniText();\n const detailsRef = useViewerMenuDismiss();\n const nameInputId = useId();\n const [name, setName] = useState(\"\");\n const attached = props.session?.placement.kind === \"attached_device\";\n const canSave =\n (props.session?.capabilities.identityPublication ?? false) &&\n props.identity?.status !== \"archived\";\n const revisions =\n props.identity && props.history?.identityId === props.identity.id\n ? [...props.history.revisions].sort((left, right) => right.ordinal - left.ordinal)\n : [];\n const save = async (newProfileName?: string) => {\n if (await props.onSave(newProfileName)) {\n setName(\"\");\n detailsRef.current?.removeAttribute(\"open\");\n }\n };\n const openVersion = (identityId: string, baseRevisionId: string) => {\n detailsRef.current?.removeAttribute(\"open\");\n props.onOpenVersion(identityId, baseRevisionId);\n };\n const versionLabel = attached\n ? \"live\"\n : props.identity\n ? props.baseRevisionOrdinal\n ? `v${props.baseRevisionOrdinal}`\n : props.session?.baseRevisionId\n ? \"saved\"\n : \"unsaved\"\n : \"temporary\";\n return (\n <details ref={detailsRef} className=\"min-w-0\">\n <summary className=\"flex h-7 max-w-40 cursor-pointer list-none items-center gap-1.5 rounded-og-sm px-2 text-og-xs text-og-fg-muted transition hover:bg-og-surface-2 hover:text-og-fg [&::-webkit-details-marker]:hidden\">\n {props.saving ? (\n <LoaderCircleIcon className=\"size-3 animate-spin\" />\n ) : attached ? (\n <MonitorIcon className=\"size-3\" />\n ) : (\n <UserRoundIcon className=\"size-3\" />\n )}\n <span className=\"truncate\">\n {attached ? props.session?.name : (props.identity?.name ?? t(\"browserViewer.temporary\"))}\n </span>\n {attached || props.identity ? (\n <span className=\"shrink-0 text-og-fg-subtle\">· {versionLabel}</span>\n ) : null}\n <ChevronDownIcon className=\"size-3 shrink-0 text-og-fg-subtle\" />\n </summary>\n <div className=\"absolute right-2 top-10 z-40 max-h-[calc(100%-3rem)] w-72 max-w-[calc(100%-1rem)] overflow-y-auto rounded-og-md border border-og-border bg-og-surface-1 p-3 shadow-xl\">\n <div className=\"flex items-start gap-2\">\n <span className=\"grid size-7 shrink-0 place-items-center rounded-og-sm bg-og-surface-2 text-og-fg-muted\">\n {attached ? (\n <MonitorIcon className=\"size-3.5\" />\n ) : (\n <UserRoundIcon className=\"size-3.5\" />\n )}\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate text-og-control font-medium text-og-fg\">\n {attached\n ? props.session?.name\n : (props.identity?.name ?? t(\"browserViewer.temporaryBrowser\"))}\n </p>\n <p className=\"mt-0.5 text-og-xs leading-4 text-og-fg-subtle\">\n {attached\n ? t(\"browserViewer.thisSessionDrivesTheExisting\")\n : props.identity?.status === \"archived\"\n ? t(\"browserViewer.hiddenFromNewBrowsersThis\")\n : props.identity\n ? props.baseRevisionOrdinal\n ? t(\"browserViewer.startedFromVersionBaserevisionordinal\", {\n baseRevisionOrdinal: props.baseRevisionOrdinal,\n })\n : t(\"browserViewer.notSavedYet\")\n : t(\"browserViewer.thisBrowserIsNotReusable\")}\n </p>\n </div>\n </div>\n {props.identity && revisions.length > 0 ? (\n <div className=\"mt-3 border-t border-og-border pt-2\">\n <p className=\"px-1 text-[10px] font-medium uppercase tracking-[0.12em] text-og-fg-subtle\">\n {t(\"browserViewer.savedVersions2\")}\n </p>\n <div className=\"mt-1 max-h-40 overflow-y-auto\">\n {revisions.map((revision) => {\n const isDefault = revision.id === props.identity?.defaultRevisionId;\n const isCurrent = revision.ordinal === props.baseRevisionOrdinal;\n const materialization = revisionMaterializationSummary(t, revision);\n return (\n <div\n key={revision.id}\n className=\"flex w-full items-center gap-1 rounded-og-sm transition hover:bg-og-surface-2\"\n >\n <button\n type=\"button\"\n disabled={props.saving || props.identity?.status === \"archived\"}\n aria-label={t(\"browserViewer.openNameVersionOrdinal\", {\n name: props.identity!.name,\n ordinal: revision.ordinal,\n })}\n onClick={() => openVersion(props.identity!.id, revision.id)}\n className=\"flex min-w-0 flex-1 items-center gap-2 px-2 py-1.5 text-left disabled:opacity-50\"\n >\n <span className=\"grid size-4 place-items-center text-og-fg-muted\">\n {isCurrent ? <CheckIcon className=\"size-3.5 text-og-accent\" /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-og-control text-og-fg\">\n {t(\"browserViewer.versionOrdinal\", { ordinal: revision.ordinal })}\n </span>\n <span className=\"block truncate text-[10px] text-og-fg-subtle\">\n {materialization.label}\n </span>\n </span>\n {isCurrent ? (\n <span className=\"text-[10px] text-og-fg-subtle\">\n {t(\"browserViewer.current\")}\n </span>\n ) : null}\n </button>\n <button\n type=\"button\"\n disabled={isDefault || props.saving || props.identity?.status === \"archived\"}\n aria-label={\n isDefault\n ? t(\"browserViewer.nameVersionOrdinalIsThe\", {\n name: props.identity!.name,\n ordinal: revision.ordinal,\n })\n : t(\"browserViewer.useNameVersionOrdinalBy\", {\n name: props.identity!.name,\n ordinal: revision.ordinal,\n })\n }\n title={\n isDefault\n ? t(\"browserViewer.defaultVersion\")\n : t(\"browserViewer.useByDefault\")\n }\n onClick={() =>\n void props.onUpdate(props.identity!, { defaultRevisionId: revision.id })\n }\n className=\"mr-1 shrink-0 rounded-og-sm px-2 py-1 text-[10px] text-og-fg-subtle transition hover:bg-og-surface-3 hover:text-og-fg disabled:cursor-default disabled:opacity-70\"\n >\n {isDefault ? t(\"browserViewer.default\") : t(\"browserViewer.makeDefault\")}\n </button>\n </div>\n );\n })}\n </div>\n <p className=\"mt-1 px-2 text-[10px] leading-4 text-og-fg-subtle\">\n {t(\"browserViewer.changingTheDefaultAffectsOnly\")}\n </p>\n </div>\n ) : props.identity &&\n props.history?.identityId === props.identity.id &&\n props.history.loading ? (\n <p className=\"mt-3 flex items-center gap-1.5 border-t border-og-border px-2 pt-2 text-og-xs text-og-fg-subtle\">\n <LoaderCircleIcon className=\"size-3 animate-spin\" />{\" \"}\n {t(\"browserViewer.loadingSavedVersions\")}\n </p>\n ) : null}\n {props.identity && props.authConnections.length > 0 ? (\n <div className=\"mt-3 border-t border-og-border pt-2\">\n <p className=\"px-1 text-[10px] font-medium uppercase tracking-[0.12em] text-og-fg-subtle\">\n {t(\"browserViewer.loginHealth\")}\n </p>\n <div className=\"mt-1 space-y-1\">\n {props.authConnections.map((connection) => {\n const health = siteAuthHealth(t, connection);\n return (\n <div\n key={connection.id}\n className=\"flex items-start gap-2 rounded-og-sm px-2 py-1.5\"\n >\n <span className={cn(\"mt-1 size-1.5 shrink-0 rounded-full\", health.dotClass)} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-og-control text-og-fg\">\n {connection.name}\n </span>\n <span className=\"block truncate text-[10px] text-og-fg-subtle\">\n {connection.accountLabel} · {health.label}\n </span>\n </span>\n </div>\n );\n })}\n </div>\n </div>\n ) : null}\n {canSave ? (\n props.identity ? (\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={props.saving}\n className=\"mt-3 flex h-8 w-full items-center justify-center gap-1.5 rounded-og-sm border border-og-border bg-og-surface-2 px-3 text-og-control font-medium text-og-fg transition hover:bg-og-surface-3 disabled:opacity-50\"\n >\n {props.saving ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />\n ) : (\n <SaveIcon className=\"size-3.5\" />\n )}\n {props.saving\n ? t(\"browserViewer.savingBrowserVersion\")\n : t(\"browserViewer.saveNewVersion\")}\n </button>\n ) : (\n <form\n className=\"mt-3\"\n onSubmit={(event) => {\n event.preventDefault();\n if (name.trim()) void save(name);\n }}\n >\n <label className=\"text-og-xs font-medium text-og-fg-muted\" htmlFor={nameInputId}>\n {t(\"browserViewer.profileName\")}\n </label>\n <div className=\"mt-1 flex gap-1.5\">\n <input\n id={nameInputId}\n value={name}\n onInput={(event) => setName(event.currentTarget.value)}\n maxLength={200}\n placeholder={t(\"browserViewer.work\")}\n className=\"h-8 min-w-0 flex-1 rounded-og-sm border border-og-border bg-og-bg px-2 text-og-control text-og-fg placeholder:text-og-fg-subtle focus:border-og-accent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent\"\n />\n <button\n type=\"submit\"\n disabled={!name.trim() || props.saving}\n className=\"inline-flex h-8 items-center gap-1 rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-2.5 text-og-control font-medium transition hover:bg-og-primary-hover disabled:opacity-50\"\n >\n {props.saving ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />\n ) : (\n <SaveIcon className=\"size-3.5\" />\n )}\n {t(\"browserViewer.save\")}\n </button>\n </div>\n </form>\n )\n ) : (\n <p className=\"mt-3 rounded-og-sm bg-og-surface-2 px-2.5 py-2 text-og-xs text-og-fg-subtle\">\n {attached\n ? t(\"browserViewer.chromeKeepsThisProfileS\")\n : props.identity?.status === \"archived\"\n ? t(\"browserViewer.restoreThisProfileBeforeSaving\")\n : t(\"browserViewer.thisBrowserCannotSaveReusable\")}\n </p>\n )}\n {!attached && props.identity ? (\n <button\n type=\"button\"\n disabled={props.saving}\n onClick={() =>\n void props.onUpdate(props.identity!, {\n status: props.identity!.status === \"active\" ? \"archived\" : \"active\",\n })\n }\n className=\"mt-2 flex h-8 w-full items-center justify-center gap-1.5 rounded-og-sm px-3 text-og-control text-og-fg-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-50\"\n >\n {props.identity.status === \"active\" ? (\n <ArchiveIcon className=\"size-3.5\" />\n ) : (\n <RotateCcwIcon className=\"size-3.5\" />\n )}\n {props.identity.status === \"active\"\n ? t(\"browserViewer.hideFromNewBrowsers\")\n : t(\"browserViewer.restoreProfile\")}\n </button>\n ) : null}\n {canSave ? (\n <p className=\"mt-2 text-[10px] leading-4 text-og-fg-subtle\">\n {t(\"browserViewer.savingRestartsThisBrowserSave\")}\n </p>\n ) : null}\n </div>\n </details>\n );\n}\n\nfunction revisionMaterializationSummary(\n t: OpenGeniText,\n revision: BrowserRevision,\n): { label: string } {\n const materializations = revision.components.map((component) => component.materialization);\n const placementBound = materializations.find(\n (materialization) => materialization.portability === \"placement_bound\",\n );\n if (placementBound) {\n return {\n label: placementBound.reason\n ? t(\"browserViewer.thisMachineOnlyReason\", { reason: placementBound.reason })\n : t(\"browserViewer.thisMachineOnly\"),\n };\n }\n const providerBound = materializations.find(\n (materialization) => materialization.portability === \"provider_bound\",\n );\n if (providerBound) {\n return {\n label: providerBound.reason\n ? t(\"browserViewer.providerBoundReason\", { reason: providerBound.reason })\n : t(\"browserViewer.providerBound\"),\n };\n }\n return { label: t(\"browserViewer.portableBrowserData\") };\n}\n\nfunction siteAuthHealth(\n t: OpenGeniText,\n connection: SiteAuthConnection,\n): {\n label: string;\n dotClass: string;\n} {\n switch (connection.verificationState) {\n case \"verified\":\n return { label: t(\"browserViewer.verified\"), dotClass: \"bg-og-status-running\" };\n case \"needs_repair\":\n return { label: t(\"browserViewer.signInNeedsAttention\"), dotClass: \"bg-og-status-waiting\" };\n case \"failed\":\n return { label: t(\"browserViewer.verificationFailed\"), dotClass: \"bg-og-status-error\" };\n case \"unknown\":\n return { label: t(\"browserViewer.notCheckedYet\"), dotClass: \"bg-og-muted\" };\n }\n}\n\nfunction MenuButton(props: { children: ReactNode; onClick: () => void; disabled?: boolean }) {\n return (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"flex h-7 flex-1 items-center justify-center gap-1 rounded-og-sm px-2 text-og-control text-og-fg-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-50\"\n >\n {props.children}\n </button>\n );\n}\n\nfunction BrowserTabs(props: {\n targets: BrowserTarget[];\n selectedTargetId: string | null;\n mutating: boolean;\n tabControl: boolean;\n onSelect: (id: string) => void;\n onClose: (id: string) => void;\n onOpen: () => void;\n}) {\n const t = useOpenGeniText();\n const pages = props.targets.filter((target) => target.kind === \"page\" || target.kind === \"popup\");\n return (\n <div className=\"flex h-9 shrink-0 items-end gap-px overflow-x-auto border-b border-og-border bg-og-surface-1 px-1 pt-1\">\n {pages.map((target) => (\n <div\n key={target.id}\n className={cn(\n \"group flex h-8 min-w-24 max-w-48 items-center rounded-t-og-sm border border-b-0 border-transparent px-2\",\n target.id === props.selectedTargetId\n ? \"border-og-border bg-og-bg text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => props.onSelect(target.id)}\n className=\"min-w-0 flex-1 truncate text-left text-og-control\"\n >\n {target.title || shortUrl(target.url)}\n </button>\n {props.tabControl ? (\n <button\n type=\"button\"\n onClick={() => props.onClose(target.id)}\n disabled={props.mutating}\n className=\"ml-1 grid size-4 shrink-0 place-items-center rounded opacity-0 transition hover:bg-og-surface-3 group-hover:opacity-100 focus:opacity-100 disabled:opacity-30\"\n aria-label={t(\"browserViewer.closeTitle\", { title: target.title || \"tab\" })}\n >\n <XIcon className=\"size-3\" />\n </button>\n ) : null}\n </div>\n ))}\n {props.tabControl ? (\n <button\n type=\"button\"\n onClick={props.onOpen}\n disabled={props.mutating}\n className=\"mb-1 grid size-6 shrink-0 place-items-center rounded-og-sm text-og-fg-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-40\"\n aria-label={t(\"browserViewer.newTab\")}\n >\n <PlusIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction BrowserAddressBar(props: {\n target: BrowserTarget | null;\n loading: boolean;\n onNavigate: (url: string) => void;\n onHistory: (direction: \"back\" | \"forward\") => Promise<void>;\n onReload: () => void;\n}) {\n const t = useOpenGeniText();\n const [draft, setDraft] = useState(props.target?.url ?? \"\");\n const focusedRef = useRef(false);\n const historyPendingRef = useRef(false);\n const [historyPending, setHistoryPending] = useState(false);\n useEffect(() => {\n if (!focusedRef.current) setDraft(props.target?.url ?? \"\");\n }, [props.target?.id, props.target?.url]);\n const submit = (event: FormEvent) => {\n event.preventDefault();\n if (historyPendingRef.current) return;\n const normalized = normalizeBrowserAddress(draft);\n if (normalized) props.onNavigate(normalized);\n };\n const navigateHistory = async (direction: \"back\" | \"forward\") => {\n if (!props.target || props.loading || historyPendingRef.current) return;\n historyPendingRef.current = true;\n setHistoryPending(true);\n try {\n await props.onHistory(direction);\n } finally {\n historyPendingRef.current = false;\n setHistoryPending(false);\n }\n };\n return (\n <form\n onSubmit={submit}\n aria-busy={historyPending || undefined}\n className=\"flex h-10 shrink-0 items-center gap-1.5 border-b border-og-border bg-og-bg px-2\"\n >\n {([\"back\", \"forward\"] as const).map((direction) => (\n <button\n key={direction}\n type=\"button\"\n onClick={() => void navigateHistory(direction)}\n disabled={!props.target || props.loading}\n aria-disabled={historyPending || undefined}\n className={cn(\n \"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted transition hover:bg-og-surface-2 hover:text-og-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-35\",\n historyPending && \"opacity-50\",\n )}\n aria-label={direction === \"back\" ? t(\"browserViewer.back\") : t(\"browserViewer.forward\")}\n title={direction === \"back\" ? t(\"browserViewer.back\") : t(\"browserViewer.forward\")}\n >\n {direction === \"back\" ? (\n <ArrowLeftIcon className=\"size-3.5\" />\n ) : (\n <ArrowRightIcon className=\"size-3.5\" />\n )}\n </button>\n ))}\n <button\n type=\"button\"\n onClick={props.onReload}\n disabled={!props.target || props.loading || historyPending}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-35\"\n aria-label={t(\"browserViewer.reload\")}\n >\n <RefreshCwIcon\n className={cn(\"size-3.5\", (props.loading || historyPending) && \"animate-spin\")}\n />\n </button>\n <div className=\"flex h-7 min-w-0 flex-1 items-center gap-2 rounded-og-sm border border-og-border bg-og-surface-1 px-2 focus-within:border-og-accent/60\">\n <Globe2Icon className=\"size-3 shrink-0 text-og-fg-subtle\" />\n <input\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onFocus={() => {\n focusedRef.current = true;\n }}\n onBlur={() => {\n focusedRef.current = false;\n }}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n if (historyPendingRef.current) return;\n const normalized = normalizeBrowserAddress(draft);\n if (normalized) props.onNavigate(normalized);\n }}\n disabled={!props.target}\n className=\"min-w-0 flex-1 bg-transparent text-og-control text-og-fg placeholder:text-og-fg-subtle focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50\"\n aria-label={t(\"browserViewer.address\")}\n spellCheck={false}\n placeholder={t(\"browserViewer.searchOrEnterAddress\")}\n />\n </div>\n </form>\n );\n}\n\nfunction BrowserViewport(props: {\n focusHandoffRef: { current: string | null };\n focusScope: string;\n frame: BrowserViewportFrame | null;\n connectionState: string;\n supportsLiveFrames: boolean;\n connectionError: Error | null;\n controlUnavailable: boolean;\n observation: ReturnType<typeof useBrowserSession>[\"observation\"];\n mutating: boolean;\n clipboardEnabled: boolean;\n inputBatchAttachment?: {\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n fencedInputBatches?: true | undefined;\n focusedInputObservations?: true | undefined;\n expiresAt: string;\n } | null;\n activityLabel?: string | undefined;\n onAction: (\n action: BrowserAction | BrowserActionBatch,\n frame: BrowserFrameInputFence | null,\n ) => Promise<BrowserActionReceipt>;\n onReadClipboard: () => Promise<{ text: string }>;\n onObserveForInput: () => Promise<BrowserObservation>;\n onSelectFromObservation: (\n action: BrowserAction,\n observation: BrowserObservation,\n ) => Promise<BrowserActionReceipt>;\n onReconnect: () => void;\n reconnectLabel?: string | undefined;\n reconnectMessage?: string | undefined;\n onError: (cause: unknown) => void;\n}) {\n const t = useOpenGeniText();\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const inputRef = useRef<HTMLTextAreaElement | null>(null);\n const [selectPopup, setSelectPopup] = useState<{\n observation: BrowserObservation | null;\n anchor: { x: number; y: number } | null;\n } | null>(null);\n const inputSequenceRef = useRef(0);\n const dismissSelectPopup = useCallback(() => {\n inputSequenceRef.current += 1;\n setSelectPopup({ observation: null, anchor: null });\n }, []);\n const composingRef = useRef(false);\n const pointerStartRef = useRef<PointerStart | null>(null);\n const lastClickRef = useRef<{\n at: number;\n x: number;\n y: number;\n frame: BrowserViewportFrame;\n } | null>(null);\n const wheelRef = useRef<{\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n frame: BrowserViewportFrame;\n timer: ReturnType<typeof setTimeout> | null;\n } | null>(null);\n const pendingTextRef = useRef<{\n text: string;\n frame: BrowserViewportFrame | null;\n timer: ReturnType<typeof setTimeout>;\n } | null>(null);\n const actionRef = useRef(props.onAction);\n const readClipboardRef = useRef(props.onReadClipboard);\n const observeInputRef = useRef(props.onObserveForInput);\n const errorRef = useRef(props.onError);\n const actionTailRef = useRef<Promise<void>>(Promise.resolve());\n const actionQueueEpochRef = useRef(0);\n const queuedTypingRef = useRef<{\n actions: BrowserAction[];\n frame: BrowserFrameInputFence;\n epoch: number;\n } | null>(null);\n const queuedFrameRef = useRef<BrowserViewportFrame | null>(null);\n const currentFrameRef = useRef<BrowserViewportFrame | null>(props.frame);\n const paintedFrameRef = useRef<BrowserViewportFrame | null>(null);\n const [paintedFrame, setPaintedFrame] = useState<BrowserViewportFrame | null>(null);\n const decodingFrameRef = useRef(false);\n const mountedRef = useRef(true);\n actionRef.current = props.onAction;\n readClipboardRef.current = props.onReadClipboard;\n observeInputRef.current = props.onObserveForInput;\n errorRef.current = props.onError;\n\n const clearBufferedInput = useCallback(() => {\n dismissSelectPopup();\n if (wheelRef.current?.timer) clearTimeout(wheelRef.current.timer);\n if (pendingTextRef.current?.timer) clearTimeout(pendingTextRef.current.timer);\n wheelRef.current = null;\n pendingTextRef.current = null;\n queuedTypingRef.current = null;\n pointerStartRef.current = null;\n lastClickRef.current = null;\n composingRef.current = false;\n if (inputRef.current) inputRef.current.value = \"\";\n }, [dismissSelectPopup]);\n\n const paintQueuedFrames = useCallback(() => {\n if (decodingFrameRef.current) return;\n decodingFrameRef.current = true;\n void (async () => {\n try {\n while (mountedRef.current) {\n const frame = queuedFrameRef.current;\n queuedFrameRef.current = null;\n if (!frame) break;\n\n let objectUrl: string | null = null;\n try {\n const blob = new Blob([frame.data], {\n type: frame.mediaType,\n });\n if (typeof createImageBitmap === \"function\") {\n const bitmap = await createImageBitmap(blob);\n try {\n const canvas = canvasRef.current;\n if (\n mountedRef.current &&\n canvas &&\n currentFrameRef.current &&\n sameBrowserDocument(frame, currentFrameRef.current)\n ) {\n paintCanvas(canvas, bitmap, frame.width, frame.height);\n paintedFrameRef.current = frame;\n setPaintedFrame(frame);\n }\n } finally {\n bitmap.close();\n }\n continue;\n }\n objectUrl = URL.createObjectURL(blob);\n const image = await loadImage(objectUrl);\n const canvas = canvasRef.current;\n if (\n mountedRef.current &&\n canvas &&\n currentFrameRef.current &&\n sameBrowserDocument(frame, currentFrameRef.current)\n ) {\n paintCanvas(canvas, image, frame.width, frame.height);\n paintedFrameRef.current = frame;\n setPaintedFrame(frame);\n }\n } catch (cause) {\n if (\n mountedRef.current &&\n currentFrameRef.current &&\n sameBrowserDocument(frame, currentFrameRef.current)\n )\n errorRef.current(cause);\n } finally {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n }\n }\n } finally {\n decodingFrameRef.current = false;\n if (mountedRef.current && queuedFrameRef.current) paintQueuedFrames();\n }\n })();\n }, []);\n\n useLayoutEffect(() => {\n const keyboardInput = inputRef.current;\n const focusHandoff = props.focusHandoffRef;\n mountedRef.current = true;\n if (focusHandoff.current === props.focusScope) {\n keyboardInput?.focus({ preventScroll: true });\n }\n focusHandoff.current = null;\n return () => {\n // Only a same-target replacement may inherit focus the keyboard sink owned.\n if (document.activeElement === keyboardInput) {\n focusHandoff.current = props.focusScope;\n }\n mountedRef.current = false;\n actionQueueEpochRef.current += 1;\n queuedFrameRef.current = null;\n clearBufferedInput();\n };\n }, [clearBufferedInput, props.focusHandoffRef, props.focusScope]);\n\n useLayoutEffect(() => {\n if (currentFrameRef.current && !props.frame) {\n actionQueueEpochRef.current += 1;\n clearBufferedInput();\n }\n currentFrameRef.current = props.frame;\n if (!props.frame) {\n queuedFrameRef.current = null;\n paintedFrameRef.current = null;\n setPaintedFrame(null);\n return;\n }\n queuedFrameRef.current = props.frame;\n paintQueuedFrames();\n }, [clearBufferedInput, paintQueuedFrames, props.frame]);\n\n const enqueue = useCallback(\n (\n action: BrowserAction,\n frame: BrowserFrameInputFence | null,\n after?: (receipt: BrowserActionReceipt) => Promise<void>,\n selectAnchor?: { x: number; y: number },\n ) => {\n const inputSequence = ++inputSequenceRef.current;\n setSelectPopup({ observation: null, anchor: null });\n // Detach image bytes even when the caller supplied a complete painted frame.\n frame = frame\n ? {\n browserSessionId: frame.browserSessionId,\n controllerGeneration: frame.controllerGeneration,\n targetId: frame.targetId,\n targetGeneration: frame.targetGeneration,\n documentGeneration: frame.documentGeneration,\n frameId: frame.frameId,\n }\n : null;\n const epoch = actionQueueEpochRef.current;\n const attachment = props.inputBatchAttachment;\n const canBatchTyping =\n action.type === \"type\" &&\n !after &&\n frame &&\n attachment?.fencedInputBatches === true &&\n attachment.browserSessionId === frame.browserSessionId &&\n attachment.controllerGeneration === frame.controllerGeneration &&\n attachment.targetId === frame.targetId &&\n Date.parse(attachment.expiresAt) > Date.now();\n const previous = queuedTypingRef.current;\n if (\n canBatchTyping &&\n frame &&\n previous &&\n previous.epoch === epoch &&\n sameFrameFence(previous.frame, frame) &&\n previous.actions.length < 16\n ) {\n // Keep every existing text/input event boundary. Only share transport.\n previous.actions.push(action);\n return;\n }\n const typing = canBatchTyping && frame ? { actions: [action], frame, epoch } : null;\n // Every non-typing action is an ordering barrier, including keys and paste.\n queuedTypingRef.current = typing;\n actionTailRef.current = actionTailRef.current\n .catch(() => undefined)\n .then(async () => {\n if (!mountedRef.current || epoch !== actionQueueEpochRef.current) return;\n if (queuedTypingRef.current === typing) queuedTypingRef.current = null;\n const dispatchedAction =\n typing && typing.actions.length > 1\n ? { type: \"batch\" as const, actions: typing.actions, fenceEachAction: true as const }\n : action;\n // Read after the epoch guard: a queued render callback can retain every\n // frame from that render even when its input fence contains no bytes.\n const receipt = await actionRef.current(dispatchedAction, frame);\n if (!mountedRef.current || epoch !== actionQueueEpochRef.current) return;\n // Alt+Down explicitly opens a native dropdown from the keyboard.\n // Existing controllers return focused-input metadata for clicks only,\n // so use the ordinary authorized read for this explicit gesture.\n const keyboardSelect =\n dispatchedAction.type === \"press\" && dispatchedAction.key === \"Alt+ArrowDown\";\n if ((selectAnchor || keyboardSelect) && inputSequence === inputSequenceRef.current) {\n const observation = keyboardSelect\n ? await observeInputRef.current()\n : receipt.observation;\n if (\n mountedRef.current &&\n epoch === actionQueueEpochRef.current &&\n inputSequence === inputSequenceRef.current &&\n observation\n ) {\n setSelectPopup({ observation, anchor: selectAnchor ?? null });\n }\n }\n await after?.(receipt);\n })\n .catch((cause) => {\n if (!mountedRef.current || epoch !== actionQueueEpochRef.current) return;\n // Do not replay or continue input collected behind a failed request.\n actionQueueEpochRef.current += 1;\n clearBufferedInput();\n errorRef.current(cause);\n });\n },\n [clearBufferedInput, props.inputBatchAttachment],\n );\n\n const point = useCallback(\n (frame: BrowserViewportFrame, clientX: number, clientY: number) =>\n browserPoint(canvasRef.current, frame, clientX, clientY),\n [],\n );\n\n const flushPendingText = useCallback(() => {\n const pending = pendingTextRef.current;\n if (!pending) return;\n clearTimeout(pending.timer);\n pendingTextRef.current = null;\n enqueue({ type: \"type\", text: pending.text }, pending.frame);\n }, [enqueue]);\n\n const flushPendingClick = useCallback(() => {\n lastClickRef.current = null;\n }, []);\n\n const flushPendingWheel = useCallback(() => {\n const batch = wheelRef.current;\n if (!batch) return;\n if (batch.timer) clearTimeout(batch.timer);\n wheelRef.current = null;\n enqueue(\n {\n type: \"pointer\",\n action: \"scroll\",\n x: batch.x,\n y: batch.y,\n deltaX: batch.deltaX,\n deltaY: batch.deltaY,\n },\n batch.frame,\n );\n }, [enqueue]);\n\n const pointerDown = (event: PointerEvent<HTMLCanvasElement>) => {\n const frame = paintedFrameRef.current;\n if (!frame || event.button !== 0) return;\n // Keep the hidden keyboard sink focused after the browser performs the\n // pointerdown default action for the canvas. Without preventing that\n // default, Chrome immediately moves focus back to the document and all\n // subsequent typing/paste is silently lost.\n event.preventDefault();\n dismissSelectPopup();\n flushPendingWheel();\n flushPendingText();\n pointerStartRef.current = {\n x: event.clientX,\n y: event.clientY,\n pointerId: event.pointerId,\n frame,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n inputRef.current?.focus({ preventScroll: true });\n };\n\n const pointerUp = (event: PointerEvent<HTMLCanvasElement>) => {\n const start = pointerStartRef.current;\n pointerStartRef.current = null;\n if (!start || start.pointerId !== event.pointerId) return;\n const from = point(start.frame, start.x, start.y);\n const to = point(start.frame, event.clientX, event.clientY);\n if (!from || !to) return;\n if (Math.hypot(event.clientX - start.x, event.clientY - start.y) > 5) {\n flushPendingClick();\n enqueue(\n {\n type: \"pointer\",\n action: \"drag\",\n x: from.x,\n y: from.y,\n endX: to.x,\n endY: to.y,\n },\n start.frame,\n );\n return;\n }\n const now = Date.now();\n const previous = lastClickRef.current;\n if (\n previous &&\n now - previous.at < 280 &&\n Math.hypot(previous.x - to.x, previous.y - to.y) < 6 &&\n sameFrameFence(previous.frame, start.frame)\n ) {\n lastClickRef.current = null;\n // The first click was already dispatched immediately. Tell CDP this is\n // the continuation (clickCount=2), so the page receives a true dblclick\n // without making every ordinary click wait for the double-click window.\n enqueue({ type: \"pointer\", action: \"click\", clickCount: 2, x: to.x, y: to.y }, start.frame);\n return;\n }\n lastClickRef.current = { at: now, x: to.x, y: to.y, frame: start.frame };\n const viewportBounds = canvasRef.current?.parentElement?.getBoundingClientRect();\n enqueue(\n { type: \"pointer\", action: \"click\", x: to.x, y: to.y },\n start.frame,\n undefined,\n viewportBounds\n ? { x: event.clientX - viewportBounds.left, y: event.clientY - viewportBounds.top + 8 }\n : undefined,\n );\n };\n\n const contextMenu = (event: MouseEvent<HTMLCanvasElement>) => {\n event.preventDefault();\n const frame = paintedFrameRef.current;\n if (!frame) return;\n flushPendingWheel();\n flushPendingText();\n flushPendingClick();\n const at = point(frame, event.clientX, event.clientY);\n if (at) enqueue({ type: \"pointer\", action: \"click\", x: at.x, y: at.y, button: \"right\" }, frame);\n };\n\n const wheel = (event: WheelEvent<HTMLCanvasElement>) => {\n dismissSelectPopup();\n const frame = paintedFrameRef.current;\n if (!frame) return;\n const at = point(frame, event.clientX, event.clientY);\n if (!at) return;\n flushPendingText();\n flushPendingClick();\n event.preventDefault();\n let pending = wheelRef.current;\n if (\n pending &&\n (!sameBrowserDocument(pending.frame, frame) ||\n Math.hypot(pending.x - at.x, pending.y - at.y) > 6)\n ) {\n flushPendingWheel();\n pending = null;\n }\n wheelRef.current = {\n x: at.x,\n y: at.y,\n deltaX: (pending?.deltaX ?? 0) + event.deltaX,\n deltaY: (pending?.deltaY ?? 0) + event.deltaY,\n frame,\n // Retain the first event's deadline so a continuous gesture keeps moving.\n timer: pending?.timer ?? setTimeout(flushPendingWheel, 45),\n };\n };\n\n const keyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n // Candidate selection/editing belongs to the local IME. Forward only the\n // committed text; Enter must not submit the remote page during composition.\n // Safari can end composition before keydown while retaining keyCode 229.\n if (\n composingRef.current ||\n event.nativeEvent.isComposing ||\n event.nativeEvent.keyCode === 229\n ) {\n return;\n }\n dismissSelectPopup();\n flushPendingWheel();\n const command = event.metaKey || event.ctrlKey;\n if (\n props.clipboardEnabled &&\n command &&\n !event.altKey &&\n [\"c\", \"v\"].includes(event.key.toLowerCase())\n ) {\n flushPendingText();\n return;\n }\n const key = browserKey(event);\n if (!key) return;\n event.preventDefault();\n flushPendingText();\n flushPendingClick();\n enqueue({ type: \"press\", key }, paintedFrameRef.current);\n };\n\n const finishCopy = useCallback(async () => {\n const clipboard = await readClipboardRef.current();\n if (!mountedRef.current) return;\n if (clipboard.text.length === 0) return;\n if (!(await copyTextToClipboard(clipboard.text))) {\n throw new Error(t(\"browserViewer.browserTextCouldNotBe\"));\n }\n }, [t]);\n\n const copy = (event: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!props.clipboardEnabled) return;\n event.preventDefault();\n flushPendingWheel();\n flushPendingText();\n flushPendingClick();\n enqueue({ type: \"clipboard\", operation: \"copy\" }, paintedFrameRef.current, finishCopy);\n };\n\n const paste = (event: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!props.clipboardEnabled) return;\n event.preventDefault();\n flushPendingWheel();\n flushPendingText();\n flushPendingClick();\n enqueue(\n {\n type: \"clipboard\",\n operation: \"paste\",\n text: event.clipboardData.getData(\"text/plain\"),\n },\n paintedFrameRef.current,\n );\n };\n\n const input = (value: string, nativeComposing = false) => {\n dismissSelectPopup();\n if (composingRef.current || nativeComposing) return;\n if (!value) return;\n flushPendingWheel();\n flushPendingClick();\n const pending = pendingTextRef.current;\n if (pending && sameOptionalBrowserFrame(pending.frame, paintedFrameRef.current)) {\n clearTimeout(pending.timer);\n pending.text += value;\n pending.timer = setTimeout(flushPendingText, 16);\n } else {\n flushPendingText();\n pendingTextRef.current = {\n text: value,\n frame: paintedFrameRef.current,\n timer: setTimeout(flushPendingText, 16),\n };\n }\n if (inputRef.current) inputRef.current.value = \"\";\n };\n\n const compositionStart = () => {\n composingRef.current = true;\n };\n\n const compositionEnd = (event: CompositionEvent<HTMLTextAreaElement>) => {\n composingRef.current = false;\n input(event.currentTarget.value || event.data);\n };\n\n const showCanvas =\n !props.controlUnavailable &&\n props.frame !== null &&\n paintedFrame !== null &&\n sameBrowserDocument(props.frame, paintedFrame);\n return (\n <div className=\"relative min-h-0 flex-1 overflow-hidden bg-black\">\n <canvas\n ref={canvasRef}\n className={cn(\n \"absolute inset-0 m-auto max-h-full max-w-full touch-none focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent\",\n !showCanvas && \"invisible\",\n )}\n onPointerDown={pointerDown}\n onPointerUp={pointerUp}\n onPointerCancel={() => {\n pointerStartRef.current = null;\n }}\n onContextMenu={contextMenu}\n onWheel={wheel}\n aria-label={t(\"browserViewer.interactiveBrowserPage\")}\n />\n <textarea\n ref={inputRef}\n disabled={props.controlUnavailable}\n defaultValue=\"\"\n onInput={(event) =>\n input(event.currentTarget.value, (event.nativeEvent as InputEvent).isComposing)\n }\n onCompositionStart={compositionStart}\n onCompositionEnd={compositionEnd}\n onKeyDown={keyDown}\n onCopy={copy}\n onPaste={paste}\n className=\"pointer-events-none absolute left-1/2 top-1/2 size-px resize-none overflow-hidden opacity-0\"\n aria-label={t(\"browserViewer.browserKeyboardInput\")}\n aria-keyshortcuts=\"Alt+ArrowDown\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n />\n {!showCanvas ? (\n <SemanticBrowserFallback\n observation={props.observation}\n connectionState={props.connectionState}\n supportsLiveFrames={props.supportsLiveFrames}\n error={props.connectionError}\n controlUnavailable={props.controlUnavailable}\n onAction={(action) => enqueue(action, null)}\n onReconnect={props.onReconnect}\n reconnectLabel={props.reconnectLabel}\n reconnectMessage={props.reconnectMessage}\n />\n ) : null}\n {showCanvas ? (\n <BrowserSelectControl\n manualFallback={props.inputBatchAttachment?.focusedInputObservations !== true}\n activation={selectPopup}\n onDismiss={() => inputRef.current?.focus({ preventScroll: true })}\n observe={async () => {\n flushPendingText();\n flushPendingWheel();\n await actionTailRef.current;\n if (!mountedRef.current) throw new Error(t(\"browserViewer.theBrowserPageChanged\"));\n return await props.onObserveForInput();\n }}\n act={props.onSelectFromObservation}\n />\n ) : null}\n {props.mutating ? (\n <div className=\"pointer-events-none absolute right-3 top-3 flex items-center gap-1.5 rounded-full border border-white/10 bg-black/65 px-2.5 py-1 text-[11px] text-white/80 backdrop-blur\">\n <LoaderCircleIcon className=\"size-3 animate-spin\" />{\" \"}\n {props.activityLabel ?? t(\"browserViewer.acting\")}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction SemanticBrowserFallback(props: {\n observation: ReturnType<typeof useBrowserSession>[\"observation\"];\n connectionState: string;\n supportsLiveFrames: boolean;\n error: Error | null;\n controlUnavailable: boolean;\n onAction: (action: BrowserAction) => void;\n onReconnect: () => void;\n reconnectLabel?: string | undefined;\n reconnectMessage?: string | undefined;\n}) {\n const t = useOpenGeniText();\n const controlFailure = interactionControlFailureFromError(props.error);\n const { controlUnavailable } = props;\n const generationLoss = Boolean(props.reconnectMessage);\n const nodes = semanticNodes(\n props.observation?.semantic?.kind === \"snapshot\" ? props.observation.semantic.roots : [],\n );\n const interactive = nodes.filter((node) => node.actions.includes(\"click\")).slice(0, 8);\n return (\n <div className=\"absolute inset-0 grid place-items-center bg-og-bg p-6\">\n <div className=\"w-full max-w-md rounded-og-lg border border-og-border bg-og-surface-1 p-4 shadow-lg\">\n <div className=\"flex items-center gap-2\">\n {props.error ? (\n <CircleAlertIcon className=\"size-4 text-og-danger\" />\n ) : props.connectionState === \"semantic\" ? (\n <ZapIcon className=\"size-4 text-og-fg-muted\" />\n ) : (\n <LoaderCircleIcon className=\"size-4 animate-spin text-og-fg-muted\" />\n )}\n <p className=\"text-og-menu font-medium text-og-fg\">\n {generationLoss\n ? t(\"browserViewer.chromeReconnectedOpenAFresh\")\n : controlUnavailable\n ? t(\"browserViewer.browserControlsUnavailable\")\n : props.error\n ? props.supportsLiveFrames\n ? t(\"browserViewer.liveViewDisconnected\")\n : t(\"browserViewer.browserUnavailable\")\n : props.connectionState === \"semantic\"\n ? t(\"browserViewer.semanticBrowser\")\n : browserConnectionLabel(t, props.connectionState)}\n </p>\n </div>\n {props.error || props.reconnectMessage ? (\n <p className=\"mt-2 text-og-control leading-5 text-og-fg-muted\">\n {props.reconnectMessage ?? controlFailure?.message ?? props.error?.message}\n </p>\n ) : null}\n {interactive.length > 0 && !controlUnavailable ? (\n <div className=\"mt-3 border-t border-og-border pt-3\">\n <p className=\"mb-2 text-og-xs text-og-fg-subtle\">\n {props.supportsLiveFrames\n ? t(\"browserViewer.pageControlsRemainAvailable\")\n : t(\"browserViewer.availablePageControls\")}\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {interactive.map((node) => (\n <button\n key={node.ref}\n type=\"button\"\n onClick={() =>\n props.onAction({\n type: \"click\",\n locator: { kind: \"ref\", ref: node.ref },\n })\n }\n className=\"rounded-og-sm border border-og-border bg-og-surface-1 px-2 py-1 text-og-control text-og-fg transition hover:bg-og-surface-2\"\n >\n {node.name || node.role}\n </button>\n ))}\n </div>\n </div>\n ) : null}\n {props.error && (!generationLoss || props.reconnectLabel) ? (\n <button\n type=\"button\"\n onClick={props.onReconnect}\n className=\"mt-3 text-og-control font-medium og-link\"\n >\n {props.reconnectLabel ??\n (controlFailure?.retryable === false\n ? t(\"browserViewer.tryAgain\")\n : t(\"browserViewer.reconnect\"))}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction BrowserStatusBar(props: {\n session: BrowserSession | null;\n profile: BrowserIdentity | null;\n target: BrowserTarget | null;\n observation: ReturnType<typeof useBrowserSession>[\"observation\"];\n inputFailure: ReturnType<typeof useBrowserSession>[\"inputFailure\"];\n connectionState: string;\n refreshing: boolean;\n diagnosticsOpen: boolean;\n onOpenComputer?: (() => void) | undefined;\n onDiagnostics: () => void;\n}) {\n const t = useOpenGeniText();\n const errors =\n (props.observation?.diagnostics.consoleErrorCount ?? 0) +\n (props.observation?.diagnostics.pageErrorCount ?? 0);\n const failed = props.observation?.diagnostics.failedRequestCount ?? 0;\n return (\n <div className=\"flex h-7 shrink-0 items-center gap-2 border-t border-og-border bg-og-surface-1 px-2 text-og-xs text-og-fg-subtle\">\n <span\n className={cn(\n \"size-1.5 rounded-full\",\n props.connectionState === \"live\" || props.connectionState === \"semantic\"\n ? \"bg-og-status-running\"\n : \"bg-og-muted\",\n )}\n />\n <span>\n {props.connectionState === \"live\"\n ? t(\"browserViewer.live\")\n : props.connectionState === \"semantic\"\n ? t(\"browserViewer.semantic\")\n : browserConnectionLabel(t, props.connectionState)}\n </span>\n {props.inputFailure ? (\n <span className=\"text-og-status-failed\">\n {props.inputFailure.state === \"failed\"\n ? t(\"browserViewer.inputFailed\")\n : t(\"browserViewer.inputResultUnknown\")}\n </span>\n ) : null}\n <span>{props.profile?.name ?? t(\"browserViewer.temporaryBrowser\")}</span>\n <span className=\"min-w-0 flex-1 truncate\">{props.target?.title}</span>\n {props.refreshing ? <LoaderCircleIcon className=\"size-3 animate-spin\" /> : null}\n {props.onOpenComputer ? (\n <button\n type=\"button\"\n onClick={props.onOpenComputer}\n className=\"flex items-center gap-1 rounded px-1.5 py-0.5 transition hover:bg-og-surface-2 hover:text-og-fg\"\n aria-label={t(\"browserViewer.openThisBrowserWindowIn\")}\n >\n <MonitorIcon className=\"size-3\" />\n {t(\"browserViewer.desktop\")}\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={props.onDiagnostics}\n aria-expanded={props.diagnosticsOpen}\n aria-controls=\"browser-diagnostics-drawer\"\n className={cn(\n \"flex items-center gap-1 rounded px-1.5 py-0.5 transition hover:bg-og-surface-2 hover:text-og-fg\",\n props.diagnosticsOpen && \"bg-og-surface-2 text-og-fg\",\n )}\n >\n <BugIcon className=\"size-3\" />\n {errors + failed > 0 ? errors + failed : t(\"browserViewer.debug\")}\n </button>\n </div>\n );\n}\n\nfunction BrowserDiagnosticsDrawer(props: {\n session: BrowserSession | null;\n profile: BrowserIdentity | null;\n target: BrowserTarget | null;\n observation: BrowserObservation | null;\n baseRevisionOrdinal: number | null;\n state: BrowserDiagnosticsView;\n downloads: BrowserDownload[];\n downloadsEnabled: boolean;\n downloadsLoading: boolean;\n downloadsRefreshing: boolean;\n downloadsError: Error | null;\n savingDownloadIds: string[];\n onSaveDownload: (\n downloadId: string,\n destinationPath: string,\n overwrite: boolean,\n ) => Promise<BrowserDownloadSaveResponse>;\n onRefreshDownloads: () => void;\n onRefresh: () => void;\n onClose: () => void;\n}) {\n const t = useOpenGeniText();\n const session = props.session;\n const diagnostics = props.observation?.diagnostics;\n const semanticMode = props.observation?.semantic\n ? t(\"browserViewer.semanticPageStructureAvailable\")\n : props.observation?.screenshot\n ? t(\"browserViewer.visualFallbackInUse\")\n : t(\"browserViewer.waitingForPageObservation\");\n return (\n <aside\n id=\"browser-diagnostics-drawer\"\n role=\"region\"\n aria-label={t(\"browserViewer.browserDiagnostics\")}\n className=\"absolute inset-y-0 right-0 z-40 flex min-h-0 w-full max-w-md flex-col border-l border-og-border bg-og-surface-1 shadow-2xl\"\n >\n <div className=\"flex min-h-11 shrink-0 items-center gap-2 border-b border-og-border px-3 py-2\">\n <BugIcon className=\"size-4 shrink-0 text-og-fg-muted\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-og-control font-semibold text-og-fg\">\n {t(\"browserViewer.browserDiagnostics\")}\n </p>\n <p className=\"truncate text-og-xs text-og-fg-subtle\">\n {props.target?.title ||\n shortUrl(props.target?.url ?? \"\") ||\n t(\"browserViewer.currentTab\")}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={props.onRefresh}\n disabled={props.state.loading}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-40\"\n aria-label={t(\"browserViewer.refreshBrowserDiagnostics\")}\n >\n <RefreshCwIcon className={cn(\"size-3.5\", props.state.loading && \"animate-spin\")} />\n </button>\n <button\n type=\"button\"\n onClick={props.onClose}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted transition hover:bg-og-surface-2 hover:text-og-fg\"\n aria-label={t(\"browserViewer.closeBrowserDiagnostics\")}\n >\n <XIcon className=\"size-3.5\" />\n </button>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <section className=\"border-b border-og-border p-3\" aria-labelledby=\"browser-runtime-title\">\n <h3\n id=\"browser-runtime-title\"\n className=\"text-[10px] font-semibold uppercase tracking-[0.14em] text-og-fg-subtle\"\n >\n {t(\"browserViewer.runtime\")}\n </h3>\n <dl className=\"mt-2 grid grid-cols-[7rem_minmax(0,1fr)] gap-x-3 gap-y-1.5 text-og-xs\">\n <DiagnosticFact\n label={t(\"browserViewer.engine\")}\n value={browserEngineLabel(t, session)}\n />\n <DiagnosticFact\n label={t(\"browserViewer.driver\")}\n value={session?.driverId ?? t(\"browserViewer.unavailable\")}\n />\n <DiagnosticFact\n label={t(\"browserViewer.placement\")}\n value={placementLabel(t, session ?? undefined)}\n />\n <DiagnosticFact\n label={t(\"browserViewer.profile\")}\n value={\n props.profile\n ? `${props.profile.name}${props.baseRevisionOrdinal ? ` · v${props.baseRevisionOrdinal}` : \"\"}`\n : t(\"browserViewer.temporary\")\n }\n />\n <DiagnosticFact\n label={t(\"browserViewer.controller\")}\n value={shortGeneration(t, session?.controller?.controllerGeneration)}\n />\n <DiagnosticFact\n label={t(\"browserViewer.network\")}\n value={\n session?.networkRouteId\n ? t(\"browserViewer.customRoute\")\n : t(\"browserViewer.placementDefault\")\n }\n />\n <DiagnosticFact label={t(\"browserViewer.observation\")} value={semanticMode} />\n </dl>\n </section>\n\n <section className=\"border-b border-og-border p-3\" aria-labelledby=\"browser-page-title\">\n <h3\n id=\"browser-page-title\"\n className=\"text-[10px] font-semibold uppercase tracking-[0.14em] text-og-fg-subtle\"\n >\n {t(\"browserViewer.tabDiagnostics\")}\n </h3>\n <p className=\"mt-1 text-og-xs text-og-fg-subtle\">\n {t(\"browserViewer.includesEarlierPagesInThis\")}\n </p>\n <dl className=\"mt-2 grid grid-cols-2 gap-2\">\n <DiagnosticCount\n label={t(\"browserViewer.consoleErrors\")}\n value={diagnostics?.consoleErrorCount}\n />\n <DiagnosticCount\n label={t(\"browserViewer.pageErrors\")}\n value={diagnostics?.pageErrorCount}\n />\n <DiagnosticCount\n label={t(\"browserViewer.failedRequests\")}\n value={diagnostics?.failedRequestCount}\n />\n <DiagnosticCount\n label={t(\"browserViewer.downloads\")}\n value={diagnostics?.downloadCount}\n />\n </dl>\n {session?.failureCode ? (\n <p className=\"mt-2 rounded-og-sm border border-og-status-error/30 bg-og-status-error/5 px-2.5 py-2 text-og-xs text-og-danger\">\n {t(\"browserViewer.browserStateFailurecode\", { failureCode: session.failureCode })}\n </p>\n ) : null}\n </section>\n\n {props.downloadsEnabled ? (\n <BrowserDownloadsPanel\n downloads={props.downloads}\n loading={props.downloadsLoading}\n refreshing={props.downloadsRefreshing}\n error={props.downloadsError}\n savingDownloadIds={props.savingDownloadIds}\n onSave={props.onSaveDownload}\n onRefresh={props.onRefreshDownloads}\n />\n ) : null}\n\n <section className=\"p-3\" aria-labelledby=\"browser-events-title\">\n <div className=\"flex items-center justify-between gap-2\">\n <h3\n id=\"browser-events-title\"\n className=\"text-[10px] font-semibold uppercase tracking-[0.14em] text-og-fg-subtle\"\n >\n {t(\"browserViewer.recentEvents\")}\n </h3>\n {props.state.batch?.truncated ? (\n <span className=\"text-[10px] text-og-fg-subtle\">{t(\"browserViewer.newest100\")}</span>\n ) : null}\n </div>\n {props.state.loading && !props.state.batch ? (\n <div className=\"flex items-center gap-2 py-6 text-og-control text-og-fg-muted\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />{\" \"}\n {t(\"browserViewer.loadingDiagnostics\")}\n </div>\n ) : props.state.error ? (\n <div className=\"py-5\">\n <p className=\"text-og-control text-og-danger\">{props.state.error.message}</p>\n <button\n type=\"button\"\n onClick={props.onRefresh}\n className=\"mt-2 text-og-control font-medium og-link\"\n >\n {t(\"browserViewer.tryAgain\")}\n </button>\n </div>\n ) : props.state.batch?.entries.length ? (\n <ol className=\"mt-2 space-y-2\">\n {props.state.batch.entries.map((entry) => (\n <li\n key={entry.sequence}\n className=\"rounded-og-sm border border-og-border bg-og-bg p-2.5\"\n >\n <div className=\"flex items-center gap-2 text-[10px] text-og-fg-subtle\">\n <span\n className={cn(\n \"font-semibold uppercase tracking-wide\",\n diagnosticTone(entry.level),\n )}\n >\n {diagnosticKindLabel(t, entry.kind)}\n </span>\n <span className=\"ml-auto\">{formatDiagnosticTime(t, entry.occurredAt)}</span>\n </div>\n <p className=\"mt-1 whitespace-pre-wrap break-words text-og-xs leading-5 text-og-fg\">\n {entry.message}\n </p>\n {entry.url || entry.filename || entry.method || entry.status ? (\n <p className=\"mt-1 truncate font-og-mono text-[10px] text-og-fg-subtle\">\n {[entry.method, entry.status, entry.filename, entry.url]\n .filter((value) => value !== null)\n .join(\" · \")}\n </p>\n ) : null}\n </li>\n ))}\n </ol>\n ) : (\n <p className=\"py-6 text-og-control text-og-fg-muted\">\n {t(\"browserViewer.noDiagnosticsForThisTab\")}\n </p>\n )}\n </section>\n </div>\n </aside>\n );\n}\n\nfunction BrowserDownloadsPanel(props: {\n downloads: BrowserDownload[];\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n savingDownloadIds: string[];\n onSave: (\n downloadId: string,\n destinationPath: string,\n overwrite: boolean,\n ) => Promise<BrowserDownloadSaveResponse>;\n onRefresh: () => void;\n}) {\n const t = useOpenGeniText();\n const [paths, setPaths] = useState<Record<string, string>>({});\n const [overwrite, setOverwrite] = useState<Record<string, boolean>>({});\n const [savedPaths, setSavedPaths] = useState<Record<string, string>>({});\n const [errors, setErrors] = useState<Record<string, string>>({});\n const saving = useMemo(() => new Set(props.savingDownloadIds), [props.savingDownloadIds]);\n\n const save = (download: BrowserDownload) => {\n const destinationPath = (paths[download.id] ?? defaultDownloadDestination(download)).trim();\n if (!destinationPath || saving.has(download.id)) return;\n setErrors((current) => ({ ...current, [download.id]: \"\" }));\n void props\n .onSave(download.id, destinationPath, overwrite[download.id] ?? false)\n .then((response) => {\n setSavedPaths((current) => ({ ...current, [download.id]: response.destinationPath }));\n })\n .catch((cause) => {\n setErrors((current) => ({\n ...current,\n [download.id]:\n cause instanceof Error ? cause.message : t(\"browserViewer.couldNotSaveThisDownload\"),\n }));\n });\n };\n\n return (\n <section className=\"border-b border-og-border p-3\" aria-labelledby=\"browser-downloads-title\">\n <div className=\"flex items-center gap-2\">\n <DownloadIcon className=\"size-3.5 text-og-fg-muted\" />\n <h3\n id=\"browser-downloads-title\"\n className=\"text-[10px] font-semibold uppercase tracking-[0.14em] text-og-fg-subtle\"\n >\n {t(\"browserViewer.downloads\")}\n </h3>\n {props.refreshing ? (\n <LoaderCircleIcon className=\"ml-auto size-3 animate-spin text-og-fg-muted\" />\n ) : null}\n </div>\n\n {props.loading ? (\n <div className=\"flex items-center gap-2 py-5 text-og-control text-og-fg-muted\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" />{\" \"}\n {t(\"browserViewer.loadingDownloads\")}\n </div>\n ) : props.error ? (\n <div className=\"py-4\">\n <p className=\"text-og-control text-og-danger\">{props.error.message}</p>\n <button\n type=\"button\"\n onClick={props.onRefresh}\n className=\"mt-2 text-og-control font-medium og-link\"\n >\n {t(\"browserViewer.tryAgain\")}\n </button>\n </div>\n ) : props.downloads.length === 0 ? (\n <p className=\"py-4 text-og-control text-og-fg-muted\">\n {t(\"browserViewer.noFilesDownloadedYet\")}\n </p>\n ) : (\n <ol className=\"mt-2 space-y-2\">\n {props.downloads.map((download) => {\n const destinationPath = paths[download.id] ?? defaultDownloadDestination(download);\n const isSaving = saving.has(download.id);\n const isSaved = savedPaths[download.id] === destinationPath;\n return (\n <li\n key={download.id}\n className=\"rounded-og-sm border border-og-border bg-og-bg p-2.5\"\n >\n <div className=\"flex min-w-0 items-start gap-2\">\n <span className=\"mt-0.5 grid size-6 shrink-0 place-items-center rounded bg-og-surface-2 text-og-fg-muted\">\n {isSaved ? (\n <FileCheck2Icon className=\"size-3.5 text-og-status-idle\" />\n ) : (\n <DownloadIcon className=\"size-3.5\" />\n )}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p\n className=\"truncate text-og-xs font-medium text-og-fg\"\n title={download.filename}\n >\n {download.filename}\n </p>\n <p className=\"mt-0.5 text-[10px] text-og-fg-subtle\">\n {downloadStatusLabel(t, download)}\n </p>\n </div>\n </div>\n\n {download.status === \"completed\" ? (\n <div className=\"mt-2\">\n <div className=\"flex gap-1.5\">\n <input\n type=\"text\"\n value={destinationPath}\n onInput={(event) => {\n const value = event.currentTarget.value;\n setPaths((current) => ({ ...current, [download.id]: value }));\n setErrors((current) => ({ ...current, [download.id]: \"\" }));\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") save(download);\n }}\n disabled={isSaving}\n aria-label={t(\"browserViewer.workspacePathForFilename\", {\n filename: download.filename,\n })}\n className=\"h-7 min-w-0 flex-1 rounded-og-sm border border-og-border bg-og-surface-1 px-2 font-og-mono text-[10px] text-og-fg transition focus:border-og-accent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => save(download)}\n disabled={\n isSaving ||\n !destinationPath.trim() ||\n (isSaved && !overwrite[download.id])\n }\n className=\"inline-flex h-7 shrink-0 items-center gap-1 rounded-og-sm border border-og-border bg-og-surface-1 px-2 text-[10px] font-medium text-og-fg transition hover:bg-og-surface-2 disabled:opacity-40\"\n >\n {isSaving ? (\n <LoaderCircleIcon className=\"size-3 animate-spin\" />\n ) : (\n <SaveIcon className=\"size-3\" />\n )}\n {isSaving\n ? t(\"browserViewer.saving\")\n : isSaved\n ? t(\"browserViewer.saved\")\n : overwrite[download.id]\n ? t(\"browserViewer.replace\")\n : t(\"browserViewer.save\")}\n </button>\n </div>\n <label className=\"mt-1.5 flex w-fit items-center gap-1.5 text-[10px] text-og-fg-subtle\">\n <input\n type=\"checkbox\"\n checked={overwrite[download.id] ?? false}\n onChange={(event) => {\n setOverwrite((current) => ({\n ...current,\n [download.id]: event.currentTarget.checked,\n }));\n setErrors((current) => ({ ...current, [download.id]: \"\" }));\n }}\n disabled={isSaving}\n className=\"size-3 accent-og-accent\"\n />\n {t(\"browserViewer.replaceAnExistingWorkspaceFile\")}\n </label>\n {errors[download.id] ? (\n <p className=\"mt-1.5 break-words text-[10px] text-og-danger\">\n {errors[download.id]}\n </p>\n ) : null}\n </div>\n ) : null}\n </li>\n );\n })}\n </ol>\n )}\n </section>\n );\n}\n\nfunction downloadStatusLabel(t: OpenGeniText, download: BrowserDownload): string {\n if (download.status === \"completed\") return formatBytes(download.receivedBytes);\n if (download.status === \"in_progress\") {\n const received = formatBytes(download.receivedBytes);\n return download.totalBytes === null\n ? t(\"browserViewer.downloadingReceived\", { received })\n : t(\"browserViewer.downloadingReceivedOfBytes\", {\n received,\n bytes: formatBytes(download.totalBytes),\n });\n }\n if (download.status === \"cancelled\") return t(\"browserViewer.cancelled\");\n if (download.status === \"unavailable\") return t(\"browserViewer.noLongerAvailable\");\n return t(\"browserViewer.downloadFailed\");\n}\n\nfunction defaultDownloadDestination(download: BrowserDownload): string {\n const leaf = download.filename.split(/[\\\\/]/u).at(-1)?.trim() ?? \"\";\n const portable = leaf\n .normalize(\"NFC\")\n .replace(/[<>:\"|?*\\u0000-\\u001f\\u007f]/gu, \"-\")\n .replace(/[ .]+$/u, \"\");\n if (portable.length === 0 || /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\.|$)/iu.test(portable)) {\n return `download-${download.id.slice(0, 8)}`;\n }\n return portable;\n}\n\nfunction DiagnosticFact(props: { label: string; value: string }) {\n return (\n <>\n <dt className=\"text-og-fg-subtle\">{props.label}</dt>\n <dd className=\"min-w-0 truncate text-og-fg\" title={props.value}>\n {props.value}\n </dd>\n </>\n );\n}\n\nfunction DiagnosticCount(props: { label: string; value: number | undefined }) {\n const t = useOpenGeniText();\n return (\n <div className=\"rounded-og-sm border border-og-border bg-og-bg px-2.5 py-2\">\n <dt className=\"text-[10px] text-og-fg-subtle\">{props.label}</dt>\n <dd\n className={cn(\n \"mt-0.5 text-og-sm font-semibold\",\n props.value ? \"text-og-fg\" : \"text-og-fg-muted\",\n )}\n >\n {props.value ?? t(\"browserViewer.unavailable\")}\n </dd>\n </div>\n );\n}\n\nfunction browserEngineLabel(t: OpenGeniText, session: BrowserSession | null): string {\n if (!session) return t(\"browserViewer.unavailable\");\n const version = session.engineVersion ? ` ${session.engineVersion}` : \"\";\n return `${session.engine}${version} · ${session.headless ? \"headless\" : \"headed\"}`;\n}\n\nfunction shortGeneration(t: OpenGeniText, value: string | null | undefined): string {\n if (!value) return t(\"browserViewer.unavailable\");\n return value.length > 16 ? `${value.slice(0, 8)}…${value.slice(-6)}` : value;\n}\n\nfunction diagnosticKindLabel(\n t: OpenGeniText,\n kind: BrowserDiagnosticBatch[\"entries\"][number][\"kind\"],\n): string {\n switch (kind) {\n case \"console\":\n return t(\"browserViewer.console\");\n case \"page_error\":\n return t(\"browserViewer.pageError\");\n case \"failed_request\":\n return t(\"browserViewer.request\");\n case \"download\":\n return t(\"browserViewer.download\");\n }\n}\n\nfunction diagnosticTone(level: BrowserDiagnosticBatch[\"entries\"][number][\"level\"]): string {\n if (level === \"error\") return \"text-og-danger\";\n if (level === \"warning\") return \"text-og-status-waiting\";\n return \"text-og-fg-muted\";\n}\n\nfunction formatDiagnosticTime(t: OpenGeniText, value: string): string {\n const date = new Date(value);\n return Number.isNaN(date.getTime())\n ? \"\"\n : date.toLocaleTimeString(t.locale, { hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\" });\n}\n\nfunction BrowserNotice(props: { icon: ReactNode; text: string; className?: string }) {\n return (\n <div\n className={cn(\n \"grid h-full place-items-center bg-og-bg text-og-control text-og-fg-muted\",\n props.className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n {props.icon}\n {props.text}\n </div>\n </div>\n );\n}\n\nfunction paintCanvas(\n canvas: HTMLCanvasElement,\n image: CanvasImageSource,\n width: number,\n height: number,\n): void {\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext(\"2d\", { alpha: false });\n if (!context) throw new Error(\"Browser canvas is unavailable.\");\n context.drawImage(image, 0, 0, width, height);\n}\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(\"Browser frame image could not be decoded.\"));\n image.src = url;\n });\n}\n\nfunction browserPoint(\n canvas: HTMLCanvasElement | null,\n frame: BrowserViewportFrame | null,\n clientX: number,\n clientY: number,\n): { x: number; y: number } | null {\n if (!canvas || !frame) return null;\n const rect = canvas.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return null;\n const pixelX = ((clientX - rect.left) / rect.width) * frame.width;\n const pixelY = ((clientY - rect.top) / rect.height) * frame.height;\n return {\n x: Math.max(0, pixelX / frame.deviceScaleFactor),\n y: Math.max(0, pixelY / frame.deviceScaleFactor),\n };\n}\n\nfunction semanticNodes(roots: readonly InteractionSemanticNode[]): InteractionSemanticNode[] {\n const result: InteractionSemanticNode[] = [];\n const stack = [...roots].reverse();\n while (stack.length > 0) {\n const node = stack.pop()!;\n result.push(node);\n if (node.children) stack.push(...[...node.children].reverse());\n }\n return result;\n}\n\nfunction frameMatchesSelectedTarget(\n frame: BrowserFrame | null,\n session: BrowserSession | null,\n target: BrowserTarget | null,\n): frame is BrowserFrame {\n // The stream hook already validates the frame against the authenticated\n // attachment's controller generation. The separately-polled BrowserSession\n // can briefly carry the previous generation while an attachment is issued;\n // comparing against it here discarded valid frames and left the viewer on\n // \"Connecting\" indefinitely.\n return Boolean(\n frame &&\n session &&\n target &&\n frame.browserSessionId === session.id &&\n frame.targetId === target.id &&\n frame.targetGeneration === target.targetGeneration &&\n frame.documentGeneration === target.documentGeneration,\n );\n}\n\nfunction sameFrameFence(left: BrowserFrameInputFence, right: BrowserFrameInputFence): boolean {\n return sameBrowserDocument(left, right) && left.frameId === right.frameId;\n}\n\nfunction sameBrowserDocument(left: BrowserFrameInputFence, right: BrowserFrameInputFence): boolean {\n return (\n left.browserSessionId === right.browserSessionId &&\n left.controllerGeneration === right.controllerGeneration &&\n left.targetId === right.targetId &&\n left.targetGeneration === right.targetGeneration &&\n left.documentGeneration === right.documentGeneration\n );\n}\n\nfunction sameOptionalBrowserFrame(\n left: BrowserViewportFrame | null,\n right: BrowserViewportFrame | null,\n): boolean {\n return left === null || right === null ? left === right : sameFrameFence(left, right);\n}\n\nfunction isLiveBrowser(session: BrowserSession): boolean {\n return ![\"ending\", \"ended\", \"failed\", \"lost\"].includes(session.lifecycle);\n}\n\nfunction attachedChromeGenerationLoss(\n sessions: readonly BrowserSession[],\n): { deviceId: string } | null {\n const lost = sessions.find(\n (session) =>\n session.lifecycle === \"lost\" &&\n session.failureCode === \"controller_transition_expired\" &&\n session.placement.kind === \"attached_device\",\n );\n return lost?.placement.kind === \"attached_device\" ? { deviceId: lost.placement.deviceId } : null;\n}\n\nfunction isAttachedChromeGenerationLossError(error: Error | null): boolean {\n if (!error) return false;\n return /placement instance changed|controller authority changed/i.test(error.message);\n}\n\nfunction countInterventions(\n interventions: readonly InteractionIntervention[],\n): Map<string, number> {\n const counts = new Map<string, number>();\n for (const intervention of interventions) {\n counts.set(intervention.resourceId, (counts.get(intervention.resourceId) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction interventionTitle(t: OpenGeniText, intervention: InteractionIntervention): string {\n switch (intervention.kind) {\n case \"manual_login\":\n return t(\"browserViewer.signInNeeded\");\n case \"mfa\":\n return t(\"browserViewer.verificationNeeded\");\n case \"external_action\":\n case \"confirmation\":\n return t(\"browserViewer.actionNeeded\");\n case \"other\":\n return t(\"browserViewer.browserNeedsYourHelp\");\n }\n}\n\nfunction placementLabel(t: OpenGeniText, session: BrowserSession | undefined): string {\n if (!session) return \"\";\n switch (session.placement.kind) {\n case \"sandbox_group\":\n return t(\"browserViewer.agentSandbox\");\n case \"connected_machine\":\n return t(\"browserViewer.connectedMachine\");\n case \"attached_device\":\n return t(\"browserViewer.yourBrowser\");\n case \"external_provider\":\n return t(\"browserViewer.cloudBrowser\");\n }\n}\n\nfunction browserConnectionLabel(t: OpenGeniText, state: string): string {\n switch (state) {\n case \"attaching\":\n return t(\"browserViewer.openingBrowser\");\n case \"connecting\":\n return t(\"browserViewer.connecting\");\n case \"reconnecting\":\n return t(\"browserViewer.reconnecting\");\n case \"error\":\n return t(\"browserViewer.disconnected\");\n case \"semantic\":\n return t(\"browserViewer.semantic\");\n default:\n return t(\"browserViewer.waitingForBrowser\");\n }\n}\n\nfunction shortUrl(value: string): string {\n try {\n return new URL(value).hostname || value;\n } catch {\n return value;\n }\n}\n","import {\n browserFrameSocketUrl,\n decodeBrowserFrameMessage,\n type BrowserFrame,\n type BrowserFrameStreamOptions,\n type BrowserSessionAttachment,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport {\n decodeStreamFrame,\n decodeStreamOpenAck,\n encodeStreamClose,\n encodeStreamOpen,\n STREAM_CLOSE_REASON_NORMAL,\n STREAM_KIND_BROWSER,\n STREAM_ROLE_CLIENT,\n} from \"../lib/relay-wire\";\nimport { usePageLiveActivity } from \"./internal\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\nexport type BrowserFrameConnectionState =\n | \"idle\"\n | \"attaching\"\n | \"connecting\"\n | \"live\"\n | \"reconnecting\"\n | \"error\";\n\nexport type BrowserFrameWebSocket = Pick<\n WebSocket,\n \"binaryType\" | \"readyState\" | \"close\" | \"addEventListener\" | \"removeEventListener\"\n> & { send(data: ArrayBuffer): void };\n\nexport type BrowserFrameWebSocketFactory = (\n url: string,\n protocols: string[],\n) => BrowserFrameWebSocket;\n\nconst RELAY_TAG_OPEN = 1;\nconst RELAY_TAG_OPEN_ACK = 2;\nconst RELAY_TAG_FRAME = 3;\nconst RELAY_TAG_CLOSE = 4;\nconst MAX_AUTOMATIC_RECONNECTS_WITHOUT_A_FRAME = 2;\n\nexport type UseBrowserFrameStreamOptions = EmbeddedBrowserInteractionClientOverride & {\n browserSessionId: string | null;\n targetId: string | null;\n enabled?: boolean | undefined;\n stream?: BrowserFrameStreamOptions | undefined;\n webSocketFactory?: BrowserFrameWebSocketFactory | undefined;\n};\n\nexport type UseBrowserFrameStreamResult = {\n state: BrowserFrameConnectionState;\n frame: BrowserFrame | null;\n attachment: Pick<\n BrowserSessionAttachment,\n | \"browserSessionId\"\n | \"controllerGeneration\"\n | \"targetId\"\n | \"expiresAt\"\n | \"fencedInputBatches\"\n | \"focusedInputObservations\"\n > | null;\n error: Error | null;\n reconnect: () => void;\n};\n\n/**\n * Reconnecting, latest-only BrowserSession media attachment. Direct placement\n * grants travel as a WebSocket subprotocol; connected-machine grants stay in the\n * relay's first authenticated binary message. Neither transport puts a grant in\n * a URL, event, log, or separately exposed React state.\n */\nexport function useBrowserFrameStream(\n options: UseBrowserFrameStreamOptions,\n): UseBrowserFrameStreamResult {\n const t = useOpenGeniText();\n const { client, workspaceId } = useEmbeddedBrowserInteraction(options);\n const pageLive = usePageLiveActivity();\n const enabled = (options.enabled ?? true) && pageLive;\n const [nonce, setNonce] = useState(0);\n const [result, setResult] = useState<Omit<UseBrowserFrameStreamResult, \"reconnect\">>({\n state: \"idle\",\n frame: null,\n attachment: null,\n error: null,\n });\n const latestRef = useRef<{ key: string; sequence: number }>({\n key: \"\",\n sequence: -1,\n });\n const factoryRef = useRef(options.webSocketFactory);\n const streamRef = useRef(options.stream);\n factoryRef.current = options.webSocketFactory;\n streamRef.current = options.stream;\n\n const reconnect = useCallback(() => setNonce((value) => value + 1), []);\n\n useEffect(() => {\n const browserSessionId = options.browserSessionId;\n const targetId = options.targetId;\n if (!enabled || !browserSessionId || !targetId || typeof window === \"undefined\") {\n setResult({ state: \"idle\", frame: null, attachment: null, error: null });\n return;\n }\n\n // Never render or target input against a frame from the previously selected\n // resource while its replacement attachment is negotiating.\n latestRef.current = { key: \"\", sequence: -1 };\n setResult({\n state: \"attaching\",\n frame: null,\n attachment: null,\n error: null,\n });\n\n let disposed = false;\n let socket: BrowserFrameWebSocket | null = null;\n let socketHandlers: {\n open: () => void;\n message: (event: MessageEvent) => void;\n error: () => void;\n close: () => void;\n } | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let expiryTimer: ReturnType<typeof setTimeout> | null = null;\n let failures = 0;\n let controllerGeneration: string | null = null;\n let activeAttachment: BrowserSessionAttachment | null = null;\n let activeStream: BrowserSessionAttachment[\"stream\"] | null = null;\n let attachmentExpiresAt = 0;\n let lastRelaySequence: string | null = null;\n let relayAccepted = false;\n let pendingFrame: { bytes: Uint8Array; source: BrowserFrameWebSocket } | null = null;\n let decodingFrame = false;\n const attachmentAbort = new AbortController();\n\n const clearSocket = (terminateProducer = false) => {\n if (!socket) return;\n const current = socket;\n const handlers = socketHandlers;\n if (terminateProducer && activeStream?.kind === \"relay\" && socket.readyState === 1) {\n try {\n socket.send(\n relayDatagram(\n RELAY_TAG_CLOSE,\n encodeStreamClose({\n channelId: activeStream.channel.channelId,\n reason: STREAM_CLOSE_REASON_NORMAL,\n message: \"viewer detached\",\n }),\n ),\n );\n } catch {\n // OPEN can race a transport close. Local teardown must still finish.\n }\n }\n if (handlers) {\n current.removeEventListener(\"open\", handlers.open);\n current.removeEventListener(\"message\", handlers.message);\n current.removeEventListener(\"error\", handlers.error);\n current.removeEventListener(\"close\", handlers.close);\n }\n if (current.readyState === 0 || current.readyState === 1) {\n current.close(1000, \"viewer detached\");\n }\n socket = null;\n socketHandlers = null;\n pendingFrame = null;\n };\n\n const scheduleReconnect = () => {\n if (disposed || reconnectTimer) return;\n if (failures >= MAX_AUTOMATIC_RECONNECTS_WITHOUT_A_FRAME) return;\n const delay = Math.min(5_000, 250 * 2 ** Math.min(failures, 5));\n failures += 1;\n setResult((current) => ({ ...current, state: \"reconnecting\" }));\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n connectSocket();\n }, delay);\n };\n\n const fail = (cause: unknown, reconnectAutomatically = true) => {\n if (disposed) return;\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setResult((current) => ({ ...current, state: \"error\", error }));\n clearSocket();\n if (reconnectAutomatically) scheduleReconnect();\n };\n\n const onOpen = (source: BrowserFrameWebSocket) => {\n if (disposed || source !== socket) return;\n if (activeStream?.kind === \"relay\") {\n const body = encodeStreamOpen({\n channel: {\n ...activeStream.channel,\n kind: STREAM_KIND_BROWSER,\n },\n token: activeStream.token,\n role: STREAM_ROLE_CLIENT,\n resumeFromSeq:\n lastRelaySequence === null ? \"0\" : (BigInt(lastRelaySequence) + 1n).toString(),\n });\n try {\n source.send(relayDatagram(RELAY_TAG_OPEN, body));\n } catch (error) {\n fail(error);\n }\n return;\n }\n setResult((current) => ({ ...current, state: \"live\", error: null }));\n };\n\n const drainLatestFrame = async () => {\n if (decodingFrame) return;\n decodingFrame = true;\n try {\n while (pendingFrame) {\n if (disposed) break;\n const pending = pendingFrame;\n pendingFrame = null;\n const { bytes, source } = pending;\n const frame = decodeBrowserFrameMessage(bytes);\n if (disposed || source !== socket) continue;\n if (frame.browserSessionId !== browserSessionId || frame.targetId !== targetId) {\n throw new Error(\"browser frame belongs to another resource\");\n }\n if (!controllerGeneration || frame.controllerGeneration !== controllerGeneration) {\n throw new Error(\"browser frame belongs to a stale controller\");\n }\n const key = `${browserSessionId}:${targetId}:${frame.controllerGeneration}:${frame.targetGeneration}:${frame.documentGeneration}`;\n if (latestRef.current.key === key && frame.sequence <= latestRef.current.sequence)\n continue;\n latestRef.current = { key, sequence: frame.sequence };\n failures = 0;\n setResult((current) => ({\n ...current,\n state: \"live\",\n frame,\n error: null,\n }));\n }\n } catch (cause) {\n fail(cause);\n } finally {\n decodingFrame = false;\n if (!disposed && pendingFrame) void drainLatestFrame();\n }\n };\n\n const onMessage = (source: BrowserFrameWebSocket, event: MessageEvent) => {\n void (async () => {\n try {\n const bytes = await messageBytes(event.data);\n if (disposed || source !== socket) return;\n let frameBytes = bytes;\n if (activeStream?.kind === \"relay\") {\n if (bytes.length < 1) throw new Error(\"browser relay returned an empty message\");\n const tag = bytes[0];\n const body = bytes.subarray(1);\n if (tag === RELAY_TAG_OPEN_ACK) {\n const ack = decodeStreamOpenAck(body);\n if (!ack.accepted) {\n activeAttachment = null;\n activeStream = null;\n attachmentExpiresAt = 0;\n throw new Error(ack.error?.message ?? \"browser stream was rejected by the relay\");\n }\n relayAccepted = true;\n return;\n }\n if (tag === RELAY_TAG_CLOSE) {\n activeAttachment = null;\n activeStream = null;\n attachmentExpiresAt = 0;\n lastRelaySequence = null;\n relayAccepted = false;\n fail(new Error(\"Browser frame source ended.\"), false);\n return;\n }\n if (tag !== RELAY_TAG_FRAME || !relayAccepted) return;\n const relayFrame = decodeStreamFrame(body);\n lastRelaySequence = relayFrame.seq;\n frameBytes = relayFrame.data;\n }\n pendingFrame = { bytes: frameBytes, source };\n void drainLatestFrame();\n } catch (cause) {\n fail(cause);\n }\n })();\n };\n\n const onError = (source: BrowserFrameWebSocket) => {\n if (source !== socket) return;\n fail(new Error(t(\"hooks.useBrowserFrameStream.browserViewLostConnection\")));\n };\n\n const onClose = (source: BrowserFrameWebSocket) => {\n if (disposed || source !== socket) return;\n clearSocket();\n scheduleReconnect();\n };\n\n const connectSocket = () => {\n if (disposed) return;\n clearSocket();\n if (!activeAttachment || !activeStream || attachmentExpiresAt <= Date.now() + 1_000) {\n void attach();\n return;\n }\n relayAccepted = false;\n setResult((current) => ({\n ...current,\n state: \"connecting\",\n error: null,\n }));\n const createSocket =\n factoryRef.current ?? ((url: string, protocols: string[]) => new WebSocket(url, protocols));\n const openedSocket = createSocket(\n activeStream.kind === \"relay\"\n ? activeStream.url\n : browserFrameSocketUrl(activeAttachment, streamRef.current),\n activeStream.kind === \"direct_websocket\" ? [...activeStream.protocols] : [],\n );\n // Frame sequence numbers belong to the producer behind this socket, not\n // to the target document. A refreshed attachment can restart at one\n // without changing any target or document generation.\n latestRef.current = { key: \"\", sequence: -1 };\n socket = openedSocket;\n socketHandlers = {\n open: () => onOpen(openedSocket),\n message: (event) => onMessage(openedSocket, event),\n error: () => onError(openedSocket),\n close: () => onClose(openedSocket),\n };\n openedSocket.binaryType = \"arraybuffer\";\n openedSocket.addEventListener(\"open\", socketHandlers.open);\n openedSocket.addEventListener(\"message\", socketHandlers.message);\n openedSocket.addEventListener(\"error\", socketHandlers.error);\n openedSocket.addEventListener(\"close\", socketHandlers.close);\n };\n\n const attach = async () => {\n if (disposed) return;\n clearSocket();\n if (expiryTimer) clearTimeout(expiryTimer);\n setResult((current) => ({\n ...current,\n state: current.attachment ? \"reconnecting\" : \"attaching\",\n error: null,\n }));\n try {\n const attachment = await client.attachBrowserSession(\n workspaceId,\n browserSessionId,\n {\n targetId,\n expiresInSeconds: 120,\n ...(streamRef.current ? { stream: streamRef.current } : {}),\n },\n { signal: attachmentAbort.signal },\n );\n if (disposed) return;\n if (attachment.browserSessionId !== browserSessionId || attachment.targetId !== targetId) {\n throw new Error(\"browser attachment does not match the requested resource\");\n }\n controllerGeneration = attachment.controllerGeneration;\n activeAttachment = attachment;\n activeStream = attachment.stream;\n attachmentExpiresAt = Date.parse(attachment.expiresAt);\n lastRelaySequence = null;\n relayAccepted = false;\n setResult((current) => ({\n ...current,\n state: \"connecting\",\n attachment: {\n browserSessionId: attachment.browserSessionId,\n controllerGeneration: attachment.controllerGeneration,\n targetId: attachment.targetId,\n expiresAt: attachment.expiresAt,\n ...(attachment.fencedInputBatches === true\n ? { fencedInputBatches: true as const }\n : {}),\n ...(attachment.focusedInputObservations === true\n ? { focusedInputObservations: true as const }\n : {}),\n },\n error: null,\n }));\n const refreshIn = Number.isFinite(attachmentExpiresAt)\n ? Math.max(1_000, attachmentExpiresAt - Date.now() - 5_000)\n : 60_000;\n expiryTimer = setTimeout(() => {\n if (disposed) return;\n clearSocket(true);\n activeAttachment = null;\n activeStream = null;\n attachmentExpiresAt = 0;\n void attach();\n }, refreshIn);\n connectSocket();\n } catch (cause) {\n if (attachmentAbort.signal.aborted || disposed) return;\n fail(cause, !isPlacementGenerationLossError(cause));\n }\n };\n\n void attach();\n return () => {\n disposed = true;\n attachmentAbort.abort();\n if (reconnectTimer) clearTimeout(reconnectTimer);\n if (expiryTimer) clearTimeout(expiryTimer);\n clearSocket(true);\n };\n }, [client, enabled, nonce, options.browserSessionId, options.targetId, workspaceId, t]);\n\n return { ...result, reconnect };\n}\n\nfunction relayDatagram(tag: number, body: Uint8Array): ArrayBuffer {\n const message = new Uint8Array(body.length + 1);\n message[0] = tag;\n message.set(body, 1);\n return message.buffer as ArrayBuffer;\n}\n\nasync function messageBytes(value: unknown): Promise<Uint8Array> {\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (ArrayBuffer.isView(value)) {\n return new Uint8Array(value.buffer, value.byteOffset, value.byteLength).slice();\n }\n if (typeof Blob !== \"undefined\" && value instanceof Blob) {\n return new Uint8Array(await value.arrayBuffer());\n }\n throw new Error(\"browser frame stream returned a non-binary message\");\n}\n\nfunction isPlacementGenerationLossError(cause: unknown): boolean {\n const message = cause instanceof Error ? cause.message : String(cause);\n return /placement instance changed|controller authority changed/i.test(message);\n}\n","import type { AttachedBrowserBridge, AttachedBrowserDevice } from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { EmbeddedBrowserInteractionClientLike } from \"../client\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { useInteractionInvalidation } from \"./use-interaction-invalidation\";\n\nexport type UseAttachedBrowsersOptions = EmbeddedBrowserInteractionClientOverride & {\n enabled?: boolean | undefined;\n includeDisconnected?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n};\n\nexport type UseAttachedBrowsersResult = {\n revision: number;\n bridges: AttachedBrowserBridge[];\n devices: AttachedBrowserDevice[];\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n};\n\n/** Workspace-wide inventory of Chrome profiles currently connected through an\n * enrolled Opengeni machine. BrowserSessions remain the execution authority. */\nexport function useAttachedBrowsers(\n options: UseAttachedBrowsersOptions = {},\n): UseAttachedBrowsersResult {\n const { client, workspaceId, workspaceInteractionEvent, workspaceInteractionConnectionState } =\n useEmbeddedBrowserInteraction(options);\n const enabled = options.enabled ?? true;\n const includeDisconnected = options.includeDisconnected ?? false;\n const [state, setState] = useState(() => emptyState(workspaceId, enabled));\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n const visible = state.workspaceId === workspaceId ? state : emptyState(workspaceId, enabled);\n\n const cancelLoad = useCallback(() => {\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n requestRef.current = { id, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean): Promise<void> => {\n if (!enabled) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground || current.workspaceId !== workspaceId ? null : current.error,\n }));\n try {\n const response = await client.listAttachedBrowsers(workspaceId, {\n includeDisconnected,\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n workspaceId,\n revision: response.revision,\n bridges: response.bridges,\n devices: sortDevices(response.devices),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: false,\n refreshing: false,\n error: cause instanceof Error ? cause : new Error(String(cause)),\n }));\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n },\n [client, enabled, includeDisconnected, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false), [load]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(workspaceId, false));\n return;\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, load, workspaceId]);\n\n useInteractionInvalidation({\n workspaceId,\n key: `${workspaceId}:${includeDisconnected}`,\n enabled,\n event: workspaceInteractionEvent,\n connectionState: workspaceInteractionConnectionState,\n knownRevision: visible.revision,\n refresh,\n fallbackPollIntervalMs: options.pollIntervalMs,\n });\n\n return {\n revision: visible.revision,\n bridges: visible.bridges,\n devices: visible.devices,\n loading: visible.loading,\n refreshing: visible.refreshing,\n error: visible.error,\n refresh,\n };\n}\n\nfunction emptyState(workspaceId: string, loading: boolean) {\n return {\n workspaceId,\n revision: 0,\n bridges: [] as AttachedBrowserBridge[],\n devices: [] as AttachedBrowserDevice[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortDevices(devices: readonly AttachedBrowserDevice[]): AttachedBrowserDevice[] {\n return [...devices].sort(\n (left, right) =>\n Number(right.state === \"connected\") - Number(left.state === \"connected\") ||\n timestamp(right.lastSeenAt) - timestamp(left.lastSeenAt) ||\n left.name.localeCompare(right.name),\n );\n}\n\nfunction timestamp(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\n/** Exported for narrow proxy implementations and tests. */\nexport type AttachedBrowsersClient = EmbeddedBrowserInteractionClientLike;\n","import type {\n BrowserIdentity,\n BrowserIdentityMutationResponse,\n BrowserRevisionListResponse,\n CreateBrowserIdentityRequest,\n PublishBrowserRevisionRequest,\n PublishBrowserRevisionResponse,\n UpdateBrowserIdentityRequest,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { EmbeddedBrowserInteractionClientLike } from \"../client\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { useInteractionInvalidation } from \"./use-interaction-invalidation\";\n\nexport type UseBrowserIdentitiesOptions = EmbeddedBrowserInteractionClientOverride & {\n enabled?: boolean | undefined;\n includeArchived?: boolean | undefined;\n};\n\nexport type UseBrowserIdentitiesResult = {\n revision: number;\n identities: BrowserIdentity[];\n loading: boolean;\n refreshing: boolean;\n mutating: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (\n request: Omit<CreateBrowserIdentityRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<BrowserIdentityMutationResponse>;\n update: (\n identityId: string,\n request: Omit<UpdateBrowserIdentityRequest, \"operationId\"> & { operationId?: string },\n ) => Promise<BrowserIdentityMutationResponse>;\n revisions: (identityId: string) => Promise<BrowserRevisionListResponse>;\n publish: (\n browserSessionId: string,\n request: Omit<PublishBrowserRevisionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<PublishBrowserRevisionResponse>;\n};\n\n/** Workspace browser-profile library and explicit immutable-version mutations. */\nexport function useBrowserIdentities(\n options: UseBrowserIdentitiesOptions = {},\n): UseBrowserIdentitiesResult {\n const { client, workspaceId, workspaceInteractionEvent, workspaceInteractionConnectionState } =\n useEmbeddedBrowserInteraction(options);\n const enabled = options.enabled ?? true;\n const includeArchived = options.includeArchived ?? false;\n const [state, setState] = useState(() => emptyState(workspaceId, enabled));\n const [mutationCount, setMutationCount] = useState(0);\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n const visibleState = state.workspaceId === workspaceId ? state : emptyState(workspaceId, enabled);\n\n const cancelLoad = useCallback(() => {\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n requestRef.current = { id, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean): Promise<void> => {\n if (!enabled) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground || current.workspaceId !== workspaceId ? null : current.error,\n }));\n try {\n const response = await client.listBrowserIdentities(workspaceId, {\n includeArchived,\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n workspaceId,\n revision: response.revision,\n identities: sortIdentities(response.identities),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: false,\n refreshing: false,\n error: cause instanceof Error ? cause : new Error(String(cause)),\n }));\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n },\n [client, enabled, includeArchived, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false), [load]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(workspaceId, false));\n return;\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, load, workspaceId]);\n\n useInteractionInvalidation({\n workspaceId,\n key: workspaceId,\n enabled,\n event: workspaceInteractionEvent,\n connectionState: workspaceInteractionConnectionState,\n knownRevision: visibleState.revision,\n refresh,\n });\n\n const mutate = useCallback(async <T>(operation: () => Promise<T>): Promise<T> => {\n setMutationCount((count) => count + 1);\n try {\n return await operation();\n } finally {\n if (mountedRef.current) setMutationCount((count) => Math.max(0, count - 1));\n }\n }, []);\n\n const create = useCallback(\n async (\n request: Omit<CreateBrowserIdentityRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<BrowserIdentityMutationResponse> =>\n await mutate(async () => {\n const response = await client.createBrowserIdentity(workspaceId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n setState((current) => mergeIdentity(current, workspaceId, response.identity));\n return response;\n }),\n [client, mutate, workspaceId],\n );\n\n const revisions = useCallback(\n async (identityId: string): Promise<BrowserRevisionListResponse> =>\n await client.listBrowserRevisions(workspaceId, identityId),\n [client, workspaceId],\n );\n\n const update = useCallback(\n async (\n identityId: string,\n request: Omit<UpdateBrowserIdentityRequest, \"operationId\"> & { operationId?: string },\n ): Promise<BrowserIdentityMutationResponse> =>\n await mutate(async () => {\n const response = await client.updateBrowserIdentity(workspaceId, identityId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n setState((current) =>\n mergeIdentity(current, workspaceId, response.identity, includeArchived),\n );\n return response;\n }),\n [client, includeArchived, mutate, workspaceId],\n );\n\n const publish = useCallback(\n async (\n browserSessionId: string,\n request: Omit<PublishBrowserRevisionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<PublishBrowserRevisionResponse> =>\n await mutate(async () => {\n const response = await client.publishBrowserRevision(workspaceId, browserSessionId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n setState((current) => mergeIdentity(current, workspaceId, response.identity));\n return response;\n }),\n [client, mutate, workspaceId],\n );\n\n return {\n revision: visibleState.revision,\n identities: visibleState.identities,\n loading: visibleState.loading,\n refreshing: visibleState.refreshing,\n mutating: mutationCount > 0,\n error: visibleState.error,\n refresh,\n create,\n update,\n revisions,\n publish,\n };\n}\n\nfunction emptyState(workspaceId: string, loading: boolean) {\n return {\n workspaceId,\n revision: 0,\n identities: [] as BrowserIdentity[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortIdentities(identities: readonly BrowserIdentity[]): BrowserIdentity[] {\n return [...identities].sort(\n (left, right) =>\n timestamp(right.updatedAt) - timestamp(left.updatedAt) || left.name.localeCompare(right.name),\n );\n}\n\nfunction timestamp(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction mergeIdentity(\n current: ReturnType<typeof emptyState>,\n workspaceId: string,\n identity: BrowserIdentity,\n includeArchived = false,\n): ReturnType<typeof emptyState> {\n if (current.workspaceId !== workspaceId) return current;\n return {\n ...current,\n identities: sortIdentities(\n identity.status === \"archived\" && !includeArchived\n ? current.identities.filter((candidate) => candidate.id !== identity.id)\n : [...current.identities.filter((candidate) => candidate.id !== identity.id), identity],\n ),\n error: null,\n };\n}\n\n/** Exported for narrow proxy implementations and tests. */\nexport type BrowserIdentitiesClient = EmbeddedBrowserInteractionClientLike;\n","import type { BrowserDownload, BrowserDownloadSaveResponse } from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { EmbeddedBrowserInteractionClientLike } from \"../client\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { usePageLiveActivity } from \"./internal\";\n\nexport type UseBrowserDownloadsOptions = EmbeddedBrowserInteractionClientOverride & {\n browserSessionId: string | null;\n enabled?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n};\n\nexport type BrowserDownloadSaveOptions = {\n operationId?: string | undefined;\n overwrite?: boolean | undefined;\n};\n\nexport type UseBrowserDownloadsResult = {\n downloads: BrowserDownload[];\n loading: boolean;\n refreshing: boolean;\n savingDownloadIds: string[];\n error: Error | null;\n refresh: () => Promise<void>;\n saveToWorkspace: (\n downloadId: string,\n destinationPath: string,\n options?: BrowserDownloadSaveOptions,\n ) => Promise<BrowserDownloadSaveResponse>;\n};\n\n/** Exact browser-produced files for one BrowserSession. Bytes remain private\n * until `saveToWorkspace` performs the canonical workspace mutation. */\nexport function useBrowserDownloads(\n options: UseBrowserDownloadsOptions,\n): UseBrowserDownloadsResult {\n const { client, workspaceId } = useEmbeddedBrowserInteraction(options);\n const browserSessionId = options.browserSessionId;\n const enabled = (options.enabled ?? true) && browserSessionId !== null;\n const pageLive = usePageLiveActivity();\n const pollIntervalMs = Math.max(750, options.pollIntervalMs ?? 2_000);\n const scope = browserSessionId ?? \"none\";\n const [state, setState] = useState(() => emptyState(scope, enabled));\n const [saving, setSaving] = useState<Record<string, number>>({});\n const visible = state.scope === scope ? state : emptyState(scope, enabled);\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n const retryOperationsRef = useRef(new Map<string, string>());\n\n const cancelLoad = useCallback(() => {\n requestRef.current.controller?.abort();\n requestRef.current = { id: requestRef.current.id + 1, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean): Promise<void> => {\n if (!enabled || !browserSessionId) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n setState((current) => ({\n ...(current.scope === scope ? current : emptyState(scope, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground || current.scope !== scope ? null : current.error,\n }));\n try {\n const response = await client.listBrowserDownloads(workspaceId, browserSessionId, {\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n scope,\n downloads: sortDownloads(response.downloads),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n setState((current) => ({\n ...(current.scope === scope ? current : emptyState(scope, true)),\n loading: false,\n refreshing: false,\n error: asError(cause),\n }));\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n },\n [browserSessionId, client, enabled, scope, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false), [load]);\n\n useEffect(() => {\n retryOperationsRef.current.clear();\n setSaving({});\n }, [scope]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(scope, false));\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, load, scope]);\n\n useEffect(() => {\n if (!enabled || !pageLive || Object.keys(saving).length > 0) return;\n const timer = setInterval(() => {\n if (!requestRef.current.controller) void refresh();\n }, pollIntervalMs);\n return () => clearInterval(timer);\n }, [enabled, pageLive, pollIntervalMs, refresh, saving]);\n\n const saveToWorkspace = useCallback(\n async (\n downloadId: string,\n destinationPath: string,\n saveOptions: BrowserDownloadSaveOptions = {},\n ): Promise<BrowserDownloadSaveResponse> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n const overwrite = saveOptions.overwrite ?? false;\n const attemptKey = `${browserSessionId}\\u0000${downloadId}\\u0000${destinationPath}\\u0000${overwrite}`;\n const operationId =\n saveOptions.operationId ??\n retryOperationsRef.current.get(attemptKey) ??\n crypto.randomUUID();\n retryOperationsRef.current.set(attemptKey, operationId);\n setSaving((current) => ({ ...current, [downloadId]: (current[downloadId] ?? 0) + 1 }));\n try {\n const response = await client.saveBrowserDownload(\n workspaceId,\n browserSessionId,\n downloadId,\n { operationId, destinationPath, overwrite },\n );\n retryOperationsRef.current.delete(attemptKey);\n if (mountedRef.current) {\n setState((current) =>\n current.scope === scope\n ? {\n ...current,\n downloads: sortDownloads([\n ...current.downloads.filter((download) => download.id !== response.download.id),\n response.download,\n ]),\n error: null,\n }\n : current,\n );\n }\n return response;\n } finally {\n if (mountedRef.current) {\n setSaving((current) => {\n const count = (current[downloadId] ?? 1) - 1;\n if (count > 0) return { ...current, [downloadId]: count };\n const { [downloadId]: _removed, ...rest } = current;\n return rest;\n });\n }\n }\n },\n [browserSessionId, client, scope, workspaceId],\n );\n\n return {\n downloads: visible.downloads,\n loading: visible.loading,\n refreshing: visible.refreshing,\n savingDownloadIds: Object.keys(saving),\n error: visible.error,\n refresh,\n saveToWorkspace,\n };\n}\n\nfunction emptyState(scope: string, loading: boolean) {\n return {\n scope,\n downloads: [] as BrowserDownload[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortDownloads(downloads: readonly BrowserDownload[]): BrowserDownload[] {\n return [...downloads].sort(\n (left, right) =>\n right.startedAt.localeCompare(left.startedAt) || left.id.localeCompare(right.id),\n );\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nexport type BrowserDownloadsClient = EmbeddedBrowserInteractionClientLike;\n","import type {\n BrowserAction,\n BrowserActionBatch,\n BrowserActionReceipt,\n BrowserClipboard,\n BrowserDiagnosticBatch,\n BrowserDiagnosticsOptions,\n BrowserFrame,\n BrowserObservation,\n BrowserSession,\n BrowserTarget,\n} from \"@opengeni/sdk/interaction\";\nimport { OpenGeniApiError } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { isNonRetryableInteractionError } from \"../lib/interaction-errors\";\nimport { usePageLiveActivity } from \"./internal\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/** Immutable input fence; queued actions never need the encoded screenshot. */\nexport type BrowserFrameInputFence = Pick<\n BrowserFrame,\n | \"browserSessionId\"\n | \"controllerGeneration\"\n | \"targetId\"\n | \"targetGeneration\"\n | \"documentGeneration\"\n | \"frameId\"\n>;\n\nexport type BrowserInputFailure = Pick<BrowserActionReceipt, \"operationId\" | \"error\"> & {\n state: Exclude<BrowserActionReceipt[\"state\"], \"completed\">;\n};\n\nexport type UseBrowserSessionOptions = EmbeddedBrowserInteractionClientOverride & {\n browserSessionId: string | null;\n enabled?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n /** Keep session/tab inventory current without repeatedly fetching the full\n * accessibility tree while a live frame is available or the viewer is hidden. */\n semanticObservationEnabled?: boolean | undefined;\n};\n\nexport type UseBrowserSessionResult = {\n session: BrowserSession | null;\n targets: BrowserTarget[];\n selectedTarget: BrowserTarget | null;\n observation: BrowserObservation | null;\n loading: boolean;\n mutating: boolean;\n error: Error | null;\n inputFailure: BrowserInputFailure | null;\n refresh: () => Promise<void>;\n observeForInput: () => Promise<BrowserObservation>;\n actFromObservation: (\n action: BrowserAction,\n observation: BrowserObservation,\n ) => Promise<BrowserActionReceipt>;\n selectTarget: (targetId: string) => Promise<BrowserTarget>;\n openTarget: (url?: string) => Promise<BrowserTarget>;\n closeTarget: (targetId: string) => Promise<void>;\n act: (\n action: BrowserAction | BrowserActionBatch,\n operationId?: string,\n ) => Promise<BrowserActionReceipt>;\n /** Dispatch input against the exact image a human saw. Stale images fail at\n * the controller fence instead of targeting a newer page. */\n actFromFrame: (\n action: BrowserAction | BrowserActionBatch,\n frame: BrowserFrameInputFence,\n operationId?: string,\n observationMode?: \"none\" | \"input\",\n ) => Promise<BrowserActionReceipt>;\n readClipboard: () => Promise<BrowserClipboard>;\n diagnostics: (options?: BrowserDiagnosticsOptions) => Promise<BrowserDiagnosticBatch>;\n};\n\n/** Selected BrowserSession control state. All human actions use the same\n * generation-fenced controller operation stream as agent actions. */\nexport function useBrowserSession(options: UseBrowserSessionOptions): UseBrowserSessionResult {\n const t = useOpenGeniText();\n const { client, workspaceId } = useEmbeddedBrowserInteraction(options);\n const browserSessionId = options.browserSessionId;\n const enabled = (options.enabled ?? true) && browserSessionId !== null;\n const sourceRef = useRef({ client, workspaceId, browserSessionId, enabled });\n if (\n sourceRef.current.client !== client ||\n sourceRef.current.workspaceId !== workspaceId ||\n sourceRef.current.browserSessionId !== browserSessionId ||\n sourceRef.current.enabled !== enabled\n ) {\n sourceRef.current = { client, workspaceId, browserSessionId, enabled };\n }\n const source = sourceRef.current;\n const semanticObservationEnabled = options.semanticObservationEnabled ?? true;\n const semanticObservationEnabledRef = useRef(semanticObservationEnabled);\n semanticObservationEnabledRef.current = semanticObservationEnabled;\n const previousSemanticObservationRef = useRef({\n browserSessionId,\n enabled: semanticObservationEnabled,\n });\n const pageLive = usePageLiveActivity();\n const pollIntervalMs = Math.max(750, options.pollIntervalMs ?? 2_000);\n const [state, setState] = useState<{\n source: typeof source;\n browserSessionId: string | null;\n session: BrowserSession | null;\n targets: BrowserTarget[];\n selectedTargetId: string | null;\n observation: BrowserObservation | null;\n loading: boolean;\n mutating: boolean;\n error: Error | null;\n inputFailure: BrowserInputFailure | null;\n actionResultOrder: number;\n }>(() => ({ ...emptyState(browserSessionId, enabled), source }));\n const visible =\n state.source === source && state.browserSessionId === browserSessionId\n ? state\n : { ...emptyState(browserSessionId, enabled), source };\n const refreshBlocked = isNonRetryableInteractionError(visible.error);\n const inputFailureRef = useRef(visible.inputFailure);\n inputFailureRef.current = visible.inputFailure;\n const selectedTargetIdRef = useRef<string | null>(visible.selectedTargetId);\n selectedTargetIdRef.current = visible.selectedTargetId;\n const selectionRevisionRef = useRef(0);\n const actionResultOrderRef = useRef({ next: 0, settled: 0 });\n const selectedTargetRef = useRef<BrowserTarget | null>(\n visible.targets.find((target) => target.id === visible.selectedTargetId) ?? null,\n );\n selectedTargetRef.current =\n visible.targets.find((target) => target.id === visible.selectedTargetId) ?? null;\n const observationRef = useRef<{\n browserSessionId: string | null;\n observation: BrowserObservation | null;\n }>({ browserSessionId, observation: visible.observation });\n const lastObservationAtRef = useRef(0);\n if (observationRef.current.browserSessionId !== browserSessionId) {\n observationRef.current = {\n browserSessionId,\n observation: visible.observation,\n };\n } else {\n observationRef.current.observation = visible.observation;\n }\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mutationRef = useRef<{\n browserSessionId: string | null;\n source: typeof source;\n count: number;\n needsInventoryReconcile: boolean;\n }>({\n browserSessionId,\n source,\n count: 0,\n needsInventoryReconcile: false,\n });\n const mountedRef = useRef(true);\n const isCurrentSource = useCallback(\n () => mountedRef.current && sourceRef.current === source,\n [source],\n );\n\n const invalidateRefresh = useCallback(() => {\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n requestRef.current = { id, controller: null };\n }, []);\n\n const refreshInventory = useCallback(\n async (checkInput = false, observeSelectedTarget = true) => {\n if (!enabled || !browserSessionId || !isCurrentSource()) return;\n const checkedInputFailure = inputFailureRef.current;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n try {\n const [session, targetResponse] = await Promise.all([\n client.getBrowserSession(workspaceId, browserSessionId, {\n signal: controller.signal,\n }),\n client.listBrowserTargets(workspaceId, browserSessionId, {\n signal: controller.signal,\n }),\n ]);\n if (!isCurrentSource() || requestRef.current.id !== id) return;\n const selected = chooseTarget(targetResponse.targets, selectedTargetIdRef.current);\n selectedTargetIdRef.current = selected?.id ?? null;\n selectedTargetRef.current = selected;\n const previousObservation =\n observationRef.current.browserSessionId === browserSessionId\n ? observationRef.current.observation\n : null;\n const retainedObservation =\n selected && previousObservation && sameObservationTarget(previousObservation, selected)\n ? previousObservation\n : null;\n observationRef.current = {\n browserSessionId,\n observation: retainedObservation,\n };\n setState((current) =>\n isCurrentSource() &&\n current.source === source &&\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n session,\n targets: targetResponse.targets,\n selectedTargetId: selected?.id ?? null,\n observation: retainedObservation,\n loading: false,\n error: null,\n // Media and background polling cannot confirm an input outcome.\n // Only an explicit fresh check clears the notice it began with.\n inputFailure:\n checkInput &&\n session.id === browserSessionId &&\n targetResponse.browserSessionId === browserSessionId &&\n current.inputFailure === checkedInputFailure\n ? null\n : current.inputFailure,\n }\n : current,\n );\n if (!selected || !observeSelectedTarget || !semanticObservationEnabledRef.current) return;\n try {\n const observation = await client.observeBrowserTarget(\n workspaceId,\n browserSessionId,\n selected.id,\n { signal: controller.signal },\n );\n if (!isCurrentSource() || requestRef.current.id !== id) return;\n const currentSelected = selectedTargetRef.current;\n if (\n observationRef.current.browserSessionId !== browserSessionId ||\n currentSelected?.id !== selected.id ||\n observation.browserSessionId !== browserSessionId ||\n observation.target.id !== selected.id ||\n observation.target.controllerGeneration !== currentSelected.controllerGeneration ||\n observation.target.targetGeneration !== currentSelected.targetGeneration\n )\n return;\n // Navigation may complete between the inventory and its selected-page\n // observation. Keep both the selected target and input fence coherent.\n selectedTargetRef.current = observation.target;\n observationRef.current = { browserSessionId, observation };\n lastObservationAtRef.current = Date.now();\n setState((current) =>\n isCurrentSource() &&\n current.source === source &&\n current.browserSessionId === browserSessionId &&\n current.selectedTargetId === observation.target.id\n ? {\n ...current,\n observation,\n targets: replaceTarget(current.targets, observation.target),\n }\n : current,\n );\n } catch (cause) {\n if (controller.signal.aborted || !isCurrentSource() || requestRef.current.id !== id)\n return;\n // Target inventory and the media plane remain authoritative for the\n // human-facing browser. A failed semantic snapshot must not blank or\n // disable an otherwise live visual browser.\n void cause;\n }\n } catch (cause) {\n if (controller.signal.aborted || !isCurrentSource() || requestRef.current.id !== id) return;\n setState((current) =>\n isCurrentSource() &&\n current.source === source &&\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n loading: false,\n error: cause instanceof Error ? cause : new Error(String(cause)),\n }\n : current,\n );\n } finally {\n if (requestRef.current.id === id) {\n requestRef.current = { id, controller: null };\n }\n }\n },\n [browserSessionId, client, enabled, isCurrentSource, source, workspaceId],\n );\n\n const refresh = useCallback(async () => await refreshInventory(true), [refreshInventory]);\n\n const refreshSemantic = useCallback(async (): Promise<void> => {\n if (!enabled || !browserSessionId || !isCurrentSource()) return;\n const target = selectedTargetRef.current;\n if (!target) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n try {\n const observation = await client.observeBrowserTarget(\n workspaceId,\n browserSessionId,\n target.id,\n { signal: controller.signal },\n );\n if (!isCurrentSource() || requestRef.current.id !== id) return;\n if (!sameObservationTarget(observation, selectedTargetRef.current)) return;\n observationRef.current = { browserSessionId, observation };\n lastObservationAtRef.current = Date.now();\n setState((current) =>\n isCurrentSource() &&\n current.source === source &&\n current.browserSessionId === browserSessionId &&\n current.selectedTargetId === target.id\n ? { ...current, observation }\n : current,\n );\n } catch {\n // A failed semantic fallback cannot disable an otherwise live browser.\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n }, [browserSessionId, client, enabled, isCurrentSource, source, workspaceId]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n invalidateRefresh();\n setState({ ...emptyState(browserSessionId, false), source });\n return;\n }\n setState((current) =>\n isCurrentSource() &&\n current.source === source &&\n current.browserSessionId === browserSessionId\n ? { ...current, loading: true }\n : { ...emptyState(browserSessionId, true), source },\n );\n void refreshInventory();\n return () => {\n mountedRef.current = false;\n invalidateRefresh();\n };\n }, [browserSessionId, enabled, invalidateRefresh, isCurrentSource, refreshInventory, source]);\n\n useEffect(() => {\n const previous = previousSemanticObservationRef.current;\n previousSemanticObservationRef.current = {\n browserSessionId,\n enabled: semanticObservationEnabled,\n };\n if (\n enabled &&\n semanticObservationEnabled &&\n previous.browserSessionId === browserSessionId &&\n !previous.enabled\n ) {\n // The media stream disappeared or the user returned to the Browser tab.\n // A just-returned action/tab observation is already a fresh fallback.\n // Otherwise drop the old tree/fence until a new read settles.\n const currentObservation = observationRef.current.observation;\n if (\n currentObservation &&\n sameObservationTarget(currentObservation, selectedTargetRef.current) &&\n Date.now() - lastObservationAtRef.current < pollIntervalMs\n ) {\n return;\n }\n observationRef.current = { browserSessionId, observation: null };\n setState((current) =>\n isCurrentSource() &&\n current.source === source &&\n current.browserSessionId === browserSessionId\n ? { ...current, observation: null }\n : current,\n );\n void refreshSemantic();\n }\n }, [\n browserSessionId,\n enabled,\n isCurrentSource,\n pollIntervalMs,\n refreshSemantic,\n semanticObservationEnabled,\n source,\n ]);\n\n useEffect(() => {\n if (!enabled || !pageLive || visible.mutating || refreshBlocked) return;\n const timer = setInterval(() => {\n if (!requestRef.current.controller) void refreshInventory();\n }, pollIntervalMs);\n return () => clearInterval(timer);\n }, [enabled, pageLive, pollIntervalMs, refreshInventory, refreshBlocked, visible.mutating]);\n\n useEffect(() => {\n if (!enabled || !browserSessionId || !pageLive || refreshBlocked) return;\n let disposed = false;\n const heartbeat = () => {\n if (!isCurrentSource()) return;\n void client.heartbeatBrowserSession(workspaceId, browserSessionId).catch(() => {\n if (!disposed) void refreshInventory();\n });\n };\n const timer = setInterval(heartbeat, 30_000);\n return () => {\n disposed = true;\n clearInterval(timer);\n };\n }, [\n browserSessionId,\n client,\n enabled,\n isCurrentSource,\n pageLive,\n refreshInventory,\n refreshBlocked,\n workspaceId,\n ]);\n\n const runMutation = useCallback(\n async <T>(\n scopeBrowserSessionId: string,\n operation: (selectionRevision: number, readRequestId: number) => Promise<T>,\n selectionRead = false,\n changesInventory = false,\n ): Promise<T> => {\n if (!enabled || !isCurrentSource()) {\n throw new Error(t(\"hooks.useBrowserSession.theBrowserSourceIsNo\"));\n }\n const selectionRevision = ++selectionRevisionRef.current;\n invalidateRefresh();\n const readRequestId = requestRef.current.id;\n if (\n mutationRef.current.browserSessionId !== scopeBrowserSessionId ||\n mutationRef.current.source !== source\n ) {\n mutationRef.current = {\n browserSessionId: scopeBrowserSessionId,\n source,\n count: 0,\n needsInventoryReconcile: false,\n };\n }\n mutationRef.current.count += 1;\n setState((current) =>\n isCurrentSource() &&\n current.source === source &&\n current.browserSessionId === scopeBrowserSessionId\n ? { ...current, mutating: true, error: null }\n : current,\n );\n try {\n return await operation(selectionRevision, readRequestId);\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n // Selection observations share refresh ordering; physical mutations\n // keep their existing outcome admission.\n if (!selectionRead || requestRef.current.id === readRequestId) {\n setState((current) =>\n isCurrentSource() &&\n selectionRevisionRef.current === selectionRevision &&\n current.source === source &&\n current.browserSessionId === scopeBrowserSessionId\n ? { ...current, error }\n : current,\n );\n }\n throw error;\n } finally {\n if (\n mutationRef.current.browserSessionId === scopeBrowserSessionId &&\n mutationRef.current.source === source\n ) {\n if (\n changesInventory &&\n (selectionRevisionRef.current !== selectionRevision ||\n requestRef.current.id !== readRequestId)\n ) {\n mutationRef.current.needsInventoryReconcile = true;\n }\n mutationRef.current.count = Math.max(0, mutationRef.current.count - 1);\n const mutating = mutationRef.current.count > 0;\n setState((current) =>\n isCurrentSource() &&\n current.source === source &&\n current.browserSessionId === scopeBrowserSessionId\n ? { ...current, mutating }\n : current,\n );\n if (!mutating && mutationRef.current.needsInventoryReconcile && isCurrentSource()) {\n mutationRef.current.needsInventoryReconcile = false;\n // A superseded tab mutation still changed the real inventory. Wait\n // for all selections to settle, then reconcile without replacing\n // the latest selected-page observation or cancelling its read.\n void refreshInventory(false, false);\n }\n }\n }\n },\n [enabled, invalidateRefresh, isCurrentSource, refreshInventory, source, t],\n );\n\n const selectTarget = useCallback(\n async (targetId: string): Promise<BrowserTarget> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n return await runMutation(\n browserSessionId,\n async (selectionRevision, readRequestId) => {\n const isCurrentSelection = () =>\n isCurrentSource() && selectionRevisionRef.current === selectionRevision;\n // Once admitted, a queued observation survives immediate input.\n const isCurrentSelectionRead = () =>\n isCurrentSelection() && requestRef.current.id === readRequestId;\n let targets = visible.targets;\n let target: BrowserTarget;\n let observation: BrowserObservation;\n try {\n observation = await client.selectBrowserTarget(workspaceId, browserSessionId, targetId);\n target = observation.target;\n } catch (cause) {\n if (!isCurrentSelectionRead() || !isMissingBrowserTarget(cause)) throw cause;\n // A physical/attached tab may disappear between inventory and click.\n // Reconcile once from the authoritative controller inventory and move\n // to its live selected/first page instead of leaving a dead tab ID in\n // React state. Session-level 404s are deliberately not swallowed.\n const response = await client.listBrowserTargets(workspaceId, browserSessionId);\n if (!isCurrentSelectionRead()) throw cause;\n targets = response.targets;\n const fallback = chooseTarget(targets, null);\n if (!fallback) {\n selectedTargetIdRef.current = null;\n selectedTargetRef.current = null;\n observationRef.current = { browserSessionId, observation: null };\n setState((current) =>\n isCurrentSelection() &&\n current.source === source &&\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n targets,\n selectedTargetId: null,\n observation: null,\n }\n : current,\n );\n throw cause;\n }\n observation = await client.selectBrowserTarget(\n workspaceId,\n browserSessionId,\n fallback.id,\n );\n target = observation.target;\n }\n if (!isCurrentSelectionRead()) return target;\n selectedTargetIdRef.current = target.id;\n selectedTargetRef.current = target;\n observationRef.current = { browserSessionId, observation };\n lastObservationAtRef.current = Date.now();\n setState((current) =>\n isCurrentSelection() &&\n current.source === source &&\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n targets: replaceTarget(targets, target).map((candidate) => ({\n ...candidate,\n selected: candidate.id === target.id,\n })),\n selectedTargetId: target.id,\n observation,\n }\n : current,\n );\n return target;\n },\n true,\n );\n },\n [browserSessionId, client, isCurrentSource, runMutation, source, visible.targets, workspaceId],\n );\n\n const openTarget = useCallback(\n async (url?: string): Promise<BrowserTarget> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n return await runMutation(\n browserSessionId,\n async (selectionRevision, readRequestId) => {\n const isCurrentSelection = () =>\n isCurrentSource() && selectionRevisionRef.current === selectionRevision;\n const isCurrentSelectionRead = () =>\n isCurrentSelection() && requestRef.current.id === readRequestId;\n const observation = await client.openBrowserTarget(\n workspaceId,\n browserSessionId,\n url === undefined ? {} : { url },\n );\n const target = observation.target;\n if (!isCurrentSource()) return target;\n if (!isCurrentSelectionRead()) return target;\n selectedTargetIdRef.current = target.id;\n selectedTargetRef.current = target;\n observationRef.current = { browserSessionId, observation };\n lastObservationAtRef.current = Date.now();\n setState((current) =>\n isCurrentSelection() &&\n current.source === source &&\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n targets: [\n ...current.targets.map((candidate) => ({\n ...candidate,\n selected: false,\n })),\n target,\n ],\n selectedTargetId: target.id,\n observation,\n }\n : current,\n );\n return target;\n },\n false,\n true,\n );\n },\n [browserSessionId, client, isCurrentSource, runMutation, source, workspaceId],\n );\n\n const closeTarget = useCallback(\n async (targetId: string): Promise<void> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n await runMutation(\n browserSessionId,\n async (selectionRevision, readRequestId) => {\n const isCurrentSelection = () =>\n isCurrentSource() && selectionRevisionRef.current === selectionRevision;\n const isCurrentSelectionRead = () =>\n isCurrentSelection() && requestRef.current.id === readRequestId;\n const response = await client.closeBrowserTarget(workspaceId, browserSessionId, targetId);\n if (!isCurrentSource()) return;\n if (!isCurrentSelectionRead()) return;\n const selected = chooseTarget(response.targets, selectedTargetIdRef.current);\n const observed = selected\n ? await client.observeBrowserTarget(workspaceId, browserSessionId, selected.id)\n : null;\n if (!isCurrentSource()) return;\n if (!isCurrentSelectionRead()) return;\n const observation =\n observed &&\n selected &&\n observed.browserSessionId === browserSessionId &&\n observed.target.id === selected.id &&\n observed.target.controllerGeneration === selected.controllerGeneration &&\n observed.target.targetGeneration === selected.targetGeneration\n ? observed\n : null;\n const currentTarget = observation?.target ?? selected;\n selectedTargetIdRef.current = currentTarget?.id ?? null;\n selectedTargetRef.current = currentTarget;\n observationRef.current = { browserSessionId, observation };\n if (observation) lastObservationAtRef.current = Date.now();\n setState((current) =>\n isCurrentSelection() &&\n current.source === source &&\n current.browserSessionId === browserSessionId\n ? {\n ...current,\n targets: currentTarget\n ? replaceTarget(response.targets, currentTarget)\n : response.targets,\n selectedTargetId: currentTarget?.id ?? null,\n observation,\n }\n : current,\n );\n },\n false,\n true,\n );\n },\n [browserSessionId, client, isCurrentSource, runMutation, source, workspaceId],\n );\n\n const dispatchAction = useCallback(\n async (\n action: BrowserAction | BrowserActionBatch,\n operationId: string,\n frame:\n | (Pick<\n BrowserFrame,\n \"browserSessionId\" | \"controllerGeneration\" | \"targetId\" | \"targetGeneration\"\n > & {\n frameId: string | null;\n documentGeneration: string | null;\n })\n | null,\n observationMode: \"none\" | \"input\" = \"none\",\n ): Promise<BrowserActionReceipt> => {\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n if (!enabled || !isCurrentSource()) {\n throw new Error(t(\"hooks.useBrowserSession.theBrowserSourceIsNo\"));\n }\n if (!selectedTargetRef.current) {\n throw new Error(\"The browser page is not ready for input.\");\n }\n if (frame && frame.browserSessionId !== browserSessionId) {\n throw new Error(\"The displayed browser frame belongs to another BrowserSession.\");\n }\n const currentObservation =\n observationRef.current.browserSessionId === browserSessionId\n ? observationRef.current.observation\n : null;\n const fence = frame\n ? {\n targetId: frame.targetId,\n expectedTargetGeneration: frame.targetGeneration,\n expectedDocumentGeneration: frame.documentGeneration,\n expectedFrameId: frame.frameId,\n }\n : currentObservation && sameObservationTarget(currentObservation, selectedTargetRef.current)\n ? {\n targetId: currentObservation.target.id,\n expectedTargetGeneration: currentObservation.target.targetGeneration,\n expectedDocumentGeneration: currentObservation.target.documentGeneration,\n expectedFrameId: currentObservation.frameId,\n }\n : null;\n if (!fence) {\n throw new Error(\"The browser page is not ready for input.\");\n }\n const expectedControllerGeneration =\n frame?.controllerGeneration ?? currentObservation!.target.controllerGeneration;\n const selectionRevision = selectionRevisionRef.current;\n const resultOrder = ++actionResultOrderRef.current.next;\n let resultDocumentGeneration = fence.expectedDocumentGeneration;\n const isCurrentResultView = () => {\n const selected = selectedTargetRef.current;\n return (\n isCurrentSource() &&\n selectionRevisionRef.current === selectionRevision &&\n selected?.browserSessionId === browserSessionId &&\n selected.id === fence.targetId &&\n selected.controllerGeneration === expectedControllerGeneration &&\n selected.targetGeneration === fence.expectedTargetGeneration &&\n (selected.documentGeneration === fence.expectedDocumentGeneration ||\n selected.documentGeneration === resultDocumentGeneration)\n );\n };\n const canProjectResult = () =>\n isCurrentResultView() && resultOrder >= actionResultOrderRef.current.settled;\n const settleResult = () => {\n if (!canProjectResult()) return false;\n actionResultOrderRef.current.settled = resultOrder;\n invalidateRefresh();\n return true;\n };\n try {\n const receipt = await client.actInBrowser(workspaceId, browserSessionId, {\n operationId,\n ...fence,\n observationMode,\n action,\n });\n resultDocumentGeneration =\n receipt.observation?.target.documentGeneration ?? fence.expectedDocumentGeneration;\n const settled =\n receipt.state === \"completed\" ||\n receipt.state === \"failed\" ||\n receipt.state === \"outcome_unknown\";\n // Keep the operation result available to its caller, but an older\n // delivery cannot replace a newer settled view or input failure.\n if (!canProjectResult() || (settled && !settleResult())) return receipt;\n const receivedObservation = receipt.observation;\n const selectedTarget = selectedTargetRef.current;\n let projectedObservation: BrowserObservation | null = null;\n if (\n settled &&\n receivedObservation &&\n canProjectResult() &&\n receipt.browserSessionId === browserSessionId &&\n receipt.controllerGeneration === expectedControllerGeneration &&\n receipt.targetId === fence.targetId &&\n observationRef.current.browserSessionId === browserSessionId &&\n receivedObservation.browserSessionId === browserSessionId &&\n selectedTarget?.browserSessionId === browserSessionId &&\n selectedTarget.id === fence.targetId &&\n receivedObservation.target.id === fence.targetId &&\n selectedTarget.controllerGeneration === expectedControllerGeneration &&\n receivedObservation.target.controllerGeneration === expectedControllerGeneration &&\n selectedTarget.targetGeneration === fence.expectedTargetGeneration &&\n receivedObservation.target.targetGeneration === fence.expectedTargetGeneration &&\n (selectedTarget.documentGeneration === fence.expectedDocumentGeneration ||\n selectedTarget.documentGeneration === receivedObservation.target.documentGeneration)\n ) {\n // A receipt updates its own selected page only. Its operation outcome\n // remains available even when the human has moved to another page.\n projectedObservation = receivedObservation;\n observationRef.current = {\n browserSessionId,\n observation: receivedObservation,\n };\n selectedTargetRef.current = receivedObservation.target;\n lastObservationAtRef.current = Date.now();\n }\n setState((current) =>\n isCurrentResultView() &&\n current.source === source &&\n current.browserSessionId === browserSessionId &&\n current.actionResultOrder <= resultOrder\n ? {\n ...current,\n actionResultOrder: settled ? resultOrder : current.actionResultOrder,\n error: receipt.state === \"completed\" ? null : current.error,\n inputFailure:\n receipt.state === \"completed\"\n ? current.inputFailure\n : {\n operationId: receipt.operationId,\n state: receipt.state,\n error: receipt.error,\n },\n ...(projectedObservation\n ? {\n observation: projectedObservation,\n targets: replaceTarget(current.targets, projectedObservation.target),\n }\n : {}),\n }\n : current,\n );\n return receipt;\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n if (settleResult()) {\n setState((current) =>\n isCurrentResultView() &&\n current.source === source &&\n current.browserSessionId === browserSessionId &&\n current.actionResultOrder <= resultOrder\n ? { ...current, error, actionResultOrder: resultOrder }\n : current,\n );\n }\n throw error;\n }\n },\n [browserSessionId, client, enabled, invalidateRefresh, isCurrentSource, source, workspaceId, t],\n );\n\n const act = useCallback(\n async (\n action: BrowserAction | BrowserActionBatch,\n operationId: string = crypto.randomUUID(),\n ): Promise<BrowserActionReceipt> => await dispatchAction(action, operationId, null),\n [dispatchAction],\n );\n\n const actFromFrame = useCallback(\n async (\n action: BrowserAction | BrowserActionBatch,\n frame: BrowserFrameInputFence,\n operationId: string = crypto.randomUUID(),\n observationMode: \"none\" | \"input\" = \"none\",\n ): Promise<BrowserActionReceipt> =>\n await dispatchAction(action, operationId, frame, observationMode),\n [dispatchAction],\n );\n\n const observeForInput = useCallback(async (): Promise<BrowserObservation> => {\n const target = selectedTargetRef.current;\n if (!enabled || !isCurrentSource()) {\n throw new Error(t(\"hooks.useBrowserSession.theBrowserSourceIsNo\"));\n }\n if (!browserSessionId || !target)\n throw new Error(t(\"hooks.useBrowserSession.noBrowserTabIsSelected\"));\n const observation = await client.observeBrowserTarget(workspaceId, browserSessionId, target.id);\n if (\n !isCurrentSource() ||\n observation.browserSessionId !== browserSessionId ||\n !sameObservationTarget(observation, selectedTargetRef.current)\n ) {\n throw new Error(t(\"hooks.useBrowserSession.theBrowserPageChangedOpen\"));\n }\n return observation;\n }, [browserSessionId, client, enabled, isCurrentSource, workspaceId, t]);\n\n const actFromObservation = useCallback(\n async (action: BrowserAction, observation: BrowserObservation) => {\n if (!sameObservationTarget(observation, selectedTargetRef.current)) {\n throw new Error(t(\"hooks.useBrowserSession.theBrowserPageChangedOpen\"));\n }\n return await dispatchAction(action, crypto.randomUUID(), {\n browserSessionId: observation.browserSessionId,\n controllerGeneration: observation.target.controllerGeneration,\n targetId: observation.target.id,\n targetGeneration: observation.target.targetGeneration,\n documentGeneration: observation.target.documentGeneration,\n frameId: observation.frameId,\n });\n },\n [dispatchAction, t],\n );\n\n const diagnostics = useCallback(\n async (diagnosticOptions: BrowserDiagnosticsOptions = {}): Promise<BrowserDiagnosticBatch> => {\n if (!enabled || !isCurrentSource()) {\n throw new Error(t(\"hooks.useBrowserSession.theBrowserSourceIsNo\"));\n }\n const targetId = selectedTargetIdRef.current;\n if (!browserSessionId || !targetId) {\n throw new Error(t(\"hooks.useBrowserSession.noBrowserTabIsSelected\"));\n }\n return await client.listBrowserDiagnostics(\n workspaceId,\n browserSessionId,\n targetId,\n diagnosticOptions,\n );\n },\n [browserSessionId, client, enabled, isCurrentSource, workspaceId, t],\n );\n\n const readClipboard = useCallback(async (): Promise<BrowserClipboard> => {\n if (!enabled || !isCurrentSource()) {\n throw new Error(t(\"hooks.useBrowserSession.theBrowserSourceIsNo\"));\n }\n if (!browserSessionId) throw new Error(\"No BrowserSession is selected.\");\n const clipboard = await client.readBrowserClipboard(workspaceId, browserSessionId);\n if (!isCurrentSource() || clipboard.browserSessionId !== browserSessionId) {\n throw new Error(\"Browser clipboard belongs to another BrowserSession.\");\n }\n return clipboard;\n }, [browserSessionId, client, enabled, isCurrentSource, workspaceId, t]);\n\n return {\n session: visible.session,\n targets: visible.targets,\n selectedTarget:\n visible.targets.find((target) => target.id === visible.selectedTargetId) ?? null,\n observation: visible.observation,\n loading: visible.loading,\n mutating: visible.mutating,\n error: visible.error,\n inputFailure: visible.inputFailure,\n refresh,\n observeForInput,\n actFromObservation,\n selectTarget,\n openTarget,\n closeTarget,\n act,\n actFromFrame,\n readClipboard,\n diagnostics,\n };\n}\n\nfunction emptyState(browserSessionId: string | null, loading: boolean) {\n return {\n browserSessionId,\n session: null as BrowserSession | null,\n targets: [] as BrowserTarget[],\n selectedTargetId: null as string | null,\n observation: null as BrowserObservation | null,\n loading,\n mutating: false,\n error: null as Error | null,\n inputFailure: null as BrowserInputFailure | null,\n actionResultOrder: 0,\n };\n}\n\nfunction chooseTarget(\n targets: readonly BrowserTarget[],\n preferredId: string | null,\n): BrowserTarget | null {\n return (\n targets.find((target) => target.id === preferredId) ??\n targets.find((target) => target.selected && target.kind === \"page\") ??\n targets.find((target) => target.kind === \"page\") ??\n targets[0] ??\n null\n );\n}\n\nfunction replaceTarget(targets: readonly BrowserTarget[], target: BrowserTarget): BrowserTarget[] {\n const next = targets.filter((candidate) => candidate.id !== target.id);\n next.push(target);\n return next.sort((left, right) => left.createdAt.localeCompare(right.createdAt));\n}\n\nfunction sameObservationTarget(\n observation: BrowserObservation,\n target: BrowserTarget | null,\n): boolean {\n return (\n target !== null &&\n observation.browserSessionId === target.browserSessionId &&\n observation.target.id === target.id &&\n observation.target.controllerGeneration === target.controllerGeneration &&\n observation.target.targetGeneration === target.targetGeneration &&\n observation.target.documentGeneration === target.documentGeneration\n );\n}\n\nfunction isMissingBrowserTarget(error: unknown): boolean {\n return error instanceof OpenGeniApiError && error.code === \"target_not_found\";\n}\n","import type {\n BrowserSession,\n BrowserSessionMutationResponse,\n CreateBrowserSessionRequest,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { EmbeddedBrowserInteractionClientLike } from \"../client\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { useInteractionInvalidation } from \"./use-interaction-invalidation\";\n\nexport type UseBrowserSessionsOptions = EmbeddedBrowserInteractionClientOverride & {\n /** Current agent/session relevance. Workspace peers remain in `sessions`. */\n sessionId?: string | undefined;\n enabled?: boolean | undefined;\n /** Polling fallback used only while the workspace invalidation stream is unavailable. */\n pollIntervalMs?: number | undefined;\n};\n\nexport type UseBrowserSessionsResult = {\n revision: number;\n sessions: BrowserSession[];\n relevantSessions: BrowserSession[];\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (\n request: Omit<CreateBrowserSessionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<BrowserSessionMutationResponse>;\n suspend: (\n browserSessionId: string,\n operationId?: string,\n ) => Promise<BrowserSessionMutationResponse>;\n resume: (\n browserSessionId: string,\n operationId?: string,\n ) => Promise<BrowserSessionMutationResponse>;\n end: (browserSessionId: string, operationId?: string) => Promise<BrowserSessionMutationResponse>;\n};\n\n/**\n * Workspace-wide BrowserSession registry. Associations rank relevance but never\n * hide peer resources; no explicit share ceremony or per-view ownership exists.\n */\nexport function useBrowserSessions(\n options: UseBrowserSessionsOptions = {},\n): UseBrowserSessionsResult {\n const {\n client,\n workspaceId,\n registerSessionReconciler,\n workspaceInteractionEvent,\n workspaceInteractionConnectionState,\n } = useEmbeddedBrowserInteraction(options);\n const enabled = options.enabled ?? true;\n const [state, setState] = useState<{\n workspaceId: string;\n active: boolean;\n revision: number;\n sessions: BrowserSession[];\n loading: boolean;\n refreshing: boolean;\n error: Error | null;\n }>(() => emptyState(workspaceId, enabled));\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const loadQueueRef = useRef<{ pending: boolean; promise: Promise<void> } | null>(null);\n const mountedRef = useRef(true);\n\n const visibleState = state.workspaceId === workspaceId ? state : emptyState(workspaceId, enabled);\n\n const cancelLoad = useCallback(() => {\n loadQueueRef.current = null;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n requestRef.current = { id, controller: null };\n }, []);\n\n const loadOnce = useCallback(\n async (foreground: boolean): Promise<void> => {\n if (!enabled) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n active: true,\n loading: foreground,\n refreshing: !foreground,\n error: foreground || current.workspaceId !== workspaceId ? null : current.error,\n }));\n try {\n const response = await client.listBrowserSessions(workspaceId, {\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n workspaceId,\n active: true,\n revision: response.revision,\n sessions: sortBrowserSessions(response.sessions),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setState((current) => ({\n ...(current.workspaceId === workspaceId ? current : emptyState(workspaceId, true)),\n loading: false,\n refreshing: false,\n error,\n }));\n } finally {\n if (requestRef.current.id === id) {\n requestRef.current = { id, controller: null };\n }\n }\n },\n [client, enabled, workspaceId],\n );\n\n const load = useCallback(\n (foreground: boolean): Promise<void> => {\n const current = loadQueueRef.current;\n if (current) {\n current.pending = true;\n return current.promise;\n }\n const queue = { pending: false, promise: Promise.resolve() };\n loadQueueRef.current = queue;\n queue.promise = Promise.resolve()\n .then(async () => {\n // A slow read must be allowed to finish. Invalidations and polling\n // coalesce into one trailing read instead of repeatedly aborting it.\n while (loadQueueRef.current === queue) {\n queue.pending = false;\n await loadOnce(foreground);\n foreground = false;\n if (!queue.pending) break;\n }\n if (loadQueueRef.current === queue) loadQueueRef.current = null;\n })\n .finally(() => {\n if (loadQueueRef.current === queue) loadQueueRef.current = null;\n });\n return queue.promise;\n },\n [loadOnce],\n );\n\n const refresh = useCallback(async () => await load(false), [load]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(workspaceId, false));\n return;\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, load, workspaceId]);\n\n useInteractionInvalidation({\n workspaceId,\n key: workspaceId,\n enabled,\n event: workspaceInteractionEvent,\n connectionState: workspaceInteractionConnectionState,\n knownRevision: visibleState.revision,\n refresh,\n fallbackPollIntervalMs: options.pollIntervalMs,\n });\n\n useEffect(() => {\n if (!enabled || !options.sessionId) return;\n return registerSessionReconciler(options.sessionId, `browser-sessions:${workspaceId}`, refresh);\n }, [enabled, options.sessionId, refresh, registerSessionReconciler, workspaceId]);\n\n const create = useCallback(\n async (\n request: Omit<CreateBrowserSessionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<BrowserSessionMutationResponse> => {\n const response = await client.createBrowserSession(workspaceId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n setState((current) => mergeSession(current, workspaceId, response.session));\n return response;\n },\n [client, workspaceId],\n );\n\n const end = useCallback(\n async (\n browserSessionId: string,\n operationId: string = crypto.randomUUID(),\n ): Promise<BrowserSessionMutationResponse> => {\n const response = await client.endBrowserSession(workspaceId, browserSessionId, {\n operationId,\n });\n setState((current) => mergeSession(current, workspaceId, response.session));\n return response;\n },\n [client, workspaceId],\n );\n\n const suspend = useCallback(\n async (\n browserSessionId: string,\n operationId: string = crypto.randomUUID(),\n ): Promise<BrowserSessionMutationResponse> => {\n const response = await client.suspendBrowserSession(workspaceId, browserSessionId, {\n operationId,\n });\n setState((current) => mergeSession(current, workspaceId, response.session));\n return response;\n },\n [client, workspaceId],\n );\n\n const resume = useCallback(\n async (\n browserSessionId: string,\n operationId: string = crypto.randomUUID(),\n ): Promise<BrowserSessionMutationResponse> => {\n const response = await client.resumeBrowserSession(workspaceId, browserSessionId, {\n operationId,\n });\n setState((current) => mergeSession(current, workspaceId, response.session));\n return response;\n },\n [client, workspaceId],\n );\n\n const relevantSessions = useMemo(\n () =>\n options.sessionId\n ? visibleState.sessions.filter((session) =>\n session.associations.some((association) => association.sessionId === options.sessionId),\n )\n : [],\n [options.sessionId, visibleState.sessions],\n );\n\n return {\n revision: visibleState.revision,\n sessions: visibleState.sessions,\n relevantSessions,\n // A disabled registry is deliberately empty. Expose the first re-enabled\n // render as loading so consumers do not reconcile against that empty gap.\n loading: enabled ? !visibleState.active || visibleState.loading : false,\n refreshing: visibleState.refreshing,\n error: visibleState.error,\n refresh,\n create,\n suspend,\n resume,\n end,\n };\n}\n\nfunction emptyState(workspaceId: string, loading: boolean) {\n return {\n workspaceId,\n active: false,\n revision: 0,\n sessions: [] as BrowserSession[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortBrowserSessions(sessions: readonly BrowserSession[]): BrowserSession[] {\n return [...sessions].sort((left, right) => {\n const live = Number(isLiveBrowser(right)) - Number(isLiveBrowser(left));\n return (\n live ||\n timestamp(right.lastUsedAt) - timestamp(left.lastUsedAt) ||\n left.id.localeCompare(right.id)\n );\n });\n}\n\nfunction isLiveBrowser(session: BrowserSession): boolean {\n return ![\"ending\", \"ended\", \"failed\", \"lost\"].includes(session.lifecycle);\n}\n\nfunction timestamp(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction mergeSession(\n current: ReturnType<typeof emptyState>,\n workspaceId: string,\n session: BrowserSession,\n): ReturnType<typeof emptyState> {\n if (current.workspaceId !== workspaceId) return current;\n const sessions = current.sessions.filter((candidate) => candidate.id !== session.id);\n sessions.push(session);\n return { ...current, sessions: sortBrowserSessions(sessions), error: null };\n}\n\n/** Exported for narrow proxy implementations and tests. */\nexport type BrowserSessionsClient = EmbeddedBrowserInteractionClientLike;\n","import type {\n CreateSiteAuthConnectionRequest,\n SiteAuthConnection,\n SiteAuthConnectionMutationResponse,\n UpdateSiteAuthConnectionRequest,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { EmbeddedBrowserInteractionClientLike } from \"../client\";\nimport {\n type EmbeddedBrowserInteractionClientOverride,\n useEmbeddedBrowserInteraction,\n} from \"../session-context\";\nimport { useInteractionInvalidation } from \"./use-interaction-invalidation\";\n\nexport type UseSiteAuthConnectionsOptions = EmbeddedBrowserInteractionClientOverride & {\n enabled?: boolean | undefined;\n includeArchived?: boolean | undefined;\n};\n\nexport type UseSiteAuthConnectionsResult = {\n revision: number;\n connections: SiteAuthConnection[];\n loading: boolean;\n refreshing: boolean;\n mutating: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (\n request: Omit<CreateSiteAuthConnectionRequest, \"operationId\"> & { operationId?: string },\n ) => Promise<SiteAuthConnectionMutationResponse>;\n update: (\n connectionId: string,\n request: Omit<UpdateSiteAuthConnectionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<SiteAuthConnectionMutationResponse>;\n};\n\n/** Secret-free workspace login recipes and their verified health. */\nexport function useSiteAuthConnections(\n options: UseSiteAuthConnectionsOptions = {},\n): UseSiteAuthConnectionsResult {\n const { client, workspaceId, workspaceInteractionEvent, workspaceInteractionConnectionState } =\n useEmbeddedBrowserInteraction(options);\n const enabled = options.enabled ?? true;\n const includeArchived = options.includeArchived ?? false;\n const key = `${workspaceId}:${includeArchived ? \"all\" : \"active\"}`;\n const [state, setState] = useState(() => emptyState(key, enabled));\n const [mutationCount, setMutationCount] = useState(0);\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n const visible = state.key === key ? state : emptyState(key, enabled);\n\n const cancelLoad = useCallback(() => {\n requestRef.current.controller?.abort();\n requestRef.current = { id: requestRef.current.id + 1, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean): Promise<void> => {\n if (!enabled) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n setState((current) => ({\n ...(current.key === key ? current : emptyState(key, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground || current.key !== key ? null : current.error,\n }));\n try {\n const response = await client.listSiteAuthConnections(workspaceId, {\n includeArchived,\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n key,\n revision: response.revision,\n connections: sortConnections(response.connections),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n setState((current) => ({\n ...(current.key === key ? current : emptyState(key, true)),\n loading: false,\n refreshing: false,\n error: asError(cause),\n }));\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n },\n [client, enabled, includeArchived, key, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false), [load]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(key, false));\n return;\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, key, load]);\n\n useInteractionInvalidation({\n workspaceId,\n key,\n enabled,\n event: workspaceInteractionEvent,\n connectionState: workspaceInteractionConnectionState,\n knownRevision: visible.revision,\n refresh,\n });\n\n const mutate = useCallback(async <T>(operation: () => Promise<T>): Promise<T> => {\n setMutationCount((count) => count + 1);\n try {\n return await operation();\n } finally {\n if (mountedRef.current) setMutationCount((count) => Math.max(0, count - 1));\n }\n }, []);\n\n const merge = useCallback(\n (connection: SiteAuthConnection) => {\n setState((current) => {\n if (current.key !== key) return current;\n const connections = current.connections.filter(\n (candidate) => candidate.id !== connection.id,\n );\n if (includeArchived || connection.status !== \"archived\") connections.push(connection);\n return { ...current, connections: sortConnections(connections), error: null };\n });\n },\n [includeArchived, key],\n );\n\n const create = useCallback(\n async (\n request: Omit<CreateSiteAuthConnectionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<SiteAuthConnectionMutationResponse> =>\n await mutate(async () => {\n const response = await client.createSiteAuthConnection(workspaceId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n merge(response.connection);\n return response;\n }),\n [client, merge, mutate, workspaceId],\n );\n\n const update = useCallback(\n async (\n connectionId: string,\n request: Omit<UpdateSiteAuthConnectionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<SiteAuthConnectionMutationResponse> =>\n await mutate(async () => {\n const response = await client.updateSiteAuthConnection(workspaceId, connectionId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n merge(response.connection);\n return response;\n }),\n [client, merge, mutate, workspaceId],\n );\n\n return {\n revision: visible.revision,\n connections: visible.connections,\n loading: visible.loading,\n refreshing: visible.refreshing,\n mutating: mutationCount > 0,\n error: visible.error,\n refresh,\n create,\n update,\n };\n}\n\nfunction emptyState(key: string, loading: boolean) {\n return {\n key,\n revision: 0,\n connections: [] as SiteAuthConnection[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortConnections(connections: readonly SiteAuthConnection[]): SiteAuthConnection[] {\n return [...connections].sort(\n (left, right) =>\n Number(left.status === \"archived\") - Number(right.status === \"archived\") ||\n left.name.localeCompare(right.name) ||\n left.accountLabel.localeCompare(right.accountLabel),\n );\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nexport type SiteAuthConnectionsClient = EmbeddedBrowserInteractionClientLike;\n","import type { KeyboardEvent } from \"react\";\nimport { interactionHostPlatform, type InteractionHostPlatform } from \"../lib/host-platform\";\n\nexport const HUMAN_BROWSER_HOME_URL = \"https://www.google.com/\";\nconst HUMAN_BROWSER_SEARCH_URL = \"https://www.google.com/search?q=\";\n\n/** Apply browser-style omnibox behavior: navigate hosts, search ordinary text. */\nexport function normalizeBrowserAddress(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n if (/^(?:https?|about):/iu.test(trimmed)) {\n try {\n const url = new URL(trimmed);\n return [\"http:\", \"https:\", \"about:\"].includes(url.protocol) ? url.href : null;\n } catch {\n return `${HUMAN_BROWSER_SEARCH_URL}${encodeURIComponent(trimmed)}`;\n }\n }\n\n const isLocal = /^(?:localhost|127(?:\\.\\d{1,3}){3}|\\[::1\\])(?::\\d+)?(?:[/?#]|$)/iu.test(trimmed);\n const looksLikeHost =\n !/\\s/u.test(trimmed) &&\n (isLocal || /^(?:[^./\\s]+\\.)+[^./\\s]+(?::\\d+)?(?:[/?#]|$)/u.test(trimmed));\n if (!looksLikeHost) return `${HUMAN_BROWSER_SEARCH_URL}${encodeURIComponent(trimmed)}`;\n\n try {\n return new URL(`${isLocal ? \"http\" : \"https\"}://${trimmed}`).href;\n } catch {\n return `${HUMAN_BROWSER_SEARCH_URL}${encodeURIComponent(trimmed)}`;\n }\n}\n\n/** Translate executable keyboard chords for the BrowserSession action API. */\nexport function browserKey(\n event: Pick<\n KeyboardEvent<HTMLTextAreaElement>,\n \"altKey\" | \"ctrlKey\" | \"key\" | \"metaKey\" | \"shiftKey\"\n >,\n hostPlatform: InteractionHostPlatform = interactionHostPlatform(),\n): string | null {\n // Modifier keydowns precede the actual chord key. They are not executable\n // browser actions by themselves (for example Meta+Meta is invalid CDP input).\n if ([\"Alt\", \"AltGraph\", \"Control\", \"Meta\", \"Shift\"].includes(event.key)) return null;\n const special = new Set([\n \"Enter\",\n \"Tab\",\n \"Escape\",\n \"Backspace\",\n \"Delete\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n ]);\n const modified = event.altKey || event.ctrlKey || event.metaKey;\n if (!modified && !special.has(event.key)) return null;\n const parts: string[] = [];\n if (event.ctrlKey) parts.push(hostPlatform === \"mac\" ? \"Control\" : \"Mod\");\n if (event.altKey) parts.push(\"Alt\");\n if (event.metaKey) parts.push(hostPlatform === \"mac\" ? \"Mod\" : \"Meta\");\n if (event.shiftKey) parts.push(\"Shift\");\n parts.push(event.key === \" \" ? \"Space\" : event.key);\n return parts.join(\"+\");\n}\n","import type {\n BrowserAction,\n BrowserActionReceipt,\n BrowserObservation,\n InteractionSemanticNode,\n} from \"@opengeni/sdk/interaction\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\ntype NativeOption = { value: string; label: string; selected: boolean; disabled: boolean };\ntype NativeSelect = {\n kind: \"native-select\";\n multiple: boolean;\n disabled: boolean;\n options: NativeOption[];\n};\n\nfunction focusedSelect(\n observation: BrowserObservation,\n): { node: InteractionSemanticNode; control: NativeSelect } | null {\n if (observation.semantic?.kind !== \"snapshot\") return null;\n const pending = [...observation.semantic.roots];\n while (pending.length) {\n const node = pending.pop()!;\n if (node.children) pending.push(...node.children);\n if (\n node.ref !== observation.focusedRef ||\n !node.actions.includes(\"select\") ||\n node.native?.platform !== \"dom\"\n )\n continue;\n const data = node.native.data as Partial<NativeSelect> | null;\n if (\n !data ||\n data.kind !== \"native-select\" ||\n typeof data.multiple !== \"boolean\" ||\n typeof data.disabled !== \"boolean\" ||\n !Array.isArray(data.options) ||\n data.options.length > 200\n )\n return null;\n if (\n data.options.some(\n (option) =>\n !option ||\n typeof option.value !== \"string\" ||\n typeof option.label !== \"string\" ||\n typeof option.selected !== \"boolean\" ||\n typeof option.disabled !== \"boolean\",\n )\n )\n return null;\n return { node, control: data as NativeSelect };\n }\n return null;\n}\n\n/** Human fallback for native popup windows missing from Chromium page frames. */\nexport function BrowserSelectControl(props: {\n /** Older controllers need an explicit read to discover native popup options. */\n manualFallback?: boolean;\n activation?: {\n observation: BrowserObservation | null;\n anchor: { x: number; y: number } | null;\n } | null;\n onDismiss?: () => void;\n observe: () => Promise<BrowserObservation>;\n act: (action: BrowserAction, observation: BrowserObservation) => Promise<BrowserActionReceipt>;\n}) {\n const t = useOpenGeniText();\n const [snapshot, setSnapshot] = useState<BrowserObservation | null>(null);\n const [open, setOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [values, setValues] = useState<string[]>([]);\n const [anchor, setAnchor] = useState<{ x: number; y: number } | null>(null);\n const popupRef = useRef<HTMLDivElement | null>(null);\n const [position, setPosition] = useState<{ x: number; y: number; height: number } | null>(null);\n const panelRef = useRef<HTMLElement | null>(null);\n const request = useRef(0);\n // An immutable observation may contain duplicate values and labels.\n // Keep each option's identity stable while its selection state rerenders.\n const optionKeys = useRef(new WeakMap<NativeOption, number>());\n const nextOptionKey = useRef(0);\n const optionKey = (option: NativeOption) => {\n let key = optionKeys.current.get(option);\n if (key === undefined) {\n key = ++nextOptionKey.current;\n optionKeys.current.set(option, key);\n }\n return key;\n };\n useEffect(\n () => () => {\n request.current += 1;\n },\n [],\n );\n useEffect(() => {\n if (props.activation === undefined) return;\n ++request.current;\n const observation = props.activation?.observation;\n const selected = observation ? focusedSelect(observation) : null;\n setSnapshot(selected && observation ? observation : null);\n setAnchor(selected ? props.activation!.anchor : null);\n setOpen(Boolean(selected));\n setBusy(false);\n setError(null);\n setValues(\n selected?.control.options.filter((option) => option.selected).map((option) => option.value) ??\n [],\n );\n }, [props.activation]);\n useEffect(() => {\n if (open && !busy) panelRef.current?.focus({ preventScroll: true });\n }, [open, busy]);\n useLayoutEffect(() => {\n if (!anchor || !open) {\n setPosition(null);\n return;\n }\n const place = () => {\n const popup = popupRef.current;\n const parent = popup?.parentElement;\n if (!popup || !parent) return;\n setPosition({\n x: Math.max(12, Math.min(anchor.x, parent.clientWidth - popup.offsetWidth - 12)),\n y: Math.max(12, Math.min(anchor.y, parent.clientHeight - popup.offsetHeight - 12)),\n height: Math.max(48, parent.clientHeight - 60),\n });\n };\n place();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(place);\n if (popupRef.current?.parentElement) observer?.observe(popupRef.current.parentElement);\n if (popupRef.current) observer?.observe(popupRef.current);\n return () => observer?.disconnect();\n }, [anchor, open, busy, snapshot, error]);\n const selected = snapshot ? focusedSelect(snapshot) : null;\n const ambiguousValue = (value: string): boolean =>\n (selected?.control.options.filter((option) => option.value === value || option.label === value)\n .length ?? 0) !== 1;\n const load = async () => {\n const current = ++request.current;\n setOpen(true);\n setBusy(true);\n setSnapshot(null);\n setError(null);\n setAnchor(null);\n try {\n const observation = await props.observe();\n if (current !== request.current) return;\n setSnapshot(observation);\n setValues(\n focusedSelect(observation)\n ?.control.options.filter((option) => option.selected)\n .map((option) => option.value) ?? [],\n );\n } catch (cause) {\n if (current === request.current)\n setError(\n cause instanceof Error ? cause.message : t(\"browserSelectControl.couldNotReadOptions\"),\n );\n } finally {\n if (current === request.current) setBusy(false);\n }\n };\n const apply = async (next: string[]) => {\n if (!snapshot || !selected || busy) return;\n const current = ++request.current;\n setBusy(true);\n setError(null);\n try {\n const receipt = await props.act(\n { type: \"select\", locator: { kind: \"ref\", ref: selected.node.ref }, values: next },\n snapshot,\n );\n if (receipt.state !== \"completed\")\n throw new Error(\n receipt.error?.message ?? t(\"browserSelectControl.selectionDidNotComplete\"),\n );\n if (current === request.current) {\n setOpen(false);\n setSnapshot(null);\n props.onDismiss?.();\n }\n } catch (cause) {\n if (current === request.current) {\n setError(\n cause instanceof Error\n ? cause.message\n : t(\"browserSelectControl.selectionFailedReadTheOptions\"),\n );\n setSnapshot(null); // Never replay an uncertain action.\n }\n } finally {\n if (current === request.current) setBusy(false);\n }\n };\n if (props.manualFallback === false && !open) return null;\n return (\n <div\n ref={popupRef}\n className=\"absolute z-10 max-w-[calc(100%-1.5rem)] text-og-control\"\n style={\n anchor && open\n ? {\n left: position?.x ?? anchor.x,\n top: position?.y ?? anchor.y,\n }\n : { bottom: 12, left: 12 }\n }\n >\n {(props.manualFallback !== false && (!anchor || !open)) || error ? (\n <button\n type=\"button\"\n className=\"rounded-og-sm border border-og-border bg-og-bg px-2 py-1 text-og-fg\"\n disabled={busy}\n onClick={() => void load()}\n aria-expanded={open}\n >\n {t(\"browserSelectControl.chooseOption\")}\n </button>\n ) : null}\n {open ? (\n <section\n ref={panelRef}\n tabIndex={-1}\n aria-label={t(\"browserSelectControl.pageSelectionOptions\")}\n style={position ? { maxHeight: Math.min(288, position.height) } : undefined}\n onKeyDown={(event) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopPropagation();\n ++request.current;\n setOpen(false);\n setSnapshot(null);\n setBusy(false);\n props.onDismiss?.();\n }}\n className=\"mt-1 max-h-72 w-72 max-w-full overflow-auto rounded-og-sm border border-og-border bg-og-bg p-3 text-og-fg shadow-lg\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <strong>{selected?.node.name || t(\"browserSelectControl.pageOptions\")}</strong>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => {\n ++request.current;\n setOpen(false);\n setSnapshot(null);\n props.onDismiss?.();\n }}\n aria-label={t(\"browserSelectControl.closePageOptions\")}\n >\n {t(\"browserSelectControl.close\")}\n </button>\n </div>\n {busy ? (\n <p role=\"status\">{t(\"browserSelectControl.loading\")}</p>\n ) : error ? (\n <p role=\"alert\">{error}</p>\n ) : !selected ? (\n <p>{t(\"browserSelectControl.clickADropdownInThe\")}</p>\n ) : selected.control.disabled ? (\n <p>{t(\"browserSelectControl.thisControlIsDisabled\")}</p>\n ) : (\n <>\n {selected.control.options.map((option) => {\n // Existing select actions accept value OR label. Refuse collisions\n // rather than choosing an unintended duplicate or another label.\n const ambiguous = ambiguousValue(option.value);\n const disabled = busy || option.disabled || ambiguous;\n return selected.control.multiple ? (\n <label key={optionKey(option)} className=\"my-1 flex items-center gap-2\">\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={values.includes(option.value)}\n onChange={(event) =>\n setValues(\n event.target.checked\n ? [...values, option.value]\n : values.filter((value) => value !== option.value),\n )\n }\n />\n {option.label || t(\"browserSelectControl.empty\")}\n {ambiguous ? ` ${t(\"browserSelectControl.ambiguousValue\")}` : \"\"}\n </label>\n ) : (\n <button\n key={optionKey(option)}\n type=\"button\"\n disabled={disabled}\n aria-pressed={option.selected}\n className=\"my-1 block w-full rounded-og-sm border border-og-border px-2 py-1 text-left disabled:opacity-50\"\n onClick={() => void apply([option.value])}\n >\n {option.label || t(\"browserSelectControl.empty\")}\n {option.selected ? \" ✓\" : \"\"}\n {ambiguous ? ` ${t(\"browserSelectControl.ambiguousValue\")}` : \"\"}\n </button>\n );\n })}\n {selected.control.multiple ? (\n <button\n type=\"button\"\n disabled={busy || values.some(ambiguousValue)}\n onClick={() => void apply(values)}\n >\n {t(\"browserSelectControl.applySelection\")}\n </button>\n ) : null}\n </>\n )}\n </section>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":["useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","useCallback","useEffect","useRef","useState","useState","useRef","useCallback","useEffect","useCallback","useEffect","useRef","useState","useState","emptyState","useRef","useCallback","useEffect","timestamp","useCallback","useEffect","useRef","useState","useState","emptyState","useRef","useCallback","useEffect","useCallback","useEffect","useRef","useState","useRef","useState","emptyState","useCallback","useEffect","useCallback","useEffect","useRef","useState","useState","emptyState","useRef","useCallback","useEffect","timestamp","useCallback","useEffect","useRef","useState","useState","emptyState","useRef","useCallback","asError","useEffect","useEffect","useRef","useState","useState","useRef","useEffect","selected","Fragment","jsx","jsxs","useMemo","isLiveBrowser","useRef","useEffect","useState","useCallback","canvas","useLayoutEffect"]}