@opengeni/react 4.6.1 → 4.6.2-canary.39854174564001

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 (465) hide show
  1. package/dist/app/app-state.js +5 -5
  2. package/dist/app/components/Composer.js +14 -14
  3. package/dist/app/components/artifacts/artifact-library.js +2 -2
  4. package/dist/app/components/artifacts/chat-interactive-block.js +10 -10
  5. package/dist/app/components/artifacts/inline-chat-image.js +14 -14
  6. package/dist/app/components/artifacts/retained-file-preview.js +15 -15
  7. package/dist/app/components/artifacts/retained-text-preview.js +2 -2
  8. package/dist/app/components/artifacts/site-conversations.js +4 -3
  9. package/dist/app/components/artifacts/site-data.js +2 -2
  10. package/dist/app/components/artifacts/site-publishing.js +11 -11
  11. package/dist/app/components/artifacts/site-settings.js +12 -12
  12. package/dist/app/components/billing-class-mark.js +3 -3
  13. package/dist/app/components/capabilities/capability-detail-sheet.js +2 -2
  14. package/dist/app/components/capabilities/capability-logo-source.js +7 -7
  15. package/dist/app/components/capabilities/native-connect-readiness.js +1 -0
  16. package/dist/app/components/capabilities/native-connect-readiness.js.map +1 -1
  17. package/dist/app/components/capabilities/native-connect-setup.js +6 -6
  18. package/dist/app/components/capabilities/perform-capability-action.js +2 -1
  19. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +8 -8
  20. package/dist/app/components/capabilities/session-capability-card.js +28 -27
  21. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  22. package/dist/app/components/capabilities/session-chrome-card.js +14 -14
  23. package/dist/app/components/capabilities/session-custom-mcp-card.js +9 -9
  24. package/dist/app/components/capabilities/session-github-card.js +9 -9
  25. package/dist/app/components/capabilities/session-machine-card.js +13 -13
  26. package/dist/app/components/command-menu/chat-status.js +6 -5
  27. package/dist/app/components/command-menu/chat-switcher.d.ts +2 -0
  28. package/dist/app/components/command-menu/chat-switcher.js +26 -9
  29. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  30. package/dist/app/components/command-menu/command-menu.js +9 -8
  31. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  32. package/dist/app/components/command-menu/shortcut-sheet.js +4 -4
  33. package/dist/app/components/composer-mobile-plus-panel.js +5 -5
  34. package/dist/app/components/composer-mobile-plus.js +1 -1
  35. package/dist/app/components/credit-required-gate.js +1 -1
  36. package/dist/app/components/credit-required-prompt.js +3 -3
  37. package/dist/app/components/desktop/app-shots.js +5 -5
  38. package/dist/app/components/desktop/this-computer.js +4 -4
  39. package/dist/app/components/feedback.js +3 -3
  40. package/dist/app/components/github-app-connect-launcher.js +1 -1
  41. package/dist/app/components/machines/connect-machine-dialog.js +3 -3
  42. package/dist/app/components/markdown.js +4 -4
  43. package/dist/app/components/models/models-ui.js +2 -2
  44. package/dist/app/components/pickers.js +5 -5
  45. package/dist/app/components/rail/rail-context.js +1 -1
  46. package/dist/app/components/rail/rail-sections.js +15 -14
  47. package/dist/app/components/rail/session-header.d.ts +6 -5
  48. package/dist/app/components/rail/session-header.js +11 -10
  49. package/dist/app/components/rail/session-list.js +14 -13
  50. package/dist/app/components/rail/session-row-hover-details.js +7 -6
  51. package/dist/app/components/rail/session-shell.js +30 -32
  52. package/dist/app/components/rail/site-session-group-heading.js +2 -1
  53. package/dist/app/components/session/agent-configuration-panel.js +3 -3
  54. package/dist/app/components/session/banners.js +6 -6
  55. package/dist/app/components/session/editable-artifacts-workspace.js +12 -12
  56. package/dist/app/components/session/failed-session-banner.js +4 -4
  57. package/dist/app/components/session/human-input.js +24 -24
  58. package/dist/app/components/session/inspector.js +30 -30
  59. package/dist/app/components/session/message-actions.js +3 -3
  60. package/dist/app/components/session/message-resource-attachments.js +5 -5
  61. package/dist/app/components/session/model-recovery-notice.js +3 -3
  62. package/dist/app/components/session/new-session-settings-menu.js +4 -4
  63. package/dist/app/components/session/sandbox-switcher.js +7 -7
  64. package/dist/app/components/session/sandbox-workspace.js +33 -33
  65. package/dist/app/components/session/search-markdown-highlight.js +5 -5
  66. package/dist/app/components/session/search-results-view.js +6 -6
  67. package/dist/app/components/session/session-admission-notice.js +4 -4
  68. package/dist/app/components/session/session-machine-access-notice.js +4 -4
  69. package/dist/app/components/session/session-search-dialog.js +6 -6
  70. package/dist/app/components/session/session-usage-limit-section.js +3 -3
  71. package/dist/app/components/session/session-wait-status.js +2 -1
  72. package/dist/app/components/session/session-wait-status.js.map +1 -1
  73. package/dist/app/components/session/subagents.js +5 -4
  74. package/dist/app/components/session/subscription-account-indicator.d.ts +35 -0
  75. package/dist/app/components/session/{codex-account-indicator.js → subscription-account-indicator.js} +23 -10
  76. package/dist/app/components/session/subscription-account-menu.d.ts +11 -12
  77. package/dist/app/components/session/subscription-account-menu.js +1 -1
  78. package/dist/app/components/session/subscription-account.d.ts +105 -0
  79. package/dist/app/components/usage/usage-entry.js +3 -3
  80. package/dist/app/components/workspace-composer-plus.js +10 -10
  81. package/dist/app/embed/session-app.js +92 -94
  82. package/dist/app/lib/actions/actions-provider.js +4 -4
  83. package/dist/app/lib/actions/chat-switcher.d.ts +19 -7
  84. package/dist/app/lib/codex-usage-query.js +2 -2
  85. package/dist/app/lib/composer-connectors.js +8 -8
  86. package/dist/app/lib/console-text.js +2 -2
  87. package/dist/app/lib/drive-connect-return.d.ts +26 -0
  88. package/dist/app/lib/drive-connect-return.js +16 -0
  89. package/dist/app/lib/events.js +7 -7
  90. package/dist/app/lib/failed-session-copy.js +3 -3
  91. package/dist/app/lib/model-access-onboarding.js +3 -3
  92. package/dist/app/lib/move-chat-to-machine.js +3 -3
  93. package/dist/app/lib/session-branch-cache.js +6 -5
  94. package/dist/app/lib/session-group-pagination.js +6 -5
  95. package/dist/app/lib/session-hover-facts.js +6 -5
  96. package/dist/app/lib/session-rail.js +2 -1
  97. package/dist/app/lib/sessions-group.js +5 -4
  98. package/dist/app/lib/turn-failure-analytics.js +4 -4
  99. package/dist/app/lib/use-workspace-machines.js +4 -4
  100. package/dist/app/lib/use-workspace-model-catalog.js +3 -3
  101. package/dist/app/lib/use-workspace-rigs.js +2 -2
  102. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  103. package/dist/app/lib/workspace-scope-context.js +3 -3
  104. package/dist/app/routes/artifacts.js +26 -25
  105. package/dist/app/routes/artifacts.js.map +1 -1
  106. package/dist/app/routes/retained-artifact.js +15 -15
  107. package/dist/app/routes/session.js +64 -63
  108. package/dist/app/routes/sessions-index.js +41 -41
  109. package/dist/app/routes/site-view.js +30 -29
  110. package/dist/app/routes/site-view.js.map +1 -1
  111. package/dist/artifacts-document.js +4 -4
  112. package/dist/artifacts-presentation.js +4 -4
  113. package/dist/artifacts-spreadsheet.js +4 -4
  114. package/dist/artifacts.js +10 -10
  115. package/dist/{browser-viewer-YQC6BFMS.js → browser-viewer-VKIAULG7.js} +4 -4
  116. package/dist/{chat-interactive-block-Z22YHDRU.js → chat-interactive-block-JGYSW4KB.js} +5 -5
  117. package/dist/{chunk-WN2MIB4Q.js → chunk-22V2QCEM.js} +2 -2
  118. package/dist/{chunk-SJPAKWWP.js → chunk-2BISI664.js} +2 -2
  119. package/dist/{chunk-O5UOCMH4.js → chunk-2LPJVEWY.js} +3 -3
  120. package/dist/{chunk-JI6WPLZB.js → chunk-2SBCOGQN.js} +4 -4
  121. package/dist/{chunk-6JF7C3U3.js → chunk-2WERWWSS.js} +2 -2
  122. package/dist/{chunk-4XKT4ENZ.js → chunk-2Y3QL3DA.js} +4 -4
  123. package/dist/{chunk-KVMFT6FN.js → chunk-3FL3F4WF.js} +2 -2
  124. package/dist/{chunk-4VJOZJDV.js → chunk-3JPQAIYJ.js} +2 -2
  125. package/dist/{chunk-27EORKJ4.js → chunk-3N4LNBJF.js} +2 -2
  126. package/dist/{chunk-7JZSFJHB.js → chunk-3OJU3RUR.js} +2 -2
  127. package/dist/{chunk-NV5OYV3G.js → chunk-3U6K36QA.js} +5 -5
  128. package/dist/{chunk-MDRLP5DO.js → chunk-3W7ROHN4.js} +3 -3
  129. package/dist/{chunk-3MQM4ZOC.js → chunk-3Y6ZR2VN.js} +3 -3
  130. package/dist/{chunk-HXZIX7MR.js → chunk-47AB65IO.js} +4 -4
  131. package/dist/{chunk-DNYD7AUG.js → chunk-4BOLIZ7Y.js} +3 -3
  132. package/dist/{chunk-4XO346BW.js → chunk-4FBJFQFU.js} +2 -2
  133. package/dist/{chunk-DAQG3C4W.js → chunk-4HM6YDBX.js} +3 -3
  134. package/dist/{chunk-BWKZEW6K.js → chunk-4T3E56NT.js} +3 -3
  135. package/dist/{chunk-4PC7LIQK.js → chunk-4ZMUWRFF.js} +3 -3
  136. package/dist/{chunk-O4AWXTZQ.js → chunk-52XIYULR.js} +3 -3
  137. package/dist/{chunk-GXK4CUAB.js → chunk-5WQKTT5Z.js} +2 -2
  138. package/dist/{chunk-MHIYYHCL.js → chunk-5ZAHAUWD.js} +10 -10
  139. package/dist/{chunk-6N7W3TOV.js → chunk-63BPMTBM.js} +2 -2
  140. package/dist/{chunk-R5YZ3ROM.js → chunk-63PQKTTT.js} +2 -2
  141. package/dist/{chunk-WLZVXCPZ.js → chunk-6GO6WN22.js} +3 -3
  142. package/dist/{chunk-6PQBKMUL.js → chunk-6IIA63VD.js} +11 -7
  143. package/dist/chunk-6IIA63VD.js.map +1 -0
  144. package/dist/{chunk-PQCFW2KT.js → chunk-6IRDW7K3.js} +18 -13
  145. package/dist/chunk-6IRDW7K3.js.map +1 -0
  146. package/dist/{chunk-XDCZBOEY.js → chunk-6LGBGPBU.js} +1 -1
  147. package/dist/{chunk-D4QOZXPM.js → chunk-7ITDATTP.js} +2 -2
  148. package/dist/{chunk-M5E3CKSE.js → chunk-7QWWE5XL.js} +2 -2
  149. package/dist/{chunk-RABKQFTA.js → chunk-A2HCAMRH.js} +2 -2
  150. package/dist/{chunk-6K3WNTRI.js → chunk-AODISQO6.js} +2 -2
  151. package/dist/{chunk-C6JL6PBL.js → chunk-AQDRH6VF.js} +3 -3
  152. package/dist/{chunk-72XEFLMD.js → chunk-ASWINLSW.js} +2 -2
  153. package/dist/{chunk-DNLXQUBX.js → chunk-B746OUJC.js} +24 -36
  154. package/dist/chunk-B746OUJC.js.map +1 -0
  155. package/dist/{chunk-FVCLVASD.js → chunk-B7ZKSROO.js} +24 -24
  156. package/dist/{chunk-EURDMOXZ.js → chunk-BYJZUCOQ.js} +2 -2
  157. package/dist/{chunk-ZWACUOU5.js → chunk-CDBGAAJY.js} +3 -3
  158. package/dist/chunk-CDBGAAJY.js.map +1 -0
  159. package/dist/{chunk-BPD4IJBG.js → chunk-CG6CJMIS.js} +2 -2
  160. package/dist/{chunk-B254JG72.js → chunk-CQX24PT7.js} +2 -2
  161. package/dist/{chunk-HJTTDLF6.js → chunk-CY3NO4JN.js} +4 -4
  162. package/dist/{chunk-OLUG4IFF.js → chunk-D2RLPRSG.js} +2 -2
  163. package/dist/{chunk-74NIHMAT.js → chunk-D653JH6D.js} +3 -3
  164. package/dist/{chunk-FMATVQFW.js → chunk-DA6EQDFR.js} +6 -6
  165. package/dist/{chunk-2LUO22FR.js → chunk-DAI5CTQF.js} +4 -4
  166. package/dist/{chunk-HTKVYEVB.js → chunk-DBM4ZXDN.js} +2 -2
  167. package/dist/{chunk-MB2DTUEG.js → chunk-DNYKLU3K.js} +4 -4
  168. package/dist/{chunk-NPDL4W4Y.js → chunk-DT53LBQN.js} +44 -45
  169. package/dist/chunk-DT53LBQN.js.map +1 -0
  170. package/dist/{chunk-26P7B46A.js → chunk-DXYARXK3.js} +3 -3
  171. package/dist/{chunk-JQKURO3S.js → chunk-E4MQRQ6Z.js} +2 -2
  172. package/dist/{chunk-KW53DBY7.js → chunk-EBW2E32G.js} +2 -2
  173. package/dist/{chunk-O73DRA77.js → chunk-ENKBO7FC.js} +4 -4
  174. package/dist/{chunk-32HA7DXJ.js → chunk-EQNGX77H.js} +11 -11
  175. package/dist/{chunk-CA64OZLZ.js → chunk-FAPYRTG6.js} +4 -4
  176. package/dist/{chunk-WWM7WVD2.js → chunk-GABFKHQE.js} +2 -2
  177. package/dist/chunk-GLCOKWLH.js +42 -0
  178. package/dist/chunk-GLCOKWLH.js.map +1 -0
  179. package/dist/{chunk-OHG2UQ2O.js → chunk-GNM3OY36.js} +51 -13
  180. package/dist/chunk-GNM3OY36.js.map +1 -0
  181. package/dist/{chunk-JJ7VMIEQ.js → chunk-H2GTWX4D.js} +14 -14
  182. package/dist/{chunk-LR7U3HCD.js → chunk-HPSATFLQ.js} +4 -4
  183. package/dist/{chunk-TM2ZLY3Q.js → chunk-I56TUH3Z.js} +13 -13
  184. package/dist/{chunk-ZZUKJ5HQ.js → chunk-IG2ERMSB.js} +2 -2
  185. package/dist/{chunk-2SZ3KC5S.js → chunk-IMKIIS4Y.js} +2 -2
  186. package/dist/{chunk-I57HZMMA.js → chunk-IXIE3H43.js} +2 -2
  187. package/dist/{chunk-OWJD3V4V.js → chunk-J3YQ3554.js} +2 -2
  188. package/dist/{chunk-BCFHMBMK.js → chunk-J5HZBHU4.js} +7 -7
  189. package/dist/{chunk-UHMMRQGU.js → chunk-KD7GNHOP.js} +3 -3
  190. package/dist/{chunk-RXMIXKB3.js → chunk-KIKAVZOW.js} +2 -2
  191. package/dist/{chunk-X7Z4B5GK.js → chunk-KPL7EXS6.js} +2 -2
  192. package/dist/{chunk-GTR2WUBA.js → chunk-KX6M5CJI.js} +1 -1
  193. package/dist/{chunk-CYO5HL4C.js → chunk-KYL2BPS2.js} +2 -2
  194. package/dist/{chunk-ZPZYYSHW.js → chunk-L7EAQGWN.js} +5 -5
  195. package/dist/{chunk-QLDMF7MH.js → chunk-LC5HE7PZ.js} +2 -2
  196. package/dist/{chunk-3SMJ2BIQ.js → chunk-LGD5RESZ.js} +7 -33
  197. package/dist/chunk-LGD5RESZ.js.map +1 -0
  198. package/dist/{chunk-4ICPJZAB.js → chunk-LMYSYG6U.js} +2 -2
  199. package/dist/{chunk-3ZZOE4SN.js → chunk-LOCDYMD6.js} +4 -4
  200. package/dist/{chunk-DNWBLT4U.js → chunk-MASBMJ2M.js} +2 -2
  201. package/dist/{chunk-6VITVQ23.js → chunk-MTYE2PPR.js} +1 -1
  202. package/dist/{chunk-NZMQDUOD.js → chunk-MU6HYDNF.js} +5 -5
  203. package/dist/{chunk-GMVKCEBG.js → chunk-MY6QEDZ2.js} +2 -2
  204. package/dist/{chunk-SK57RWSA.js → chunk-MZGKQ5WV.js} +2 -2
  205. package/dist/{chunk-HSQRYJ4P.js → chunk-N52SFH2K.js} +2 -2
  206. package/dist/{chunk-CEQUNJJY.js → chunk-NDCP5TVN.js} +2 -2
  207. package/dist/{chunk-MY6VZVCP.js → chunk-OAJX5CEL.js} +4 -4
  208. package/dist/{chunk-BQWUXC55.js → chunk-OBBLVC2W.js} +9 -9
  209. package/dist/{chunk-IWIMIRV3.js → chunk-OSJTLQXA.js} +9 -4
  210. package/dist/chunk-OSJTLQXA.js.map +1 -0
  211. package/dist/{chunk-FH75NNLB.js → chunk-OZ5NAXCP.js} +2 -2
  212. package/dist/{chunk-PEGNFZ3F.js → chunk-P5S777YI.js} +2 -2
  213. package/dist/{chunk-LY6727IF.js → chunk-PPSVFNEA.js} +1 -1
  214. package/dist/{chunk-K4FDZVMQ.js → chunk-PR42VIVY.js} +2 -2
  215. package/dist/{chunk-I74J2UZ2.js → chunk-PWMZCW4H.js} +8 -8
  216. package/dist/{chunk-6YDXUE5H.js → chunk-PYA2O3WS.js} +2 -2
  217. package/dist/{chunk-GUIZDI5T.js → chunk-Q2PA4KZS.js} +2 -2
  218. package/dist/{chunk-DZH2HTTB.js → chunk-R27GW5WV.js} +1 -1
  219. package/dist/chunk-R4U4EWZG.js +414 -0
  220. package/dist/chunk-R4U4EWZG.js.map +1 -0
  221. package/dist/{chunk-7OIBLMDP.js → chunk-RAQISW42.js} +2 -2
  222. package/dist/{chunk-CPKD2YGK.js → chunk-RNU5CUPI.js} +2 -2
  223. package/dist/{chunk-467VRP4E.js → chunk-RO5YZQHZ.js} +3 -3
  224. package/dist/{chunk-SSZROOOI.js → chunk-ROLXYGT5.js} +2 -2
  225. package/dist/{chunk-F4B2YYCN.js → chunk-TAWFXRXB.js} +3 -3
  226. package/dist/{chunk-G3FU2IF7.js → chunk-TB7UW5BB.js} +3 -3
  227. package/dist/{chunk-NF6Q4XTN.js → chunk-TQF2I5SY.js} +3 -3
  228. package/dist/{chunk-MM7OKOTE.js → chunk-UBXHP224.js} +43 -18
  229. package/dist/chunk-UBXHP224.js.map +1 -0
  230. package/dist/{chunk-M7A226EQ.js → chunk-UL44R3W2.js} +2 -2
  231. package/dist/{chunk-65K5LV4L.js → chunk-UQKBV22P.js} +21 -20
  232. package/dist/{chunk-65K5LV4L.js.map → chunk-UQKBV22P.js.map} +1 -1
  233. package/dist/{chunk-GTR5NLVP.js → chunk-VCRQPLKS.js} +2 -2
  234. package/dist/{chunk-NWSAF6P5.js → chunk-WJDH7CH5.js} +22 -1
  235. package/dist/chunk-WJDH7CH5.js.map +1 -0
  236. package/dist/{chunk-LG67ZNRU.js → chunk-WK2ZCTUF.js} +2 -2
  237. package/dist/{chunk-XGE75VPK.js → chunk-WNARM3LY.js} +3 -3
  238. package/dist/{chunk-RNBH5TSM.js → chunk-WQ2RTQYO.js} +2 -2
  239. package/dist/chunk-X5XEYQ4B.js +84 -0
  240. package/dist/chunk-X5XEYQ4B.js.map +1 -0
  241. package/dist/{chunk-W57QFLQD.js → chunk-X6JIGNLI.js} +4 -4
  242. package/dist/{chunk-CKA4SJRK.js → chunk-XIQDCQX7.js} +2 -2
  243. package/dist/{chunk-AJ7PY4FJ.js → chunk-Y3GCG6CA.js} +2 -2
  244. package/dist/{chunk-2K27S6LK.js → chunk-Y565N5ZJ.js} +24 -7
  245. package/dist/chunk-Y565N5ZJ.js.map +1 -0
  246. package/dist/{chunk-ZRB4M3GG.js → chunk-YC5KH7ZB.js} +3 -3
  247. package/dist/{chunk-4RY64KQY.js → chunk-YJUKLLNP.js} +2 -2
  248. package/dist/{chunk-24POWVUY.js → chunk-ZDJNRRVS.js} +4 -4
  249. package/dist/{chunk-S6WJ6TUT.js → chunk-ZEVJGMNB.js} +2 -2
  250. package/dist/chunk-ZEVJGMNB.js.map +1 -0
  251. package/dist/{chunk-M7YEZR6X.js → chunk-ZITMDA4C.js} +2 -2
  252. package/dist/components/model-policy-picker.d.ts +2 -0
  253. package/dist/composer.js +6 -6
  254. package/dist/{computer-viewer-BWVNDFTO.js → computer-viewer-6CRLWQHP.js} +5 -5
  255. package/dist/connect.js +6 -6
  256. package/dist/connection-service-presentation.d.ts +1 -4
  257. package/dist/desktop.js +2 -2
  258. package/dist/editor.js +2 -2
  259. package/dist/{embedded-new-voice-GBXSZ3TO.js → embedded-new-voice-KILV3RYM.js} +5 -5
  260. package/dist/{embedded-voice-MGI7EK7C.js → embedded-voice-GHDRLCFX.js} +5 -5
  261. package/dist/{fleet-decision-row-35S3GAUN.js → fleet-decision-row-DQXRRBT7.js} +2 -2
  262. package/dist/index.js +36 -36
  263. package/dist/interaction.js +5 -5
  264. package/dist/machines.js +3 -3
  265. package/dist/messages/en.d.ts +1 -1
  266. package/dist/messages.js +1 -1
  267. package/dist/{model-policy-picker-menu-KP53N6UJ.js → model-policy-picker-menu-5ALKUJMR.js} +4 -4
  268. package/dist/{platform-activity-row-ISMXR7NJ.js → platform-activity-row-227C764Z.js} +2 -2
  269. package/dist/{queue-surface-implementation-ULW7DDJA.js → queue-surface-implementation-H3NOBXU5.js} +5 -5
  270. package/dist/realtime.js +4 -4
  271. package/dist/{sandbox-files-QYSD4XCZ.js → sandbox-files-5FEOHUMD.js} +6 -6
  272. package/dist/session-app.js +92 -94
  273. package/dist/{session-realtime-JXRLPNUH.js → session-realtime-OHBMODNX.js} +3 -3
  274. package/dist/session-realtime.js +2 -2
  275. package/dist/session-ui.js +24 -24
  276. package/dist/session.js +5 -5
  277. package/dist/sites.js +2 -2
  278. package/dist/terminal.js +2 -2
  279. package/dist/this-computer.js +3 -3
  280. package/dist/timeline/connector-logo-index.d.ts +19 -0
  281. package/dist/{timeline-annotation-markers-OJYKHBEO.js → timeline-annotation-markers-NDHS7MCK.js} +2 -2
  282. package/dist/{timeline-annotation-selection-6OAZLXFU.js → timeline-annotation-selection-DRQSTJOV.js} +2 -2
  283. package/dist/{timeline-annotations-dialog-5M6DP5FX.js → timeline-annotations-dialog-G6J5ZJKN.js} +3 -3
  284. package/dist/timeline-model.d.ts +2 -0
  285. package/dist/timeline-model.js +9 -1
  286. package/dist/ui/list-row.js +1 -1
  287. package/dist/usage.js +2 -2
  288. package/dist/workbench.js +4 -4
  289. package/package.json +4 -4
  290. package/src/app/components/capabilities/native-connect-readiness.tsx +1 -0
  291. package/src/app/components/capabilities/perform-capability-action.test.ts +67 -0
  292. package/src/app/components/capabilities/perform-capability-action.tsx +28 -0
  293. package/src/app/components/command-menu/chat-switcher.tsx +25 -4
  294. package/src/app/components/rail/session-header.test.tsx +73 -2
  295. package/src/app/components/rail/session-header.tsx +20 -12
  296. package/src/app/components/rail/session-shell.tsx +10 -18
  297. package/src/app/components/session/subscription-account-indicator.test.ts +239 -0
  298. package/src/app/components/session/subscription-account-indicator.tsx +361 -0
  299. package/src/app/components/session/subscription-account-menu.tsx +21 -43
  300. package/src/app/components/session/subscription-account.test.ts +314 -0
  301. package/src/app/components/session/subscription-account.ts +354 -0
  302. package/src/app/lib/actions/actions-provider.tsx +11 -0
  303. package/src/app/lib/actions/actions.test.ts +59 -4
  304. package/src/app/lib/actions/chat-switcher.ts +73 -20
  305. package/src/app/lib/drive-connect-return.test.ts +183 -0
  306. package/src/app/lib/drive-connect-return.tsx +116 -0
  307. package/src/app/routes/session.tsx +12 -14
  308. package/src/app/routes/sessions-index.tsx +1 -0
  309. package/src/components/model-policy-picker-menu.tsx +25 -4
  310. package/src/components/model-policy-picker.tsx +2 -0
  311. package/src/components/session-mcp-capability-card.tsx +13 -4
  312. package/src/connection-service-presentation.ts +6 -1
  313. package/src/messages/en.ts +1 -1
  314. package/src/timeline/connector-logo-index.test.ts +46 -0
  315. package/src/timeline/connector-logo-index.ts +68 -0
  316. package/src/timeline-model.ts +6 -0
  317. package/src/ui/list-row.tsx +38 -10
  318. package/styles/compiled.css +13 -0
  319. package/dist/app/components/session/codex-account-indicator.d.ts +0 -9
  320. package/dist/app/components/session/model-account-indicator.d.ts +0 -10
  321. package/dist/app/components/session/model-account-indicator.js +0 -34
  322. package/dist/app/components/session/model-account-usage.d.ts +0 -8
  323. package/dist/app/components/session/model-account-usage.js +0 -8
  324. package/dist/chunk-2K27S6LK.js.map +0 -1
  325. package/dist/chunk-3SMJ2BIQ.js.map +0 -1
  326. package/dist/chunk-6PQBKMUL.js.map +0 -1
  327. package/dist/chunk-7H2D4VNU.js +0 -150
  328. package/dist/chunk-7H2D4VNU.js.map +0 -1
  329. package/dist/chunk-DNLXQUBX.js.map +0 -1
  330. package/dist/chunk-HCCSAECI.js +0 -132
  331. package/dist/chunk-HCCSAECI.js.map +0 -1
  332. package/dist/chunk-IWIMIRV3.js.map +0 -1
  333. package/dist/chunk-M77ZQE5T.js +0 -58
  334. package/dist/chunk-M77ZQE5T.js.map +0 -1
  335. package/dist/chunk-MM7OKOTE.js.map +0 -1
  336. package/dist/chunk-NPDL4W4Y.js.map +0 -1
  337. package/dist/chunk-NWSAF6P5.js.map +0 -1
  338. package/dist/chunk-OHG2UQ2O.js.map +0 -1
  339. package/dist/chunk-PQCFW2KT.js.map +0 -1
  340. package/dist/chunk-S6WJ6TUT.js.map +0 -1
  341. package/dist/chunk-ZWACUOU5.js.map +0 -1
  342. package/dist/session-realtime-JXRLPNUH.js.map +0 -1
  343. package/src/app/components/session/codex-account-indicator.tsx +0 -207
  344. package/src/app/components/session/model-account-indicator.tsx +0 -189
  345. package/src/app/components/session/model-account-usage.test.ts +0 -59
  346. package/src/app/components/session/model-account-usage.tsx +0 -89
  347. /package/dist/app/components/session/{codex-account-indicator.js.map → subscription-account-indicator.js.map} +0 -0
  348. /package/dist/app/{components/session/model-account-indicator.js.map → lib/drive-connect-return.js.map} +0 -0
  349. /package/dist/{app/components/session/model-account-usage.js.map → browser-viewer-VKIAULG7.js.map} +0 -0
  350. /package/dist/{browser-viewer-YQC6BFMS.js.map → chat-interactive-block-JGYSW4KB.js.map} +0 -0
  351. /package/dist/{chunk-WN2MIB4Q.js.map → chunk-22V2QCEM.js.map} +0 -0
  352. /package/dist/{chunk-SJPAKWWP.js.map → chunk-2BISI664.js.map} +0 -0
  353. /package/dist/{chunk-O5UOCMH4.js.map → chunk-2LPJVEWY.js.map} +0 -0
  354. /package/dist/{chunk-JI6WPLZB.js.map → chunk-2SBCOGQN.js.map} +0 -0
  355. /package/dist/{chunk-6JF7C3U3.js.map → chunk-2WERWWSS.js.map} +0 -0
  356. /package/dist/{chunk-4XKT4ENZ.js.map → chunk-2Y3QL3DA.js.map} +0 -0
  357. /package/dist/{chunk-KVMFT6FN.js.map → chunk-3FL3F4WF.js.map} +0 -0
  358. /package/dist/{chunk-4VJOZJDV.js.map → chunk-3JPQAIYJ.js.map} +0 -0
  359. /package/dist/{chunk-27EORKJ4.js.map → chunk-3N4LNBJF.js.map} +0 -0
  360. /package/dist/{chunk-7JZSFJHB.js.map → chunk-3OJU3RUR.js.map} +0 -0
  361. /package/dist/{chunk-NV5OYV3G.js.map → chunk-3U6K36QA.js.map} +0 -0
  362. /package/dist/{chunk-MDRLP5DO.js.map → chunk-3W7ROHN4.js.map} +0 -0
  363. /package/dist/{chunk-3MQM4ZOC.js.map → chunk-3Y6ZR2VN.js.map} +0 -0
  364. /package/dist/{chunk-HXZIX7MR.js.map → chunk-47AB65IO.js.map} +0 -0
  365. /package/dist/{chunk-DNYD7AUG.js.map → chunk-4BOLIZ7Y.js.map} +0 -0
  366. /package/dist/{chunk-4XO346BW.js.map → chunk-4FBJFQFU.js.map} +0 -0
  367. /package/dist/{chunk-DAQG3C4W.js.map → chunk-4HM6YDBX.js.map} +0 -0
  368. /package/dist/{chunk-BWKZEW6K.js.map → chunk-4T3E56NT.js.map} +0 -0
  369. /package/dist/{chunk-4PC7LIQK.js.map → chunk-4ZMUWRFF.js.map} +0 -0
  370. /package/dist/{chunk-O4AWXTZQ.js.map → chunk-52XIYULR.js.map} +0 -0
  371. /package/dist/{chunk-GXK4CUAB.js.map → chunk-5WQKTT5Z.js.map} +0 -0
  372. /package/dist/{chunk-MHIYYHCL.js.map → chunk-5ZAHAUWD.js.map} +0 -0
  373. /package/dist/{chunk-6N7W3TOV.js.map → chunk-63BPMTBM.js.map} +0 -0
  374. /package/dist/{chunk-R5YZ3ROM.js.map → chunk-63PQKTTT.js.map} +0 -0
  375. /package/dist/{chunk-WLZVXCPZ.js.map → chunk-6GO6WN22.js.map} +0 -0
  376. /package/dist/{chunk-XDCZBOEY.js.map → chunk-6LGBGPBU.js.map} +0 -0
  377. /package/dist/{chunk-D4QOZXPM.js.map → chunk-7ITDATTP.js.map} +0 -0
  378. /package/dist/{chunk-M5E3CKSE.js.map → chunk-7QWWE5XL.js.map} +0 -0
  379. /package/dist/{chunk-RABKQFTA.js.map → chunk-A2HCAMRH.js.map} +0 -0
  380. /package/dist/{chunk-6K3WNTRI.js.map → chunk-AODISQO6.js.map} +0 -0
  381. /package/dist/{chunk-C6JL6PBL.js.map → chunk-AQDRH6VF.js.map} +0 -0
  382. /package/dist/{chunk-72XEFLMD.js.map → chunk-ASWINLSW.js.map} +0 -0
  383. /package/dist/{chunk-FVCLVASD.js.map → chunk-B7ZKSROO.js.map} +0 -0
  384. /package/dist/{chunk-EURDMOXZ.js.map → chunk-BYJZUCOQ.js.map} +0 -0
  385. /package/dist/{chunk-BPD4IJBG.js.map → chunk-CG6CJMIS.js.map} +0 -0
  386. /package/dist/{chunk-B254JG72.js.map → chunk-CQX24PT7.js.map} +0 -0
  387. /package/dist/{chunk-HJTTDLF6.js.map → chunk-CY3NO4JN.js.map} +0 -0
  388. /package/dist/{chunk-OLUG4IFF.js.map → chunk-D2RLPRSG.js.map} +0 -0
  389. /package/dist/{chunk-74NIHMAT.js.map → chunk-D653JH6D.js.map} +0 -0
  390. /package/dist/{chunk-FMATVQFW.js.map → chunk-DA6EQDFR.js.map} +0 -0
  391. /package/dist/{chunk-2LUO22FR.js.map → chunk-DAI5CTQF.js.map} +0 -0
  392. /package/dist/{chunk-HTKVYEVB.js.map → chunk-DBM4ZXDN.js.map} +0 -0
  393. /package/dist/{chunk-MB2DTUEG.js.map → chunk-DNYKLU3K.js.map} +0 -0
  394. /package/dist/{chunk-26P7B46A.js.map → chunk-DXYARXK3.js.map} +0 -0
  395. /package/dist/{chunk-JQKURO3S.js.map → chunk-E4MQRQ6Z.js.map} +0 -0
  396. /package/dist/{chunk-KW53DBY7.js.map → chunk-EBW2E32G.js.map} +0 -0
  397. /package/dist/{chunk-O73DRA77.js.map → chunk-ENKBO7FC.js.map} +0 -0
  398. /package/dist/{chunk-32HA7DXJ.js.map → chunk-EQNGX77H.js.map} +0 -0
  399. /package/dist/{chunk-CA64OZLZ.js.map → chunk-FAPYRTG6.js.map} +0 -0
  400. /package/dist/{chunk-WWM7WVD2.js.map → chunk-GABFKHQE.js.map} +0 -0
  401. /package/dist/{chunk-JJ7VMIEQ.js.map → chunk-H2GTWX4D.js.map} +0 -0
  402. /package/dist/{chunk-LR7U3HCD.js.map → chunk-HPSATFLQ.js.map} +0 -0
  403. /package/dist/{chunk-TM2ZLY3Q.js.map → chunk-I56TUH3Z.js.map} +0 -0
  404. /package/dist/{chunk-ZZUKJ5HQ.js.map → chunk-IG2ERMSB.js.map} +0 -0
  405. /package/dist/{chunk-2SZ3KC5S.js.map → chunk-IMKIIS4Y.js.map} +0 -0
  406. /package/dist/{chunk-I57HZMMA.js.map → chunk-IXIE3H43.js.map} +0 -0
  407. /package/dist/{chunk-OWJD3V4V.js.map → chunk-J3YQ3554.js.map} +0 -0
  408. /package/dist/{chunk-BCFHMBMK.js.map → chunk-J5HZBHU4.js.map} +0 -0
  409. /package/dist/{chunk-UHMMRQGU.js.map → chunk-KD7GNHOP.js.map} +0 -0
  410. /package/dist/{chunk-RXMIXKB3.js.map → chunk-KIKAVZOW.js.map} +0 -0
  411. /package/dist/{chunk-X7Z4B5GK.js.map → chunk-KPL7EXS6.js.map} +0 -0
  412. /package/dist/{chunk-GTR2WUBA.js.map → chunk-KX6M5CJI.js.map} +0 -0
  413. /package/dist/{chunk-CYO5HL4C.js.map → chunk-KYL2BPS2.js.map} +0 -0
  414. /package/dist/{chunk-ZPZYYSHW.js.map → chunk-L7EAQGWN.js.map} +0 -0
  415. /package/dist/{chunk-QLDMF7MH.js.map → chunk-LC5HE7PZ.js.map} +0 -0
  416. /package/dist/{chunk-4ICPJZAB.js.map → chunk-LMYSYG6U.js.map} +0 -0
  417. /package/dist/{chunk-3ZZOE4SN.js.map → chunk-LOCDYMD6.js.map} +0 -0
  418. /package/dist/{chunk-DNWBLT4U.js.map → chunk-MASBMJ2M.js.map} +0 -0
  419. /package/dist/{chunk-6VITVQ23.js.map → chunk-MTYE2PPR.js.map} +0 -0
  420. /package/dist/{chunk-NZMQDUOD.js.map → chunk-MU6HYDNF.js.map} +0 -0
  421. /package/dist/{chunk-GMVKCEBG.js.map → chunk-MY6QEDZ2.js.map} +0 -0
  422. /package/dist/{chunk-SK57RWSA.js.map → chunk-MZGKQ5WV.js.map} +0 -0
  423. /package/dist/{chunk-HSQRYJ4P.js.map → chunk-N52SFH2K.js.map} +0 -0
  424. /package/dist/{chunk-CEQUNJJY.js.map → chunk-NDCP5TVN.js.map} +0 -0
  425. /package/dist/{chunk-MY6VZVCP.js.map → chunk-OAJX5CEL.js.map} +0 -0
  426. /package/dist/{chunk-BQWUXC55.js.map → chunk-OBBLVC2W.js.map} +0 -0
  427. /package/dist/{chunk-FH75NNLB.js.map → chunk-OZ5NAXCP.js.map} +0 -0
  428. /package/dist/{chunk-PEGNFZ3F.js.map → chunk-P5S777YI.js.map} +0 -0
  429. /package/dist/{chunk-LY6727IF.js.map → chunk-PPSVFNEA.js.map} +0 -0
  430. /package/dist/{chunk-K4FDZVMQ.js.map → chunk-PR42VIVY.js.map} +0 -0
  431. /package/dist/{chunk-I74J2UZ2.js.map → chunk-PWMZCW4H.js.map} +0 -0
  432. /package/dist/{chunk-6YDXUE5H.js.map → chunk-PYA2O3WS.js.map} +0 -0
  433. /package/dist/{chunk-GUIZDI5T.js.map → chunk-Q2PA4KZS.js.map} +0 -0
  434. /package/dist/{chunk-DZH2HTTB.js.map → chunk-R27GW5WV.js.map} +0 -0
  435. /package/dist/{chunk-7OIBLMDP.js.map → chunk-RAQISW42.js.map} +0 -0
  436. /package/dist/{chunk-CPKD2YGK.js.map → chunk-RNU5CUPI.js.map} +0 -0
  437. /package/dist/{chunk-467VRP4E.js.map → chunk-RO5YZQHZ.js.map} +0 -0
  438. /package/dist/{chunk-SSZROOOI.js.map → chunk-ROLXYGT5.js.map} +0 -0
  439. /package/dist/{chunk-F4B2YYCN.js.map → chunk-TAWFXRXB.js.map} +0 -0
  440. /package/dist/{chunk-G3FU2IF7.js.map → chunk-TB7UW5BB.js.map} +0 -0
  441. /package/dist/{chunk-NF6Q4XTN.js.map → chunk-TQF2I5SY.js.map} +0 -0
  442. /package/dist/{chunk-M7A226EQ.js.map → chunk-UL44R3W2.js.map} +0 -0
  443. /package/dist/{chunk-GTR5NLVP.js.map → chunk-VCRQPLKS.js.map} +0 -0
  444. /package/dist/{chunk-LG67ZNRU.js.map → chunk-WK2ZCTUF.js.map} +0 -0
  445. /package/dist/{chunk-XGE75VPK.js.map → chunk-WNARM3LY.js.map} +0 -0
  446. /package/dist/{chunk-RNBH5TSM.js.map → chunk-WQ2RTQYO.js.map} +0 -0
  447. /package/dist/{chunk-W57QFLQD.js.map → chunk-X6JIGNLI.js.map} +0 -0
  448. /package/dist/{chunk-CKA4SJRK.js.map → chunk-XIQDCQX7.js.map} +0 -0
  449. /package/dist/{chunk-AJ7PY4FJ.js.map → chunk-Y3GCG6CA.js.map} +0 -0
  450. /package/dist/{chunk-ZRB4M3GG.js.map → chunk-YC5KH7ZB.js.map} +0 -0
  451. /package/dist/{chunk-4RY64KQY.js.map → chunk-YJUKLLNP.js.map} +0 -0
  452. /package/dist/{chunk-24POWVUY.js.map → chunk-ZDJNRRVS.js.map} +0 -0
  453. /package/dist/{chunk-M7YEZR6X.js.map → chunk-ZITMDA4C.js.map} +0 -0
  454. /package/dist/{chat-interactive-block-Z22YHDRU.js.map → computer-viewer-6CRLWQHP.js.map} +0 -0
  455. /package/dist/{computer-viewer-BWVNDFTO.js.map → embedded-new-voice-KILV3RYM.js.map} +0 -0
  456. /package/dist/{embedded-new-voice-GBXSZ3TO.js.map → embedded-voice-GHDRLCFX.js.map} +0 -0
  457. /package/dist/{fleet-decision-row-35S3GAUN.js.map → fleet-decision-row-DQXRRBT7.js.map} +0 -0
  458. /package/dist/{embedded-voice-MGI7EK7C.js.map → model-policy-picker-menu-5ALKUJMR.js.map} +0 -0
  459. /package/dist/{platform-activity-row-ISMXR7NJ.js.map → platform-activity-row-227C764Z.js.map} +0 -0
  460. /package/dist/{queue-surface-implementation-ULW7DDJA.js.map → queue-surface-implementation-H3NOBXU5.js.map} +0 -0
  461. /package/dist/{model-policy-picker-menu-KP53N6UJ.js.map → sandbox-files-5FEOHUMD.js.map} +0 -0
  462. /package/dist/{sandbox-files-QYSD4XCZ.js.map → session-realtime-OHBMODNX.js.map} +0 -0
  463. /package/dist/{timeline-annotation-markers-OJYKHBEO.js.map → timeline-annotation-markers-NDHS7MCK.js.map} +0 -0
  464. /package/dist/{timeline-annotation-selection-6OAZLXFU.js.map → timeline-annotation-selection-DRQSTJOV.js.map} +0 -0
  465. /package/dist/{timeline-annotations-dialog-5M6DP5FX.js.map → timeline-annotations-dialog-G6J5ZJKN.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-connect.ts","../src/components/session-mcp-capability-card.tsx","../src/mcp-connection-status.ts"],"sourcesContent":["import type { ConnectController } from \"@opengeni/connect\";\nimport { useMemo, useSyncExternalStore } from \"react\";\n\n/** Internal consumers import the hook directly so setup surfaces stay lazy. */\nexport function useConnect(controller: ConnectController) {\n const snapshot = useSyncExternalStore(\n controller.subscribe,\n controller.getSnapshot,\n controller.getSnapshot,\n );\n const actions = useMemo(\n () => ({\n begin: controller.begin.bind(controller),\n recover: controller.recover.bind(controller),\n refresh: controller.refresh.bind(controller),\n waitForAction: controller.waitForAction.bind(controller),\n advance: controller.advance.bind(controller),\n cancel: controller.cancel.bind(controller),\n }),\n [controller],\n );\n return useMemo(() => ({ ...snapshot, ...actions }), [snapshot, actions]);\n}\n","import {\n authorizeConnectAttempt,\n ConnectPopupClosedError,\n ConnectController,\n createBrowserConnectNavigation,\n reserveBrowserConnectNavigation,\n type ConnectAttempt,\n type ConnectNavigation,\n type ConnectOwnership,\n} from \"@opengeni/connect\";\nimport type { CapabilityCatalogItem } from \"@opengeni/sdk\";\nimport type { OpenGeniBrowserClient as OpenGeniClient } from \"@opengeni/sdk/browser\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConnect } from \"../hooks/use-connect\";\nimport { attachSessionCapability, sessionCapabilityTools } from \"../session-capability-policy\";\nimport { SessionCapabilityFrame } from \"./session-capability-frame\";\nimport { matchingActiveMcpConnections } from \"../mcp-connection-status\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\nexport type SessionMcpCapabilityCardProps = {\n client: OpenGeniClient;\n workspaceId: string;\n sessionId: string;\n capabilityId: string;\n name: string;\n rationale?: string;\n /** Exact host route; no console-specific routing is assumed. */\n returnUrl: string;\n onConfigured?: (() => void | Promise<void>) | undefined;\n};\n\nexport type McpConnectionCardProps = Omit<SessionMcpCapabilityCardProps, \"sessionId\"> & {\n /** Omit for connection management: no session tool selection is written. */\n sessionId?: string;\n dialogOnly?: boolean;\n onClose?: (() => void) | undefined;\n /**\n * The provider only ever connects someone's own account (official Gmail,\n * Slack's hosted MCP): no ownership choice, always personal.\n */\n personalOnly?: boolean;\n /** The connect button's words, \"Connect Gmail\". Defaults to \"Continue to <name>\". */\n connectLabel?: string;\n /** The line under the dialog title. Defaults to the kind and provider domain. */\n dialogSubtitle?: string;\n /** The host's product copy for this connection, instead of the catalog description. */\n description?: string;\n /** The host's logo for this connection, when the catalog has no asset. */\n logoSrc?: string | null;\n /** The host's words for the ownership choice. */\n ownershipCopy?: { legend: string; workspace: string; personal: string };\n};\n\n/** Native OAuth recommendation flow. Identity and endpoint come from the live\n * catalog, never from model-authored recommendation text. */\nexport function SessionMcpCapabilityCard(props: SessionMcpCapabilityCardProps) {\n return <McpConnectionCard {...props} />;\n}\n\nexport function McpConnectionCard(props: McpConnectionCardProps) {\n const [client, setClient] = useState(props.client);\n const [generation, setGeneration] = useState(0);\n if (client !== props.client) {\n setClient(props.client);\n setGeneration(generation + 1);\n }\n return (\n <ScopedCard\n key={`${generation}:${props.workspaceId}:${props.sessionId}:${props.capabilityId}`}\n {...props}\n />\n );\n}\n\nfunction ScopedCard({\n client,\n workspaceId,\n sessionId,\n capabilityId,\n name,\n rationale = \"\",\n returnUrl,\n onConfigured,\n dialogOnly = false,\n onClose,\n personalOnly: configuredPersonalOnly = false,\n connectLabel,\n dialogSubtitle,\n description: hostDescription,\n logoSrc,\n ownershipCopy,\n}: McpConnectionCardProps) {\n const t = useOpenGeniText();\n const [controller] = useState(\n () => new ConnectController(client.connectTransport(), workspaceId),\n );\n const view = useConnect(controller);\n const [item, setItem] = useState<CapabilityCatalogItem | null>(null);\n const personalOnly =\n configuredPersonalOnly ||\n (item?.mcpUrl ?? item?.endpointUrl) === \"https://drivemcp.googleapis.com/mcp/v1\";\n const [logo, setLogo] = useState<string | null>(null);\n const [expanded, setExpanded] = useState(dialogOnly);\n const [complete, setComplete] = useState(false);\n const [connected, setConnected] = useState(false);\n const [waiting, setWaiting] = useState(false);\n const [reconciling, setReconciling] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [retryFresh, setRetryFresh] = useState(false);\n const [ownership, setOwnership] = useState<ConnectOwnership>(\n personalOnly ? \"personal\" : \"workspace\",\n );\n const lifetime = useRef<AbortController | null>(null);\n const authorization = useRef<AbortController | null>(null);\n const operation = useRef<AbortController | null>(null);\n const reservedPopup = useRef<(() => void) | null>(null);\n const startKey = useRef(crypto.randomUUID());\n const advanceKey = useRef(crypto.randomUUID());\n const startInput = useRef<string | null>(null);\n const storageKey = sessionId\n ? `opengeni:session-connect:${workspaceId}:${sessionId}:${capabilityId}`\n : `opengeni:workspace-connect:${workspaceId}:${capabilityId}`;\n const current = () => !!lifetime.current && !lifetime.current.signal.aborted;\n\n async function load(active: () => boolean = current) {\n const invocation = lifetime.current;\n const [catalog, session] = await Promise.all([\n client.listCapabilities(workspaceId),\n sessionId ? client.getSession(workspaceId, sessionId) : Promise.resolve(null),\n ]);\n if (!invocation || invocation.signal.aborted || lifetime.current !== invocation || !active())\n return null;\n let resolved = catalog.items.find((entry) => entry.id === capabilityId);\n // Custom catalog entries may not declare authentication. Discover it from\n // the live catalog's endpoint, never from recommendation/host copy.\n if (resolved?.kind === \"mcp\" && !resolved.enabled && !resolved.authKind) {\n const endpoint = resolved.mcpUrl ?? resolved.endpointUrl;\n if (endpoint) {\n const inspected = await client.inspectMcpAuthentication(workspaceId, endpoint);\n if (invocation.signal.aborted || lifetime.current !== invocation || !active()) return null;\n if (inspected.kind === \"oauth2\") resolved = { ...resolved, authKind: \"oauth2\" };\n else if (inspected.kind === \"unknown\")\n throw new Error(\n inspected.message ?? t(\"sessionMcpCapabilityCard.couldNotDetermineHowTo\"),\n );\n }\n }\n if (!resolved || resolved.kind !== \"mcp\" || resolved.authKind !== \"oauth2\")\n throw new Error(t(\"sessionMcpCapabilityCard.thisRecommendationIsNotAn\"));\n setItem(resolved);\n if (resolved.connectionRef)\n setOwnership(resolved.connectionRef.subjectScope === \"subject\" ? \"personal\" : \"workspace\");\n else if (\n !item &&\n (personalOnly ||\n (resolved.mcpUrl ?? resolved.endpointUrl) === \"https://drivemcp.googleapis.com/mcp/v1\" ||\n resolved.metadata?.defaultConnectionOwnership === \"personal\")\n )\n setOwnership(\"personal\");\n let accountReady = false;\n if (resolved.enabled && resolved.connectionRef) {\n const connections =\n resolved.connectionRef.subjectScope === \"subject\"\n ? await client.listOwnConnectionAccounts(workspaceId)\n : await client.listConnections(workspaceId);\n if (invocation.signal.aborted || lifetime.current !== invocation || !active()) return null;\n const matches = matchingActiveMcpConnections(resolved, connections);\n accountReady = matches.length === 1;\n }\n if (invocation.signal.aborted || lifetime.current !== invocation || !active()) return null;\n const selected =\n session?.toolPolicy.mode === \"workspace_default\"\n ? session.effectiveToolPolicy?.selectedIds\n : session?.tools.filter((tool) => tool.kind === \"mcp\").map((tool) => tool.id);\n setConnected(accountReady);\n setComplete(\n accountReady &&\n !!selected &&\n sessionCapabilityTools(resolved).every((tool) => selected.includes(tool.id)),\n );\n return resolved;\n }\n\n useEffect(() => {\n const abort = new AbortController();\n lifetime.current = abort;\n // Mount reads are scoped to this effect, not to the user-action lock.\n // Strict Mode may cancel the first mount while its promise is still in\n // flight; that must not suppress the replacement mount's initialization.\n if (dialogOnly) setBusy(true);\n void (async () => {\n await load();\n if (abort.signal.aborted || !dialogOnly) return;\n await recoverSavedAttempt();\n })()\n .catch((failure) => {\n if (!abort.signal.aborted)\n setError(\n failure instanceof Error\n ? failure.message\n : t(\"sessionMcpCapabilityCard.couldnTLoadConnectionDetails\"),\n );\n })\n .finally(() => {\n if (!abort.signal.aborted && dialogOnly) setBusy(false);\n });\n return () => {\n abort.abort();\n };\n // ScopedCard remounts for client/workspace/session/capability changes.\n // These reads initialize that scope; rerunning on action closures would\n // cancel initialization whenever its own state updates render the card.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, workspaceId, sessionId, capabilityId, dialogOnly, t]);\n\n useEffect(() => {\n const path = item?.logoAssetPath;\n setLogo(null);\n if (!path?.startsWith(\"catalog-assets/\")) return;\n const abort = new AbortController();\n let objectUrl: string | null = null;\n // Embeds can require authentication even for the API's public catalog\n // asset route. Use the client's transport instead of an unauthenticated img.\n void client\n .downloadCatalogAsset(path, { signal: abort.signal })\n .then((blob) => {\n if (abort.signal.aborted || !blob.type.startsWith(\"image/\") || blob.size > 2_000_000)\n return;\n objectUrl = URL.createObjectURL(blob);\n setLogo(objectUrl);\n })\n .catch(() => {\n /* Keep the provider's initials if its passive mark is unavailable. */\n });\n return () => {\n abort.abort();\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n }, [client, item?.logoAssetPath]);\n\n async function run(action: (active: () => boolean) => Promise<void>) {\n if (operation.current || !current()) return;\n const pending = new AbortController();\n operation.current = pending;\n const active = () => current() && operation.current === pending && !pending.signal.aborted;\n setBusy(true);\n setError(null);\n setNotice(null);\n setRetryFresh(false);\n try {\n await action(active);\n } catch (failure) {\n if (active()) {\n if (failure instanceof ConnectPopupClosedError) setNotice(failure.message);\n else\n setError(\n failure instanceof Error\n ? failure.message\n : t(\"sessionMcpCapabilityCard.connectionSetupCouldNotFinish\"),\n );\n }\n } finally {\n if (operation.current === pending) {\n operation.current = null;\n if (current()) setBusy(false);\n }\n }\n }\n\n function remember(attemptId: string) {\n // An opaque recovery hint only. The backend rechecks the authenticated\n // owner on recover; this value never grants access or proves completion.\n try {\n sessionStorage.setItem(storageKey, attemptId);\n } catch {\n /* Storage may be disabled. */\n }\n }\n\n async function reconcile(attempt: ConnectAttempt, active: () => boolean = current) {\n if (!active()) return;\n if (attempt.state !== \"complete\" || !attempt.account || !attempt.credentialsCommitted) return;\n const resolved = await load(active);\n if (!resolved || !active()) return;\n const connection = (await client.listConnections(workspaceId)).find(\n (entry) => entry.id === attempt.account!.id,\n );\n if (!active()) return;\n if (\n !connection ||\n connection.status !== \"active\" ||\n connection.kind !== \"oauth2\" ||\n connection.metadata.mcpUrl !== (resolved.mcpUrl ?? resolved.endpointUrl) ||\n (connection.subjectId !== null) !== (attempt.ownership === \"personal\")\n )\n throw new Error(t(\"sessionMcpCapabilityCard.theAuthorizedAccountDoesNot\"));\n const previous = resolved.connectionRef;\n if (\n resolved.enabled &&\n previous?.subjectScope !== \"subject\" &&\n previous?.connectionId &&\n previous.connectionId !== connection.id\n )\n throw new Error(t(\"sessionMcpCapabilityCard.thisIntegrationSSelectedAccount\"));\n await client.enableCapability(workspaceId, capabilityId, {\n connectionRef:\n attempt.ownership === \"personal\"\n ? { providerDomain: connection.providerDomain, kind: \"oauth2\", subjectScope: \"subject\" }\n : {\n providerDomain: connection.providerDomain,\n kind: \"oauth2\",\n subjectScope: \"workspace\",\n connectionId: connection.id,\n },\n });\n if (!active()) return;\n const enabled = await load(active);\n if (enabled && active()) {\n await finishConnection(enabled, active);\n }\n if (!active()) return;\n try {\n sessionStorage.removeItem(storageKey);\n } catch {\n /* Recovery hint only. */\n }\n }\n\n async function open() {\n setExpanded(true);\n await run(async (active) => {\n await load(active);\n if (!active()) return;\n await recoverSavedAttempt(active);\n });\n }\n\n async function recoverSavedAttempt(active: () => boolean = current) {\n let saved: string | null = null;\n try {\n saved = sessionStorage.getItem(storageKey);\n } catch {\n /* No persisted attempt. */\n }\n if (saved) {\n const attempt = await controller.recover(saved);\n if (!active()) return;\n if ([\"failed\", \"expired\", \"cancelled\"].includes(attempt.state)) setRetryFresh(true);\n if (attempt.state === \"complete\") setReconciling(true);\n try {\n await reconcile(attempt, active);\n } finally {\n if (active()) setReconciling(false);\n }\n }\n }\n\n async function begin(fresh = false) {\n await run(async (active) => {\n if (\n fresh ||\n (view.attempt && [\"failed\", \"expired\", \"cancelled\"].includes(view.attempt.state))\n ) {\n startKey.current = crypto.randomUUID();\n advanceKey.current = crypto.randomUUID();\n }\n const reserved = reserveBrowserConnectNavigation(window);\n reservedPopup.current = reserved.close;\n try {\n const resolved = await load(active);\n if (!resolved || !active()) return;\n if (\n resolved.connectionRef &&\n ownership !==\n (resolved.connectionRef.subjectScope === \"subject\" ? \"personal\" : \"workspace\")\n )\n throw new Error(t(\"sessionMcpCapabilityCard.theConnectionOwnershipChangedReview\"));\n const mcpUrl = resolved.mcpUrl ?? resolved.endpointUrl;\n if (!mcpUrl) throw new Error(t(\"sessionMcpCapabilityCard.theCurrentCatalogHasNo\"));\n // Never silently replace an already selected account. Reauthorization\n // stays on its exact native connection ID.\n let reconnectAccountId = resolved.connectionRef?.connectionId ?? undefined;\n if (resolved.connectionRef?.subjectScope === \"subject\") {\n const connections = (await client.listConnections(workspaceId)).filter(\n (entry) =>\n entry.subjectId !== null &&\n entry.kind === \"oauth2\" &&\n entry.metadata.mcpUrl === mcpUrl,\n );\n if (!active()) return;\n if (connections.length > 1)\n throw new Error(t(\"sessionMcpCapabilityCard.moreThanOnePersonalAccount\"));\n reconnectAccountId = connections[0]?.id;\n }\n // A closed request can still have reached the server. Keep its key for\n // an exact replay, but never reuse it when ownership or another input\n // changes while the user reopens setup.\n const input = JSON.stringify({ ownership, returnUrl, reconnectAccountId, mcpUrl });\n if (startInput.current !== null && startInput.current !== input) {\n startKey.current = crypto.randomUUID();\n advanceKey.current = crypto.randomUUID();\n }\n startInput.current = input;\n let attempt = await controller.begin({\n providerId:\n mcpUrl === \"https://drivemcp.googleapis.com/mcp/v1\" ? \"google-drive\" : \"mcp-oauth\",\n ownership,\n returnUrl,\n idempotencyKey: startKey.current,\n ...(reconnectAccountId ? { reconnectAccountId } : {}),\n });\n if (!active()) return;\n remember(attempt.id);\n if (attempt.state === \"credential_input\")\n attempt = await controller.advance(\n {\n type: \"credentials\",\n values: mcpUrl === \"https://drivemcp.googleapis.com/mcp/v1\" ? {} : { mcpUrl },\n },\n advanceKey.current,\n );\n if (!active()) return;\n if (attempt.nextAction.type === \"authorize\")\n await performAuthorization(attempt, reserved.navigation, active);\n else await reconcile(attempt, active);\n } finally {\n if (reservedPopup.current === reserved.close) reservedPopup.current = null;\n reserved.close();\n }\n });\n }\n\n async function performAuthorization(\n attempt: ConnectAttempt,\n navigation: ConnectNavigation,\n active: () => boolean,\n ) {\n if (!active()) return;\n const pending = new AbortController();\n authorization.current = pending;\n const abortOnUnmount = () => pending.abort(lifetime.current?.signal.reason);\n lifetime.current!.signal.addEventListener(\"abort\", abortOnUnmount, { once: true });\n setWaiting(true);\n try {\n const result = await authorizeConnectAttempt(controller.transport, attempt, navigation, {\n mode: \"popup\",\n signal: pending.signal,\n });\n if (!active() || !result) return;\n setWaiting(false);\n setReconciling(true);\n await reconcile(result, active);\n if (!active()) return;\n if (result.state === \"cancelled\") {\n setNotice(t(\"sessionMcpCapabilityCard.signInWasCancelledYou\"));\n setRetryFresh(true);\n return;\n }\n if (result.state !== \"complete\") {\n if ([\"failed\", \"expired\"].includes(result.state)) setRetryFresh(true);\n throw new Error(t(\"sessionMcpCapabilityCard.signInDidNotFinish\"));\n }\n } finally {\n lifetime.current?.signal.removeEventListener(\"abort\", abortOnUnmount);\n if (authorization.current === pending) authorization.current = null;\n if (active()) {\n setReconciling(false);\n setWaiting(false);\n }\n }\n }\n\n function authorize(attempt: ConnectAttempt) {\n // run invokes action synchronously, retaining the browser click gesture.\n return run((active) =>\n performAuthorization(attempt, createBrowserConnectNavigation(window), active),\n );\n }\n\n async function finishConnection(\n capability: CapabilityCatalogItem,\n active: () => boolean = current,\n ) {\n if (!sessionId) {\n // Connection management does not select session tools.\n await onConfigured?.();\n if (!active()) return;\n setComplete(true);\n setExpanded(false);\n onClose?.();\n return;\n }\n if (capability.connectionRef && capability.connectionRef.subjectScope !== \"subject\") {\n const selected = (await client.listConnections(workspaceId)).find(\n (entry) => entry.id === capability.connectionRef?.connectionId,\n );\n if (!active()) return;\n if (!selected || selected.status !== \"active\")\n throw new Error(t(\"sessionMcpCapabilityCard.thisAccountNeedsReconnectionBefore\"));\n }\n if (capability.connectionRef?.subjectScope === \"subject\") {\n const accounts = await client.listOwnConnectionAccounts(workspaceId);\n if (!active()) return;\n if (matchingActiveMcpConnections(capability, accounts).length === 0)\n throw new Error(t(\"sessionMcpCapabilityCard.yourAccountNeedsReconnectionBefore\"));\n }\n if (!active()) return;\n await attachSessionCapability(t, client, workspaceId, sessionId, capability, active);\n if (!active()) return;\n await onConfigured?.();\n if (!active()) return;\n setComplete(true);\n setExpanded(false);\n }\n\n async function useHere() {\n await run(async (active) => {\n if (item) await finishConnection(item, active);\n });\n }\n\n function close() {\n const pending = operation.current;\n if (pending) {\n operation.current = null;\n pending.abort(new ConnectPopupClosedError());\n authorization.current?.abort(new ConnectPopupClosedError());\n authorization.current = null;\n reservedPopup.current?.();\n setBusy(false);\n setWaiting(false);\n setReconciling(false);\n }\n setExpanded(false);\n onClose?.();\n }\n\n return (\n <SessionCapabilityFrame\n name={item?.name ?? name}\n subtitle={dialogSubtitle !== undefined ? \"\" : (item?.providerDomain ?? \"\")}\n logo={logo ?? logoSrc ?? null}\n typeLabel={dialogSubtitle ?? t(\"sessionMcpCapabilityCard.mcpServer\")}\n description={hostDescription || item?.description || rationale}\n skill={false}\n expanded={expanded}\n complete={complete}\n actionLabel={\n connected\n ? sessionId\n ? t(\"sessionMcpCapabilityCard.useInThisConversation\")\n : t(\"sessionMcpCapabilityCard.connected\")\n : t(\"sessionMcpCapabilityCard.connectName\", { name: item?.name ?? name })\n }\n note={\n sessionId\n ? t(\"sessionMcpCapabilityCard.reviewAccessBeforeSigningIn\")\n : t(\"sessionMcpCapabilityCard.reviewAccessBeforeSigningIn2\")\n }\n onOpen={() => void open()}\n onClose={close}\n dialogOnly={dialogOnly}\n >\n <div className=\"og-session-capability-setup\">\n {error ? <p role=\"alert\">{error}</p> : null}\n {notice ? (\n <p role=\"status\" className=\"og-session-capability-notice\">\n {notice}\n </p>\n ) : null}\n {!item ? (\n <>\n <p role=\"status\">\n {busy\n ? t(\"sessionMcpCapabilityCard.loadingConnectionDetails\")\n : t(\"sessionMcpCapabilityCard.connectionDetailsAreUnavailable\")}\n </p>\n <button disabled={busy} onClick={() => void open()}>\n {t(\"sessionMcpCapabilityCard.retry\")}\n </button>\n </>\n ) : (\n <>\n <p>{hostDescription || item.description || rationale}</p>\n {busy ? (\n <>\n <p role=\"status\" className=\"og-session-capability-progress\">\n {waiting\n ? t(\"sessionMcpCapabilityCard.finishSigningInWithName\", { name: item.name })\n : reconciling\n ? t(\"sessionMcpCapabilityCard.finishingYourConnection\")\n : t(\"sessionMcpCapabilityCard.preparingYourConnection\")}\n </p>\n {waiting ? (\n <button\n type=\"button\"\n className=\"og-session-capability-stop\"\n onClick={() => authorization.current?.abort(new ConnectPopupClosedError())}\n >\n {t(\"sessionMcpCapabilityCard.stopWaiting\")}\n </button>\n ) : null}\n </>\n ) : !connected ? (\n <>\n {!item.connectionRef && !personalOnly ? (\n <fieldset disabled={busy}>\n <legend>\n {ownershipCopy?.legend ??\n t(\"sessionMcpCapabilityCard.whoCanUseThisConnection\")}\n </legend>\n <label>\n <input\n type=\"radio\"\n name={`${capabilityId}-ownership`}\n checked={ownership === \"workspace\"}\n onChange={() => setOwnership(\"workspace\")}\n />\n {t(\"sessionMcpCapabilityCard.everyoneInThisWorkspace\")}\n </label>\n <label>\n <input\n type=\"radio\"\n name={`${capabilityId}-ownership`}\n checked={ownership === \"personal\"}\n onChange={() => setOwnership(\"personal\")}\n />\n {t(\"sessionMcpCapabilityCard.onlyMe\")}\n </label>\n </fieldset>\n ) : null}\n <p className=\"og-session-capability-scope\">\n {personalOnly && ownership === \"personal\"\n ? t(\"sessionMcpCapabilityCard.connectsYourOwnAccountOnly\")\n : ownershipCopy\n ? ownership === \"workspace\"\n ? ownershipCopy.workspace\n : ownershipCopy.personal\n : ownership === \"workspace\"\n ? sessionId\n ? t(\"sessionMcpCapabilityCard.thisConnectionWillBeAvailable\")\n : t(\"sessionMcpCapabilityCard.thisConnectionWillBeAvailable2\")\n : t(\"sessionMcpCapabilityCard.thisConnectionBelongsToYou\")}\n </p>\n <button\n className=\"og-session-capability-primary\"\n onClick={() => {\n if (notice || retryFresh) void begin(true);\n else if (\n view.attempt?.nextAction.type === \"authorize\" &&\n view.attempt.ownership === ownership\n )\n void authorize(view.attempt);\n else void begin();\n }}\n >\n {retryFresh ||\n ((error || notice) && view.attempt?.nextAction.type === \"authorize\")\n ? t(\"sessionMcpCapabilityCard.trySigningInAgain\")\n : (connectLabel ??\n t(\"sessionMcpCapabilityCard.continueToName\", { name: item.name }))}\n </button>\n </>\n ) : null}\n {connected && !busy ? (\n <>\n <p className=\"og-session-capability-scope\">\n {sessionId\n ? t(\"sessionMcpCapabilityCard.yourAccountIsConnectedEnable\")\n : t(\"sessionMcpCapabilityCard.yourAccountIsConnected\")}\n </p>\n <button\n className=\"og-session-capability-primary\"\n disabled={busy || view.busy}\n onClick={() => void useHere()}\n >\n {sessionId\n ? t(\"sessionMcpCapabilityCard.useInThisConversation\")\n : t(\"sessionMcpCapabilityCard.done\")}\n </button>\n </>\n ) : null}\n </>\n )}\n </div>\n </SessionCapabilityFrame>\n );\n}\n","import type { CapabilityCatalogItem, ConnectionMetadata } from \"@opengeni/sdk\";\nimport { type OpenGeniText } from \"./messages/runtime\";\n\n/** Status only; runtime use is authorized for the authenticated initiating user. */\nexport function matchingActiveMcpConnections(\n item: CapabilityCatalogItem,\n connections: ConnectionMetadata[],\n) {\n return matchingMcpConnections(item, connections).filter((entry) => entry.status === \"active\");\n}\n\nfunction matchingMcpConnections(item: CapabilityCatalogItem, connections: ConnectionMetadata[]) {\n const ref = item.connectionRef;\n if (!item.enabled || !ref) return [];\n return connections.filter(\n (entry) =>\n entry.status !== \"revoked\" &&\n entry.kind === \"oauth2\" &&\n entry.metadata.mcpUrl === (item.mcpUrl ?? item.endpointUrl) &&\n (ref.subjectScope !== \"subject\"\n ? entry.id === ref.connectionId && entry.subjectId === null\n : entry.subjectId !== null),\n );\n}\n\n/** Installation availability is not account readiness. Revoked history is not actionable. */\nexport function mcpConnectionDiscoveryState(\n t: OpenGeniText,\n item: CapabilityCatalogItem,\n connections: ConnectionMetadata[],\n) {\n const matching = matchingMcpConnections(item, connections);\n const active = matching.filter((entry) => entry.status === \"active\");\n if (active.length === 1)\n return { status: \"added\", label: t(\"mcpConnectionStatus.connected\") } as const;\n if (matching.length > 0)\n return { status: \"attention\", label: t(\"mcpConnectionStatus.reviewConnection\") } as const;\n return { status: \"available\", label: t(\"mcpConnectionStatus.connect\") } as const;\n}\n"],"mappings":"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","names":[]}
