@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
|
@@ -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
|
|
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
|
|
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
|
-
/**
|
|
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
|
-
|
|
1591
|
+
let request = { ...payload, expectedRevision: current.revision };
|
|
1581
1592
|
if (draftSignature(request) === lastSavedSignature.current) return true;
|
|
1582
|
-
|
|
1583
|
-
|
|
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
|
-
|
|
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(
|
|
2436
|
-
|
|
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)
|
|
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
|
-
//
|
|
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
|
|
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}>
|