@opengeni/react 4.6.1 → 4.6.2-canary.39853438886001

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 (467) hide show
  1. package/dist/app/app-state.js +13 -13
  2. package/dist/app/components/Composer.js +14 -14
  3. package/dist/app/components/artifacts/artifact-library.js +5 -5
  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 +16 -16
  7. package/dist/app/components/artifacts/retained-text-preview.js +2 -2
  8. package/dist/app/components/artifacts/site-conversations.js +5 -4
  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 +15 -15
  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 +32 -31
  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 +14 -14
  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 +16 -15
  31. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  32. package/dist/app/components/command-menu/shortcut-sheet.js +8 -8
  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 +4 -4
  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 +3 -3
  46. package/dist/app/components/rail/rail-sections.js +28 -27
  47. package/dist/app/components/rail/session-header.d.ts +6 -5
  48. package/dist/app/components/rail/session-header.js +20 -19
  49. package/dist/app/components/rail/session-list.js +27 -26
  50. package/dist/app/components/rail/session-row-hover-details.js +7 -6
  51. package/dist/app/components/rail/session-shell.js +51 -53
  52. package/dist/app/components/rail/site-session-group-heading.js +2 -1
  53. package/dist/app/components/session/agent-configuration-panel.js +6 -6
  54. package/dist/app/components/session/banners.js +6 -6
  55. package/dist/app/components/session/conversation-find.js +3 -3
  56. package/dist/app/components/session/editable-artifacts-workspace.js +17 -17
  57. package/dist/app/components/session/failed-session-banner.js +5 -5
  58. package/dist/app/components/session/human-input.js +26 -26
  59. package/dist/app/components/session/inspector.js +37 -37
  60. package/dist/app/components/session/message-actions.js +3 -3
  61. package/dist/app/components/session/message-resource-attachments.js +5 -5
  62. package/dist/app/components/session/model-recovery-notice.js +3 -3
  63. package/dist/app/components/session/new-session-settings-menu.js +4 -4
  64. package/dist/app/components/session/sandbox-switcher.js +8 -8
  65. package/dist/app/components/session/sandbox-workspace.js +36 -36
  66. package/dist/app/components/session/search-markdown-highlight.js +5 -5
  67. package/dist/app/components/session/search-results-view.js +6 -6
  68. package/dist/app/components/session/session-admission-notice.js +4 -4
  69. package/dist/app/components/session/session-machine-access-notice.js +4 -4
  70. package/dist/app/components/session/session-search-dialog.js +6 -6
  71. package/dist/app/components/session/session-tenancy-control.js +4 -4
  72. package/dist/app/components/session/session-usage-limit-section.js +3 -3
  73. package/dist/app/components/session/session-wait-status.js +2 -1
  74. package/dist/app/components/session/session-wait-status.js.map +1 -1
  75. package/dist/app/components/session/subagents.js +6 -5
  76. package/dist/app/components/session/subscription-account-indicator.d.ts +35 -0
  77. package/dist/app/components/session/{codex-account-indicator.js → subscription-account-indicator.js} +23 -10
  78. package/dist/app/components/session/subscription-account-menu.d.ts +11 -12
  79. package/dist/app/components/session/subscription-account-menu.js +1 -1
  80. package/dist/app/components/session/subscription-account.d.ts +105 -0
  81. package/dist/app/components/usage/usage-entry.js +3 -3
  82. package/dist/app/components/workspace-composer-plus.js +10 -10
  83. package/dist/app/embed/session-app.js +154 -156
  84. package/dist/app/lib/actions/actions-provider.js +8 -8
  85. package/dist/app/lib/actions/chat-switcher.d.ts +19 -7
  86. package/dist/app/lib/codex-usage-query.js +2 -2
  87. package/dist/app/lib/composer-connectors.js +8 -8
  88. package/dist/app/lib/console-text.js +2 -2
  89. package/dist/app/lib/drive-connect-return.d.ts +26 -0
  90. package/dist/app/lib/drive-connect-return.js +16 -0
  91. package/dist/app/lib/events.js +7 -7
  92. package/dist/app/lib/failed-session-copy.js +3 -3
  93. package/dist/app/lib/model-access-onboarding.js +3 -3
  94. package/dist/app/lib/move-chat-to-machine.js +3 -3
  95. package/dist/app/lib/session-branch-cache.js +6 -5
  96. package/dist/app/lib/session-group-pagination.js +6 -5
  97. package/dist/app/lib/session-hover-facts.js +6 -5
  98. package/dist/app/lib/session-rail.js +2 -1
  99. package/dist/app/lib/sessions-group.js +5 -4
  100. package/dist/app/lib/turn-failure-analytics.js +5 -5
  101. package/dist/app/lib/use-workspace-machines.js +4 -4
  102. package/dist/app/lib/use-workspace-model-catalog.js +3 -3
  103. package/dist/app/lib/use-workspace-rigs.js +2 -2
  104. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  105. package/dist/app/lib/workspace-scope-context.js +3 -3
  106. package/dist/app/routes/artifacts.js +50 -49
  107. package/dist/app/routes/artifacts.js.map +1 -1
  108. package/dist/app/routes/retained-artifact.js +23 -23
  109. package/dist/app/routes/session.js +92 -91
  110. package/dist/app/routes/sessions-index.js +52 -52
  111. package/dist/app/routes/site-view.js +35 -34
  112. package/dist/app/routes/site-view.js.map +1 -1
  113. package/dist/artifacts-document.js +4 -4
  114. package/dist/artifacts-presentation.js +4 -4
  115. package/dist/artifacts-spreadsheet.js +4 -4
  116. package/dist/artifacts.js +10 -10
  117. package/dist/{browser-viewer-YQC6BFMS.js → browser-viewer-VKIAULG7.js} +4 -4
  118. package/dist/{chat-interactive-block-Z22YHDRU.js → chat-interactive-block-JGYSW4KB.js} +5 -5
  119. package/dist/{chunk-WN2MIB4Q.js → chunk-22V2QCEM.js} +2 -2
  120. package/dist/{chunk-SJPAKWWP.js → chunk-2BISI664.js} +2 -2
  121. package/dist/{chunk-O5UOCMH4.js → chunk-2LPJVEWY.js} +3 -3
  122. package/dist/{chunk-NPDL4W4Y.js → chunk-2MLJHNKJ.js} +108 -109
  123. package/dist/chunk-2MLJHNKJ.js.map +1 -0
  124. package/dist/{chunk-JI6WPLZB.js → chunk-2SBCOGQN.js} +4 -4
  125. package/dist/{chunk-6JF7C3U3.js → chunk-2WERWWSS.js} +2 -2
  126. package/dist/{chunk-4XKT4ENZ.js → chunk-2Y3QL3DA.js} +4 -4
  127. package/dist/{chunk-KVMFT6FN.js → chunk-3FL3F4WF.js} +2 -2
  128. package/dist/{chunk-4VJOZJDV.js → chunk-3JPQAIYJ.js} +2 -2
  129. package/dist/{chunk-27EORKJ4.js → chunk-3N4LNBJF.js} +2 -2
  130. package/dist/{chunk-7JZSFJHB.js → chunk-3OJU3RUR.js} +2 -2
  131. package/dist/{chunk-NV5OYV3G.js → chunk-3U6K36QA.js} +5 -5
  132. package/dist/{chunk-MDRLP5DO.js → chunk-3W7ROHN4.js} +3 -3
  133. package/dist/{chunk-3MQM4ZOC.js → chunk-3Y6ZR2VN.js} +3 -3
  134. package/dist/{chunk-HXZIX7MR.js → chunk-47AB65IO.js} +4 -4
  135. package/dist/{chunk-DNYD7AUG.js → chunk-4BOLIZ7Y.js} +3 -3
  136. package/dist/{chunk-4XO346BW.js → chunk-4FBJFQFU.js} +2 -2
  137. package/dist/{chunk-BWKZEW6K.js → chunk-4T3E56NT.js} +3 -3
  138. package/dist/{chunk-4PC7LIQK.js → chunk-4ZMUWRFF.js} +3 -3
  139. package/dist/{chunk-TM2ZLY3Q.js → chunk-5OLFYSVG.js} +13 -13
  140. package/dist/{chunk-D4QOZXPM.js → chunk-5WBRM7V4.js} +5 -5
  141. package/dist/{chunk-GXK4CUAB.js → chunk-5WQKTT5Z.js} +2 -2
  142. package/dist/{chunk-6N7W3TOV.js → chunk-63BPMTBM.js} +2 -2
  143. package/dist/{chunk-R5YZ3ROM.js → chunk-63PQKTTT.js} +2 -2
  144. package/dist/{chunk-WLZVXCPZ.js → chunk-6GO6WN22.js} +3 -3
  145. package/dist/{chunk-6PQBKMUL.js → chunk-6IIA63VD.js} +11 -7
  146. package/dist/chunk-6IIA63VD.js.map +1 -0
  147. package/dist/{chunk-XDCZBOEY.js → chunk-6LGBGPBU.js} +1 -1
  148. package/dist/{chunk-FMATVQFW.js → chunk-6XXMG5YP.js} +9 -9
  149. package/dist/{chunk-M5E3CKSE.js → chunk-7QWWE5XL.js} +2 -2
  150. package/dist/{chunk-RABKQFTA.js → chunk-A2HCAMRH.js} +2 -2
  151. package/dist/{chunk-6K3WNTRI.js → chunk-AODISQO6.js} +2 -2
  152. package/dist/{chunk-C6JL6PBL.js → chunk-AQDRH6VF.js} +3 -3
  153. package/dist/{chunk-72XEFLMD.js → chunk-ASWINLSW.js} +2 -2
  154. package/dist/{chunk-ZPZYYSHW.js → chunk-BVMDON5T.js} +8 -8
  155. package/dist/{chunk-EURDMOXZ.js → chunk-BYJZUCOQ.js} +2 -2
  156. package/dist/{chunk-BQWUXC55.js → chunk-CAVAVT5S.js} +9 -9
  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-65K5LV4L.js → chunk-CTCOVPZU.js} +51 -50
  162. package/dist/{chunk-65K5LV4L.js.map → chunk-CTCOVPZU.js.map} +1 -1
  163. package/dist/{chunk-HJTTDLF6.js → chunk-CY3NO4JN.js} +4 -4
  164. package/dist/{chunk-OLUG4IFF.js → chunk-D2RLPRSG.js} +2 -2
  165. package/dist/{chunk-74NIHMAT.js → chunk-D653JH6D.js} +3 -3
  166. package/dist/{chunk-2LUO22FR.js → chunk-DAI5CTQF.js} +4 -4
  167. package/dist/{chunk-HTKVYEVB.js → chunk-DBM4ZXDN.js} +2 -2
  168. package/dist/{chunk-MB2DTUEG.js → chunk-DNYKLU3K.js} +4 -4
  169. package/dist/{chunk-26P7B46A.js → chunk-DXYARXK3.js} +3 -3
  170. package/dist/{chunk-JQKURO3S.js → chunk-E4MQRQ6Z.js} +2 -2
  171. package/dist/{chunk-KW53DBY7.js → chunk-EBW2E32G.js} +2 -2
  172. package/dist/{chunk-O73DRA77.js → chunk-ENKBO7FC.js} +4 -4
  173. package/dist/{chunk-FVCLVASD.js → chunk-FI3KRVOF.js} +24 -24
  174. package/dist/{chunk-WWM7WVD2.js → chunk-GABFKHQE.js} +2 -2
  175. package/dist/chunk-GLCOKWLH.js +42 -0
  176. package/dist/chunk-GLCOKWLH.js.map +1 -0
  177. package/dist/{chunk-32HA7DXJ.js → chunk-GNBRB3DH.js} +25 -25
  178. package/dist/{chunk-CEQUNJJY.js → chunk-HPALK6LD.js} +2 -2
  179. package/dist/{chunk-LR7U3HCD.js → chunk-HPSATFLQ.js} +4 -4
  180. package/dist/{chunk-O4AWXTZQ.js → chunk-HUYLQW75.js} +6 -6
  181. package/dist/{chunk-PQCFW2KT.js → chunk-IDDHH5AQ.js} +29 -24
  182. package/dist/chunk-IDDHH5AQ.js.map +1 -0
  183. package/dist/{chunk-ZZUKJ5HQ.js → chunk-IG2ERMSB.js} +2 -2
  184. package/dist/{chunk-2SZ3KC5S.js → chunk-IMKIIS4Y.js} +2 -2
  185. package/dist/{chunk-CA64OZLZ.js → chunk-IRXPXDY5.js} +4 -4
  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-X7Z4B5GK.js → chunk-KPL7EXS6.js} +2 -2
  191. package/dist/{chunk-GTR2WUBA.js → chunk-KX6M5CJI.js} +1 -1
  192. package/dist/{chunk-CYO5HL4C.js → chunk-KYL2BPS2.js} +2 -2
  193. package/dist/{chunk-QLDMF7MH.js → chunk-LC5HE7PZ.js} +2 -2
  194. package/dist/{chunk-3SMJ2BIQ.js → chunk-LGD5RESZ.js} +7 -33
  195. package/dist/chunk-LGD5RESZ.js.map +1 -0
  196. package/dist/{chunk-4ICPJZAB.js → chunk-LMYSYG6U.js} +2 -2
  197. package/dist/{chunk-3ZZOE4SN.js → chunk-LOCDYMD6.js} +4 -4
  198. package/dist/{chunk-DNWBLT4U.js → chunk-MASBMJ2M.js} +2 -2
  199. package/dist/{chunk-NZMQDUOD.js → chunk-MU6HYDNF.js} +5 -5
  200. package/dist/{chunk-GMVKCEBG.js → chunk-MY6QEDZ2.js} +2 -2
  201. package/dist/{chunk-SK57RWSA.js → chunk-MZGKQ5WV.js} +2 -2
  202. package/dist/{chunk-HSQRYJ4P.js → chunk-N52SFH2K.js} +2 -2
  203. package/dist/{chunk-MY6VZVCP.js → chunk-OAJX5CEL.js} +4 -4
  204. package/dist/{chunk-IWIMIRV3.js → chunk-OSJTLQXA.js} +9 -4
  205. package/dist/chunk-OSJTLQXA.js.map +1 -0
  206. package/dist/{chunk-FH75NNLB.js → chunk-OZ5NAXCP.js} +2 -2
  207. package/dist/{chunk-PEGNFZ3F.js → chunk-P5S777YI.js} +2 -2
  208. package/dist/{chunk-LY6727IF.js → chunk-PPSVFNEA.js} +1 -1
  209. package/dist/{chunk-K4FDZVMQ.js → chunk-PR42VIVY.js} +2 -2
  210. package/dist/{chunk-I74J2UZ2.js → chunk-PWMZCW4H.js} +8 -8
  211. package/dist/{chunk-6YDXUE5H.js → chunk-PYA2O3WS.js} +2 -2
  212. package/dist/{chunk-GUIZDI5T.js → chunk-Q2PA4KZS.js} +2 -2
  213. package/dist/{chunk-JJ7VMIEQ.js → chunk-QCANSTLU.js} +64 -64
  214. package/dist/{chunk-DZH2HTTB.js → chunk-R27GW5WV.js} +1 -1
  215. package/dist/chunk-R4U4EWZG.js +414 -0
  216. package/dist/chunk-R4U4EWZG.js.map +1 -0
  217. package/dist/{chunk-DAQG3C4W.js → chunk-R6JY22SG.js} +29 -29
  218. package/dist/{chunk-7OIBLMDP.js → chunk-RAQISW42.js} +2 -2
  219. package/dist/{chunk-DNLXQUBX.js → chunk-RLS6PTL4.js} +32 -44
  220. package/dist/chunk-RLS6PTL4.js.map +1 -0
  221. package/dist/{chunk-CPKD2YGK.js → chunk-RNU5CUPI.js} +2 -2
  222. package/dist/{chunk-467VRP4E.js → chunk-RO5YZQHZ.js} +3 -3
  223. package/dist/{chunk-SSZROOOI.js → chunk-ROLXYGT5.js} +2 -2
  224. package/dist/{chunk-6VITVQ23.js → chunk-SHJ5SQOW.js} +7 -7
  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-GTR5NLVP.js → chunk-VCRQPLKS.js} +2 -2
  232. package/dist/{chunk-MHIYYHCL.js → chunk-VJU3ET7N.js} +12 -12
  233. package/dist/{chunk-RXMIXKB3.js → chunk-WGJUARF3.js} +13 -13
  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-OHG2UQ2O.js → chunk-YWP2H7SX.js} +60 -22
  249. package/dist/chunk-YWP2H7SX.js.map +1 -0
  250. package/dist/{chunk-24POWVUY.js → chunk-ZDJNRRVS.js} +4 -4
  251. package/dist/{chunk-S6WJ6TUT.js → chunk-ZEVJGMNB.js} +2 -2
  252. package/dist/chunk-ZEVJGMNB.js.map +1 -0
  253. package/dist/{chunk-M7YEZR6X.js → chunk-ZITMDA4C.js} +2 -2
  254. package/dist/components/model-policy-picker.d.ts +2 -0
  255. package/dist/composer.js +6 -6
  256. package/dist/{computer-viewer-BWVNDFTO.js → computer-viewer-6CRLWQHP.js} +5 -5
  257. package/dist/connect.js +6 -6
  258. package/dist/connection-service-presentation.d.ts +1 -4
  259. package/dist/desktop.js +2 -2
  260. package/dist/editor.js +2 -2
  261. package/dist/{embedded-new-voice-GBXSZ3TO.js → embedded-new-voice-KILV3RYM.js} +5 -5
  262. package/dist/{embedded-voice-MGI7EK7C.js → embedded-voice-GHDRLCFX.js} +5 -5
  263. package/dist/{fleet-decision-row-35S3GAUN.js → fleet-decision-row-DQXRRBT7.js} +2 -2
  264. package/dist/index.js +44 -44
  265. package/dist/interaction.js +5 -5
  266. package/dist/machines.js +3 -3
  267. package/dist/messages/en.d.ts +1 -1
  268. package/dist/messages.js +1 -1
  269. package/dist/{model-policy-picker-menu-KP53N6UJ.js → model-policy-picker-menu-5ALKUJMR.js} +4 -4
  270. package/dist/{platform-activity-row-ISMXR7NJ.js → platform-activity-row-227C764Z.js} +2 -2
  271. package/dist/{queue-surface-implementation-ULW7DDJA.js → queue-surface-implementation-H3NOBXU5.js} +5 -5
  272. package/dist/realtime.js +4 -4
  273. package/dist/{sandbox-files-QYSD4XCZ.js → sandbox-files-5FEOHUMD.js} +6 -6
  274. package/dist/session-app.js +155 -157
  275. package/dist/{session-realtime-JXRLPNUH.js → session-realtime-OHBMODNX.js} +3 -3
  276. package/dist/session-realtime.js +2 -2
  277. package/dist/session-ui.js +26 -26
  278. package/dist/session.js +6 -6
  279. package/dist/sites.js +2 -2
  280. package/dist/terminal.js +2 -2
  281. package/dist/this-computer.js +3 -3
  282. package/dist/timeline/connector-logo-index.d.ts +19 -0
  283. package/dist/{timeline-annotation-markers-OJYKHBEO.js → timeline-annotation-markers-NDHS7MCK.js} +2 -2
  284. package/dist/{timeline-annotation-selection-6OAZLXFU.js → timeline-annotation-selection-DRQSTJOV.js} +2 -2
  285. package/dist/{timeline-annotations-dialog-5M6DP5FX.js → timeline-annotations-dialog-G6J5ZJKN.js} +3 -3
  286. package/dist/timeline-model.d.ts +2 -0
  287. package/dist/timeline-model.js +9 -1
  288. package/dist/ui/list-row.js +1 -1
  289. package/dist/usage.js +2 -2
  290. package/dist/workbench.js +4 -4
  291. package/package.json +4 -4
  292. package/src/app/components/capabilities/native-connect-readiness.tsx +1 -0
  293. package/src/app/components/capabilities/perform-capability-action.test.ts +67 -0
  294. package/src/app/components/capabilities/perform-capability-action.tsx +28 -0
  295. package/src/app/components/command-menu/chat-switcher.tsx +25 -4
  296. package/src/app/components/rail/session-header.test.tsx +73 -2
  297. package/src/app/components/rail/session-header.tsx +20 -12
  298. package/src/app/components/rail/session-shell.tsx +10 -18
  299. package/src/app/components/session/subscription-account-indicator.test.ts +239 -0
  300. package/src/app/components/session/subscription-account-indicator.tsx +361 -0
  301. package/src/app/components/session/subscription-account-menu.tsx +21 -43
  302. package/src/app/components/session/subscription-account.test.ts +314 -0
  303. package/src/app/components/session/subscription-account.ts +354 -0
  304. package/src/app/lib/actions/actions-provider.tsx +11 -0
  305. package/src/app/lib/actions/actions.test.ts +59 -4
  306. package/src/app/lib/actions/chat-switcher.ts +73 -20
  307. package/src/app/lib/drive-connect-return.test.ts +183 -0
  308. package/src/app/lib/drive-connect-return.tsx +116 -0
  309. package/src/app/routes/session.tsx +12 -14
  310. package/src/app/routes/sessions-index.tsx +1 -0
  311. package/src/components/model-policy-picker-menu.tsx +25 -4
  312. package/src/components/model-policy-picker.tsx +2 -0
  313. package/src/components/session-mcp-capability-card.tsx +13 -4
  314. package/src/connection-service-presentation.ts +6 -1
  315. package/src/messages/en.ts +1 -1
  316. package/src/timeline/connector-logo-index.test.ts +46 -0
  317. package/src/timeline/connector-logo-index.ts +68 -0
  318. package/src/timeline-model.ts +6 -0
  319. package/src/ui/list-row.tsx +38 -10
  320. package/styles/compiled.css +13 -0
  321. package/dist/app/components/session/codex-account-indicator.d.ts +0 -9
  322. package/dist/app/components/session/model-account-indicator.d.ts +0 -10
  323. package/dist/app/components/session/model-account-indicator.js +0 -34
  324. package/dist/app/components/session/model-account-usage.d.ts +0 -8
  325. package/dist/app/components/session/model-account-usage.js +0 -8
  326. package/dist/chunk-2K27S6LK.js.map +0 -1
  327. package/dist/chunk-3SMJ2BIQ.js.map +0 -1
  328. package/dist/chunk-6PQBKMUL.js.map +0 -1
  329. package/dist/chunk-7H2D4VNU.js +0 -150
  330. package/dist/chunk-7H2D4VNU.js.map +0 -1
  331. package/dist/chunk-DNLXQUBX.js.map +0 -1
  332. package/dist/chunk-HCCSAECI.js +0 -132
  333. package/dist/chunk-HCCSAECI.js.map +0 -1
  334. package/dist/chunk-IWIMIRV3.js.map +0 -1
  335. package/dist/chunk-M77ZQE5T.js +0 -58
  336. package/dist/chunk-M77ZQE5T.js.map +0 -1
  337. package/dist/chunk-MM7OKOTE.js.map +0 -1
  338. package/dist/chunk-NPDL4W4Y.js.map +0 -1
  339. package/dist/chunk-NWSAF6P5.js.map +0 -1
  340. package/dist/chunk-OHG2UQ2O.js.map +0 -1
  341. package/dist/chunk-PQCFW2KT.js.map +0 -1
  342. package/dist/chunk-S6WJ6TUT.js.map +0 -1
  343. package/dist/chunk-ZWACUOU5.js.map +0 -1
  344. package/dist/session-realtime-JXRLPNUH.js.map +0 -1
  345. package/src/app/components/session/codex-account-indicator.tsx +0 -207
  346. package/src/app/components/session/model-account-indicator.tsx +0 -189
  347. package/src/app/components/session/model-account-usage.test.ts +0 -59
  348. package/src/app/components/session/model-account-usage.tsx +0 -89
  349. /package/dist/app/components/session/{codex-account-indicator.js.map → subscription-account-indicator.js.map} +0 -0
  350. /package/dist/app/{components/session/model-account-indicator.js.map → lib/drive-connect-return.js.map} +0 -0
  351. /package/dist/{app/components/session/model-account-usage.js.map → browser-viewer-VKIAULG7.js.map} +0 -0
  352. /package/dist/{browser-viewer-YQC6BFMS.js.map → chat-interactive-block-JGYSW4KB.js.map} +0 -0
  353. /package/dist/{chunk-WN2MIB4Q.js.map → chunk-22V2QCEM.js.map} +0 -0
  354. /package/dist/{chunk-SJPAKWWP.js.map → chunk-2BISI664.js.map} +0 -0
  355. /package/dist/{chunk-O5UOCMH4.js.map → chunk-2LPJVEWY.js.map} +0 -0
  356. /package/dist/{chunk-JI6WPLZB.js.map → chunk-2SBCOGQN.js.map} +0 -0
  357. /package/dist/{chunk-6JF7C3U3.js.map → chunk-2WERWWSS.js.map} +0 -0
  358. /package/dist/{chunk-4XKT4ENZ.js.map → chunk-2Y3QL3DA.js.map} +0 -0
  359. /package/dist/{chunk-KVMFT6FN.js.map → chunk-3FL3F4WF.js.map} +0 -0
  360. /package/dist/{chunk-4VJOZJDV.js.map → chunk-3JPQAIYJ.js.map} +0 -0
  361. /package/dist/{chunk-27EORKJ4.js.map → chunk-3N4LNBJF.js.map} +0 -0
  362. /package/dist/{chunk-7JZSFJHB.js.map → chunk-3OJU3RUR.js.map} +0 -0
  363. /package/dist/{chunk-NV5OYV3G.js.map → chunk-3U6K36QA.js.map} +0 -0
  364. /package/dist/{chunk-MDRLP5DO.js.map → chunk-3W7ROHN4.js.map} +0 -0
  365. /package/dist/{chunk-3MQM4ZOC.js.map → chunk-3Y6ZR2VN.js.map} +0 -0
  366. /package/dist/{chunk-HXZIX7MR.js.map → chunk-47AB65IO.js.map} +0 -0
  367. /package/dist/{chunk-DNYD7AUG.js.map → chunk-4BOLIZ7Y.js.map} +0 -0
  368. /package/dist/{chunk-4XO346BW.js.map → chunk-4FBJFQFU.js.map} +0 -0
  369. /package/dist/{chunk-BWKZEW6K.js.map → chunk-4T3E56NT.js.map} +0 -0
  370. /package/dist/{chunk-4PC7LIQK.js.map → chunk-4ZMUWRFF.js.map} +0 -0
  371. /package/dist/{chunk-TM2ZLY3Q.js.map → chunk-5OLFYSVG.js.map} +0 -0
  372. /package/dist/{chunk-D4QOZXPM.js.map → chunk-5WBRM7V4.js.map} +0 -0
  373. /package/dist/{chunk-GXK4CUAB.js.map → chunk-5WQKTT5Z.js.map} +0 -0
  374. /package/dist/{chunk-6N7W3TOV.js.map → chunk-63BPMTBM.js.map} +0 -0
  375. /package/dist/{chunk-R5YZ3ROM.js.map → chunk-63PQKTTT.js.map} +0 -0
  376. /package/dist/{chunk-WLZVXCPZ.js.map → chunk-6GO6WN22.js.map} +0 -0
  377. /package/dist/{chunk-XDCZBOEY.js.map → chunk-6LGBGPBU.js.map} +0 -0
  378. /package/dist/{chunk-FMATVQFW.js.map → chunk-6XXMG5YP.js.map} +0 -0
  379. /package/dist/{chunk-M5E3CKSE.js.map → chunk-7QWWE5XL.js.map} +0 -0
  380. /package/dist/{chunk-RABKQFTA.js.map → chunk-A2HCAMRH.js.map} +0 -0
  381. /package/dist/{chunk-6K3WNTRI.js.map → chunk-AODISQO6.js.map} +0 -0
  382. /package/dist/{chunk-C6JL6PBL.js.map → chunk-AQDRH6VF.js.map} +0 -0
  383. /package/dist/{chunk-72XEFLMD.js.map → chunk-ASWINLSW.js.map} +0 -0
  384. /package/dist/{chunk-ZPZYYSHW.js.map → chunk-BVMDON5T.js.map} +0 -0
  385. /package/dist/{chunk-EURDMOXZ.js.map → chunk-BYJZUCOQ.js.map} +0 -0
  386. /package/dist/{chunk-BQWUXC55.js.map → chunk-CAVAVT5S.js.map} +0 -0
  387. /package/dist/{chunk-BPD4IJBG.js.map → chunk-CG6CJMIS.js.map} +0 -0
  388. /package/dist/{chunk-B254JG72.js.map → chunk-CQX24PT7.js.map} +0 -0
  389. /package/dist/{chunk-HJTTDLF6.js.map → chunk-CY3NO4JN.js.map} +0 -0
  390. /package/dist/{chunk-OLUG4IFF.js.map → chunk-D2RLPRSG.js.map} +0 -0
  391. /package/dist/{chunk-74NIHMAT.js.map → chunk-D653JH6D.js.map} +0 -0
  392. /package/dist/{chunk-2LUO22FR.js.map → chunk-DAI5CTQF.js.map} +0 -0
  393. /package/dist/{chunk-HTKVYEVB.js.map → chunk-DBM4ZXDN.js.map} +0 -0
  394. /package/dist/{chunk-MB2DTUEG.js.map → chunk-DNYKLU3K.js.map} +0 -0
  395. /package/dist/{chunk-26P7B46A.js.map → chunk-DXYARXK3.js.map} +0 -0
  396. /package/dist/{chunk-JQKURO3S.js.map → chunk-E4MQRQ6Z.js.map} +0 -0
  397. /package/dist/{chunk-KW53DBY7.js.map → chunk-EBW2E32G.js.map} +0 -0
  398. /package/dist/{chunk-O73DRA77.js.map → chunk-ENKBO7FC.js.map} +0 -0
  399. /package/dist/{chunk-FVCLVASD.js.map → chunk-FI3KRVOF.js.map} +0 -0
  400. /package/dist/{chunk-WWM7WVD2.js.map → chunk-GABFKHQE.js.map} +0 -0
  401. /package/dist/{chunk-32HA7DXJ.js.map → chunk-GNBRB3DH.js.map} +0 -0
  402. /package/dist/{chunk-CEQUNJJY.js.map → chunk-HPALK6LD.js.map} +0 -0
  403. /package/dist/{chunk-LR7U3HCD.js.map → chunk-HPSATFLQ.js.map} +0 -0
  404. /package/dist/{chunk-O4AWXTZQ.js.map → chunk-HUYLQW75.js.map} +0 -0
  405. /package/dist/{chunk-ZZUKJ5HQ.js.map → chunk-IG2ERMSB.js.map} +0 -0
  406. /package/dist/{chunk-2SZ3KC5S.js.map → chunk-IMKIIS4Y.js.map} +0 -0
  407. /package/dist/{chunk-CA64OZLZ.js.map → chunk-IRXPXDY5.js.map} +0 -0
  408. /package/dist/{chunk-I57HZMMA.js.map → chunk-IXIE3H43.js.map} +0 -0
  409. /package/dist/{chunk-OWJD3V4V.js.map → chunk-J3YQ3554.js.map} +0 -0
  410. /package/dist/{chunk-BCFHMBMK.js.map → chunk-J5HZBHU4.js.map} +0 -0
  411. /package/dist/{chunk-UHMMRQGU.js.map → chunk-KD7GNHOP.js.map} +0 -0
  412. /package/dist/{chunk-X7Z4B5GK.js.map → chunk-KPL7EXS6.js.map} +0 -0
  413. /package/dist/{chunk-GTR2WUBA.js.map → chunk-KX6M5CJI.js.map} +0 -0
  414. /package/dist/{chunk-CYO5HL4C.js.map → chunk-KYL2BPS2.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-NZMQDUOD.js.map → chunk-MU6HYDNF.js.map} +0 -0
  420. /package/dist/{chunk-GMVKCEBG.js.map → chunk-MY6QEDZ2.js.map} +0 -0
  421. /package/dist/{chunk-SK57RWSA.js.map → chunk-MZGKQ5WV.js.map} +0 -0
  422. /package/dist/{chunk-HSQRYJ4P.js.map → chunk-N52SFH2K.js.map} +0 -0
  423. /package/dist/{chunk-MY6VZVCP.js.map → chunk-OAJX5CEL.js.map} +0 -0
  424. /package/dist/{chunk-FH75NNLB.js.map → chunk-OZ5NAXCP.js.map} +0 -0
  425. /package/dist/{chunk-PEGNFZ3F.js.map → chunk-P5S777YI.js.map} +0 -0
  426. /package/dist/{chunk-LY6727IF.js.map → chunk-PPSVFNEA.js.map} +0 -0
  427. /package/dist/{chunk-K4FDZVMQ.js.map → chunk-PR42VIVY.js.map} +0 -0
  428. /package/dist/{chunk-I74J2UZ2.js.map → chunk-PWMZCW4H.js.map} +0 -0
  429. /package/dist/{chunk-6YDXUE5H.js.map → chunk-PYA2O3WS.js.map} +0 -0
  430. /package/dist/{chunk-GUIZDI5T.js.map → chunk-Q2PA4KZS.js.map} +0 -0
  431. /package/dist/{chunk-JJ7VMIEQ.js.map → chunk-QCANSTLU.js.map} +0 -0
  432. /package/dist/{chunk-DZH2HTTB.js.map → chunk-R27GW5WV.js.map} +0 -0
  433. /package/dist/{chunk-DAQG3C4W.js.map → chunk-R6JY22SG.js.map} +0 -0
  434. /package/dist/{chunk-7OIBLMDP.js.map → chunk-RAQISW42.js.map} +0 -0
  435. /package/dist/{chunk-CPKD2YGK.js.map → chunk-RNU5CUPI.js.map} +0 -0
  436. /package/dist/{chunk-467VRP4E.js.map → chunk-RO5YZQHZ.js.map} +0 -0
  437. /package/dist/{chunk-SSZROOOI.js.map → chunk-ROLXYGT5.js.map} +0 -0
  438. /package/dist/{chunk-6VITVQ23.js.map → chunk-SHJ5SQOW.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-MHIYYHCL.js.map → chunk-VJU3ET7N.js.map} +0 -0
  445. /package/dist/{chunk-RXMIXKB3.js.map → chunk-WGJUARF3.js.map} +0 -0
  446. /package/dist/{chunk-LG67ZNRU.js.map → chunk-WK2ZCTUF.js.map} +0 -0
  447. /package/dist/{chunk-XGE75VPK.js.map → chunk-WNARM3LY.js.map} +0 -0
  448. /package/dist/{chunk-RNBH5TSM.js.map → chunk-WQ2RTQYO.js.map} +0 -0
  449. /package/dist/{chunk-W57QFLQD.js.map → chunk-X6JIGNLI.js.map} +0 -0
  450. /package/dist/{chunk-CKA4SJRK.js.map → chunk-XIQDCQX7.js.map} +0 -0
  451. /package/dist/{chunk-AJ7PY4FJ.js.map → chunk-Y3GCG6CA.js.map} +0 -0
  452. /package/dist/{chunk-ZRB4M3GG.js.map → chunk-YC5KH7ZB.js.map} +0 -0
  453. /package/dist/{chunk-4RY64KQY.js.map → chunk-YJUKLLNP.js.map} +0 -0
  454. /package/dist/{chunk-24POWVUY.js.map → chunk-ZDJNRRVS.js.map} +0 -0
  455. /package/dist/{chunk-M7YEZR6X.js.map → chunk-ZITMDA4C.js.map} +0 -0
  456. /package/dist/{chat-interactive-block-Z22YHDRU.js.map → computer-viewer-6CRLWQHP.js.map} +0 -0
  457. /package/dist/{computer-viewer-BWVNDFTO.js.map → embedded-new-voice-KILV3RYM.js.map} +0 -0
  458. /package/dist/{embedded-new-voice-GBXSZ3TO.js.map → embedded-voice-GHDRLCFX.js.map} +0 -0
  459. /package/dist/{fleet-decision-row-35S3GAUN.js.map → fleet-decision-row-DQXRRBT7.js.map} +0 -0
  460. /package/dist/{embedded-voice-MGI7EK7C.js.map → model-policy-picker-menu-5ALKUJMR.js.map} +0 -0
  461. /package/dist/{platform-activity-row-ISMXR7NJ.js.map → platform-activity-row-227C764Z.js.map} +0 -0
  462. /package/dist/{queue-surface-implementation-ULW7DDJA.js.map → queue-surface-implementation-H3NOBXU5.js.map} +0 -0
  463. /package/dist/{model-policy-picker-menu-KP53N6UJ.js.map → sandbox-files-5FEOHUMD.js.map} +0 -0
  464. /package/dist/{sandbox-files-QYSD4XCZ.js.map → session-realtime-OHBMODNX.js.map} +0 -0
  465. /package/dist/{timeline-annotation-markers-OJYKHBEO.js.map → timeline-annotation-markers-NDHS7MCK.js.map} +0 -0
  466. /package/dist/{timeline-annotation-selection-6OAZLXFU.js.map → timeline-annotation-selection-DRQSTJOV.js.map} +0 -0
  467. /package/dist/{timeline-annotations-dialog-5M6DP5FX.js.map → timeline-annotations-dialog-G6J5ZJKN.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/list-row.tsx"],"sourcesContent":["import {\n createContext,\n isValidElement,\n useContext,\n useId,\n useMemo,\n useRef,\n type AnchorHTMLAttributes,\n type CSSProperties,\n type MouseEvent,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n ArrowUpRightIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n ChevronsUpDownIcon,\n CircleAlertIcon,\n LoaderCircleIcon,\n MoreHorizontalIcon,\n PlusIcon,\n} from \"lucide-react\";\n\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from \"./dropdown-menu\";\nimport { LogoTileSizeProvider, type LogoTileSize } from \"./logo-tile\";\nimport { useSectionListFrame } from \"./section-variant\";\nimport { RelativeTimeDefaultsContext } from \"./relative-time\";\nimport { Skeleton } from \"./skeleton\";\nimport { cn } from \"../lib/cn\";\n\n/* ----------------------------------------------------------------------------\n RowList and ListRow (design brief 7.4) - the one way to show a thing in a\n list. The Capabilities catalog row, generalized: leading tile, title, one\n line of description, quiet meta, and one trailing affordance.\n\n One row definition renders in three layouts, chosen on the list:\n - \"catalog\" (A) 76px rows, 40px tile, two columns at 720px+, trailing\n + / check. For discovering things (Capabilities).\n - \"resource\" (B, default) 56-64px rows in one column with hairlines, a\n 32px tile, title + one line, fact columns and a chevron or ⋯\n menu. For things you own.\n - \"table\" (C) column headers and sortable columns, 44px rows. For more\n than ~20 items or numeric data.\n\n The whole row is the action (a stretched button or link) unless it holds\n one control. Menus and controls sit above the stretched target.\n\n Resource and table rows share one grid (CSS subgrid), so fact columns and\n the trailing slot line up across rows whatever each row holds. Under 640px\n of list width (a container query, so a list in a sheet or a 390px frame\n behaves like a phone) the fact columns fold into the meta line.\n -------------------------------------------------------------------------- */\n\nexport type RowListVariant = \"catalog\" | \"resource\" | \"table\";\n\nexport interface RowListColumn {\n /** Key into each row's `cells`. */\n id: string;\n /** Header in tables; the small label above the value in resource rows. */\n label: string;\n /** Column width in px on wide layouts. Default 132. */\n width?: number | undefined;\n align?: \"start\" | \"end\" | undefined;\n /** Tables only: the header becomes a sort button. */\n sortable?: boolean | undefined;\n /**\n * Hide the label in resource rows and the folded meta line, for values that\n * explain themselves (\"4 variables\"). The table header still shows it.\n */\n hideLabel?: boolean | undefined;\n /**\n * On narrow lists this fact folds in ahead of the meta items instead of\n * after them and stays on a phone-width line, for a value the row exists to\n * show (an amount). Keep it to one or two short facts per list.\n */\n leadsWhenFolded?: boolean | undefined;\n}\n\nexport interface RowListSort {\n /** A column id, or \"name\" for the title column. */\n column: string;\n direction: \"asc\" | \"desc\";\n}\n\ninterface RowListContextValue {\n variant: RowListVariant;\n columns: RowListColumn[];\n}\n\nconst RowListContext = createContext<RowListContextValue | null>(null);\n\nfunction useRowList(): RowListContextValue {\n return useContext(RowListContext) ?? { variant: \"resource\", columns: NO_COLUMNS };\n}\n\n/** The layout of the enclosing RowList. */\nexport function useRowListVariant(): RowListVariant {\n return useRowList().variant;\n}\n\nconst TILE_SIZE: Record<RowListVariant, LogoTileSize> = {\n catalog: \"lg\",\n resource: \"md\",\n table: \"sm\",\n};\n\nconst DEFAULT_COLUMN_WIDTH = 132;\nconst NO_COLUMNS: RowListColumn[] = [];\nconst NO_META: ReactNode[] = [];\nconst NO_CELLS: Record<string, ReactNode> = {};\n/** The row is the tab stop; times inside it show their tooltip on hover. */\nconst ROW_TIME_DEFAULTS = { focusable: false };\n\n/** Wide layout: title, one track per fact column, then the trailing slot. */\nfunction gridTemplate(columns: RowListColumn[], variant: RowListVariant): string {\n const facts = columns.map((column) => `${column.width ?? DEFAULT_COLUMN_WIDTH}px`);\n return [\"minmax(0,1fr)\", ...facts, variant === \"table\" ? \"minmax(2.5rem,auto)\" : \"auto\"].join(\n \" \",\n );\n}\n\n/*\n * Container-query classes are written out in full (`@[640px]/list:`) so\n * Tailwind can see them. Narrow lists use two tracks: title and trailing.\n */\nconst SHARED_GRID =\n \"grid grid-cols-[minmax(0,1fr)_auto] @[640px]/list:[grid-template-columns:var(--row-list-template)]\";\nconst SUBGRID = \"col-span-full grid grid-cols-subgrid\";\n\nexport interface RowListProps {\n /** Default \"resource\". */\n variant?: RowListVariant | undefined;\n /** Fact columns: labelled values in resource rows, real columns in tables. */\n columns?: RowListColumn[] | undefined;\n /** Accessible name for the list or table, for example \"Variable sets\". */\n label: string;\n /** Header of the title column in tables. Default \"Name\". */\n nameLabel?: string | undefined;\n /** Tables: make the title column sortable. */\n nameSortable?: boolean | undefined;\n /** Tables: the current sort. Sorting the rows is the caller's job. */\n sort?: RowListSort | undefined;\n onSortChange?: ((sort: RowListSort) => void) | undefined;\n /** Rows are loading; announces it and sets aria-busy. */\n busy?: boolean | undefined;\n /**\n * Resource lists inside an open section or page: tiles and titles line up\n * with the section's edge, the row hover bleeds 12px out with rounded\n * corners, and the hairlines stay inside the content edge.\n */\n flush?: boolean | undefined;\n className?: string | undefined;\n children: ReactNode;\n}\n\n/* Hairlines drawn inside the row padding, so they end where the content does. */\nconst FLUSH_LIST = cn(\n \"[&>li]:relative [&>li+li]:before:pointer-events-none [&>li+li]:before:absolute [&>li+li]:before:inset-x-3 [&>li+li]:before:top-0 [&>li+li]:before:h-px [&>li+li]:before:bg-border [&>li+li]:before:content-['']\",\n \"[&>li>div]:rounded-[10px]\",\n);\n\nexport function RowList({\n variant = \"resource\",\n columns = NO_COLUMNS,\n label,\n nameLabel = \"Name\",\n nameSortable = false,\n sort,\n onSortChange,\n busy = false,\n flush = false,\n className,\n children,\n}: RowListProps) {\n const value = useMemo<RowListContextValue>(() => ({ variant, columns }), [variant, columns]);\n // In settings (grouped sections) a flush list that is not already inside a\n // section card becomes the card itself: rows keep their 12px padding, the\n // card adds 8px so titles sit 20px in, like setting rows.\n const frame = useSectionListFrame();\n const flushCard = flush && frame === \"card\";\n const templateStyle = {\n \"--row-list-template\": gridTemplate(columns, variant),\n } as CSSProperties;\n const busyNote = busy ? (\n <span role=\"status\" className=\"sr-only\">\n Loading {label.toLocaleLowerCase()}\n </span>\n ) : null;\n\n let body: ReactNode;\n if (variant === \"table\") {\n body = (\n <div\n role=\"table\"\n aria-label={label}\n aria-busy={busy || undefined}\n className={cn(\"min-w-0 gap-x-4\", SHARED_GRID)}\n style={templateStyle}\n >\n <div role=\"rowgroup\" className={cn(SUBGRID, \"hidden\", \"@[640px]/list:grid\")}>\n <div\n role=\"row\"\n className={cn(SUBGRID, \"min-h-9 items-center border-b border-border px-3\")}\n >\n <HeaderCell\n label={nameLabel}\n columnId=\"name\"\n sortable={nameSortable}\n sort={sort}\n onSortChange={onSortChange}\n />\n {columns.map((column) => (\n <HeaderCell\n key={column.id}\n label={column.label}\n columnId={column.id}\n align={column.align}\n sortable={column.sortable}\n sort={sort}\n onSortChange={onSortChange}\n />\n ))}\n <div role=\"columnheader\">\n <span className=\"sr-only\">Actions</span>\n </div>\n </div>\n </div>\n <div role=\"rowgroup\" className={cn(SUBGRID, \"divide-y divide-border\")}>\n {children}\n </div>\n </div>\n );\n } else if (variant === \"catalog\") {\n body = (\n <ul\n aria-label={label}\n aria-busy={busy || undefined}\n className=\"m-0 grid min-w-0 list-none grid-cols-1 gap-x-6 gap-y-1 p-0 @[720px]/list:grid-cols-2\"\n >\n {children}\n </ul>\n );\n } else {\n body = (\n <ul\n aria-label={label}\n aria-busy={busy || undefined}\n className={cn(\n \"m-0 min-w-0 list-none gap-x-3 p-0\",\n SHARED_GRID,\n flush ? FLUSH_LIST : \"divide-y divide-border\",\n )}\n style={templateStyle}\n >\n {children}\n </ul>\n );\n }\n\n return (\n <RowListContext.Provider value={value}>\n <LogoTileSizeProvider size={TILE_SIZE[variant]}>\n <div\n data-slot=\"row-list\"\n data-variant={variant}\n data-flush={flush || undefined}\n data-frame={flushCard ? \"card\" : undefined}\n className={cn(\n \"@container/list min-w-0\",\n flushCard ? \"rounded-lg border border-border bg-surface px-2 py-1\" : flush && \"-mx-3\",\n className,\n )}\n >\n {busyNote}\n {body}\n </div>\n </LogoTileSizeProvider>\n </RowListContext.Provider>\n );\n}\n\nfunction HeaderCell({\n label,\n columnId,\n align = \"start\",\n sortable = false,\n sort,\n onSortChange,\n}: {\n label: string;\n columnId: string;\n align?: \"start\" | \"end\" | undefined;\n sortable?: boolean | undefined;\n sort?: RowListSort | undefined;\n onSortChange?: ((sort: RowListSort) => void) | undefined;\n}) {\n const active = sort?.column === columnId;\n const ariaSort = active ? (sort.direction === \"asc\" ? \"ascending\" : \"descending\") : undefined;\n const text = \"text-xs leading-4.5 font-medium text-fg-subtle\";\n if (!sortable || !onSortChange) {\n return (\n <div\n role=\"columnheader\"\n className={cn(\"min-w-0 truncate\", text, align === \"end\" && \"text-right\")}\n >\n {label}\n </div>\n );\n }\n const SortIcon = active\n ? sort.direction === \"asc\"\n ? ArrowUpIcon\n : ArrowDownIcon\n : ChevronsUpDownIcon;\n return (\n <div\n role=\"columnheader\"\n aria-sort={ariaSort}\n className={cn(\"min-w-0\", align === \"end\" && \"text-right\")}\n >\n <button\n type=\"button\"\n onClick={() =>\n onSortChange({\n column: columnId,\n direction: active && sort.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n className={cn(\n \"-mx-1.5 inline-flex max-w-full items-center gap-1 rounded-[6px] px-1.5 py-0.5 transition-colors duration-[120ms] hover:bg-hover hover:text-fg pointer-coarse:min-h-11\",\n text,\n active && \"text-fg\",\n align === \"end\" && \"flex-row-reverse\",\n )}\n >\n <span className=\"min-w-0 truncate\">{label}</span>\n <SortIcon aria-hidden=\"true\" className={cn(\"size-3.5 shrink-0\", !active && \"opacity-60\")} />\n </button>\n </div>\n );\n}\n\n/* ----------------------------------------------------------------------------\n RowIndicator: the display-only trailing glyph. The row is the action.\n -------------------------------------------------------------------------- */\n\nexport type RowIndicatorKind =\n | \"open\"\n | \"expand\"\n | \"external\"\n | \"add\"\n | \"added\"\n | \"attention\"\n | \"unavailable\"\n | \"loading\";\n\nconst INDICATOR_LABEL: Record<RowIndicatorKind, string> = {\n open: \"Open\",\n expand: \"Show details\",\n external: \"Opens in a new tab\",\n add: \"Available to add\",\n added: \"Added\",\n attention: \"Needs attention\",\n unavailable: \"Unavailable\",\n loading: \"Working\",\n};\n\nexport interface RowIndicatorProps {\n kind: RowIndicatorKind;\n /**\n * The state in words. Visible for \"attention\" and \"unavailable\" (\"Needs\n * reconnect\"); screen-reader only for the others.\n */\n label?: string | undefined;\n id?: string | undefined;\n className?: string | undefined;\n}\n\nexport function RowIndicator({ kind, label, id, className }: RowIndicatorProps) {\n const Icon =\n kind === \"open\"\n ? ChevronRightIcon\n : kind === \"expand\"\n ? ChevronDownIcon\n : kind === \"external\"\n ? ArrowUpRightIcon\n : kind === \"add\"\n ? PlusIcon\n : kind === \"added\"\n ? CheckIcon\n : kind === \"loading\"\n ? LoaderCircleIcon\n : CircleAlertIcon;\n const visibleLabel = kind === \"attention\" || kind === \"unavailable\";\n return (\n <span\n data-slot=\"row-indicator\"\n data-kind={kind}\n className={cn(\n \"pointer-events-none inline-flex min-w-0 shrink-0 items-center justify-end gap-1.5\",\n kind === \"attention\"\n ? \"text-status-waiting\"\n : kind === \"added\"\n ? \"text-fg-muted\"\n : \"text-fg-subtle\",\n className,\n )}\n >\n {visibleLabel ? (\n // On narrow lists the row repeats the words under its title (see\n // ListRow), so only the icon stays here and nothing truncates.\n <span\n id={id}\n className=\"max-w-40 min-w-0 truncate text-xs leading-4.5 font-medium @max-[479px]/list:sr-only\"\n >\n {label ?? INDICATOR_LABEL[kind]}\n </span>\n ) : null}\n <Icon\n aria-hidden=\"true\"\n className={cn(\n visibleLabel ? \"size-4\" : \"size-[18px]\",\n kind === \"loading\" && \"motion-safe:animate-spin\",\n kind === \"expand\" && \"transition-transform duration-[120ms]\",\n )}\n />\n {visibleLabel ? null : (\n <span id={id} className=\"sr-only\">\n {label ?? INDICATOR_LABEL[kind]}\n </span>\n )}\n </span>\n );\n}\n\n/* ----------------------------------------------------------------------------\n ListRow.\n -------------------------------------------------------------------------- */\n\ntype RowLinkProps = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"className\" | \"children\">;\n\nexport interface ListRowProps {\n /** Leading tile: a LogoTile (sized by the list), an avatar or a status dot. */\n leading?: (ReactNode | ((size: LogoTileSize) => ReactNode)) | undefined;\n /** One line, 14/500. The row's accessible name. */\n title: ReactNode;\n /** Small chips right after the title: \"Organization\", \"Primary\", \"You\". */\n titleAddon?: ReactNode | undefined;\n /** One sentence, 12/18 muted. Two lines in catalog rows, one elsewhere. */\n description?: ReactNode | undefined;\n /** Quiet facts joined with \" · \" (the meta line). */\n meta?: ReactNode[] | undefined;\n /**\n * The row's state, usually a dot StatusBadge (\"Suspended\", \"Invited ·\n * expires in 14 days\"). It sits at the right of the name area on wide lists\n * and joins the meta line on narrow ones: a status never adds a line.\n */\n status?: ReactNode | undefined;\n /** Values for the list's fact columns, by column id. */\n cells?: Record<string, ReactNode> | undefined;\n /** Display-only trailing glyph. A kind, or a kind with its state in words. */\n indicator?: RowIndicatorKind | { kind: RowIndicatorKind; label?: string };\n /**\n * One interactive control (a switch, a small button). Sits above the row\n * target; drops under the text on narrow lists that have fact columns.\n */\n control?: ReactNode | undefined;\n /** Items for the row's ⋯ menu (DropdownMenuItem elements). */\n menu?: ReactNode | undefined;\n /** Accessible name of the ⋯ button. Default \"More actions for <title>\". */\n menuLabel?: string | undefined;\n /** Makes the whole row a button. */\n onOpen?: ((event: MouseEvent<HTMLElement>) => void) | undefined;\n /** Makes the whole row a link. */\n href?: string | undefined;\n /**\n * Extra props for the link (target, rel, router handlers). An in-app `href`\n * needs `onClick` (or `onOpen`) to call the router and preventDefault on a\n * plain click; otherwise the row loads the whole page.\n */\n linkProps?: RowLinkProps | undefined;\n /** The row's detail is open (sheet or page). */\n selected?: boolean | undefined;\n /**\n * Expand in place (one level of secondary detail). The row toggles `panel`\n * below it and announces aria-expanded. Prefer a sheet for anything larger.\n */\n expanded?: boolean | undefined;\n /** The content shown under the row while `expanded`. List layouts only. */\n panel?: ReactNode | undefined;\n /** Not actionable right now. Say why with `disabledReason`. */\n disabled?: boolean | undefined;\n /** Why the row can't be used, and who can fix it. Replaces the description. */\n disabledReason?: ReactNode | undefined;\n className?: string | undefined;\n}\n\nfunction textOf(node: ReactNode): string {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(textOf).join(\"\");\n if (isValidElement<{ children?: ReactNode }>(node)) return textOf(node.props.children);\n return \"\";\n}\n\nconst RAISED = \"[data-slot=relative-time], [data-slot=status-badge]\";\n\nexport function ListRow({\n leading,\n title,\n titleAddon,\n description,\n meta = NO_META,\n status,\n cells = NO_CELLS,\n indicator,\n control,\n menu,\n menuLabel,\n onOpen,\n href,\n linkProps,\n selected = false,\n expanded,\n panel,\n disabled = false,\n disabledReason,\n className,\n}: ListRowProps) {\n const { variant, columns } = useRowList();\n const actionRef = useRef<HTMLElement>(null);\n const titleId = useId();\n const secondaryId = useId();\n const indicatorId = useId();\n const panelId = useId();\n const actionable = !disabled && Boolean(onOpen || href);\n const indicatorSpec = typeof indicator === \"string\" ? { kind: indicator } : indicator;\n const secondary = disabled && disabledReason ? disabledReason : description;\n // \"Needs reconnect\" and \"Unavailable\" move under the title on narrow lists.\n const narrowState =\n indicatorSpec && (indicatorSpec.kind === \"attention\" || indicatorSpec.kind === \"unavailable\")\n ? (indicatorSpec.label ?? INDICATOR_LABEL[indicatorSpec.kind])\n : null;\n const table = variant === \"table\";\n const catalog = variant === \"catalog\";\n const gridded = !catalog;\n const hasColumns = gridded && columns.length > 0;\n const expandable = !table && expanded !== undefined;\n\n // Resource and table rows keep one fixed height: the description, the meta\n // facts and (on narrow lists) the status and indicator words share ONE\n // secondary line that truncates. Catalog rows keep a two-line description\n // with the facts under it.\n const singleLine = !catalog;\n /* The meta line: quiet facts, then the fact columns folded in on narrow lists. */\n const presentFacts = columns.filter((column) => cells[column.id] != null);\n const facts = [\n ...presentFacts.filter((column) => column.leadsWhenFolded),\n ...presentFacts.filter((column) => !column.leadsWhenFolded),\n ];\n const leadingFacts = facts.filter((column) => column.leadsWhenFolded).length;\n const metaItems = meta.filter((item) => item != null && item !== false && item !== \"\");\n // On one line the facts give way from the end: a later part truncates (and\n // then disappears) before an earlier one, so a narrow row reads \"Fact ·\n // Staging runs on walrus-2…\" instead of every part cut to a few letters.\n // Only the last meta item and the folded facts after it shrink at all: any\n // shrink, however small, would put an ellipsis into a short fact (\"Fa…\").\n const foldedFact = (column: RowListColumn, index: number, order: number, leads: boolean) => (\n <MetaPart\n key={column.id}\n order={order}\n keep={leads}\n oneLine={singleLine}\n className={cn(\n hasColumns && \"@[640px]/list:hidden\",\n // A phone-width line has room for one folded fact (none next to a\n // status) beyond the leading ones; more would only be cut to a dot\n // and a few letters.\n !leads && (index > 0 || status) && \"@max-[479px]/list:hidden\",\n )}\n >\n {column.hideLabel ? null : <span className=\"text-fg-subtle\">{column.label} </span>}\n <span className=\"text-fg-muted\">{cells[column.id]}</span>\n </MetaPart>\n );\n const metaParts: ReactNode[] = [\n // A leading fact never shrinks: the meta after it gives way instead.\n ...facts.slice(0, leadingFacts).map((column, index) => foldedFact(column, index, index, true)),\n ...metaItems.map((item, index) => {\n const last = index === metaItems.length - 1;\n return (\n <MetaPart\n // oxlint-disable-next-line react/no-array-index-key -- meta items are positional\n key={`meta-${index}`}\n order={leadingFacts + index}\n keep={!last}\n oneLine={singleLine}\n >\n {item}\n </MetaPart>\n );\n }),\n ...facts\n .slice(leadingFacts)\n .map((column, index) =>\n foldedFact(column, leadingFacts + index, leadingFacts + metaItems.length + index, false),\n ),\n ];\n const statusPart = status ? (\n <MetaPart key=\"status\" keep className=\"@[480px]/list:hidden\">\n {status}\n </MetaPart>\n ) : null;\n const narrowStatePart =\n singleLine && narrowState ? (\n <MetaPart\n key=\"narrow-state\"\n keep\n hidden\n className={cn(\n \"hidden font-medium @max-[479px]/list:flex\",\n indicatorSpec?.kind === \"attention\" ? \"text-status-waiting\" : \"text-fg-subtle\",\n )}\n >\n {narrowState}\n </MetaPart>\n ) : null;\n const lineParts = metaParts;\n // The status and the narrow state end the line and always stay whole: the\n // description and the facts before them give way instead.\n const trailingParts = [\n ...(singleLine && statusPart ? [statusPart] : []),\n ...(narrowStatePart ? [narrowStatePart] : []),\n ];\n const hasLineDescription = Boolean(secondary && !(disabled && disabledReason));\n const keptLeadParts = singleLine && hasLineDescription ? lineParts.slice(0, leadingFacts) : [];\n const restLineParts = lineParts.slice(keptLeadParts.length);\n // Every part leads with its separator and the line is shifted left by one\n // separator and clipped, so no line of a wrapped meta line starts or ends\n // with a dot.\n const metaLine =\n !singleLine && metaParts.length > 0 ? (\n <div\n className={cn(\n \"mt-0.5 min-w-0 overflow-hidden text-xs leading-4.5 text-fg-subtle\",\n // Only folded facts: the line disappears once the columns show.\n hasColumns && metaItems.length === 0 && \"@[640px]/list:hidden\",\n )}\n >\n <p className=\"m-0 -ml-4 flex min-w-0 flex-wrap items-center\">{metaParts}</p>\n </div>\n ) : null;\n\n /* The title is the row's action, stretched over the whole row. */\n // The chevron is decoration; every other indicator states something worth hearing.\n const announceIndicator =\n indicatorSpec && indicatorSpec.kind !== \"open\" && indicatorSpec.kind !== \"expand\";\n const labelledBy = [titleId, announceIndicator ? indicatorId : null].filter(Boolean).join(\" \");\n const actionProps = {\n \"data-row-action\": \"\",\n \"aria-labelledby\": labelledBy,\n \"aria-describedby\": secondary ? secondaryId : undefined,\n \"aria-current\": selected ? (\"true\" as const) : undefined,\n \"aria-expanded\": expandable ? expanded : undefined,\n \"aria-controls\": expandable && expanded ? panelId : undefined,\n // The row draws the focus ring; the global focus outline is unlayered, so\n // only an inline style keeps it off the title.\n style: { outline: \"none\" },\n className: cn(\n \"min-w-0 cursor-pointer truncate text-left text-sm leading-5 font-medium text-fg\",\n \"after:absolute after:inset-0 after:z-0 after:content-['']\",\n ),\n };\n const titleNode = actionable ? (\n href ? (\n <a\n {...linkProps}\n {...actionProps}\n ref={actionRef as RefObject<HTMLAnchorElement>}\n href={href}\n // Both handlers run: `linkProps.onClick` is how callers keep a plain\n // click in the router. Letting an absent `onOpen` replace it made the\n // row a full page load.\n onClick={(event) => {\n onOpen?.(event);\n if (!event.defaultPrevented) linkProps?.onClick?.(event);\n }}\n >\n <span id={titleId}>{title}</span>\n </a>\n ) : (\n <button\n {...actionProps}\n ref={actionRef as RefObject<HTMLButtonElement>}\n type=\"button\"\n onClick={onOpen}\n >\n <span id={titleId}>{title}</span>\n </button>\n )\n ) : (\n <span\n id={titleId}\n className={cn(\n \"min-w-0 truncate text-sm leading-5 font-medium\",\n disabled ? \"text-fg-muted\" : \"text-fg\",\n )}\n >\n {title}\n </span>\n );\n\n const leadingNode =\n typeof leading === \"function\" ? leading(TILE_SIZE[variant]) : leading ? leading : null;\n\n const menuNode = menu ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={menuLabel ?? `More actions for ${textOf(title) || \"this item\"}`}\n className=\"grid size-8 shrink-0 place-items-center rounded-[10px] text-fg-subtle transition-colors duration-[120ms] hover:bg-surface-3 hover:text-fg data-[state=open]:bg-surface-3 data-[state=open]:text-fg pointer-coarse:size-11\"\n >\n <MoreHorizontalIcon aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-44\">\n {menu}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null;\n\n // In gridded lists the control sits right after the text (before the fact\n // columns) and drops under the text when the list is narrow.\n const controlNode = control ? (\n <div\n className={cn(\n \"relative z-10 flex shrink-0 items-center\",\n hasColumns &&\n (table\n ? \"@max-[639px]/list:basis-full @max-[639px]/list:pl-9\"\n : \"@max-[639px]/list:basis-full @max-[639px]/list:pl-11\"),\n )}\n >\n {control}\n </div>\n ) : null;\n const controlInline = hasColumns;\n\n const trailingContent =\n indicatorSpec || menuNode || (control && !controlInline) ? (\n <>\n {controlInline ? null : controlNode}\n {menuNode ? <div className=\"relative z-10 flex items-center\">{menuNode}</div> : null}\n {indicatorSpec ? (\n <RowIndicator\n kind={indicatorSpec.kind}\n label={indicatorSpec.label}\n id={indicatorId}\n className={\n indicatorSpec.kind === \"expand\" && expanded ? \"[&>svg]:rotate-180\" : undefined\n }\n />\n ) : null}\n </>\n ) : null;\n // Gridded rows always fill the trailing track so the grid stays in step.\n const trailing =\n trailingContent || gridded ? (\n <div\n role={table ? \"cell\" : undefined}\n className=\"flex min-w-0 shrink-0 items-center justify-end gap-1\"\n >\n {trailingContent}\n </div>\n ) : null;\n\n const main = (\n <div\n className={cn(\n \"flex min-w-0 flex-1 items-center gap-x-3\",\n controlInline && control && \"flex-wrap gap-y-2\",\n )}\n >\n {leadingNode ? (\n <div\n className={cn(\n \"flex shrink-0 items-center justify-center\",\n disabled && \"opacity-60 grayscale\",\n )}\n >\n {leadingNode}\n </div>\n ) : null}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-2\">\n {titleNode}\n {titleAddon ? (\n // Held to the title's 20px line: a chip never makes its row taller.\n <span className=\"flex h-5 shrink-0 items-center gap-1.5\">{titleAddon}</span>\n ) : null}\n </div>\n {secondary && (catalog || (disabled && disabledReason)) ? (\n <p\n id={secondaryId}\n className={cn(\n \"mt-0.5 min-w-0 text-xs leading-4.5 text-fg-muted\",\n // A disabled reason is the point of the row: it never truncates.\n disabled && disabledReason ? \"break-words\" : \"line-clamp-2 break-words\",\n )}\n >\n {secondary}\n </p>\n ) : null}\n {singleLine &&\n ((secondary && !(disabled && disabledReason)) ||\n lineParts.length > 0 ||\n trailingParts.length > 0) ? (\n <p\n className={cn(\n \"m-0 mt-0.5 flex min-w-0 items-center overflow-hidden text-xs leading-4.5 whitespace-nowrap text-fg-subtle\",\n // Tables keep rows to one line once the columns show, unless\n // the line still has facts that aren't columns.\n table && metaItems.length === 0 && \"@[640px]/list:hidden\",\n // Only folded facts: the line disappears once the columns show.\n !table &&\n !secondary &&\n hasColumns &&\n metaItems.length === 0 &&\n !status &&\n !narrowState &&\n \"@[640px]/list:hidden\",\n )}\n >\n {secondary && !(disabled && disabledReason) ? (\n <span id={secondaryId} className=\"min-w-0 shrink truncate text-fg-muted\">\n {secondary}\n </span>\n ) : null}\n {/* Leading facts after a description stay whole: the description\n gives way instead (\"Credentials the whole te… · 6 items\"). */}\n {keptLeadParts.length > 0 ? (\n <span className=\"flex shrink-0 items-center\">{keptLeadParts}</span>\n ) : null}\n {restLineParts.length > 0 ? (\n // One line tall and wrapping: a part with no room for a few\n // letters wraps onto the clipped second line and disappears\n // whole, instead of staying behind as a lone dot. The empty\n // first item lets even the first part wrap away.\n <span\n className={cn(\n \"flex h-4.5 min-w-0 shrink-[2] flex-wrap content-start items-center overflow-hidden\",\n // No description: drop the first part's leading dot.\n !(secondary && !(disabled && disabledReason)) && \"-ml-4\",\n )}\n >\n <span aria-hidden=\"true\" className=\"h-4.5 w-0 shrink-0\" />\n {restLineParts}\n </span>\n ) : null}\n {trailingParts.length > 0 ? (\n <span\n className={cn(\n \"flex shrink-0 items-center\",\n // Nothing before it: drop its leading dot.\n !(secondary && !(disabled && disabledReason)) &&\n restLineParts.length === 0 &&\n \"-ml-4\",\n )}\n >\n {trailingParts}\n </span>\n ) : null}\n </p>\n ) : null}\n {metaLine}\n {!singleLine && narrowState ? (\n <p\n aria-hidden=\"true\"\n className={cn(\n \"mt-1 hidden min-w-0 items-center text-xs leading-4.5 font-medium @max-[479px]/list:flex\",\n indicatorSpec?.kind === \"attention\" ? \"text-status-waiting\" : \"text-fg-subtle\",\n )}\n >\n <span className=\"min-w-0 truncate\">{narrowState}</span>\n </p>\n ) : null}\n </div>\n {status ? (\n <div className=\"relative z-10 hidden shrink-0 items-center @[480px]/list:flex\">\n {status}\n </div>\n ) : null}\n {controlInline ? controlNode : null}\n </div>\n );\n\n const factColumns = hasColumns\n ? columns.map((column) => {\n const value = cells[column.id];\n return (\n <div\n key={column.id}\n role={table ? \"cell\" : undefined}\n className={cn(\n \"hidden min-w-0 @[640px]/list:block\",\n column.align === \"end\" && \"text-right\",\n )}\n >\n {table ? (\n <span className=\"block truncate text-sm leading-5 text-fg-muted\">\n {value ?? <span className=\"text-fg-subtle\">-</span>}\n </span>\n ) : value == null ? null : (\n <>\n {column.hideLabel ? null : (\n <span className=\"block truncate text-2xs leading-4 text-fg-subtle\">\n {column.label}\n </span>\n )}\n <span className=\"block truncate text-xs leading-4.5 text-fg-muted\">{value}</span>\n </>\n )}\n </div>\n );\n })\n : null;\n\n // Times and badges float above the stretched target so their tooltips work\n // on hover; a click on them still opens the row.\n const forwardClick = actionable\n ? (event: MouseEvent<HTMLElement>) => {\n if (event.defaultPrevented || !(event.target instanceof Element)) return;\n if (event.target.closest(\"[data-row-action]\")) return;\n if (!event.target.closest(RAISED)) return;\n actionRef.current?.click();\n }\n : undefined;\n\n const rowClass = cn(\n // isolate: the raised times and badges stack inside the row, never above\n // sticky headers or overlays around the list.\n \"group/row relative isolate min-w-0 items-center transition-colors duration-[120ms]\",\n \"[&_[data-slot=relative-time]]:relative [&_[data-slot=relative-time]]:z-10 [&_[data-slot=status-badge]]:relative [&_[data-slot=status-badge]]:z-10\",\n catalog && \"flex min-h-[76px] gap-3 rounded-[14px] px-3 py-3.5\",\n // One fixed height per list type: 64px resource rows (title plus one\n // secondary line; a title-only row centers in the same height).\n variant === \"resource\" && cn(SUBGRID, \"min-h-16 px-3 py-3\"),\n table && cn(SUBGRID, \"min-h-11 px-3 py-2\"),\n actionable && \"hover:bg-hover\",\n selected &&\n cn(\n \"bg-selection hover:bg-selection\",\n \"before:absolute before:top-1/2 before:left-0 before:h-4 before:w-0.5 before:-translate-y-1/2 before:rounded-full before:bg-brand before:content-['']\",\n ),\n // Focus ring on the whole row when its target has keyboard focus.\n actionable &&\n cn(\n \"has-[[data-row-action]:focus-visible]:outline-2 has-[[data-row-action]:focus-visible]:outline-brand/55\",\n catalog\n ? \"has-[[data-row-action]:focus-visible]:outline-offset-2\"\n : \"has-[[data-row-action]:focus-visible]:-outline-offset-2\",\n ),\n className,\n );\n\n const content = (\n <RelativeTimeDefaultsContext.Provider value={ROW_TIME_DEFAULTS}>\n {table ? (\n <div role=\"rowheader\" className=\"flex min-w-0 items-center\">\n {main}\n </div>\n ) : (\n main\n )}\n {factColumns}\n {trailing}\n </RelativeTimeDefaultsContext.Provider>\n );\n\n if (table) {\n return (\n <div\n role=\"row\"\n data-slot=\"list-row\"\n data-selected={selected || undefined}\n data-disabled={disabled || undefined}\n aria-disabled={disabled || undefined}\n className={rowClass}\n onClick={forwardClick}\n >\n {content}\n </div>\n );\n }\n\n return (\n <li\n data-slot=\"list-row\"\n data-selected={selected || undefined}\n data-disabled={disabled || undefined}\n data-expanded={expandable ? expanded : undefined}\n aria-disabled={disabled || undefined}\n className={cn(\"min-w-0\", gridded && SUBGRID)}\n >\n <div className={rowClass} onClick={forwardClick}>\n {content}\n </div>\n {expandable && expanded && panel ? (\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={titleId}\n className={cn(\"col-span-full min-w-0 pr-3 pb-4\", catalog ? \"pl-16\" : \"pl-14\")}\n >\n {panel}\n </div>\n ) : null}\n </li>\n );\n}\n\nfunction MetaPart({\n className,\n children,\n hidden = false,\n order = 0,\n keep = false,\n oneLine = false,\n}: {\n className?: string | undefined;\n children: ReactNode;\n /** A visual copy of something already announced elsewhere. */\n hidden?: boolean | undefined;\n /** Position on the line: later parts give way first when it runs out of room. */\n order?: number | undefined;\n /** Never shrinks (a status): it stays whole while the facts before it give way. */\n keep?: boolean | undefined;\n /**\n * On a one-line meta line (which wraps into a clipped second line): the part\n * claims room for its dot and a few letters, then takes what is left in\n * order. One without even that much wraps away whole.\n */\n oneLine?: boolean | undefined;\n}) {\n const sizing: CSSProperties = keep\n ? { flexShrink: 0 }\n : oneLine\n ? // Earlier parts fill to their full width before later ones grow past\n // their few letters, so the line still gives way from the end.\n { flexBasis: \"3.5rem\", flexGrow: 64 ** (4 - Math.min(order, 4)), flexShrink: 0 }\n : { flexShrink: 64 ** Math.min(order, 4) };\n return (\n <span\n aria-hidden={hidden || undefined}\n style={sizing}\n className={cn(\n \"flex min-w-0 items-center overflow-hidden whitespace-nowrap\",\n // max-content caps the growth; the 3.5rem basis is the most a part\n // asks for before it fits, so a short fact never gains empty space.\n oneLine && !keep ? \"max-w-max\" : \"max-w-full\",\n className,\n )}\n >\n <span aria-hidden=\"true\" className=\"w-4 shrink-0 text-center text-fg-subtle\">\n ·\n </span>\n <span className=\"min-w-0 truncate\">{children}</span>\n </span>\n );\n}\n\n/* ----------------------------------------------------------------------------\n Loading placeholders in the same geometry as the list's rows.\n -------------------------------------------------------------------------- */\n\nexport function ListRowSkeleton({ count = 3 }: { count?: number }) {\n const { variant, columns } = useRowList();\n const table = variant === \"table\";\n const catalog = variant === \"catalog\";\n const tile = catalog\n ? \"size-10 rounded-[10px]\"\n : variant === \"resource\"\n ? \"size-8 rounded-[10px]\"\n : \"size-6 rounded-[6px]\";\n const widths = [\"w-2/5\", \"w-1/3\", \"w-1/2\", \"w-1/4\"];\n return (\n <>\n {Array.from({ length: count }, (_, index) => {\n const inner = (\n <>\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <Skeleton className={cn(\"shrink-0 bg-surface-2\", tile)} />\n <div className=\"min-w-0 flex-1\">\n <Skeleton\n className={cn(\"h-3.5 rounded-full bg-surface-2\", widths[index % widths.length])}\n />\n {table ? null : (\n <Skeleton\n className={cn(\n \"mt-2 h-3 rounded-full bg-surface-2\",\n catalog ? \"w-4/5\" : \"w-3/5\",\n )}\n />\n )}\n </div>\n </div>\n {catalog\n ? null\n : columns.map((column) => (\n <div key={column.id} className=\"hidden min-w-0 @[640px]/list:block\">\n {table ? null : <Skeleton className=\"h-2.5 w-12 rounded-full bg-surface-2\" />}\n <Skeleton\n className={cn(\"h-3 w-20 rounded-full bg-surface-2\", !table && \"mt-1.5\")}\n />\n </div>\n ))}\n {catalog ? null : <div />}\n </>\n );\n const rowClass = cn(\n \"min-w-0 items-center\",\n catalog && \"flex min-h-[76px] gap-3 px-3 py-3.5\",\n // One fixed height per list type: 64px resource rows (title plus one\n // secondary line; a title-only row centers in the same height).\n variant === \"resource\" && cn(SUBGRID, \"min-h-16 px-3 py-3\"),\n table && cn(SUBGRID, \"min-h-11 px-3 py-2\"),\n );\n return table ? (\n // oxlint-disable-next-line react/no-array-index-key -- identical placeholders\n <div key={index} role=\"row\" aria-hidden=\"true\" className={rowClass}>\n {inner}\n </div>\n ) : (\n // oxlint-disable-next-line react/no-array-index-key -- identical placeholders\n <li key={index} aria-hidden=\"true\" className={cn(!catalog && SUBGRID)}>\n <div className={rowClass}>{inner}</div>\n </li>\n );\n })}\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-W6KAUGXO.js";
8
8
  import {
9
9
  useMachines
10
- } from "./chunk-WWM7WVD2.js";
10
+ } from "./chunk-GABFKHQE.js";
11
11
  import {
12
12
  useOpenGeni
13
13
  } from "./chunk-TVQCDDSZ.js";
