@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
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  BillingClassMark,
4
4
  PickerNavRow
5
- } from "./chunk-ZWACUOU5.js";
5
+ } from "./chunk-CDBGAAJY.js";
6
6
  import {
7
7
  MENU_CHECK_CLASS,
8
8
  MENU_LABEL_CLASS,
@@ -30,7 +30,7 @@ import {
30
30
  } from "./chunk-TXS65BB2.js";
31
31
  import {
32
32
  useOpenGeniText
33
- } from "./chunk-S6WJ6TUT.js";
33
+ } from "./chunk-ZEVJGMNB.js";
34
34
 
35
35
  // src/components/model-policy-picker-menu.tsx
36
36
  import { ArrowRightIcon, CheckIcon, SearchIcon, ZapIcon } from "lucide-react";
@@ -154,7 +154,14 @@ function ModelPolicyPickerMenu(props) {
154
154
  group.billingClass
155
155
  )),
156
156
  view.matchCount === 0 ? /* @__PURE__ */ jsx("p", { className: MENU_NOTE_CLASS, children: view.searching ? messages.noMatches : messages.noModels }) : null
157
- ] }) : props.connectModelsHref || rows.length > 0 ? /* @__PURE__ */ jsx(ConnectModelsPanel, { href: props.connectModelsHref, messages }) : /* @__PURE__ */ jsx("p", { className: MENU_NOTE_CLASS, children: messages.noModels })
157
+ ] }) : props.connectModelsHref || rows.length > 0 ? /* @__PURE__ */ jsx(
158
+ ConnectModelsPanel,
159
+ {
160
+ href: props.connectModelsHref,
161
+ claude: props.claudeSubscriptionAvailable === true,
162
+ messages
163
+ }
164
+ ) : /* @__PURE__ */ jsx("p", { className: MENU_NOTE_CLASS, children: messages.noModels })
158
165
  }
159
166
  ),
160
167
  view.anySelectable && selected && (view.unsupportedAttachments || props.allowModelOptions !== false && view.thinking) ? /* @__PURE__ */ jsxs("div", { className: "border-t border-og-border px-2.5 py-2.5", children: [
@@ -165,12 +172,19 @@ function ModelPolicyPickerMenu(props) {
165
172
  }
166
173
  );
167
174
  }
168
- var CONNECT_MODEL_OPTIONS = (t) => [
175
+ var CONNECT_MODEL_OPTIONS = (t, claude) => [
169
176
  {
170
177
  billingClass: "codex_subscription",
171
178
  title: t("modelPolicyPickerMenu.codex"),
172
179
  detail: "ChatGPT"
173
180
  },
181
+ ...claude ? [
182
+ {
183
+ billingClass: "claude_subscription",
184
+ title: t("modelPolicyPicker.claude"),
185
+ detail: "Anthropic"
186
+ }
187
+ ] : [],
174
188
  { billingClass: "supergrok_subscription", title: "SuperGrok", detail: "xAI" },
175
189
  {
176
190
  billingClass: "byok",
@@ -186,7 +200,7 @@ function ConnectModelsPanel(props) {
186
200
  /* @__PURE__ */ jsx("p", { className: "text-og-menu font-medium tracking-tight text-og-fg", children: props.messages.connectTitle }),
187
201
  /* @__PURE__ */ jsx("p", { className: "mt-1 text-og-control leading-snug text-og-fg-subtle", children: props.messages.connectBody })
188
202
  ] }),
189
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-1", children: CONNECT_MODEL_OPTIONS(t).map((option) => {
203
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-1", children: CONNECT_MODEL_OPTIONS(t, props.claude).map((option) => {
190
204
  const content = /* @__PURE__ */ jsxs(Fragment, { children: [
191
205
  /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-og-md bg-og-surface-2 text-og-fg", children: /* @__PURE__ */ jsx(
192
206
  BillingClassMark,
@@ -201,7 +215,10 @@ function ConnectModelsPanel(props) {
201
215
  /* @__PURE__ */ jsx("span", { className: "block truncate text-og-control text-og-fg-subtle", children: option.detail })
202
216
  ] })
203
217
  ] });
204
- const className = "flex min-w-0 items-center gap-2 rounded-og-md px-1.5 py-1.5 outline-hidden transition-colors hover:bg-og-hover focus-visible:ring-2 focus-visible:ring-og-accent/40";
218
+ const className = (
219
+ // An odd last tile spans both columns instead of sitting alone.
220
+ "flex min-w-0 items-center gap-2 rounded-og-md px-1.5 py-1.5 outline-hidden transition-colors odd:last:col-span-2 hover:bg-og-hover focus-visible:ring-2 focus-visible:ring-og-accent/40"
221
+ );
205
222
  return props.href ? /* @__PURE__ */ jsx("a", { href: props.href, className, children: content }, option.title) : /* @__PURE__ */ jsx("div", { className, children: content }, option.title);
206
223
  }) }),