@@ -3,16 +3,16 @@ import {
3
3
  GrantSessionAdminAccessDialog,
4
4
  SessionAdminAccessIndicator
5
5
  } from "./chunk-O4DYOSOL.js";
6
+ import {
7
+ SessionAncestryBreadcrumb
8
+ } from "./chunk-KYL2BPS2.js";
6
9
  import {
7
10
  SiteOriginLink
8
11
  } from "./chunk-MVZYNZXE.js";
9
- import {
10
- SessionAncestryBreadcrumb
11
- } from "./chunk-CYO5HL4C.js";
12
12
  import {
13
13
  useActionShortcut,
14
14
  useChatOperations
15
- } from "./chunk-OHG2UQ2O.js";
15
+ } from "./chunk-GNM3OY36.js";
16
16
  import {
17
17
  pinLiveAnnouncement
18
18
  } from "./chunk-GLYJV66C.js";
@@ -25,7 +25,7 @@ import {
25
25
  } from "./chunk-E36IC3LU.js";
26
26
  import {
27
27
  RENAME_CURRENT_CHAT_EVENT
28
- } from "./chunk-6VITVQ23.js";
28
+ } from "./chunk-MTYE2PPR.js";
29
29
  import {
30
30
  requestConversationFind
31
31
  } from "./chunk-7ZEGSUR7.js";