@@ -53,4 +53,4 @@ function useWorkspaceMachines(options = {}) {
53
53
  export {
54
54
  useWorkspaceMachines
55
55
  };
56
- //# sourceMappingURL=chunk-M7A226EQ.js.map
56
+ //# sourceMappingURL=chunk-UL44R3W2.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-TVQCDDSZ.js";
5
5
  import {
6
6
  useOpenGeniText
7
- } from "./chunk-S6WJ6TUT.js";
7
+ } from "./chunk-ZEVJGMNB.js";
8
8
 
9
9
  // src/realtime/session-realtime.ts
10
10
  import {
@@ -596,4 +596,4 @@ export {
596
596
  sessionRealtimeLifecycleIsActive,
597
597
  useRealtimeModelSelection
598
598
  };
599
- //# sourceMappingURL=chunk-GTR5NLVP.js.map
599
+ //# sourceMappingURL=chunk-VCRQPLKS.js.map
@@ -2,23 +2,23 @@
2
2
  import {
3
3
  ConnectMachineDialog,
4
4
  connectScopeFor
5
- } from "./chunk-4ICPJZAB.js";
5
+ } from "./chunk-LMYSYG6U.js";
6
6
  import {
7
7
  RowButton
8
8
  } from "./chunk-2LUBBDZV.js";