207
224
  props.href ? /* @__PURE__ */ jsxs(
@@ -353,4 +370,4 @@ export {
353
370
  ModelPolicyPickerMenu,
354
371
  ModelPolicyPickerPopover
355
372
  };
356
- //# sourceMappingURL=chunk-2K27S6LK.js.map
373
+ //# sourceMappingURL=chunk-Y565N5ZJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/model-policy-picker-menu.tsx"],"sourcesContent":["import type { ClientModel, LatencyMode, ReasoningEffort } from \"@opengeni/sdk\";\nimport { ArrowRightIcon, CheckIcon, SearchIcon, ZapIcon } from \"lucide-react\";\nimport { useRef, useState, type RefObject, type CSSProperties } from \"react\";\nimport { Popover, RadioGroup } from \"radix-ui\";\nimport { containedPortal } from \"../ui/portal-container\";\nimport { cn } from \"../lib/cn\";\nimport {\n MENU_CHECK_CLASS,\n MENU_LABEL_CLASS,\n MENU_NOTE_CLASS,\n MENU_SURFACE_CLASS,\n} from \"../lib/menu-styles\";\nimport { labelReasoningEffort, type PickerModelRow } from \"../model-policy\";\nimport {\n compactEffortLabel,\n groupPresentationFor,\n modelPickerChoice,\n modelPickerMenuView,\n} from \"../model-picker-model\";\nimport {\n BillingClassMark,\n defaultModelPolicyPickerMessages,\n PickerNavRow,\n type ModelPolicyPickerProps,\n} from \"./model-policy-picker\";\nimport { ModelMark } from \"./model-mark\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nconst PopoverContainedPortal = containedPortal(Popover.Portal);\ntype ClientPickerModelRow = PickerModelRow<ClientModel>;\n\n/** Model selection stays flat; reasoning never becomes a navigation destination. */\nexport function ModelPolicyPickerMenu(props: ModelPolicyPickerProps) {\n const t = useOpenGeniText();\n const [query, setQuery] = useState(\"\");\n const view = modelPickerMenuView(t, props, query);\n const { messages, rows, groups } = view;\n const selected = view.selected;\n const choose = (row: ClientPickerModelRow) => {\n if (props.disabled) return;\n const choice = modelPickerChoice(props, row);\n if (!choice) return;\n if (choice.model !== null) props.onModelChange(choice.model);\n // Hosts may commit the combined model/effort draft through this callback.\n props.onEffortChange(choice.effort);\n if (choice.latencyMode !== null) props.onLatencyModeChange(choice.latencyMode);\n };\n const modelRow = (row: ClientPickerModelRow) => (\n <PickerNavRow\n key={row.id}\n icon={\n props.collapseScopes === false ? undefined : (\n <ModelMark model={row.catalog} className=\"size-4 text-og-fg-muted\" />\n )\n }\n label={row.label}\n hint={row.unavailableReason ?? row.fundingHint}\n disabled={props.disabled || !row.selectable}\n title={[row.label, row.unavailableReason ?? row.fundingHint].filter(Boolean).join(\" · \")}\n active={row.selectable && row.id === props.model}\n showChevron={false}\n trailing={\n row.catalog.cost === \"free\" || row.id === props.model ? (\n <span className=\"flex items-center gap-2\">\n {row.catalog.cost === \"free\" ? (\n <span className=\"rounded-full bg-og-surface-2 px-1.5 py-0.5 text-og-control text-og-fg-muted\">\n {messages.free}\n </span>\n ) : null}\n {row.id === props.model ? (\n <CheckIcon className={MENU_CHECK_CLASS} aria-label={messages.selected} />\n ) : null}\n </span>\n ) : null\n }\n testId={`model-picker-choice-${row.id}`}\n onClick={() => choose(row)}\n />\n );\n return (\n <div\n data-testid=\"model-picker-menu\"\n className=\"flex min-h-0 flex-col\"\n onKeyDown={(event) => {\n if (\n !(event.target instanceof HTMLButtonElement) ||\n ![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)\n )\n return;\n const buttons = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\n '[data-testid^=\"model-picker-choice-\"]:not(:disabled)',\n ),\n );\n const index = buttons.indexOf(event.target);\n if (index < 0) return;\n event.preventDefault();\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? buttons.length - 1\n : (index + (event.key === \"ArrowDown\" ? 1 : -1) + buttons.length) % buttons.length;\n buttons[next]?.focus();\n }}\n >\n {rows.some((row) => row.selectable) ? (\n <div className=\"border-b border-og-border py-1\">\n <label className=\"og-model-policy-search flex items-center gap-2 px-2.5 py-0.5\">\n <SearchIcon className=\"size-4 shrink-0 text-og-fg-subtle\" aria-hidden />\n <input\n aria-label={messages.searchLabel}\n placeholder={messages.searchPlaceholder}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key !== \"Escape\" && event.key !== \"Tab\") event.stopPropagation();\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n event.currentTarget\n .closest('[data-testid=\"model-picker-menu\"]')\n ?.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")\n ?.focus();\n }\n }}\n className=\"og-model-policy-search-input h-8 min-w-0 flex-1 bg-transparent text-og-menu text-og-fg outline-hidden placeholder:text-og-fg-subtle\"\n />\n </label>\n </div>\n ) : null}\n {props.error ? (\n <p className={cn(MENU_NOTE_CLASS, \"text-og-sm text-og-status-failed\")} role=\"alert\">\n {props.error}\n </p>\n ) : null}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain py-1\"\n data-testid=\"model-picker-models\"\n >\n {props.loading ? (\n // Rows at the menu's row height, never a sentence, so nothing jumps.\n <div role=\"status\" aria-label={messages.loading}>\n {[58, 44, 66, 50].map((width) => (\n <div key={width} aria-hidden=\"true\" className=\"flex h-8 items-center gap-3 px-2.5\">\n <span className=\"size-4 shrink-0 animate-pulse rounded bg-og-surface-2\" />\n <span\n className=\"h-2.5 animate-pulse rounded bg-og-surface-2\"\n style={{ width: `${width}%` }}\n />\n </div>\n ))}\n </div>\n ) : rows.some((row) => row.selectable) ? (\n <>\n {groups.map((group) => (\n <section\n key={group.billingClass}\n aria-label={group.label}\n className=\"[&+section]:mt-1.5 [&+section]:border-t [&+section]:border-og-border [&+section]:pt-1.5\"\n >\n <div className={cn(MENU_LABEL_CLASS, \"flex items-center gap-2\")}>\n <BillingClassMark\n billingClass={group.billingClass}\n presentation={groupPresentationFor(props, group.billingClass)}\n aria-label=\"\"\n />\n <span className=\"min-w-0 break-words\">{group.label}</span>\n </div>\n {group.description ? (\n <p className=\"break-words px-2.5 pb-1 text-og-sm text-og-fg-muted\">\n {group.description}\n </p>\n ) : null}\n {group.rows.map(modelRow)}\n </section>\n ))}\n {view.matchCount === 0 ? (\n <p className={MENU_NOTE_CLASS}>\n {view.searching ? messages.noMatches : messages.noModels}\n </p>\n ) : null}\n </>\n ) : props.connectModelsHref || rows.length > 0 ? (\n <ConnectModelsPanel\n href={props.connectModelsHref}\n claude={props.claudeSubscriptionAvailable === true}\n messages={messages}\n />\n ) : (\n <p className={MENU_NOTE_CLASS}>{messages.noModels}</p>\n )}\n </div>\n {view.anySelectable &&\n selected &&\n (view.unsupportedAttachments || (props.allowModelOptions !== false && view.thinking)) ? (\n <div className=\"border-t border-og-border px-2.5 py-2.5\">\n {view.unsupportedAttachments ? (\n <p className=\"pb-1.5 text-og-control leading-relaxed text-og-fg-subtle\">\n {messages.unsupportedAttachments}\n </p>\n ) : null}\n {props.allowModelOptions !== false ? <ModelThinkingControls {...props} /> : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nconst CONNECT_MODEL_OPTIONS = (\n t: OpenGeniText,\n claude: boolean,\n): Array<{\n billingClass:\n | \"codex_subscription\"\n | \"claude_subscription\"\n | \"supergrok_subscription\"\n | \"byok\"\n | \"external\";\n title: string;\n detail: string;\n}> => [\n {\n billingClass: \"codex_subscription\",\n title: t(\"modelPolicyPickerMenu.codex\"),\n detail: \"ChatGPT\",\n },\n ...(claude\n ? [\n {\n billingClass: \"claude_subscription\" as const,\n title: t(\"modelPolicyPicker.claude\"),\n detail: \"Anthropic\",\n },\n ]\n : []),\n { billingClass: \"supergrok_subscription\", title: \"SuperGrok\", detail: \"xAI\" },\n {\n billingClass: \"byok\",\n title: t(\"modelPolicyPickerMenu.aiGateway\"),\n detail: t(\"modelPolicyPickerMenu.vercel\"),\n },\n { billingClass: \"external\", title: \"OpenRouter\", detail: t(\"modelPolicyPickerMenu.apiKey\") },\n];\n\nfunction ConnectModelsPanel(props: {\n href: string | undefined;\n claude: boolean;\n messages: ReturnType<typeof defaultModelPolicyPickerMessages>;\n}) {\n const t = useOpenGeniText();\n return (\n <div className=\"px-1.5 pb-1.5 pt-2\" data-testid=\"model-picker-connect\">\n <div className=\"px-1.5 pb-3\">\n <p className=\"text-og-menu font-medium tracking-tight text-og-fg\">\n {props.messages.connectTitle}\n </p>\n <p className=\"mt-1 text-og-control leading-snug text-og-fg-subtle\">\n {props.messages.connectBody}\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-1\">\n {CONNECT_MODEL_OPTIONS(t, props.claude).map((option) => {\n const content = (\n <>\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-og-md bg-og-surface-2 text-og-fg\">\n <BillingClassMark\n billingClass={option.billingClass}\n aria-label=\"\"\n className=\"size-4 text-og-fg\"\n />\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-og-control font-medium text-og-fg\">\n {option.title}\n </span>\n <span className=\"block truncate text-og-control text-og-fg-subtle\">\n {option.detail}\n </span>\n </span>\n </>\n );\n const className =\n // An odd last tile spans both columns instead of sitting alone.\n \"flex min-w-0 items-center gap-2 rounded-og-md px-1.5 py-1.5 outline-hidden transition-colors odd:last:col-span-2 hover:bg-og-hover focus-visible:ring-2 focus-visible:ring-og-accent/40\";\n return props.href ? (\n <a key={option.title} href={props.href} className={className}>\n {content}\n </a>\n ) : (\n <div key={option.title} className={className}>\n {content}\n </div>\n );\n })}\n </div>\n {props.href ? (\n <a\n href={props.href}\n className=\"mt-2 flex h-9 w-full items-center justify-center gap-1.5 rounded-og-md border border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover text-og-control font-medium outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n {props.messages.connectAction}\n <ArrowRightIcon className=\"size-3.5\" aria-hidden />\n </a>\n ) : (\n <p className=\"px-1.5 pt-3 text-og-control text-og-fg-subtle\">{props.messages.noModels}</p>\n )}\n </div>\n );\n}\n\nfunction ModelThinkingControls(props: ModelPolicyPickerProps) {\n const t = useOpenGeniText();\n const view = modelPickerMenuView(t, props, \"\");\n const thinking = view.thinking;\n if (!view.selected || !thinking) return null;\n const messages = view.messages;\n const efforts = thinking.efforts;\n const showThinking = thinking.showThinking;\n const showFast = thinking.showFast;\n const speeds = thinking.speeds;\n const selectedSpeed = speeds?.find((speed) => speed.id === props.latencyMode) ?? speeds?.[0];\n return (\n <div className=\"space-y-2 text-og-control\" data-testid=\"model-picker-reasoning\">\n {showThinking || showFast ? (\n <div className=\"flex min-h-7 items-center justify-between gap-3\">\n {showThinking ? <span className=\"text-og-fg-subtle\">{messages.thinking}</span> : <span />}\n {showFast ? (\n <button\n type=\"button\"\n data-testid=\"model-picker-fast\"\n disabled={props.disabled || thinking.disabled}\n aria-pressed={props.latencyMode === \"fast\"}\n title={messages.fast + \" · \" + messages.fastRateHint}\n onClick={() =>\n props.onLatencyModeChange(props.latencyMode === \"fast\" ? \"standard\" : \"fast\")\n }\n className=\"flex min-h-8 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-og-sm px-2 text-og-fg-muted hover:bg-og-hover focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:opacity-50\"\n >\n <ZapIcon className={cn(\"size-3.5\", props.latencyMode === \"fast\" && \"fill-current\")} />\n {messages.fast}\n <span className=\"text-og-fg-subtle\">{messages.fastRateHint}</span>\n </button>\n ) : null}\n </div>\n ) : null}\n {showThinking ? (\n <RadioGroup.Root\n aria-label={messages.thinkingEffort}\n value={thinking.value}\n disabled={props.disabled || thinking.disabled}\n onValueChange={(value) => props.onEffortChange(value as ReasoningEffort)}\n orientation=\"horizontal\"\n className=\"flex flex-wrap gap-0.5 rounded-og-md bg-og-surface-2 p-0.5\"\n >\n {efforts.map((effort) => (\n <RadioGroup.Item\n key={effort}\n value={effort}\n aria-label={labelReasoningEffort(t, effort)}\n title={labelReasoningEffort(t, effort)}\n className=\"min-h-8 min-w-10 flex-1 cursor-pointer whitespace-nowrap rounded-og-sm px-1.5 text-og-control text-og-fg-muted outline-hidden transition-colors hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40 data-[state=checked]:bg-og-surface-1 data-[state=checked]:text-og-fg data-[state=checked]:shadow-sm disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {compactEffortLabel(t, effort, labelReasoningEffort(t, effort))}\n </RadioGroup.Item>\n ))}\n </RadioGroup.Root>\n ) : null}\n {speeds && selectedSpeed ? (\n <div className=\"space-y-2 pt-1\" data-testid=\"model-picker-speed\">\n <div className=\"flex min-h-7 items-center justify-between gap-3\">\n <span className=\"text-og-fg-subtle\">{messages.speed}</span>\n {selectedSpeed.hint ? (\n <span className=\"text-og-fg-subtle\">{selectedSpeed.hint}</span>\n ) : null}\n </div>\n <RadioGroup.Root\n aria-label={messages.speed}\n value={selectedSpeed.id}\n disabled={props.disabled || thinking.disabled}\n onValueChange={(value) => props.onLatencyModeChange(value as LatencyMode)}\n orientation=\"horizontal\"\n className=\"flex flex-wrap gap-0.5 rounded-og-md bg-og-surface-2 p-0.5\"\n >\n {speeds.map((speed) => (\n <RadioGroup.Item\n key={speed.id}\n value={speed.id}\n aria-label={speed.hint ? `${speed.label} · ${speed.hint}` : speed.label}\n title={speed.hint ? `${speed.label} · ${speed.hint}` : speed.label}\n className=\"flex min-h-8 min-w-10 flex-1 cursor-pointer items-center justify-center gap-1 whitespace-nowrap rounded-og-sm px-1.5 text-og-control text-og-fg-muted outline-hidden transition-colors hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40 data-[state=checked]:bg-og-surface-1 data-[state=checked]:text-og-fg data-[state=checked]:shadow-sm disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {speed.id === \"standard\" ? null : (\n <ZapIcon\n aria-hidden\n className={cn(\n \"size-3.5 shrink-0\",\n speed.id === selectedSpeed.id && \"fill-current\",\n )}\n />\n )}\n {speed.label}\n </RadioGroup.Item>\n ))}\n </RadioGroup.Root>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function ModelPolicyPickerPopover(\n props: ModelPolicyPickerProps & {\n anchor: RefObject<HTMLButtonElement | null>;\n contentId: string;\n portalStyle: CSSProperties;\n },\n) {\n const t = useOpenGeniText();\n const outside = useRef(false);\n const messages = { ...defaultModelPolicyPickerMessages(t), ...props.messages };\n return (\n <Popover.Root open onOpenChange={(open) => props.onOpenChange?.(open)}>\n <Popover.Anchor virtualRef={props.anchor} />\n <PopoverContainedPortal>\n <Popover.Content\n id={props.contentId}\n aria-label={messages.label}\n align=\"start\"\n side={props.menuSide ?? \"bottom\"}\n sideOffset={8}\n collisionPadding={12}\n onInteractOutside={(event) => {\n if (props.anchor.current?.contains(event.target as Node)) event.preventDefault();\n else outside.current = true;\n }}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n if (!outside.current) props.anchor.current?.focus();\n }}\n className={cn(\n MENU_SURFACE_CLASS,\n \"og-root og-model-policy-menu z-50 flex max-h-[min(32rem,var(--radix-popover-content-available-height))] w-[22rem] max-w-[calc(100vw-16px)] flex-col overflow-hidden p-[var(--og-model-picker-menu-padding)]\",\n props.contentClassName,\n )}\n style={{ ...props.portalStyle, ...props.contentStyle }}\n data-testid=\"model-picker-content\"\n >\n <ModelPolicyPickerMenu {...props} />\n </Popover.Content>\n </PopoverContainedPortal>\n </Popover.Root>\n );\n}\n"],"mappings":"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","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-LT2CPZRB.js";
6
6
  import {
7
7
  MarkdownText
8
- } from "./chunk-GMVKCEBG.js";
8
+ } from "./chunk-MY6QEDZ2.js";
9
9
  import {
10
10
  formatTimestamp
11
11
  } from "./chunk-IKQMSROV.js";
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-HMU5IELG.js";
15
15
  import {
16
16
  UserMessageBody
17
- } from "./chunk-DNYD7AUG.js";
17
+ } from "./chunk-4BOLIZ7Y.js";
18
18
 