@@ -37,13 +37,13 @@ import {
37
37
  } from "./chunk-7J7PZB4S.js";
38
38
  import {
39
39
  BillingClassMark
40
- } from "./chunk-M7YEZR6X.js";
40
+ } from "./chunk-ZITMDA4C.js";
41
41
  import {
42
42
  ConnectionPill
43
43
  } from "./chunk-G46333YC.js";
44
44
  import {
45
45
  t
46
- } from "./chunk-BPD4IJBG.js";
46
+ } from "./chunk-CG6CJMIS.js";
47
47
  import {
48
48
  labelEffort
49
49
  } from "./chunk-L6Y4ALSM.js";
@@ -69,7 +69,7 @@ import {
69
69
  SESSION_STATUS_META,
70
70
  SessionStatus,
71
71
  StatusDot
72
- } from "./chunk-FH75NNLB.js";
72
+ } from "./chunk-OZ5NAXCP.js";
73
73
  import {
74
74
  useSessionStartup
75
75
  } from "./chunk-EMIVOS73.js";
@@ -115,6 +115,11 @@ import {
115
115
  } from "lucide-react";
116
116
  import { useCallback, useEffect, useRef, useState } from "react";
117
117
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
118
+ var SUBSCRIPTION_RAILS = /* @__PURE__ */ new Set([
119
+ "codex_subscription",
120
+ "claude_subscription",
121
+ "supergrok_subscription"
122
+ ]);
118
123
  function SessionHeader({
119
124
  session,
120
125
  ancestors,
@@ -134,7 +139,7 @@ function SessionHeader({
134
139
  adminAccess,
135
140
  onOpenUsageLimit,
136
141
  sandboxSlot,
137
- codexSlot,
142
+ accountSlot,
138
143
  accessSlot,
139
144
  leading,
140
145
  lastStartedModel,
@@ -160,7 +165,7 @@ function SessionHeader({
160
165
  const resolvedModel = modelLabel?.trim() || modelDisplayName(modelId);
161
166
  const displayEffort = lastStartedReasoningEffort ?? session.reasoningEffort;
162
167
  const displayLatency = lastStartedLatencyMode ?? session.latencyMode;
163
- const isCodexRail = resolvedBilling === "codex_subscription";
168
+ const isSubscriptionRail = SUBSCRIPTION_RAILS.has(resolvedBilling);
164
169
  const policyBits = [
165
170
  resolvedModel,
166
171
  labelEffort(displayEffort),
@@ -183,10 +188,10 @@ function SessionHeader({
183
188
  uiEvents.addEventListener(RENAME_CURRENT_CHAT_EVENT, start);
184
189
  return () => uiEvents.removeEventListener(RENAME_CURRENT_CHAT_EVENT, start);
185
190
  }, [uiEvents, startRenaming]);
186
- const providerControl = isCodexRail ? codexSlot ?? /* @__PURE__ */ jsx(
191
+ const providerControl = isSubscriptionRail ? accountSlot ?? /* @__PURE__ */ jsx(
187
192
  BillingClassMark,
188
193
  {
189
- billingClass: "codex_subscription",
194
+ billingClass: resolvedBilling,
190
195
  className: "size-3.5 shrink-0 text-fg-muted",
191
196
  "aria-label": ""
192
197
  }
@@ -678,4 +683,4 @@ function SessionTitleEditor(props) {
678
683
  export {
679
684
  SessionHeader
680
685
  };
681
- //# sourceMappingURL=chunk-PQCFW2KT.js.map
686
+ //# sourceMappingURL=chunk-6IRDW7K3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/components/rail/session-header.tsx"],"sourcesContent":["// The session header bar — the slim canvas top strip's contents on a session\n// route. Split out of the session shell as a PURE, presentational component: it takes\n// plain session data + callbacks and renders the two-line identity block\n// (breadcrumb → title) on the left and the action cluster on the right\n// (provider+model·effort·speed, sandbox, pin, connection, status, panel).\n// The live children that need their own hooks — the sandbox switcher and the\n// subscription account control — arrive as slots so the whole bar can be rendered\n// (and screenshotted) in isolation. `CanvasTopStrip` in session-shell owns the\n// data wiring and passes the real slots.\nimport { t } from \"../../lib/console-text\";\nimport { OPEN_WORKSTREAM_CONTROL_EVENT } from \"../../../workstream-control-event\";\nimport {\n SessionStatus as SessionStatusBadge,\n SESSION_STATUS_META,\n StatusDot,\n} from \"../../../components/session-status\";\nimport { sessionDisplayStatus, type SessionDisplayStatus } from \"../../../session-status-model\";\nimport { ModelMark } from \"../../../components/model-mark\";\nimport { modelDisplayName } from \"@opengeni/sdk/model-display\";\nimport type { SessionEventsConnectionState } from \"../../../hooks/use-session-events\";\nimport type { SessionSummary } from \"@opengeni/sdk\";\nimport { SiteOriginLink } from \"../session/site-origin-link\";\nimport {\n ArchiveIcon,\n ArchiveRestoreIcon,\n BellIcon,\n BellOffIcon,\n CalendarClockIcon,\n CalendarOffIcon,\n GaugeIcon,\n LinkIcon,\n LockIcon,\n MoreHorizontalIcon,\n PanelRightCloseIcon,\n PanelRightOpenIcon,\n PauseIcon,\n PencilIcon,\n PinIcon,\n SearchIcon,\n ShieldCheckIcon,\n ShieldOffIcon,\n SmartphoneIcon,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\n\nimport { BillingClassMark, type BillingClass } from \"../billing-class-mark\";\nimport { ConnectionPill } from \"../common\";\nimport {\n GrantSessionAdminAccessDialog,\n SessionAdminAccessIndicator,\n type SessionAdminAccessControl,\n} from \"../session/session-admin-access\";\nimport { SessionAncestryBreadcrumb } from \"../session/subagents\";\nimport { Button } from \"../../../ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuMeta,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from \"../../../ui/dropdown-menu\";\nimport { useActionShortcut } from \"../../lib/actions/actions-provider\";\nimport { useChatOperations } from \"../../lib/actions/chat-operations\";\nimport { RENAME_CURRENT_CHAT_EVENT } from \"../../lib/actions/events\";\nimport { Skeleton } from \"../../../ui/skeleton\";\nimport { requestConversationFind } from \"../../lib/conversation-find-event\";\nimport { currentPhoneAppPlatform, openInAppUrl } from \"../../lib/open-in-app\";\nimport {\n sessionControlPaused,\n sessionHasUpcomingSchedule,\n sessionInputWait,\n} from \"../../lib/session-rail\";\nimport { useSessionStartup } from \"../../../lib/session-startup\";\nimport { isCodexProductModel } from \"../../lib/session-model\";\nimport {\n SESSION_TITLE_MAX_LENGTH,\n sessionDisplayTitle,\n useInlineRename,\n type InlineRename,\n} from \"../../lib/session-rename\";\nimport { pinLiveAnnouncement } from \"../../lib/pin-live-announcement\";\nimport type { SessionRepliesMute } from \"../../lib/inbox\";\nimport { labelEffort, type IntelligenceEffort } from \"../../lib/session-tools\";\nimport type { LatencyMode, Session } from \"../../types\";\nimport { usePage } from \"../../lib/navigation\";\nimport { useUiEventTarget } from \"../../lib/ui-events\";\n\nconst SUBSCRIPTION_RAILS: ReadonlySet<BillingClass> = new Set([\n \"codex_subscription\",\n \"claude_subscription\",\n \"supergrok_subscription\",\n]);\n\nexport function SessionHeader({\n session,\n ancestors,\n onOpenSchedule,\n lineageLoading,\n lineageError,\n connectionState,\n status,\n keyAuthRequired,\n onForgetAccessKey,\n inspectorOpen,\n onToggleInspector,\n onRename,\n onPin,\n onArchive,\n repliesMute,\n adminAccess,\n onOpenUsageLimit,\n sandboxSlot,\n accountSlot,\n accessSlot,\n leading,\n lastStartedModel,\n lastStartedReasoningEffort,\n lastStartedLatencyMode,\n billingClass,\n modelLabel,\n modelLogoUrl,\n policyLoading,\n}: {\n session: Session;\n /** Root-to-direct-parent order. */\n ancestors: SessionSummary[];\n /**\n * Present only when a scheduled task started this session. Opens that task on\n * the Schedules page so the reader can see or edit what put this here.\n */\n onOpenSchedule?: ((() => void) | null) | undefined;\n lineageLoading?: boolean | undefined;\n lineageError?: Error | null | undefined;\n connectionState: SessionEventsConnectionState;\n status: Session[\"status\"];\n keyAuthRequired: boolean;\n onForgetAccessKey: () => void;\n inspectorOpen: boolean;\n /** Absent: the surface shows no session panel, so no toggle. */\n onToggleInspector?: (() => void) | undefined;\n onRename: (workspaceId: string, sessionId: string, title: string) => Promise<Session | null>;\n onPin: (session: Session, pinned: boolean) => Promise<Session | null>;\n /** Archives or restores this root session. Absent hides the action. */\n onArchive?: ((session: Session, archived: boolean) => Promise<void>) | undefined;\n /**\n * The signed-in person's mute on this session's replies. Absent hides the\n * action (sub-agents, people without an inbox, servers without it).\n */\n repliesMute?: SessionRepliesMute | null | undefined;\n /**\n * This session's admin access, when the viewer can see it on or give it.\n * Absent hides the shield and the menu action.\n */\n adminAccess?: SessionAdminAccessControl | null | undefined;\n /**\n * Opens this chat's usage limit (Agent tab > Usage). Absent hides the menu\n * item, for servers without usage limits.\n */\n onOpenUsageLimit?: ((() => void) | null) | undefined;\n /** The \"Run on <machine>\" control — a live component in production. */\n sandboxSlot?: ReactNode | undefined;\n /**\n * Replaces the static provider mark when the session runs on a subscription\n * (Codex, Claude, SuperGrok): the same mark, clickable for the account and\n * its usage. Absent for other payment rails.\n */\n accountSlot?: ReactNode | undefined;\n /** Compact session access state/menu, lazy-mounted by the route shell. */\n accessSlot?: ReactNode | undefined;\n /** Leading control (the mobile hamburger); absent on desktop. */\n leading?: ReactNode | undefined;\n /**\n * Model·effort·latency from the newest turn that durably emitted `turn.started`.\n * Historical — does not follow the composer next-turn picker. Falls back to\n * session creation defaults before any turn has admitted.\n */\n lastStartedModel?: string | undefined;\n lastStartedReasoningEffort?: IntelligenceEffort | undefined;\n lastStartedLatencyMode?: LatencyMode | undefined;\n /** Billing rail: subscription account chip, or the mark for makers without a logo. */\n billingClass?: BillingClass | undefined;\n /** Product model label (e.g. GPT-5.6 Luna). */\n modelLabel?: string | undefined;\n modelLogoUrl?: string | undefined;\n /**\n * True while last-started policy and/or model catalog are still resolving.\n * Avoids flashing session defaults (wrong provider) before admitted truth.\n */\n policyLoading?: boolean | undefined;\n}) {\n const uiEvents = useUiEventTarget(\"document\");\n const page = usePage();\n const waiting = sessionInputWait({ ...session, status });\n // A paused or finished schedule still links to its settings, marked inactive.\n const upcomingSchedule = sessionHasUpcomingSchedule(session);\n // A session the runtime could not start reads as stuck, not \"Waiting on you\".\n const displayStatus = sessionDisplayStatus({\n status,\n admissionBlock: session.admissionBlock,\n });\n const startup = useSessionStartup({ ...session, status });\n const startupLabel =\n startup === \"starting\"\n ? \"Starting\"\n : startup === \"delayed\" || startup === \"retrying\"\n ? \"Waiting to start\"\n : undefined;\n const modelId = lastStartedModel?.trim() || session.model;\n const resolvedBilling: BillingClass =\n billingClass ?? (isCodexProductModel(modelId) ? \"codex_subscription\" : \"opengeni_credits\");\n const resolvedModel = modelLabel?.trim() || modelDisplayName(modelId);\n const displayEffort: IntelligenceEffort = lastStartedReasoningEffort ?? session.reasoningEffort;\n const displayLatency: LatencyMode = lastStartedLatencyMode ?? session.latencyMode;\n // Subscription rails → clickable account chip, the same for every provider.\n // Other rails → static provider icon only (never invent a text\n // \"Opengeni\"/\"BYOK\" word). Don't key off `accountSlot != null`.\n const isSubscriptionRail = SUBSCRIPTION_RAILS.has(resolvedBilling);\n const policyBits = [\n resolvedModel,\n labelEffort(displayEffort),\n displayLatency === \"fast\"\n ? \"Fast\"\n : displayLatency === \"ultrafast\"\n ? \"Ultrafast\"\n : displayLatency === \"priority\"\n ? \"Priority\"\n : null,\n ].filter((bit): bit is string => Boolean(bit));\n const rename = useInlineRename(session, onRename);\n const pin = useSessionPinToggle(session, onPin);\n const canArchive = Boolean(onArchive) && session.parentSessionId === null;\n const [grantAdminOpen, setGrantAdminOpen] = useState(false);\n // Menu actions that move focus (rename input, find field) run after the menu\n // has closed, so its focus restoration cannot steal focus back to the trigger.\n const afterMenuClose = useRef<(() => void) | null>(null);\n const chatOps = useChatOperations();\n const findKeys = useActionShortcut(\"chat.find\");\n const copyLinkKeys = useActionShortcut(\"chat.copyLink\");\n const pinKeys = useActionShortcut(\"chat.pin\");\n const archiveKeys = useActionShortcut(\"chat.archive\");\n const panelKeys = useActionShortcut(\"view.workspacePanel\");\n // \"Rename\" from the ⌘K menu or the desktop menu bar edits this title.\n const startRenaming = rename.startEditing;\n useEffect(() => {\n const start = () => startRenaming();\n uiEvents.addEventListener(RENAME_CURRENT_CHAT_EVENT, start);\n return () => uiEvents.removeEventListener(RENAME_CURRENT_CHAT_EVENT, start);\n }, [uiEvents, startRenaming]);\n const providerControl = isSubscriptionRail ? (\n (accountSlot ?? (\n <BillingClassMark\n billingClass={resolvedBilling}\n className=\"size-3.5 shrink-0 text-fg-muted\"\n aria-label=\"\"\n />\n ))\n ) : (\n // The model maker's logo; the payment rail only when the maker has none.\n <ModelMark\n model={{ id: modelId, logoUrl: modelLogoUrl }}\n className=\"size-3.5 text-fg-muted\"\n fallback={<BillingClassMark billingClass={resolvedBilling} className=\"size-3.5 shrink-0\" />}\n />\n );\n return (\n // An elevated band, not just canvas-with-a-hairline: reading as a real top\n // bar was the light-theme fix — a near-white header on a near-white canvas\n // needs its own surface + a crisp divider to look intentional (and it lifts\n // the dark bar a touch above the canvas too).\n <header\n data-window-drag\n data-titlebar\n className=\"@container/titlebar flex min-h-14 min-w-0 shrink-0 items-center gap-1 border-b border-border bg-canvas/80 pb-1 pl-[max(clamp(0.5rem,2.5vw,1.25rem),env(safe-area-inset-left))] pr-[max(clamp(0.5rem,2.5vw,1.25rem),env(safe-area-inset-right))] pt-[max(0.375rem,env(safe-area-inset-top))] backdrop-blur supports-[backdrop-filter]:bg-canvas/65 flex-wrap\"\n >\n {leading}\n {/* The title takes every pixel the actions leave; it truncates last. */}\n <div className=\"flex min-w-20 flex-[1_1_5rem] flex-col justify-center gap-0.5\">\n {/* Child sessions link back to the manager that spawned them, and a\n session links to its current schedules. */}\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <SessionAncestryBreadcrumb\n workspaceId={session.workspaceId}\n parentSessionId={session.parentSessionId}\n ancestors={ancestors}\n loading={lineageLoading}\n error={lineageError}\n />\n <SiteOriginLink session={session} />\n {onOpenSchedule ? (\n <button\n type=\"button\"\n onClick={onOpenSchedule}\n className=\"inline-flex shrink-0 items-center gap-1 rounded border border-border px-1.5 py-0.5 text-2xs text-fg-muted transition-colors hover:border-border-strong hover:text-fg\"\n title={\n upcomingSchedule\n ? \"Open schedules for this session\"\n : \"No upcoming runs. Open schedules for this session\"\n }\n >\n {upcomingSchedule ? (\n <CalendarClockIcon aria-hidden className=\"size-3\" />\n ) : (\n <CalendarOffIcon aria-hidden className=\"size-3\" />\n )}\n Schedule\n </button>\n ) : null}\n </div>\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <SessionTitleEditor session={session} rename={rename} />\n {/* Below lg the lifecycle is a dot beside the title; the full badge\n and connection pill take over from lg. */}\n <CompactSessionStatus\n paused={sessionControlPaused(session)}\n waiting={Boolean(waiting)}\n status={displayStatus}\n label={startupLabel}\n />\n {accessSlot}\n {adminAccess ? (\n <SessionAdminAccessIndicator\n control={adminAccess}\n onChangeTimeLimit={() => setGrantAdminOpen(true)}\n />\n ) : null}\n </div>\n </div>\n <div className=\"ml-auto flex shrink-0 items-center justify-end gap-0.5 lg:min-w-0 lg:max-w-full lg:shrink lg:flex-wrap lg:gap-2\">\n {/* Provider + model · effort · speed stay one cluster on the action side. */}\n <div className=\"hidden min-w-0 max-w-[min(100%,18rem)] items-center gap-1.5 overflow-hidden text-2xs leading-4 text-fg-muted lg:flex xl:max-w-[22rem]\">\n {policyLoading ? (\n <span\n className=\"inline-flex items-center gap-1.5\"\n aria-busy=\"true\"\n aria-label=\"Loading model\"\n >\n <Skeleton className=\"h-6 w-11 shrink-0 rounded-full\" />\n <Skeleton className=\"h-3 w-36\" />\n </span>\n ) : (\n <span className=\"inline-flex min-w-0 items-center gap-1.5 truncate font-medium text-fg-muted\">\n {providerControl}\n <span className=\"min-w-0 truncate font-normal\">\n {policyBits.map((bit, index) => (\n <span key={bit}>\n {index > 0 ? \" · \" : null}\n {bit}\n </span>\n ))}\n </span>\n </span>\n )}\n </div>\n {/* Below lg, machine, find and pin live in the \"…\" menu. */}\n <span className=\"hidden min-w-0 lg:contents\">{sandboxSlot}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => requestConversationFind(uiEvents)}\n aria-label=\"Find in conversation\"\n data-conversation-find-trigger=\"\"\n title=\"Find in conversation (Ctrl/Cmd+F)\"\n className=\"hidden pointer-coarse:size-11 lg:inline-flex\"\n >\n <SearchIcon className=\"size-4\" />\n </Button>\n <Button\n type=\"button\"\n variant={session.pinned ? \"secondary\" : \"ghost\"}\n size=\"icon-sm\"\n aria-label={session.pinned ? \"Unpin session\" : \"Pin session\"}\n aria-pressed={Boolean(session.pinned)}\n aria-busy={pin.busy}\n disabled={pin.busy}\n className=\"hidden pointer-coarse:size-11 lg:inline-flex\"\n onClick={pin.toggle}\n >\n <PinIcon className={session.pinned ? \"size-4 fill-current\" : \"size-4\"} />\n </Button>\n <span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {pin.announcement}\n </span>\n <div className=\"hidden items-center gap-2 lg:flex\">\n <ConnectionPill state={connectionState} />\n {/* Admission vs lifecycle are different axes, but showing both when\n control is Active (Running + Active) is redundant noise. When\n paused, admission is the headline — hide lifecycle so we don't\n imply the session is still \"Running\"/\"Idle\" under a pause gate. */}\n {!sessionControlPaused(session) ? (\n waiting ? (\n <span\n className=\"inline-flex shrink-0 items-center gap-1.5 rounded-full border border-border bg-surface px-2 py-0.5 text-control font-medium text-fg-muted\"\n data-session-wait-badge=\"\"\n >\n <span aria-hidden className=\"size-1.5 rounded-full bg-current\" />\n Waiting\n </span>\n ) : (\n <SessionStatusBadge status={displayStatus} label={startupLabel} />\n )\n ) : (\n <WorkstreamControlIndicator session={session} />\n )}\n </div>\n <span className=\"sr-only lg:hidden\">Connection {connectionState}.</span>\n {keyAuthRequired ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={onForgetAccessKey}\n aria-label=\"Clear access key\"\n className=\"pointer-coarse:size-11\"\n >\n <LockIcon className=\"size-4\" />\n </Button>\n ) : null}\n {onToggleInspector ? (\n <Button\n type=\"button\"\n variant={inspectorOpen ? \"secondary\" : \"ghost\"}\n size=\"icon-sm\"\n onClick={onToggleInspector}\n aria-label={inspectorOpen ? \"Hide workspace\" : \"Open workspace\"}\n aria-keyshortcuts={panelKeys?.ariaKeys}\n title={\n (inspectorOpen ? \"Hide workspace\" : \"Open workspace\") +\n (panelKeys ? ` (${panelKeys.label})` : \"\")\n }\n className=\"pointer-coarse:size-11\"\n >\n {inspectorOpen ? (\n <PanelRightCloseIcon className=\"size-4\" />\n ) : (\n <PanelRightOpenIcon className=\"size-4\" />\n )}\n </Button>\n ) : null}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"More session actions\"\n title=\"More\"\n className=\"pointer-coarse:size-11\"\n >\n <MoreHorizontalIcon className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"w-56\"\n onCloseAutoFocus={(event) => {\n const action = afterMenuClose.current;\n if (!action) return;\n afterMenuClose.current = null;\n event.preventDefault();\n action();\n }}\n >\n <DropdownMenuItem\n className=\"lg:hidden\"\n aria-keyshortcuts={findKeys?.ariaKeys}\n onSelect={() => {\n afterMenuClose.current = () => requestConversationFind(uiEvents);\n }}\n >\n <SearchIcon />\n Find\n {findKeys ? <DropdownMenuShortcut>{findKeys.label}</DropdownMenuShortcut> : null}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => {\n afterMenuClose.current = rename.startEditing;\n }}\n >\n <PencilIcon />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n aria-keyshortcuts={copyLinkKeys?.ariaKeys}\n onSelect={() => void chatOps.copyLink(session)}\n >\n <LinkIcon />\n Copy link\n {copyLinkKeys ? (\n <DropdownMenuShortcut>{copyLinkKeys.label}</DropdownMenuShortcut>\n ) : null}\n </DropdownMenuItem>\n <DropdownMenuItem\n className=\"lg:hidden\"\n aria-keyshortcuts={pinKeys?.ariaKeys}\n disabled={pin.busy}\n onSelect={() => pin.toggle()}\n >\n <PinIcon className={session.pinned ? \"fill-current\" : undefined} />\n {session.pinned ? \"Unpin\" : \"Pin\"}\n {pinKeys ? <DropdownMenuShortcut>{pinKeys.label}</DropdownMenuShortcut> : null}\n </DropdownMenuItem>\n {currentPhoneAppPlatform() ? (\n <DropdownMenuItem\n onSelect={() => {\n page.assign(openInAppUrl(page.href()));\n }}\n >\n <SmartphoneIcon />\n Open in app\n </DropdownMenuItem>\n ) : null}\n {sandboxSlot ? (\n <div className=\"flex min-h-9 items-center px-2 empty:hidden lg:hidden\">\n {sandboxSlot}\n </div>\n ) : null}\n {repliesMute ? (\n <DropdownMenuItem disabled={repliesMute.busy} onSelect={() => repliesMute.toggle()}>\n {repliesMute.muted ? <BellIcon /> : <BellOffIcon />}\n {repliesMute.muted ? \"Unmute replies\" : \"Mute replies\"}\n </DropdownMenuItem>\n ) : null}\n {onOpenUsageLimit ? (\n <DropdownMenuItem\n onSelect={() => {\n afterMenuClose.current = onOpenUsageLimit;\n }}\n >\n <GaugeIcon />\n Usage limit\n </DropdownMenuItem>\n ) : null}\n {adminAccess?.state.active && adminAccess.state.canRevoke ? (\n <DropdownMenuItem disabled={adminAccess.busy} onSelect={() => adminAccess.revoke()}>\n <ShieldOffIcon />\n Turn off admin access\n </DropdownMenuItem>\n ) : adminAccess && !adminAccess.state.active && adminAccess.state.canGrant ? (\n <DropdownMenuItem\n disabled={adminAccess.busy}\n onSelect={() => {\n afterMenuClose.current = () => setGrantAdminOpen(true);\n }}\n >\n <ShieldCheckIcon />\n Give admin access…\n </DropdownMenuItem>\n ) : null}\n {canArchive ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n aria-keyshortcuts={archiveKeys?.ariaKeys}\n onSelect={() => void onArchive?.(session, !session.archived)}\n >\n {session.archived ? <ArchiveRestoreIcon /> : <ArchiveIcon />}\n {session.archived ? \"Restore\" : \"Archive\"}\n {session.archived ? (\n <DropdownMenuMeta>Archived</DropdownMenuMeta>\n ) : archiveKeys ? (\n <DropdownMenuShortcut>{archiveKeys.label}</DropdownMenuShortcut>\n ) : null}\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n {adminAccess ? (\n <GrantSessionAdminAccessDialog\n control={adminAccess}\n open={grantAdminOpen}\n onOpenChange={setGrantAdminOpen}\n />\n ) : null}\n </div>\n </header>\n );\n}\n\n/** Small-screen status: a dot beside the title, named for assistive tech. */\nfunction CompactSessionStatus({\n paused,\n waiting,\n status,\n label,\n}: {\n paused: boolean;\n waiting: boolean;\n status: SessionDisplayStatus;\n label?: string | undefined;\n}) {\n if (paused) {\n return (\n <span\n data-compact-session-status=\"paused\"\n title=\"Paused\"\n className=\"inline-flex shrink-0 items-center lg:hidden\"\n >\n <PauseIcon aria-hidden className=\"size-2.5 shrink-0 fill-current text-status-waiting\" />\n <span className=\"sr-only\">Paused</span>\n </span>\n );\n }\n if (waiting) {\n return (\n <span\n data-compact-session-status=\"waiting\"\n title=\"Waiting\"\n className=\"inline-flex shrink-0 items-center lg:hidden\"\n >\n <span aria-hidden className=\"size-2 rounded-full bg-status-waiting\" />\n <span className=\"sr-only\">Waiting</span>\n </span>\n );\n }\n const name = label ?? SESSION_STATUS_META(t)[status].label;\n return (\n <span\n data-compact-session-status={status}\n data-status={status}\n title={name}\n className=\"inline-flex shrink-0 items-center lg:hidden\"\n >\n <StatusDot status={status} className=\"size-2\" />\n <span className=\"sr-only\">{name}</span>\n </span>\n );\n}\n\n/** Pause-only header chip (Active is not shown — lifecycle status covers “go”). */\nfunction WorkstreamControlIndicator({ session }: { session: Session }) {\n const control = session.effectiveControl;\n if (control.state !== \"paused\" || session.status === \"cancelled\") {\n return null;\n }\n const blocker = control.primaryBlocker;\n const label =\n blocker?.kind === \"workspace\"\n ? \"Workspace paused\"\n : control.directState === \"paused\" || blocker?.sessionId === session.id\n ? \"Paused here\"\n : `Paused by ${blocker?.displayName ?? \"parent\"}`;\n return (\n <button\n type=\"button\"\n aria-label={`${label}. Open workstream controls`}\n title={`${label} · open workstream controls`}\n onClick={() => {\n document.dispatchEvent(new Event(OPEN_WORKSTREAM_CONTROL_EVENT));\n }}\n className=\"inline-flex min-w-0 max-w-48 items-center gap-1.5 rounded-full border border-status-waiting/35 bg-status-waiting/10 px-2 py-0.5 text-xs font-medium text-fg hover:bg-status-waiting/15\"\n >\n <PauseIcon className=\"size-3 shrink-0 fill-current text-status-waiting\" />\n <span className=\"hidden truncate sm:inline\">{label}</span>\n {control.additionalBlockerCount > 0 ? (\n <span className=\"hidden shrink-0 sm:inline\">+{control.additionalBlockerCount}</span>\n ) : null}\n </button>\n );\n}\n\n/** Pin toggle shared by the desktop pin button and the phone \"…\" menu item. */\nfunction useSessionPinToggle(\n session: Session,\n onPin: (session: Session, pinned: boolean) => Promise<Session | null>,\n) {\n const [busy, setBusy] = useState(false);\n const [announcement, setAnnouncement] = useState(\"\");\n const announcementSequence = useRef(0);\n const announce = useCallback((message: string) => {\n announcementSequence.current += 1;\n setAnnouncement(pinLiveAnnouncement(message, announcementSequence.current));\n }, []);\n const toggle = useCallback(() => {\n if (busy) return;\n const nextPinned = !session.pinned;\n setBusy(true);\n void onPin(session, nextPinned)\n .then((updated) => {\n announce(\n updated\n ? `Session ${nextPinned ? \"pinned\" : \"unpinned\"}.`\n : `Session was not ${nextPinned ? \"pinned\" : \"unpinned\"}.`,\n );\n })\n .catch(() => {\n announce(`Session was not ${nextPinned ? \"pinned\" : \"unpinned\"}.`);\n })\n .finally(() => setBusy(false));\n }, [announce, busy, onPin, session]);\n return { busy, toggle, announcement };\n}\n\n/**\n * The session header title — display by default, click the title (or the\n * hover pencil / \"…\" > Rename) to rename inline. Prefers the durable session.title\n * (agent- or user-set), falling back to the initial message / \"Untitled\n * session\" exactly like the rail list. Enter saves, Esc cancels, blur saves; an\n * empty/unchanged value is a no-op cancel. The live title (context.session)\n * flows in through the session.title_set SSE event the react useSession hook\n * applies, so cross-client renames and agent titling reflect here without a\n * reload. The shared `useInlineRename` hook keeps this behaviour identical to\n * the rail row's rename.\n */\nfunction SessionTitleEditor(props: { session: Session; rename: InlineRename }) {\n const display = sessionDisplayTitle(props.session);\n const rename = props.rename;\n\n if (rename.editing) {\n return (\n // A calm in-place edit: same size and position as the display title, a\n // soft surface tint + hairline instead of a loud focus ring. The global\n // focus-ring rule is what painted the old blue box; opting out here keeps\n // the rename feeling like editing the text, not filling in a form field.\n <input\n ref={rename.inputRef}\n data-session-title-current={display}\n value={rename.draft}\n onChange={(event) => rename.setDraft(event.target.value)}\n onBlur={() => void rename.commit()}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n void rename.commit();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n rename.cancel();\n }\n }}\n maxLength={SESSION_TITLE_MAX_LENGTH}\n aria-label=\"Session title\"\n dir=\"auto\"\n className=\"-mx-1.5 w-full truncate rounded-md bg-surface-2/70 px-1.5 text-[15px] font-semibold leading-6 tracking-[-0.01em] outline-hidden ring-1 ring-border-strong focus:outline-hidden focus-visible:outline-hidden\"\n style={{ outline: \"none\" }}\n />\n );\n }\n\n return (\n <div className=\"group/title flex min-w-0 items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={rename.startEditing}\n title={`${display} · click to rename`}\n dir=\"auto\"\n className=\"min-w-0 shrink truncate rounded-sm text-left text-[15px] font-semibold leading-6 tracking-[-0.01em] text-fg hover:text-fg focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring/40 pointer-coarse:min-h-11 pointer-coarse:px-2\"\n >\n {display}\n </button>\n {/* The pencil earns its pixels only when relevant: hidden at rest and\n revealed on hover/focus. Touch screens rename by tapping the title\n (or \"…\" > Rename), so the title keeps the row's width. */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n onClick={rename.startEditing}\n aria-label=\"Rename session\"\n className=\"shrink-0 text-fg-subtle opacity-0 transition-opacity hover:text-fg focus-visible:opacity-100 group-hover/title:opacity-100 pointer-coarse:hidden\"\n >\n <PencilIcon className=\"size-3\" />\n </Button>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -31,4 +31,4 @@ function CreditRequiredGate(props) {
31
31
  export {
32
32
  CreditRequiredGate
33
33
  };
34
- //# sourceMappingURL=chunk-XDCZBOEY.js.map
34
+ //# sourceMappingURL=chunk-6LGBGPBU.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  SitePublishPage,
4
4
  useSitePublication
5
- } from "./chunk-MY6VZVCP.js";
5
+ } from "./chunk-OAJX5CEL.js";
6
6
  import {
7
7
  sitesClientConfig
8
8
  } from "./chunk-MXIHJ4UI.js";
@@ -271,4 +271,4 @@ export {
271
271
  hasSiteSettings,
272
272
  SiteSettings
273
273
  };
274
- //# sourceMappingURL=chunk-D4QOZXPM.js.map
274
+ //# sourceMappingURL=chunk-7ITDATTP.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  authorizedWorkspaceFromList
4
- } from "./chunk-4RY64KQY.js";
4
+ } from "./chunk-YJUKLLNP.js";
5
5
 
6
6
  // src/app/lib/workspace-navigation-preference.tsx
7
7
  var WORKSPACE_NAVIGATION_PREFERENCE_VERSION = 1;
@@ -118,4 +118,4 @@ export {
118
118
  isAuthorizedWorkspaceId,
119
119
  resolveLandingWorkspaceId
120
120
  };
121
- //# sourceMappingURL=chunk-M5E3CKSE.js.map
121
+ //# sourceMappingURL=chunk-7QWWE5XL.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  nodeIsActive
4
- } from "./chunk-CPKD2YGK.js";
4
+ } from "./chunk-RNU5CUPI.js";
5
5
  import {
6
6
  recencyGroupFor,
7
7
  sessionActivityTime
@@ -132,4 +132,4 @@ export {
132
132
  sessionMatchesPaginationGroup,
133
133
  sessionPaginationLocalDateKey
134
134
  };
135
- //# sourceMappingURL=chunk-RABKQFTA.js.map
135
+ //# sourceMappingURL=chunk-A2HCAMRH.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-PEHTX3V7.js";
5
5
  import {
6
6
  useOpenGeniText
7
- } from "./chunk-S6WJ6TUT.js";
7
+ } from "./chunk-ZEVJGMNB.js";
8
8
 
9
9
  // src/timeline/retained-image.ts
10
10
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -169,4 +169,4 @@ export {
169
169
  useRetainedImageObjectUrl,
170
170
  PatchApplyCommand
171
171
  };
172
- //# sourceMappingURL=chunk-6K3WNTRI.js.map
172
+ //# sourceMappingURL=chunk-AODISQO6.js.map
@@ -8,13 +8,13 @@ import {
8
8
  } from "./chunk-CPLCSM6K.js";
9
9
  import {
10
10
  useMachines
11
- } from "./chunk-WWM7WVD2.js";
11
+ } from "./chunk-GABFKHQE.js";
12
12
  import {
13
13
  useEmbeddedSession
14
14
  } from "./chunk-TVQCDDSZ.js";
15
15
  import {
16
16
  useOpenGeniText
17
- } from "./chunk-S6WJ6TUT.js";
17
+ } from "./chunk-ZEVJGMNB.js";
18
18
 
19
19
  // src/hooks/use-session-start.ts
20
20
  import { useCallback, useMemo } from "react";
@@ -85,4 +85,4 @@ function useSessionStart({
85
85
  export {
86
86
  useSessionStart
87
87
  };
88
- //# sourceMappingURL=chunk-C6JL6PBL.js.map
88
+ //# sourceMappingURL=chunk-AQDRH6VF.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  mergeSessionForRail
4
- } from "./chunk-CPKD2YGK.js";
4
+ } from "./chunk-RNU5CUPI.js";
5
5
 
6
6
  // src/app/lib/session-branch-cache.tsx
7
7
  function sessionBranchSummaryKey(session, readRevision = 0) {
@@ -183,4 +183,4 @@ export {
183
183
  sessionBranchNeedsHydration,
184
184
  sessionBranchSummaryDecision
185
185
  };
186
- //# sourceMappingURL=chunk-72XEFLMD.js.map
186
+ //# sourceMappingURL=chunk-ASWINLSW.js.map
@@ -1,28 +1,26 @@
1
1
  "use client";
2
+ import {
3
+ SubscriptionAccountIndicator,
4
+ subscriptionAccountProvider
5
+ } from "./chunk-R4U4EWZG.js";
6
+ import {
7
+ PrivateSessionIndicator
8
+ } from "./chunk-PLIOAQT4.js";
2
9
  import {
3
10
  SessionHeader
4
- } from "./chunk-PQCFW2KT.js";
11
+ } from "./chunk-6IRDW7K3.js";
12
+ import {
13
+ useSessionAdminAccess
14
+ } from "./chunk-O4DYOSOL.js";
5
15
  import {
6
16
  PrimaryNav,
7
17
  RailHeader,
8
18
  SessionShellSlotsContext
9
- } from "./chunk-CA64OZLZ.js";
19
+ } from "./chunk-FAPYRTG6.js";
10
20
  import {
11
21
  CollapsedSessionsButton,
12
22
  SessionList
13
- } from "./chunk-JJ7VMIEQ.js";
14
- import {
15
- CodexAccountIndicator
16
- } from "./chunk-7H2D4VNU.js";
17
- import {
18
- ModelAccountIndicator
19
- } from "./chunk-HCCSAECI.js";
20
- import {
21
- useSessionAdminAccess
22
- } from "./chunk-O4DYOSOL.js";
23
- import {
24
- PrivateSessionIndicator
25
- } from "./chunk-PLIOAQT4.js";
23
+ } from "./chunk-H2GTWX4D.js";
26
24
  import {
27
25
  notifySessionListChanged
28
26
  } from "./chunk-O5S57N6H.js";
