@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.
- package/dist/app/app-state.js +8 -8
- package/dist/app/components/Composer.js +18 -18
- package/dist/app/components/agent/agent-capability-picker.js +6 -6
- package/dist/app/components/artifacts/artifact-library.js +6 -6
- package/dist/app/components/artifacts/artifact-viewer.js +18 -18
- package/dist/app/components/artifacts/chat-interactive-block.js +11 -11
- package/dist/app/components/artifacts/file-reach-dialog.js +6 -6
- package/dist/app/components/artifacts/inline-chat-image.js +19 -19
- package/dist/app/components/artifacts/retained-file-preview.js +20 -20
- package/dist/app/components/artifacts/retained-text-preview.js +3 -3
- package/dist/app/components/artifacts/site-audience.js +3 -3
- package/dist/app/components/artifacts/site-conversations.js +9 -9
- package/dist/app/components/artifacts/site-data.js +10 -10
- package/dist/app/components/artifacts/site-publishing-page.js +25 -25
- package/dist/app/components/artifacts/site-publishing.js +22 -22
- package/dist/app/components/artifacts/site-settings.js +24 -24
- package/dist/app/components/artifacts/site-version-menu.js +3 -3
- package/dist/app/components/billing-class-mark.js +3 -3
- package/dist/app/components/bots/bot-launch-strip.js +20 -20
- package/dist/app/components/bots/bot-template-dialog.js +26 -26
- package/dist/app/components/bots/bot-template-shortcuts.js +20 -20
- package/dist/app/components/bots/bot-templates-page.js +30 -30
- package/dist/app/components/capabilities/capability-detail-sheet.js +6 -6
- package/dist/app/components/capabilities/capability-logo-source.js +13 -13
- package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
- package/dist/app/components/capabilities/native-connect-setup.js +13 -13
- package/dist/app/components/capabilities/own-logins-shared-heads-up.js +3 -3
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -15
- package/dist/app/components/capabilities/session-capability-card.js +52 -52
- package/dist/app/components/capabilities/session-chrome-card.js +20 -20
- package/dist/app/components/capabilities/session-custom-mcp-card.js +16 -16
- package/dist/app/components/capabilities/session-github-card.js +16 -16
- package/dist/app/components/capabilities/session-machine-card.js +19 -19
- package/dist/app/components/capabilities/session-personal-github-card.js +14 -14
- package/dist/app/components/capabilities/session-plugin-card.js +8 -8
- package/dist/app/components/command-menu/chat-status.js +15 -15
- package/dist/app/components/command-menu/chat-switcher.js +35 -35
- package/dist/app/components/command-menu/command-menu.js +39 -39
- package/dist/app/components/command-menu/shortcut-sheet.js +8 -8
- package/dist/app/components/composer-capabilities-menu-body.js +4 -4
- package/dist/app/components/composer-mobile-plus-panel.js +8 -8
- package/dist/app/components/composer-mobile-plus.js +1 -1
- package/dist/app/components/desktop/app-shots.js +6 -6
- package/dist/app/components/desktop/computer-use.js +2 -2
- package/dist/app/components/desktop/this-computer.js +5 -5
- package/dist/app/components/feedback.js +3 -3
- package/dist/app/components/github-app-connect-launcher.js +1 -1
- package/dist/app/components/machines/connect-machine-dialog.js +11 -11
- package/dist/app/components/markdown.js +6 -6
- package/dist/app/components/models/models-ui.js +5 -5
- package/dist/app/components/models/subscription-usage.d.ts +34 -0
- package/dist/app/components/models/subscription-usage.js +24 -0
- package/dist/app/components/my-things.js +4 -4
- package/dist/app/components/own-where-it-works.js +3 -3
- package/dist/app/components/personal-resource-attachment-surface.js +4 -4
- package/dist/app/components/pickers.js +5 -5
- package/dist/app/components/rail/channel-create-dialog.js +3 -3
- package/dist/app/components/rail/project-glyph.js +20 -20
- package/dist/app/components/rail/project-profile.js +27 -27
- package/dist/app/components/rail/rail-context.js +1 -1
- package/dist/app/components/rail/rail-sections.js +55 -55
- package/dist/app/components/rail/session-header.js +47 -47
- package/dist/app/components/rail/session-list.js +53 -53
- package/dist/app/components/rail/session-row-content.js +4 -4
- package/dist/app/components/rail/session-row-hover-details.js +14 -14
- package/dist/app/components/rail/session-shell.js +76 -73
- package/dist/app/components/rail/site-session-group-heading.js +8 -8
- package/dist/app/components/session/agent-configuration-panel.js +12 -12
- package/dist/app/components/session/banners.js +8 -8
- package/dist/app/components/session/console-new-conversation.js +39 -39
- package/dist/app/components/session/descendant-requests.js +36 -36
- package/dist/app/components/session/editable-artifacts-workspace.js +16 -16
- package/dist/app/components/session/failed-session-banner.js +6 -6
- package/dist/app/components/session/failure-recovery-boundary.js +3 -3
- package/dist/app/components/session/human-input-delegation-record.js +2 -2
- package/dist/app/components/session/human-input.js +33 -33
- package/dist/app/components/session/inspector.js +43 -43
- package/dist/app/components/session/message-actions.js +3 -3
- package/dist/app/components/session/message-resource-attachments.js +10 -10
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +6 -6
- package/dist/app/components/session/new-session-setup-strip.js +21 -21
- package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
- package/dist/app/components/session/sandbox-switcher.js +7 -7
- package/dist/app/components/session/sandbox-workspace.js +48 -48
- package/dist/app/components/session/search-markdown-highlight.js +7 -7
- package/dist/app/components/session/search-results-view.js +8 -8
- package/dist/app/components/session/session-admin-access.js +4 -4
- package/dist/app/components/session/session-admission-notice.js +4 -4
- package/dist/app/components/session/session-avatar-picker.js +21 -21
- package/dist/app/components/session/session-avatar.js +19 -19
- package/dist/app/components/session/session-machine-access-notice.js +4 -4
- package/dist/app/components/session/session-profile-dialog.js +25 -25
- package/dist/app/components/session/session-profile-editor.js +26 -26
- package/dist/app/components/session/session-retention.js +3 -3
- package/dist/app/components/session/session-search-dialog.js +8 -8
- package/dist/app/components/session/session-tenancy-control.js +2 -2
- package/dist/app/components/session/session-usage-limit-section.js +4 -4
- package/dist/app/components/session/share-chat-dialog.js +5 -5
- package/dist/app/components/session/subagents.js +8 -8
- package/dist/app/components/session/subscription-account-indicator.js +12 -7
- package/dist/app/components/session/subscription-account-menu.d.ts +15 -15
- package/dist/app/components/session/subscription-account-menu.js +6 -1
- package/dist/app/components/session/subscription-account.d.ts +16 -9
- package/dist/app/components/settings/row-select.js +4 -4
- package/dist/app/components/transcription-settings.js +6 -6
- package/dist/app/components/ui/destructive-confirm.js +5 -5
- package/dist/app/components/usage/usage-entry.js +3 -3
- package/dist/app/components/window-bar.js +9 -9
- package/dist/app/components/workspace-composer-plus.js +16 -16
- package/dist/app/components/workspace-reach.js +4 -4
- package/dist/app/embed/session-app.js +160 -157
- package/dist/app/lib/actions/actions-provider.js +8 -8
- package/dist/app/lib/agent-capabilities.d.ts +12 -2
- package/dist/app/lib/agent-capabilities.js +3 -3
- package/dist/app/lib/codex-usage-query.js +2 -2
- package/dist/app/lib/composer-connectors.js +14 -14
- package/dist/app/lib/console-site.js +2 -2
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/events.js +12 -12
- package/dist/app/lib/failed-session-copy.js +3 -3
- package/dist/app/lib/model-access-onboarding.js +3 -3
- package/dist/app/lib/move-chat-to-machine.js +3 -3
- package/dist/app/lib/session-branch-cache.js +8 -8
- package/dist/app/lib/session-create.js +4 -4
- package/dist/app/lib/session-group-pagination.js +8 -8
- package/dist/app/lib/session-hover-facts.js +13 -13
- package/dist/app/lib/session-model.js +2 -2
- package/dist/app/lib/session-pins.js +1 -1
- package/dist/app/lib/session-rail.js +5 -5
- package/dist/app/lib/session-rename.js +3 -3
- package/dist/app/lib/sessions-group.d.ts +5 -3
- package/dist/app/lib/sessions-group.js +7 -7
- package/dist/app/lib/site-tool-consent-dialog.js +7 -7
- package/dist/app/lib/site-tool-consent.js +1 -1
- package/dist/app/lib/subscription-accounts.d.ts +79 -0
- package/dist/app/lib/subscription-accounts.js +18 -0
- package/dist/app/lib/turn-failure-analytics.js +4 -4
- package/dist/app/lib/use-follow-up-repositories.js +3 -3
- package/dist/app/lib/use-workspace-machines.js +4 -4
- package/dist/app/lib/use-workspace-model-catalog.js +3 -3
- package/dist/app/lib/use-workspace-rigs.js +2 -2
- package/dist/app/lib/workspace-navigation-preference.js +4 -4
- package/dist/app/lib/workspace-scope-context.js +3 -3
- package/dist/app/routes/artifacts.js +48 -48
- package/dist/app/routes/retained-artifact.js +32 -32
- package/dist/app/routes/session.js +96 -96
- package/dist/app/routes/sessions-index-hydration.js +5 -5
- package/dist/app/routes/sessions-index.js +76 -76
- package/dist/app/routes/site-view.js +55 -55
- package/dist/artifacts-document.js +4 -4
- package/dist/artifacts-presentation.js +4 -4
- package/dist/artifacts-spreadsheet.js +4 -4
- package/dist/artifacts.js +10 -10
- package/dist/automations.js +10 -10
- package/dist/{browser-viewer-ZHQDVHZ2.js → browser-viewer-F4FL7JKB.js} +4 -4
- package/dist/{chat-interactive-block-VSDD6X3M.js → chat-interactive-block-4U5JWRSY.js} +5 -5
- package/dist/{chunk-4K64EKM7.js → chunk-22YIIM3X.js} +4 -4
- package/dist/{chunk-3NNAC43A.js → chunk-2N7ACQ7M.js} +2 -2
- package/dist/{chunk-7Z76QP64.js → chunk-2PY5XD3F.js} +35 -5
- package/dist/chunk-2PY5XD3F.js.map +1 -0
- package/dist/{chunk-WDASYY4S.js → chunk-2TEYUDJD.js} +8 -8
- package/dist/{chunk-OTW25A6I.js → chunk-37JJQNZB.js} +3 -3
- package/dist/{chunk-VCJQQYRE.js → chunk-3DWQPURZ.js} +4 -4
- package/dist/{chunk-GTRAH4FG.js → chunk-3GWC3FU3.js} +2 -2
- package/dist/{chunk-AB5IW227.js → chunk-3ICY6LP3.js} +3 -3
- package/dist/{chunk-WIFDNUKD.js → chunk-3OCU5RX5.js} +3 -3
- package/dist/{chunk-UBRQ3PQD.js → chunk-3SPDJLOR.js} +2 -2
- package/dist/{chunk-IZXYFWA4.js → chunk-3WVLR7UA.js} +12 -12
- package/dist/{chunk-DEHLWZSI.js → chunk-3XMB3L57.js} +4 -4
- package/dist/{chunk-AJBDAVX3.js → chunk-4IUOBO2H.js} +7 -7
- package/dist/{chunk-NFCS5WYC.js → chunk-4KQ3A3EO.js} +3 -3
- package/dist/{chunk-LIJNVIT3.js → chunk-4L5B5AZT.js} +3 -3
- package/dist/{chunk-EDDKPIIV.js → chunk-4NB3TPNE.js} +2 -2
- package/dist/{chunk-PSM3CU7N.js → chunk-4TDKXHCD.js} +46 -39
- package/dist/chunk-4TDKXHCD.js.map +1 -0
- package/dist/{chunk-OJWDNNW3.js → chunk-4TPTGBIO.js} +5 -5
- package/dist/{chunk-J2WY42FA.js → chunk-4UHGW6WF.js} +2 -2
- package/dist/{chunk-7NLF35YL.js → chunk-4YN2JLYK.js} +4 -4
- package/dist/{chunk-OOOSGPJL.js → chunk-53MYEEMA.js} +1 -1
- package/dist/{chunk-467WDSOK.js → chunk-5HYWXPMA.js} +2 -2
- package/dist/{chunk-XMBOLFFS.js → chunk-5IMNL6IV.js} +2 -2
- package/dist/{chunk-4Z5X7PLC.js → chunk-5MLM5T5C.js} +3 -3
- package/dist/{chunk-YMI27QPF.js → chunk-5NKQZVXP.js} +2 -2
- package/dist/{chunk-ZW5YTIH3.js → chunk-5PB46DAA.js} +1 -1
- package/dist/{chunk-ZW5YTIH3.js.map → chunk-5PB46DAA.js.map} +1 -1
- package/dist/{chunk-CYDXCILL.js → chunk-5SODSGW7.js} +7 -7
- package/dist/{chunk-Q5EZNBPI.js → chunk-5YAJASCO.js} +3 -3
- package/dist/{chunk-M3FDGRB4.js → chunk-62XAL5BA.js} +3 -3
- package/dist/{chunk-SGH7I7OY.js → chunk-67R6NAFI.js} +2 -2
- package/dist/{chunk-Q5K2J5GG.js → chunk-6BN3RU7T.js} +13 -3
- package/dist/chunk-6BN3RU7T.js.map +1 -0
- package/dist/{chunk-PYB4BFEC.js → chunk-6BQLDL6R.js} +3 -3
- package/dist/{chunk-YJSCLGAW.js → chunk-6EZYHJTL.js} +3 -3
- package/dist/{chunk-OWET7EY2.js → chunk-6GW7NJMK.js} +19 -13
- package/dist/{chunk-OWET7EY2.js.map → chunk-6GW7NJMK.js.map} +1 -1
- package/dist/{chunk-G5UQBTXY.js → chunk-6LXIL3Q3.js} +2 -2
- package/dist/{chunk-T67LTMSW.js → chunk-6LYVAJFZ.js} +10 -10
- package/dist/{chunk-3L465FBR.js → chunk-6WB5UXMZ.js} +6 -6
- package/dist/{chunk-EKJHOWTZ.js → chunk-74UGYVCA.js} +4 -4
- package/dist/{chunk-PWUSSSSL.js → chunk-7BTNYZC7.js} +2 -2
- package/dist/{chunk-NQ2CPQJF.js → chunk-7D3WIDKK.js} +26 -3
- package/dist/chunk-7D3WIDKK.js.map +1 -0
- package/dist/{chunk-ESXAECZ3.js → chunk-7KZFGA25.js} +2 -2
- package/dist/{chunk-EGKARC53.js → chunk-7MGDX2TD.js} +2 -2
- package/dist/{chunk-Y3XZEKDQ.js → chunk-7N3GFGB6.js} +2 -2
- package/dist/{chunk-AH3DGOTK.js → chunk-7SFSN6AX.js} +2 -2
- package/dist/{chunk-QPQ7R77C.js → chunk-7SU4YVZ5.js} +5 -1
- package/dist/chunk-7SU4YVZ5.js.map +1 -0
- package/dist/{chunk-6QK65ZWM.js → chunk-7TGUHFGO.js} +3 -3
- package/dist/{chunk-QURYQFDN.js → chunk-7ZIWO65F.js} +2 -2
- package/dist/{chunk-OYCK4JRS.js → chunk-AJHLEJTK.js} +2 -2
- package/dist/{chunk-3PZ3LRPV.js → chunk-AN4U7EPH.js} +3 -3
- package/dist/{chunk-77BHKC43.js → chunk-APG6CEG7.js} +1 -1
- package/dist/{chunk-FSDQQQIA.js → chunk-APHLXQNP.js} +3 -3
- package/dist/{chunk-SN2WENRP.js → chunk-AXHQ7QXV.js} +3 -3
- package/dist/{chunk-54U6ZBEX.js → chunk-AYTLSPF6.js} +3 -3
- package/dist/{chunk-WYGTAQMX.js → chunk-AZFVRPQM.js} +76 -22
- package/dist/chunk-AZFVRPQM.js.map +1 -0
- package/dist/{chunk-R33SBMB7.js → chunk-BBSKKBMV.js} +3 -3
- package/dist/{chunk-2GCHGWNE.js → chunk-BGH6TU2P.js} +3 -3
- package/dist/{chunk-D3PTVN2I.js → chunk-BGIYL26H.js} +2 -2
- package/dist/{chunk-BQYRZIZ7.js → chunk-BL7UQUC3.js} +2 -2
- package/dist/{chunk-EBTUPRRQ.js → chunk-BOUHCYL6.js} +4 -4
- package/dist/{chunk-MKDFYE2E.js → chunk-BVNGDFBC.js} +2 -2
- package/dist/{chunk-ICAMYP5M.js → chunk-BWJK64CP.js} +2 -2
- package/dist/{chunk-RHXYO4H2.js → chunk-BZ2GTCQV.js} +2 -2
- package/dist/{chunk-GIWFLWXG.js → chunk-C2KASMJK.js} +4 -4
- package/dist/{chunk-KO3OHHY2.js → chunk-CAZDRDQT.js} +2 -2
- package/dist/{chunk-OK7BQMCI.js → chunk-CBJRZKZB.js} +9 -9
- package/dist/{chunk-OYOFPNLC.js → chunk-CF6NYG7J.js} +4 -4
- package/dist/{chunk-MT2R57SF.js → chunk-COITN7WN.js} +2 -2
- package/dist/{chunk-OCXTTKVA.js → chunk-CPVOXM2Q.js} +2 -2
- package/dist/{chunk-HYEIA25Y.js → chunk-CTZRCBKH.js} +2 -2
- package/dist/{chunk-OCXEY7HE.js → chunk-CWL27YTB.js} +2 -2
- package/dist/{chunk-K4DQS2ML.js → chunk-D2I33V5P.js} +4 -4
- package/dist/{chunk-736RUNIA.js → chunk-DF7WI4JH.js} +4 -4
- package/dist/{chunk-KUE5BOQE.js → chunk-DKZYCJCO.js} +4 -4
- package/dist/{chunk-74CBR5YE.js → chunk-DQ32FKFQ.js} +2 -2
- package/dist/{chunk-4O2XWOLZ.js → chunk-DTKG2YUF.js} +3 -3
- package/dist/{chunk-GMHIOYB7.js → chunk-DUDA4V5R.js} +4 -4
- package/dist/{chunk-XUOYNJPB.js → chunk-ECROT4M5.js} +24 -24
- package/dist/{chunk-PVB4YVDP.js → chunk-EOXV5XGY.js} +2 -2
- package/dist/{chunk-U6552Q3T.js → chunk-EQQOZ6DD.js} +2 -2
- package/dist/{chunk-G6ICCGJ3.js → chunk-EY6W5H4B.js} +2 -2
- package/dist/{chunk-HWVPLFIW.js → chunk-EYRFEWXJ.js} +2 -2
- package/dist/{chunk-7YTR3UFO.js → chunk-FB4JWUVJ.js} +8 -5
- package/dist/chunk-FB4JWUVJ.js.map +1 -0
- package/dist/{chunk-U4LTPFD2.js → chunk-FKK2PD7K.js} +2 -2
- package/dist/{chunk-PUUEI4W3.js → chunk-FPHHIC5K.js} +5 -5
- package/dist/{chunk-SP44O3OU.js → chunk-FQM6L22H.js} +2 -2
- package/dist/{chunk-2J77TWGH.js → chunk-FW22IREV.js} +3 -3
- package/dist/{chunk-EBIVTDEG.js → chunk-G4M6AYDB.js} +2 -2
- package/dist/{chunk-O4JOE3R7.js → chunk-G55NAU5M.js} +60 -74
- package/dist/chunk-G55NAU5M.js.map +1 -0
- package/dist/{chunk-BASI553K.js → chunk-G6AZ2WIU.js} +4 -4
- package/dist/{chunk-SJYTQLN3.js → chunk-GJ5IDSAX.js} +3 -3
- package/dist/{chunk-TDTD66BK.js → chunk-GRDSEZWZ.js} +2 -2
- package/dist/{chunk-MV2CLIO6.js → chunk-HBVJIGY2.js} +6 -6
- package/dist/{chunk-R4JA5JFI.js → chunk-HCWQLIOE.js} +3 -3
- package/dist/{chunk-MZY3VKKM.js → chunk-HEVD4A5G.js} +2 -2
- package/dist/{chunk-DLVIRJGK.js → chunk-HNDHSEVJ.js} +2 -2
- package/dist/{chunk-LPKJ77EK.js → chunk-HNTZ7B7M.js} +2 -2
- package/dist/{chunk-QQIZMVAJ.js → chunk-HQ7GTMII.js} +59 -57
- package/dist/chunk-HQ7GTMII.js.map +1 -0
- package/dist/{chunk-IN3VQFKS.js → chunk-I2FC7CAI.js} +2 -2
- package/dist/{chunk-SK5S2PCK.js → chunk-I7BGHBOM.js} +14 -14
- package/dist/chunk-I7BGHBOM.js.map +1 -0
- package/dist/{chunk-ZBHGNE2J.js → chunk-IEHZFYMH.js} +3 -3
- package/dist/{chunk-DWJ6J3YW.js → chunk-IXISEVD7.js} +4 -4
- package/dist/{chunk-TK5FWVZR.js → chunk-IZEDVQUD.js} +3 -3
- package/dist/{chunk-HEGV4QMS.js → chunk-J42QE4VO.js} +2 -2
- package/dist/{chunk-PRT4J2DL.js → chunk-J555XSUM.js} +2 -2
- package/dist/{chunk-SBXSKRFA.js → chunk-JNMHFSDF.js} +3 -3
- package/dist/{chunk-KI46GKMD.js → chunk-JTBAOPYO.js} +7 -7
- package/dist/{chunk-JHZRAYI4.js → chunk-JWSRFXRN.js} +2 -2
- package/dist/chunk-JWSRFXRN.js.map +1 -0
- package/dist/{chunk-SXGJL7UT.js → chunk-K376MPJH.js} +14 -14
- package/dist/{chunk-OSJ366KR.js → chunk-KEBVT55V.js} +30 -30
- package/dist/{chunk-U5UGM5XD.js → chunk-KFIZAXHI.js} +5 -5
- package/dist/{chunk-KFNZZ2N6.js → chunk-KKGRDBMK.js} +2 -2
- package/dist/{chunk-PLYVGZIN.js → chunk-KKIG6DN5.js} +1 -1
- package/dist/{chunk-3OK7Y6ES.js → chunk-KKQO2GAA.js} +2 -2
- package/dist/{chunk-DQPIEQGP.js → chunk-KO753ZCZ.js} +2 -2
- package/dist/{chunk-YNTLWCF4.js → chunk-KYIRWU65.js} +3 -3
- package/dist/{chunk-JKL5S7UQ.js → chunk-L6V63DVI.js} +6 -6
- package/dist/{chunk-M5IQVMLR.js → chunk-LAZ2QZTJ.js} +11 -4
- package/dist/chunk-LAZ2QZTJ.js.map +1 -0
- package/dist/{chunk-CV4VVLPZ.js → chunk-LCNJ2KNS.js} +2 -2
- package/dist/{chunk-D74Z2N4K.js → chunk-LE7YKMTU.js} +2 -2
- package/dist/{chunk-D5TIVCXG.js → chunk-LEBEOMVT.js} +2 -2
- package/dist/chunk-LKLQVANM.js +2 -0
- package/dist/{chunk-2OXSB2OL.js → chunk-LKWVBUH6.js} +3 -2
- package/dist/chunk-LKWVBUH6.js.map +1 -0
- package/dist/{chunk-WXF2RTS4.js → chunk-M6URPYUB.js} +2 -2
- package/dist/{chunk-H6BX6WOW.js → chunk-MDHFMRBC.js} +3 -3
- package/dist/{chunk-3CDJSKDW.js → chunk-MGZO7CHI.js} +3 -3
- package/dist/{chunk-DCEQCGVN.js → chunk-MIWU52TW.js} +2 -2
- package/dist/{chunk-PF2WU2IL.js → chunk-ND4IQJUM.js} +120 -17
- package/dist/chunk-ND4IQJUM.js.map +1 -0
- package/dist/{chunk-3PM3M2Q6.js → chunk-NDXBF3RW.js} +27 -11
- package/dist/chunk-NDXBF3RW.js.map +1 -0
- package/dist/{chunk-LVELUUK6.js → chunk-NF6QVVMP.js} +2 -2
- package/dist/{chunk-UMX6DZME.js → chunk-NTZ5ZNVK.js} +2 -2
- package/dist/{chunk-FBA2NXYH.js → chunk-NWLRABUR.js} +3 -3
- package/dist/{chunk-TNSJFZ6Q.js → chunk-O2H2U7YS.js} +4 -4
- package/dist/{chunk-BFFNINCC.js → chunk-OAL2PPX4.js} +3 -3
- package/dist/{chunk-WTSQUCHB.js → chunk-OCYTHZ4A.js} +3 -3
- package/dist/{chunk-ZAX4XQLN.js → chunk-OEDTCIXF.js} +2 -2
- package/dist/{chunk-CHU3RDV4.js → chunk-OLVSYB3P.js} +3 -3
- package/dist/{chunk-PZKHST7A.js → chunk-OQ6QOPK6.js} +10 -3
- package/dist/chunk-OQ6QOPK6.js.map +1 -0
- package/dist/{chunk-IFSXVU2S.js → chunk-OQHTFOCA.js} +2 -2
- package/dist/{chunk-OXQ2SXVC.js → chunk-P56AVROH.js} +2 -2
- package/dist/{chunk-CXAN2FHF.js → chunk-PCEJHHGP.js} +6 -6
- package/dist/{chunk-5MIBQ4P5.js → chunk-PHGQGVVL.js} +2 -2
- package/dist/{chunk-FLWQJDJ5.js → chunk-PUZRHEQI.js} +6 -6
- package/dist/{chunk-OP2GD6QW.js → chunk-PV7U6OOJ.js} +2 -2
- package/dist/{chunk-SPD4ULVB.js → chunk-PYMROAWS.js} +2 -1
- package/dist/chunk-PYMROAWS.js.map +1 -0
- package/dist/{chunk-X2QJXDE4.js → chunk-PZQACDH5.js} +8 -8
- package/dist/{chunk-CH4UQ4NO.js → chunk-PZTS4O6E.js} +5 -5
- package/dist/{chunk-TKQL7EDB.js → chunk-Q42QHUAQ.js} +2 -2
- package/dist/{chunk-MRECRNVU.js → chunk-QCYGB6TZ.js} +5 -5
- package/dist/{chunk-GSCGKJNK.js → chunk-QECMETOF.js} +2 -2
- package/dist/{chunk-RMCLFSMX.js → chunk-QGX3LE6H.js} +2 -2
- package/dist/{chunk-HTMQGS63.js → chunk-QI3NDQFP.js} +8 -8
- package/dist/{chunk-UU5FBVRX.js → chunk-QZE4BTLA.js} +6 -5
- package/dist/chunk-QZE4BTLA.js.map +1 -0
- package/dist/{chunk-R5QAL43H.js → chunk-RA3Q52O2.js} +2 -2
- package/dist/chunk-RBOHWUSN.js +151 -0
- package/dist/chunk-RBOHWUSN.js.map +1 -0
- package/dist/{chunk-AJDGP2N4.js → chunk-RJNOQEJJ.js} +20 -20
- package/dist/{chunk-477DTTMH.js → chunk-RSFOFUR7.js} +3 -3
- package/dist/{chunk-JV5ULONH.js → chunk-RXR6PMSH.js} +39 -39
- package/dist/{chunk-J2BTILRR.js → chunk-SM7HFCGC.js} +2 -2
- package/dist/{chunk-UTRNLNCW.js → chunk-SN6ZWYOP.js} +69 -97
- package/dist/chunk-SN6ZWYOP.js.map +1 -0
- package/dist/{chunk-OBGOLHCP.js → chunk-T4HK4XCI.js} +3 -3
- package/dist/{chunk-XVLEBB4Y.js → chunk-TBWL6YWL.js} +2 -2
- package/dist/{chunk-AAS7OWV6.js → chunk-TIDXYWFX.js} +3 -3
- package/dist/{chunk-N3FM4BNA.js → chunk-TKHRGY2P.js} +2 -2
- package/dist/{chunk-GU7T2S5N.js → chunk-TU2GSZL7.js} +2 -2
- package/dist/{chunk-OI6VI6SU.js → chunk-U6HGJXXQ.js} +8 -8
- package/dist/{chunk-4BWMAGJJ.js → chunk-UGRW6RTR.js} +3 -3
- package/dist/{chunk-AVXDIRRW.js → chunk-UMRUDYUK.js} +2 -2
- package/dist/{chunk-FNXCFIPW.js → chunk-UOT2R5ZD.js} +2 -2
- package/dist/{chunk-DIP7YALH.js → chunk-USURKJVT.js} +2 -2
- package/dist/{chunk-S27VZ5DO.js → chunk-UU6Q67XM.js} +6 -6
- package/dist/{chunk-LTJFV2JI.js → chunk-UZ7NP5CW.js} +2 -2
- package/dist/{chunk-H6MJFMHZ.js → chunk-V4FO7UOE.js} +3 -3
- package/dist/{chunk-RGR57NYY.js → chunk-V4ZOZRCW.js} +2 -2
- package/dist/{chunk-LQKVNREV.js → chunk-V57YMKQZ.js} +3 -3
- package/dist/{chunk-XZCCEKPW.js → chunk-VOIWZBY6.js} +6 -6
- package/dist/{chunk-E5KOWRDU.js → chunk-VPHPLPDA.js} +2 -2
- package/dist/{chunk-OGU73VUN.js → chunk-VUL4KPUU.js} +2 -2
- package/dist/{chunk-SFIXTOOJ.js → chunk-VWF6ILAR.js} +3 -3
- package/dist/{chunk-FER6EVIY.js → chunk-W54BHJO7.js} +2 -2
- package/dist/{chunk-34NV52R3.js → chunk-WCYE4BLC.js} +4 -4
- package/dist/{chunk-RISUROBM.js → chunk-WTV25ELY.js} +4 -4
- package/dist/{chunk-UO35OEOX.js → chunk-WZYGH7CN.js} +3 -3
- package/dist/{chunk-CEMSIU4Z.js → chunk-XG2RWUF7.js} +5 -5
- package/dist/chunk-XK72HZ4C.js +147 -0
- package/dist/chunk-XK72HZ4C.js.map +1 -0
- package/dist/{chunk-K3D7IQQP.js → chunk-XV7QOT7W.js} +6 -6
- package/dist/{chunk-GOCODNQS.js → chunk-XWECT3GX.js} +2 -2
- package/dist/{chunk-5MHMCE2G.js → chunk-XZQK2ZLW.js} +3 -3
- package/dist/{chunk-JV3UI7BH.js → chunk-Y5BR66OH.js} +3 -3
- package/dist/{chunk-VXORMNU4.js → chunk-YBHAAULA.js} +67 -2
- package/dist/chunk-YBHAAULA.js.map +1 -0
- package/dist/{chunk-4F3AEJI6.js → chunk-YD6XU6FY.js} +4 -4
- package/dist/{chunk-VATYK3JQ.js → chunk-YFE47G3C.js} +3 -3
- package/dist/{chunk-ZR5EKJT6.js → chunk-YG6TWPP7.js} +2 -2
- package/dist/{chunk-44JWVYJB.js → chunk-YH3ARKBB.js} +2 -2
- package/dist/{chunk-752WXSDN.js → chunk-YI66STKJ.js} +2 -2
- package/dist/{chunk-QRECBCJM.js → chunk-YMVPYMKB.js} +2 -2
- package/dist/{chunk-77SYIH6O.js → chunk-YPIXBAF6.js} +2 -2
- package/dist/{chunk-WRMUXZ7C.js → chunk-YSWPNY6G.js} +3 -3
- package/dist/{chunk-GTHCHCWW.js → chunk-YWNNMBZG.js} +3 -3
- package/dist/{chunk-3DRLCX5V.js → chunk-Z3HYM2JT.js} +2 -2
- package/dist/{chunk-M3HGBO2Y.js → chunk-ZAC7YPRA.js} +1 -1
- package/dist/{chunk-2VJOSU4H.js → chunk-ZENESDAF.js} +2 -2
- package/dist/{chunk-4JXPLTWV.js → chunk-ZHAPMETO.js} +2 -2
- package/dist/{chunk-IJR6VOLU.js → chunk-ZVR6DUZH.js} +2 -2
- package/dist/components/message-timeline.d.ts +10 -2
- package/dist/composer.js +8 -8
- package/dist/{computer-viewer-5LKRCEVQ.js → computer-viewer-FOIOZUF5.js} +5 -5
- package/dist/connect.js +12 -12
- package/dist/desktop-dictation.js +8 -8
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/{embedded-new-voice-GHJRY3YL.js → embedded-new-voice-WTXAJNGO.js} +5 -5
- package/dist/{embedded-voice-ASQXBSTX.js → embedded-voice-SIJOPN2G.js} +5 -5
- package/dist/{fleet-decision-row-U7LDVBEM.js → fleet-decision-row-XKQ3GMYT.js} +2 -2
- package/dist/hooks/use-recordings.d.ts +4 -2
- package/dist/in-chat-connect-model.js +5 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +66 -60
- package/dist/interaction.js +5 -5
- package/dist/{latest-question-RNVF262Q.js → latest-question-KA7AQYVI.js} +2 -2
- package/dist/machines.js +3 -3
- package/dist/meetings/recorder-context.d.ts +6 -1
- package/dist/meetings/recorder-panel.d.ts +2 -5
- package/dist/meetings-recorder.js +1 -1
- package/dist/meetings.js +25 -23
- package/dist/meetings.js.map +1 -1
- package/dist/messages/en.d.ts +4 -0
- package/dist/messages.js +1 -1
- package/dist/{model-policy-picker-menu-E6XKMFTA.js → model-policy-picker-menu-6N2G7VGX.js} +4 -4
- package/dist/{payment-page-card-DJDKV2LW.js → payment-page-card-IJFZHQ52.js} +4 -4
- package/dist/{platform-activity-row-MSDCSMET.js → platform-activity-row-MFCMGI43.js} +2 -2
- package/dist/{queue-surface-implementation-GUAIG6TK.js → queue-surface-implementation-BBCDWWOP.js} +5 -5
- package/dist/realtime.js +4 -4
- package/dist/{recorder-host-2MYDJPQW.js → recorder-host-LDYYOKG7.js} +5 -5
- package/dist/recordings.js +4 -4
- package/dist/{sandbox-files-W5W2LW4K.js → sandbox-files-VYRBIXJY.js} +6 -6
- package/dist/session-app.js +160 -157
- package/dist/{session-connect-cards-HPH7JOZP.js → session-connect-cards-GBPSL6OT.js} +9 -9
- package/dist/session-connect-cards-GBPSL6OT.js.map +1 -0
- package/dist/session-list-model.js +2 -2
- package/dist/{session-realtime-SDTKFFIR.js → session-realtime-QGU57TND.js} +3 -3
- package/dist/session-realtime-QGU57TND.js.map +1 -0
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +33 -33
- package/dist/session.d.ts +3 -2
- package/dist/session.js +16 -10
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline/index.d.ts +3 -2
- package/dist/timeline/projection.d.ts +52 -0
- package/dist/timeline/turn-summary-model.d.ts +4 -3
- package/dist/timeline/types.d.ts +8 -2
- package/dist/timeline/use-timeline-pauses.d.ts +12 -0
- package/dist/timeline/work-presentation.d.ts +4 -3
- package/dist/{timeline-annotation-markers-FNILLWNU.js → timeline-annotation-markers-LL6ZVBZH.js} +2 -2
- package/dist/{timeline-annotation-selection-MBCIDO2Q.js → timeline-annotation-selection-WQA76WYC.js} +2 -2
- package/dist/{timeline-annotations-dialog-JPNKLOTE.js → timeline-annotations-dialog-HHETAEZA.js} +3 -3
- package/dist/timeline-model.js +2 -2
- package/dist/ui/access-list.js +5 -5
- package/dist/ui/cadence-picker.js +4 -4
- package/dist/ui/choice-cards.js +3 -3
- package/dist/ui/confirm-dialog.js +2 -2
- package/dist/ui/copy-field.js +3 -3
- package/dist/ui/detail-page.js +2 -2
- package/dist/ui/detail-sheet.js +2 -2
- package/dist/ui/disclosure.js +3 -3
- package/dist/ui/email-chips-input.js +3 -3
- package/dist/ui/field.js +2 -2
- package/dist/ui/flush-form-page.js +3 -3
- package/dist/ui/form-dialog.js +2 -2
- package/dist/ui/list-row.js +3 -3
- package/dist/ui/relative-time.js +2 -2
- package/dist/ui/revision-history.js +4 -4
- package/dist/ui/role-select.js +5 -5
- package/dist/ui/select-menu.js +3 -3
- package/dist/ui/usage-meter.d.ts +8 -2
- package/dist/ui/usage-meter.js +5 -3
- package/dist/usage.js +2 -2
- package/dist/workbench.js +4 -4
- package/package.json +6 -5
- package/src/app/components/agent/agent-capability-picker.test.tsx +1 -1
- package/src/app/components/models/subscription-usage.tsx +178 -0
- package/src/app/components/rail/session-row-content.tsx +27 -0
- package/src/app/components/session/subscription-account-indicator.test.ts +78 -18
- package/src/app/components/session/subscription-account-indicator.tsx +16 -31
- package/src/app/components/session/subscription-account-menu.tsx +79 -101
- package/src/app/components/session/subscription-account.test.ts +161 -54
- package/src/app/components/session/subscription-account.ts +106 -117
- package/src/app/lib/agent-capabilities.tsx +34 -7
- package/src/app/lib/session-branch-cache.tsx +1 -0
- package/src/app/lib/session-pins.tsx +1 -0
- package/src/app/lib/session-row-paused.test.tsx +183 -0
- package/src/app/lib/sessions-group-channels.test.ts +4 -4
- package/src/app/lib/sessions-group.tsx +62 -4
- package/src/app/lib/subscription-accounts.tsx +283 -0
- package/src/app/routes/session.tsx +2 -0
- package/src/components/message-timeline.tsx +14 -2
- package/src/components/session-conversation.tsx +2 -1
- package/src/components/timeline-annotations.tsx +4 -1
- package/src/components/timeline-settlement.ts +1 -1
- package/src/hooks/use-composer.ts +104 -25
- package/src/hooks/use-recordings.ts +5 -0
- package/src/index.ts +5 -0
- package/src/meetings/meeting-detail-page.tsx +4 -2
- package/src/meetings/meetings-pages.test.tsx +38 -0
- package/src/meetings/recorder-context.tsx +28 -5
- package/src/meetings/recorder-panel.tsx +13 -5
- package/src/meetings/recorder-workspace.test.tsx +57 -8
- package/src/messages/en.ts +5 -0
- package/src/recordings-model.ts +7 -0
- package/src/session.ts +8 -1
- package/src/timeline/index.ts +4 -1
- package/src/timeline/projection.ts +228 -16
- package/src/timeline/turn-summary-model.ts +4 -3
- package/src/timeline/turn-summary.tsx +15 -2
- package/src/timeline/types.ts +8 -2
- package/src/timeline/use-timeline-pauses.ts +105 -0
- package/src/timeline/work-presentation.ts +13 -4
- package/src/ui/usage-meter.tsx +10 -7
- package/styles/compiled.css +3 -0
- package/dist/chunk-2OXSB2OL.js.map +0 -1
- package/dist/chunk-3PM3M2Q6.js.map +0 -1
- package/dist/chunk-7YTR3UFO.js.map +0 -1
- package/dist/chunk-7Z76QP64.js.map +0 -1
- package/dist/chunk-JHZRAYI4.js.map +0 -1
- package/dist/chunk-M5IQVMLR.js.map +0 -1
- package/dist/chunk-NQ2CPQJF.js.map +0 -1
- package/dist/chunk-O2UPPN5M.js +0 -2
- package/dist/chunk-O4JOE3R7.js.map +0 -1
- package/dist/chunk-PF2WU2IL.js.map +0 -1
- package/dist/chunk-PSM3CU7N.js.map +0 -1
- package/dist/chunk-PZKHST7A.js.map +0 -1
- package/dist/chunk-Q5K2J5GG.js.map +0 -1
- package/dist/chunk-QPQ7R77C.js.map +0 -1
- package/dist/chunk-QQIZMVAJ.js.map +0 -1
- package/dist/chunk-SK5S2PCK.js.map +0 -1
- package/dist/chunk-SPD4ULVB.js.map +0 -1
- package/dist/chunk-UTRNLNCW.js.map +0 -1
- package/dist/chunk-UU5FBVRX.js.map +0 -1
- package/dist/chunk-VXORMNU4.js.map +0 -1
- package/dist/chunk-WYGTAQMX.js.map +0 -1
- /package/dist/{browser-viewer-ZHQDVHZ2.js.map → app/components/models/subscription-usage.js.map} +0 -0
- /package/dist/{chat-interactive-block-VSDD6X3M.js.map → app/lib/subscription-accounts.js.map} +0 -0
- /package/dist/{chunk-O2UPPN5M.js.map → browser-viewer-F4FL7JKB.js.map} +0 -0
- /package/dist/{computer-viewer-5LKRCEVQ.js.map → chat-interactive-block-4U5JWRSY.js.map} +0 -0
- /package/dist/{chunk-4K64EKM7.js.map → chunk-22YIIM3X.js.map} +0 -0
- /package/dist/{chunk-3NNAC43A.js.map → chunk-2N7ACQ7M.js.map} +0 -0
- /package/dist/{chunk-WDASYY4S.js.map → chunk-2TEYUDJD.js.map} +0 -0
- /package/dist/{chunk-OTW25A6I.js.map → chunk-37JJQNZB.js.map} +0 -0
- /package/dist/{chunk-VCJQQYRE.js.map → chunk-3DWQPURZ.js.map} +0 -0
- /package/dist/{chunk-GTRAH4FG.js.map → chunk-3GWC3FU3.js.map} +0 -0
- /package/dist/{chunk-AB5IW227.js.map → chunk-3ICY6LP3.js.map} +0 -0
- /package/dist/{chunk-WIFDNUKD.js.map → chunk-3OCU5RX5.js.map} +0 -0
- /package/dist/{chunk-UBRQ3PQD.js.map → chunk-3SPDJLOR.js.map} +0 -0
- /package/dist/{chunk-IZXYFWA4.js.map → chunk-3WVLR7UA.js.map} +0 -0
- /package/dist/{chunk-DEHLWZSI.js.map → chunk-3XMB3L57.js.map} +0 -0
- /package/dist/{chunk-AJBDAVX3.js.map → chunk-4IUOBO2H.js.map} +0 -0
- /package/dist/{chunk-NFCS5WYC.js.map → chunk-4KQ3A3EO.js.map} +0 -0
- /package/dist/{chunk-LIJNVIT3.js.map → chunk-4L5B5AZT.js.map} +0 -0
- /package/dist/{chunk-EDDKPIIV.js.map → chunk-4NB3TPNE.js.map} +0 -0
- /package/dist/{chunk-OJWDNNW3.js.map → chunk-4TPTGBIO.js.map} +0 -0
- /package/dist/{chunk-J2WY42FA.js.map → chunk-4UHGW6WF.js.map} +0 -0
- /package/dist/{chunk-7NLF35YL.js.map → chunk-4YN2JLYK.js.map} +0 -0
- /package/dist/{chunk-OOOSGPJL.js.map → chunk-53MYEEMA.js.map} +0 -0
- /package/dist/{chunk-467WDSOK.js.map → chunk-5HYWXPMA.js.map} +0 -0
- /package/dist/{chunk-XMBOLFFS.js.map → chunk-5IMNL6IV.js.map} +0 -0
- /package/dist/{chunk-4Z5X7PLC.js.map → chunk-5MLM5T5C.js.map} +0 -0
- /package/dist/{chunk-YMI27QPF.js.map → chunk-5NKQZVXP.js.map} +0 -0
- /package/dist/{chunk-CYDXCILL.js.map → chunk-5SODSGW7.js.map} +0 -0
- /package/dist/{chunk-Q5EZNBPI.js.map → chunk-5YAJASCO.js.map} +0 -0
- /package/dist/{chunk-M3FDGRB4.js.map → chunk-62XAL5BA.js.map} +0 -0
- /package/dist/{chunk-SGH7I7OY.js.map → chunk-67R6NAFI.js.map} +0 -0
- /package/dist/{chunk-PYB4BFEC.js.map → chunk-6BQLDL6R.js.map} +0 -0
- /package/dist/{chunk-YJSCLGAW.js.map → chunk-6EZYHJTL.js.map} +0 -0
- /package/dist/{chunk-G5UQBTXY.js.map → chunk-6LXIL3Q3.js.map} +0 -0
- /package/dist/{chunk-T67LTMSW.js.map → chunk-6LYVAJFZ.js.map} +0 -0
- /package/dist/{chunk-3L465FBR.js.map → chunk-6WB5UXMZ.js.map} +0 -0
- /package/dist/{chunk-EKJHOWTZ.js.map → chunk-74UGYVCA.js.map} +0 -0
- /package/dist/{chunk-PWUSSSSL.js.map → chunk-7BTNYZC7.js.map} +0 -0
- /package/dist/{chunk-ESXAECZ3.js.map → chunk-7KZFGA25.js.map} +0 -0
- /package/dist/{chunk-EGKARC53.js.map → chunk-7MGDX2TD.js.map} +0 -0
- /package/dist/{chunk-Y3XZEKDQ.js.map → chunk-7N3GFGB6.js.map} +0 -0
- /package/dist/{chunk-AH3DGOTK.js.map → chunk-7SFSN6AX.js.map} +0 -0
- /package/dist/{chunk-6QK65ZWM.js.map → chunk-7TGUHFGO.js.map} +0 -0
- /package/dist/{chunk-QURYQFDN.js.map → chunk-7ZIWO65F.js.map} +0 -0
- /package/dist/{chunk-OYCK4JRS.js.map → chunk-AJHLEJTK.js.map} +0 -0
- /package/dist/{chunk-3PZ3LRPV.js.map → chunk-AN4U7EPH.js.map} +0 -0
- /package/dist/{chunk-77BHKC43.js.map → chunk-APG6CEG7.js.map} +0 -0
- /package/dist/{chunk-FSDQQQIA.js.map → chunk-APHLXQNP.js.map} +0 -0
- /package/dist/{chunk-SN2WENRP.js.map → chunk-AXHQ7QXV.js.map} +0 -0
- /package/dist/{chunk-54U6ZBEX.js.map → chunk-AYTLSPF6.js.map} +0 -0
- /package/dist/{chunk-R33SBMB7.js.map → chunk-BBSKKBMV.js.map} +0 -0
- /package/dist/{chunk-2GCHGWNE.js.map → chunk-BGH6TU2P.js.map} +0 -0
- /package/dist/{chunk-D3PTVN2I.js.map → chunk-BGIYL26H.js.map} +0 -0
- /package/dist/{chunk-BQYRZIZ7.js.map → chunk-BL7UQUC3.js.map} +0 -0
- /package/dist/{chunk-EBTUPRRQ.js.map → chunk-BOUHCYL6.js.map} +0 -0
- /package/dist/{chunk-MKDFYE2E.js.map → chunk-BVNGDFBC.js.map} +0 -0
- /package/dist/{chunk-ICAMYP5M.js.map → chunk-BWJK64CP.js.map} +0 -0
- /package/dist/{chunk-RHXYO4H2.js.map → chunk-BZ2GTCQV.js.map} +0 -0
- /package/dist/{chunk-GIWFLWXG.js.map → chunk-C2KASMJK.js.map} +0 -0
- /package/dist/{chunk-KO3OHHY2.js.map → chunk-CAZDRDQT.js.map} +0 -0
- /package/dist/{chunk-OK7BQMCI.js.map → chunk-CBJRZKZB.js.map} +0 -0
- /package/dist/{chunk-OYOFPNLC.js.map → chunk-CF6NYG7J.js.map} +0 -0
- /package/dist/{chunk-MT2R57SF.js.map → chunk-COITN7WN.js.map} +0 -0
- /package/dist/{chunk-OCXTTKVA.js.map → chunk-CPVOXM2Q.js.map} +0 -0
- /package/dist/{chunk-HYEIA25Y.js.map → chunk-CTZRCBKH.js.map} +0 -0
- /package/dist/{chunk-OCXEY7HE.js.map → chunk-CWL27YTB.js.map} +0 -0
- /package/dist/{chunk-K4DQS2ML.js.map → chunk-D2I33V5P.js.map} +0 -0
- /package/dist/{chunk-736RUNIA.js.map → chunk-DF7WI4JH.js.map} +0 -0
- /package/dist/{chunk-KUE5BOQE.js.map → chunk-DKZYCJCO.js.map} +0 -0
- /package/dist/{chunk-74CBR5YE.js.map → chunk-DQ32FKFQ.js.map} +0 -0
- /package/dist/{chunk-4O2XWOLZ.js.map → chunk-DTKG2YUF.js.map} +0 -0
- /package/dist/{chunk-GMHIOYB7.js.map → chunk-DUDA4V5R.js.map} +0 -0
- /package/dist/{chunk-XUOYNJPB.js.map → chunk-ECROT4M5.js.map} +0 -0
- /package/dist/{chunk-PVB4YVDP.js.map → chunk-EOXV5XGY.js.map} +0 -0
- /package/dist/{chunk-U6552Q3T.js.map → chunk-EQQOZ6DD.js.map} +0 -0
- /package/dist/{chunk-G6ICCGJ3.js.map → chunk-EY6W5H4B.js.map} +0 -0
- /package/dist/{chunk-HWVPLFIW.js.map → chunk-EYRFEWXJ.js.map} +0 -0
- /package/dist/{chunk-U4LTPFD2.js.map → chunk-FKK2PD7K.js.map} +0 -0
- /package/dist/{chunk-PUUEI4W3.js.map → chunk-FPHHIC5K.js.map} +0 -0
- /package/dist/{chunk-SP44O3OU.js.map → chunk-FQM6L22H.js.map} +0 -0
- /package/dist/{chunk-2J77TWGH.js.map → chunk-FW22IREV.js.map} +0 -0
- /package/dist/{chunk-EBIVTDEG.js.map → chunk-G4M6AYDB.js.map} +0 -0
- /package/dist/{chunk-BASI553K.js.map → chunk-G6AZ2WIU.js.map} +0 -0
- /package/dist/{chunk-SJYTQLN3.js.map → chunk-GJ5IDSAX.js.map} +0 -0
- /package/dist/{chunk-TDTD66BK.js.map → chunk-GRDSEZWZ.js.map} +0 -0
- /package/dist/{chunk-MV2CLIO6.js.map → chunk-HBVJIGY2.js.map} +0 -0
- /package/dist/{chunk-R4JA5JFI.js.map → chunk-HCWQLIOE.js.map} +0 -0
- /package/dist/{chunk-MZY3VKKM.js.map → chunk-HEVD4A5G.js.map} +0 -0
- /package/dist/{chunk-DLVIRJGK.js.map → chunk-HNDHSEVJ.js.map} +0 -0
- /package/dist/{chunk-LPKJ77EK.js.map → chunk-HNTZ7B7M.js.map} +0 -0
- /package/dist/{chunk-IN3VQFKS.js.map → chunk-I2FC7CAI.js.map} +0 -0
- /package/dist/{chunk-ZBHGNE2J.js.map → chunk-IEHZFYMH.js.map} +0 -0
- /package/dist/{chunk-DWJ6J3YW.js.map → chunk-IXISEVD7.js.map} +0 -0
- /package/dist/{chunk-TK5FWVZR.js.map → chunk-IZEDVQUD.js.map} +0 -0
- /package/dist/{chunk-HEGV4QMS.js.map → chunk-J42QE4VO.js.map} +0 -0
- /package/dist/{chunk-PRT4J2DL.js.map → chunk-J555XSUM.js.map} +0 -0
- /package/dist/{chunk-SBXSKRFA.js.map → chunk-JNMHFSDF.js.map} +0 -0
- /package/dist/{chunk-KI46GKMD.js.map → chunk-JTBAOPYO.js.map} +0 -0
- /package/dist/{chunk-SXGJL7UT.js.map → chunk-K376MPJH.js.map} +0 -0
- /package/dist/{chunk-OSJ366KR.js.map → chunk-KEBVT55V.js.map} +0 -0
- /package/dist/{chunk-U5UGM5XD.js.map → chunk-KFIZAXHI.js.map} +0 -0
- /package/dist/{chunk-KFNZZ2N6.js.map → chunk-KKGRDBMK.js.map} +0 -0
- /package/dist/{chunk-PLYVGZIN.js.map → chunk-KKIG6DN5.js.map} +0 -0
- /package/dist/{chunk-3OK7Y6ES.js.map → chunk-KKQO2GAA.js.map} +0 -0
- /package/dist/{chunk-DQPIEQGP.js.map → chunk-KO753ZCZ.js.map} +0 -0
- /package/dist/{chunk-YNTLWCF4.js.map → chunk-KYIRWU65.js.map} +0 -0
- /package/dist/{chunk-JKL5S7UQ.js.map → chunk-L6V63DVI.js.map} +0 -0
- /package/dist/{chunk-CV4VVLPZ.js.map → chunk-LCNJ2KNS.js.map} +0 -0
- /package/dist/{chunk-D74Z2N4K.js.map → chunk-LE7YKMTU.js.map} +0 -0
- /package/dist/{chunk-D5TIVCXG.js.map → chunk-LEBEOMVT.js.map} +0 -0
- /package/dist/{embedded-new-voice-GHJRY3YL.js.map → chunk-LKLQVANM.js.map} +0 -0
- /package/dist/{chunk-WXF2RTS4.js.map → chunk-M6URPYUB.js.map} +0 -0
- /package/dist/{chunk-H6BX6WOW.js.map → chunk-MDHFMRBC.js.map} +0 -0
- /package/dist/{chunk-3CDJSKDW.js.map → chunk-MGZO7CHI.js.map} +0 -0
- /package/dist/{chunk-DCEQCGVN.js.map → chunk-MIWU52TW.js.map} +0 -0
- /package/dist/{chunk-LVELUUK6.js.map → chunk-NF6QVVMP.js.map} +0 -0
- /package/dist/{chunk-UMX6DZME.js.map → chunk-NTZ5ZNVK.js.map} +0 -0
- /package/dist/{chunk-FBA2NXYH.js.map → chunk-NWLRABUR.js.map} +0 -0
- /package/dist/{chunk-TNSJFZ6Q.js.map → chunk-O2H2U7YS.js.map} +0 -0
- /package/dist/{chunk-BFFNINCC.js.map → chunk-OAL2PPX4.js.map} +0 -0
- /package/dist/{chunk-WTSQUCHB.js.map → chunk-OCYTHZ4A.js.map} +0 -0
- /package/dist/{chunk-ZAX4XQLN.js.map → chunk-OEDTCIXF.js.map} +0 -0
- /package/dist/{chunk-CHU3RDV4.js.map → chunk-OLVSYB3P.js.map} +0 -0
- /package/dist/{chunk-IFSXVU2S.js.map → chunk-OQHTFOCA.js.map} +0 -0
- /package/dist/{chunk-OXQ2SXVC.js.map → chunk-P56AVROH.js.map} +0 -0
- /package/dist/{chunk-CXAN2FHF.js.map → chunk-PCEJHHGP.js.map} +0 -0
- /package/dist/{chunk-5MIBQ4P5.js.map → chunk-PHGQGVVL.js.map} +0 -0
- /package/dist/{chunk-FLWQJDJ5.js.map → chunk-PUZRHEQI.js.map} +0 -0
- /package/dist/{chunk-OP2GD6QW.js.map → chunk-PV7U6OOJ.js.map} +0 -0
- /package/dist/{chunk-X2QJXDE4.js.map → chunk-PZQACDH5.js.map} +0 -0
- /package/dist/{chunk-CH4UQ4NO.js.map → chunk-PZTS4O6E.js.map} +0 -0
- /package/dist/{chunk-TKQL7EDB.js.map → chunk-Q42QHUAQ.js.map} +0 -0
- /package/dist/{chunk-MRECRNVU.js.map → chunk-QCYGB6TZ.js.map} +0 -0
- /package/dist/{chunk-GSCGKJNK.js.map → chunk-QECMETOF.js.map} +0 -0
- /package/dist/{chunk-RMCLFSMX.js.map → chunk-QGX3LE6H.js.map} +0 -0
- /package/dist/{chunk-HTMQGS63.js.map → chunk-QI3NDQFP.js.map} +0 -0
- /package/dist/{chunk-R5QAL43H.js.map → chunk-RA3Q52O2.js.map} +0 -0
- /package/dist/{chunk-AJDGP2N4.js.map → chunk-RJNOQEJJ.js.map} +0 -0
- /package/dist/{chunk-477DTTMH.js.map → chunk-RSFOFUR7.js.map} +0 -0
- /package/dist/{chunk-JV5ULONH.js.map → chunk-RXR6PMSH.js.map} +0 -0
- /package/dist/{chunk-J2BTILRR.js.map → chunk-SM7HFCGC.js.map} +0 -0
- /package/dist/{chunk-OBGOLHCP.js.map → chunk-T4HK4XCI.js.map} +0 -0
- /package/dist/{chunk-XVLEBB4Y.js.map → chunk-TBWL6YWL.js.map} +0 -0
- /package/dist/{chunk-AAS7OWV6.js.map → chunk-TIDXYWFX.js.map} +0 -0
- /package/dist/{chunk-N3FM4BNA.js.map → chunk-TKHRGY2P.js.map} +0 -0
- /package/dist/{chunk-GU7T2S5N.js.map → chunk-TU2GSZL7.js.map} +0 -0
- /package/dist/{chunk-OI6VI6SU.js.map → chunk-U6HGJXXQ.js.map} +0 -0
- /package/dist/{chunk-4BWMAGJJ.js.map → chunk-UGRW6RTR.js.map} +0 -0
- /package/dist/{chunk-AVXDIRRW.js.map → chunk-UMRUDYUK.js.map} +0 -0
- /package/dist/{chunk-FNXCFIPW.js.map → chunk-UOT2R5ZD.js.map} +0 -0
- /package/dist/{chunk-DIP7YALH.js.map → chunk-USURKJVT.js.map} +0 -0
- /package/dist/{chunk-S27VZ5DO.js.map → chunk-UU6Q67XM.js.map} +0 -0
- /package/dist/{chunk-LTJFV2JI.js.map → chunk-UZ7NP5CW.js.map} +0 -0
- /package/dist/{chunk-H6MJFMHZ.js.map → chunk-V4FO7UOE.js.map} +0 -0
- /package/dist/{chunk-RGR57NYY.js.map → chunk-V4ZOZRCW.js.map} +0 -0
- /package/dist/{chunk-LQKVNREV.js.map → chunk-V57YMKQZ.js.map} +0 -0
- /package/dist/{chunk-XZCCEKPW.js.map → chunk-VOIWZBY6.js.map} +0 -0
- /package/dist/{chunk-E5KOWRDU.js.map → chunk-VPHPLPDA.js.map} +0 -0
- /package/dist/{chunk-OGU73VUN.js.map → chunk-VUL4KPUU.js.map} +0 -0
- /package/dist/{chunk-SFIXTOOJ.js.map → chunk-VWF6ILAR.js.map} +0 -0
- /package/dist/{chunk-FER6EVIY.js.map → chunk-W54BHJO7.js.map} +0 -0
- /package/dist/{chunk-34NV52R3.js.map → chunk-WCYE4BLC.js.map} +0 -0
- /package/dist/{chunk-RISUROBM.js.map → chunk-WTV25ELY.js.map} +0 -0
- /package/dist/{chunk-UO35OEOX.js.map → chunk-WZYGH7CN.js.map} +0 -0
- /package/dist/{chunk-CEMSIU4Z.js.map → chunk-XG2RWUF7.js.map} +0 -0
- /package/dist/{chunk-K3D7IQQP.js.map → chunk-XV7QOT7W.js.map} +0 -0
- /package/dist/{chunk-GOCODNQS.js.map → chunk-XWECT3GX.js.map} +0 -0
- /package/dist/{chunk-5MHMCE2G.js.map → chunk-XZQK2ZLW.js.map} +0 -0
- /package/dist/{chunk-JV3UI7BH.js.map → chunk-Y5BR66OH.js.map} +0 -0
- /package/dist/{chunk-4F3AEJI6.js.map → chunk-YD6XU6FY.js.map} +0 -0
- /package/dist/{chunk-VATYK3JQ.js.map → chunk-YFE47G3C.js.map} +0 -0
- /package/dist/{chunk-ZR5EKJT6.js.map → chunk-YG6TWPP7.js.map} +0 -0
- /package/dist/{chunk-44JWVYJB.js.map → chunk-YH3ARKBB.js.map} +0 -0
- /package/dist/{chunk-752WXSDN.js.map → chunk-YI66STKJ.js.map} +0 -0
- /package/dist/{chunk-QRECBCJM.js.map → chunk-YMVPYMKB.js.map} +0 -0
- /package/dist/{chunk-77SYIH6O.js.map → chunk-YPIXBAF6.js.map} +0 -0
- /package/dist/{chunk-WRMUXZ7C.js.map → chunk-YSWPNY6G.js.map} +0 -0
- /package/dist/{chunk-GTHCHCWW.js.map → chunk-YWNNMBZG.js.map} +0 -0
- /package/dist/{chunk-3DRLCX5V.js.map → chunk-Z3HYM2JT.js.map} +0 -0
- /package/dist/{chunk-M3HGBO2Y.js.map → chunk-ZAC7YPRA.js.map} +0 -0
- /package/dist/{chunk-2VJOSU4H.js.map → chunk-ZENESDAF.js.map} +0 -0
- /package/dist/{chunk-4JXPLTWV.js.map → chunk-ZHAPMETO.js.map} +0 -0
- /package/dist/{chunk-IJR6VOLU.js.map → chunk-ZVR6DUZH.js.map} +0 -0
- /package/dist/{embedded-voice-ASQXBSTX.js.map → computer-viewer-FOIOZUF5.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-E6XKMFTA.js.map → embedded-new-voice-WTXAJNGO.js.map} +0 -0
- /package/dist/{sandbox-files-W5W2LW4K.js.map → embedded-voice-SIJOPN2G.js.map} +0 -0
- /package/dist/{fleet-decision-row-U7LDVBEM.js.map → fleet-decision-row-XKQ3GMYT.js.map} +0 -0
- /package/dist/{latest-question-RNVF262Q.js.map → latest-question-KA7AQYVI.js.map} +0 -0
- /package/dist/{session-connect-cards-HPH7JOZP.js.map → model-policy-picker-menu-6N2G7VGX.js.map} +0 -0
- /package/dist/{payment-page-card-DJDKV2LW.js.map → payment-page-card-IJFZHQ52.js.map} +0 -0
- /package/dist/{platform-activity-row-MSDCSMET.js.map → platform-activity-row-MFCMGI43.js.map} +0 -0
- /package/dist/{queue-surface-implementation-GUAIG6TK.js.map → queue-surface-implementation-BBCDWWOP.js.map} +0 -0
- /package/dist/{recorder-host-2MYDJPQW.js.map → recorder-host-LDYYOKG7.js.map} +0 -0
- /package/dist/{session-realtime-SDTKFFIR.js.map → sandbox-files-VYRBIXJY.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-FNILLWNU.js.map → timeline-annotation-markers-LL6ZVBZH.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-MBCIDO2Q.js.map → timeline-annotation-selection-WQA76WYC.js.map} +0 -0
- /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
|
-
|
|
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.
|
|
86
|
-
["5h",
|
|
87
|
-
["Week",
|
|
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
|
|
93
|
-
expect(
|
|
94
|
-
|
|
95
|
-
|
|
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(
|
|
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(
|
|
176
|
-
|
|
177
|
-
|
|
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.
|
|
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(
|
|
240
|
-
"
|
|
241
|
-
);
|
|
242
|
-
expect(
|
|
243
|
-
"
|
|
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).
|
|
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
|
|
264
|
-
|
|
265
|
-
"
|
|
266
|
-
"
|
|
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
|
-
|
|
270
|
-
expect(view.windows
|
|
271
|
-
|
|
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
|
|
276
|
-
|
|
277
|
-
);
|
|
278
|
-
|
|
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
|
|
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
|
|
297
|
-
expect(
|
|
298
|
-
|
|
299
|
-
|
|
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 (
|
|
127
|
-
|
|
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
|
-
|
|
136
|
-
|
|
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
|
-
|
|
157
|
-
|
|
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
|
|
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
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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(
|
|
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
|
|
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 ||
|
|
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
|
-
:
|
|
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
|
-
|
|
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
|
-
?
|
|
323
|
-
: subscriptionAccountUsage(account.usage);
|
|
294
|
+
? null
|
|
295
|
+
: subscriptionAccountUsage(provider, account.usage, now);
|
|
324
296
|
return {
|
|
325
297
|
id: account.id,
|
|
326
|
-
label
|
|
327
|
-
|
|
328
|
-
|
|
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
|
-
|
|
312
|
+
label,
|
|
331
313
|
account.email,
|
|
332
|
-
account.plan,
|
|
314
|
+
subscriptionPlanLabel(provider, account.plan),
|
|
333
315
|
accountSource(account),
|
|
334
|
-
|
|
316
|
+
rowStatus,
|
|
335
317
|
]
|
|
336
|
-
.filter(
|
|
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
|
|
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]
|
|
357
|
-
|
|
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
|
-
|
|
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",
|