19
19
  // src/app/components/session/banners.tsx
20
20
  import { AlertTriangleIcon, ArrowLeftIcon, AudioLinesIcon, TerminalIcon } from "lucide-react";
@@ -109,4 +109,4 @@ export {
109
109
  TerminalSessionArchive,
110
110
  UserMessageBody2 as UserMessageBody
111
111
  };
112
- //# sourceMappingURL=chunk-ZRB4M3GG.js.map
112
+ //# sourceMappingURL=chunk-YC5KH7ZB.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  t
4
- } from "./chunk-BPD4IJBG.js";
4
+ } from "./chunk-CG6CJMIS.js";
5
5
  import {
6
6
  orgLabel
7
7
  } from "./chunk-NRP4REXE.js";
@@ -47,4 +47,4 @@ export {
47
47
  authorizedWorkspaceFromList,
48
48
  resolveWorkspaceScopeContext
49
49
  };
50
- //# sourceMappingURL=chunk-4RY64KQY.js.map
50
+ //# sourceMappingURL=chunk-YJUKLLNP.js.map
@@ -12,30 +12,30 @@ import {
12
12
  readChatDirectory,
13
13
  recordChatVisit
14
14
  } from "./chunk-NML44AW2.js";
15
- import {
16
- notifySessionListChanged
17
- } from "./chunk-O5S57N6H.js";
18
- import {
19
- applySessionArchiveProjection
20
- } from "./chunk-OSI2QWSL.js";
21
15
  import {
22
16
  FORK_CURRENT_CHAT_EVENT,
23
17
  OPEN_COMMAND_MENU_EVENT,
24
18
  RENAME_CURRENT_CHAT_EVENT,
25
19
  useRail
26
- } from "./chunk-6VITVQ23.js";
20
+ } from "./chunk-SHJ5SQOW.js";
27
21
  import {
28
22
  requestSessionComposerFocus
29
23
  } from "./chunk-MMY23KS7.js";
24
+ import {
25
+ useUiEventTarget
26
+ } from "./chunk-WGPLDFEC.js";
30
27
  import {
31
28
  requestSessionSearch
32
29
  } from "./chunk-TXIIBNCA.js";
30
+ import {
31
+ notifySessionListChanged
32
+ } from "./chunk-O5S57N6H.js";
33
+ import {
34
+ applySessionArchiveProjection
35
+ } from "./chunk-OSI2QWSL.js";
33
36
  import {
34
37
  requestConversationFind
35
38
  } from "./chunk-7ZEGSUR7.js";
36
- import {
37
- useUiEventTarget
38
- } from "./chunk-WGPLDFEC.js";
39
39
  import {
40
40
  useSessionUiFeature
41
41
  } from "./chunk-H5M33DAL.js";
@@ -45,7 +45,7 @@ import {
45
45
  } from "./chunk-FABYS4WM.js";
46
46
  import {
47
47
  t
48
- } from "./chunk-BPD4IJBG.js";
48
+ } from "./chunk-CG6CJMIS.js";
49
49
  import {
50
50
  hasWorkspacePermission
51
51
  } from "./chunk-FIDD34ZF.js";
@@ -81,19 +81,47 @@ import {
81
81
  } from "react";
82
82
 
83
83
  // src/app/lib/actions/chat-switcher.ts
84
- var SWITCHER_LIMIT = 10;
84
+ var SWITCHER_LIMIT = 100;
85
85
  var SWITCHER_SHOW_DELAY_MS = 140;
86
+ function switchable(record, reachable) {
87
+ if (!record || record.archived || !reachable(record.workspaceId)) return false;
88
+ return !record.row || record.row.parentSessionId === null;
89
+ }
90
+ function moreChats(directory, taken, reachable, room) {
91
+ if (room <= 0) return [];
92
+ const more = [];
93
+ for (const record of directory.rows.values()) {
94
+ if (!taken.has(record.id) && switchable(record, reachable)) more.push(record);
95
+ }
96
+ more.sort((a, b) => b.updatedAt - a.updatedAt || (a.id < b.id ? -1 : 1));
97
+ return more.slice(0, room).map((record) => record.id);
98
+ }
86
99
  function openChatSwitcher(directory, currentChatId, backwards, reachable = () => true) {
87
- const switchable = directory.recent.filter((id) => {
88
- const record = directory.rows.get(id);
89
- if (!record || record.archived || !reachable(record.workspaceId)) return false;
90
- return !record.row || record.row.parentSessionId === null;
91
- });
92
- const ids = currentChatId ? [currentChatId, ...switchable.filter((id) => id !== currentChatId)] : switchable;
93
- const limited = ids.slice(0, SWITCHER_LIMIT);
100
+ const recent = directory.recent.filter(
101
+ (id) => id !== currentChatId && switchable(directory.rows.get(id), reachable)
102
+ );
103
+ const viewed = (currentChatId ? [currentChatId, ...recent] : recent).slice(0, SWITCHER_LIMIT);
104
+ const ids = [
105
+ ...viewed,
106
+ ...moreChats(directory, new Set(viewed), reachable, SWITCHER_LIMIT - viewed.length)
107
+ ];
94
108
  const first = currentChatId ? 1 : 0;
95
- if (limited.length <= first) return null;
96
- return { ids: limited, index: backwards ? limited.length - 1 : first, visible: false };
109
+ if (ids.length <= first) return null;
110
+ return {
111
+ ids,
112
+ viewed: viewed.length,
113
+ index: backwards ? ids.length - 1 : first,
114
+ visible: false
115
+ };
116
+ }
117
+ function extendChatSwitcher(state, directory, reachable = () => true) {
118
+ const more = moreChats(
119
+ directory,
120
+ new Set(state.ids),
121
+ reachable,
122
+ SWITCHER_LIMIT - state.ids.length
123
+ );
124
+ return more.length === 0 ? state : { ...state, ids: [...state.ids, ...more] };
97
125
  }
98
126
  function stepChatSwitcher(state, step) {
99
127
  const count = state.ids.length;
@@ -993,6 +1021,16 @@ function ActionsProvider(props) {
993
1021
  const current = switcherRef.current;
994
1022
  if (current) setSwitcher({ ...current, index });
995
1023
  },
1024
+ onDirectoryChange: () => {
1025
+ const current = switcherRef.current;
1026
+ if (!current) return;
1027
+ const next = extendChatSwitcher(
1028
+ current,
1029
+ readChatDirectory(subjectId, workspaceId),
1030
+ reachableRef.current
1031
+ );
1032
+ if (next !== current) setSwitcher(next);
1033
+ },
996
1034
  onPick: pickSwitcherChat,
997
1035
  onDismiss: () => setSwitcher(null)
998
1036
  }
@@ -1010,4 +1048,4 @@ export {
1010
1048
  useActionShortcut,
1011
1049
  ActionsProvider
1012
1050
  };
