@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
@@ -0,0 +1,283 @@
1
+ // One provider-neutral view of a subscription account's plan and usage for
2
+ // every surface that lists one (Claude, ChatGPT/Codex, SuperGrok and any
3
+ // later provider): the account menu, the model settings rows and the account
4
+ // pages. Each provider has one adapter below that names its plans and labels
5
+ // the usage windows it reports; everything else is shared.
6
+ //
7
+ // Windows come only from what the provider reported for that account. Nothing
8
+ // here adds a window a plan doesn't have: a verified Claude Ultra account or a
9
+ // ChatGPT Pro account reports no 5-hour window, so none is shown.
10
+
11
+ /** One usage window as a data source reports it. */
12
+ export type SubscriptionWindowInput = {
13
+ id: string;
14
+ /** Share used, 0-100; null when unknown. Over 100 can mean extra usage. */
15
+ usedPercent: number | null;
16
+ /** When the window resets: an ISO string or epoch milliseconds. */
17
+ resetsAt: string | number | null;
18
+ /**
19
+ * The provider's own state for the window: `exhausted` (it refused on this
20
+ * limit, whatever the percentage says) or `warning` (it says it is close).
21
+ */
22
+ status?: "ok" | "warning" | "exhausted" | "unknown" | null | undefined;
23
+ };
24
+
25
+ /** One usage window, ready to show. */
26
+ export type SubscriptionWindow = {
27
+ id: string;
28
+ /** Short label: "5h", "Week", "Fable week", "Extra usage", "Credits". */
29
+ label: string;
30
+ /** Share left, 0-100; null when unknown or when the reading predates a reset. */
31
+ leftPercent: number | null;
32
+ /** The next reset, epoch milliseconds; null when unknown or already past. */
33
+ resetsAt: number | null;
34
+ limitReached: boolean;
35
+ /** Under 10% left, or the provider says it is close. */
36
+ nearLimit: boolean;
37
+ /** The reading was taken before this window reset, so it no longer says what is left. */
38
+ resetPassed: boolean;
39
+ /** Paid extra usage, not part of the plan's included allowance. */
40
+ extra: boolean;
41
+ /**
42
+ * Limits only some models (a weekly Fable, Opus or Sonnet limit): reaching
43
+ * it never makes the whole account read as limited.
44
+ */
45
+ scoped: boolean;
46
+ };
47
+
48
+ /** Whether the account can take work, from its windows and any refusal. */
49
+ export type SubscriptionLimit = {
50
+ reached: boolean;
51
+ /** When the reached limit ends, epoch milliseconds, when known. */
52
+ until: number | null;
53
+ /** Not reached, but an included-usage window is near its limit. */
54
+ near: boolean;
55
+ };
56
+
57
+ type WindowSpec = { label: string; order: number; extra?: boolean; scoped?: boolean };
58
+
59
+ type SubscriptionAdapter = {
60
+ /** The name plans are sold under: "Claude", "ChatGPT", "SuperGrok". */
61
+ planBrand: string;
62
+ /** The plan's own name without the brand ("Ultra", "Plus"), or null when unknown. */
63
+ planName(plan: string): string | null;
64
+ windows: Record<string, WindowSpec>;
65
+ };
66
+
67
+ /** "claude_team" → "Team", "k12" → "K12": a provider id read as words. */
68
+ function words(id: string): string {
69
+ const text = id.replace(/[_-]+/g, " ").trim();
70
+ return text ? text.charAt(0).toLocaleUpperCase() + text.slice(1) : text;
71
+ }
72
+
73
+ const SHARED_WINDOWS: Record<string, WindowSpec> = {
74
+ five_hour: { label: "5h", order: 10 },
75
+ seven_day: { label: "Week", order: 20 },
76
+ overage: { label: "Extra usage", order: 90, extra: true },
77
+ billing: { label: "Credits", order: 30 },
78
+ };
79
+
80
+ // Anthropic sells Pro, Max and Ultra (Max 20x was renamed Ultra on 30 Oct
81
+ // 2026). The profile reports both Max tiers as `claude_max`; the stored plan
82
+ // carries the tier as `claude_max_5x` or `claude_max_20x` once it is known.
83
+ const CLAUDE_PLANS: Record<string, string> = {
84
+ claude_free: "Free",
85
+ claude_pro: "Pro",
86
+ claude_max: "Max or Ultra",
87
+ claude_max_5x: "Max",
88
+ claude_max_20x: "Ultra",
89
+ claude_ultra: "Ultra",
90
+ claude_team: "Team",
91
+ claude_enterprise: "Enterprise",
92
+ };
93
+
94
+ // ChatGPT renamed Team to Business; the id stays `team`.
95
+ const CHATGPT_PLANS: Record<string, string> = {
96
+ free: "Free",
97
+ go: "Go",
98
+ plus: "Plus",
99
+ pro: "Pro",
100
+ team: "Business",
101
+ business: "Business",
102
+ enterprise: "Enterprise",
103
+ edu: "Edu",
104
+ };
105
+
106
+ const ADAPTERS: Record<string, SubscriptionAdapter> = {
107
+ claude: {
108
+ planBrand: "Claude",
109
+ planName: (plan) => CLAUDE_PLANS[plan] ?? words(plan.replace(/^claude_/, "")),
110
+ windows: {
111
+ ...SHARED_WINDOWS,
112
+ seven_day_fable: { label: "Fable week", order: 21, scoped: true },
113
+ seven_day_opus: { label: "Opus week", order: 22, scoped: true },
114
+ seven_day_sonnet: { label: "Sonnet week", order: 23, scoped: true },
115
+ seven_day_overage_included: { label: "Included extra", order: 80, extra: true },
116
+ },
117
+ },
118
+ codex: {
119
+ planBrand: "ChatGPT",
120
+ planName: (plan) => CHATGPT_PLANS[plan.toLowerCase()] ?? words(plan),
121
+ // The shared core stores the 5-hour window as `primary` and the weekly
122
+ // one as `secondary`; both are identified by duration, never position.
123
+ windows: {
124
+ ...SHARED_WINDOWS,
125
+ primary: { label: "5h", order: 10 },
126
+ secondary: { label: "Week", order: 20 },
127
+ },
128
+ },
129
+ xai: {
130
+ planBrand: "SuperGrok",
131
+ // The tier may already carry the product name ("SuperGrok Heavy").
132
+ planName: (plan) => {
133
+ const tier = plan.replace(/^super\s*grok[\s_-]*/i, "").trim();
134
+ return tier ? words(tier) : "";
135
+ },
136
+ windows: SHARED_WINDOWS,
137
+ },
138
+ };
139
+
140
+ /** Any later provider: its own plan id as words and the shared window names. */
141
+ const GENERIC_ADAPTER: SubscriptionAdapter = {
142
+ planBrand: "",
143
+ planName: (plan) => words(plan),
144
+ windows: SHARED_WINDOWS,
145
+ };
146
+
147
+ function adapter(provider: string): SubscriptionAdapter {
148
+ return ADAPTERS[provider === "supergrok" ? "xai" : provider] ?? GENERIC_ADAPTER;
149
+ }
150
+
151
+ /**
152
+ * The plan as the provider names it today: "Claude Ultra", "ChatGPT Plus",
153
+ * "SuperGrok Heavy". With `brand: false` only the plan's own name ("Ultra").
154
+ * Null when the plan isn't known.
155
+ */
156
+ export function subscriptionPlanLabel(
157
+ provider: string,
158
+ plan: string | null | undefined,
159
+ options: { brand?: boolean } = {},
160
+ ): string | null {
161
+ const id = plan?.trim();
162
+ if (!id) return null;
163
+ const { planBrand, planName } = adapter(provider);
164
+ const name = planName(id);
165
+ if (options.brand === false) return name || planBrand || null;
166
+ return [planBrand, name].filter(Boolean).join(" ") || null;
167
+ }
168
+
169
+ /** A window's short label: "5h", "Week", "Fable week"; an unknown id reads as words. */
170
+ export function subscriptionWindowLabel(provider: string, id: string): string {
171
+ const spec = adapter(provider).windows[id];
172
+ if (spec) return spec.label;
173
+ // A new scoped weekly limit ("seven_day_haiku") reads as "Haiku week".
174
+ const scoped = /^seven_day_(.+)$/.exec(id);
175
+ return scoped ? `${words(scoped[1]!)} week` : words(id);
176
+ }
177
+
178
+ function epoch(value: string | number | null | undefined): number | null {
179
+ if (value === null || value === undefined) return null;
180
+ const time = typeof value === "number" ? value : Date.parse(value);
181
+ return Number.isFinite(time) ? time : null;
182
+ }
183
+
184
+ /**
185
+ * Every reported window, labelled and in a stable order (5h, week, scoped
186
+ * weeks, credits, extra usage). A window whose reset has passed since it was
187
+ * read keeps its place but no longer claims a share left.
188
+ */
189
+ export function subscriptionWindows(
190
+ provider: string,
191
+ inputs: readonly SubscriptionWindowInput[],
192
+ now: number = Date.now(),
193
+ ): SubscriptionWindow[] {
194
+ const specs = adapter(provider).windows;
195
+ return inputs
196
+ .map((input, index) => {
197
+ const reset = epoch(input.resetsAt);
198
+ const resetPassed = reset !== null && reset <= now;
199
+ const used =
200
+ input.usedPercent !== null && Number.isFinite(input.usedPercent) ? input.usedPercent : null;
201
+ const leftPercent =
202
+ resetPassed || used === null ? null : Math.min(100, Math.max(0, 100 - used));
203
+ const limitReached = !resetPassed && (input.status === "exhausted" || (used ?? 0) >= 100);
204
+ return {
205
+ index,
206
+ order: specs[input.id]?.order ?? 50,
207
+ window: {
208
+ id: input.id,
209
+ label: subscriptionWindowLabel(provider, input.id),
210
+ leftPercent,
211
+ resetsAt: resetPassed ? null : reset,
212
+ limitReached,
213
+ nearLimit:
214
+ !limitReached &&
215
+ !resetPassed &&
216
+ (input.status === "warning" ||
217
+ (leftPercent !== null && leftPercent < SUBSCRIPTION_NEAR_LIMIT_LEFT)),
218
+ resetPassed,
219
+ extra: specs[input.id]?.extra === true,
220
+ // A scoped weekly limit this build doesn't know ("seven_day_haiku") too.
221
+ scoped:
222
+ specs[input.id]?.scoped === true ||
223
+ (!specs[input.id] && /^seven_day_.+$/.test(input.id)),
224
+ },
225
+ };
226
+ })
227
+ .sort((left, right) => left.order - right.order || left.index - right.index)
228
+ .map((entry) => entry.window);
229
+ }
230
+
231
+ /** Below this share left, an included-usage window counts as near its limit. */
232
+ export const SUBSCRIPTION_NEAR_LIMIT_LEFT = 10;
233
+
234
+ /**
235
+ * The account's limit state from its included-usage windows and a stored
236
+ * refusal deadline. Extra usage never makes an account look limited or free,
237
+ * and a spent model-scoped week (Fable) only limits those models: the
238
+ * window says so itself, and it still counts as near a limit.
239
+ */
240
+ export function subscriptionLimit(
241
+ windows: readonly SubscriptionWindow[],
242
+ exhaustedUntil: string | number | null = null,
243
+ now: number = Date.now(),
244
+ ): SubscriptionLimit {
245
+ const included = windows.filter((window) => !window.extra);
246
+ const reached = included.filter((window) => window.limitReached && !window.scoped);
247
+ const refusalEnd = epoch(exhaustedUntil);
248
+ const refused = refusalEnd !== null && refusalEnd > now;
249
+ const ends = [...reached.map((window) => window.resetsAt), ...(refused ? [refusalEnd] : [])];
250
+ return {
251
+ reached: reached.length > 0 || refused,
252
+ // The account serves again only once every reached limit has ended.
253
+ until: ends.length > 0 && ends.every((end) => end !== null) ? Math.max(...ends) : null,
254
+ near:
255
+ reached.length === 0 &&
256
+ !refused &&
257
+ included.some((window) => window.nearLimit || (window.scoped && window.limitReached)),
258
+ };
259
+ }
260
+
261
+ /** A Codex account's endpoint readings (five-hour and weekly, each when reported) as inputs. */
262
+ export function codexWindowInputs(usage: {
263
+ fiveHour?: CodexWindowReading | null | undefined;
264
+ weekly?: CodexWindowReading | null | undefined;
265
+ }): SubscriptionWindowInput[] {
266
+ const input = (id: string, reading: CodexWindowReading | null | undefined) => {
267
+ if (!reading) return [];
268
+ const usedPercent =
269
+ typeof reading.percent === "number"
270
+ ? reading.percent
271
+ : typeof reading.remaining === "number"
272
+ ? 100 - reading.remaining
273
+ : null;
274
+ return [{ id, usedPercent, resetsAt: reading.resetAt ?? null }];
275
+ };
276
+ return [...input("five_hour", usage.fiveHour), ...input("seven_day", usage.weekly)];
277
+ }
278
+
279
+ type CodexWindowReading = {
280
+ percent?: number | null | undefined;
281
+ remaining?: number | null | undefined;
282
+ resetAt?: string | null | undefined;
283
+ };
@@ -4,6 +4,7 @@ import {
4
4
  createSessionRetainedScreenshotLoader,
5
5
  createWorkspaceRetainedArtifactLoader,
6
6
  createWorkspaceRetainedVideoLoader,
7
+ timelineLivePause,
7
8
  } from "../../timeline";