9
9
  import {
10
10
  ListRow,
11
11
  RowList
12
- } from "./chunk-MM7OKOTE.js";
13
- import {
14
- moveChatToMachine
15
- } from "./chunk-KVMFT6FN.js";
12
+ } from "./chunk-UBXHP224.js";
16
13
  import {
17
14
  useWorkspaceMachines
18
- } from "./chunk-M7A226EQ.js";
15
+ } from "./chunk-UL44R3W2.js";
16
+ import {
17
+ moveChatToMachine
18
+ } from "./chunk-3FL3F4WF.js";
19
19
  import {
20
20
  useDesktopThisComputer
21
- } from "./chunk-3MQM4ZOC.js";
21
+ } from "./chunk-3Y6ZR2VN.js";
22
22
  import {
23
23
  useAppApi
24
24
  } from "./chunk-L5HJ4UYB.js";
@@ -27,7 +27,7 @@ import {
27
27
  } from "./chunk-FQQEZUSN.js";
28
28
  import {
29
29
  t
30
- } from "./chunk-BPD4IJBG.js";
30
+ } from "./chunk-CG6CJMIS.js";
31
31
  import {
32
32
  hasWorkspacePermission
33
33
  } from "./chunk-FIDD34ZF.js";
@@ -48,14 +48,14 @@ import {
48
48
  } from "./chunk-CPLCSM6K.js";