1013
- //# sourceMappingURL=chunk-OHG2UQ2O.js.map
1051
+ //# sourceMappingURL=chunk-YWP2H7SX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/lib/actions/actions-provider.tsx","../src/app/lib/actions/chat-switcher.ts","../src/app/lib/actions/chat-operations.ts","../src/app/lib/actions/registry.ts"],"sourcesContent":["/**\n * Runs the action registry for one workspace: builds what actions need, owns\n * the ⌘K menu and the shortcut sheet, listens for chords, keeps the recent\n * chats list, and hands the desktop shell its menu bar.\n */\nimport {\n createContext,\n lazy,\n Suspense,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { SessionListRow } from \"../../../session-list-model\";\nimport { useAppContext } from \"../../app-context\";\nimport { useRail } from \"../../components/rail/rail-context\";\nimport { requestConversationFind } from \"../conversation-find-event\";\nimport { desktopBridge, desktopCapability } from \"../desktop\";\nimport { useNavigate, useRouterState } from \"../navigation\";\nimport { requestSessionSearch } from \"../session-search-route\";\nimport { requestSessionComposerFocus } from \"../session-focus\";\nimport { useSessionUiFeature } from \"../session-ui-features\";\nimport { useUiEventTarget } from \"../ui-events\";\nimport { t } from \"../console-text\";\nimport { isPersonalWorkspace } from \"../managed-self-context\";\nimport { workspacesByOrganization } from \"../org\";\nimport { hasWorkspacePermission } from \"../permissions\";\nimport { readChatDirectory, recordChatVisit } from \"./chat-directory\";\nimport {\n extendChatSwitcher,\n isSwitcherKey,\n openChatSwitcher,\n stepChatSwitcher,\n SWITCHER_SHOW_DELAY_MS,\n type ChatSwitcherState,\n} from \"./chat-switcher\";\nimport {\n applicableChords,\n chordAccelerator,\n chordAriaKeys,\n chordLabel,\n currentPlatform,\n isTextEntry,\n matchesChord,\n type ActionSurface,\n type Chord,\n type ChordPlatform,\n} from \"./chords\";\nimport { useChatOperations } from \"./chat-operations\";\nimport {\n FORK_CURRENT_CHAT_EVENT,\n OPEN_COMMAND_MENU_EVENT,\n RENAME_CURRENT_CHAT_EVENT,\n} from \"./events\";\nimport {\n appActions,\n actionTitle,\n findAction,\n type ActionEnv,\n type AppAction,\n type WorkspaceChoice,\n} from \"./registry\";\n\nconst CommandMenu = lazy(() => import(\"../../components/command-menu/command-menu\"));\nconst ShortcutSheet = lazy(() => import(\"../../components/command-menu/shortcut-sheet\"));\nconst loadChatSwitcher = () => import(\"../../components/command-menu/chat-switcher\");\nconst ChatSwitcher = lazy(loadChatSwitcher);\n\ntype ActionsContextValue = {\n env: ActionEnv;\n /** Run an action for a chat (row menus) or the current chat. */\n run(action: AppAction, chat?: SessionListRow | null, chord?: Chord): void;\n /** The chords to show for an action on this surface and platform. */\n chordsFor(action: AppAction): Chord[];\n};\n\nconst ActionsContext = createContext<ActionsContextValue | null>(null);\n\nexport function useAppActions(): ActionsContextValue | null {\n return useContext(ActionsContext);\n}\n\n/**\n * An action's key for tooltips, labels and `aria-keyshortcuts`, in the\n * person's notation; nothing when this surface has no page-wide keys.\n */\nexport function useActionShortcut(\n actionId: string,\n): { label: string; ariaKeys: string; chord: Chord } | null {\n // Keys depend only on the surface and platform, so rows need not re-render\n // when the actions' environment changes.\n const enabled = useSessionUiFeature(\"keyboardShortcuts\");\n const action = findAction(actionId);\n if (!enabled || !action) return null;\n const platform = currentPlatform();\n const chords = applicableChords(action.chords, surface, platform);\n const chord = chords[0];\n if (!chord) return null;\n return {\n label: chordLabel(chord, platform),\n ariaKeys: chords.map((candidate) => chordAriaKeys(candidate, platform)).join(\" \"),\n chord,\n };\n}\n\nconst surface: ActionSurface = desktopBridge ? \"desktop\" : \"web\";\n\nfunction isRichTextEditor(target: EventTarget | null): boolean {\n return target instanceof HTMLElement && target.isContentEditable;\n}\n\nfunction insideOtherOverlay(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) return false;\n const overlay = target.closest(\n '[role=\"dialog\"],[role=\"alertdialog\"],[role=\"menu\"],[role=\"listbox\"]',\n );\n return Boolean(overlay && !overlay.closest(\"[data-og-command-menu],[data-og-shortcut-sheet]\"));\n}\n\n/** The chord the desktop menu bar shows and owns for an action. */\nfunction menuOwnedChord(action: AppAction, platform: ChordPlatform): Chord | undefined {\n // ⌥ chords stay with the page: a menu would take ⌥↑ from the composer's caret.\n // Formatting keys stay with the page too, so ⌘B can still bold rich text.\n return applicableChords(action.chords, \"desktop\", platform).find(\n (chord) => (!chord.alt || chord.mod) && !chord.formatting,\n );\n}\n\nfunction menuChord(action: AppAction, platform: ChordPlatform): string | null {\n const chord = menuOwnedChord(action, platform);\n return chord ? chordAccelerator(chord) : null;\n}\n\nfunction insideCommandMenu(target: EventTarget | null): boolean {\n return target instanceof Element && Boolean(target.closest(\"[data-og-command-menu]\"));\n}\n\nfunction textEntryIsEmpty(target: EventTarget | null): boolean {\n if (target instanceof HTMLTextAreaElement || target instanceof HTMLInputElement) {\n return target.value.length === 0;\n }\n if (target instanceof HTMLElement && target.isContentEditable) {\n return (target.textContent ?? \"\").length === 0;\n }\n return true;\n}\n\nexport function ActionsProvider(props: { children: ReactNode }) {\n const app = useAppContext();\n const rail = useRail();\n const navigate = useNavigate();\n const ops = useChatOperations();\n const uiEvents = useUiEventTarget(\"document\");\n const windowEvents = useUiEventTarget(\"window\");\n const chatList = useSessionUiFeature(\"chatList\");\n const workspacePanel = useSessionUiFeature(\"dock\");\n const { inspectorOpen, setInspectorOpen } = app;\n const keyboardShortcuts = useSessionUiFeature(\"keyboardShortcuts\");\n const platform = useMemo(() => currentPlatform(), []);\n const workspaceId = rail.workspaceId;\n const subjectId = app.accessContext.subjectId;\n const pathname = useRouterState({ select: (state) => state.location.pathname });\n const routeChatId = /\\/sessions\\/([^/]+)/.exec(pathname)?.[1] ?? null;\n const currentChat =\n app.session && app.session.id === routeChatId && app.session.workspaceId === workspaceId\n ? app.session\n : null;\n\n // Every workspace open to the person, in the workspace picker's order.\n const workspaces = useMemo<WorkspaceChoice[]>(\n () =>\n workspacesByOrganization(t, app.accessContext, app.workspaces).flatMap((group) =>\n group.workspaces.map((workspace) => ({\n id: workspace.id,\n name: workspace.name,\n organization: group.org.label,\n personal: isPersonalWorkspace(workspace, app.managedSelfContext),\n })),\n ),\n [app.accessContext, app.workspaces, app.managedSelfContext],\n );\n // The same rule as the fork button under a message.\n const canForkCurrentChat =\n currentChat !== null &&\n app.clientConfig.auth.mode === \"managedSession\" &&\n app.authSession !== null &&\n Boolean(app.session?.tenancy) &&\n hasWorkspacePermission(app.accessContext, workspaceId, \"sessions:create\");\n\n const [menu, setMenu] = useState<{\n open: boolean;\n mounted: boolean;\n /** Opened to pick a workspace rather than search everything. */\n workspaces: boolean;\n }>({ open: false, mounted: false, workspaces: false });\n const [sheet, setSheet] = useState({ open: false, mounted: false });\n\n const railRef = useRef(rail);\n railRef.current = rail;\n // What had focus when the menu or sheet opened. They open from a key or a\n // button anywhere (and load lazily the first time), so they return focus\n // there themselves instead of relying on what the dialog saw when it mounted.\n const returnFocus = useRef<HTMLElement | null>(null);\n const menuOpen = useRef(false);\n const sheetOpen = useRef(false);\n menuOpen.current = menu.open;\n sheetOpen.current = sheet.open;\n const rememberFocus = useCallback(() => {\n if (menuOpen.current || sheetOpen.current || typeof document === \"undefined\") return;\n // Opened from inside the phone drawer, which closes: come back to the\n // drawer's persistent opener, as search does.\n const drawerTrigger = railRef.current.drawerOpen\n ? railRef.current.drawerTriggerRef.current\n : null;\n if (drawerTrigger) {\n returnFocus.current = drawerTrigger;\n return;\n }\n const active = document.activeElement;\n returnFocus.current = active instanceof HTMLElement && active !== document.body ? active : null;\n }, []);\n const openCommandMenu = useCallback(\n (pickWorkspace = false) => {\n rememberFocus();\n setSheet((current) => (current.open ? { ...current, open: false } : current));\n // The phone drawer is a modal of its own; the menu replaces it and returns\n // focus itself, so the retiring drawer must not take focus back.\n railRef.current.handOffDrawer();\n setMenu((current) => ({\n open: pickWorkspace ? true : !current.open,\n mounted: true,\n workspaces: pickWorkspace,\n }));\n },\n [rememberFocus],\n );\n const openShortcutSheet = useCallback(() => {\n rememberFocus();\n setMenu((current) => (current.open ? { ...current, open: false } : current));\n setSheet((current) => ({ open: !current.open, mounted: true }));\n }, [rememberFocus]);\n\n // Recent chats follow what is actually opened, in any way.\n useEffect(() => {\n if (currentChat) recordChatVisit(subjectId, currentChat);\n // Title and pin changes refresh the record without reordering.\n }, [currentChat?.id, subjectId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Control+Tab and ⌘K leave out chats in workspaces no longer open to the person.\n const reachable = useMemo(() => {\n const ids = new Set(workspaces.map((workspace) => workspace.id));\n return (id: string) => ids.has(id) || id === workspaceId;\n }, [workspaces, workspaceId]);\n\n // A chat opened from the keyboard (⌘K, Control+Tab, next/previous chat) is\n // opened to type in: hand its composer the focus once it is ready.\n const openChatForTyping = useCallback(\n (chatId: string, inWorkspaceId?: string) => {\n if (!rail.isMobile) {\n requestSessionComposerFocus(windowEvents, inWorkspaceId ?? workspaceId, chatId, \"keyboard\");\n }\n rail.openSession(chatId, inWorkspaceId);\n },\n [rail, windowEvents, workspaceId],\n );\n\n const env = useMemo<ActionEnv>(\n () => ({\n workspaceId,\n subjectId,\n surface,\n platform,\n currentChat,\n ops,\n chatList,\n workspacePanel,\n workspaces,\n canForkCurrentChat,\n newChat: () => rail.startNewSession(),\n openChat: (chatId, inWorkspaceId) => openChatForTyping(chatId, inWorkspaceId),\n openWorkspace: (id) => rail.openWorkspace(id),\n openWorkspacePicker: () => openCommandMenu(true),\n openInbox: () => {\n rail.setDrawerOpen(false);\n void navigate({ to: \"/workspaces/$workspaceId/inbox\", params: { workspaceId } });\n },\n toggleSidebar: () =>\n rail.isMobile ? rail.setDrawerOpen(!rail.drawerOpen) : rail.toggleCollapsed(),\n toggleWorkspacePanel: () => {\n if (!inspectorOpen && rail.isMobile) rail.setDrawerOpen(false);\n setInspectorOpen((open) => !open);\n },\n findInChat: () => requestConversationFind(uiEvents),\n searchMessages: (query) => requestSessionSearch(windowEvents, workspaceId, undefined, query),\n renameCurrentChat: () => uiEvents.dispatchEvent(new Event(RENAME_CURRENT_CHAT_EVENT)),\n forkCurrentChat: () => uiEvents.dispatchEvent(new Event(FORK_CURRENT_CHAT_EVENT)),\n openCommandMenu: () => openCommandMenu(),\n openShortcutSheet,\n switchToRecentChat: () => {\n const directory = readChatDirectory(subjectId, workspaceId);\n const target = openChatSwitcher(directory, routeChatId, false, reachable);\n const id = target?.ids[target.index];\n if (id) openChatForTyping(id, directory.rows.get(id)?.workspaceId);\n },\n sidebarOrder: () => readChatDirectory(subjectId, workspaceId).sidebarOrder,\n pinnedOrder: () => readChatDirectory(subjectId, workspaceId).pinnedOrder,\n }),\n [\n workspaceId,\n subjectId,\n platform,\n currentChat,\n routeChatId,\n ops,\n chatList,\n workspacePanel,\n workspaces,\n canForkCurrentChat,\n reachable,\n inspectorOpen,\n setInspectorOpen,\n rail,\n openChatForTyping,\n navigate,\n uiEvents,\n windowEvents,\n openCommandMenu,\n openShortcutSheet,\n ],\n );\n const envRef = useRef(env);\n envRef.current = env;\n\n const chordsFor = useCallback(\n (action: AppAction) => applicableChords(action.chords, surface, platform),\n [platform],\n );\n\n const run = useCallback((action: AppAction, chat?: SessionListRow | null, chord?: Chord) => {\n const current = envRef.current;\n // Any other action replaces the open menu or sheet.\n if (action.id !== \"commandMenu.open\") {\n setMenu((state) => (state.open ? { ...state, open: false } : state));\n }\n if (action.id !== \"help.shortcuts\") {\n setSheet((state) => (state.open ? { ...state, open: false } : state));\n }\n const target = chat === undefined ? current.currentChat : chat;\n if (!action.available(current, action.forChat ? target : null)) return;\n void Promise.resolve(action.run(current, action.forChat ? target : null, chord)).catch(() => {\n // Each operation reports its own failure.\n });\n }, []);\n\n // The desktop menu bar shows the registry's actions and owns their keys.\n const menuBridge = desktopCapability(\"menuActions\")?.menuActions ?? null;\n const menuSignature = useMemo(() => {\n if (!menuBridge) return \"\";\n return JSON.stringify(\n appActions()\n .filter((action) => action.desktopMenu)\n .map((action) => {\n const chat = action.forChat ? env.currentChat : null;\n return {\n id: action.id,\n label: actionTitle(action, env, chat),\n section: action.desktopMenu!,\n accelerator: menuChord(action, platform),\n enabled: action.available(env, chat),\n };\n }),\n );\n }, [menuBridge, env, platform]);\n useEffect(() => {\n if (!menuBridge || !menuSignature) return;\n menuBridge.set(JSON.parse(menuSignature));\n }, [menuBridge, menuSignature]);\n useEffect(() => {\n if (!menuBridge) return;\n return menuBridge.onAction((id) => {\n const action = findAction(id);\n if (action) run(action);\n });\n }, [menuBridge, run]);\n\n // Older desktop builds and other parts of the page open the menu by event.\n useEffect(() => {\n const open = () => openCommandMenu();\n windowEvents.addEventListener(OPEN_COMMAND_MENU_EVENT, open);\n return () => windowEvents.removeEventListener(OPEN_COMMAND_MENU_EVENT, open);\n }, [windowEvents, openCommandMenu]);\n\n useEffect(() => {\n if (!keyboardShortcuts) return;\n const menuOwnsKeys = Boolean(menuBridge);\n function onKeyDown(event: KeyboardEvent) {\n if (event.defaultPrevented) return;\n const current = envRef.current;\n for (const action of appActions()) {\n // ⌘F belongs to the conversation's own find bar.\n if (action.id === \"chat.find\") continue;\n // The chat switcher handles Control+Tab itself: it needs Control's release.\n if (action.id === \"go.recentChat\") continue;\n const chord = applicableChords(action.chords, surface, platform).find((candidate) =>\n matchesChord(event, candidate, platform),\n );\n if (!chord) continue;\n // The menu bar delivers the key it shows; the page keeps the others.\n if (menuOwnsKeys && action.desktopMenu && chord === menuOwnedChord(action, platform))\n return;\n const toggleMenu = action.id === \"commandMenu.open\";\n // Inside the ⌘K menu, chat chords act on the highlighted chat; the menu handles them.\n if (action.forChat && insideCommandMenu(event.target)) return;\n if (!toggleMenu && insideOtherOverlay(event.target)) return;\n // Rich-text editors keep their formatting keys.\n if (chord.formatting && isRichTextEditor(event.target)) return;\n // Chords without ⌘/Ctrl leave text editing alone unless the field is empty.\n if (!chord.mod && isTextEntry(event.target) && !textEntryIsEmpty(event.target)) return;\n if (!action.available(current, action.forChat ? current.currentChat : null)) return;\n event.preventDefault();\n event.stopPropagation();\n run(action, undefined, chord);\n return;\n }\n }\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => document.removeEventListener(\"keydown\", onKeyDown, true);\n }, [keyboardShortcuts, menuBridge, platform, run]);\n\n // Control+Tab: the recent-chats switcher (desktop app only; browsers keep the key).\n const [switcher, setSwitcherState] = useState<ChatSwitcherState | null>(null);\n const switcherRef = useRef<ChatSwitcherState | null>(null);\n const setSwitcher = useCallback((next: ChatSwitcherState | null) => {\n switcherRef.current = next;\n setSwitcherState(next);\n }, []);\n const routeChatIdRef = useRef(routeChatId);\n routeChatIdRef.current = routeChatId;\n const reachableRef = useRef(reachable);\n reachableRef.current = reachable;\n const switcherEnabled = keyboardShortcuts && chatList && surface === \"desktop\";\n const pickSwitcherChat = useCallback(\n (index?: number) => {\n const state = switcherRef.current;\n if (!state) return;\n const id = state.ids[index ?? state.index];\n setSwitcher(null);\n if (!id || id === routeChatIdRef.current) return;\n const current = envRef.current;\n current.openChat(\n id,\n readChatDirectory(current.subjectId, current.workspaceId).rows.get(id)?.workspaceId,\n );\n },\n [setSwitcher],\n );\n useEffect(() => {\n if (!switcherEnabled) {\n setSwitcher(null);\n return;\n }\n let showTimer: ReturnType<typeof setTimeout> | undefined;\n const cancel = () => {\n clearTimeout(showTimer);\n if (switcherRef.current) setSwitcher(null);\n };\n function onKeyDown(event: KeyboardEvent) {\n const state = switcherRef.current;\n if (isSwitcherKey(event)) {\n event.preventDefault();\n event.stopPropagation();\n if (state) {\n clearTimeout(showTimer);\n setSwitcher(stepChatSwitcher(state, event.shiftKey ? -1 : 1));\n return;\n }\n // Not over the ⌘K menu, the shortcut sheet or another dialog.\n if (event.repeat || menuOpen.current || sheetOpen.current) return;\n if (insideOtherOverlay(event.target)) return;\n const opened = openChatSwitcher(\n readChatDirectory(subjectId, workspaceId),\n routeChatIdRef.current,\n event.shiftKey,\n reachableRef.current,\n );\n if (!opened) return;\n void loadChatSwitcher();\n setSwitcher(opened);\n // A quick press switches without drawing the list at all.\n showTimer = setTimeout(() => {\n const current = switcherRef.current;\n if (current && !current.visible) setSwitcher({ ...current, visible: true });\n }, SWITCHER_SHOW_DELAY_MS);\n return;\n }\n if (!state) return;\n // Control was let go somewhere the page did not hear it.\n if (!event.ctrlKey && event.key !== \"Control\") {\n cancel();\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n cancel();\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n clearTimeout(showTimer);\n pickSwitcherChat();\n } else if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n event.stopPropagation();\n clearTimeout(showTimer);\n setSwitcher(stepChatSwitcher(state, event.key === \"ArrowDown\" ? 1 : -1));\n }\n }\n function onKeyUp(event: KeyboardEvent) {\n if (event.key !== \"Control\" || !switcherRef.current) return;\n clearTimeout(showTimer);\n pickSwitcherChat();\n }\n document.addEventListener(\"keydown\", onKeyDown, true);\n document.addEventListener(\"keyup\", onKeyUp, true);\n window.addEventListener(\"blur\", cancel);\n return () => {\n clearTimeout(showTimer);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n document.removeEventListener(\"keyup\", onKeyUp, true);\n window.removeEventListener(\"blur\", cancel);\n };\n }, [switcherEnabled, subjectId, workspaceId, pickSwitcherChat, setSwitcher]);\n\n const value = useMemo<ActionsContextValue>(\n () => ({ env, run, chordsFor }),\n [env, run, chordsFor],\n );\n\n return (\n <ActionsContext.Provider value={value}>\n {props.children}\n {menu.mounted ? (\n <Suspense fallback={null}>\n <CommandMenu\n open={menu.open}\n pickWorkspace={menu.workspaces}\n onOpenChange={(open) => setMenu((current) => ({ ...current, open }))}\n returnFocus={returnFocus}\n />\n </Suspense>\n ) : null}\n {sheet.mounted ? (\n <Suspense fallback={null}>\n <ShortcutSheet\n open={sheet.open}\n onOpenChange={(open) => setSheet((current) => ({ ...current, open }))}\n returnFocus={returnFocus}\n />\n </Suspense>\n ) : null}\n {/* Mounted from the first press, so it reads chat statuses before it shows. */}\n {switcher ? (\n <Suspense fallback={null}>\n <ChatSwitcher\n state={switcher}\n subjectId={subjectId}\n workspaceId={workspaceId}\n workspaces={workspaces}\n currentChatId={routeChatId}\n platform={platform}\n onHover={(index) => {\n const current = switcherRef.current;\n if (current) setSwitcher({ ...current, index });\n }}\n onDirectoryChange={() => {\n const current = switcherRef.current;\n if (!current) return;\n const next = extendChatSwitcher(\n current,\n readChatDirectory(subjectId, workspaceId),\n reachableRef.current,\n );\n if (next !== current) setSwitcher(next);\n }}\n onPick={pickSwitcherChat}\n onDismiss={() => setSwitcher(null)}\n />\n </Suspense>\n ) : null}\n </ActionsContext.Provider>\n );\n}\n","/**\n * Control+Tab in the desktop app: switch between recently viewed chats, most\n * recent first, as ⌘Tab switches apps. The list spans the person's workspaces,\n * so it also jumps between chats in different workspaces. A quick press goes back to the previous\n * chat (press again to return); holding Control shows the list, each Tab moves\n * down it (Shift+Tab up), and releasing Control opens the highlighted chat.\n *\n * Past the chats someone opened, the list carries on through the other chats\n * the app knows, most recently active first, so holding Tab keeps going back\n * in time. The list is read when the switcher opens and only ever grows at\n * the end (as more chats load), so it holds still while the person cycles.\n */\nimport type { ChatDirectorySnapshot, ChatRecord } from \"./chat-directory\";\n\n/** At most this many chats; older ones are a search away in ⌘K. */\nexport const SWITCHER_LIMIT = 100;\n/** A press shorter than this switches without ever drawing the list. */\nexport const SWITCHER_SHOW_DELAY_MS = 140;\n\nexport type ChatSwitcherState = Readonly<{\n /** Chats in the order shown: recently viewed first, then recently active. */\n ids: readonly string[];\n /** How many of `ids`, from the front, are chats the person opened recently. */\n viewed: number;\n /** The highlighted chat. */\n index: number;\n /** Whether the list is drawn (after the delay, or once Tab is pressed again). */\n visible: boolean;\n}>;\n\ntype SwitcherDirectory = Pick<ChatDirectorySnapshot, \"recent\" | \"rows\">;\n\nfunction switchable(\n record: ChatRecord | undefined,\n reachable: (workspaceId: string) => boolean,\n): boolean {\n if (!record || record.archived || !reachable(record.workspaceId)) return false;\n // Subagent chats live under their parent, as in the sidebar.\n return !record.row || record.row.parentSessionId === null;\n}\n\n/** Known chats not in `taken`, most recently active first. */\nfunction moreChats(\n directory: SwitcherDirectory,\n taken: ReadonlySet<string>,\n reachable: (workspaceId: string) => boolean,\n room: number,\n): string[] {\n if (room <= 0) return [];\n const more: ChatRecord[] = [];\n for (const record of directory.rows.values()) {\n if (!taken.has(record.id) && switchable(record, reachable)) more.push(record);\n }\n more.sort((a, b) => b.updatedAt - a.updatedAt || (a.id < b.id ? -1 : 1));\n return more.slice(0, room).map((record) => record.id);\n}\n\n/**\n * The chats to switch between: the open chat (when there is one), the other\n * recently viewed chats, then the rest the app knows by latest activity.\n * Null when there is nowhere to switch to.\n */\nexport function openChatSwitcher(\n directory: SwitcherDirectory,\n currentChatId: string | null,\n backwards: boolean,\n /** Whether a workspace is still open to the person; chats elsewhere are left out. */\n reachable: (workspaceId: string) => boolean = () => true,\n): ChatSwitcherState | null {\n const recent = directory.recent.filter(\n (id) => id !== currentChatId && switchable(directory.rows.get(id), reachable),\n );\n const viewed = (currentChatId ? [currentChatId, ...recent] : recent).slice(0, SWITCHER_LIMIT);\n const ids = [\n ...viewed,\n ...moreChats(directory, new Set(viewed), reachable, SWITCHER_LIMIT - viewed.length),\n ];\n // Away from a chat (the inbox, a new chat) the most recent chat is the target.\n const first = currentChatId ? 1 : 0;\n if (ids.length <= first) return null;\n return {\n ids,\n viewed: viewed.length,\n index: backwards ? ids.length - 1 : first,\n visible: false,\n };\n}\n\n/**\n * Chats that loaded while the list is open join at its end, so nothing the\n * person is looking at moves. The same state when there is nothing new.\n */\nexport function extendChatSwitcher(\n state: ChatSwitcherState,\n directory: SwitcherDirectory,\n reachable: (workspaceId: string) => boolean = () => true,\n): ChatSwitcherState {\n const more = moreChats(\n directory,\n new Set(state.ids),\n reachable,\n SWITCHER_LIMIT - state.ids.length,\n );\n return more.length === 0 ? state : { ...state, ids: [...state.ids, ...more] };\n}\n\n/** Tab moves down the list and Shift+Tab up, wrapping at the ends. */\nexport function stepChatSwitcher(state: ChatSwitcherState, step: 1 | -1): ChatSwitcherState {\n const count = state.ids.length;\n return { ...state, index: (state.index + step + count) % count, visible: true };\n}\n\n/** Control+Tab exactly: no ⌘, no ⌥ (Shift reverses). */\nexport function isSwitcherKey(\n event: Pick<KeyboardEvent, \"code\" | \"ctrlKey\" | \"metaKey\" | \"altKey\">,\n) {\n return event.code === \"Tab\" && event.ctrlKey && !event.metaKey && !event.altKey;\n}\n","/**\n * The chat operations every surface shares: the command menu, chords, the\n * chat header and the sidebar's row menus all copy links, pin, archive and\n * mark chats through these, so they behave identically everywhere.\n */\nimport { useCallback, useMemo, useRef } from \"react\";\nimport type { SessionListRow } from \"../../../session-list-model\";\nimport { useAppContext } from \"../../app-context\";\nimport { usePage } from \"../navigation\";\nimport { applySessionArchiveProjection } from \"../session-pagination\";\nimport { notifySessionListChanged } from \"../session-list-invalidation\";\nimport { toast } from \"../toast\";\n\nexport type ChatOperations = {\n /** The chat's shareable address. */\n linkTo(chat: Pick<SessionListRow, \"id\" | \"workspaceId\">): string;\n copyLink(chat: Pick<SessionListRow, \"id\" | \"workspaceId\">): Promise<void>;\n setPinned(chat: SessionListRow, pinned: boolean): Promise<void>;\n setArchived(chat: SessionListRow, archived: boolean): Promise<void>;\n setUnread(chat: SessionListRow, unread: boolean): Promise<void>;\n};\n\nexport function chatPath(chat: Pick<SessionListRow, \"id\" | \"workspaceId\">): string {\n return `/workspaces/${encodeURIComponent(chat.workspaceId)}/sessions/${encodeURIComponent(chat.id)}`;\n}\n\nasync function writeClipboard(text: string): Promise<void> {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n // Older embeds without the async clipboard: a hidden textarea and execCommand.\n const area = document.createElement(\"textarea\");\n area.value = text;\n area.setAttribute(\"readonly\", \"\");\n area.style.position = \"fixed\";\n area.style.opacity = \"0\";\n document.body.append(area);\n area.select();\n const copied = document.execCommand(\"copy\");\n area.remove();\n if (!copied) throw new Error(\"The browser blocked copying.\");\n}\n\nexport function useChatOperations(): ChatOperations {\n const context = useAppContext();\n const page = usePage();\n const archiving = useRef(new Set<string>());\n const linkTo = useCallback(\n (chat: Pick<SessionListRow, \"id\" | \"workspaceId\">) => `${page.origin()}${chatPath(chat)}`,\n [page],\n );\n const copyLink = useCallback(\n async (chat: Pick<SessionListRow, \"id\" | \"workspaceId\">) => {\n try {\n await writeClipboard(linkTo(chat));\n toast.success(\"Link copied\");\n } catch (error) {\n toast.error(\"Couldn't copy the link.\", {\n description: error instanceof Error ? error.message : String(error),\n });\n }\n },\n [linkTo],\n );\n const setPinned = useCallback(\n async (chat: SessionListRow, pinned: boolean) => {\n const updated = await context.updateSessionPin(\n chat.workspaceId,\n chat.id,\n pinned,\n chat.pinVersion ?? 0,\n );\n if (updated) toast.success(pinned ? \"Chat pinned\" : \"Chat unpinned\");\n else toast.error(pinned ? \"Couldn't pin the chat.\" : \"Couldn't unpin the chat.\");\n },\n [context],\n );\n const setArchivedRef = useRef<ChatOperations[\"setArchived\"] | null>(null);\n const setArchived = useCallback(\n async (chat: SessionListRow, archived: boolean) => {\n if (archiving.current.has(chat.id)) return;\n const accepted = context.captureWorkspaceInvocation(chat.workspaceId);\n if (!accepted) return;\n archiving.current.add(chat.id);\n try {\n const updated = await context.client.updateSessionArchive(chat.workspaceId, chat.id, {\n archived,\n expectedVersion: chat.archiveVersion ?? 0,\n });\n if (!context.ownsWorkspaceInvocation(chat.workspaceId, accepted)) return;\n context.setSession((current) =>\n current?.id === updated.id && current.workspaceId === updated.workspaceId\n ? applySessionArchiveProjection(current, updated)\n : current,\n );\n notifySessionListChanged({\n workspaceId: chat.workspaceId,\n sessionId: chat.id,\n archived: updated.archived,\n });\n const after: SessionListRow = {\n ...chat,\n archived: updated.archived === true,\n ...(updated.archiveVersion !== undefined\n ? { archiveVersion: updated.archiveVersion }\n : {}),\n };\n toast.success(updated.archived ? \"Chat archived.\" : \"Chat restored.\", {\n // Archiving is one key away, so taking it back is one click away.\n action: updated.archived\n ? { label: \"Undo\", onClick: () => void setArchivedRef.current?.(after, false) }\n : undefined,\n });\n } catch (error) {\n if (!context.ownsWorkspaceInvocation(chat.workspaceId, accepted)) return;\n toast.error(archived ? \"Couldn't archive the chat.\" : \"Couldn't restore the chat.\", {\n description: error instanceof Error ? error.message : String(error),\n });\n } finally {\n archiving.current.delete(chat.id);\n }\n },\n [context],\n );\n setArchivedRef.current = setArchived;\n const setUnread = useCallback(\n async (chat: SessionListRow, unread: boolean) => {\n try {\n const updated = await context.client.updateSessionAttention(chat.workspaceId, chat.id, {\n unread,\n expectedVersion: chat.attentionVersion ?? 0,\n });\n context.setSession((current) =>\n current?.id === updated.id\n ? {\n ...current,\n ...(updated.unread !== undefined ? { unread: updated.unread } : {}),\n ...(updated.attentionVersion !== undefined\n ? { attentionVersion: updated.attentionVersion }\n : {}),\n }\n : current,\n );\n notifySessionListChanged({ workspaceId: chat.workspaceId, sessionId: chat.id });\n toast.success(unread ? \"Marked as unread\" : \"Marked as read\");\n } catch (error) {\n toast.error(\"Couldn't update the chat.\", {\n description: error instanceof Error ? error.message : String(error),\n });\n }\n },\n [context],\n );\n return useMemo(\n () => ({ linkTo, copyLink, setPinned, setArchived, setUnread }),\n [linkTo, copyLink, setPinned, setArchived, setUnread],\n );\n}\n","/**\n * The action registry: everything a person can do from the keyboard, the ⌘K\n * menu, menus and the desktop menu bar. Each action is defined once here, with\n * its name, keys and availability, so every surface shows and runs it the same\n * way. See docs/command-menu-and-shortcuts.md.\n */\nimport {\n ArchiveIcon,\n ArchiveRestoreIcon,\n ArrowDownIcon,\n ArrowUpIcon,\n ChevronsUpDownIcon,\n CommandIcon,\n GitForkIcon,\n HistoryIcon,\n InboxIcon,\n KeyboardIcon,\n LinkIcon,\n MailIcon,\n MailOpenIcon,\n PanelLeftIcon,\n PanelRightIcon,\n PencilIcon,\n PinIcon,\n PinOffIcon,\n PlusIcon,\n SearchIcon,\n TextSearchIcon,\n type LucideIcon,\n} from \"lucide-react\";\nimport type { SessionListRow } from \"../../../session-list-model\";\nimport type { ActionSurface, Chord, ChordPlatform } from \"./chords\";\nimport type { ChatOperations } from \"./chat-operations\";\n\nexport type ActionGroup = \"chat\" | \"navigate\" | \"view\" | \"help\";\n\n/** Where the desktop menu bar shows an action. */\nexport type DesktopMenuPlacement = \"file\" | \"view\" | \"go\" | \"chat\" | \"help\";\n\n/** A workspace someone can switch to, in the workspace picker's order. */\nexport type WorkspaceChoice = {\n id: string;\n name: string;\n /** The workspace's organization, by name. */\n organization: string;\n /** A Personal workspace, private to its owner. */\n personal: boolean;\n};\n\nexport type ActionEnv = {\n workspaceId: string;\n subjectId: string;\n surface: ActionSurface;\n platform: ChordPlatform;\n /** The chat on screen, if any. */\n currentChat: SessionListRow | null;\n ops: ChatOperations;\n /** Whether the sidebar's chat list is part of this surface. */\n chatList: boolean;\n /** Whether chats have the right-hand workspace panel on this surface. */\n workspacePanel: boolean;\n /** Every workspace open to the person, in the workspace picker's order. */\n workspaces: readonly WorkspaceChoice[];\n /** Whether the person may fork the chat on screen. */\n canForkCurrentChat: boolean;\n newChat(): void;\n /** Opens a chat; one in another workspace switches to that workspace. */\n openChat(chatId: string, workspaceId?: string): void;\n openWorkspace(workspaceId: string): void;\n /** The ⌘K menu, listing workspaces to switch to. */\n openWorkspacePicker(): void;\n openInbox(): void;\n toggleSidebar(): void;\n toggleWorkspacePanel(): void;\n findInChat(): void;\n searchMessages(query?: string): void;\n renameCurrentChat(): void;\n /** Asks the chat on screen to fork from its latest message. */\n forkCurrentChat(): void;\n openCommandMenu(): void;\n openShortcutSheet(): void;\n /** Back to the most recently viewed other chat (a quick Control+Tab). */\n switchToRecentChat(): void;\n /** Chats in sidebar order, and the pinned ones in their order. */\n sidebarOrder(): readonly string[];\n pinnedOrder(): readonly string[];\n};\n\nexport type AppAction = {\n id: string;\n /** Plain words; chat actions may read the chat (Pin or Unpin). */\n title: string | ((env: ActionEnv, chat: SessionListRow | null) => string);\n group: ActionGroup;\n icon: LucideIcon;\n /** A different icon for some chats (Unpin for a pinned chat). */\n iconFor?: (chat: SessionListRow | null) => LucideIcon;\n /** Extra words the ⌘K menu matches, e.g. \"share\" for Copy link. */\n keywords?: readonly string[];\n chords?: readonly Chord[];\n /** The cheat sheet's own key text when one action has many chords (⌘1 to ⌘9). */\n chordSummary?: (platform: ChordPlatform) => string;\n /** Acts on a chat: the current one, or the one a menu or ⌘K row points at. */\n forChat?: boolean;\n /** Listed in the ⌘K menu (some exist only as keys). Default true. */\n inCommandMenu?: boolean;\n /**\n * Opens a dialog of its own. From ⌘K it runs once the menu has handed focus\n * back, so the new dialog returns focus to the same place when it closes.\n */\n opensDialog?: boolean;\n /** Offered in ⌘K before anything is typed. */\n suggested?: boolean;\n /** The desktop menu bar section, when it appears there. */\n desktopMenu?: DesktopMenuPlacement;\n available(env: ActionEnv, chat: SessionListRow | null): boolean;\n run(env: ActionEnv, chat: SessionListRow | null, chord?: Chord): void | Promise<void>;\n};\n\nexport function actionTitle(\n action: AppAction,\n env: ActionEnv,\n chat: SessionListRow | null,\n): string {\n return typeof action.title === \"string\" ? action.title : action.title(env, chat);\n}\n\nexport function actionIcon(action: AppAction, chat: SessionListRow | null): LucideIcon {\n return action.iconFor?.(chat) ?? action.icon;\n}\n\nconst ALWAYS = () => true;\n\nfunction stepChat(env: ActionEnv, direction: 1 | -1): void {\n const order = env.sidebarOrder();\n if (order.length === 0) return;\n const index = env.currentChat ? order.indexOf(env.currentChat.id) : -1;\n const next = index < 0 ? (direction === 1 ? 0 : order.length - 1) : index + direction;\n if (next < 0 || next >= order.length) return;\n env.openChat(order[next]!);\n}\n\n/** The previous or next workspace in the picker's order, wrapping around. */\nexport function stepWorkspace(\n workspaces: readonly Pick<WorkspaceChoice, \"id\">[],\n currentId: string,\n direction: 1 | -1,\n): string | null {\n if (workspaces.length < 2) return null;\n const index = workspaces.findIndex((workspace) => workspace.id === currentId);\n const next =\n index < 0\n ? direction === 1\n ? 0\n : workspaces.length - 1\n : (index + direction + workspaces.length) % workspaces.length;\n return workspaces[next]!.id;\n}\n\nfunction switchWorkspace(env: ActionEnv, direction: 1 | -1): void {\n const id = stepWorkspace(env.workspaces, env.workspaceId, direction);\n if (id && id !== env.workspaceId) env.openWorkspace(id);\n}\n\nconst hasOtherWorkspaces = (env: ActionEnv) => env.workspaces.length > 1;\n\nconst PINNED_CHORDS: Chord[] = Array.from({ length: 9 }, (_, index) => ({\n code: `Digit${index + 1}`,\n mod: true,\n only: \"desktop\" as const,\n}));\n\nlet appActionList: readonly AppAction[] | undefined;\n\n/**\n * Every action, built on first use. The icons come from chunks the router\n * shares with other routes; reading them while this module loads can see them\n * before they exist, depending on which route a visitor opens first.\n */\nexport function appActions(): readonly AppAction[] {\n return (appActionList ??= [\n {\n id: \"commandMenu.open\",\n title: \"Command menu\",\n group: \"help\",\n icon: CommandIcon,\n chords: [{ code: \"KeyK\", mod: true }],\n inCommandMenu: false,\n desktopMenu: \"go\",\n available: ALWAYS,\n run: (env) => env.openCommandMenu(),\n },\n {\n id: \"chat.new\",\n title: \"New chat\",\n group: \"chat\",\n icon: PlusIcon,\n keywords: [\"start\", \"create\", \"session\"],\n // The desktop menu shows its first key, the familiar ⌘N; browsers keep ⌘N for windows.\n chords: [\n { code: \"KeyN\", mod: true, only: \"desktop\" },\n { code: \"KeyO\", mod: true, shift: true },\n ],\n suggested: true,\n desktopMenu: \"file\",\n available: ALWAYS,\n run: (env) => env.newChat(),\n },\n {\n id: \"chat.copyLink\",\n title: \"Copy link\",\n group: \"chat\",\n icon: LinkIcon,\n keywords: [\"share\", \"url\", \"address\"],\n chords: [{ code: \"Comma\", mod: true, shift: true }],\n forChat: true,\n suggested: true,\n desktopMenu: \"chat\",\n available: (_env, chat) => chat !== null,\n run: (env, chat) => (chat ? env.ops.copyLink(chat) : undefined),\n },\n {\n id: \"chat.pin\",\n title: (_env, chat) => (chat?.pinned ? \"Unpin\" : \"Pin\"),\n group: \"chat\",\n icon: PinIcon,\n iconFor: (chat) => (chat?.pinned ? PinOffIcon : PinIcon),\n keywords: [\"unpin\", \"favorite\", \"star\"],\n chords: [{ code: \"KeyP\", mod: true, alt: true }],\n forChat: true,\n suggested: true,\n desktopMenu: \"chat\",\n available: (_env, chat) => chat !== null && !chat.archived,\n run: (env, chat) => (chat ? env.ops.setPinned(chat, !chat.pinned) : undefined),\n },\n {\n id: \"chat.rename\",\n title: \"Rename\",\n group: \"chat\",\n icon: PencilIcon,\n keywords: [\"title\", \"name\"],\n forChat: true,\n desktopMenu: \"chat\",\n // Renaming happens in the chat's own title, so only for the chat on screen.\n available: (env, chat) => chat !== null && env.currentChat?.id === chat.id,\n run: (env) => env.renameCurrentChat(),\n },\n {\n id: \"chat.fork\",\n title: \"Fork chat\",\n group: \"chat\",\n icon: GitForkIcon,\n keywords: [\"copy\", \"duplicate\", \"branch\", \"clone\"],\n forChat: true,\n opensDialog: true,\n desktopMenu: \"chat\",\n // From the latest message, as the fork button under a message does; only\n // for the chat on screen, whose messages are loaded.\n available: (env, chat) =>\n chat !== null && env.currentChat?.id === chat.id && env.canForkCurrentChat,\n run: (env) => env.forkCurrentChat(),\n },\n {\n id: \"chat.unread\",\n title: (_env, chat) => (chat?.unread ? \"Mark as read\" : \"Mark as unread\"),\n group: \"chat\",\n icon: MailIcon,\n iconFor: (chat) => (chat?.unread ? MailOpenIcon : MailIcon),\n keywords: [\"read\", \"unread\"],\n forChat: true,\n desktopMenu: \"chat\",\n available: (_env, chat) => chat !== null && !chat.archived,\n run: (env, chat) => (chat ? env.ops.setUnread(chat, !chat.unread) : undefined),\n },\n {\n id: \"chat.archive\",\n title: (_env, chat) => (chat?.archived ? \"Restore\" : \"Archive\"),\n group: \"chat\",\n icon: ArchiveIcon,\n iconFor: (chat) => (chat?.archived ? ArchiveRestoreIcon : ArchiveIcon),\n keywords: [\"restore\", \"hide\", \"done\"],\n // Apple Mail's Archive key; Ctrl+Alt elsewhere, as Pin, since browsers there\n // keep Ctrl+Shift+A for tab search.\n chords: [\n { code: \"KeyA\", mod: true, control: true, platform: \"mac\" },\n { code: \"KeyA\", mod: true, alt: true, platform: \"other\" },\n ],\n forChat: true,\n desktopMenu: \"chat\",\n available: (_env, chat) => chat !== null && chat.parentSessionId === null,\n run: (env, chat) => (chat ? env.ops.setArchived(chat, !chat.archived) : undefined),\n },\n {\n id: \"chat.find\",\n title: \"Find in chat\",\n group: \"chat\",\n icon: TextSearchIcon,\n keywords: [\"search\", \"find\"],\n chords: [{ code: \"KeyF\", mod: true }],\n desktopMenu: \"chat\",\n // The conversation owns ⌘F itself; the registry lists it so it is discoverable.\n available: (env) => env.currentChat !== null,\n run: (env) => env.findInChat(),\n },\n {\n id: \"go.inbox\",\n title: \"Inbox\",\n group: \"navigate\",\n icon: InboxIcon,\n keywords: [\"notifications\", \"replies\", \"needs you\"],\n chords: [\n { code: \"KeyI\", mod: true, shift: true, platform: \"mac\" },\n // Browsers on Windows and Linux open developer tools with Ctrl+Shift+I.\n { code: \"KeyI\", mod: true, shift: true, platform: \"other\", only: \"desktop\" },\n ],\n suggested: true,\n desktopMenu: \"go\",\n available: ALWAYS,\n run: (env) => env.openInbox(),\n },\n {\n id: \"go.previousChat\",\n title: \"Previous chat\",\n group: \"navigate\",\n icon: ArrowUpIcon,\n chords: [{ code: \"ArrowUp\", alt: true }],\n inCommandMenu: false,\n available: (env) => env.chatList,\n run: (env) => stepChat(env, -1),\n },\n {\n id: \"go.nextChat\",\n title: \"Next chat\",\n group: \"navigate\",\n icon: ArrowDownIcon,\n chords: [{ code: \"ArrowDown\", alt: true }],\n inCommandMenu: false,\n available: (env) => env.chatList,\n run: (env) => stepChat(env, 1),\n },\n {\n // Hold Control to see recent chats and keep pressing Tab; release to open.\n // The actions provider runs the switcher itself because it needs Control's\n // release, so the desktop menu bar never owns this key.\n id: \"go.recentChat\",\n title: \"Switch to recent chat\",\n group: \"navigate\",\n icon: HistoryIcon,\n chords: [\n { code: \"Tab\", control: true, platform: \"mac\", only: \"desktop\" },\n // Browsers keep Control+Tab for their own tabs.\n { code: \"Tab\", mod: true, platform: \"other\", only: \"desktop\" },\n ],\n inCommandMenu: false,\n available: ALWAYS,\n run: (env) => env.switchToRecentChat(),\n },\n {\n id: \"go.pinnedChat\",\n title: \"Pinned chat 1 to 9\",\n group: \"navigate\",\n icon: PinIcon,\n chords: PINNED_CHORDS,\n chordSummary: (platform) => (platform === \"mac\" ? \"⌘1 – ⌘9\" : \"Ctrl+1 – Ctrl+9\"),\n inCommandMenu: false,\n available: (env) => env.chatList,\n run: (env, _chat, chord) => {\n const index = chord ? Number(chord.code.slice(5)) - 1 : 0;\n const id = env.pinnedOrder()[index];\n if (id) env.openChat(id);\n },\n },\n {\n id: \"go.searchMessages\",\n title: \"Search messages\",\n group: \"navigate\",\n icon: SearchIcon,\n keywords: [\"find\", \"history\", \"full text\"],\n opensDialog: true,\n desktopMenu: \"go\",\n available: ALWAYS,\n run: (env) => env.searchMessages(),\n },\n {\n id: \"go.switchWorkspace\",\n title: \"Switch workspace…\",\n group: \"navigate\",\n icon: ChevronsUpDownIcon,\n keywords: [\"workspace\", \"organization\", \"team\", \"change\", \"go to\"],\n desktopMenu: \"go\",\n available: hasOtherWorkspaces,\n run: (env) => env.openWorkspacePicker(),\n },\n {\n // The workspace picker's order, wrapping around. ⌥⌘ and arrows sit in the\n // same place on every keyboard layout, and browsers leave them alone.\n id: \"go.previousWorkspace\",\n title: \"Previous workspace\",\n group: \"navigate\",\n icon: ArrowUpIcon,\n chords: [\n { code: \"ArrowUp\", mod: true, alt: true },\n // Some Linux desktops take Ctrl+Alt+arrows to switch their own workspaces.\n { code: \"PageUp\", mod: true, shift: true, platform: \"other\", only: \"desktop\" },\n ],\n inCommandMenu: false,\n desktopMenu: \"go\",\n available: hasOtherWorkspaces,\n run: (env) => switchWorkspace(env, -1),\n },\n {\n id: \"go.nextWorkspace\",\n title: \"Next workspace\",\n group: \"navigate\",\n icon: ArrowDownIcon,\n chords: [\n { code: \"ArrowDown\", mod: true, alt: true },\n { code: \"PageDown\", mod: true, shift: true, platform: \"other\", only: \"desktop\" },\n ],\n inCommandMenu: false,\n desktopMenu: \"go\",\n available: hasOtherWorkspaces,\n run: (env) => switchWorkspace(env, 1),\n },\n {\n id: \"view.sidebar\",\n title: \"Toggle sidebar\",\n group: \"view\",\n icon: PanelLeftIcon,\n keywords: [\"hide\", \"show\", \"collapse\", \"rail\"],\n // ⌘B as in most editors and chat apps. It is bold in rich text, so the menu\n // bar shows the platform's standard sidebar key instead, which also works.\n chords: [\n { code: \"KeyB\", mod: true, formatting: true },\n { code: \"KeyS\", mod: true, control: true, platform: \"mac\" },\n { code: \"KeyS\", mod: true, shift: true, platform: \"other\" },\n ],\n desktopMenu: \"view\",\n available: (env) => env.chatList,\n run: (env) => env.toggleSidebar(),\n },\n {\n id: \"view.workspacePanel\",\n title: \"Toggle workspace panel\",\n group: \"view\",\n icon: PanelRightIcon,\n keywords: [\"right\", \"inspector\", \"files\", \"browser\", \"terminal\", \"hide\", \"show\"],\n // The second sidebar's key in VS Code and Cursor.\n chords: [{ code: \"KeyB\", mod: true, alt: true }],\n desktopMenu: \"view\",\n available: (env) => env.workspacePanel && env.currentChat !== null,\n run: (env) => env.toggleWorkspacePanel(),\n },\n {\n id: \"help.shortcuts\",\n title: \"Keyboard shortcuts\",\n group: \"help\",\n icon: KeyboardIcon,\n keywords: [\"keys\", \"hotkeys\", \"cheat sheet\", \"help\"],\n chords: [{ code: \"Slash\", mod: true }],\n desktopMenu: \"help\",\n available: ALWAYS,\n run: (env) => env.openShortcutSheet(),\n },\n ]);\n}\n\nexport function findAction(id: string): AppAction | undefined {\n return appActions().find((action) => action.id === id);\n}\n"],"mappings":"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","names":["useCallback","useMemo","useRef","useMemo","useRef","useCallback"]}
@@ -7,13 +7,13 @@ import {
7
7
  useInteractionInterventions,
8
8
  useInteractionInvalidation,
9
9
  useViewerMenuDismiss
10
- } from "./chunk-PEGNFZ3F.js";
10
+ } from "./chunk-P5S777YI.js";
11
11
  import {
12
12
  copyTextToClipboard
13
13
  } from "./chunk-PEHTX3V7.js";
