@opengeni/react 6.8.0 → 6.9.1-canary.41937124785001

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 (719) hide show
  1. package/dist/app/app-state.js +8 -8
  2. package/dist/app/components/Composer.js +18 -18
  3. package/dist/app/components/agent/agent-capability-picker.js +6 -6
  4. package/dist/app/components/artifacts/artifact-library.js +6 -6
  5. package/dist/app/components/artifacts/artifact-viewer.js +18 -18
  6. package/dist/app/components/artifacts/chat-interactive-block.js +11 -11
  7. package/dist/app/components/artifacts/file-reach-dialog.js +6 -6
  8. package/dist/app/components/artifacts/inline-chat-image.js +19 -19
  9. package/dist/app/components/artifacts/retained-file-preview.js +20 -20
  10. package/dist/app/components/artifacts/retained-text-preview.js +3 -3
  11. package/dist/app/components/artifacts/site-audience.js +3 -3
  12. package/dist/app/components/artifacts/site-conversations.js +9 -9
  13. package/dist/app/components/artifacts/site-data.js +10 -10
  14. package/dist/app/components/artifacts/site-publishing-page.js +25 -25
  15. package/dist/app/components/artifacts/site-publishing.js +22 -22
  16. package/dist/app/components/artifacts/site-settings.js +24 -24
  17. package/dist/app/components/artifacts/site-version-menu.js +3 -3
  18. package/dist/app/components/billing-class-mark.js +3 -3
  19. package/dist/app/components/bots/bot-launch-strip.js +20 -20
  20. package/dist/app/components/bots/bot-template-dialog.js +26 -26
  21. package/dist/app/components/bots/bot-template-shortcuts.js +20 -20
  22. package/dist/app/components/bots/bot-templates-page.js +30 -30
  23. package/dist/app/components/capabilities/capability-detail-sheet.js +6 -6
  24. package/dist/app/components/capabilities/capability-logo-source.js +13 -13
  25. package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
  26. package/dist/app/components/capabilities/native-connect-setup.js +13 -13
  27. package/dist/app/components/capabilities/own-logins-shared-heads-up.js +3 -3
  28. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -15
  29. package/dist/app/components/capabilities/session-capability-card.js +52 -52
  30. package/dist/app/components/capabilities/session-chrome-card.js +20 -20
  31. package/dist/app/components/capabilities/session-custom-mcp-card.js +16 -16
  32. package/dist/app/components/capabilities/session-github-card.js +16 -16
  33. package/dist/app/components/capabilities/session-machine-card.js +19 -19
  34. package/dist/app/components/capabilities/session-personal-github-card.js +14 -14
  35. package/dist/app/components/capabilities/session-plugin-card.js +8 -8
  36. package/dist/app/components/command-menu/chat-status.js +15 -15
  37. package/dist/app/components/command-menu/chat-switcher.js +35 -35
  38. package/dist/app/components/command-menu/command-menu.js +39 -39
  39. package/dist/app/components/command-menu/shortcut-sheet.js +8 -8
  40. package/dist/app/components/composer-capabilities-menu-body.js +4 -4
  41. package/dist/app/components/composer-mobile-plus-panel.js +8 -8
  42. package/dist/app/components/composer-mobile-plus.js +1 -1
  43. package/dist/app/components/desktop/app-shots.js +6 -6
  44. package/dist/app/components/desktop/computer-use.js +2 -2
  45. package/dist/app/components/desktop/this-computer.js +5 -5
  46. package/dist/app/components/feedback.js +3 -3
  47. package/dist/app/components/github-app-connect-launcher.js +1 -1
  48. package/dist/app/components/machines/connect-machine-dialog.js +11 -11
  49. package/dist/app/components/markdown.js +6 -6
  50. package/dist/app/components/models/models-ui.js +5 -5
  51. package/dist/app/components/models/subscription-usage.d.ts +34 -0
  52. package/dist/app/components/models/subscription-usage.js +24 -0
  53. package/dist/app/components/my-things.js +4 -4
  54. package/dist/app/components/own-where-it-works.js +3 -3
  55. package/dist/app/components/personal-resource-attachment-surface.js +4 -4
  56. package/dist/app/components/pickers.js +5 -5
  57. package/dist/app/components/rail/channel-create-dialog.js +3 -3
  58. package/dist/app/components/rail/project-glyph.js +20 -20
  59. package/dist/app/components/rail/project-profile.js +27 -27
  60. package/dist/app/components/rail/rail-context.js +1 -1
  61. package/dist/app/components/rail/rail-sections.js +55 -55
  62. package/dist/app/components/rail/session-header.js +47 -47
  63. package/dist/app/components/rail/session-list.js +53 -53
  64. package/dist/app/components/rail/session-row-content.js +4 -4
  65. package/dist/app/components/rail/session-row-hover-details.js +14 -14
  66. package/dist/app/components/rail/session-shell.js +76 -73
  67. package/dist/app/components/rail/site-session-group-heading.js +8 -8
  68. package/dist/app/components/session/agent-configuration-panel.js +12 -12
  69. package/dist/app/components/session/banners.js +8 -8
  70. package/dist/app/components/session/console-new-conversation.js +39 -39
  71. package/dist/app/components/session/descendant-requests.js +36 -36
  72. package/dist/app/components/session/editable-artifacts-workspace.js +16 -16
  73. package/dist/app/components/session/failed-session-banner.js +6 -6
  74. package/dist/app/components/session/failure-recovery-boundary.js +3 -3
  75. package/dist/app/components/session/human-input-delegation-record.js +2 -2
  76. package/dist/app/components/session/human-input.js +33 -33
  77. package/dist/app/components/session/inspector.js +43 -43
  78. package/dist/app/components/session/message-actions.js +3 -3
  79. package/dist/app/components/session/message-resource-attachments.js +10 -10
  80. package/dist/app/components/session/model-recovery-notice.js +3 -3
  81. package/dist/app/components/session/new-session-settings-menu.js +6 -6
  82. package/dist/app/components/session/new-session-setup-strip.js +21 -21
  83. package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
  84. package/dist/app/components/session/sandbox-switcher.js +7 -7
  85. package/dist/app/components/session/sandbox-workspace.js +48 -48
  86. package/dist/app/components/session/search-markdown-highlight.js +7 -7
  87. package/dist/app/components/session/search-results-view.js +8 -8
  88. package/dist/app/components/session/session-admin-access.js +4 -4
  89. package/dist/app/components/session/session-admission-notice.js +4 -4
  90. package/dist/app/components/session/session-avatar-picker.js +21 -21
  91. package/dist/app/components/session/session-avatar.js +19 -19
  92. package/dist/app/components/session/session-machine-access-notice.js +4 -4
  93. package/dist/app/components/session/session-profile-dialog.js +25 -25
  94. package/dist/app/components/session/session-profile-editor.js +26 -26
  95. package/dist/app/components/session/session-retention.js +3 -3
  96. package/dist/app/components/session/session-search-dialog.js +8 -8
  97. package/dist/app/components/session/session-tenancy-control.js +2 -2
  98. package/dist/app/components/session/session-usage-limit-section.js +4 -4
  99. package/dist/app/components/session/share-chat-dialog.js +5 -5
  100. package/dist/app/components/session/subagents.js +8 -8
  101. package/dist/app/components/session/subscription-account-indicator.js +12 -7
  102. package/dist/app/components/session/subscription-account-menu.d.ts +15 -15
  103. package/dist/app/components/session/subscription-account-menu.js +6 -1
  104. package/dist/app/components/session/subscription-account.d.ts +16 -9
  105. package/dist/app/components/settings/row-select.js +4 -4
  106. package/dist/app/components/transcription-settings.js +6 -6
  107. package/dist/app/components/ui/destructive-confirm.js +5 -5
  108. package/dist/app/components/usage/usage-entry.js +3 -3
  109. package/dist/app/components/window-bar.js +9 -9
  110. package/dist/app/components/workspace-composer-plus.js +16 -16
  111. package/dist/app/components/workspace-reach.js +4 -4
  112. package/dist/app/embed/session-app.js +160 -157
  113. package/dist/app/lib/actions/actions-provider.js +8 -8
  114. package/dist/app/lib/agent-capabilities.d.ts +12 -2
  115. package/dist/app/lib/agent-capabilities.js +3 -3
  116. package/dist/app/lib/codex-usage-query.js +2 -2
  117. package/dist/app/lib/composer-connectors.js +14 -14
  118. package/dist/app/lib/console-site.js +2 -2
  119. package/dist/app/lib/console-text.js +2 -2
  120. package/dist/app/lib/events.js +12 -12
  121. package/dist/app/lib/failed-session-copy.js +3 -3
  122. package/dist/app/lib/model-access-onboarding.js +3 -3
  123. package/dist/app/lib/move-chat-to-machine.js +3 -3
  124. package/dist/app/lib/session-branch-cache.js +8 -8
  125. package/dist/app/lib/session-create.js +4 -4
  126. package/dist/app/lib/session-group-pagination.js +8 -8
  127. package/dist/app/lib/session-hover-facts.js +13 -13
  128. package/dist/app/lib/session-model.js +2 -2
  129. package/dist/app/lib/session-pins.js +1 -1
  130. package/dist/app/lib/session-rail.js +5 -5
  131. package/dist/app/lib/session-rename.js +3 -3
  132. package/dist/app/lib/sessions-group.d.ts +5 -3
  133. package/dist/app/lib/sessions-group.js +7 -7
  134. package/dist/app/lib/site-tool-consent-dialog.js +7 -7
  135. package/dist/app/lib/site-tool-consent.js +1 -1
  136. package/dist/app/lib/subscription-accounts.d.ts +79 -0
  137. package/dist/app/lib/subscription-accounts.js +18 -0
  138. package/dist/app/lib/turn-failure-analytics.js +4 -4
  139. package/dist/app/lib/use-follow-up-repositories.js +3 -3
  140. package/dist/app/lib/use-workspace-machines.js +4 -4
  141. package/dist/app/lib/use-workspace-model-catalog.js +3 -3
  142. package/dist/app/lib/use-workspace-rigs.js +2 -2
  143. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  144. package/dist/app/lib/workspace-scope-context.js +3 -3
  145. package/dist/app/routes/artifacts.js +48 -48
  146. package/dist/app/routes/retained-artifact.js +32 -32
  147. package/dist/app/routes/session.js +96 -96
  148. package/dist/app/routes/sessions-index-hydration.js +5 -5
  149. package/dist/app/routes/sessions-index.js +76 -76
  150. package/dist/app/routes/site-view.js +55 -55
  151. package/dist/artifacts-document.js +4 -4
  152. package/dist/artifacts-presentation.js +4 -4
  153. package/dist/artifacts-spreadsheet.js +4 -4
  154. package/dist/artifacts.js +10 -10
  155. package/dist/automations.js +10 -10
  156. package/dist/{browser-viewer-ZHQDVHZ2.js → browser-viewer-F4FL7JKB.js} +4 -4
  157. package/dist/{chat-interactive-block-VSDD6X3M.js → chat-interactive-block-4U5JWRSY.js} +5 -5
  158. package/dist/{chunk-4K64EKM7.js → chunk-22YIIM3X.js} +4 -4
  159. package/dist/{chunk-3NNAC43A.js → chunk-2N7ACQ7M.js} +2 -2
  160. package/dist/{chunk-7Z76QP64.js → chunk-2PY5XD3F.js} +35 -5
  161. package/dist/chunk-2PY5XD3F.js.map +1 -0
  162. package/dist/{chunk-WDASYY4S.js → chunk-2TEYUDJD.js} +8 -8
  163. package/dist/{chunk-OTW25A6I.js → chunk-37JJQNZB.js} +3 -3
  164. package/dist/{chunk-VCJQQYRE.js → chunk-3DWQPURZ.js} +4 -4
  165. package/dist/{chunk-GTRAH4FG.js → chunk-3GWC3FU3.js} +2 -2
  166. package/dist/{chunk-AB5IW227.js → chunk-3ICY6LP3.js} +3 -3
  167. package/dist/{chunk-WIFDNUKD.js → chunk-3OCU5RX5.js} +3 -3
  168. package/dist/{chunk-UBRQ3PQD.js → chunk-3SPDJLOR.js} +2 -2
  169. package/dist/{chunk-IZXYFWA4.js → chunk-3WVLR7UA.js} +12 -12
  170. package/dist/{chunk-DEHLWZSI.js → chunk-3XMB3L57.js} +4 -4
  171. package/dist/{chunk-AJBDAVX3.js → chunk-4IUOBO2H.js} +7 -7
  172. package/dist/{chunk-NFCS5WYC.js → chunk-4KQ3A3EO.js} +3 -3
  173. package/dist/{chunk-LIJNVIT3.js → chunk-4L5B5AZT.js} +3 -3
  174. package/dist/{chunk-EDDKPIIV.js → chunk-4NB3TPNE.js} +2 -2
  175. package/dist/{chunk-PSM3CU7N.js → chunk-4TDKXHCD.js} +46 -39
  176. package/dist/chunk-4TDKXHCD.js.map +1 -0
  177. package/dist/{chunk-OJWDNNW3.js → chunk-4TPTGBIO.js} +5 -5
  178. package/dist/{chunk-J2WY42FA.js → chunk-4UHGW6WF.js} +2 -2
  179. package/dist/{chunk-7NLF35YL.js → chunk-4YN2JLYK.js} +4 -4
  180. package/dist/{chunk-OOOSGPJL.js → chunk-53MYEEMA.js} +1 -1
  181. package/dist/{chunk-467WDSOK.js → chunk-5HYWXPMA.js} +2 -2
  182. package/dist/{chunk-XMBOLFFS.js → chunk-5IMNL6IV.js} +2 -2
  183. package/dist/{chunk-4Z5X7PLC.js → chunk-5MLM5T5C.js} +3 -3
  184. package/dist/{chunk-YMI27QPF.js → chunk-5NKQZVXP.js} +2 -2
  185. package/dist/{chunk-ZW5YTIH3.js → chunk-5PB46DAA.js} +1 -1
  186. package/dist/{chunk-ZW5YTIH3.js.map → chunk-5PB46DAA.js.map} +1 -1
  187. package/dist/{chunk-CYDXCILL.js → chunk-5SODSGW7.js} +7 -7
  188. package/dist/{chunk-Q5EZNBPI.js → chunk-5YAJASCO.js} +3 -3
  189. package/dist/{chunk-M3FDGRB4.js → chunk-62XAL5BA.js} +3 -3
  190. package/dist/{chunk-SGH7I7OY.js → chunk-67R6NAFI.js} +2 -2
  191. package/dist/{chunk-Q5K2J5GG.js → chunk-6BN3RU7T.js} +13 -3
  192. package/dist/chunk-6BN3RU7T.js.map +1 -0
  193. package/dist/{chunk-PYB4BFEC.js → chunk-6BQLDL6R.js} +3 -3
  194. package/dist/{chunk-YJSCLGAW.js → chunk-6EZYHJTL.js} +3 -3
  195. package/dist/{chunk-OWET7EY2.js → chunk-6GW7NJMK.js} +19 -13
  196. package/dist/{chunk-OWET7EY2.js.map → chunk-6GW7NJMK.js.map} +1 -1
  197. package/dist/{chunk-G5UQBTXY.js → chunk-6LXIL3Q3.js} +2 -2
  198. package/dist/{chunk-T67LTMSW.js → chunk-6LYVAJFZ.js} +10 -10
  199. package/dist/{chunk-3L465FBR.js → chunk-6WB5UXMZ.js} +6 -6
  200. package/dist/{chunk-EKJHOWTZ.js → chunk-74UGYVCA.js} +4 -4
  201. package/dist/{chunk-PWUSSSSL.js → chunk-7BTNYZC7.js} +2 -2
  202. package/dist/{chunk-NQ2CPQJF.js → chunk-7D3WIDKK.js} +26 -3
  203. package/dist/chunk-7D3WIDKK.js.map +1 -0
  204. package/dist/{chunk-ESXAECZ3.js → chunk-7KZFGA25.js} +2 -2
  205. package/dist/{chunk-EGKARC53.js → chunk-7MGDX2TD.js} +2 -2
  206. package/dist/{chunk-Y3XZEKDQ.js → chunk-7N3GFGB6.js} +2 -2
  207. package/dist/{chunk-AH3DGOTK.js → chunk-7SFSN6AX.js} +2 -2
  208. package/dist/{chunk-QPQ7R77C.js → chunk-7SU4YVZ5.js} +5 -1
  209. package/dist/chunk-7SU4YVZ5.js.map +1 -0
  210. package/dist/{chunk-6QK65ZWM.js → chunk-7TGUHFGO.js} +3 -3
  211. package/dist/{chunk-QURYQFDN.js → chunk-7ZIWO65F.js} +2 -2
  212. package/dist/{chunk-OYCK4JRS.js → chunk-AJHLEJTK.js} +2 -2
  213. package/dist/{chunk-3PZ3LRPV.js → chunk-AN4U7EPH.js} +3 -3
  214. package/dist/{chunk-77BHKC43.js → chunk-APG6CEG7.js} +1 -1
  215. package/dist/{chunk-FSDQQQIA.js → chunk-APHLXQNP.js} +3 -3
  216. package/dist/{chunk-SN2WENRP.js → chunk-AXHQ7QXV.js} +3 -3
  217. package/dist/{chunk-54U6ZBEX.js → chunk-AYTLSPF6.js} +3 -3
  218. package/dist/{chunk-WYGTAQMX.js → chunk-AZFVRPQM.js} +76 -22
  219. package/dist/chunk-AZFVRPQM.js.map +1 -0
  220. package/dist/{chunk-R33SBMB7.js → chunk-BBSKKBMV.js} +3 -3
  221. package/dist/{chunk-2GCHGWNE.js → chunk-BGH6TU2P.js} +3 -3
  222. package/dist/{chunk-D3PTVN2I.js → chunk-BGIYL26H.js} +2 -2
  223. package/dist/{chunk-BQYRZIZ7.js → chunk-BL7UQUC3.js} +2 -2
  224. package/dist/{chunk-EBTUPRRQ.js → chunk-BOUHCYL6.js} +4 -4
  225. package/dist/{chunk-MKDFYE2E.js → chunk-BVNGDFBC.js} +2 -2
  226. package/dist/{chunk-ICAMYP5M.js → chunk-BWJK64CP.js} +2 -2
  227. package/dist/{chunk-RHXYO4H2.js → chunk-BZ2GTCQV.js} +2 -2
  228. package/dist/{chunk-GIWFLWXG.js → chunk-C2KASMJK.js} +4 -4
  229. package/dist/{chunk-KO3OHHY2.js → chunk-CAZDRDQT.js} +2 -2
  230. package/dist/{chunk-OK7BQMCI.js → chunk-CBJRZKZB.js} +9 -9
  231. package/dist/{chunk-OYOFPNLC.js → chunk-CF6NYG7J.js} +4 -4
  232. package/dist/{chunk-MT2R57SF.js → chunk-COITN7WN.js} +2 -2
  233. package/dist/{chunk-OCXTTKVA.js → chunk-CPVOXM2Q.js} +2 -2
  234. package/dist/{chunk-HYEIA25Y.js → chunk-CTZRCBKH.js} +2 -2
  235. package/dist/{chunk-OCXEY7HE.js → chunk-CWL27YTB.js} +2 -2
  236. package/dist/{chunk-K4DQS2ML.js → chunk-D2I33V5P.js} +4 -4
  237. package/dist/{chunk-736RUNIA.js → chunk-DF7WI4JH.js} +4 -4
  238. package/dist/{chunk-KUE5BOQE.js → chunk-DKZYCJCO.js} +4 -4
  239. package/dist/{chunk-74CBR5YE.js → chunk-DQ32FKFQ.js} +2 -2
  240. package/dist/{chunk-4O2XWOLZ.js → chunk-DTKG2YUF.js} +3 -3
  241. package/dist/{chunk-GMHIOYB7.js → chunk-DUDA4V5R.js} +4 -4
  242. package/dist/{chunk-XUOYNJPB.js → chunk-ECROT4M5.js} +24 -24
  243. package/dist/{chunk-PVB4YVDP.js → chunk-EOXV5XGY.js} +2 -2
  244. package/dist/{chunk-U6552Q3T.js → chunk-EQQOZ6DD.js} +2 -2
  245. package/dist/{chunk-G6ICCGJ3.js → chunk-EY6W5H4B.js} +2 -2
  246. package/dist/{chunk-HWVPLFIW.js → chunk-EYRFEWXJ.js} +2 -2
  247. package/dist/{chunk-7YTR3UFO.js → chunk-FB4JWUVJ.js} +8 -5
  248. package/dist/chunk-FB4JWUVJ.js.map +1 -0
  249. package/dist/{chunk-U4LTPFD2.js → chunk-FKK2PD7K.js} +2 -2
  250. package/dist/{chunk-PUUEI4W3.js → chunk-FPHHIC5K.js} +5 -5
  251. package/dist/{chunk-SP44O3OU.js → chunk-FQM6L22H.js} +2 -2
  252. package/dist/{chunk-2J77TWGH.js → chunk-FW22IREV.js} +3 -3
  253. package/dist/{chunk-EBIVTDEG.js → chunk-G4M6AYDB.js} +2 -2
  254. package/dist/{chunk-O4JOE3R7.js → chunk-G55NAU5M.js} +60 -74
  255. package/dist/chunk-G55NAU5M.js.map +1 -0
  256. package/dist/{chunk-BASI553K.js → chunk-G6AZ2WIU.js} +4 -4
  257. package/dist/{chunk-SJYTQLN3.js → chunk-GJ5IDSAX.js} +3 -3
  258. package/dist/{chunk-TDTD66BK.js → chunk-GRDSEZWZ.js} +2 -2
  259. package/dist/{chunk-MV2CLIO6.js → chunk-HBVJIGY2.js} +6 -6
  260. package/dist/{chunk-R4JA5JFI.js → chunk-HCWQLIOE.js} +3 -3
  261. package/dist/{chunk-MZY3VKKM.js → chunk-HEVD4A5G.js} +2 -2
  262. package/dist/{chunk-DLVIRJGK.js → chunk-HNDHSEVJ.js} +2 -2
  263. package/dist/{chunk-LPKJ77EK.js → chunk-HNTZ7B7M.js} +2 -2
  264. package/dist/{chunk-QQIZMVAJ.js → chunk-HQ7GTMII.js} +59 -57
  265. package/dist/chunk-HQ7GTMII.js.map +1 -0
  266. package/dist/{chunk-IN3VQFKS.js → chunk-I2FC7CAI.js} +2 -2
  267. package/dist/{chunk-SK5S2PCK.js → chunk-I7BGHBOM.js} +14 -14
  268. package/dist/chunk-I7BGHBOM.js.map +1 -0
  269. package/dist/{chunk-ZBHGNE2J.js → chunk-IEHZFYMH.js} +3 -3
  270. package/dist/{chunk-DWJ6J3YW.js → chunk-IXISEVD7.js} +4 -4
  271. package/dist/{chunk-TK5FWVZR.js → chunk-IZEDVQUD.js} +3 -3
  272. package/dist/{chunk-HEGV4QMS.js → chunk-J42QE4VO.js} +2 -2
  273. package/dist/{chunk-PRT4J2DL.js → chunk-J555XSUM.js} +2 -2
  274. package/dist/{chunk-SBXSKRFA.js → chunk-JNMHFSDF.js} +3 -3
  275. package/dist/{chunk-KI46GKMD.js → chunk-JTBAOPYO.js} +7 -7
  276. package/dist/{chunk-JHZRAYI4.js → chunk-JWSRFXRN.js} +2 -2
  277. package/dist/chunk-JWSRFXRN.js.map +1 -0
  278. package/dist/{chunk-SXGJL7UT.js → chunk-K376MPJH.js} +14 -14
  279. package/dist/{chunk-OSJ366KR.js → chunk-KEBVT55V.js} +30 -30
  280. package/dist/{chunk-U5UGM5XD.js → chunk-KFIZAXHI.js} +5 -5
  281. package/dist/{chunk-KFNZZ2N6.js → chunk-KKGRDBMK.js} +2 -2
  282. package/dist/{chunk-PLYVGZIN.js → chunk-KKIG6DN5.js} +1 -1
  283. package/dist/{chunk-3OK7Y6ES.js → chunk-KKQO2GAA.js} +2 -2
  284. package/dist/{chunk-DQPIEQGP.js → chunk-KO753ZCZ.js} +2 -2
  285. package/dist/{chunk-YNTLWCF4.js → chunk-KYIRWU65.js} +3 -3
  286. package/dist/{chunk-JKL5S7UQ.js → chunk-L6V63DVI.js} +6 -6
  287. package/dist/{chunk-M5IQVMLR.js → chunk-LAZ2QZTJ.js} +11 -4
  288. package/dist/chunk-LAZ2QZTJ.js.map +1 -0
  289. package/dist/{chunk-CV4VVLPZ.js → chunk-LCNJ2KNS.js} +2 -2
  290. package/dist/{chunk-D74Z2N4K.js → chunk-LE7YKMTU.js} +2 -2
  291. package/dist/{chunk-D5TIVCXG.js → chunk-LEBEOMVT.js} +2 -2
  292. package/dist/chunk-LKLQVANM.js +2 -0
  293. package/dist/{chunk-2OXSB2OL.js → chunk-LKWVBUH6.js} +3 -2
  294. package/dist/chunk-LKWVBUH6.js.map +1 -0
  295. package/dist/{chunk-WXF2RTS4.js → chunk-M6URPYUB.js} +2 -2
  296. package/dist/{chunk-H6BX6WOW.js → chunk-MDHFMRBC.js} +3 -3
  297. package/dist/{chunk-3CDJSKDW.js → chunk-MGZO7CHI.js} +3 -3
  298. package/dist/{chunk-DCEQCGVN.js → chunk-MIWU52TW.js} +2 -2
  299. package/dist/{chunk-PF2WU2IL.js → chunk-ND4IQJUM.js} +120 -17
  300. package/dist/chunk-ND4IQJUM.js.map +1 -0
  301. package/dist/{chunk-3PM3M2Q6.js → chunk-NDXBF3RW.js} +27 -11
  302. package/dist/chunk-NDXBF3RW.js.map +1 -0
  303. package/dist/{chunk-LVELUUK6.js → chunk-NF6QVVMP.js} +2 -2
  304. package/dist/{chunk-UMX6DZME.js → chunk-NTZ5ZNVK.js} +2 -2
  305. package/dist/{chunk-FBA2NXYH.js → chunk-NWLRABUR.js} +3 -3
  306. package/dist/{chunk-TNSJFZ6Q.js → chunk-O2H2U7YS.js} +4 -4
  307. package/dist/{chunk-BFFNINCC.js → chunk-OAL2PPX4.js} +3 -3
  308. package/dist/{chunk-WTSQUCHB.js → chunk-OCYTHZ4A.js} +3 -3
  309. package/dist/{chunk-ZAX4XQLN.js → chunk-OEDTCIXF.js} +2 -2
  310. package/dist/{chunk-CHU3RDV4.js → chunk-OLVSYB3P.js} +3 -3
  311. package/dist/{chunk-PZKHST7A.js → chunk-OQ6QOPK6.js} +10 -3
  312. package/dist/chunk-OQ6QOPK6.js.map +1 -0
  313. package/dist/{chunk-IFSXVU2S.js → chunk-OQHTFOCA.js} +2 -2
  314. package/dist/{chunk-OXQ2SXVC.js → chunk-P56AVROH.js} +2 -2
  315. package/dist/{chunk-CXAN2FHF.js → chunk-PCEJHHGP.js} +6 -6
  316. package/dist/{chunk-5MIBQ4P5.js → chunk-PHGQGVVL.js} +2 -2
  317. package/dist/{chunk-FLWQJDJ5.js → chunk-PUZRHEQI.js} +6 -6
  318. package/dist/{chunk-OP2GD6QW.js → chunk-PV7U6OOJ.js} +2 -2
  319. package/dist/{chunk-SPD4ULVB.js → chunk-PYMROAWS.js} +2 -1
  320. package/dist/chunk-PYMROAWS.js.map +1 -0
  321. package/dist/{chunk-X2QJXDE4.js → chunk-PZQACDH5.js} +8 -8
  322. package/dist/{chunk-CH4UQ4NO.js → chunk-PZTS4O6E.js} +5 -5
  323. package/dist/{chunk-TKQL7EDB.js → chunk-Q42QHUAQ.js} +2 -2
  324. package/dist/{chunk-MRECRNVU.js → chunk-QCYGB6TZ.js} +5 -5
  325. package/dist/{chunk-GSCGKJNK.js → chunk-QECMETOF.js} +2 -2
  326. package/dist/{chunk-RMCLFSMX.js → chunk-QGX3LE6H.js} +2 -2
  327. package/dist/{chunk-HTMQGS63.js → chunk-QI3NDQFP.js} +8 -8
  328. package/dist/{chunk-UU5FBVRX.js → chunk-QZE4BTLA.js} +6 -5
  329. package/dist/chunk-QZE4BTLA.js.map +1 -0
  330. package/dist/{chunk-R5QAL43H.js → chunk-RA3Q52O2.js} +2 -2
  331. package/dist/chunk-RBOHWUSN.js +151 -0
  332. package/dist/chunk-RBOHWUSN.js.map +1 -0
  333. package/dist/{chunk-AJDGP2N4.js → chunk-RJNOQEJJ.js} +20 -20
  334. package/dist/{chunk-477DTTMH.js → chunk-RSFOFUR7.js} +3 -3
  335. package/dist/{chunk-JV5ULONH.js → chunk-RXR6PMSH.js} +39 -39
  336. package/dist/{chunk-J2BTILRR.js → chunk-SM7HFCGC.js} +2 -2
  337. package/dist/{chunk-UTRNLNCW.js → chunk-SN6ZWYOP.js} +69 -97
  338. package/dist/chunk-SN6ZWYOP.js.map +1 -0
  339. package/dist/{chunk-OBGOLHCP.js → chunk-T4HK4XCI.js} +3 -3
  340. package/dist/{chunk-XVLEBB4Y.js → chunk-TBWL6YWL.js} +2 -2
  341. package/dist/{chunk-AAS7OWV6.js → chunk-TIDXYWFX.js} +3 -3
  342. package/dist/{chunk-N3FM4BNA.js → chunk-TKHRGY2P.js} +2 -2
  343. package/dist/{chunk-GU7T2S5N.js → chunk-TU2GSZL7.js} +2 -2
  344. package/dist/{chunk-OI6VI6SU.js → chunk-U6HGJXXQ.js} +8 -8
  345. package/dist/{chunk-4BWMAGJJ.js → chunk-UGRW6RTR.js} +3 -3
  346. package/dist/{chunk-AVXDIRRW.js → chunk-UMRUDYUK.js} +2 -2
  347. package/dist/{chunk-FNXCFIPW.js → chunk-UOT2R5ZD.js} +2 -2
  348. package/dist/{chunk-DIP7YALH.js → chunk-USURKJVT.js} +2 -2
  349. package/dist/{chunk-S27VZ5DO.js → chunk-UU6Q67XM.js} +6 -6
  350. package/dist/{chunk-LTJFV2JI.js → chunk-UZ7NP5CW.js} +2 -2
  351. package/dist/{chunk-H6MJFMHZ.js → chunk-V4FO7UOE.js} +3 -3
  352. package/dist/{chunk-RGR57NYY.js → chunk-V4ZOZRCW.js} +2 -2
  353. package/dist/{chunk-LQKVNREV.js → chunk-V57YMKQZ.js} +3 -3
  354. package/dist/{chunk-XZCCEKPW.js → chunk-VOIWZBY6.js} +6 -6
  355. package/dist/{chunk-E5KOWRDU.js → chunk-VPHPLPDA.js} +2 -2
  356. package/dist/{chunk-OGU73VUN.js → chunk-VUL4KPUU.js} +2 -2
  357. package/dist/{chunk-SFIXTOOJ.js → chunk-VWF6ILAR.js} +3 -3
  358. package/dist/{chunk-FER6EVIY.js → chunk-W54BHJO7.js} +2 -2
  359. package/dist/{chunk-34NV52R3.js → chunk-WCYE4BLC.js} +4 -4
  360. package/dist/{chunk-RISUROBM.js → chunk-WTV25ELY.js} +4 -4
  361. package/dist/{chunk-UO35OEOX.js → chunk-WZYGH7CN.js} +3 -3
  362. package/dist/{chunk-CEMSIU4Z.js → chunk-XG2RWUF7.js} +5 -5
  363. package/dist/chunk-XK72HZ4C.js +147 -0
  364. package/dist/chunk-XK72HZ4C.js.map +1 -0
  365. package/dist/{chunk-K3D7IQQP.js → chunk-XV7QOT7W.js} +6 -6
  366. package/dist/{chunk-GOCODNQS.js → chunk-XWECT3GX.js} +2 -2
  367. package/dist/{chunk-5MHMCE2G.js → chunk-XZQK2ZLW.js} +3 -3
  368. package/dist/{chunk-JV3UI7BH.js → chunk-Y5BR66OH.js} +3 -3
  369. package/dist/{chunk-VXORMNU4.js → chunk-YBHAAULA.js} +67 -2
  370. package/dist/chunk-YBHAAULA.js.map +1 -0
  371. package/dist/{chunk-4F3AEJI6.js → chunk-YD6XU6FY.js} +4 -4
  372. package/dist/{chunk-VATYK3JQ.js → chunk-YFE47G3C.js} +3 -3
  373. package/dist/{chunk-ZR5EKJT6.js → chunk-YG6TWPP7.js} +2 -2
  374. package/dist/{chunk-44JWVYJB.js → chunk-YH3ARKBB.js} +2 -2
  375. package/dist/{chunk-752WXSDN.js → chunk-YI66STKJ.js} +2 -2
  376. package/dist/{chunk-QRECBCJM.js → chunk-YMVPYMKB.js} +2 -2
  377. package/dist/{chunk-77SYIH6O.js → chunk-YPIXBAF6.js} +2 -2
  378. package/dist/{chunk-WRMUXZ7C.js → chunk-YSWPNY6G.js} +3 -3
  379. package/dist/{chunk-GTHCHCWW.js → chunk-YWNNMBZG.js} +3 -3
  380. package/dist/{chunk-3DRLCX5V.js → chunk-Z3HYM2JT.js} +2 -2
  381. package/dist/{chunk-M3HGBO2Y.js → chunk-ZAC7YPRA.js} +1 -1
  382. package/dist/{chunk-2VJOSU4H.js → chunk-ZENESDAF.js} +2 -2
  383. package/dist/{chunk-4JXPLTWV.js → chunk-ZHAPMETO.js} +2 -2
  384. package/dist/{chunk-IJR6VOLU.js → chunk-ZVR6DUZH.js} +2 -2
  385. package/dist/components/message-timeline.d.ts +10 -2
  386. package/dist/composer.js +8 -8
  387. package/dist/{computer-viewer-5LKRCEVQ.js → computer-viewer-FOIOZUF5.js} +5 -5
  388. package/dist/connect.js +12 -12
  389. package/dist/desktop-dictation.js +8 -8
  390. package/dist/desktop.js +2 -2
  391. package/dist/editor.js +2 -2
  392. package/dist/{embedded-new-voice-GHJRY3YL.js → embedded-new-voice-WTXAJNGO.js} +5 -5
  393. package/dist/{embedded-voice-ASQXBSTX.js → embedded-voice-SIJOPN2G.js} +5 -5
  394. package/dist/{fleet-decision-row-U7LDVBEM.js → fleet-decision-row-XKQ3GMYT.js} +2 -2
  395. package/dist/hooks/use-recordings.d.ts +4 -2
  396. package/dist/in-chat-connect-model.js +5 -5
  397. package/dist/index.d.ts +2 -2
  398. package/dist/index.js +66 -60
  399. package/dist/interaction.js +5 -5
  400. package/dist/{latest-question-RNVF262Q.js → latest-question-KA7AQYVI.js} +2 -2
  401. package/dist/machines.js +3 -3
  402. package/dist/meetings/recorder-context.d.ts +6 -1
  403. package/dist/meetings/recorder-panel.d.ts +2 -5
  404. package/dist/meetings-recorder.js +1 -1
  405. package/dist/meetings.js +25 -23
  406. package/dist/meetings.js.map +1 -1
  407. package/dist/messages/en.d.ts +4 -0
  408. package/dist/messages.js +1 -1
  409. package/dist/{model-policy-picker-menu-E6XKMFTA.js → model-policy-picker-menu-6N2G7VGX.js} +4 -4
  410. package/dist/{payment-page-card-DJDKV2LW.js → payment-page-card-IJFZHQ52.js} +4 -4
  411. package/dist/{platform-activity-row-MSDCSMET.js → platform-activity-row-MFCMGI43.js} +2 -2
  412. package/dist/{queue-surface-implementation-GUAIG6TK.js → queue-surface-implementation-BBCDWWOP.js} +5 -5
  413. package/dist/realtime.js +4 -4
  414. package/dist/{recorder-host-2MYDJPQW.js → recorder-host-LDYYOKG7.js} +5 -5
  415. package/dist/recordings.js +4 -4
  416. package/dist/{sandbox-files-W5W2LW4K.js → sandbox-files-VYRBIXJY.js} +6 -6
  417. package/dist/session-app.js +160 -157
  418. package/dist/{session-connect-cards-HPH7JOZP.js → session-connect-cards-GBPSL6OT.js} +9 -9
  419. package/dist/session-connect-cards-GBPSL6OT.js.map +1 -0
  420. package/dist/session-list-model.js +2 -2
  421. package/dist/{session-realtime-SDTKFFIR.js → session-realtime-QGU57TND.js} +3 -3
  422. package/dist/session-realtime-QGU57TND.js.map +1 -0
  423. package/dist/session-realtime.js +2 -2
  424. package/dist/session-ui.js +33 -33
  425. package/dist/session.d.ts +3 -2
  426. package/dist/session.js +16 -10
  427. package/dist/sites.js +2 -2
  428. package/dist/terminal.js +2 -2
  429. package/dist/this-computer.js +3 -3
  430. package/dist/timeline/index.d.ts +3 -2
  431. package/dist/timeline/projection.d.ts +52 -0
  432. package/dist/timeline/turn-summary-model.d.ts +4 -3
  433. package/dist/timeline/types.d.ts +8 -2
  434. package/dist/timeline/use-timeline-pauses.d.ts +12 -0
  435. package/dist/timeline/work-presentation.d.ts +4 -3
  436. package/dist/{timeline-annotation-markers-FNILLWNU.js → timeline-annotation-markers-LL6ZVBZH.js} +2 -2
  437. package/dist/{timeline-annotation-selection-MBCIDO2Q.js → timeline-annotation-selection-WQA76WYC.js} +2 -2
  438. package/dist/{timeline-annotations-dialog-JPNKLOTE.js → timeline-annotations-dialog-HHETAEZA.js} +3 -3
  439. package/dist/timeline-model.js +2 -2
  440. package/dist/ui/access-list.js +5 -5
  441. package/dist/ui/cadence-picker.js +4 -4
  442. package/dist/ui/choice-cards.js +3 -3
  443. package/dist/ui/confirm-dialog.js +2 -2
  444. package/dist/ui/copy-field.js +3 -3
  445. package/dist/ui/detail-page.js +2 -2
  446. package/dist/ui/detail-sheet.js +2 -2
  447. package/dist/ui/disclosure.js +3 -3
  448. package/dist/ui/email-chips-input.js +3 -3
  449. package/dist/ui/field.js +2 -2
  450. package/dist/ui/flush-form-page.js +3 -3
  451. package/dist/ui/form-dialog.js +2 -2
  452. package/dist/ui/list-row.js +3 -3
  453. package/dist/ui/relative-time.js +2 -2
  454. package/dist/ui/revision-history.js +4 -4
  455. package/dist/ui/role-select.js +5 -5
  456. package/dist/ui/select-menu.js +3 -3
  457. package/dist/ui/usage-meter.d.ts +8 -2
  458. package/dist/ui/usage-meter.js +5 -3
  459. package/dist/usage.js +2 -2
  460. package/dist/workbench.js +4 -4
  461. package/package.json +6 -5
  462. package/src/app/components/agent/agent-capability-picker.test.tsx +1 -1
  463. package/src/app/components/models/subscription-usage.tsx +178 -0
  464. package/src/app/components/rail/session-row-content.tsx +27 -0
  465. package/src/app/components/session/subscription-account-indicator.test.ts +78 -18
  466. package/src/app/components/session/subscription-account-indicator.tsx +16 -31
  467. package/src/app/components/session/subscription-account-menu.tsx +79 -101
  468. package/src/app/components/session/subscription-account.test.ts +161 -54
  469. package/src/app/components/session/subscription-account.ts +106 -117
  470. package/src/app/lib/agent-capabilities.tsx +34 -7
  471. package/src/app/lib/session-branch-cache.tsx +1 -0
  472. package/src/app/lib/session-pins.tsx +1 -0
  473. package/src/app/lib/session-row-paused.test.tsx +183 -0
  474. package/src/app/lib/sessions-group-channels.test.ts +4 -4
  475. package/src/app/lib/sessions-group.tsx +62 -4
  476. package/src/app/lib/subscription-accounts.tsx +283 -0
  477. package/src/app/routes/session.tsx +2 -0
  478. package/src/components/message-timeline.tsx +14 -2
  479. package/src/components/session-conversation.tsx +2 -1
  480. package/src/components/timeline-annotations.tsx +4 -1
  481. package/src/components/timeline-settlement.ts +1 -1
  482. package/src/hooks/use-composer.ts +104 -25
  483. package/src/hooks/use-recordings.ts +5 -0
  484. package/src/index.ts +5 -0
  485. package/src/meetings/meeting-detail-page.tsx +4 -2
  486. package/src/meetings/meetings-pages.test.tsx +38 -0
  487. package/src/meetings/recorder-context.tsx +28 -5
  488. package/src/meetings/recorder-panel.tsx +13 -5
  489. package/src/meetings/recorder-workspace.test.tsx +57 -8
  490. package/src/messages/en.ts +5 -0
  491. package/src/recordings-model.ts +7 -0
  492. package/src/session.ts +8 -1
  493. package/src/timeline/index.ts +4 -1
  494. package/src/timeline/projection.ts +228 -16
  495. package/src/timeline/turn-summary-model.ts +4 -3
  496. package/src/timeline/turn-summary.tsx +15 -2
  497. package/src/timeline/types.ts +8 -2
  498. package/src/timeline/use-timeline-pauses.ts +105 -0
  499. package/src/timeline/work-presentation.ts +13 -4
  500. package/src/ui/usage-meter.tsx +10 -7
  501. package/styles/compiled.css +3 -0
  502. package/dist/chunk-2OXSB2OL.js.map +0 -1
  503. package/dist/chunk-3PM3M2Q6.js.map +0 -1
  504. package/dist/chunk-7YTR3UFO.js.map +0 -1
  505. package/dist/chunk-7Z76QP64.js.map +0 -1
  506. package/dist/chunk-JHZRAYI4.js.map +0 -1
  507. package/dist/chunk-M5IQVMLR.js.map +0 -1
  508. package/dist/chunk-NQ2CPQJF.js.map +0 -1
  509. package/dist/chunk-O2UPPN5M.js +0 -2
  510. package/dist/chunk-O4JOE3R7.js.map +0 -1
  511. package/dist/chunk-PF2WU2IL.js.map +0 -1
  512. package/dist/chunk-PSM3CU7N.js.map +0 -1
  513. package/dist/chunk-PZKHST7A.js.map +0 -1
  514. package/dist/chunk-Q5K2J5GG.js.map +0 -1
  515. package/dist/chunk-QPQ7R77C.js.map +0 -1
  516. package/dist/chunk-QQIZMVAJ.js.map +0 -1
  517. package/dist/chunk-SK5S2PCK.js.map +0 -1
  518. package/dist/chunk-SPD4ULVB.js.map +0 -1
  519. package/dist/chunk-UTRNLNCW.js.map +0 -1
  520. package/dist/chunk-UU5FBVRX.js.map +0 -1
  521. package/dist/chunk-VXORMNU4.js.map +0 -1
  522. package/dist/chunk-WYGTAQMX.js.map +0 -1
  523. /package/dist/{browser-viewer-ZHQDVHZ2.js.map → app/components/models/subscription-usage.js.map} +0 -0
  524. /package/dist/{chat-interactive-block-VSDD6X3M.js.map → app/lib/subscription-accounts.js.map} +0 -0
  525. /package/dist/{chunk-O2UPPN5M.js.map → browser-viewer-F4FL7JKB.js.map} +0 -0
  526. /package/dist/{computer-viewer-5LKRCEVQ.js.map → chat-interactive-block-4U5JWRSY.js.map} +0 -0
  527. /package/dist/{chunk-4K64EKM7.js.map → chunk-22YIIM3X.js.map} +0 -0
  528. /package/dist/{chunk-3NNAC43A.js.map → chunk-2N7ACQ7M.js.map} +0 -0
  529. /package/dist/{chunk-WDASYY4S.js.map → chunk-2TEYUDJD.js.map} +0 -0
  530. /package/dist/{chunk-OTW25A6I.js.map → chunk-37JJQNZB.js.map} +0 -0
  531. /package/dist/{chunk-VCJQQYRE.js.map → chunk-3DWQPURZ.js.map} +0 -0
  532. /package/dist/{chunk-GTRAH4FG.js.map → chunk-3GWC3FU3.js.map} +0 -0
  533. /package/dist/{chunk-AB5IW227.js.map → chunk-3ICY6LP3.js.map} +0 -0
  534. /package/dist/{chunk-WIFDNUKD.js.map → chunk-3OCU5RX5.js.map} +0 -0
  535. /package/dist/{chunk-UBRQ3PQD.js.map → chunk-3SPDJLOR.js.map} +0 -0
  536. /package/dist/{chunk-IZXYFWA4.js.map → chunk-3WVLR7UA.js.map} +0 -0
  537. /package/dist/{chunk-DEHLWZSI.js.map → chunk-3XMB3L57.js.map} +0 -0
  538. /package/dist/{chunk-AJBDAVX3.js.map → chunk-4IUOBO2H.js.map} +0 -0
  539. /package/dist/{chunk-NFCS5WYC.js.map → chunk-4KQ3A3EO.js.map} +0 -0
  540. /package/dist/{chunk-LIJNVIT3.js.map → chunk-4L5B5AZT.js.map} +0 -0
  541. /package/dist/{chunk-EDDKPIIV.js.map → chunk-4NB3TPNE.js.map} +0 -0
  542. /package/dist/{chunk-OJWDNNW3.js.map → chunk-4TPTGBIO.js.map} +0 -0
  543. /package/dist/{chunk-J2WY42FA.js.map → chunk-4UHGW6WF.js.map} +0 -0
  544. /package/dist/{chunk-7NLF35YL.js.map → chunk-4YN2JLYK.js.map} +0 -0
  545. /package/dist/{chunk-OOOSGPJL.js.map → chunk-53MYEEMA.js.map} +0 -0
  546. /package/dist/{chunk-467WDSOK.js.map → chunk-5HYWXPMA.js.map} +0 -0
  547. /package/dist/{chunk-XMBOLFFS.js.map → chunk-5IMNL6IV.js.map} +0 -0
  548. /package/dist/{chunk-4Z5X7PLC.js.map → chunk-5MLM5T5C.js.map} +0 -0
  549. /package/dist/{chunk-YMI27QPF.js.map → chunk-5NKQZVXP.js.map} +0 -0
  550. /package/dist/{chunk-CYDXCILL.js.map → chunk-5SODSGW7.js.map} +0 -0
  551. /package/dist/{chunk-Q5EZNBPI.js.map → chunk-5YAJASCO.js.map} +0 -0
  552. /package/dist/{chunk-M3FDGRB4.js.map → chunk-62XAL5BA.js.map} +0 -0
  553. /package/dist/{chunk-SGH7I7OY.js.map → chunk-67R6NAFI.js.map} +0 -0
  554. /package/dist/{chunk-PYB4BFEC.js.map → chunk-6BQLDL6R.js.map} +0 -0
  555. /package/dist/{chunk-YJSCLGAW.js.map → chunk-6EZYHJTL.js.map} +0 -0
  556. /package/dist/{chunk-G5UQBTXY.js.map → chunk-6LXIL3Q3.js.map} +0 -0
  557. /package/dist/{chunk-T67LTMSW.js.map → chunk-6LYVAJFZ.js.map} +0 -0
  558. /package/dist/{chunk-3L465FBR.js.map → chunk-6WB5UXMZ.js.map} +0 -0
  559. /package/dist/{chunk-EKJHOWTZ.js.map → chunk-74UGYVCA.js.map} +0 -0
  560. /package/dist/{chunk-PWUSSSSL.js.map → chunk-7BTNYZC7.js.map} +0 -0
  561. /package/dist/{chunk-ESXAECZ3.js.map → chunk-7KZFGA25.js.map} +0 -0
  562. /package/dist/{chunk-EGKARC53.js.map → chunk-7MGDX2TD.js.map} +0 -0
  563. /package/dist/{chunk-Y3XZEKDQ.js.map → chunk-7N3GFGB6.js.map} +0 -0
  564. /package/dist/{chunk-AH3DGOTK.js.map → chunk-7SFSN6AX.js.map} +0 -0
  565. /package/dist/{chunk-6QK65ZWM.js.map → chunk-7TGUHFGO.js.map} +0 -0
  566. /package/dist/{chunk-QURYQFDN.js.map → chunk-7ZIWO65F.js.map} +0 -0
  567. /package/dist/{chunk-OYCK4JRS.js.map → chunk-AJHLEJTK.js.map} +0 -0
  568. /package/dist/{chunk-3PZ3LRPV.js.map → chunk-AN4U7EPH.js.map} +0 -0
  569. /package/dist/{chunk-77BHKC43.js.map → chunk-APG6CEG7.js.map} +0 -0
  570. /package/dist/{chunk-FSDQQQIA.js.map → chunk-APHLXQNP.js.map} +0 -0
  571. /package/dist/{chunk-SN2WENRP.js.map → chunk-AXHQ7QXV.js.map} +0 -0
  572. /package/dist/{chunk-54U6ZBEX.js.map → chunk-AYTLSPF6.js.map} +0 -0
  573. /package/dist/{chunk-R33SBMB7.js.map → chunk-BBSKKBMV.js.map} +0 -0
  574. /package/dist/{chunk-2GCHGWNE.js.map → chunk-BGH6TU2P.js.map} +0 -0
  575. /package/dist/{chunk-D3PTVN2I.js.map → chunk-BGIYL26H.js.map} +0 -0
  576. /package/dist/{chunk-BQYRZIZ7.js.map → chunk-BL7UQUC3.js.map} +0 -0
  577. /package/dist/{chunk-EBTUPRRQ.js.map → chunk-BOUHCYL6.js.map} +0 -0
  578. /package/dist/{chunk-MKDFYE2E.js.map → chunk-BVNGDFBC.js.map} +0 -0
  579. /package/dist/{chunk-ICAMYP5M.js.map → chunk-BWJK64CP.js.map} +0 -0
  580. /package/dist/{chunk-RHXYO4H2.js.map → chunk-BZ2GTCQV.js.map} +0 -0
  581. /package/dist/{chunk-GIWFLWXG.js.map → chunk-C2KASMJK.js.map} +0 -0
  582. /package/dist/{chunk-KO3OHHY2.js.map → chunk-CAZDRDQT.js.map} +0 -0
  583. /package/dist/{chunk-OK7BQMCI.js.map → chunk-CBJRZKZB.js.map} +0 -0
  584. /package/dist/{chunk-OYOFPNLC.js.map → chunk-CF6NYG7J.js.map} +0 -0
  585. /package/dist/{chunk-MT2R57SF.js.map → chunk-COITN7WN.js.map} +0 -0
  586. /package/dist/{chunk-OCXTTKVA.js.map → chunk-CPVOXM2Q.js.map} +0 -0
  587. /package/dist/{chunk-HYEIA25Y.js.map → chunk-CTZRCBKH.js.map} +0 -0
  588. /package/dist/{chunk-OCXEY7HE.js.map → chunk-CWL27YTB.js.map} +0 -0
  589. /package/dist/{chunk-K4DQS2ML.js.map → chunk-D2I33V5P.js.map} +0 -0
  590. /package/dist/{chunk-736RUNIA.js.map → chunk-DF7WI4JH.js.map} +0 -0
  591. /package/dist/{chunk-KUE5BOQE.js.map → chunk-DKZYCJCO.js.map} +0 -0
  592. /package/dist/{chunk-74CBR5YE.js.map → chunk-DQ32FKFQ.js.map} +0 -0
  593. /package/dist/{chunk-4O2XWOLZ.js.map → chunk-DTKG2YUF.js.map} +0 -0
  594. /package/dist/{chunk-GMHIOYB7.js.map → chunk-DUDA4V5R.js.map} +0 -0
  595. /package/dist/{chunk-XUOYNJPB.js.map → chunk-ECROT4M5.js.map} +0 -0
  596. /package/dist/{chunk-PVB4YVDP.js.map → chunk-EOXV5XGY.js.map} +0 -0
  597. /package/dist/{chunk-U6552Q3T.js.map → chunk-EQQOZ6DD.js.map} +0 -0
  598. /package/dist/{chunk-G6ICCGJ3.js.map → chunk-EY6W5H4B.js.map} +0 -0
  599. /package/dist/{chunk-HWVPLFIW.js.map → chunk-EYRFEWXJ.js.map} +0 -0
  600. /package/dist/{chunk-U4LTPFD2.js.map → chunk-FKK2PD7K.js.map} +0 -0
  601. /package/dist/{chunk-PUUEI4W3.js.map → chunk-FPHHIC5K.js.map} +0 -0
  602. /package/dist/{chunk-SP44O3OU.js.map → chunk-FQM6L22H.js.map} +0 -0
  603. /package/dist/{chunk-2J77TWGH.js.map → chunk-FW22IREV.js.map} +0 -0
  604. /package/dist/{chunk-EBIVTDEG.js.map → chunk-G4M6AYDB.js.map} +0 -0
  605. /package/dist/{chunk-BASI553K.js.map → chunk-G6AZ2WIU.js.map} +0 -0
  606. /package/dist/{chunk-SJYTQLN3.js.map → chunk-GJ5IDSAX.js.map} +0 -0
  607. /package/dist/{chunk-TDTD66BK.js.map → chunk-GRDSEZWZ.js.map} +0 -0
  608. /package/dist/{chunk-MV2CLIO6.js.map → chunk-HBVJIGY2.js.map} +0 -0
  609. /package/dist/{chunk-R4JA5JFI.js.map → chunk-HCWQLIOE.js.map} +0 -0
  610. /package/dist/{chunk-MZY3VKKM.js.map → chunk-HEVD4A5G.js.map} +0 -0
  611. /package/dist/{chunk-DLVIRJGK.js.map → chunk-HNDHSEVJ.js.map} +0 -0
  612. /package/dist/{chunk-LPKJ77EK.js.map → chunk-HNTZ7B7M.js.map} +0 -0
  613. /package/dist/{chunk-IN3VQFKS.js.map → chunk-I2FC7CAI.js.map} +0 -0
  614. /package/dist/{chunk-ZBHGNE2J.js.map → chunk-IEHZFYMH.js.map} +0 -0
  615. /package/dist/{chunk-DWJ6J3YW.js.map → chunk-IXISEVD7.js.map} +0 -0
  616. /package/dist/{chunk-TK5FWVZR.js.map → chunk-IZEDVQUD.js.map} +0 -0
  617. /package/dist/{chunk-HEGV4QMS.js.map → chunk-J42QE4VO.js.map} +0 -0
  618. /package/dist/{chunk-PRT4J2DL.js.map → chunk-J555XSUM.js.map} +0 -0
  619. /package/dist/{chunk-SBXSKRFA.js.map → chunk-JNMHFSDF.js.map} +0 -0
  620. /package/dist/{chunk-KI46GKMD.js.map → chunk-JTBAOPYO.js.map} +0 -0
  621. /package/dist/{chunk-SXGJL7UT.js.map → chunk-K376MPJH.js.map} +0 -0
  622. /package/dist/{chunk-OSJ366KR.js.map → chunk-KEBVT55V.js.map} +0 -0
  623. /package/dist/{chunk-U5UGM5XD.js.map → chunk-KFIZAXHI.js.map} +0 -0
  624. /package/dist/{chunk-KFNZZ2N6.js.map → chunk-KKGRDBMK.js.map} +0 -0
  625. /package/dist/{chunk-PLYVGZIN.js.map → chunk-KKIG6DN5.js.map} +0 -0
  626. /package/dist/{chunk-3OK7Y6ES.js.map → chunk-KKQO2GAA.js.map} +0 -0
  627. /package/dist/{chunk-DQPIEQGP.js.map → chunk-KO753ZCZ.js.map} +0 -0
  628. /package/dist/{chunk-YNTLWCF4.js.map → chunk-KYIRWU65.js.map} +0 -0
  629. /package/dist/{chunk-JKL5S7UQ.js.map → chunk-L6V63DVI.js.map} +0 -0
  630. /package/dist/{chunk-CV4VVLPZ.js.map → chunk-LCNJ2KNS.js.map} +0 -0
  631. /package/dist/{chunk-D74Z2N4K.js.map → chunk-LE7YKMTU.js.map} +0 -0
  632. /package/dist/{chunk-D5TIVCXG.js.map → chunk-LEBEOMVT.js.map} +0 -0
  633. /package/dist/{embedded-new-voice-GHJRY3YL.js.map → chunk-LKLQVANM.js.map} +0 -0
  634. /package/dist/{chunk-WXF2RTS4.js.map → chunk-M6URPYUB.js.map} +0 -0
  635. /package/dist/{chunk-H6BX6WOW.js.map → chunk-MDHFMRBC.js.map} +0 -0
  636. /package/dist/{chunk-3CDJSKDW.js.map → chunk-MGZO7CHI.js.map} +0 -0
  637. /package/dist/{chunk-DCEQCGVN.js.map → chunk-MIWU52TW.js.map} +0 -0
  638. /package/dist/{chunk-LVELUUK6.js.map → chunk-NF6QVVMP.js.map} +0 -0
  639. /package/dist/{chunk-UMX6DZME.js.map → chunk-NTZ5ZNVK.js.map} +0 -0
  640. /package/dist/{chunk-FBA2NXYH.js.map → chunk-NWLRABUR.js.map} +0 -0
  641. /package/dist/{chunk-TNSJFZ6Q.js.map → chunk-O2H2U7YS.js.map} +0 -0
  642. /package/dist/{chunk-BFFNINCC.js.map → chunk-OAL2PPX4.js.map} +0 -0
  643. /package/dist/{chunk-WTSQUCHB.js.map → chunk-OCYTHZ4A.js.map} +0 -0
  644. /package/dist/{chunk-ZAX4XQLN.js.map → chunk-OEDTCIXF.js.map} +0 -0
  645. /package/dist/{chunk-CHU3RDV4.js.map → chunk-OLVSYB3P.js.map} +0 -0
  646. /package/dist/{chunk-IFSXVU2S.js.map → chunk-OQHTFOCA.js.map} +0 -0
  647. /package/dist/{chunk-OXQ2SXVC.js.map → chunk-P56AVROH.js.map} +0 -0
  648. /package/dist/{chunk-CXAN2FHF.js.map → chunk-PCEJHHGP.js.map} +0 -0
  649. /package/dist/{chunk-5MIBQ4P5.js.map → chunk-PHGQGVVL.js.map} +0 -0
  650. /package/dist/{chunk-FLWQJDJ5.js.map → chunk-PUZRHEQI.js.map} +0 -0
  651. /package/dist/{chunk-OP2GD6QW.js.map → chunk-PV7U6OOJ.js.map} +0 -0
  652. /package/dist/{chunk-X2QJXDE4.js.map → chunk-PZQACDH5.js.map} +0 -0
  653. /package/dist/{chunk-CH4UQ4NO.js.map → chunk-PZTS4O6E.js.map} +0 -0
  654. /package/dist/{chunk-TKQL7EDB.js.map → chunk-Q42QHUAQ.js.map} +0 -0
  655. /package/dist/{chunk-MRECRNVU.js.map → chunk-QCYGB6TZ.js.map} +0 -0
  656. /package/dist/{chunk-GSCGKJNK.js.map → chunk-QECMETOF.js.map} +0 -0
  657. /package/dist/{chunk-RMCLFSMX.js.map → chunk-QGX3LE6H.js.map} +0 -0
  658. /package/dist/{chunk-HTMQGS63.js.map → chunk-QI3NDQFP.js.map} +0 -0
  659. /package/dist/{chunk-R5QAL43H.js.map → chunk-RA3Q52O2.js.map} +0 -0
  660. /package/dist/{chunk-AJDGP2N4.js.map → chunk-RJNOQEJJ.js.map} +0 -0
  661. /package/dist/{chunk-477DTTMH.js.map → chunk-RSFOFUR7.js.map} +0 -0
  662. /package/dist/{chunk-JV5ULONH.js.map → chunk-RXR6PMSH.js.map} +0 -0
  663. /package/dist/{chunk-J2BTILRR.js.map → chunk-SM7HFCGC.js.map} +0 -0
  664. /package/dist/{chunk-OBGOLHCP.js.map → chunk-T4HK4XCI.js.map} +0 -0
  665. /package/dist/{chunk-XVLEBB4Y.js.map → chunk-TBWL6YWL.js.map} +0 -0
  666. /package/dist/{chunk-AAS7OWV6.js.map → chunk-TIDXYWFX.js.map} +0 -0
  667. /package/dist/{chunk-N3FM4BNA.js.map → chunk-TKHRGY2P.js.map} +0 -0
  668. /package/dist/{chunk-GU7T2S5N.js.map → chunk-TU2GSZL7.js.map} +0 -0
  669. /package/dist/{chunk-OI6VI6SU.js.map → chunk-U6HGJXXQ.js.map} +0 -0
  670. /package/dist/{chunk-4BWMAGJJ.js.map → chunk-UGRW6RTR.js.map} +0 -0
  671. /package/dist/{chunk-AVXDIRRW.js.map → chunk-UMRUDYUK.js.map} +0 -0
  672. /package/dist/{chunk-FNXCFIPW.js.map → chunk-UOT2R5ZD.js.map} +0 -0
  673. /package/dist/{chunk-DIP7YALH.js.map → chunk-USURKJVT.js.map} +0 -0
  674. /package/dist/{chunk-S27VZ5DO.js.map → chunk-UU6Q67XM.js.map} +0 -0
  675. /package/dist/{chunk-LTJFV2JI.js.map → chunk-UZ7NP5CW.js.map} +0 -0
  676. /package/dist/{chunk-H6MJFMHZ.js.map → chunk-V4FO7UOE.js.map} +0 -0
  677. /package/dist/{chunk-RGR57NYY.js.map → chunk-V4ZOZRCW.js.map} +0 -0
  678. /package/dist/{chunk-LQKVNREV.js.map → chunk-V57YMKQZ.js.map} +0 -0
  679. /package/dist/{chunk-XZCCEKPW.js.map → chunk-VOIWZBY6.js.map} +0 -0
  680. /package/dist/{chunk-E5KOWRDU.js.map → chunk-VPHPLPDA.js.map} +0 -0
  681. /package/dist/{chunk-OGU73VUN.js.map → chunk-VUL4KPUU.js.map} +0 -0
  682. /package/dist/{chunk-SFIXTOOJ.js.map → chunk-VWF6ILAR.js.map} +0 -0
  683. /package/dist/{chunk-FER6EVIY.js.map → chunk-W54BHJO7.js.map} +0 -0
  684. /package/dist/{chunk-34NV52R3.js.map → chunk-WCYE4BLC.js.map} +0 -0
  685. /package/dist/{chunk-RISUROBM.js.map → chunk-WTV25ELY.js.map} +0 -0
  686. /package/dist/{chunk-UO35OEOX.js.map → chunk-WZYGH7CN.js.map} +0 -0
  687. /package/dist/{chunk-CEMSIU4Z.js.map → chunk-XG2RWUF7.js.map} +0 -0
  688. /package/dist/{chunk-K3D7IQQP.js.map → chunk-XV7QOT7W.js.map} +0 -0
  689. /package/dist/{chunk-GOCODNQS.js.map → chunk-XWECT3GX.js.map} +0 -0
  690. /package/dist/{chunk-5MHMCE2G.js.map → chunk-XZQK2ZLW.js.map} +0 -0
  691. /package/dist/{chunk-JV3UI7BH.js.map → chunk-Y5BR66OH.js.map} +0 -0
  692. /package/dist/{chunk-4F3AEJI6.js.map → chunk-YD6XU6FY.js.map} +0 -0
  693. /package/dist/{chunk-VATYK3JQ.js.map → chunk-YFE47G3C.js.map} +0 -0
  694. /package/dist/{chunk-ZR5EKJT6.js.map → chunk-YG6TWPP7.js.map} +0 -0
  695. /package/dist/{chunk-44JWVYJB.js.map → chunk-YH3ARKBB.js.map} +0 -0
  696. /package/dist/{chunk-752WXSDN.js.map → chunk-YI66STKJ.js.map} +0 -0
  697. /package/dist/{chunk-QRECBCJM.js.map → chunk-YMVPYMKB.js.map} +0 -0
  698. /package/dist/{chunk-77SYIH6O.js.map → chunk-YPIXBAF6.js.map} +0 -0
  699. /package/dist/{chunk-WRMUXZ7C.js.map → chunk-YSWPNY6G.js.map} +0 -0
  700. /package/dist/{chunk-GTHCHCWW.js.map → chunk-YWNNMBZG.js.map} +0 -0
  701. /package/dist/{chunk-3DRLCX5V.js.map → chunk-Z3HYM2JT.js.map} +0 -0
  702. /package/dist/{chunk-M3HGBO2Y.js.map → chunk-ZAC7YPRA.js.map} +0 -0
  703. /package/dist/{chunk-2VJOSU4H.js.map → chunk-ZENESDAF.js.map} +0 -0
  704. /package/dist/{chunk-4JXPLTWV.js.map → chunk-ZHAPMETO.js.map} +0 -0
  705. /package/dist/{chunk-IJR6VOLU.js.map → chunk-ZVR6DUZH.js.map} +0 -0
  706. /package/dist/{embedded-voice-ASQXBSTX.js.map → computer-viewer-FOIOZUF5.js.map} +0 -0
  707. /package/dist/{model-policy-picker-menu-E6XKMFTA.js.map → embedded-new-voice-WTXAJNGO.js.map} +0 -0
  708. /package/dist/{sandbox-files-W5W2LW4K.js.map → embedded-voice-SIJOPN2G.js.map} +0 -0
  709. /package/dist/{fleet-decision-row-U7LDVBEM.js.map → fleet-decision-row-XKQ3GMYT.js.map} +0 -0
  710. /package/dist/{latest-question-RNVF262Q.js.map → latest-question-KA7AQYVI.js.map} +0 -0
  711. /package/dist/{session-connect-cards-HPH7JOZP.js.map → model-policy-picker-menu-6N2G7VGX.js.map} +0 -0
  712. /package/dist/{payment-page-card-DJDKV2LW.js.map → payment-page-card-IJFZHQ52.js.map} +0 -0
  713. /package/dist/{platform-activity-row-MSDCSMET.js.map → platform-activity-row-MFCMGI43.js.map} +0 -0
  714. /package/dist/{queue-surface-implementation-GUAIG6TK.js.map → queue-surface-implementation-BBCDWWOP.js.map} +0 -0
  715. /package/dist/{recorder-host-2MYDJPQW.js.map → recorder-host-LDYYOKG7.js.map} +0 -0
  716. /package/dist/{session-realtime-SDTKFFIR.js.map → sandbox-files-VYRBIXJY.js.map} +0 -0
  717. /package/dist/{timeline-annotation-markers-FNILLWNU.js.map → timeline-annotation-markers-LL6ZVBZH.js.map} +0 -0
  718. /package/dist/{timeline-annotation-selection-MBCIDO2Q.js.map → timeline-annotation-selection-WQA76WYC.js.map} +0 -0
  719. /package/dist/{timeline-annotations-dialog-JPNKLOTE.js.map → timeline-annotations-dialog-HHETAEZA.js.map} +0 -0