@@ -32,13 +30,13 @@ import {
32
30
  import {
33
31
  SessionComputeIndicator,
34
32
  sessionSupportsFleetSwitching
35
- } from "./chunk-4XKT4ENZ.js";
33
+ } from "./chunk-2Y3QL3DA.js";
36
34
  import {
37
35
  RAIL_DEFAULT_WIDTH,
38
36
  RAIL_MAX_WIDTH,
39
37
  RAIL_MIN_WIDTH,
40
38
  useRail
41
- } from "./chunk-6VITVQ23.js";
39
+ } from "./chunk-MTYE2PPR.js";
42
40
  import {
43
41
  useSessionRepliesMute
44
42
  } from "./chunk-TSQCKC34.js";
@@ -54,7 +52,7 @@ import {
54
52
  } from "./chunk-H5M33DAL.js";
55
53
  import {
56
54
  useWorkspaceModelCatalog
57
- } from "./chunk-KW53DBY7.js";
55
+ } from "./chunk-EBW2E32G.js";
58
56
  import {
59
57
  BrandMark,
60
58
  Wordmark
@@ -103,9 +101,6 @@ import {
103
101
  import {
104
102
  SessionStartupProvider
105
103
  } from "./chunk-EMIVOS73.js";
106
- import {
107
- isCodexProductModel
108
- } from "./chunk-F2RMKGDQ.js";
109
104
  import {
110
105
  findPickerRow
111
106
  } from "./chunk-CFEFYPNR.js";
@@ -492,8 +487,10 @@ function SessionRouteHeader({
492
487
  const catalog = useWorkspaceModelCatalog(session.workspaceId);
493
488
  const selectedRow = findPickerRow(catalog.rows, displayModelId);
494
489
  const policyLoading = lastStarted.loading || catalog.loading;
495
- const credentialSource = selectedRow?.catalog.credentialSource;
496
- const subscriptionProvider = credentialSource?.kind === "connected_subscription" ? credentialSource.provider : null;
490
+ const accountProvider = subscriptionAccountProvider(
491
+ displayModelId,
492
+ selectedRow?.catalog.credentialSource
493
+ );
497
494
  const repliesMute = useSessionRepliesMute(session);
498
495
  const sessionAdminAccess = useSessionAdminAccess(session);
499
496
  const adminAccess = useSessionUiFeature("adminAccess") ? sessionAdminAccess : null;
@@ -578,22 +575,13 @@ function SessionRouteHeader({
578
575
  /* @__PURE__ */ jsx(PrivateSessionIndicator, {})
579
576
  ) : null,
580
577
  sandboxSlot: sessionSupportsFleetSwitching(session.sandboxBackend) ? /* @__PURE__ */ jsx(SessionComputeIndicator, { sessionId: session.id, sandboxBackend: session.sandboxBackend }) : null,
581
- codexSlot: policyReady && isCodexProductModel(displayModelId) ? /* @__PURE__ */ jsx(
582
- CodexAccountIndicator,
583
- {
584
- workspaceId: session.workspaceId,
585
- sessionId: session.id,
586
- model: displayModelId,
587
- modelReady: policyReady,
588
- events
589
- }
590
- ) : policyReady && subscriptionProvider ? /* @__PURE__ */ jsx(
591
- ModelAccountIndicator,
578
+ accountSlot: policyReady && accountProvider ? /* @__PURE__ */ jsx(
579
+ SubscriptionAccountIndicator,
592
580
  {
593
581
  workspaceId: session.workspaceId,
594
582
  sessionId: session.id,
595
583
  organizationId: context.workspaces.find((candidate) => candidate.id === session.workspaceId)?.accountId ?? null,
596
- provider: subscriptionProvider,
584
+ provider: accountProvider,
597
585
  servingTurnId: lastStarted.policy?.turnId,
598
586
  events
599
587
  }
@@ -606,4 +594,4 @@ export {
606
594
  RailBody,
607
595
  SessionShell
608
596
  };
609
- //# sourceMappingURL=chunk-DNLXQUBX.js.map
597
+ //# sourceMappingURL=chunk-B746OUJC.js.map