@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-recordings.ts"],"sourcesContent":["import type {\n CreateRecordingPersonRequest,\n ListRecordingModelsResponse,\n Recording,\n RecordingCreateTitleSource,\n RecordingLiveSegment,\n RecordingNote,\n RecordingNoteKind,\n RecordingPerson,\n RecordingVoiceprintConsent,\n RecordingSpeaker,\n RecordingCalendarEventRef,\n RecordingTranscriptionRequest,\n RecordingTranscriptPage,\n RecordingTranscriptSegment,\n RecordingTranscriptVersion,\n RecordingVisibility,\n UpdateRecordingRequest,\n} from \"@opengeni/contracts\";\nimport {\n browserRecorderPlatform,\n OpenGeniRecordingsClient,\n RecordingUploader,\n type Recorder,\n type RecorderPlatform,\n type RecorderSnapshot,\n type RecordingChunkStore,\n type RecordingUploadStatus,\n type SystemAudioKind,\n type RecordingTransport,\n type OpenGeniRecordingsTransport,\n uploadRecordingAudio,\n} from \"@opengeni/sdk/recordings\";\nimport { useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { OpenGeniContext } from \"../session-context\";\nimport { usePolledValue } from \"./internal\";\n\nconst PROCESSING_POLL_MS = 3_000;\n// A meeting recorded on another device changes little until it ends, so pages\n// showing it read it less often, only to notice when the capture finishes.\nconst CAPTURING_POLL_MS = 10_000;\n\n/**\n * Client surface of the recording hooks, as `OpenGeniRecordingsClient` provides\n * it. Each hook checks only the methods it calls, so a host proxy can expose a subset.\n */\nexport type RecordingsClientLike = Pick<\n OpenGeniRecordingsClient,\n | \"listRecordings\"\n | \"createRecording\"\n | \"getRecording\"\n | \"updateRecording\"\n | \"deleteRecording\"\n | \"createRecordingUploads\"\n | \"completeRecordingChunks\"\n | \"finalizeRecording\"\n | \"listRecordingTranscriptVersions\"\n | \"createRecordingTranscript\"\n | \"getRecordingTranscript\"\n | \"setCurrentRecordingTranscript\"\n | \"updateRecordingSpeakers\"\n | \"updateRecordingSegments\"\n | \"getRecordingTrackAudio\"\n | \"listRecordingPeople\"\n | \"createRecordingPerson\"\n | \"rememberRecordingPersonVoice\"\n | \"forgetRecordingPersonVoice\"\n | \"listRecordingModels\"\n | \"createRecordingLiveSession\"\n | \"appendRecordingLiveSegments\"\n | \"listRecordingLiveSegments\"\n | \"listRecordingNotes\"\n | \"saveRecordingNote\"\n>;\n\n/** Refresh every `intervalMs` while `active`, without an extra read when it turns on. */\nfunction useRefreshWhile(\n active: boolean,\n refresh: () => Promise<void>,\n intervalMs: number = PROCESSING_POLL_MS,\n): void {\n const refreshRef = useRef(refresh);\n refreshRef.current = refresh;\n useEffect(() => {\n if (!active) return;\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const tick = () => {\n timer = setTimeout(() => {\n void refreshRef.current().finally(() => {\n if (!cancelled) tick();\n });\n }, intervalMs);\n };\n tick();\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [active, intervalMs]);\n}\n\nexport type RecordingsClientOverride = {\n /** A recordings client, such as a host proxy. Built from the provider's client otherwise. */\n recordings?: Partial<RecordingsClientLike> | undefined;\n /** A client exposing `requestJson` (the SDK client) to build the recordings client from. */\n client?: object | undefined;\n workspaceId?: string | undefined;\n};\n\nconst recordingClients = new WeakMap<object, OpenGeniRecordingsClient>();\n\n/**\n * Resolve the recording methods one hook calls: the explicit `recordings`\n * client, else an `OpenGeniRecordingsClient` over the provider's SDK client.\n */\nfunction useEmbeddedRecordings(\n override: RecordingsClientOverride,\n requiredMethods: readonly (keyof RecordingsClientLike)[],\n hookName: string,\n): { client: RecordingsClientLike; workspaceId: string } {\n const context = useContext(OpenGeniContext);\n const workspaceId = override.workspaceId ?? context?.workspaceId;\n let candidate: object | undefined = override.recordings;\n if (!candidate) {\n const base = (override.client ?? context?.client) as\n | Partial<OpenGeniRecordingsTransport>\n | undefined;\n if (base && typeof base.requestJson === \"function\") {\n candidate = recordingClients.get(base);\n if (!candidate) {\n const created = new OpenGeniRecordingsClient(base as OpenGeniRecordingsTransport);\n recordingClients.set(base, created);\n candidate = created;\n }\n }\n }\n if (!candidate || !workspaceId) {\n throw new Error(\n `@opengeni/react: ${hookName} needs a recordings client and workspace. Wrap the tree in <OpenGeniProvider> with the SDK client, or pass { recordings, workspaceId }.`,\n );\n }\n const methods = candidate as Record<string, unknown>;\n const missing = requiredMethods.filter((method) => typeof methods[method] !== \"function\");\n if (missing.length > 0) {\n throw new Error(\n `@opengeni/react: ${hookName} requires recordings client method${missing.length === 1 ? \"\" : \"s\"} ${missing.join(\", \")}.`,\n );\n }\n return { client: candidate as RecordingsClientLike, workspaceId };\n}\n\n/**\n * The recordings client the hooks use, for calls no hook wraps (deleting from\n * a list, reading track audio): the explicit `recordings` client, else one\n * built over the provider's SDK client.\n */\nexport function useRecordingsClient(options: RecordingsClientOverride = {}): {\n client: RecordingsClientLike;\n workspaceId: string;\n} {\n return useEmbeddedRecordings(options, [], \"useRecordingsClient\");\n}\n\n// --- Capture -------------------------------------------------------------------\n\nexport type UseRecorderOptions = RecordingsClientOverride & {\n /** Leave it out unless the person gave one; Opengeni then names the meeting. */\n title?: string;\n /** `app` when `title` is your app's guess, such as \"Zoom meeting\", for Opengeni to replace. */\n titleSource?: RecordingCreateTitleSource;\n visibility?: RecordingVisibility;\n /** Your own id for what this recording belongs to, to find it again with `useRecordings`. */\n externalRef?: string;\n metadata?: Record<string, unknown>;\n /** The owner's calendar event the meeting is of, such as one they joined; it names the meeting. */\n calendarEvent?: RecordingCalendarEventRef;\n transcription?: RecordingTranscriptionRequest;\n /**\n * The person recording's name, as your app knows it: their microphone's\n * name in the transcript when computer or tab audio is recorded beside it\n * and Opengeni has no name for them.\n */\n ownerName?: string;\n /** Microphone constraints; false records no microphone. Default: on. */\n microphone?: boolean | MediaTrackConstraints;\n /** Also record shared tab or system audio as its own track (Chromium). Default: off. */\n systemAudio?: boolean;\n timesliceMilliseconds?: number;\n keepAwake?: boolean;\n /**\n * Also show a live transcript while recording, in `live`: each track is\n * streamed to the workspace's live speech model as it is captured, which\n * the provider bills for. A preview only. Default: off.\n */\n liveTranscript?: boolean;\n /**\n * Where capture runs. Default: the browser (MediaRecorder and IndexedDB).\n * React Native passes `useNativeRecorderPlatform()` from `@opengeni/react-native/recordings`.\n */\n platform?: RecorderPlatform;\n /** Local storage for chunks not uploaded yet. Default: the platform's (IndexedDB in browsers). */\n store?: RecordingChunkStore;\n /** Finish recordings an earlier page left behind when the hook mounts. Default: on. */\n resumePending?: boolean;\n /** Called once the server has every chunk of a recording and transcription has started. */\n onFinished?: (recordingId: string) => void;\n};\n\nexport type UseRecorderResult = RecorderSnapshot & {\n /** This browser can record audio at all. */\n supported: boolean;\n /** This browser can share a tab's or the system's audio. */\n systemAudioSupported: boolean;\n /**\n * How: `desktop` records other apps' audio directly (inside a desktop app);\n * `display` asks the browser to share a tab or screen. Null when it can't.\n */\n systemAudioKind: SystemAudioKind | null;\n /**\n * Recordings from an earlier page or app run this hook is still finishing in\n * the background. Each leaves the list once it is uploaded, removed for having\n * no audio, or failed for good.\n */\n recovered: string[];\n /**\n * The upload of every recording this device holds audio for, by recording\n * id: the current one and those finished in the background, including one\n * that failed and keeps its audio here until it is tried again.\n */\n uploads: Readonly<Record<string, RecordingUploadStatus>>;\n /** Upload a failed recording again from the audio kept here. False when none failed. */\n retryUpload: (recordingId: string) => boolean;\n /** Start a new recording; per-recording options override the hook's. */\n start: (\n overrides?: Pick<\n UseRecorderOptions,\n | \"title\"\n | \"titleSource\"\n | \"systemAudio\"\n | \"microphone\"\n | \"visibility\"\n | \"liveTranscript\"\n | \"transcription\"\n | \"externalRef\"\n | \"metadata\"\n | \"calendarEvent\"\n | \"ownerName\"\n >,\n ) => Promise<void>;\n pause: () => void;\n resume: () => void;\n stop: () => Promise<void>;\n discard: () => Promise<void>;\n /** Rename the recording being made; the title reaches the server with the upload. */\n rename: (title: string) => Promise<void>;\n /** Input level per track number, 0 to 1. Read it from an animation frame for a meter. */\n levels: () => Record<number, number>;\n /**\n * Make a meeting from audio recorded somewhere else, such as a phone's call\n * recording or a voice memo. It goes the way a capture does: saved on this\n * device first, then uploaded in the background and transcribed, and it\n * shows in `uploads` while it uploads. Resolves with the new recording's id\n * once the audio is saved here; a capture under way is not affected.\n */\n importAudio: (input: ImportRecordingAudioInput) => Promise<string>;\n};\n\nexport type ImportRecordingAudioInput = {\n /** One audio file: M4A (MP4), WebM, Ogg or ADTS AAC. */\n audio: Blob;\n /** Its type; the blob's own type by default. */\n mimeType?: string;\n /** The meeting's name. Opengeni names it when omitted. */\n title?: string;\n /** `app` when `title` is a guess, such as the file's name, for Opengeni to replace. */\n titleSource?: RecordingCreateTitleSource;\n /**\n * When it was recorded, if known. By default the date an M4A file states,\n * otherwise it ended just now.\n */\n startedAt?: Date;\n /** How long it plays. Read from an M4A file when omitted. */\n durationMilliseconds?: number;\n /** Recorded with this id (a project, a customer). The hook's `externalRef` otherwise. */\n externalRef?: string;\n};\n\nconst IDLE_SNAPSHOT: RecorderSnapshot = {\n state: \"idle\",\n recordingId: null,\n elapsedMilliseconds: 0,\n tracks: [],\n upload: null,\n error: null,\n};\n\n/**\n * Record a meeting in the browser. Audio is saved locally every few seconds\n * and uploaded in the background, so a reload or a lost connection loses\n * nothing. Unmounting while recording stops capture (the microphone is\n * released) and finishes the upload in the background; keep the hook in a\n * component that outlives page navigation to record across it.\n */\nexport function useRecorder(options: UseRecorderOptions = {}): UseRecorderResult {\n const { client, workspaceId } = useEmbeddedRecordings(\n options,\n [\n \"createRecording\",\n \"createRecordingUploads\",\n \"completeRecordingChunks\",\n \"finalizeRecording\",\n \"deleteRecording\",\n ],\n \"useRecorder\",\n );\n const optionsRef = useRef(options);\n optionsRef.current = options;\n // The uploader outlives client changes (a sign-in token that loads late or is\n // refreshed, a switched account), so it calls through to the latest client\n // instead of keeping the one it was created with.\n const clientRef = useRef(client);\n clientRef.current = client;\n const transport = useMemo<RecordingTransport>(() => {\n const methods = clientRef.current as Partial<RecordingsClientLike>;\n return {\n createRecording: (...args) => clientRef.current.createRecording(...args),\n createRecordingUploads: (...args) => clientRef.current.createRecordingUploads(...args),\n completeRecordingChunks: (...args) => clientRef.current.completeRecordingChunks(...args),\n finalizeRecording: (...args) => clientRef.current.finalizeRecording(...args),\n deleteRecording: (...args) => clientRef.current.deleteRecording(...args),\n ...(typeof methods.updateRecording === \"function\"\n ? {\n updateRecording: (...args) => clientRef.current.updateRecording(...args),\n }\n : {}),\n // Only a client that has the live calls can show a live transcript.\n ...(typeof methods.createRecordingLiveSession === \"function\" &&\n typeof methods.appendRecordingLiveSegments === \"function\"\n ? {\n createRecordingLiveSession: (...args) =>\n clientRef.current.createRecordingLiveSession(...args),\n appendRecordingLiveSegments: (...args) =>\n clientRef.current.appendRecordingLiveSegments(...args),\n }\n : {}),\n };\n }, []);\n const [snapshot, setSnapshot] = useState<RecorderSnapshot>(IDLE_SNAPSHOT);\n const [recovered, setRecovered] = useState<string[]>([]);\n const [uploads, setUploads] = useState<Readonly<Record<string, RecordingUploadStatus>>>({});\n const recorderRef = useRef<Recorder | null>(null);\n const uploaderRef = useRef<RecordingUploader | null>(null);\n const defaultPlatform = useMemo(() => browserRecorderPlatform(), []);\n const platform = options.platform ?? defaultPlatform;\n const platformRef = useRef(platform);\n platformRef.current = platform;\n const support = {\n supported: platform.supported,\n systemAudio: platform.systemAudioSupported,\n systemAudioKind:\n platform.systemAudioKind ?? (platform.systemAudioSupported ? (\"display\" as const) : null),\n };\n const storeRef = useRef<RecordingChunkStore | null>(null);\n const store = useCallback(\n (): RecordingChunkStore =>\n optionsRef.current.store ?? (storeRef.current ??= platformRef.current.createStore()),\n [],\n );\n\n const uploader = useCallback((): RecordingUploader => {\n if (!uploaderRef.current) {\n const isCaptureActive = platformRef.current.isCaptureActive;\n const platformFetch = platformRef.current.fetch;\n uploaderRef.current = new RecordingUploader({\n client: transport,\n store: store(),\n ...(platformFetch ? { fetch: platformFetch } : {}),\n ...(isCaptureActive ? { isCaptureActive: (id: string) => isCaptureActive(id) } : {}),\n onStatus: (status) => {\n if (status.finalized) optionsRef.current.onFinished?.(status.recordingId);\n setUploads((previous) => ({\n ...previous,\n [status.recordingId]: status,\n }));\n if (status.finalized || status.discarded || status.failed) {\n setRecovered((previous) =>\n previous.includes(status.recordingId)\n ? previous.filter((id) => id !== status.recordingId)\n : previous,\n );\n }\n },\n });\n }\n return uploaderRef.current;\n }, [transport, store]);\n\n useEffect(() => {\n if (!support.supported || optionsRef.current.resumePending === false) return;\n let cancelled = false;\n void (async () => {\n // Save what a capture cut short left half-written, then finish everything.\n await platformRef.current.recover?.(store()).catch(() => undefined);\n // Dictations are the composer's to finish; this hook finishes the rest.\n return await uploader().resume({\n only: (recording) => recording.create.purpose !== \"dictation\",\n });\n })()\n .then((ids) => {\n if (cancelled) return;\n // Some may already be done by now: keep only those still in flight.\n const open = ids.filter((id) => {\n const status = uploader().status(id);\n return !(status?.finalized || status?.discarded || status?.failed);\n });\n if (open.length > 0) setRecovered(open);\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [support.supported, uploader, store]);\n\n useEffect(\n () => () => {\n const recorder = recorderRef.current;\n if (\n recorder &&\n (recorder.snapshot.state === \"recording\" || recorder.snapshot.state === \"paused\")\n ) {\n void recorder.stop().catch(() => undefined);\n }\n },\n [],\n );\n\n const start = useCallback<UseRecorderResult[\"start\"]>(\n async (overrides = {}) => {\n const current = recorderRef.current?.snapshot.state;\n if (\n current === \"starting\" ||\n current === \"recording\" ||\n current === \"paused\" ||\n current === \"stopping\"\n ) {\n return;\n }\n const merged = {\n ...optionsRef.current,\n ...overrides,\n // A title given at start is the person's unless the start says otherwise.\n ...(overrides.title !== undefined && overrides.titleSource === undefined\n ? { titleSource: undefined }\n : {}),\n // A start can set one transcription option, such as the language, and\n // keep the rest the hook was given.\n ...(overrides.transcription\n ? {\n transcription: {\n ...optionsRef.current.transcription,\n ...overrides.transcription,\n },\n }\n : {}),\n };\n // Earlier recorders stay subscribed to the shared uploader for their own\n // recording; only the current one may change what the hook shows.\n let recorder: Recorder | null = null;\n recorder = platformRef.current.createRecorder({\n client: transport,\n workspaceId,\n store: store(),\n uploader: uploader(),\n ...(merged.title ? { title: merged.title } : {}),\n ...(merged.title && merged.titleSource ? { titleSource: merged.titleSource } : {}),\n ...(merged.visibility ? { visibility: merged.visibility } : {}),\n ...(merged.externalRef ? { externalRef: merged.externalRef } : {}),\n ...(merged.metadata ? { metadata: merged.metadata as never } : {}),\n ...(merged.calendarEvent ? { calendarEvent: merged.calendarEvent } : {}),\n ...(merged.transcription ? { transcription: merged.transcription } : {}),\n ...(merged.ownerName?.trim() ? { ownerName: merged.ownerName } : {}),\n ...(merged.microphone !== undefined ? { microphone: merged.microphone } : {}),\n ...(merged.systemAudio !== undefined ? { systemAudio: merged.systemAudio } : {}),\n ...(merged.timesliceMilliseconds\n ? { timesliceMilliseconds: merged.timesliceMilliseconds }\n : {}),\n ...(merged.keepAwake !== undefined ? { keepAwake: merged.keepAwake } : {}),\n ...(merged.liveTranscript ? { liveTranscript: true } : {}),\n onChange: (next) => {\n if (recorderRef.current === recorder) setSnapshot(next);\n },\n });\n recorderRef.current = recorder;\n await recorder.start();\n },\n [transport, workspaceId, store, uploader],\n );\n\n return {\n ...snapshot,\n supported: support.supported,\n systemAudioSupported: support.systemAudio,\n systemAudioKind: support.systemAudioKind,\n recovered,\n uploads,\n retryUpload: useCallback((recordingId: string) => {\n const retried = uploaderRef.current?.retry(recordingId) ?? false;\n if (retried) {\n setRecovered((previous) =>\n previous.includes(recordingId) ? previous : [...previous, recordingId],\n );\n }\n return retried;\n }, []),\n start,\n pause: useCallback(() => recorderRef.current?.pause(), []),\n resume: useCallback(() => recorderRef.current?.resume(), []),\n stop: useCallback(async () => {\n await recorderRef.current?.stop();\n }, []),\n discard: useCallback(async () => {\n await recorderRef.current?.discard();\n }, []),\n rename: useCallback(async (title: string) => {\n const recorder = recorderRef.current;\n if (!recorder) throw new Error(\"Nothing is being recorded to rename.\");\n await recorder.rename(title);\n }, []),\n levels: useCallback(() => recorderRef.current?.levels() ?? {}, []),\n importAudio: useCallback(\n async (input: ImportRecordingAudioInput) => {\n const current = optionsRef.current;\n const title = input.title?.trim();\n const externalRef = input.externalRef ?? current.externalRef;\n return await new Promise<string>((resolve, reject) => {\n uploadRecordingAudio({\n uploader: uploader(),\n workspaceId,\n audio: input.audio,\n source: \"upload\",\n ...(input.mimeType ? { mimeType: input.mimeType } : {}),\n ...(input.durationMilliseconds !== undefined\n ? { durationMilliseconds: input.durationMilliseconds }\n : {}),\n create: {\n purpose: \"meeting\",\n ...(title ? { title } : {}),\n ...(title && input.titleSource ? { titleSource: input.titleSource } : {}),\n ...(input.startedAt ? { startedAt: input.startedAt.toISOString() } : {}),\n ...(current.visibility ? { visibility: current.visibility } : {}),\n ...(externalRef ? { externalRef } : {}),\n ...(current.metadata ? { metadata: current.metadata as never } : {}),\n ...(current.transcription ? { transcription: current.transcription } : {}),\n },\n onStored: resolve,\n }).catch(reject);\n });\n },\n [uploader, workspaceId],\n ),\n };\n}\n\n// --- Reads -------------------------------------------------------------------------\n\nexport type UseRecordingsOptions = RecordingsClientOverride & {\n query?: string;\n externalRef?: string;\n limit?: number;\n pollIntervalMs?: number;\n enabled?: boolean;\n};\n\nexport type UseRecordingsResult = {\n recordings: Recording[];\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n hasMore: boolean;\n loadingMore: boolean;\n loadMore: () => Promise<void>;\n};\n\nfunction isProcessing(recording: Recording | null | undefined): boolean {\n if (!recording) return false;\n const state = recording.transcript?.state;\n return recording.state === \"processing\" || state === \"queued\" || state === \"processing\";\n}\n\n/**\n * The recordings the signed-in person can see, newest first. Polls while any is\n * being transcribed, and less often while any is still being recorded.\n */\nexport function useRecordings(options: UseRecordingsOptions = {}): UseRecordingsResult {\n const { client, workspaceId } = useEmbeddedRecordings(\n options,\n [\"listRecordings\"],\n \"useRecordings\",\n );\n const { query, externalRef, limit } = options;\n const load = useCallback(\n async (signal?: AbortSignal) =>\n await client.listRecordings(workspaceId, {\n ...(query ? { query } : {}),\n ...(externalRef ? { externalRef } : {}),\n ...(limit ? { limit } : {}),\n ...(signal ? { signal } : {}),\n }),\n [client, workspaceId, query, externalRef, limit],\n );\n const state = usePolledValue(load, {\n pollIntervalMs: options.pollIntervalMs,\n enabled: options.enabled,\n });\n const [older, setOlder] = useState<{\n key: unknown;\n recordings: Recording[];\n nextBefore: { startedAt: string; id: string } | null;\n } | null>(null);\n const [loadingMore, setLoadingMore] = useState(false);\n // Older pages belong to the first page they continued; a new query starts over.\n const olderForThisList = older && older.key === load ? older : null;\n const recordings = useMemo(() => {\n const first = state.data?.recordings ?? [];\n if (!olderForThisList) return first;\n const seen = new Set(first.map((recording) => recording.id));\n return [\n ...first,\n ...olderForThisList.recordings.filter((recording) => !seen.has(recording.id)),\n ];\n }, [state.data, olderForThisList]);\n const anyProcessing = recordings.some(isProcessing);\n useRefreshWhile(\n options.pollIntervalMs === undefined &&\n (options.enabled ?? true) &&\n (anyProcessing || recordings.some((recording) => recording.state === \"capturing\")),\n state.refresh,\n anyProcessing ? PROCESSING_POLL_MS : CAPTURING_POLL_MS,\n );\n const nextBefore = olderForThisList\n ? olderForThisList.nextBefore\n : (state.data?.nextBefore ?? null);\n const loadMore = useCallback(async () => {\n if (!nextBefore || loadingMore) return;\n setLoadingMore(true);\n try {\n const page = await client.listRecordings(workspaceId, {\n ...(query ? { query } : {}),\n ...(externalRef ? { externalRef } : {}),\n ...(limit ? { limit } : {}),\n before: nextBefore,\n });\n setOlder((previous) => ({\n key: load,\n recordings: [\n ...(previous && previous.key === load ? previous.recordings : []),\n ...page.recordings,\n ],\n nextBefore: page.nextBefore,\n }));\n } finally {\n setLoadingMore(false);\n }\n }, [client, workspaceId, query, externalRef, limit, nextBefore, loadingMore, load]);\n return {\n recordings,\n loading: state.loading,\n error: state.error,\n refresh: state.refresh,\n hasMore: nextBefore !== null,\n loadingMore,\n loadMore,\n };\n}\n\nexport type UseRecordingOptions = RecordingsClientOverride & {\n enabled?: boolean;\n};\n\nexport type UseRecordingResult = {\n recording: Recording | null;\n versions: RecordingTranscriptVersion[];\n loading: boolean;\n error: Error | null;\n /** Transcription is still running; the hook polls until it is done. */\n processing: boolean;\n refresh: () => Promise<void>;\n update: (request: UpdateRecordingRequest) => Promise<Recording>;\n /** Transcribe again, optionally with another model, as a new version. */\n rerun: (transcription?: RecordingTranscriptionRequest) => Promise<RecordingTranscriptVersion>;\n setCurrentVersion: (versionId: string) => Promise<void>;\n remove: () => Promise<void>;\n};\n\n/**\n * One recording with its transcript versions. Polls while it is being\n * transcribed, and less often while it is still being recorded, here or on\n * another device, so a page showing it notices when the recording ends.\n */\nexport function useRecording(\n recordingId: string | null,\n options: UseRecordingOptions = {},\n): UseRecordingResult {\n const { client, workspaceId } = useEmbeddedRecordings(\n options,\n [\"getRecording\", \"listRecordingTranscriptVersions\"],\n \"useRecording\",\n );\n const load = useCallback(\n async (signal?: AbortSignal) => {\n if (!recordingId) return null;\n const [recording, versions] = await Promise.all([\n client.getRecording(workspaceId, recordingId, signal ? { signal } : {}),\n client.listRecordingTranscriptVersions(workspaceId, recordingId),\n ]);\n return { recording, versions };\n },\n [client, workspaceId, recordingId],\n );\n const enabled = (options.enabled ?? true) && recordingId !== null;\n const state = usePolledValue(load, { enabled });\n const recording = state.data?.recording ?? null;\n const versions = state.data?.versions ?? [];\n const nowProcessing =\n isProcessing(recording) ||\n versions.some((version) => version.state === \"queued\" || version.state === \"processing\");\n useRefreshWhile(\n enabled && (nowProcessing || recording?.state === \"capturing\"),\n state.refresh,\n nowProcessing ? PROCESSING_POLL_MS : CAPTURING_POLL_MS,\n );\n const refresh = state.refresh;\n const require = () => {\n if (!recordingId) throw new Error(\"No recording selected.\");\n return recordingId;\n };\n return {\n recording,\n versions,\n loading: state.loading,\n error: state.error,\n processing: nowProcessing,\n refresh,\n update: useCallback(\n async (request: UpdateRecordingRequest) => {\n const updated = await client.updateRecording(workspaceId, require(), request);\n await refresh();\n return updated;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, workspaceId, recordingId, refresh],\n ),\n rerun: useCallback(\n async (transcription?: RecordingTranscriptionRequest) => {\n const version = await client.createRecordingTranscript(\n workspaceId,\n require(),\n transcription ? { transcription } : {},\n );\n await refresh();\n return version;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, workspaceId, recordingId, refresh],\n ),\n setCurrentVersion: useCallback(\n async (versionId: string) => {\n await client.setCurrentRecordingTranscript(workspaceId, require(), versionId);\n await refresh();\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, workspaceId, recordingId, refresh],\n ),\n remove: useCallback(\n async () => {\n await client.deleteRecording(workspaceId, require());\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, workspaceId, recordingId],\n ),\n };\n}\n\nconst LIVE_POLL_MS = 2_000;\n\nexport type UseLiveTranscriptOptions = RecordingsClientOverride & {\n /** Default: on while a recording id is given. */\n enabled?: boolean;\n};\n\nexport type UseLiveTranscriptResult = {\n /** Finished live text from every track, in time order. */\n segments: RecordingLiveSegment[];\n /** A transcript is ready, so the preview is over. */\n ended: boolean;\n error: Error | null;\n};\n\n/**\n * The live transcript of a recording someone is capturing, as the recorder\n * saves it, for viewers on other devices. Polls every two seconds until the\n * transcript is ready. The device recording has it sooner in `useRecorder().live`.\n */\nexport function useLiveTranscript(\n recordingId: string | null,\n options: UseLiveTranscriptOptions = {},\n): UseLiveTranscriptResult {\n const { client, workspaceId } = useEmbeddedRecordings(\n options,\n [\"listRecordingLiveSegments\"],\n \"useLiveTranscript\",\n );\n const enabled = (options.enabled ?? true) && recordingId !== null;\n const [state, setState] = useState<UseLiveTranscriptResult & { recordingId: string | null }>({\n recordingId,\n segments: [],\n ended: false,\n error: null,\n });\n const current = state.recordingId === recordingId ? state : null;\n const ended = current?.ended ?? false;\n useEffect(() => {\n if (!enabled || !recordingId || ended) return;\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let after = 0;\n let segments: RecordingLiveSegment[] = [];\n const read = async () => {\n try {\n const page = await client.listRecordingLiveSegments(workspaceId, recordingId, { after });\n if (cancelled) return;\n after = page.after;\n if (page.segments.length > 0) {\n segments = [...segments, ...page.segments].sort(\n (left, right) =>\n left.startMilliseconds - right.startMilliseconds || left.sequence - right.sequence,\n );\n }\n setState({\n recordingId,\n segments: page.ended ? [] : segments,\n ended: page.ended,\n error: null,\n });\n if (page.ended) return;\n } catch (error) {\n if (cancelled) return;\n setState((previous) => ({\n ...(previous.recordingId === recordingId ? previous : { segments: [], ended: false }),\n recordingId,\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n }\n timer = setTimeout(() => void read(), LIVE_POLL_MS);\n };\n void read();\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [client, workspaceId, recordingId, enabled, ended]);\n return {\n segments: current?.segments ?? [],\n ended,\n error: current?.error ?? null,\n };\n}\n\nexport type UseTranscriptOptions = RecordingsClientOverride & {\n /** A specific version; the current one by default. */\n versionId?: string;\n /** Change it to read again, for example when a new version completes. */\n refreshKey?: unknown;\n enabled?: boolean;\n};\n\nexport type UseTranscriptResult = {\n version: RecordingTranscriptVersion | null;\n speakers: RecordingSpeaker[];\n segments: RecordingTranscriptSegment[];\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n /** Name a speaker label after a person in the directory or with a plain name; null clears it. */\n nameSpeaker: (\n label: string,\n name: { personId: string } | { name: string } | null,\n ) => Promise<void>;\n /** Turn down a voice suggestion; that person is not suggested for this voice again. */\n rejectSuggestion: (label: string) => Promise<void>;\n /** Move one segment to another speaker label. */\n moveSegment: (segmentIndex: number, label: string) => Promise<void>;\n /** Correct one segment's text; null restores the original. */\n editSegment: (segmentIndex: number, text: string | null) => Promise<void>;\n};\n\nconst TRANSCRIPT_PAGE = 2_000;\n\n/** A whole transcript version with its speakers, and the edits people make to it. */\nexport function useTranscript(\n recordingId: string | null,\n options: UseTranscriptOptions = {},\n): UseTranscriptResult {\n const { client, workspaceId } = useEmbeddedRecordings(\n options,\n [\"getRecordingTranscript\", \"updateRecordingSpeakers\", \"updateRecordingSegments\"],\n \"useTranscript\",\n );\n const { versionId, refreshKey } = options;\n const load = useCallback(\n async (signal?: AbortSignal): Promise<RecordingTranscriptPage | null> => {\n void refreshKey;\n if (!recordingId) return null;\n let page = await client.getRecordingTranscript(workspaceId, recordingId, {\n ...(versionId ? { versionId } : {}),\n limit: TRANSCRIPT_PAGE,\n ...(signal ? { signal } : {}),\n });\n const segments = [...page.segments];\n while (page.nextAfter !== null) {\n page = await client.getRecordingTranscript(workspaceId, recordingId, {\n versionId: page.version.id,\n after: page.nextAfter,\n limit: TRANSCRIPT_PAGE,\n ...(signal ? { signal } : {}),\n });\n segments.push(...page.segments);\n }\n return { ...page, segments, nextAfter: null };\n },\n [client, workspaceId, recordingId, versionId, refreshKey],\n );\n const state = usePolledValue(load, {\n enabled: (options.enabled ?? true) && recordingId !== null,\n });\n // Edits answer with the new speakers or segments; keep them until the next read.\n const [local, setLocal] = useState<{\n base: unknown;\n speakers?: RecordingSpeaker[];\n segments?: Map<number, RecordingTranscriptSegment>;\n } | null>(null);\n const base = state.data;\n const overlay = local && local.base === base ? local : null;\n const speakers = overlay?.speakers ?? base?.speakers ?? [];\n const segments = useMemo(() => {\n const original = base?.segments ?? [];\n const changed = overlay?.segments;\n return changed ? original.map((segment) => changed.get(segment.index) ?? segment) : original;\n }, [base, overlay]);\n const versionFor = () => {\n if (!recordingId || !base) throw new Error(\"The transcript is not loaded yet.\");\n return { recordingId, versionId: base.version.id };\n };\n const applySpeakers = (next: RecordingSpeaker[]) =>\n setLocal((previous) => ({\n ...(previous && previous.base === base ? previous : {}),\n base,\n speakers: next,\n }));\n const applySegments = (next: RecordingTranscriptSegment[]) =>\n setLocal((previous) => {\n const kept = previous && previous.base === base ? previous : { base };\n const merged = new Map(kept.segments ?? []);\n for (const segment of next) merged.set(segment.index, segment);\n return { ...kept, base, segments: merged };\n });\n return {\n version: base?.version ?? null,\n speakers,\n segments,\n loading: state.loading,\n error: state.error,\n refresh: state.refresh,\n nameSpeaker: async (label, name) => {\n const target = versionFor();\n const result = await client.updateRecordingSpeakers(\n workspaceId,\n target.recordingId,\n {\n assignments: [\n name === null\n ? { label, personId: null, name: null }\n : \"personId\" in name\n ? { label, personId: name.personId }\n : { label, name: name.name },\n ],\n },\n { versionId: target.versionId },\n );\n applySpeakers(result.speakers);\n },\n rejectSuggestion: async (label) => {\n const target = versionFor();\n const result = await client.updateRecordingSpeakers(\n workspaceId,\n target.recordingId,\n { rejectSuggestions: [{ label }] },\n { versionId: target.versionId },\n );\n applySpeakers(result.speakers);\n },\n moveSegment: async (segmentIndex, label) => {\n const target = versionFor();\n const result = await client.updateRecordingSpeakers(\n workspaceId,\n target.recordingId,\n { segmentOverrides: [{ segmentIndex, label }] },\n { versionId: target.versionId },\n );\n applySpeakers(result.speakers);\n const moved = segments.find((segment) => segment.index === segmentIndex);\n if (moved) applySegments([{ ...moved, speakerLabel: label }]);\n },\n editSegment: async (segmentIndex, text) => {\n const target = versionFor();\n const result = await client.updateRecordingSegments(\n workspaceId,\n target.recordingId,\n { edits: [{ segmentIndex, text }] },\n { versionId: target.versionId },\n );\n applySegments(result.segments);\n },\n };\n}\n\n/** The organization's people directory, to name speakers with. */\nexport function useRecordingPeople(\n options: RecordingsClientOverride & {\n query?: string;\n enabled?: boolean;\n } = {},\n): {\n people: RecordingPerson[];\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (request: CreateRecordingPersonRequest) => Promise<RecordingPerson>;\n /** Agree to have a person's voice remembered (see rememberRecordingPersonVoice). */\n rememberVoice: (\n personId: string,\n consent: RecordingVoiceprintConsent,\n ) => Promise<RecordingPerson>;\n /** Forget a person's voice and withdraw their agreement. */\n forgetVoice: (personId: string) => Promise<RecordingPerson>;\n} {\n const { client, workspaceId } = useEmbeddedRecordings(\n options,\n [\n \"listRecordingPeople\",\n \"createRecordingPerson\",\n \"rememberRecordingPersonVoice\",\n \"forgetRecordingPersonVoice\",\n ],\n \"useRecordingPeople\",\n );\n const query = options.query;\n const load = useCallback(\n async () => await client.listRecordingPeople(workspaceId, query ? { query } : {}),\n [client, workspaceId, query],\n );\n const state = usePolledValue(load, { enabled: options.enabled });\n const refresh = state.refresh;\n return {\n people: state.data ?? [],\n loading: state.loading,\n error: state.error,\n refresh,\n create: useCallback(\n async (request: CreateRecordingPersonRequest) => {\n const person = await client.createRecordingPerson(workspaceId, request);\n await refresh();\n return person;\n },\n [client, workspaceId, refresh],\n ),\n rememberVoice: useCallback(\n async (personId: string, consent: RecordingVoiceprintConsent) => {\n const person = await client.rememberRecordingPersonVoice(workspaceId, personId, {\n consent,\n });\n await refresh();\n return person;\n },\n [client, workspaceId, refresh],\n ),\n forgetVoice: useCallback(\n async (personId: string) => {\n const person = await client.forgetRecordingPersonVoice(workspaceId, personId);\n await refresh();\n return person;\n },\n [client, workspaceId, refresh],\n ),\n };\n}\n\n/**\n * Models this workspace offers, with capabilities, price and the default:\n * `models` make transcripts; `liveModels` stream the live transcript.\n */\nexport function useRecordingModels(\n options: RecordingsClientOverride & { enabled?: boolean } = {},\n): {\n models: ListRecordingModelsResponse[\"models\"];\n liveModels: ListRecordingModelsResponse[\"models\"];\n defaultModel: ListRecordingModelsResponse[\"default\"] | null;\n /** The deployment uses one model for every transcription; workspaces cannot pick. */\n pinned: boolean;\n /**\n * The workspace's meeting language (null detects it), or undefined until\n * the server says, or when it is too old to.\n */\n language: string | null | undefined;\n /**\n * Whether the workspace's recorders start with the live transcript on, or\n * undefined until the server says, or when it is too old to.\n */\n liveTranscript: boolean | undefined;\n loading: boolean;\n error: Error | null;\n} {\n const { client, workspaceId } = useEmbeddedRecordings(\n options,\n [\"listRecordingModels\"],\n \"useRecordingModels\",\n );\n const load = useCallback(\n async () => await client.listRecordingModels(workspaceId),\n [client, workspaceId],\n );\n const state = usePolledValue(load, { enabled: options.enabled });\n const all = state.data?.models;\n const models = useMemo(() => (all ?? []).filter((entry) => entry.capabilities.batch), [all]);\n const liveModels = useMemo(() => (all ?? []).filter((entry) => entry.capabilities.live), [all]);\n return {\n models,\n liveModels,\n defaultModel: state.data?.default ?? null,\n pinned: state.data?.pinned === true,\n language: state.data ? state.data.language : undefined,\n liveTranscript: state.data?.liveTranscript,\n loading: state.loading,\n error: state.error,\n };\n}\n\n// --- Notes -------------------------------------------------------------------\n\n/** How often an open meeting checks for notes someone else, or an agent, saved. */\nconst NOTES_POLL_MS = 15_000;\n\nexport type UseRecordingNotesOptions = RecordingsClientOverride & {\n enabled?: boolean;\n /** Check for notes saved elsewhere this often; default 15 seconds, 0 to never. */\n pollIntervalMs?: number;\n};\n\nexport type UseRecordingNotesResult = {\n /** What people jotted down while the meeting was recorded. */\n notepad: RecordingNote | null;\n /** The written-up summary, decisions and action items. */\n notes: RecordingNote | null;\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n /**\n * Replace the notepad or the notes. The notes are saved against the revision\n * this hook last read, so a newer save made elsewhere fails with 409\n * `notes_changed` instead of being overwritten; the notepad, saved as people\n * type, always wins.\n */\n save: (kind: RecordingNoteKind, body: string) => Promise<RecordingNote>;\n};\n\n/** A meeting's notepad and notes, kept fresh while it is open. */\nexport function useRecordingNotes(\n recordingId: string | null,\n options: UseRecordingNotesOptions = {},\n): UseRecordingNotesResult {\n const { client, workspaceId } = useEmbeddedRecordings(\n options,\n [\"listRecordingNotes\", \"saveRecordingNote\"],\n \"useRecordingNotes\",\n );\n const load = useCallback(\n async () =>\n recordingId ? (await client.listRecordingNotes(workspaceId, recordingId)).notes : [],\n [client, workspaceId, recordingId],\n );\n const pollIntervalMs = options.pollIntervalMs ?? NOTES_POLL_MS;\n const state = usePolledValue(load, {\n enabled: (options.enabled ?? true) && recordingId !== null,\n ...(pollIntervalMs > 0 ? { pollIntervalMs } : {}),\n });\n const notes = state.data ?? [];\n const notepad = notes.find((note) => note.kind === \"notepad\") ?? null;\n const written = notes.find((note) => note.kind === \"notes\") ?? null;\n const writtenRevision = written?.revision ?? 0;\n const refresh = state.refresh;\n return {\n notepad,\n notes: written,\n loading: state.loading,\n error: state.error,\n refresh,\n save: useCallback(\n async (kind: RecordingNoteKind, body: string) => {\n if (!recordingId) throw new Error(\"No recording selected.\");\n const saved = await client.saveRecordingNote(workspaceId, recordingId, kind, {\n body,\n ...(kind === \"notes\" ? { expectedRevision: writtenRevision } : {}),\n });\n await refresh();\n return saved;\n },\n [client, workspaceId, recordingId, writtenRevision, refresh],\n ),\n };\n}\n"],"mappings":"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","names":["recording","versions","require","segments"]}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
useCalmServiceFailure
|
|
4
|
-
} from "./chunk-SVKPSCTH.js";
|
|
5
2
|
import {
|
|
6
3
|
OPEN_WORKSTREAM_CONTROL_EVENT
|
|
7
4
|
} from "./chunk-3IWPC6O3.js";
|
|
5
|
+
import {
|
|
6
|
+
useCalmServiceFailure
|
|
7
|
+
} from "./chunk-SVKPSCTH.js";
|
|
8
8
|
import {
|
|
9
9
|
defaultChatComposerMessages
|
|
10
10
|
} from "./chunk-J4XSTXZP.js";
|
|
11
11
|
import {
|
|
12
12
|
useVoiceInput
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-NTZ5ZNVK.js";
|
|
14
14
|
import {
|
|
15
15
|
shouldRecallQueuedOnKey,
|
|
16
16
|
shouldSteerOnKey,
|
|
17
17
|
shouldSubmitOnKey
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-AZFVRPQM.js";
|
|
19
19
|
import {
|
|
20
20
|
Tooltip,
|
|
21
21
|
TooltipContent,
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
import {
|
|
26
26
|
ShimmerText,
|
|
27
27
|
useLightboxOptional
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-TBWL6YWL.js";
|
|
29
29
|
import {
|
|
30
30
|
COMPOSER_VOICE_INPUT_START_EVENT,
|
|
31
31
|
ComposerFooterSignalProvider,
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
import {
|
|
58
58
|
singleSendText,
|
|
59
59
|
useOpenGeniText
|
|
60
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-7SU4YVZ5.js";
|
|
61
61
|
|
|
62
62
|
// src/commands/registry.ts
|
|
63
63
|
import { formatErrorMessage } from "@opengeni/sdk";
|
|
@@ -2933,4 +2933,4 @@ export {
|
|
|
2933
2933
|
Status,
|
|
2934
2934
|
ComposerTranscriptionControl
|
|
2935
2935
|
};
|
|
2936
|
-
//# sourceMappingURL=chunk-
|
|
2936
|
+
//# sourceMappingURL=chunk-PZQACDH5.js.map
|
|
@@ -3,19 +3,19 @@ import {
|
|
|
3
3
|
capabilityPresentation,
|
|
4
4
|
presentationPermissions
|
|
5
5
|
} from "./chunk-Y6TTMPZC.js";
|
|
6
|
+
import {
|
|
7
|
+
ExcelAddinSetupSteps
|
|
8
|
+
} from "./chunk-ZOP5KSNN.js";
|
|
6
9
|
import {
|
|
7
10
|
McpAuthDiscoveryNotice
|
|
8
11
|
} from "./chunk-PIA6AWYO.js";
|
|
9
12
|
import {
|
|
10
13
|
OwnershipSelector
|
|
11
14
|
} from "./chunk-RTZANSSC.js";
|
|
12
|
-
import {
|
|
13
|
-
ExcelAddinSetupSteps
|
|
14
|
-
} from "./chunk-ZOP5KSNN.js";
|
|
15
15
|
import {
|
|
16
16
|
ConnectorToolPermissions,
|
|
17
17
|
hasConnectorToolPermissionTarget
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-3GWC3FU3.js";
|
|
19
19
|
import {
|
|
20
20
|
OnePasswordCatalogLink
|
|
21
21
|
} from "./chunk-PQI3OK6L.js";
|
|
@@ -978,4 +978,4 @@ export {
|
|
|
978
978
|
CredentialForm,
|
|
979
979
|
ConnectionStatus
|
|
980
980
|
};
|
|
981
|
-
//# sourceMappingURL=chunk-
|
|
981
|
+
//# sourceMappingURL=chunk-PZTS4O6E.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
useActionShortcut
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-4IUOBO2H.js";
|
|
5
5
|
import {
|
|
6
6
|
TooltipWithKeys
|
|
7
7
|
} from "./chunk-OHGG2G3A.js";
|
|
@@ -181,4 +181,4 @@ export {
|
|
|
181
181
|
useWindowBarRow,
|
|
182
182
|
WindowBarPageTitle
|
|
183
183
|
};
|
|
184
|
-
//# sourceMappingURL=chunk-
|
|
184
|
+
//# sourceMappingURL=chunk-Q42QHUAQ.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
NewSessionLink
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-KEBVT55V.js";
|
|
5
5
|
import {
|
|
6
6
|
RAIL_BRAND_LINK_CLASS,
|
|
7
7
|
RailBrandMark,
|
|
@@ -11,13 +11,13 @@ import {
|
|
|
11
11
|
SIDEBAR_TOGGLE_IN_WINDOW_BAR,
|
|
12
12
|
SidebarToggleButton,
|
|
13
13
|
WindowBarControls
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-Q42QHUAQ.js";
|
|
15
15
|
import {
|
|
16
16
|
useActionShortcut
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-4IUOBO2H.js";
|
|
18
18
|
import {
|
|
19
19
|
useRail
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-ZAC7YPRA.js";
|
|
21
21
|
import {
|
|
22
22
|
useSessionUiFeature
|
|
23
23
|
} from "./chunk-FWXMQTVG.js";
|
|
@@ -138,4 +138,4 @@ export {
|
|
|
138
138
|
RailHeader,
|
|
139
139
|
PrimaryNav
|
|
140
140
|
};
|
|
141
|
-
//# sourceMappingURL=chunk-
|
|
141
|
+
//# sourceMappingURL=chunk-QCYGB6TZ.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
classifyProviderFailure,
|
|
7
7
|
failedSessionCopy
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-OEDTCIXF.js";
|
|
9
9
|
import {
|
|
10
10
|
captureAnalyticsEvent
|
|
11
11
|
} from "./chunk-55S3W7RZ.js";
|
|
@@ -169,4 +169,4 @@ export {
|
|
|
169
169
|
createTurnFailureJourney,
|
|
170
170
|
turnFailureJourney
|
|
171
171
|
};
|
|
172
|
-
//# sourceMappingURL=chunk-
|
|
172
|
+
//# sourceMappingURL=chunk-QECMETOF.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
SelectMenu
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VPHPLPDA.js";
|
|
5
5
|
import {
|
|
6
6
|
useSettingRowField
|
|
7
7
|
} from "./chunk-YNF2OC54.js";
|
|
@@ -24,4 +24,4 @@ function RowSelect(props) {
|
|
|
24
24
|
export {
|
|
25
25
|
RowSelect
|
|
26
26
|
};
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
27
|
+
//# sourceMappingURL=chunk-QGX3LE6H.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
ArtifactSandbox
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-D2I33V5P.js";
|
|
5
5
|
import {
|
|
6
6
|
EditablePresentationArtifactSurface
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-3OCU5RX5.js";
|
|
8
8
|
import {
|
|
9
9
|
EditableSpreadsheetArtifactSurface
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-AXHQ7QXV.js";
|
|
11
11
|
import {
|
|
12
12
|
loadSiteSnapshot
|
|
13
13
|
} from "./chunk-IOYHDEP3.js";
|
|
@@ -19,10 +19,10 @@ import {
|
|
|
19
19
|
} from "./chunk-TVQCDDSZ.js";
|
|
20
20
|
import {
|
|
21
21
|
EditableDocumentArtifactSurface
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-YSWPNY6G.js";
|
|
23
23
|
import {
|
|
24
24
|
EditableArtifactMessage
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-YWNNMBZG.js";
|
|
26
26
|
import {
|
|
27
27
|
ArtifactLabelsProvider,
|
|
28
28
|
ArtifactLoading,
|
|
@@ -30,13 +30,13 @@ import {
|
|
|
30
30
|
ArtifactViewerHeader,
|
|
31
31
|
artifactLoadErrorView,
|
|
32
32
|
useArtifactLabels
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-6LXIL3Q3.js";
|
|
34
34
|
import {
|
|
35
35
|
cn
|
|
36
36
|
} from "./chunk-TXS65BB2.js";
|
|
37
37
|
import {
|
|
38
38
|
useOpenGeniText
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-7SU4YVZ5.js";
|
|
40
40
|
|
|
41
41
|
// src/components/artifacts/site-view.tsx
|
|
42
42
|
import {
|
|
@@ -695,4 +695,4 @@ export {
|
|
|
695
695
|
EditableArtifactView,
|
|
696
696
|
SessionArtifactViewer
|
|
697
697
|
};
|
|
698
|
-
//# sourceMappingURL=chunk-
|
|
698
|
+
//# sourceMappingURL=chunk-QI3NDQFP.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
inSentence,
|
|
6
6
|
toDate,
|
|
7
7
|
useMinuteNow
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BVNGDFBC.js";
|
|
9
9
|
import {
|
|
10
10
|
DisabledReason
|
|
11
11
|
} from "./chunk-UX3XHFRX.js";
|
|
@@ -194,7 +194,7 @@ function UsageReadout({
|
|
|
194
194
|
}
|
|
195
195
|
),
|
|
196
196
|
/* @__PURE__ */ jsx(
|
|
197
|
-
|
|
197
|
+
UsageTrack,
|
|
198
198
|
{
|
|
199
199
|
level,
|
|
200
200
|
fill: level === "exhausted" ? 0 : shown,
|
|
@@ -252,7 +252,7 @@ function ResetLine({ level, resetsLabel }) {
|
|
|
252
252
|
resetPhrase(resetsLabel)
|
|
253
253
|
] });
|
|
254
254
|
}
|
|
255
|
-
function
|
|
255
|
+
function UsageTrack({
|
|
256
256
|
level,
|
|
257
257
|
fill,
|
|
258
258
|
className
|
|
@@ -298,7 +298,7 @@ function BarFull({ label, value, level, fill, resetsLabel, loading }) {
|
|
|
298
298
|
"aria-hidden": "true",
|
|
299
299
|
className: "block h-1 rounded-full bg-surface-3 motion-safe:animate-pulse"
|
|
300
300
|
}
|
|
301
|
-
) : /* @__PURE__ */ jsx(
|
|
301
|
+
) : /* @__PURE__ */ jsx(UsageTrack, { level, fill }),
|
|
302
302
|
loading ? /* @__PURE__ */ jsx(
|
|
303
303
|
"span",
|
|
304
304
|
{
|
|
@@ -576,6 +576,7 @@ export {
|
|
|
576
576
|
UsageMeter,
|
|
577
577
|
UsageReadout,
|
|
578
578
|
usageResets,
|
|
579
|
+
UsageTrack,
|
|
579
580
|
UsageMeterGroup
|
|
580
581
|
};
|
|
581
|
-
//# sourceMappingURL=chunk-
|
|
582
|
+
//# sourceMappingURL=chunk-QZE4BTLA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/usage-meter.tsx"],"sourcesContent":["import { CircleAlertIcon, RefreshCwIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport { DisabledReason } from \"./disabled-reason\";\nimport {\n type DateInput,\n formatAbsoluteTime,\n formatShortTime,\n inSentence,\n toDate,\n useMinuteNow,\n} from \"./relative-time\";\nimport { cn } from \"../lib/cn\";\n\n/* ----------------------------------------------------------------------------\n UsageMeter (design brief 7.20) - remaining quota at a glance and in detail.\n\n Subscription windows use their short provider labels (\"5h\", \"Week\",\n \"Fable week\"; lib/subscription-accounts); other meters say what they\n measure (\"Memory\"). Never \"Wk\". Color is\n quiet until it matters: a status tone only below 10% left. Reset times are\n passed in already formatted (\"Mon 28 Sep, 09:00\"); the relative \"Checked\n just now\" line comes from the shared RelativeTime helper.\n\n Three looks, same data:\n - \"bar\" A. 4px bar, \"22% left\" and the reset time. In a row the bar\n drops away and it reads as text: bar in the sheet, text in the row.\n - \"text\" B. \"Week 22% left\", no bar. The quietest.\n - \"ring\" C. A small ring per window. Compact, harder to compare.\n Each has two densities: \"full\" (account sheet) and \"compact\" (a row).\n -------------------------------------------------------------------------- */\n\nexport type UsageMeterVariant = \"bar\" | \"text\" | \"ring\";\nexport type UsageMeterDensity = \"full\" | \"compact\";\nexport type UsageLevel = \"healthy\" | \"low\" | \"exhausted\" | \"unknown\";\n\n/** Below this share left, the meter takes the danger tone. */\nexport const USAGE_LOW_THRESHOLD = 10;\n\n/**\n * The level for a reading. `percent` is what the meter measures: the share\n * left (default) or the share used (machines).\n */\nexport function usageLevel(\n percent: number | null | undefined,\n measure: \"left\" | \"used\" = \"left\",\n lowAt: number = USAGE_LOW_THRESHOLD,\n): UsageLevel {\n if (percent === null || percent === undefined || Number.isNaN(percent)) return \"unknown\";\n const left = measure === \"left\" ? percent : 100 - percent;\n if (left <= 0) return \"exhausted\";\n if (left < lowAt) return \"low\";\n return \"healthy\";\n}\n\n/** Clamps to 0-100 and rounds, so \"21.6\" never shows as \"21.6% left\". */\nexport function clampPercent(percent: number): number {\n return Math.round(Math.min(100, Math.max(0, percent)));\n}\n\n/** The short value text: \"22% left\", \"Limit reached\", \"Not reported yet\". */\nexport function usageValueText(\n percent: number | null | undefined,\n measure: \"left\" | \"used\" = \"left\",\n lowAt: number = USAGE_LOW_THRESHOLD,\n): string {\n const level = usageLevel(percent, measure, lowAt);\n if (level === \"unknown\") return \"Not reported yet\";\n if (level === \"exhausted\") return \"Limit reached\";\n if (percent! > 0 && percent! < 1) return `<1% ${measure}`;\n return `${clampPercent(percent as number)}% ${measure}`;\n}\n\n/**\n * The reset time as it reads after \"Resets\": \"Mon 28 Sep, 09:00\" stays, but\n * \"Today, 17:10\" becomes \"today, 17:10\" mid-sentence.\n */\nexport function resetPhrase(resetsLabel: string): string {\n return /^(Today|Tomorrow|Tonight)\\b/.test(resetsLabel)\n ? resetsLabel.charAt(0).toLowerCase() + resetsLabel.slice(1)\n : resetsLabel;\n}\n\n/** The sentence a screen reader hears for one meter. */\nexport function usageAccessibleText({\n label,\n percent,\n measure = \"left\",\n valueLabel,\n resetsLabel,\n lowAt,\n}: {\n label: string;\n percent: number | null | undefined;\n measure?: \"left\" | \"used\" | undefined;\n valueLabel?: string | undefined;\n resetsLabel?: string | undefined;\n lowAt?: number | undefined;\n}): string {\n const value = valueLabel ?? usageValueText(percent, measure, lowAt);\n const reset = resetsLabel ? `, resets ${resetPhrase(resetsLabel)}` : \"\";\n return `${label}: ${value}${reset}`;\n}\n\nconst LEVEL_FILL: Record<UsageLevel, string> = {\n healthy: \"bg-brand\",\n low: \"bg-danger\",\n exhausted: \"bg-danger\",\n unknown: \"bg-transparent\",\n};\n\nconst LEVEL_STROKE: Record<UsageLevel, string> = {\n healthy: \"text-brand\",\n low: \"text-danger\",\n exhausted: \"text-danger\",\n unknown: \"text-transparent\",\n};\n\nconst LEVEL_VALUE_TEXT: Record<UsageLevel, string> = {\n healthy: \"text-fg-muted\",\n low: \"text-danger\",\n exhausted: \"text-danger\",\n unknown: \"text-fg-subtle\",\n};\n\nexport interface UsageMeterProps {\n /** \"5h\", \"Week\", \"Fable week\", \"Memory\": the window's short label. */\n label: string;\n /** 0-100, or null when the provider hasn't reported a reading. */\n percent: number | null;\n /** What `percent` measures. Quotas count what's left; machines count what's used. */\n measure?: \"left\" | \"used\" | undefined;\n /** Overrides the value text, for example \"5.1 of 16 GB\". */\n valueLabel?: string | undefined;\n /** Explicit provider rejection, independent of a missing or approximate percentage. */\n limitReached?: boolean | undefined;\n /** Formatted reset time, \"Mon 28 Sep, 09:00\". */\n resetsLabel?: string | undefined;\n /** A (bar, default), B (text) or C (ring). */\n variant?: UsageMeterVariant | undefined;\n /** \"full\" in a sheet, \"compact\" in a row. */\n density?: UsageMeterDensity | undefined;\n /** Share left below which the meter turns red. Default 10. */\n lowAt?: number | undefined;\n loading?: boolean | undefined;\n className?: string | undefined;\n}\n\n/** One quota window. */\nexport function UsageMeter({\n label,\n percent,\n measure = \"left\",\n valueLabel,\n limitReached = false,\n resetsLabel,\n variant = \"bar\",\n density = \"full\",\n lowAt = USAGE_LOW_THRESHOLD,\n loading = false,\n className,\n}: UsageMeterProps) {\n const level = limitReached ? \"exhausted\" : usageLevel(percent, measure, lowAt);\n const value =\n valueLabel ?? (limitReached ? \"Limit reached\" : usageValueText(percent, measure, lowAt));\n const hasPercent = percent !== null && Number.isFinite(percent);\n const shown = level === \"unknown\" ? 0 : clampPercent(percent as number);\n const fill = level === \"exhausted\" ? 0 : shown;\n const meterProps =\n loading || !hasPercent\n ? { role: \"group\" as const, \"aria-label\": `${label} usage` }\n : {\n role: \"meter\" as const,\n \"aria-label\": `${label} usage`,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": 100,\n \"aria-valuenow\": Math.min(100, Math.max(0, percent!)),\n \"aria-valuetext\": usageAccessibleText({\n label,\n percent,\n measure,\n valueLabel: value,\n resetsLabel,\n lowAt,\n }),\n };\n const percentDisplay = hasPercent && percent! > 0 && percent! < 1 ? \"<1\" : String(shown);\n const parts = { label, value, level, fill, resetsLabel, loading, hasPercent, percentDisplay };\n const Root = density === \"compact\" ? \"span\" : \"div\";\n\n return (\n <Root\n data-slot=\"usage-meter\"\n data-level={loading ? \"loading\" : level}\n data-variant={variant}\n aria-busy={loading || undefined}\n {...meterProps}\n className={cn(\"min-w-0\", density === \"compact\" && \"inline-flex max-w-full\", className)}\n >\n {variant === \"bar\" ? (\n density === \"full\" ? (\n <BarFull {...parts} />\n ) : (\n <TextCompact {...parts} />\n )\n ) : variant === \"text\" ? (\n density === \"full\" ? (\n <TextFull {...parts} />\n ) : (\n <TextCompact {...parts} />\n )\n ) : density === \"full\" ? (\n <RingFull {...parts} />\n ) : (\n <RingCompact {...parts} />\n )}\n </Root>\n );\n}\n\n/**\n * The usage readout at the end of an account row: \"78% left this week\" and a\n * 64px bar, right-aligned so it sits against the row's chevron, and under it\n * when the limits reset: \"Resets Thu 09:00 · 5h 14:20\". Without a reading\n * it says why in words (\"No usage yet\"). Where the row folds its facts into\n * the meta line (narrow lists), only the words stay.\n */\nexport function UsageReadout({\n percent,\n window: windowLabel,\n resets = NO_RESETS,\n loading = false,\n fallback = \"No usage yet\",\n limitReached = false,\n now: fixedNow,\n className,\n}: {\n /** Share left, 0-100, or null when there is no reading. */\n percent: number | null;\n /** How the window reads after \"left\": \"this week\", \"this period\". */\n window: string;\n /**\n * When the account's limits reset, the shown window's first (no label),\n * then any other window by name. Times already past are left out.\n */\n resets?: readonly UsageReset[] | undefined;\n loading?: boolean | undefined;\n /** Words for a missing reading: \"No usage yet\", \"Usage unavailable\". */\n fallback?: string | undefined;\n limitReached?: boolean | undefined;\n /** The clock reset times are read against. Defaults to the shared minute clock. */\n now?: number | undefined;\n className?: string | undefined;\n}) {\n const level = limitReached ? \"exhausted\" : usageLevel(percent);\n const minuteNow = useMinuteNow();\n const now = fixedNow ?? minuteNow;\n if (loading) {\n return (\n <span\n data-slot=\"usage-readout\"\n aria-busy=\"true\"\n className={cn(\"inline-flex items-center justify-end gap-3\", className)}\n >\n <ValueSkeleton className=\"w-24\" />\n <span\n aria-hidden=\"true\"\n className=\"block h-1 w-16 rounded-full bg-surface-3 motion-safe:animate-pulse @max-[639px]/list:hidden\"\n />\n </span>\n );\n }\n if (level === \"unknown\") {\n return (\n <span data-slot=\"usage-readout\" className={cn(\"text-xs text-fg-subtle\", className)}>\n {fallback}\n </span>\n );\n }\n const shown = percent === null ? 0 : clampPercent(percent);\n const text =\n level === \"exhausted\" ? \"Limit reached\" : `${usageValueText(percent)} ${windowLabel}`;\n const upcoming = resets.filter((reset) => toDate(reset.at).getTime() > now);\n const resetLong = upcoming.length\n ? upcoming\n .map((reset, index) => {\n const at = inSentence(formatAbsoluteTime(reset.at, { now }));\n if (!reset.label) return `${index === 0 ? \"Resets\" : \"resets\"} ${at}`;\n return `${reset.label} resets ${at}`;\n })\n .join(\"; \")\n : null;\n const resetShort = upcoming.length\n ? upcoming\n .map((reset, index) => {\n const at = formatShortTime(reset.at, { now });\n if (!reset.label) return `Resets ${at}`;\n return index === 0 ? `${reset.label} resets ${at}` : `${reset.label} ${at}`;\n })\n .join(\" · \")\n : null;\n const meterProps =\n percent === null\n ? { role: \"group\" as const }\n : {\n role: \"meter\" as const,\n \"aria-valuemin\": 0,\n \"aria-valuemax\": 100,\n \"aria-valuenow\": shown,\n \"aria-valuetext\": `${text}${resetLong ? `. ${resetLong}` : \"\"}`,\n };\n return (\n <span\n data-slot=\"usage-readout\"\n aria-label={`Usage ${windowLabel}`}\n {...meterProps}\n title={resetLong ?? undefined}\n className={cn(\"inline-flex max-w-full min-w-0 flex-col items-end\", className)}\n >\n <span className=\"inline-flex max-w-full min-w-0 items-center justify-end gap-3\">\n <span\n className={cn(\n \"min-w-0 truncate text-xs whitespace-nowrap tabular-nums\",\n LEVEL_VALUE_TEXT[level],\n level !== \"healthy\" && \"font-medium\",\n )}\n >\n {text}\n </span>\n <UsageTrack\n level={level}\n fill={level === \"exhausted\" ? 0 : shown}\n className=\"w-16 shrink-0 @max-[639px]/list:hidden\"\n />\n </span>\n {resetShort ? (\n <span\n data-slot=\"usage-readout-resets\"\n aria-hidden=\"true\"\n className={cn(\n \"max-w-full truncate text-2xs leading-4 whitespace-nowrap tabular-nums @max-[639px]/list:hidden\",\n level === \"exhausted\" ? \"text-fg-muted\" : \"text-fg-subtle\",\n )}\n >\n {resetShort}\n </span>\n ) : null}\n </span>\n );\n}\n\n/** When one quota window resets. Without a label it is the window the readout shows. */\nexport interface UsageReset {\n label?: string | undefined;\n at: DateInput;\n}\n\nconst NO_RESETS: readonly UsageReset[] = [];\n\n/**\n * A readout's resets from an account's windows: the shown window first, then\n * the others that report a reset, in their given order. A window resetting\n * in the same minute as an earlier one adds nothing and is left out.\n */\nexport function usageResets(readings: readonly UsageWindowReading[], shown: string): UsageReset[] {\n const first = readings.find((reading) => reading.label === shown);\n const all: UsageReset[] = [\n ...(first?.resetsAt !== undefined ? [{ at: first.resetsAt }] : []),\n ...readings\n .filter((reading) => reading !== first && reading.resetsAt !== undefined)\n .map((reading) => ({ label: reading.label, at: reading.resetsAt! })),\n ];\n const minutes = new Set<number>();\n return all.filter((reset) => {\n const minute = Math.floor(toDate(reset.at).getTime() / 60_000);\n if (minutes.has(minute)) return false;\n minutes.add(minute);\n return true;\n });\n}\n\ninterface Parts {\n hasPercent: boolean;\n percentDisplay: string;\n label: string;\n value: string;\n level: UsageLevel;\n fill: number;\n resetsLabel?: string | undefined;\n loading: boolean;\n}\n\nfunction ValueSkeleton({ className }: { className?: string }) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"inline-block h-2.5 w-14 rounded-full bg-surface-3 motion-safe:animate-pulse\",\n className,\n )}\n />\n );\n}\n\nfunction ResetLine({ level, resetsLabel }: { level: UsageLevel; resetsLabel?: string }) {\n if (!resetsLabel) return null;\n return (\n <span className={cn(level === \"exhausted\" ? \"text-fg\" : \"text-fg-subtle\")}>\n Resets {resetPhrase(resetsLabel)}\n </span>\n );\n}\n\n/** The 4px bar every usage meter draws, filled to the share it shows. */\nexport function UsageTrack({\n level,\n fill,\n className,\n}: {\n level: UsageLevel;\n fill: number;\n className?: string | undefined;\n}) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"relative block h-1 overflow-hidden rounded-full\",\n level === \"exhausted\" ? \"bg-danger/15\" : \"bg-surface-3\",\n className,\n )}\n >\n <span\n className={cn(\"absolute inset-y-0 left-0 rounded-full\", LEVEL_FILL[level])}\n style={{ width: `${fill}%` }}\n />\n </span>\n );\n}\n\n/* A: bar -------------------------------------------------------------------- */\n\nfunction BarFull({ label, value, level, fill, resetsLabel, loading }: Parts) {\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"flex min-w-0 items-baseline justify-between gap-3\">\n <span className=\"min-w-0 truncate text-sm font-medium text-fg\">{label}</span>\n {loading ? (\n <ValueSkeleton />\n ) : (\n <span\n className={cn(\n \"shrink-0 text-sm whitespace-nowrap tabular-nums\",\n LEVEL_VALUE_TEXT[level],\n level !== \"healthy\" && level !== \"unknown\" && \"font-medium\",\n )}\n >\n {value}\n </span>\n )}\n </div>\n {loading ? (\n <span\n aria-hidden=\"true\"\n className=\"block h-1 rounded-full bg-surface-3 motion-safe:animate-pulse\"\n />\n ) : (\n <UsageTrack level={level} fill={fill} />\n )}\n {loading ? (\n <span\n aria-hidden=\"true\"\n className=\"block h-4.5 w-32 rounded bg-surface-2 motion-safe:animate-pulse\"\n />\n ) : resetsLabel ? (\n <p className=\"text-xs leading-4.5\">\n <ResetLine level={level} resetsLabel={resetsLabel} />\n </p>\n ) : null}\n </div>\n );\n}\n\n/* B: text ------------------------------------------------------------------- */\n\nfunction TextFull({ label, value, level, resetsLabel, loading }: Parts) {\n return (\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-fg\">{label}</p>\n {resetsLabel && !loading ? (\n <p className=\"mt-0.5 text-xs leading-4.5\">\n <ResetLine level={level} resetsLabel={resetsLabel} />\n </p>\n ) : null}\n </div>\n {loading ? (\n <ValueSkeleton className=\"mt-1.5\" />\n ) : (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center gap-1.5 text-sm whitespace-nowrap tabular-nums\",\n level === \"healthy\" ? \"text-fg\" : LEVEL_VALUE_TEXT[level],\n level !== \"unknown\" && \"font-medium\",\n )}\n >\n {level === \"low\" || level === \"exhausted\" ? (\n <span aria-hidden=\"true\" className=\"size-1.5 rounded-full bg-danger\" />\n ) : null}\n {value}\n </span>\n )}\n </div>\n );\n}\n\nfunction TextCompact({ label, value, level, loading }: Parts) {\n return (\n <span className=\"inline-flex max-w-full min-w-0 items-center gap-1 text-xs leading-4 whitespace-nowrap\">\n <span className=\"text-fg-subtle\">{label}</span>\n {loading ? (\n <ValueSkeleton className=\"w-10\" />\n ) : (\n <span\n className={cn(\n \"tabular-nums\",\n LEVEL_VALUE_TEXT[level],\n level !== \"healthy\" && \"font-medium\",\n )}\n >\n {value}\n </span>\n )}\n </span>\n );\n}\n\n/* C: ring ------------------------------------------------------------------- */\n\nfunction Ring({\n level,\n fill,\n size,\n loading,\n children,\n}: {\n level: UsageLevel;\n fill: number;\n size: number;\n loading: boolean;\n children?: ReactNode | undefined;\n}) {\n const stroke = size >= 32 ? 3 : 2.5;\n const radius = (size - stroke) / 2;\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"relative inline-grid shrink-0 place-items-center\",\n loading && \"motion-safe:animate-pulse\",\n )}\n style={{ width: size, height: size }}\n >\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`} className=\"-rotate-90\">\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n className={level === \"exhausted\" ? \"stroke-danger/20\" : \"stroke-surface-3\"}\n />\n {!loading && fill > 0 ? (\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n pathLength={100}\n strokeDasharray={`${fill} 100`}\n className={cn(\"stroke-current\", LEVEL_STROKE[level])}\n />\n ) : null}\n </svg>\n {children ? (\n <span className=\"absolute inset-0 grid place-items-center\">{children}</span>\n ) : null}\n </span>\n );\n}\n\nfunction RingFull({\n label,\n value,\n level,\n fill,\n resetsLabel,\n loading,\n hasPercent,\n percentDisplay,\n}: Parts) {\n const center =\n !hasPercent || loading ? null : (\n <span\n className={cn(\n \"text-2xs font-semibold tabular-nums\",\n level === \"healthy\" ? \"text-fg\" : \"text-danger\",\n )}\n >\n {percentDisplay}%\n </span>\n );\n return (\n <div className=\"flex min-w-0 items-center gap-3\">\n <Ring level={level} fill={fill} size={44} loading={loading}>\n {center}\n </Ring>\n <div className=\"min-w-0 text-xs leading-4.5\">\n <p className=\"truncate text-sm leading-5 font-medium text-fg\">{label}</p>\n {loading ? (\n <ValueSkeleton className=\"mt-1\" />\n ) : (\n <>\n <p className={cn(LEVEL_VALUE_TEXT[level], level !== \"healthy\" && \"font-medium\")}>\n {value}\n </p>\n {resetsLabel ? (\n <p>\n <ResetLine level={level} resetsLabel={resetsLabel} />\n </p>\n ) : null}\n </>\n )}\n </div>\n </div>\n );\n}\n\nfunction RingCompact({ label, value, level, fill, loading }: Parts) {\n return (\n <span className=\"inline-flex max-w-full min-w-0 items-center gap-1.5 text-xs leading-4 whitespace-nowrap\">\n <Ring level={level} fill={fill} size={14} loading={loading} />\n <span className=\"text-fg-subtle\">{label}</span>\n {loading ? (\n <ValueSkeleton className=\"w-10\" />\n ) : (\n <span\n className={cn(\n \"tabular-nums\",\n LEVEL_VALUE_TEXT[level],\n level !== \"healthy\" && \"font-medium\",\n )}\n >\n {value}\n </span>\n )}\n </span>\n );\n}\n\n/* Group --------------------------------------------------------------------- */\n\nexport interface UsageWindowReading {\n label: string;\n percent: number | null;\n resetsLabel?: string | undefined;\n /** The reset time `resetsLabel` formats, for places that format it themselves. */\n resetsAt?: number | undefined;\n limitReached?: boolean | undefined;\n valueLabel?: string | undefined;\n}\n\nexport interface UsageMeterGroupProps {\n windows: UsageWindowReading[];\n variant?: UsageMeterVariant | undefined;\n density?: UsageMeterDensity | undefined;\n /** \"Checked just now\". Pass a RelativeTime for the exact time on hover. */\n checked?: ReactNode | undefined;\n /** Shows a refresh button next to `checked`. */\n onRefresh?: (() => void) | undefined;\n refreshing?: boolean | undefined;\n /** Disables the refresh button and explains why, for example a reconnect. */\n refreshDisabledReason?: ReactNode | undefined;\n /** Replaces the footer line when the last check failed. */\n error?: ReactNode | undefined;\n loading?: boolean | undefined;\n className?: string | undefined;\n}\n\n/**\n * Every window of one account: stacked in a sheet, inline in a row. The\n * footer carries when it was checked and a refresh button.\n */\nexport function UsageMeterGroup({\n windows,\n variant = \"bar\",\n density = \"full\",\n checked,\n onRefresh,\n refreshing = false,\n refreshDisabledReason,\n error,\n loading = false,\n className,\n}: UsageMeterGroupProps) {\n if (density === \"compact\") {\n return (\n <span\n data-slot=\"usage-meter-group\"\n className={cn(\n \"inline-flex max-w-full min-w-0 flex-wrap items-center gap-x-3 gap-y-1\",\n className,\n )}\n >\n {windows.map((reading) => (\n <UsageMeter\n key={reading.label}\n label={reading.label}\n percent={reading.percent}\n limitReached={reading.limitReached}\n valueLabel={reading.valueLabel}\n resetsLabel={reading.resetsLabel}\n variant={variant}\n density=\"compact\"\n loading={loading}\n />\n ))}\n </span>\n );\n }\n\n return (\n <div\n data-slot=\"usage-meter-group\"\n className={cn(\"@container flex min-w-0 flex-col gap-4\", className)}\n >\n <div\n className={cn(\n \"grid min-w-0\",\n variant === \"ring\" ? \"gap-4 @sm:grid-cols-2\" : variant === \"text\" ? \"gap-3\" : \"gap-4\",\n )}\n >\n {windows.map((reading) => (\n <UsageMeter\n key={reading.label}\n label={reading.label}\n percent={reading.percent}\n limitReached={reading.limitReached}\n valueLabel={reading.valueLabel}\n resetsLabel={reading.resetsLabel}\n variant={variant}\n density=\"full\"\n loading={loading}\n />\n ))}\n </div>\n {error || checked || onRefresh ? (\n <div className=\"flex min-h-8 min-w-0 items-center justify-between gap-3\">\n <p\n aria-live=\"polite\"\n className={cn(\n \"flex min-w-0 items-start gap-1.5 text-xs leading-4.5\",\n error && !refreshing ? \"text-fg-muted\" : \"text-fg-subtle\",\n )}\n >\n {error && !refreshing ? (\n <CircleAlertIcon\n aria-hidden=\"true\"\n className=\"mt-0.5 size-3.5 shrink-0 text-danger\"\n />\n ) : null}\n <span className=\"min-w-0\">{refreshing ? \"Checking usage…\" : (error ?? checked)}</span>\n </p>\n {onRefresh ? (\n <DisabledReason\n reason={refreshDisabledReason}\n disabled={Boolean(refreshDisabledReason)}\n >\n {/* aria-disabled, not disabled, while checking: a disabled button drops keyboard focus. */}\n <button\n type=\"button\"\n onClick={refreshing ? undefined : onRefresh}\n aria-disabled={refreshing || undefined}\n aria-label=\"Check usage now\"\n className=\"-mr-2 inline-grid size-8 shrink-0 place-items-center rounded-md text-fg-subtle transition-colors duration-[120ms] hover:bg-surface-2 hover:text-fg aria-disabled:cursor-default aria-disabled:hover:bg-transparent aria-disabled:hover:text-fg-subtle pointer-coarse:-mr-3.5 pointer-coarse:size-11\"\n >\n <RefreshCwIcon\n aria-hidden=\"true\"\n className={cn(\"size-4\", refreshing && \"motion-safe:animate-spin\")}\n />\n </button>\n </DisabledReason>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
authorizedWorkspaceFromList
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-7SFSN6AX.js";
|
|
5
5
|
|
|
6
6
|
// src/app/lib/workspace-navigation-preference.tsx
|
|
7
7
|
var WORKSPACE_NAVIGATION_PREFERENCE_VERSION = 1;
|
|
@@ -118,4 +118,4 @@ export {
|
|
|
118
118
|
isAuthorizedWorkspaceId,
|
|
119
119
|
resolveLandingWorkspaceId
|
|
120
120
|
};
|
|
121
|
-
//# sourceMappingURL=chunk-
|
|
121
|
+
//# sourceMappingURL=chunk-RA3Q52O2.js.map
|