14
14
  import {
15
15
  DesktopViewer
16
- } from "./chunk-WN2MIB4Q.js";
16
+ } from "./chunk-22V2QCEM.js";
17
17
  import {
18
18
  usePageLiveActivity
19
19
  } from "./chunk-2KO2G3RI.js";
@@ -34,7 +34,7 @@ import {
34
34
  } from "./chunk-TXS65BB2.js";
35
35
  import {
36
36
  useOpenGeniText
37
- } from "./chunk-S6WJ6TUT.js";
37
+ } from "./chunk-ZEVJGMNB.js";
38
38
 
39
39
  // src/components/computer-viewer.tsx
40
40
  import { interactionControlFailureFromError } from "@opengeni/sdk/interaction";
@@ -2980,4 +2980,4 @@ export {
2980
2980
  ComputerViewer,
2981
2981
  computerKey
2982
2982
  };
2983
- //# sourceMappingURL=chunk-24POWVUY.js.map
2983
+ //# sourceMappingURL=chunk-ZDJNRRVS.js.map
@@ -1572,7 +1572,7 @@ var englishMessages = {
1572
1572
  "modelPolicy.billedToTheWorkspaceProvider": "Billed to the workspace provider account",
1573
1573
  "modelPolicy.billedToTheWorkspaceVercel": "Billed to the workspace Vercel account",
1574
1574
  "modelPolicy.blockedByWorkspacePolicy": "Blocked by workspace policy",
1575
- "modelPolicy.claudeSubscription": "Claude subscription",
1575
+ "modelPolicy.claudeSubscription": "Claude",
1576
1576
  "modelPolicy.claudeSubscriptionExternalBilling": "Claude subscription \xB7 external billing",
1577
1577
  "modelPolicy.codex": "Codex",
1578
1578
  "modelPolicy.codexSubscriptionExternalBilling": "Codex subscription \xB7 external billing",
@@ -3870,4 +3870,4 @@ export {
3870
3870
  SingleSendWording,
3871
3871
  useOpenGeniLocale
3872
3872
  };
3873
- //# sourceMappingURL=chunk-S6WJ6TUT.js.map
3873
+ //# sourceMappingURL=chunk-ZEVJGMNB.js.map