49
49
  import {
50
50
  MACHINES_SESSION_POLL_MS
51
- } from "./chunk-WWM7WVD2.js";
51
+ } from "./chunk-GABFKHQE.js";
52
52
  import {
53
53
  SessionCapabilityFrame
54
- } from "./chunk-X7Z4B5GK.js";
54
+ } from "./chunk-KPL7EXS6.js";
55
55
  import {
56
56
  thisComputerNeedsPermissions,
57
57
  thisComputerReady
58
- } from "./chunk-BWKZEW6K.js";
58
+ } from "./chunk-4T3E56NT.js";
59
59
  import {
60
60
  machineDisplayName,
61
61
  machineScopeLabel
@@ -733,4 +733,4 @@ export {
733
733
  RepeatedMachineRequestNote,
734
734
  useAttachedChrome
735
735
  };
736
- //# sourceMappingURL=chunk-MHIYYHCL.js.map
736
+ //# sourceMappingURL=chunk-VJU3ET7N.js.map
@@ -1,15 +1,4 @@
1
1
  "use client";
2
- import {
3
- useDuplicateSite
4
- } from "./chunk-AT4K4F6S.js";
5
- import {
6
- ARTIFACT_ACCESS_REQUIRED
7
- } from "./chunk-LGP5R646.js";
8
- import {
9
- artifactExtension,
10
- readArtifactView,
11
- rememberArtifactView
12
- } from "./chunk-KV6VVKG5.js";
13
2
  import {
14
3
  ArtifactKindTile,
15
4
  ArtifactTypeIcon
@@ -18,14 +7,25 @@ import {
18
7
  FILE_AUDIENCE_COPY,
19
8
  useArtifactAudience
20
9
  } from "./chunk-WSLPZ43N.js";
10
+ import {
11
+ useDuplicateSite
12
+ } from "./chunk-AT4K4F6S.js";
21
13
  import {
22
14
  invalidateArtifactCatalog
23
15
  } from "./chunk-65KPI56R.js";
16
+ import {
17
+ ARTIFACT_ACCESS_REQUIRED
18
+ } from "./chunk-LGP5R646.js";
19
+ import {
20
+ artifactExtension,
21
+ readArtifactView,
22
+ rememberArtifactView
23
+ } from "./chunk-KV6VVKG5.js";
24
24
  import {
25
25
  ListRow,
26
26
  ListRowSkeleton,
27
27
  RowList
28
- } from "./chunk-MM7OKOTE.js";
28
+ } from "./chunk-UBXHP224.js";
29
29
  import {
30
30
  Toolbar,
31
31
  ToolbarFilterChips,
@@ -822,4 +822,4 @@ export {
822
822
  ArtifactCard,
823
823
  ArtifactLibrary
824
824
  };
825
- //# sourceMappingURL=chunk-RXMIXKB3.js.map
825
+ //# sourceMappingURL=chunk-WGJUARF3.js.map
@@ -1,4 +1,8 @@
1
1
  "use client";
2
+ import {
3
+ DRIVE_MCP_URL,
4
+ beginDriveConnect
5
+ } from "./chunk-X5XEYQ4B.js";
2
6
  import {
3
7
  beginIntegrationConnect,
4
8
  integrationClassFromDomain,
@@ -87,6 +91,23 @@ async function performCapabilityActionUntracked({
87
91
  "Existing connections could not be checked. Refresh and retry before saving credentials."
88
92
  );
89
93
  }
94
+ if (["oauth", "add_oauth_account", "reconnect_oauth"].includes(action.type) && (item.mcpUrl ?? item.endpointUrl) === DRIVE_MCP_URL) {
95
+ if (!("ownership" in action) || action.ownership !== "personal")
96
+ throw new Error("Google Drive connections must be personal-owned.");
97
+ const persisted2 = await persistIfRegistry(item, registry);
98
+ const target = new URL(returnPathFor(persisted2.id), connectReturnUrl ?? window.location.href);
99
+ const authorizationUrl = await beginDriveConnect({
100
+ client,
101
+ workspaceId,
102
+ itemId: persisted2.id,
103
+ returnUrl: target.toString(),
104
+ ...action.type === "reconnect_oauth" && action.connectionId ? { reconnectAccountId: action.connectionId } : {},
105
+ ...action.type === "reconnect_oauth" && action.connectionWorkspaceId ? { connectionWorkspaceId: action.connectionWorkspaceId } : {},
106
+ storage: window.sessionStorage
107
+ });
108
+ redirect(authorizationUrl);
109
+ return;
110
+ }
90
111
  if (action.type === "install_skill") {
91
112
  if (!canManageSkills) {
92
113
  throw new Error("You need permission to manage workspace documents to install Skills.");
@@ -355,4 +376,4 @@ function installedSkillVersion(item) {
355
376
  export {
356
377
  performCapabilityAction
357
378
  };
358
- //# sourceMappingURL=chunk-NWSAF6P5.js.map
379
+ //# sourceMappingURL=chunk-WJDH7CH5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/components/capabilities/perform-capability-action.tsx"],"sourcesContent":["import type { OpenGeniBrowserClient } from \"@opengeni/sdk/browser\";\nimport type { CapabilityCatalogItem, ConnectionMetadata, SkillUninstallPreview } from \"../../types\";\nimport type { ConnectAction } from \"./capability-detail-sheet\";\nimport {\n apiKeyConnectionRef,\n catalogConnectionAccountSelection,\n capabilityConnectPlan,\n connectionToReuseForApiKey,\n createInputFromCatalogItem,\n} from \"../../lib/capabilities\";\nimport {\n beginIntegrationConnect,\n integrationClassFromDomain,\n integrationConnectErrorOutcome,\n type IntegrationClass,\n type IntegrationConnectMethod,\n} from \"../../lib/integration-connect-analytics\";\nimport { beginDriveConnect, DRIVE_MCP_URL } from \"../../lib/drive-connect-return\";\nimport { startMcpOAuthWithTimeout } from \"../../lib/mcp-oauth\";\nimport { toast } from \"../../lib/toast\";\n\ntype PerformCapabilityActionOptions = Parameters<typeof performCapabilityActionUntracked>[0];\n\nconst CONNECT_JOURNEY_METHODS: Partial<Record<ConnectAction[\"type\"], IntegrationConnectMethod>> = {\n oauth: \"oauth\",\n reconnect_oauth: \"oauth\",\n add_oauth_account: \"oauth\",\n social_oauth: \"oauth\",\n fiken_oauth: \"oauth\",\n api_key: \"api_key\",\n reconnect_api_key: \"api_key\",\n fiken_api_token: \"api_key\",\n};\n\n/** The closed provider class of a catalog connect, never its domain or id. */\nfunction connectJourneyClass(item: CapabilityCatalogItem, action: ConnectAction): IntegrationClass {\n if (action.type === \"social_oauth\") return action.provider === \"x\" ? \"x\" : \"other\";\n if (action.type === \"fiken_oauth\" || action.type === \"fiken_api_token\") return \"other\";\n const plan = capabilityConnectPlan(item);\n return integrationClassFromDomain(\n (\"providerDomain\" in plan ? plan.providerDomain : null) ||\n item.connectionRef?.providerDomain ||\n item.mcpUrl ||\n item.endpointUrl,\n );\n}\n\n/**\n * One connection lifecycle for catalog sheets and conversation cards, with\n * the consent-gated connect journey around every credential or OAuth action.\n */\nexport async function performCapabilityAction(\n options: PerformCapabilityActionOptions,\n action: ConnectAction,\n): Promise<void> {\n const method = CONNECT_JOURNEY_METHODS[action.type];\n if (!method) return await performCapabilityActionUntracked(options, action);\n const journey = beginIntegrationConnect(connectJourneyClass(options.item, action), method);\n let redirected = false;\n try {\n await performCapabilityActionUntracked(\n {\n ...options,\n redirect: (url) => {\n redirected = true;\n // An exact-return Connect redirect comes back without outcome parameters.\n journey.redirecting({\n returnsWithOutcome: !(action.type === \"social_oauth\" && options.connectReturnUrl),\n });\n options.redirect(url);\n },\n },\n action,\n );\n if (!redirected) journey.finish(\"connected\");\n } catch (error) {\n journey.finish(integrationConnectErrorOutcome(error));\n throw error;\n }\n}\n\n/** One connection lifecycle for catalog sheets and conversation cards. The caller\n * resolves the live item and owns busy/error state; credentials never enter chat. */\nasync function performCapabilityActionUntracked(\n {\n client,\n workspaceId,\n item,\n registry = false,\n connections,\n canManageSkills,\n refresh,\n onRuntimeChanged,\n onComplete,\n onSkillRemoval,\n returnPathFor,\n connectReturnUrl,\n redirect,\n }: {\n client: OpenGeniBrowserClient;\n workspaceId: string;\n item: CapabilityCatalogItem;\n registry?: boolean | undefined;\n connections: ConnectionMetadata[] | null;\n canManageSkills: boolean;\n refresh: () => Promise<unknown>;\n onRuntimeChanged: () => void;\n onComplete: () => void | Promise<void>;\n onSkillRemoval: (value: {\n item: CapabilityCatalogItem;\n preview: SkillUninstallPreview;\n }) => void;\n returnPathFor: (id: string) => string;\n /** Exact-return Connect surfaces; conversation cards retain their native\n * callback parameters for completing session tool selection. */\n connectReturnUrl?: string | undefined;\n redirect: (url: string) => void;\n },\n action: ConnectAction,\n): Promise<void> {\n if (action.item !== item) throw new Error(\"The selected capability changed. Review it again.\");\n async function persistIfRegistry(candidate: CapabilityCatalogItem, fromRegistry: boolean) {\n return fromRegistry\n ? client.createCapability(workspaceId, createInputFromCatalogItem(candidate))\n : candidate;\n }\n // The plan is derived from the current catalog/registry item (it carries\n // authKind/mcpUrl/providerDomain); connect calls use the persisted id.\n const plan = capabilityConnectPlan(item);\n if ((action.type === \"api_key\" || action.type === \"reconnect_api_key\") && connections === null) {\n throw new Error(\n \"Existing connections could not be checked. Refresh and retry before saving credentials.\",\n );\n }\n\n // The built-in Drive action uses a server-owned Connect provider identity.\n // Custom MCP requests continue through the generic OAuth route below.\n if (\n [\"oauth\", \"add_oauth_account\", \"reconnect_oauth\"].includes(action.type) &&\n (item.mcpUrl ?? item.endpointUrl) === DRIVE_MCP_URL\n ) {\n if (!(\"ownership\" in action) || action.ownership !== \"personal\")\n throw new Error(\"Google Drive connections must be personal-owned.\");\n const persisted = await persistIfRegistry(item, registry);\n const target = new URL(returnPathFor(persisted.id), connectReturnUrl ?? window.location.href);\n const authorizationUrl = await beginDriveConnect({\n client,\n workspaceId,\n itemId: persisted.id,\n returnUrl: target.toString(),\n ...(action.type === \"reconnect_oauth\" && action.connectionId\n ? { reconnectAccountId: action.connectionId }\n : {}),\n ...(action.type === \"reconnect_oauth\" && action.connectionWorkspaceId\n ? { connectionWorkspaceId: action.connectionWorkspaceId }\n : {}),\n storage: window.sessionStorage,\n });\n redirect(authorizationUrl);\n return;\n }\n\n if (action.type === \"install_skill\") {\n if (!canManageSkills) {\n throw new Error(\"You need permission to manage workspace documents to install Skills.\");\n }\n const libraryId = metadataString(item.metadata.libraryId);\n const expectedVersion = metadataString(item.metadata.version);\n const expectedContentSha256 = metadataString(item.metadata.contentSha256);\n if (!libraryId || !expectedVersion || !expectedContentSha256) {\n throw new Error(\n \"This Skill is missing its reviewed library identity. Refresh and try again.\",\n );\n }\n const installationVersion = installedSkillVersion(item);\n const installed = await client.installLibrarySkill(workspaceId, libraryId, {\n expectedVersion,\n expectedContentSha256,\n ...(installationVersion !== null ? { expectedInstallationVersion: installationVersion } : {}),\n });\n await refresh();\n onRuntimeChanged();\n if (installed.skillReceipt?.outcome === \"pending\") {\n throw new Error(\"This Skill is awaiting review and has not been activated.\");\n }\n await onComplete();\n toast.success(item.enabled ? `Updated ${item.name}` : `Installed ${item.name}`, {\n description:\n installed.skillReceipt?.outcome === \"preserved\"\n ? \"Your customized Skill was preserved.\"\n : `Pinned to reviewed Skill version ${expectedVersion}.`,\n });\n return;\n }\n\n if (action.type === \"remove_skill\") {\n if (!canManageSkills) {\n throw new Error(\"Workspace administrator permission is required to remove Skills.\");\n }\n const preview = await client.previewSkillUninstall(workspaceId, item.id);\n if (!preview.installed || preview.installationVersion === null || !preview.directOwner) {\n throw new Error(\"This Skill is no longer directly installed. Refresh and try again.\");\n }\n onSkillRemoval({ item, preview });\n return;\n }\n\n if (action.type === \"disconnect\") {\n if (item.kind !== \"mcp\" || !item.actions.includes(\"disconnect\")) {\n throw new Error(`${item.name} must be managed through its dedicated controls.`);\n }\n await client.disableCapability(workspaceId, item.id);\n await refresh();\n onRuntimeChanged();\n await onComplete();\n toast.success(`Turned off ${item.name} for this workspace`, {\n description: \"Connected accounts are kept.\",\n });\n return;\n }\n\n if (action.type === \"social_oauth\" && plan.mode === \"social_oauth\") {\n if (connectReturnUrl) {\n const response = await client.beginConnect(workspaceId, {\n providerId: action.provider,\n ownership: action.ownership,\n returnUrl: connectReturnUrl,\n idempotencyKey: crypto.randomUUID(),\n });\n if (response.nextAction.type !== \"authorize\") {\n throw new Error(\"The provider did not return an authorization link.\");\n }\n redirect(response.nextAction.url);\n return;\n }\n const returnPath = returnPathFor(item.id);\n const response = await client.startSocialOAuth(workspaceId, {\n provider: action.provider,\n ownership: action.ownership,\n returnPath,\n });\n if (!response.authorizationUrl) {\n throw new Error(\"The provider did not return an authorization link.\");\n }\n redirect(response.authorizationUrl);\n return;\n }\n\n if (action.type === \"disconnect_social\") {\n await client.disconnectSocialConnection(workspaceId, action.connectionId);\n await refresh();\n await onComplete();\n toast.success(`Disconnected ${item.name}`);\n return;\n }\n\n // First-party Fiken connect / token replacement. The install route\n // verifies the token against Fiken before storing it, so a bad paste\n // fails here with a specific message instead of at first tool use.\n if (action.type === \"fiken_api_token\") {\n await client.installFikenConnection(workspaceId, {\n apiToken: action.apiToken,\n ...(action.connectionId ? { connectionId: action.connectionId } : {}),\n });\n await refresh();\n onRuntimeChanged();\n await onComplete();\n toast.success(`Connected ${item.name}`);\n return;\n }\n\n // Full-page redirect into Fiken's consent screen; the API callback\n // stores the workspace connection and returns to this page with a\n // `fiken` query param handled by the return effect below.\n if (action.type === \"fiken_oauth\") {\n const response = await client.startFikenOAuth(workspaceId, {\n returnPath: returnPathFor(item.id),\n ...(action.connectionId ? { connectionId: action.connectionId } : {}),\n });\n if (!response.authorizationUrl) {\n throw new Error(\"Fiken did not return an authorization link.\");\n }\n redirect(response.authorizationUrl);\n return;\n }\n\n if (action.type === \"fiken_disconnect\") {\n await client.deleteConnection(workspaceId, action.connectionId);\n await refresh();\n onRuntimeChanged();\n await onComplete();\n toast.success(`Disconnected ${item.name}`);\n return;\n }\n\n // Reconnect an already-enabled item whose credential lapsed. When the\n // connection row survives, OAuth reuses it (pass connectionId) and the\n // return handler just refreshes; when it was deleted (null id), OAuth\n // mints a fresh row and the return handler re-enables against it. API-key\n // reactivates the surviving row in place, or mints + re-enables if gone.\n if (action.type === \"reconnect_oauth\") {\n // Trust the installation's connectionRef.kind (the sheet already chose this\n // branch from it), not the catalog plan - on drift plan.mode can read\n // \"enable\", so fall back to the ref's domain and the item's own MCP URL.\n const providerDomain =\n plan.mode === \"oauth\" ? plan.providerDomain : (item.connectionRef?.providerDomain ?? null);\n const mcpUrl = plan.mode === \"oauth\" ? plan.mcpUrl : (item.mcpUrl ?? item.endpointUrl ?? null);\n const returnPath = returnPathFor(item.id);\n const response = await startMcpOAuthWithTimeout(\n client,\n action.connectionWorkspaceId ?? workspaceId,\n {\n ...(mcpUrl ? { mcpUrl } : {}),\n ...(providerDomain ? { providerDomain } : {}),\n // Reuse the existing row when it survives; a null id means the row was\n // deleted, so OAuth mints a fresh connection and the return handler\n // re-enables against it.\n ...(action.connectionId ? { connectionId: action.connectionId } : {}),\n ownership: action.ownership,\n returnPath,\n },\n );\n if (!response.authorizationUrl) {\n throw new Error(\"The provider did not return an authorization link.\");\n }\n redirect(response.authorizationUrl);\n return;\n }\n\n if (action.type === \"add_oauth_account\") {\n const providerDomain =\n plan.mode === \"oauth\" ? plan.providerDomain : (item.connectionRef?.providerDomain ?? null);\n const mcpUrl = plan.mode === \"oauth\" ? plan.mcpUrl : (item.mcpUrl ?? item.endpointUrl ?? null);\n if (!mcpUrl) throw new Error(`${item.name} has no sign-in endpoint.`);\n const response = await startMcpOAuthWithTimeout(client, workspaceId, {\n mcpUrl,\n ...(providerDomain ? { providerDomain } : {}),\n newAccount: true,\n ownership: action.ownership,\n returnPath: returnPathFor(item.id),\n });\n if (!response.authorizationUrl) {\n throw new Error(\"The provider did not return an authorization link.\");\n }\n redirect(response.authorizationUrl);\n return;\n }\n\n if (action.type === \"remove_connection\") {\n // The account's own workspace owns the row (a personal account can come\n // from another workspace); the API re-checks ownership and permission.\n await client.deleteConnection(action.connection.workspaceId, action.connection.id);\n await refresh();\n onRuntimeChanged();\n await onComplete();\n toast.success(`Removed the ${item.name} account`);\n return;\n }\n\n if (action.type === \"reconnect_api_key\") {\n if (action.connectionId) {\n // The existing row went inactive - rewrite its credential and\n // reactivate it in place; the installation ref already points at it.\n await client.updateConnection(workspaceId, action.connectionId, {\n credential: { headers: action.headers },\n status: \"active\",\n });\n } else {\n // The row was deleted - mint a fresh connection and re-enable the\n // installation against it (enable upserts the installation config). Domain\n // comes from the plan, or the installation's ref when the catalog drifted.\n const providerDomain =\n plan.mode === \"api_key\" ? plan.providerDomain : (item.connectionRef?.providerDomain ?? \"\");\n const connection = await client.createConnection(workspaceId, {\n providerDomain,\n kind: \"api_key\",\n ownership: action.ownership,\n credential: { headers: action.headers },\n });\n await client.enableCapability(workspaceId, item.id, {\n connectionRef: apiKeyConnectionRef(\n action.ownership,\n connection.id,\n connection.providerDomain,\n catalogConnectionAccountSelection(item),\n ),\n });\n }\n await refresh();\n onRuntimeChanged();\n await onComplete();\n toast.success(`Reconnected ${item.name}`);\n return;\n }\n\n if (item.kind !== \"mcp\") {\n throw new Error(`${item.name} must be installed through its dedicated controls.`);\n }\n const persisted = await persistIfRegistry(item, registry);\n\n if (action.type === \"oauth\" && plan.mode === \"oauth\") {\n const returnPath = returnPathFor(persisted.id);\n const response = await startMcpOAuthWithTimeout(client, workspaceId, {\n ...(plan.mcpUrl ? { mcpUrl: plan.mcpUrl } : {}),\n ...(plan.providerDomain ? { providerDomain: plan.providerDomain } : {}),\n ownership: action.ownership,\n returnPath,\n });\n if (!response.authorizationUrl) {\n throw new Error(\"The provider did not return an authorization link.\");\n }\n // Full-page redirect into the provider's consent screen; we return to\n // returnPath and resume in the OAuth-return effect below.\n redirect(response.authorizationUrl);\n return;\n }\n\n if (action.type === \"api_key\" && plan.mode === \"api_key\") {\n // Reuse only a connection with the selected ownership rather than creating\n // a duplicate on retry; workspace and personal rows never cross-reuse.\n const reuseId = connectionToReuseForApiKey(\n item,\n connections ?? [],\n plan.providerDomain,\n action.ownership,\n );\n const connection = reuseId\n ? await client.updateConnection(workspaceId, reuseId, {\n credential: { headers: action.headers },\n status: \"active\",\n })\n : await client.createConnection(workspaceId, {\n providerDomain: plan.providerDomain,\n kind: \"api_key\",\n ownership: action.ownership,\n credential: { headers: action.headers },\n });\n // Build the enable ref from the connection row the API returns, never the\n // catalog domain - the API may canonicalize providerDomain, and the row\n // is the authoritative match the enable path validates against.\n await client.enableCapability(workspaceId, persisted.id, {\n connectionRef: apiKeyConnectionRef(\n action.ownership,\n connection.id,\n connection.providerDomain,\n catalogConnectionAccountSelection(item),\n ),\n });\n await refresh();\n onRuntimeChanged();\n await onComplete();\n toast.success(`Connected and enabled ${persisted.name}`);\n return;\n }\n\n // A stale form must not fall through from a credentialed action to enable.\n if (action.type !== \"enable\" || plan.mode !== \"enable\") {\n throw new Error(\n \"The connection requirements changed. Close this form and review the current setup.\",\n );\n }\n // Plain enable (no credentials).\n await client.enableCapability(workspaceId, persisted.id);\n await refresh();\n if (persisted.kind === \"mcp\") onRuntimeChanged();\n await onComplete();\n toast.success(`Enabled ${persisted.name}`);\n}\n\nfunction metadataString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nfunction installedSkillVersion(item: CapabilityCatalogItem): number | null {\n const installedSkill = item.metadata.installedSkill;\n if (!installedSkill || typeof installedSkill !== \"object\" || Array.isArray(installedSkill)) {\n return null;\n }\n const value = (installedSkill as Record<string, unknown>).installationVersion;\n return typeof value === \"number\" && Number.isInteger(value) && value > 0 ? value : null;\n}\n"],"mappings":"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","names":["persisted","response"]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-IIFO2H3P.js";
5
5
  import {
6
6
  t
7
- } from "./chunk-BPD4IJBG.js";
7
+ } from "./chunk-CG6CJMIS.js";
8
8
  import {
9
9
  buildTimeline
10
10
  } from "./chunk-6MRY2RUZ.js";
@@ -298,4 +298,4 @@ export {
298
298
  sandboxProvisionInFlight,
299
299
  eventLabel
300
300
  };
301
- //# sourceMappingURL=chunk-LG67ZNRU.js.map
301
+ //# sourceMappingURL=chunk-WK2ZCTUF.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-XVVJBNUQ.js";
5
5
  import {
6
6
  scheduledTaskIdOf
7
- } from "./chunk-CPKD2YGK.js";
7
+ } from "./chunk-RNU5CUPI.js";
8
8
  import {
9
9
  sessionSiteOrigin
10
10
  } from "./chunk-K3TJNJSU.js";
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-E36IC3LU.js";
14
14
  import {
15
15
  t
16
- } from "./chunk-BPD4IJBG.js";
16
+ } from "./chunk-CG6CJMIS.js";
17
17
  import {
18
18
  formatAbsoluteTime,
19
19
  inSentence
@@ -196,4 +196,4 @@ export {
196
196
  sessionHoverFacts,
197
197
  sessionHoverDescription
198
198
  };
199
- //# sourceMappingURL=chunk-XGE75VPK.js.map
199
+ //# sourceMappingURL=chunk-WNARM3LY.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  capabilityLogoFallback
4
- } from "./chunk-IWIMIRV3.js";
4
+ } from "./chunk-OSJTLQXA.js";
5
5
 
6
6
  // src/app/components/capabilities/capability-logo-source.tsx
7
7
  var FIRST_PARTY_CAPABILITY_LOGOS = {
@@ -21,4 +21,4 @@ export {
21
21
  FIRST_PARTY_CAPABILITY_LOGOS,
22
22
  capabilityLogoSource
23
23
  };
24
- //# sourceMappingURL=chunk-RNBH5TSM.js.map
24
+ //# sourceMappingURL=chunk-WQ2RTQYO.js.map
@@ -0,0 +1,84 @@
1
+ "use client";
2
+
3
+ // src/app/lib/drive-connect-return.tsx
4
+ var DRIVE_MCP_URL = "https://drivemcp.googleapis.com/mcp/v1";
5
+ var DRIVE_CONNECT_RETURN_PARAM = "drive_connect_return";
6
+ var storageKey = (workspaceId) => `opengeni.drive-connect.v1:${workspaceId}`;
7
+ async function beginDriveConnect(input) {
8
+ const nonce = crypto.randomUUID();
9
+ const returnUrl = new URL(input.returnUrl);
10
+ returnUrl.searchParams.set(DRIVE_CONNECT_RETURN_PARAM, nonce);
11
+ const connectionWorkspaceId = input.connectionWorkspaceId ?? input.workspaceId;
12
+ const created = await input.client.beginConnect(connectionWorkspaceId, {
13
+ providerId: "google-drive",
14
+ ownership: "personal",
15
+ returnUrl: returnUrl.toString(),
16
+ idempotencyKey: crypto.randomUUID(),
17
+ ...input.reconnectAccountId ? { reconnectAccountId: input.reconnectAccountId } : {}
18
+ });
19
+ if (created.state !== "credential_input")
20
+ throw new Error("Google Drive setup did not start. Try again.");
21
+ const attempt = await input.client.connectTransport().advance(connectionWorkspaceId, created.id, {
22
+ expectedRevision: created.revision,
23
+ idempotencyKey: crypto.randomUUID(),
24
+ action: { type: "credentials", values: {} }
25
+ });
26
+ if (attempt.nextAction.type !== "authorize")
27
+ throw new Error(attempt.error?.message ?? "Google Drive did not return an authorization link.");
28
+ input.storage.setItem(
29
+ storageKey(input.workspaceId),
30
+ JSON.stringify({
31
+ nonce,
32
+ attemptId: attempt.id,
33
+ connectionWorkspaceId,
34
+ itemId: input.itemId
35
+ })
36
+ );
37
+ return attempt.nextAction.url;
38
+ }
39
+ async function resolveDriveConnectReturn(input) {
40
+ const key = storageKey(input.workspaceId);
41
+ const raw = input.storage.getItem(key);
42
+ let receipt;
43
+ try {
44
+ receipt = JSON.parse(raw ?? "null");
45
+ if (!receipt || receipt.nonce !== input.nonce || ![receipt.attemptId, receipt.connectionWorkspaceId, receipt.itemId].every(
46
+ (value) => typeof value === "string" && value.length > 0 && value.length <= 4096
47
+ ))
48
+ throw new Error();
49
+ } catch {
50
+ throw new Error(
51
+ "The Google Drive setup return could not be matched. Open Drive to check your connection."
52
+ );
53
+ }
54
+ const attempt = await input.client.connectTransport().get(receipt.connectionWorkspaceId, receipt.attemptId);
55
+ if (attempt.id !== receipt.attemptId || attempt.providerId !== "google-drive" || attempt.ownership !== "personal") {
56
+ throw new Error("The Google Drive setup account changed. Open Drive to try again.");
57
+ }
58
+ if (["failed", "expired", "cancelled"].includes(attempt.state)) {
59
+ input.storage.removeItem(key);
60
+ throw new Error(
61
+ attempt.error?.message ?? "Google Drive connection was not completed. Open Drive to try again."
62
+ );
63
+ }
64
+ if (attempt.state !== "complete" || !attempt.credentialsCommitted || attempt.account?.providerId !== "google-drive" || attempt.account.ownership !== "personal" || !attempt.account.id) {
65
+ throw new Error("Google Drive setup is still incomplete. Reload to check it again.");
66
+ }
67
+ return { itemId: receipt.itemId, connectionId: attempt.account.id };
68
+ }
69
+ function completeDriveConnectReturn(workspaceId, nonce, storage) {
70
+ const key = storageKey(workspaceId);
71
+ try {
72
+ if (JSON.parse(storage.getItem(key) ?? "null")?.nonce === nonce) storage.removeItem(key);
73
+ } catch {
74
+ }
75
+ }
76
+
77
+ export {
78
+ DRIVE_MCP_URL,
79
+ DRIVE_CONNECT_RETURN_PARAM,
80
+ beginDriveConnect,
81
+ resolveDriveConnectReturn,
82
+ completeDriveConnectReturn
83
+ };
84
+ //# sourceMappingURL=chunk-X5XEYQ4B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/lib/drive-connect-return.tsx"],"sourcesContent":["import type { OpenGeniBrowserClient } from \"@opengeni/sdk/browser\";\n\nexport const DRIVE_MCP_URL = \"https://drivemcp.googleapis.com/mcp/v1\";\nexport const DRIVE_CONNECT_RETURN_PARAM = \"drive_connect_return\";\nconst storageKey = (workspaceId: string) => `opengeni.drive-connect.v1:${workspaceId}`;\ntype Receipt = { nonce: string; attemptId: string; connectionWorkspaceId: string; itemId: string };\ntype Storage = Pick<globalThis.Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\n\n/** Browser state is only a locator. Completion and the account come from Connect. */\nexport async function beginDriveConnect(input: {\n client: Pick<OpenGeniBrowserClient, \"beginConnect\" | \"connectTransport\">;\n workspaceId: string;\n connectionWorkspaceId?: string;\n itemId: string;\n reconnectAccountId?: string;\n returnUrl: string;\n storage: Storage;\n}): Promise<string> {\n const nonce = crypto.randomUUID();\n const returnUrl = new URL(input.returnUrl);\n returnUrl.searchParams.set(DRIVE_CONNECT_RETURN_PARAM, nonce);\n const connectionWorkspaceId = input.connectionWorkspaceId ?? input.workspaceId;\n const created = await input.client.beginConnect(connectionWorkspaceId, {\n providerId: \"google-drive\",\n ownership: \"personal\",\n returnUrl: returnUrl.toString(),\n idempotencyKey: crypto.randomUUID(),\n ...(input.reconnectAccountId ? { reconnectAccountId: input.reconnectAccountId } : {}),\n });\n if (created.state !== \"credential_input\")\n throw new Error(\"Google Drive setup did not start. Try again.\");\n const attempt = await input.client.connectTransport().advance(connectionWorkspaceId, created.id, {\n expectedRevision: created.revision,\n idempotencyKey: crypto.randomUUID(),\n action: { type: \"credentials\", values: {} },\n });\n if (attempt.nextAction.type !== \"authorize\")\n throw new Error(attempt.error?.message ?? \"Google Drive did not return an authorization link.\");\n input.storage.setItem(\n storageKey(input.workspaceId),\n JSON.stringify({\n nonce,\n attemptId: attempt.id,\n connectionWorkspaceId,\n itemId: input.itemId,\n } satisfies Receipt),\n );\n return attempt.nextAction.url;\n}\n\nexport async function resolveDriveConnectReturn(input: {\n client: Pick<OpenGeniBrowserClient, \"connectTransport\">;\n workspaceId: string;\n nonce: string;\n storage: Storage;\n}): Promise<{ itemId: string; connectionId: string }> {\n const key = storageKey(input.workspaceId);\n const raw = input.storage.getItem(key);\n let receipt: Receipt;\n try {\n receipt = JSON.parse(raw ?? \"null\");\n if (\n !receipt ||\n receipt.nonce !== input.nonce ||\n ![receipt.attemptId, receipt.connectionWorkspaceId, receipt.itemId].every(\n (value) => typeof value === \"string\" && value.length > 0 && value.length <= 4096,\n )\n )\n throw new Error();\n } catch {\n throw new Error(\n \"The Google Drive setup return could not be matched. Open Drive to check your connection.\",\n );\n }\n const attempt = await input.client\n .connectTransport()\n .get(receipt.connectionWorkspaceId, receipt.attemptId);\n if (\n attempt.id !== receipt.attemptId ||\n attempt.providerId !== \"google-drive\" ||\n attempt.ownership !== \"personal\"\n ) {\n throw new Error(\"The Google Drive setup account changed. Open Drive to try again.\");\n }\n if ([\"failed\", \"expired\", \"cancelled\"].includes(attempt.state)) {\n input.storage.removeItem(key);\n throw new Error(\n attempt.error?.message ??\n \"Google Drive connection was not completed. Open Drive to try again.\",\n );\n }\n if (\n attempt.state !== \"complete\" ||\n !attempt.credentialsCommitted ||\n attempt.account?.providerId !== \"google-drive\" ||\n attempt.account.ownership !== \"personal\" ||\n !attempt.account.id\n ) {\n throw new Error(\"Google Drive setup is still incomplete. Reload to check it again.\");\n }\n return { itemId: receipt.itemId, connectionId: attempt.account.id };\n}\n\n/** Clear only after the UI has finished enabling; never consume a newer attempt. */\nexport function completeDriveConnectReturn(\n workspaceId: string,\n nonce: string,\n storage: Storage,\n): void {\n const key = storageKey(workspaceId);\n try {\n if (JSON.parse(storage.getItem(key) ?? \"null\")?.nonce === nonce) storage.removeItem(key);\n } catch {\n /* An absent or replaced browser locator grants no authority. */\n }\n}\n"],"mappings":";;;AAEO,IAAM,gBAAgB;AACtB,IAAM,6BAA6B;AAC1C,IAAM,aAAa,CAAC,gBAAwB,6BAA6B,WAAW;AAKpF,eAAsB,kBAAkB,OAQpB;AAClB,QAAM,QAAQ,OAAO,WAAW;AAChC,QAAM,YAAY,IAAI,IAAI,MAAM,SAAS;AACzC,YAAU,aAAa,IAAI,4BAA4B,KAAK;AAC5D,QAAM,wBAAwB,MAAM,yBAAyB,MAAM;AACnE,QAAM,UAAU,MAAM,MAAM,OAAO,aAAa,uBAAuB;AAAA,IACrE,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,WAAW,UAAU,SAAS;AAAA,IAC9B,gBAAgB,OAAO,WAAW;AAAA,IAClC,GAAI,MAAM,qBAAqB,EAAE,oBAAoB,MAAM,mBAAmB,IAAI,CAAC;AAAA,EACrF,CAAC;AACD,MAAI,QAAQ,UAAU;AACpB,UAAM,IAAI,MAAM,8CAA8C;AAChE,QAAM,UAAU,MAAM,MAAM,OAAO,iBAAiB,EAAE,QAAQ,uBAAuB,QAAQ,IAAI;AAAA,IAC/F,kBAAkB,QAAQ;AAAA,IAC1B,gBAAgB,OAAO,WAAW;AAAA,IAClC,QAAQ,EAAE,MAAM,eAAe,QAAQ,CAAC,EAAE;AAAA,EAC5C,CAAC;AACD,MAAI,QAAQ,WAAW,SAAS;AAC9B,UAAM,IAAI,MAAM,QAAQ,OAAO,WAAW,oDAAoD;AAChG,QAAM,QAAQ;AAAA,IACZ,WAAW,MAAM,WAAW;AAAA,IAC5B,KAAK,UAAU;AAAA,MACb;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,QAAQ,MAAM;AAAA,IAChB,CAAmB;AAAA,EACrB;AACA,SAAO,QAAQ,WAAW;AAC5B;AAEA,eAAsB,0BAA0B,OAKM;AACpD,QAAM,MAAM,WAAW,MAAM,WAAW;AACxC,QAAM,MAAM,MAAM,QAAQ,QAAQ,GAAG;AACrC,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,OAAO,MAAM;AAClC,QACE,CAAC,WACD,QAAQ,UAAU,MAAM,SACxB,CAAC,CAAC,QAAQ,WAAW,QAAQ,uBAAuB,QAAQ,MAAM,EAAE;AAAA,MAClE,CAAC,UAAU,OAAO,UAAU,YAAY,MAAM,SAAS,KAAK,MAAM,UAAU;AAAA,IAC9E;AAEA,YAAM,IAAI,MAAM;AAAA,EACpB,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,MAAM,MAAM,OACzB,iBAAiB,EACjB,IAAI,QAAQ,uBAAuB,QAAQ,SAAS;AACvD,MACE,QAAQ,OAAO,QAAQ,aACvB,QAAQ,eAAe,kBACvB,QAAQ,cAAc,YACtB;AACA,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AACA,MAAI,CAAC,UAAU,WAAW,WAAW,EAAE,SAAS,QAAQ,KAAK,GAAG;AAC9D,UAAM,QAAQ,WAAW,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR,QAAQ,OAAO,WACb;AAAA,IACJ;AAAA,EACF;AACA,MACE,QAAQ,UAAU,cAClB,CAAC,QAAQ,wBACT,QAAQ,SAAS,eAAe,kBAChC,QAAQ,QAAQ,cAAc,cAC9B,CAAC,QAAQ,QAAQ,IACjB;AACA,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,SAAO,EAAE,QAAQ,QAAQ,QAAQ,cAAc,QAAQ,QAAQ,GAAG;AACpE;AAGO,SAAS,2BACd,aACA,OACA,SACM;AACN,QAAM,MAAM,WAAW,WAAW;AAClC,MAAI;AACF,QAAI,KAAK,MAAM,QAAQ,QAAQ,GAAG,KAAK,MAAM,GAAG,UAAU,MAAO,SAAQ,WAAW,GAAG;AAAA,EACzF,QAAQ;AAAA,EAER;AACF;","names":[]}
@@ -17,7 +17,7 @@ import {
17
17
  ListRow,
18
18
  ListRowSkeleton,
19
19
  RowList
20
- } from "./chunk-MM7OKOTE.js";
20
+ } from "./chunk-UBXHP224.js";
21
21
  import {
22
22
  clearGitHubInstallRequest,
23
23
  readGitHubInstallRequest,
@@ -25,7 +25,7 @@ import {
25
25
  } from "./chunk-PVNI2KHS.js";
26
26
  import {
27
27
  capabilityLogoSource
28
- } from "./chunk-RNBH5TSM.js";
28
+ } from "./chunk-WQ2RTQYO.js";
29
29
  import {
30
30
  cn
31
31
  } from "./chunk-A3MTTRCX.js";
@@ -61,7 +61,7 @@ import {
61
61
  } from "./chunk-HMU5IELG.js";
62
62
  import {
63
63
  SessionCapabilityFrame
64
- } from "./chunk-X7Z4B5GK.js";
64
+ } from "./chunk-KPL7EXS6.js";
65
65
 
66
66
  // src/app/components/capabilities/session-github-card.tsx
67
67
  import { ArrowUpRightIcon, BookMarkedIcon, CheckIcon, Loader2Icon, LockIcon } from "lucide-react";
@@ -740,4 +740,4 @@ function repositoryGroups(rows, accountLabel) {
740
740
  export {
741
741
  SessionGitHubCapabilityCard
742
742
  };
743
- //# sourceMappingURL=chunk-W57QFLQD.js.map
743
+ //# sourceMappingURL=chunk-X6JIGNLI.js.map
@@ -20,7 +20,7 @@ import {
20
20
  import {
21
21
  OpenGeniMessagesProvider,
22
22
  useOpenGeniText
23
- } from "./chunk-S6WJ6TUT.js";
23
+ } from "./chunk-ZEVJGMNB.js";
24
24
 
25
25
  // src/provider.tsx
26
26
  import {
@@ -384,4 +384,4 @@ function reloadForContractMismatchOnce(mismatch) {
384
384
  export {
385
385
  OpenGeniProvider
386
386
  };
387
- //# sourceMappingURL=chunk-CKA4SJRK.js.map
387
+ //# sourceMappingURL=chunk-XIQDCQX7.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-CM7LVUKC.js";
5
5
  import {
6
6
  useOpenGeniText
7
- } from "./chunk-S6WJ6TUT.js";
7
+ } from "./chunk-ZEVJGMNB.js";
8
8
 
9
9
  // src/components/queue-surface-state.tsx
10
10
  import { Loader2Icon, RotateCwIcon } from "lucide-react";
@@ -100,4 +100,4 @@ export {
100
100
  QueueStoppingStatus,
101
101
  QueueErrorAlert
102
102
  };
103
- //# sourceMappingURL=chunk-AJ7PY4FJ.js.map
103
+ //# sourceMappingURL=chunk-Y3GCG6CA.js.map