@@ -71,7 +71,9 @@ describe("one menu for every subscription provider", () => {
71
71
  test("Codex and Claude differ only in the provider name", () => {
72
72
  const claude = subscriptionAccountMenuContent(state({ provider: "claude" }));
73
73
  const codex = subscriptionAccountMenuContent(state({ provider: "codex" }));
74
- const neutral = (value: unknown) => JSON.stringify(value).replaceAll(/Claude|Codex/g, "X");
74
+ // The provider name and the brand its plans are sold under.
75
+ const neutral = (value: unknown) =>
76
+ JSON.stringify(value).replaceAll(/Claude|Codex|ChatGPT/g, "X");
75
77
  expect(neutral(codex)).toBe(neutral(claude));
76
78
  expect(claude.ariaLabel).toBe("Claude account · Acme a");
77
79
  expect(codex.ariaLabel).toBe("Codex account · Acme a");
@@ -81,28 +83,25 @@ describe("one menu for every subscription provider", () => {
81
83
  const content = subscriptionAccountMenuContent(state());
82
84
  expect(content.selectionLabel).toBe("Current account");
83
85
  expect(content.identity).toBe("a@example.test");
84
- expect(content.metadata).toBe("Pro · Organization");
85
- expect(content.usage.windows?.map((window) => [window.label, window.usedPercent])).toEqual([
86
- ["5h", 36],
87
- ["Week", 62],
86
+ expect(content.metadata).toBe("Claude Pro · Organization");
87
+ expect(content.usage.windows?.map((window) => [window.label, window.leftPercent])).toEqual([
88
+ ["5h", 64],
89
+ ["Week", 38],
88
90
  ]);
89
91
  expect(content.usage.note).toStartWith("Updated ");
90
92
  expect(content.automaticLabel).toBe("Automatic");
91
93
  expect(content.actionLabel).toBe("Use for next turn");
92
- // Other accounts summarize each window; the current one is shown above.
93
- expect(content.accounts.map((row) => row.usageSummary)).toEqual([
94
- undefined,
95
- "5h 36% · Week 62% used",
96
- undefined,
97
- ]);
98
- // Each summarized row also draws its most-used window as a bar.
99
- expect(content.accounts.map((row) => row.usageBar)).toEqual([
100
- undefined,
101
- { label: "Week", usedPercent: 62 },
102
- undefined,
103
- ]);
94
+ // Other accounts list every window; the current one is shown above.
95
+ expect(
96
+ content.accounts.map((row) => row.windows?.map((window) => window.label) ?? null),
97
+ ).toEqual([null, ["5h", "Week"], []]);
104
98
  expect(content.accounts[2]).toMatchObject({ status: "Needs reconnect", disabled: true });
105
- expect(content.accounts[1]?.detail).toBe("Acme b · b@example.test · Pro · This workspace");
99
+ expect(content.accounts[1]?.detail).toBe(
100
+ "Acme b · b@example.test · Claude Pro · This workspace",
101
+ );
102
+ // Every account has the same plan, so it is shown once, not on each row.
103
+ expect(content.plan).toBe("Claude Pro");
104
+ expect(content.accounts.map((row) => row.plan)).toEqual([null, null, null]);
106
105
  });
107
106
 
108
107
  test("a turn waiting for capacity offers a retry for any provider", () => {
@@ -172,11 +171,9 @@ describe("one menu for every subscription provider", () => {
172
171
 
173
172
  test("a failed check on the current account keeps the other accounts' readings", () => {
174
173
  const failed = subscriptionAccountMenuContent(state({ usageCheck: "failed" }));
175
- expect(failed.accounts.map((row) => row.usageSummary)).toEqual([
176
- undefined,
177
- "5h 36% · Week 62% used",
178
- undefined,
179
- ]);
174
+ expect(
175
+ failed.accounts.map((row) => row.windows?.map((window) => window.leftPercent) ?? null),
176
+ ).toEqual([null, [64, 38], []]);
180
177
  });
181
178
 
182
179
  test("the serving account is the current account, even when another one is chosen", () => {
@@ -223,7 +220,7 @@ describe("one menu for every subscription provider", () => {
223
220
  test("a live check hides readings until it answers", () => {
224
221
  const checking = subscriptionAccountMenuContent(state({ usageCheck: "checking" }));
225
222
  expect(checking.usage).toEqual({ checking: true });
226
- expect(checking.accounts.every((row) => row.usageSummary === undefined)).toBe(true);
223
+ expect(checking.accounts.every((row) => row.windows === null)).toBe(true);
227
224
  expect(subscriptionAccountMenuContent(state({ usageCheck: "failed" })).usage).toEqual({
228
225
  unavailable: true,
229
226
  });
@@ -236,67 +233,177 @@ describe("usage readings", () => {
236
233
  exhaustedUntil: "2026-10-22T10:00:00Z",
237
234
  exhaustedKind: "quota",
238
235
  });
239
- expect(subscriptionAccountUsage(ended, Date.parse("2026-10-22T11:00:00Z")).message).toBe(
240
- "No usage reading yet",
241
- );
242
- expect(subscriptionAccountUsage(ended, Date.parse("2026-10-22T09:00:00Z")).message).toStartWith(
243
- "Limit reached until ",
244
- );
236
+ expect(
237
+ subscriptionAccountUsage("claude", ended, Date.parse("2026-10-22T11:00:00Z")).message,
238
+ ).toBe("No usage reading yet");
239
+ expect(
240
+ subscriptionAccountUsage("claude", ended, Date.parse("2026-10-22T09:00:00Z")).message,
241
+ ).toStartWith("Limit reached until ");
245
242
  });
246
243
 
247
244
  test("missing readings and empty snapshots say there is no reading yet", () => {
248
- expect(subscriptionAccountUsage(undefined).message).toBe("No usage reading yet");
249
- expect(subscriptionAccountUsage(null).message).toBe("No usage reading yet");
250
- const empty = subscriptionAccountUsage(snapshot([]));
245
+ expect(subscriptionAccountUsage("claude", undefined).message).toBe("No usage reading yet");
246
+ expect(subscriptionAccountUsage("claude", null).message).toBe("No usage reading yet");
247
+ const empty = subscriptionAccountUsage("claude", snapshot([]));
251
248
  expect(empty).toMatchObject({ message: "No usage reading yet", windows: [] });
252
- expect(empty.note).toBeUndefined();
249
+ expect(empty.note).toBeNull();
250
+ });
251
+
252
+ test("an account-wide refusal still says until when beside a full Fable week", () => {
253
+ const now = Date.parse("2026-10-22T09:00:00Z");
254
+ const reading = snapshot(
255
+ [
256
+ { id: "seven_day", usedPercent: 40, resetsAt: null, status: "ok" },
257
+ { id: "seven_day_fable", usedPercent: 100, resetsAt: null, status: "ok" },
258
+ ],
259
+ { exhaustedUntil: "2026-10-22T10:00:00Z", exhaustedKind: "quota" },
260
+ );
261
+ expect(subscriptionAccountUsage("claude", reading, now).message).toStartWith(
262
+ "Limit reached until ",
263
+ );
253
264
  });
254
265
 
255
266
  test("partial and unknown windows are never completed, aggregated or given a made-up percent", () => {
256
267
  const view = subscriptionAccountUsage(
268
+ "claude",
257
269
  snapshot([
258
270
  { id: "seven_day_opus", usedPercent: null, resetsAt: null, status: "unknown" },
259
271
  { id: "overage", usedPercent: 125, resetsAt: null, status: "unknown" },
260
272
  { id: "custom", usedPercent: 8, resetsAt: null, status: "warning" },
261
273
  ]),
262
274
  );
263
- expect(view.windows?.map((window) => window.usedPercent)).toEqual([null, 125, 8]);
264
- expect(view.windows?.map((window) => window.label)).toEqual([
265
- "Week · Opus",
266
- "Overage",
267
- "custom",
275
+ expect(view.windows.map((window) => [window.label, window.leftPercent])).toEqual([
276
+ ["Opus week", null],
277
+ ["Custom", 92],
278
+ ["Extra usage", 0],
268
279
  ]);
269
- expect(view.summary).toBe("Week · Opus unknown · Overage 125% · custom 8% used");
270
- expect(view.windows?.[0]?.detail).toContain("Status unknown");
271
- expect(view.windows?.[2]?.detail).toContain("Near its limit");
280
+ // The provider's own warning counts even with plenty left.
281
+ expect(view.windows[1]?.nearLimit).toBe(true);
282
+ // Extra usage never makes the account look limited.
283
+ expect(view.limit).toMatchObject({ reached: false, near: true });
272
284
  });
273
285
 
274
- test("neutral primary/secondary ids do not claim a window length", () => {
275
- const view = subscriptionAccountUsage(
276
- snapshot([{ id: "primary", usedPercent: 10, resetsAt: null, status: "ok" }]),
277
- );
278
- expect(view.windows?.[0]?.label).toBe("Primary");
286
+ test("neutral primary/secondary ids do not claim a window length outside Codex", () => {
287
+ const value = snapshot([{ id: "primary", usedPercent: 10, resetsAt: null, status: "ok" }]);
288
+ expect(subscriptionAccountUsage("claude", value).windows[0]?.label).toBe("Primary");
289
+ expect(subscriptionAccountUsage("xai", value).windows[0]?.label).toBe("Primary");
290
+ // The shared core stores Codex's 5-hour reading as `primary`.
291
+ expect(subscriptionAccountUsage("codex", value).windows[0]?.label).toBe("5h");
279
292
  });
280
293
 
281
294
  test("an account-wide limit without windows names when it ends", () => {
282
295
  const view = subscriptionAccountUsage(
296
+ "claude",
283
297
  snapshot([], { exhaustedKind: "rate_limit", exhaustedUntil: "2020-01-01T09:00:00Z" }),
284
298
  Date.parse("2020-01-01T08:00:00Z"),
285
299
  );
286
300
  expect(view.message).toStartWith("Limit reached until ");
301
+ expect(view.limit.reached).toBe(true);
287
302
  expect(view.windows).toEqual([]);
288
303
  });
289
304
 
290
- test("a past reset keeps the reading but says it may be outdated", () => {
305
+ test("a past reset no longer claims the limit or a share left", () => {
291
306
  const value = snapshot([
292
307
  { id: "five_hour", usedPercent: 100, resetsAt: "2026-10-12T12:00:00Z", status: "exhausted" },
293
308
  ]);
294
- const before = subscriptionAccountUsage(value, Date.parse("2026-10-12T11:00:00Z"));
295
- const after = subscriptionAccountUsage(value, Date.parse("2026-10-12T13:00:00Z"));
296
- expect(before.windows?.[0]?.detail).toContain("Resets ");
297
- expect(after.windows?.[0]?.detail).toContain("Reset passed; usage may be outdated");
298
- expect(after.windows?.[0]?.detail).toContain("Limit reached");
299
- expect(after.windows?.[0]?.usedPercent).toBe(100);
309
+ const before = subscriptionAccountUsage("claude", value, Date.parse("2026-10-12T11:00:00Z"));
310
+ const after = subscriptionAccountUsage("claude", value, Date.parse("2026-10-12T13:00:00Z"));
311
+ expect(before.windows[0]).toMatchObject({ limitReached: true, leftPercent: 0 });
312
+ expect(before.limit).toMatchObject({
313
+ reached: true,
314
+ until: Date.parse("2026-10-12T12:00:00Z"),
315
+ });
316
+ expect(after.windows[0]).toMatchObject({
317
+ limitReached: false,
318
+ leftPercent: null,
319
+ resetPassed: true,
320
+ resetsAt: null,
321
+ });
322
+ expect(after.limit.reached).toBe(false);
323
+ });
324
+
325
+ test("only reported windows: verified Ultra and ChatGPT Pro have no 5-hour window", () => {
326
+ const ultra = subscriptionAccountUsage(
327
+ "claude",
328
+ snapshot([
329
+ { id: "seven_day", usedPercent: 24, resetsAt: null, status: "ok" },
330
+ { id: "seven_day_fable", usedPercent: 61, resetsAt: null, status: "ok" },
331
+ { id: "overage", usedPercent: 0, resetsAt: null, status: "ok" },
332
+ ]),
333
+ );
334
+ expect(ultra.windows.map((window) => window.label)).toEqual([
335
+ "Week",
336
+ "Fable week",
337
+ "Extra usage",
338
+ ]);
339
+ const pro = subscriptionAccountUsage(
340
+ "codex",
341
+ snapshot([{ id: "secondary", usedPercent: 40, resetsAt: null, status: "ok" }]),
342
+ );
343
+ expect(pro.windows.map((window) => [window.label, window.leftPercent])).toEqual([["Week", 60]]);
344
+ });
345
+ });
346
+
347
+ describe("plans and marks in the account list", () => {
348
+ const claudeAccounts = [
349
+ account("pro", { plan: "claude_pro", email: "sam.longername.lindqvist@example.test" }),
350
+ account("max", { plan: "claude_max_5x" }),
351
+ account("ultra", { plan: "claude_max_20x" }),
352
+ account("bare", { plan: "claude_max" }),
353
+ ];
354
+
355
+ test("plans read as the provider names them, on each row only when they differ", () => {
356
+ const content = subscriptionAccountMenuContent(
357
+ state({ accounts: claudeAccounts, current: null }),
358
+ );
359
+ expect(content.plan).toBeNull();
360
+ expect(content.accounts.map((row) => row.plan)).toEqual([
361
+ "Pro",
362
+ "Max",
363
+ "Ultra",
364
+ "Max or Ultra",
365
+ ]);
366
+ // Never the raw id.
367
+ expect(JSON.stringify(content)).not.toContain("claude_max");
368
+ });
369
+
370
+ test("the full email stays in the row, never shortened", () => {
371
+ const content = subscriptionAccountMenuContent(
372
+ state({ accounts: claudeAccounts, current: null }),
373
+ );
374
+ expect(content.accounts[0]).toMatchObject({
375
+ label: "Acme pro",
376
+ email: "sam.longername.lindqvist@example.test",
377
+ });
378
+ });
379
+
380
+ test("the chosen account is marked for the next turn and the serving one as in use", () => {
381
+ const content = subscriptionAccountMenuContent(
382
+ state({ automatic: false, chosenId: "b", serving: true }),
383
+ );
384
+ expect(content.accounts.map((row) => row.mark)).toEqual(["in_use", "next_turn", null]);
385
+ const automatic = subscriptionAccountMenuContent(state());
386
+ expect(automatic.automaticSelected).toBe(true);
387
+ expect(automatic.accounts.map((row) => row.mark)).toEqual(["in_use", null, null]);
388
+ });
389
+
390
+ test("ChatGPT and SuperGrok plans", () => {
391
+ const codex = subscriptionAccountMenuContent(
392
+ state({
393
+ provider: "codex",
394
+ accounts: [account("p", { plan: "plus" }), account("q", { plan: "team" })],
395
+ current: null,
396
+ }),
397
+ );
398
+ expect(codex.accounts.map((row) => row.plan)).toEqual(["Plus", "Business"]);
399
+ const grok = subscriptionAccountMenuContent(
400
+ state({
401
+ provider: "xai",
402
+ accounts: [account("g", { plan: "SuperGrok Heavy" })],
403
+ current: null,
404
+ }),
405
+ );
406
+ expect(grok.plan).toBe("SuperGrok Heavy");
300
407
  });
301
408
  });
302
409
 
@@ -7,11 +7,17 @@ import type { ClientModel, ModelAccountChoiceRefusal } from "@opengeni/sdk";
7
7
  import { isClaudeSubscriptionModelId } from "@opengeni/contracts/claude-subscription-model-ids";
8
8
  import { connectedSubscriptionProvider } from "../../../model-policy";
9
9
  import { isCodexProductModel } from "../../lib/session-model";
10
+ import {
11
+ subscriptionLimit,
12
+ subscriptionPlanLabel,
13
+ subscriptionWindows,
14
+ type SubscriptionLimit,
15
+ type SubscriptionWindow,
16
+ } from "../../lib/subscription-accounts";
10
17
  import type { BillingClass } from "../billing-class-mark";
11
18
  import type {
12
19
  SubscriptionAccountMenuRow,
13
20
  SubscriptionAccountMenuUsage,
14
- SubscriptionAccountUsageWindow,
15
21
  } from "./subscription-account-menu";
16
22
 
17
23
  export type SubscriptionAccountUsage = {
@@ -89,20 +95,6 @@ export function subscriptionProviderPresentation(provider: string): {
89
95
  return PROVIDER[provider] ?? { name: "Subscription", billingClass: "external" };
90
96
  }
91
97
 
92
- // Presentation labels only. Preserve every supplied window; never combine
93
- // family-specific, overage or partial windows into an account capacity score.
94
- const WINDOW_LABEL: Record<string, string> = {
95
- // Neutral ids: they do not say how long the window is.
96
- primary: "Primary",
97
- secondary: "Secondary",
98
- five_hour: "5h",
99
- seven_day: "Week",
100
- seven_day_opus: "Week · Opus",
101
- seven_day_sonnet: "Week · Sonnet",
102
- overage: "Overage",
103
- billing: "Billing",
104
- };
105
-
106
98
  const REFUSAL_COPY: Record<ModelAccountChoiceRefusal, string> = {
107
99
  inactive: "Unavailable",
108
100
  personal_not_allowed: "Turned off here",
@@ -122,9 +114,11 @@ const STATUS_COPY: Record<string, string> = {
122
114
  limit_reached: "Limit reached",
123
115
  };
124
116
 
125
- function time(value: string | null): string | null {
126
- if (!value || !Number.isFinite(Date.parse(value))) return null;
127
- return new Date(value).toLocaleString(undefined, {
117
+ function time(value: string | number | null): string | null {
118
+ if (value === null) return null;
119
+ const at = typeof value === "number" ? value : Date.parse(value);
120
+ if (!Number.isFinite(at)) return null;
121
+ return new Date(at).toLocaleString(undefined, {
128
122
  month: "short",
129
123
  day: "numeric",
130
124
  hour: "numeric",
@@ -132,8 +126,15 @@ function time(value: string | null): string | null {
132
126
  });
133
127
  }
134
128
 
135
- export function accountLabel(account: SubscriptionAccount): string {
136
- return account.label ?? account.email ?? account.plan ?? "Account";
129
+ /** The name an account goes by: its label, else its email, else its plan. */
130
+ export function accountLabel(account: SubscriptionAccount, provider = ""): string {
131
+ return (
132
+ account.label ??
133
+ account.email ??
134
+ subscriptionPlanLabel(provider, account.plan) ??
135
+ account.plan ??
136
+ "Account"
137
+ );
137
138
  }
138
139
 
139
140
  export function accountStatus(account: SubscriptionAccount): string | null {
@@ -153,91 +154,46 @@ function accountSource(account: SubscriptionAccount): string | null {
153
154
  : null;
154
155
  }
155
156
 
156
- function windowLabel(id: string): string {
157
- return WINDOW_LABEL[id] ?? id;
158
- }
157
+ /** An account's usage as every surface shows it: its reported windows and its limit. */
158
+ export type SubscriptionAccountUsageView = {
159
+ windows: SubscriptionWindow[];
160
+ limit: SubscriptionLimit;
161
+ /** Words instead of windows: no reading, or a limit with no window to show it. */
162
+ message: string | null;
163
+ /** "Updated 3 Nov, 15:29", when the reading says when it was taken. */
164
+ note: string | null;
165
+ };
159
166
 
160
- /** The reading as usage rows: percentage used, with when each window resets. */
167
+ /** The reading as the provider reported it: every window, labelled, never completed. */
161
168
  export function subscriptionAccountUsage(
169
+ provider: string,
162
170
  usage: SubscriptionAccountUsage | null | undefined,
163
171
  now = Date.now(),
164
- ): {
165
- windows?: SubscriptionAccountUsageWindow[];
166
- message?: string;
167
- note?: string;
168
- summary?: string;
169
- } {
170
- if (!usage) return { message: "No usage reading yet" };
171
- const observed = time(usage.observedAt);
172
- const windows = usage.windows.map((window) => {
173
- const reset = time(window.resetsAt);
174
- const past = reset !== null && Date.parse(window.resetsAt!) <= now;
175
- return {
176
- label: windowLabel(window.id),
177
- usedPercent: window.usedPercent,
178
- detail: [
179
- window.status === "unknown"
180
- ? "Status unknown"
181
- : window.status === "warning"
182
- ? "Near its limit"
183
- : window.status === "exhausted"
184
- ? "Limit reached"
185
- : null,
186
- past ? "Reset passed; usage may be outdated" : reset ? `Resets ${reset}` : null,
187
- ]
188
- .filter(Boolean)
189
- .join(" · "),
190
- };
191
- });
192
- const exhaustedTime = time(usage.exhaustedUntil);
193
- // A limit whose end has passed no longer applies.
194
- const exhausted =
195
- usage.exhaustedKind !== null &&
196
- !(usage.exhaustedUntil && Date.parse(usage.exhaustedUntil) <= now);
172
+ ): SubscriptionAccountUsageView {
173
+ const windows = subscriptionWindows(provider, usage?.windows ?? [], now);
174
+ const limit = subscriptionLimit(windows, usage?.exhaustedUntil ?? null, now);
175
+ const until = time(limit.until);
176
+ const observed = time(usage?.observedAt ?? null);
197
177
  return {
198
178
  windows,
199
- ...(windows.length === 0
200
- ? {
201
- message: exhausted
202
- ? `Limit reached${exhaustedTime ? ` until ${exhaustedTime}` : ""}`
203
- : "No usage reading yet",
204
- }
205
- : {}),
206
- ...(observed ? { note: `Updated ${observed}` } : {}),
207
- ...(windows.length > 0
208
- ? {
209
- summary: `${windows
210
- .map(
211
- (window) =>
212
- `${window.label} ${window.usedPercent === null ? "unknown" : `${Math.round(window.usedPercent)}%`}`,
213
- )
214
- .join(" · ")} used`,
215
- }
216
- : {}),
179
+ limit,
180
+ // A limit that no account-wide window shows (a refusal) still says until
181
+ // when; a full model-scoped week (Fable) doesn't show the account's limit.
182
+ message:
183
+ limit.reached && !windows.some((window) => window.limitReached && !window.scoped)
184
+ ? `Limit reached${until ? ` until ${until}` : ""}`
185
+ : windows.length === 0
186
+ ? "No usage reading yet"
187
+ : null,
188
+ note: observed ? `Updated ${observed}` : null,
217
189
  };
218
190
  }
219
191
 
220
- function nearLimit(usage: SubscriptionAccountUsage | null | undefined): boolean {
221
- return (usage?.windows ?? []).some(
222
- (window) =>
223
- window.status === "warning" ||
224
- window.status === "exhausted" ||
225
- (window.usedPercent !== null && window.usedPercent >= 90),
226
- );
227
- }
228
-
229
- /** The most-used window with a known reading: the one that runs out first. */
230
- function tightestWindow(
231
- windows: SubscriptionAccountUsageWindow[] | undefined,
232
- ): { label: string; usedPercent: number } | undefined {
233
- let tightest: { label: string; usedPercent: number } | undefined;
234
- for (const window of windows ?? []) {
235
- if (window.usedPercent === null || !Number.isFinite(window.usedPercent)) continue;
236
- if (!tightest || window.usedPercent > tightest.usedPercent) {
237
- tightest = { label: window.label, usedPercent: window.usedPercent };
238
- }
239
- }
240
- return tightest;
192
+ /** One plan label when every listed account has the same plan, else null. */
193
+ function sharedPlan(provider: string, accounts: readonly SubscriptionAccount[]): string | null {
194
+ const plans = new Set(accounts.map((account) => subscriptionPlanLabel(provider, account.plan)));
195
+ const [only] = plans;
196
+ return plans.size === 1 && only ? only : null;
241
197
  }
242
198
 
243
199
  /**
@@ -273,13 +229,17 @@ export function subscriptionAccountProvider(
273
229
  }
274
230
 
275
231
  /** Everything the account menu shows, from the neutral state. */
276
- export function subscriptionAccountMenuContent(state: SubscriptionAccountState) {
232
+ export function subscriptionAccountMenuContent(
233
+ state: SubscriptionAccountState,
234
+ now: number = Date.now(),
235
+ ) {
277
236
  const { name } = subscriptionProviderPresentation(state.provider);
237
+ const provider = state.provider;
278
238
  const current = state.current;
279
239
  // A failed read does not know the selection; never claim Automatic for it.
280
240
  const unknown = state.unavailable && !current && !state.currentHidden;
281
241
  const displayName = current
282
- ? accountLabel(current)
242
+ ? accountLabel(current, provider)
283
243
  : state.currentHidden
284
244
  ? "Account unavailable"
285
245
  : unknown
@@ -295,11 +255,12 @@ export function subscriptionAccountMenuContent(state: SubscriptionAccountState)
295
255
  : current
296
256
  ? "Current account"
297
257
  : "Account selection";
298
- const usageNearLimit = nearLimit(current?.usage);
258
+ const currentUsage = current ? subscriptionAccountUsage(provider, current.usage, now) : null;
259
+ const limitTone = currentUsage?.limit.reached || currentUsage?.limit.near;
299
260
  const tone: "ok" | "warn" | "bad" =
300
261
  current?.status === "needs_relogin" || current?.status === "error"
301
262
  ? "bad"
302
- : status || state.waiting || usageNearLimit
263
+ : status || state.waiting || limitTone
303
264
  ? "warn"
304
265
  : "ok";
305
266
  const usage: SubscriptionAccountMenuUsage = !current
@@ -314,38 +275,64 @@ export function subscriptionAccountMenuContent(state: SubscriptionAccountState)
314
275
  ? { checking: true }
315
276
  : state.usageCheck === "failed"
316
277
  ? { unavailable: true }
317
- : subscriptionAccountUsage(current.usage);
278
+ : {
279
+ windows: currentUsage!.windows,
280
+ ...(currentUsage!.message ? { message: currentUsage!.message } : {}),
281
+ ...(currentUsage!.note ? { note: currentUsage!.note } : {}),
282
+ };
283
+ // The plan is shown once: beside the list when every account has the same
284
+ // plan, else on each row (by its own name, the provider being clear here).
285
+ const plan = sharedPlan(provider, state.accounts);
286
+ const selectedId = state.automatic || unknown ? null : state.chosenId;
318
287
  const accounts: SubscriptionAccountMenuRow[] = state.accounts.map((account) => {
319
- // The current account's usage is already shown above the list.
288
+ const label = accountLabel(account, provider);
289
+ const rowStatus = accountStatus(account);
290
+ // The current account's usage is shown above the list; a live check
291
+ // hides every reading until it answers.
320
292
  const rowUsage =
321
293
  account.id === current?.id || state.usageCheck === "checking"
322
- ? undefined
323
- : subscriptionAccountUsage(account.usage);
294
+ ? null
295
+ : subscriptionAccountUsage(provider, account.usage, now);
324
296
  return {
325
297
  id: account.id,
326
- label: accountLabel(account),
327
- plan: account.plan,
328
- status: accountStatus(account),
298
+ label,
299
+ email: account.email && account.email !== label ? account.email : null,
300
+ plan: plan ? null : subscriptionPlanLabel(provider, account.plan, { brand: false }),
301
+ status: rowStatus,
302
+ mark:
303
+ account.id === selectedId
304
+ ? "next_turn"
305
+ : account.id === current?.id && !state.currentHidden
306
+ ? "in_use"
307
+ : null,
308
+ windows: rowUsage?.windows ?? null,
309
+ // A row without a reading stays quiet; only a limit no window shows gets words.
310
+ usageMessage: rowUsage?.limit.reached ? rowUsage.message : null,
329
311
  detail: [
330
- accountLabel(account),
312
+ label,
331
313
  account.email,
332
- account.plan,
314
+ subscriptionPlanLabel(provider, account.plan),
333
315
  accountSource(account),
334
- accountStatus(account),
316
+ rowStatus,
335
317
  ]
336
- .filter(Boolean)
318
+ .filter((part, index, parts) => part && parts.indexOf(part) === index)
337
319
  .join(" · "),
338
320
  personal: account.source === "personal",
339
321
  disabled: !account.choosable,
340
- usageSummary: rowUsage?.summary,
341
- usageBar: rowUsage?.summary ? tightestWindow(rowUsage.windows) : undefined,
342
322
  };
343
323
  });
344
324
  return {
345
325
  ariaLabel: [
346
326
  `${name} account`,
347
327
  displayName,
348
- state.waiting ? "Limit reached" : (status ?? (usageNearLimit ? "Near its limit" : null)),
328
+ state.waiting
329
+ ? "Limit reached"
330
+ : (status ??
331
+ (currentUsage?.limit.reached
332
+ ? "Limit reached"
333
+ : currentUsage?.limit.near
334
+ ? "Near its limit"
335
+ : null)),
349
336
  ]
350
337
  .filter(Boolean)
351
338
  .join(" · "),
@@ -353,13 +340,15 @@ export function subscriptionAccountMenuContent(state: SubscriptionAccountState)
353
340
  displayName,
354
341
  identity: current?.email && current.email !== displayName ? current.email : null,
355
342
  metadata: current
356
- ? [current.plan, accountSource(current), status].filter(Boolean).join(" · ") ||
357
- `${name} subscription`
343
+ ? [subscriptionPlanLabel(provider, current.plan), accountSource(current), status]
344
+ .filter(Boolean)
345
+ .join(" · ") || `${name} subscription`
358
346
  : `${name} subscription`,
359
347
  tone,
360
348
  usage,
361
349
  accounts,
362
- selectedId: state.automatic || unknown ? null : state.chosenId,
350
+ plan,
351
+ selectedId,
363
352
  automaticSelected: state.automatic && !unknown,
364
353
  actionLabel: state.waiting ? "Retry with" : "Use for next turn",
365
354
  automaticLabel: "Automatic",