8
9
  import { isModelUnavailableSubmissionError, type CreditRefusalKind } from "../../lib/format";
9
10
  import { inertProps } from "../../lib/inert";
@@ -4253,6 +4254,7 @@ function SessionChatPane(props: {
4253
4254
  focusSequence={momentSequence}
4254
4255
  events={props.events}
4255
4256
  status={props.session.status}
4257
+ pause={timelineLivePause(admissionControl)}
4256
4258
  computeLabel={computeLabel}
4257
4259
  renderMessageText={renderMessageText}
4258
4260
  renderMessageActions={renderMessageActions}
@@ -25,6 +25,7 @@ import {
25
25
  type TimelineSearchTarget,
26
26
  } from "./timeline-search";
27
27
  import { GenieLoadingOptionsContext, type GenieLoadingOptions } from "../timeline/genie-loading";
28
+ import { useTimelinePauses } from "../timeline/use-timeline-pauses";
28
29
  import { ChildSessionLink } from "./child-session-link";
29
30
  import { useStartupDetails } from "../timeline/startup-preference";
30
31
  import {
@@ -133,6 +134,7 @@ import {
133
134
  defaultToolRegistry,
134
135
  groupTimeline,
135
136
  LightboxProvider,
137
+ type TimelineLivePause,
136
138
  type ActivityItem,
137
139
  type AgentMessageItem,
138
140
  type AuthNeededItem,
@@ -235,6 +237,14 @@ export type MessageTimelineProps = {
235
237
  items?: TimelineItem[] | undefined;
236
238
  /** Current session status (reserved; tip "Working…" chrome removed for now). */
237
239
  status?: SessionStatus | null | undefined;
240
+ /**
241
+ * The session's live Pause, from its effective control
242
+ * (`timelineLivePause(session.effectiveControl)`). A turn still open under a
243
+ * pause reads "Paused" with its clock stopped, and paused time is not
244
+ * counted as work. Omit to rely on the session's events alone, which do not
245
+ * show a pause of an ancestor or the workspace that interrupted nothing.
246
+ */
247
+ pause?: TimelineLivePause | null | undefined;
238
248
  /** Host-owned controls beside Copy and the timestamp on settled message rows. */
239
249
  renderMessageActions?: ((item: AgentMessageItem | UserMessageItem) => ReactNode) | undefined;
240
250
  /**
@@ -651,6 +661,7 @@ export function MessageTimeline({
651
661
  events,
652
662
  items,
653
663
  status: _status,
664
+ pause,
654
665
  renderMessageActions,
655
666
  renderMessageSender,
656
667
  renderMessageText,
@@ -820,9 +831,10 @@ export function MessageTimeline({
820
831
  const olderPageBudgetRef = useRef(0);
821
832
  const [olderDemand, setOlderDemand] = useState(0);
822
833
  const readableTurns = turnSummary?.rolling === true;
834
+ const pauses = useTimelinePauses(events, pause, readableTurns);
823
835
  const projectedGroups = useMemo(
824
- () => groupTimeline(t, resolvedItems, { readableTurns }),
825
- [resolvedItems, readableTurns, t],
836
+ () => groupTimeline(t, resolvedItems, { readableTurns, pauses }),
837
+ [resolvedItems, readableTurns, pauses, t],
826
838
  );
827
839
  // A new timeline revision (including session/turn replacement) owns layout.
828
840
  // Never leave an old decorative transform running on its retained rows.
@@ -61,7 +61,7 @@ import {
61
61
  } from "./conversation-capability-connect";
62
62
  import type { SessionMcpCapabilityCardProps } from "./session-mcp-capability-card";
63
63
  import type { SessionIntegrationCapabilityCardProps } from "./session-integration-capability-card";
64
- import type { AuthNeededItem } from "../timeline";
64
+ import { timelineLivePause, type AuthNeededItem } from "../timeline";
65
65
  import { ProviderRecoveryNotice } from "./provider-recovery-notice";
66
66
  import { currentProviderRecovery } from "../lib/provider-recovery";
67
67
  import {
@@ -718,6 +718,7 @@ function ConversationView({
718
718
  emptyState={timelineProps?.emptyState}
719
719
  renderMessageSender={timelineProps?.renderMessageSender}
720
720
  status={status}
721
+ pause={timelineLivePause(voiceControl)}
721
722
  hasOlder={feed.hasOlder}
722
723
  loadingOlder={feed.loadingOlder}
723
724
  onLoadOlder={feed.loadOlder}
@@ -74,8 +74,11 @@ export function TimelineAnnotationCards({
74
74
  data-og-annotation-cards=""
75
75
  className={cn(
76
76
  "grid gap-2",
77
+ // Inside the timeline, let the wheel chain to the timeline once this
78
+ // stack is at its edge. Containing overscroll here made the whole
79
+ // message a dead zone for scrolling, even when the stack fit.
77
80
  annotations.length >= ANNOTATION_CARD_STACK_SCROLL_AT &&
78
- "max-h-[min(28rem,55vh)] overflow-x-hidden overflow-y-auto overscroll-contain pr-1",
81
+ "max-h-[min(28rem,55vh)] overflow-x-hidden overflow-y-auto pr-1",
79
82
  className,
80
83
  )}
81
84
  >
@@ -14,7 +14,7 @@ export function captureTimelineSettlement(
14
14
  if (timelineHasReader(scroller)) return null;
15
15
  const live = Array.from(
16
16
  scroller.querySelectorAll(
17
- '[data-og-exchange-status="working"], [data-og-exchange-status="waiting"]',
17
+ '[data-og-exchange-status="working"], [data-og-exchange-status="waiting"], [data-og-exchange-status="paused"]',
18
18
  ),
19
19
  );
20
20
  // At the live tip the newest retained answer owns the transition. An older
@@ -1563,7 +1563,17 @@ export function useComposer(
1563
1563
  return release;
1564
1564
  }, []);
1565
1565
 
1566
- /** Save the draft now. The caller holds the draft slot. */
1566
+ /**
1567
+ * Save the draft now. The caller holds the draft slot.
1568
+ *
1569
+ * A save refused as made against an old revision re-reads the draft before
1570
+ * it counts as a conflict. The same content, or content this page wrote itself (a save
1571
+ * whose reply was lost, or one that landed after the composer remounted),
1572
+ * is not another tab: the save just moves to the current revision. An
1573
+ * explicit choice (Send, Keep mine) saves the person's content over
1574
+ * whatever is there. Only an autosave that meets someone else's edit
1575
+ * stops and offers Keep mine / Use other draft.
1576
+ */
1567
1577
  const saveDraftInSlot = useCallback(
1568
1578
  async (
1569
1579
  payload: SaveComposerDraftRequest,
@@ -1571,28 +1581,62 @@ export function useComposer(
1571
1581
  // Receives this call's own failure (never a later autosave's), so a send
1572
1582
  // blocked by it keeps its real cause.
1573
1583
  onFailure?: (problem: Error) => void,
1584
+ intent: "autosave" | "explicit" = "autosave",
1574
1585
  ): Promise<boolean> => {
1575
1586
  const owned = () =>
1576
1587
  targetKeyRef.current === owner.targetKey && targetGeneration.current === owner.generation;
1577
1588
  if (!sessionId || !durableDrafts || !owned()) return false;
1578
1589
  const current = draftRef.current;
1579
1590
  if (!current) return false;
1580
- const request = { ...payload, expectedRevision: current.revision };
1591
+ let request = { ...payload, expectedRevision: current.revision };
1581
1592
  if (draftSignature(request) === lastSavedSignature.current) return true;
1582
- setDraftSaving(true);
1583
- try {
1584
- const saved = await client.saveComposerDraft(workspaceId, sessionId, request);
1585
- if (!owned()) return false;
1586
- adoptDraftBase(saved);
1587
- return true;
1588
- } catch (cause) {
1593
+ const writesKey = `${workspaceId}\u0000${sessionId}`;
1594
+ const fail = (problem: Error): false => {
1589
1595
  if (owned()) {
1590
- const problem = asError(cause);
1596
+ // The conflict choice says what happened; a generic "conflicts with
1597
+ // the current state" line under it would only repeat it vaguely.
1591
1598
  if (isDraftConflictError(problem)) setDraftConflict(problem);
1592
- setError(problem);
1599
+ else setError(problem);
1593
1600
  onFailure?.(problem);
1594
1601
  }
1595
1602
  return false;
1603
+ };
1604
+ setDraftSaving(true);
1605
+ try {
1606
+ for (let reread = 0; ; reread += 1) {
1607
+ let problem: Error;
1608
+ try {
1609
+ rememberDraftWrite(writesKey, draftContentKey(request));
1610
+ const saved = await client.saveComposerDraft(workspaceId, sessionId, request);
1611
+ if (!owned()) return false;
1612
+ adoptDraftBase(saved);
1613
+ return true;
1614
+ } catch (cause) {
1615
+ problem = asError(cause);
1616
+ }
1617
+ if (!owned()) return false;
1618
+ if (!isDraftConflictError(problem) || reread >= DRAFT_CONFLICT_REREADS) {
1619
+ return fail(problem);
1620
+ }
1621
+ let remote: ComposerDraft;
1622
+ try {
1623
+ remote = await client.getComposerDraft(workspaceId, sessionId);
1624
+ } catch (cause) {
1625
+ return fail(asError(cause));
1626
+ }
1627
+ if (!owned()) return false;
1628
+ const remoteContent = draftContentKey(draftPayload(remote));
1629
+ if (remoteContent === draftContentKey(request)) {
1630
+ adoptDraftBase(remote);
1631
+ return true;
1632
+ }
1633
+ if (intent !== "explicit" && !recentDraftWrites.get(writesKey)?.includes(remoteContent)) {
1634
+ return fail(problem);
1635
+ }
1636
+ draftRef.current = remote;
1637
+ setDraft(remote);
1638
+ request = { ...request, expectedRevision: remote.revision };
1639
+ }
1596
1640
  } finally {
1597
1641
  if (owned()) setDraftSaving(false);
1598
1642
  }
@@ -1604,6 +1648,7 @@ export function useComposer(
1604
1648
  async (
1605
1649
  payload: SaveComposerDraftRequest,
1606
1650
  onFailure?: (problem: Error) => void,
1651
+ intent: "autosave" | "explicit" = "autosave",
1607
1652
  ): Promise<boolean> => {
1608
1653
  const owner = { targetKey, generation: targetGeneration.current };
1609
1654
  if (!sessionId || !durableDrafts || targetKeyRef.current !== owner.targetKey) {
@@ -1611,7 +1656,7 @@ export function useComposer(
1611
1656
  }
1612
1657
  const release = await acquireDraftSlot();
1613
1658
  try {
1614
- return await saveDraftInSlot(payload, owner, onFailure);
1659
+ return await saveDraftInSlot(payload, owner, onFailure, intent);
1615
1660
  } finally {
1616
1661
  release();
1617
1662
  }
@@ -1869,6 +1914,7 @@ export function useComposer(
1869
1914
  (problem) => {
1870
1915
  persistFailure = problem;
1871
1916
  },
1917
+ "explicit",
1872
1918
  ))
1873
1919
  ) {
1874
1920
  // An update that blocks the draft save holds the send like any
@@ -2432,10 +2478,12 @@ export function useComposer(
2432
2478
  if (payload) {
2433
2479
  releaseDraftSlot = await acquireDraftSlot();
2434
2480
  if (
2435
- !(await saveDraftInSlot(payload, {
2436
- targetKey: ownedTargetKey,
2437
- generation: ownedGeneration,
2438
- }))
2481
+ !(await saveDraftInSlot(
2482
+ payload,
2483
+ { targetKey: ownedTargetKey, generation: ownedGeneration },
2484
+ undefined,
2485
+ "explicit",
2486
+ ))
2439
2487
  ) {
2440
2488
  return false;
2441
2489
  }
@@ -3199,7 +3247,13 @@ export function useComposer(
3199
3247
  setDraftConflict(null);
3200
3248
  setError(null);
3201
3249
  const payload = currentDraftPayload();
3202
- if (payload) await persistPayload({ ...payload, expectedRevision: remote.revision });
3250
+ if (payload) {
3251
+ await persistPayload(
3252
+ { ...payload, expectedRevision: remote.revision },
3253
+ undefined,
3254
+ "explicit",
3255
+ );
3256
+ }
3203
3257
  },
3204
3258
  [
3205
3259
  applyDraft,
@@ -3534,19 +3588,44 @@ function draftSignature(payload: SaveComposerDraftRequest): string {
3534
3588
  return JSON.stringify(content);
3535
3589
  }
3536
3590
 
3591
+ /** Re-reads a save makes after "draft changed" before giving up on it. */
3592
+ const DRAFT_CONFLICT_REREADS = 3;
3593
+
3594
+ /**
3595
+ * The draft content this page recently wrote, per chat. It outlives a
3596
+ * composer remount, so a save that lands after the composer re-read the
3597
+ * draft is still recognised as this page's own write.
3598
+ */
3599
+ const recentDraftWrites = new Map<string, string[]>();
3600
+
3601
+ function rememberDraftWrite(chatKey: string, content: string): void {
3602
+ const writes = (recentDraftWrites.get(chatKey) ?? []).filter((entry) => entry !== content);
3603
+ writes.push(content);
3604
+ recentDraftWrites.set(chatKey, writes.slice(-8));
3605
+ }
3606
+
3607
+ /** Draft content as the server stores it, for comparing a save with a read. */
3608
+ function draftContentKey(payload: SaveComposerDraftRequest): string {
3609
+ const { expectedRevision: _revision, resources, ...content } = payload;
3610
+ return JSON.stringify({ ...content, resources: resources.map(resourceIdentity) });
3611
+ }
3612
+
3613
+ function resourceIdentity(resource: ResourceRef): string {
3614
+ // Reconnect reconciliation can restore the canonical server form while
3615
+ // the still-mounted upload card supplies the same ready file without its
3616
+ // default mount. Treat those two wire shapes as one selected attachment.
3617
+ return resource.kind === "file"
3618
+ ? `file:${resource.fileId}\u0000${resource.mountPath ?? `${DEFAULT_FILE_RESOURCE_MOUNT_ROOT}/${resource.fileId}`}`
3619
+ : JSON.stringify(resource);
3620
+ }
3621
+
3537
3622
  function mergeResources(base: ResourceRef[], additions: ResourceRef[]): ResourceRef[] {
3538
3623
  const seen = new Set<string>();
3539
3624
  return [...base, ...additions].filter((resource) => {
3540
- // Reconnect reconciliation can restore the canonical server form while
3541
- // the still-mounted upload card supplies the same ready file without its
3542
- // default mount. Treat those two wire shapes as one selected attachment;
3543
- // preserving the first representation keeps custom mounts and ordering
3625
+ // Preserving the first representation keeps custom mounts and ordering
3544
3626
  // intact while preventing the draft and command paths from seeing
3545
3627
  // different duplicate counts after server normalization.
3546
- const key =
3547
- resource.kind === "file"
3548
- ? `file:${resource.fileId}\u0000${resource.mountPath ?? `${DEFAULT_FILE_RESOURCE_MOUNT_ROOT}/${resource.fileId}`}`
3549
- : JSON.stringify(resource);
3628
+ const key = resourceIdentity(resource);
3550
3629
  if (seen.has(key)) return false;
3551
3630
  seen.add(key);
3552
3631
  return true;
@@ -9,6 +9,7 @@ import type {
9
9
  RecordingPerson,
10
10
  RecordingVoiceprintConsent,
11
11
  RecordingSpeaker,
12
+ RecordingCalendarEventRef,
12
13
  RecordingTranscriptionRequest,
13
14
  RecordingTranscriptPage,
14
15
  RecordingTranscriptSegment,
@@ -172,6 +173,8 @@ export type UseRecorderOptions = RecordingsClientOverride & {
172
173
  /** Your own id for what this recording belongs to, to find it again with `useRecordings`. */
173
174
  externalRef?: string;
174
175
  metadata?: Record<string, unknown>;
176
+ /** The owner's calendar event the meeting is of, such as one they joined; it names the meeting. */
177
+ calendarEvent?: RecordingCalendarEventRef;
175
178
  transcription?: RecordingTranscriptionRequest;
176
179
  /**
177
180
  * The person recording's name, as your app knows it: their microphone's
@@ -241,6 +244,7 @@ export type UseRecorderResult = RecorderSnapshot & {
241
244
  | "transcription"
242
245
  | "externalRef"
243
246
  | "metadata"
247
+ | "calendarEvent"
244
248
  | "ownerName"
245
249
  >,
246
250
  ) => Promise<void>;
@@ -473,6 +477,7 @@ export function useRecorder(options: UseRecorderOptions = {}): UseRecorderResult
473
477
  ...(merged.visibility ? { visibility: merged.visibility } : {}),
474
478
  ...(merged.externalRef ? { externalRef: merged.externalRef } : {}),
475
479
  ...(merged.metadata ? { metadata: merged.metadata as never } : {}),
480
+ ...(merged.calendarEvent ? { calendarEvent: merged.calendarEvent } : {}),
476
481
  ...(merged.transcription ? { transcription: merged.transcription } : {}),
477
482
  ...(merged.ownerName?.trim() ? { ownerName: merged.ownerName } : {}),
478
483
  ...(merged.microphone !== undefined ? { microphone: merged.microphone } : {}),
package/src/index.ts CHANGED
@@ -481,10 +481,15 @@ export {
481
481
  extractSessionRef,
482
482
  groupTimeline,
483
483
  sessionStatusFromEvents,
484
+ timelineLivePause,
485
+ timelinePauseSpans,
484
486
  toolDisplayName,
487
+ useTimelinePauses,
485
488
  } from "./timeline";
486
489
  export type {
487
490
  GroupTimelineOptions,
491
+ TimelineLivePause,
492
+ TimelinePauseSpan,
488
493
  ActivityItem,
489
494
  AgentMessageItem,
490
495
  AuthNeededItem,
@@ -649,7 +649,9 @@ function FailedTranscriptActions({
649
649
  about?.funding !== "deployment"
650
650
  ? fixes.onConnectModels
651
651
  : undefined;
652
- const billing = !switchTo && transcriptNeedsCredits(code) ? fixes.onOpenBilling : undefined;
652
+ const upgrade = code === "subscription_plan_required";
653
+ const billing =
654
+ !switchTo && (transcriptNeedsCredits(code) || upgrade) ? fixes.onOpenBilling : undefined;
653
655
  return (
654
656
  <span className="flex flex-wrap gap-2">
655
657
  {switchTo ? (
@@ -675,7 +677,7 @@ function FailedTranscriptActions({
675
677
  ) : billing ? (
676
678
  <Button type="button" size="sm" onClick={billing}>
677
679
  <CreditCardIcon aria-hidden="true" />
678
- {msg("meetings.detailPage.addCredits")}
680
+ {msg(upgrade ? "meetings.detailPage.upgradeToPro" : "meetings.detailPage.addCredits")}
679
681
  </Button>
680
682
  ) : connect ? (
681
683
  <Button type="button" size="sm" onClick={connect}>