@opengeni/react 6.8.0 → 6.8.1-canary.41842879332001
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 +47 -47
- 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 +32 -32
- package/dist/app/components/command-menu/command-menu.js +36 -36
- 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/credit-required-gate.js +1 -1
- package/dist/app/components/credit-required-prompt.js +3 -3
- 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/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 +73 -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 +6 -6
- 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 +156 -156
- package/dist/app/lib/actions/actions-provider.js +8 -8
- 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/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 +94 -94
- 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-H7PKY67P.js} +4 -4
- package/dist/{chat-interactive-block-VSDD6X3M.js → chat-interactive-block-47TCT4DN.js} +5 -5
- package/dist/{chunk-7Z76QP64.js → chunk-2QH3Q6Z2.js} +35 -5
- package/dist/chunk-2QH3Q6Z2.js.map +1 -0
- package/dist/{chunk-5MHMCE2G.js → chunk-2X2B6D5G.js} +3 -3
- package/dist/{chunk-OCXEY7HE.js → chunk-3BUI5DT7.js} +2 -2
- package/dist/{chunk-OSJ366KR.js → chunk-3FWP3TD3.js} +29 -29
- package/dist/{chunk-PWUSSSSL.js → chunk-3G5IA36N.js} +2 -2
- package/dist/{chunk-RGR57NYY.js → chunk-3NK4JAHL.js} +2 -2
- package/dist/{chunk-XUOYNJPB.js → chunk-3O7UZRWM.js} +24 -24
- package/dist/{chunk-JV3UI7BH.js → chunk-3OR6HMA4.js} +3 -3
- package/dist/{chunk-MV2CLIO6.js → chunk-3PC45I5N.js} +6 -6
- package/dist/{chunk-SJYTQLN3.js → chunk-3PI2BYK5.js} +3 -3
- package/dist/{chunk-DCEQCGVN.js → chunk-3PNA2P2Z.js} +2 -2
- package/dist/{chunk-ESXAECZ3.js → chunk-3XBZKF3K.js} +2 -2
- package/dist/{chunk-SBXSKRFA.js → chunk-45OGYO3S.js} +3 -3
- package/dist/{chunk-M3FDGRB4.js → chunk-4A7TKVNX.js} +3 -3
- package/dist/{chunk-RHXYO4H2.js → chunk-4BXRGXTD.js} +2 -2
- package/dist/{chunk-CV4VVLPZ.js → chunk-4HQAJA3T.js} +2 -2
- package/dist/{chunk-VCJQQYRE.js → chunk-4X2A3KPB.js} +4 -4
- package/dist/{chunk-OCXTTKVA.js → chunk-555K37A7.js} +2 -2
- package/dist/{chunk-EBIVTDEG.js → chunk-57L5ZXDS.js} +2 -2
- package/dist/{chunk-3L465FBR.js → chunk-5IADORIV.js} +6 -6
- package/dist/{chunk-SK5S2PCK.js → chunk-5IZQT4TE.js} +14 -14
- package/dist/chunk-5IZQT4TE.js.map +1 -0
- 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-PVB4YVDP.js → chunk-5Y2O2432.js} +2 -2
- package/dist/{chunk-OOOSGPJL.js → chunk-6572EFE4.js} +1 -1
- package/dist/{chunk-YMI27QPF.js → chunk-6BG5HCUP.js} +2 -2
- package/dist/{chunk-QRECBCJM.js → chunk-6EXFJWII.js} +2 -2
- package/dist/{chunk-74CBR5YE.js → chunk-6PNRUGOK.js} +2 -2
- package/dist/{chunk-PUUEI4W3.js → chunk-6RJEY6TC.js} +5 -5
- package/dist/{chunk-DLVIRJGK.js → chunk-727GL2YY.js} +2 -2
- package/dist/{chunk-J2BTILRR.js → chunk-7FGYLFW6.js} +2 -2
- package/dist/{chunk-MKDFYE2E.js → chunk-7IMWTFEG.js} +2 -2
- package/dist/{chunk-FER6EVIY.js → chunk-7POKH54R.js} +2 -2
- package/dist/{chunk-H6BX6WOW.js → chunk-7T26IH6W.js} +3 -3
- package/dist/{chunk-R33SBMB7.js → chunk-7XQRVZZQ.js} +3 -3
- package/dist/{chunk-NFCS5WYC.js → chunk-A3SPPXMC.js} +3 -3
- package/dist/{chunk-DQPIEQGP.js → chunk-A7CWPDEH.js} +2 -2
- package/dist/{chunk-3PM3M2Q6.js → chunk-AGOYVKTI.js} +2 -2
- package/dist/{chunk-OBGOLHCP.js → chunk-AIQKZUPB.js} +3 -3
- package/dist/{chunk-GSCGKJNK.js → chunk-AMYDHG3S.js} +2 -2
- package/dist/{chunk-U4LTPFD2.js → chunk-APJPB6TX.js} +2 -2
- package/dist/{chunk-SP44O3OU.js → chunk-APLGT5EI.js} +2 -2
- package/dist/{chunk-M3HGBO2Y.js → chunk-ATNKMGLO.js} +1 -1
- package/dist/{chunk-4O2XWOLZ.js → chunk-AVX4CZQ3.js} +3 -3
- package/dist/{chunk-CXAN2FHF.js → chunk-B46MK44K.js} +6 -6
- package/dist/{chunk-RMCLFSMX.js → chunk-BBKUPEGG.js} +2 -2
- package/dist/{chunk-J2WY42FA.js → chunk-BES6OQE3.js} +2 -2
- package/dist/{chunk-GU7T2S5N.js → chunk-BM2N26SH.js} +2 -2
- package/dist/{chunk-HEGV4QMS.js → chunk-C3NS74PZ.js} +2 -2
- package/dist/{chunk-752WXSDN.js → chunk-C56ABB5V.js} +2 -2
- package/dist/{chunk-77SYIH6O.js → chunk-C6MATJQ5.js} +2 -2
- package/dist/{chunk-KUE5BOQE.js → chunk-CRX47CO6.js} +4 -4
- package/dist/{chunk-QPQ7R77C.js → chunk-CUIV2XPO.js} +3 -1
- package/dist/chunk-CUIV2XPO.js.map +1 -0
- package/dist/{chunk-GTHCHCWW.js → chunk-D33KWZQJ.js} +3 -3
- package/dist/{chunk-AH3DGOTK.js → chunk-D7E3BSCX.js} +2 -2
- package/dist/{chunk-OJWDNNW3.js → chunk-DFR3TMTZ.js} +5 -5
- package/dist/{chunk-WYGTAQMX.js → chunk-DICC75CU.js} +2 -2
- package/dist/{chunk-736RUNIA.js → chunk-DJ2LMKKX.js} +4 -4
- package/dist/{chunk-4F3AEJI6.js → chunk-DJI4D7PM.js} +4 -4
- package/dist/{chunk-LVELUUK6.js → chunk-DSZUQL4W.js} +2 -2
- package/dist/{chunk-MT2R57SF.js → chunk-DVF246BE.js} +2 -2
- package/dist/{chunk-OI6VI6SU.js → chunk-DVOWBHWN.js} +8 -8
- package/dist/{chunk-PZKHST7A.js → chunk-E2KPRSA4.js} +2 -2
- package/dist/{chunk-EKJHOWTZ.js → chunk-E3LMLWEB.js} +4 -4
- package/dist/{chunk-QURYQFDN.js → chunk-EDC7X7PW.js} +2 -2
- package/dist/{chunk-HYEIA25Y.js → chunk-EDSMULHU.js} +2 -2
- package/dist/{chunk-U6552Q3T.js → chunk-EQQOZ6DD.js} +2 -2
- package/dist/{chunk-IFSXVU2S.js → chunk-ERBDQ2GY.js} +2 -2
- package/dist/{chunk-IZXYFWA4.js → chunk-EWI73URG.js} +13 -13
- package/dist/{chunk-N3FM4BNA.js → chunk-EZ6LFN33.js} +2 -2
- package/dist/{chunk-4K64EKM7.js → chunk-F7YL6DPR.js} +4 -4
- package/dist/{chunk-ICAMYP5M.js → chunk-FIGFXMUP.js} +2 -2
- package/dist/{chunk-54U6ZBEX.js → chunk-FJRJK67G.js} +3 -3
- package/dist/{chunk-E5KOWRDU.js → chunk-FLHB2NZT.js} +2 -2
- package/dist/{chunk-OWET7EY2.js → chunk-FRSZSL2S.js} +19 -13
- package/dist/{chunk-OWET7EY2.js.map → chunk-FRSZSL2S.js.map} +1 -1
- package/dist/{chunk-D3PTVN2I.js → chunk-FUGGM76A.js} +2 -2
- package/dist/{chunk-QQIZMVAJ.js → chunk-FWLLGNGP.js} +51 -49
- package/dist/chunk-FWLLGNGP.js.map +1 -0
- package/dist/{chunk-TDTD66BK.js → chunk-FXPZAZYT.js} +2 -2
- package/dist/{chunk-KO3OHHY2.js → chunk-GAGAM4MT.js} +2 -2
- package/dist/{chunk-TK5FWVZR.js → chunk-GESGH3HY.js} +3 -3
- package/dist/{chunk-2VJOSU4H.js → chunk-GI4PWKXI.js} +2 -2
- package/dist/{chunk-KFNZZ2N6.js → chunk-GJTEBAZ7.js} +2 -2
- package/dist/{chunk-LTJFV2JI.js → chunk-GNCGEW7F.js} +2 -2
- package/dist/{chunk-34NV52R3.js → chunk-GOMUNPB6.js} +4 -4
- package/dist/{chunk-7YTR3UFO.js → chunk-GPWE5UD7.js} +8 -5
- package/dist/chunk-GPWE5UD7.js.map +1 -0
- package/dist/{chunk-LIJNVIT3.js → chunk-GUMUILEI.js} +3 -3
- package/dist/{chunk-7NLF35YL.js → chunk-GVGNHBFT.js} +4 -4
- package/dist/{chunk-K3D7IQQP.js → chunk-GW4YI3FB.js} +6 -6
- package/dist/{chunk-D5TIVCXG.js → chunk-GXKCV7X7.js} +2 -2
- package/dist/{chunk-2J77TWGH.js → chunk-H467EQA6.js} +3 -3
- package/dist/{chunk-3OK7Y6ES.js → chunk-HE77VDDR.js} +2 -2
- package/dist/{chunk-UO35OEOX.js → chunk-HT65RGCX.js} +3 -3
- package/dist/{chunk-G6ICCGJ3.js → chunk-HVQSFTE7.js} +2 -2
- package/dist/{chunk-G5UQBTXY.js → chunk-HXJPDC76.js} +2 -2
- package/dist/{chunk-GIWFLWXG.js → chunk-I6LQW24C.js} +4 -4
- package/dist/{chunk-467WDSOK.js → chunk-I7A6S5YL.js} +2 -2
- package/dist/{chunk-AAS7OWV6.js → chunk-IADS4ZYD.js} +3 -3
- package/dist/{chunk-Y3XZEKDQ.js → chunk-IJWMWCGR.js} +2 -2
- package/dist/{chunk-SGH7I7OY.js → chunk-IWFO6KOU.js} +2 -2
- package/dist/{chunk-GMHIOYB7.js → chunk-IYC6QGV2.js} +4 -4
- package/dist/{chunk-2OXSB2OL.js → chunk-J2TZIFRC.js} +3 -2
- package/dist/chunk-J2TZIFRC.js.map +1 -0
- package/dist/{chunk-3NNAC43A.js → chunk-J5AODKJO.js} +2 -2
- package/dist/{chunk-DIP7YALH.js → chunk-JKI3LMLH.js} +2 -2
- package/dist/{chunk-IJR6VOLU.js → chunk-JSYRWOCE.js} +2 -2
- package/dist/{chunk-CEMSIU4Z.js → chunk-JTQTWO4D.js} +5 -5
- package/dist/{chunk-JHZRAYI4.js → chunk-JWSRFXRN.js} +2 -2
- package/dist/chunk-JWSRFXRN.js.map +1 -0
- package/dist/{chunk-BASI553K.js → chunk-KBTKAAHM.js} +4 -4
- package/dist/{chunk-OYOFPNLC.js → chunk-KD7VEMWY.js} +4 -4
- package/dist/{chunk-3DRLCX5V.js → chunk-KPGFGRSA.js} +2 -2
- package/dist/{chunk-PLYVGZIN.js → chunk-KWFDEJFI.js} +1 -1
- package/dist/{chunk-FNXCFIPW.js → chunk-KYLEH4OF.js} +2 -2
- package/dist/{chunk-WXF2RTS4.js → chunk-L7FJTFJN.js} +2 -2
- package/dist/{chunk-KI46GKMD.js → chunk-L7VVQOSY.js} +7 -7
- package/dist/{chunk-M5IQVMLR.js → chunk-LAZ2QZTJ.js} +11 -4
- package/dist/chunk-LAZ2QZTJ.js.map +1 -0
- package/dist/chunk-LKLQVANM.js +2 -0
- package/dist/{chunk-YNTLWCF4.js → chunk-LLYEAZ4E.js} +3 -3
- package/dist/{chunk-4Z5X7PLC.js → chunk-LWM7JUW6.js} +3 -3
- package/dist/{chunk-CHU3RDV4.js → chunk-LXKV4ND3.js} +3 -3
- package/dist/{chunk-AB5IW227.js → chunk-LYLICEQO.js} +3 -3
- package/dist/{chunk-PSM3CU7N.js → chunk-M3OZOCIK.js} +46 -39
- package/dist/chunk-M3OZOCIK.js.map +1 -0
- package/dist/{chunk-OTW25A6I.js → chunk-M5GRI5K4.js} +3 -3
- package/dist/{chunk-X2QJXDE4.js → chunk-MF65PKKF.js} +8 -8
- package/dist/{chunk-EDDKPIIV.js → chunk-MJ4XIOPM.js} +2 -2
- package/dist/{chunk-FLWQJDJ5.js → chunk-MMPJJQG3.js} +6 -6
- package/dist/{chunk-T67LTMSW.js → chunk-MOU54FGD.js} +10 -10
- package/dist/{chunk-LQKVNREV.js → chunk-NAWHQ4IL.js} +3 -3
- package/dist/{chunk-ZBHGNE2J.js → chunk-NBHBB2VV.js} +3 -3
- package/dist/{chunk-PF2WU2IL.js → chunk-ND4IQJUM.js} +120 -17
- package/dist/chunk-ND4IQJUM.js.map +1 -0
- package/dist/{chunk-U5UGM5XD.js → chunk-NMOZDAEZ.js} +5 -5
- package/dist/{chunk-D74Z2N4K.js → chunk-NZA4R3BE.js} +2 -2
- package/dist/{chunk-WRMUXZ7C.js → chunk-OB2CX7PJ.js} +3 -3
- package/dist/{chunk-YJSCLGAW.js → chunk-OB4I4OIT.js} +3 -3
- package/dist/{chunk-DWJ6J3YW.js → chunk-OKQW2FPL.js} +4 -4
- package/dist/{chunk-2GCHGWNE.js → chunk-ORLX6A3C.js} +3 -3
- package/dist/{chunk-EBTUPRRQ.js → chunk-P5N4EYFW.js} +4 -4
- package/dist/{chunk-JKL5S7UQ.js → chunk-PL4JE3NI.js} +6 -6
- package/dist/{chunk-OP2GD6QW.js → chunk-PNUHKDY2.js} +2 -2
- package/dist/{chunk-MZY3VKKM.js → chunk-PWJE7D6V.js} +2 -2
- package/dist/{chunk-RISUROBM.js → chunk-PYE27I6J.js} +4 -4
- package/dist/{chunk-SPD4ULVB.js → chunk-PYMROAWS.js} +2 -1
- package/dist/chunk-PYMROAWS.js.map +1 -0
- package/dist/{chunk-Q5K2J5GG.js → chunk-Q74FQK3A.js} +13 -3
- package/dist/chunk-Q74FQK3A.js.map +1 -0
- package/dist/{chunk-R5QAL43H.js → chunk-QIJHK6P4.js} +2 -2
- package/dist/{chunk-AJBDAVX3.js → chunk-QK3A23NP.js} +7 -7
- package/dist/{chunk-CYDXCILL.js → chunk-QLWDNAOV.js} +7 -7
- package/dist/{chunk-BQYRZIZ7.js → chunk-QS6DQBVJ.js} +2 -2
- package/dist/{chunk-3PZ3LRPV.js → chunk-QSUVFPG3.js} +3 -3
- package/dist/{chunk-PYB4BFEC.js → chunk-QUC5MLTN.js} +3 -3
- package/dist/{chunk-WDASYY4S.js → chunk-QVT5AWPI.js} +6 -6
- package/dist/{chunk-K4DQS2ML.js → chunk-QZC6WCBR.js} +4 -4
- package/dist/{chunk-HWVPLFIW.js → chunk-RAHNICPP.js} +2 -2
- package/dist/{chunk-H6MJFMHZ.js → chunk-RME6RGIW.js} +3 -3
- package/dist/{chunk-XMBOLFFS.js → chunk-RQIB2F53.js} +2 -2
- package/dist/{chunk-OXQ2SXVC.js → chunk-RUA72NQY.js} +2 -2
- package/dist/{chunk-UMX6DZME.js → chunk-SCJHWN4X.js} +2 -2
- package/dist/{chunk-HTMQGS63.js → chunk-SIXBDT5F.js} +8 -8
- package/dist/{chunk-ZAX4XQLN.js → chunk-SPK3T4JK.js} +2 -2
- package/dist/{chunk-WTSQUCHB.js → chunk-SSN2YSST.js} +3 -3
- package/dist/{chunk-5MIBQ4P5.js → chunk-SYJCDX5V.js} +2 -2
- package/dist/{chunk-NQ2CPQJF.js → chunk-SYL7LCRA.js} +26 -3
- package/dist/chunk-SYL7LCRA.js.map +1 -0
- package/dist/{chunk-ZR5EKJT6.js → chunk-T6276OXI.js} +2 -2
- package/dist/{chunk-DEHLWZSI.js → chunk-T7OARG4N.js} +4 -4
- package/dist/{chunk-77BHKC43.js → chunk-TF5L3BEV.js} +1 -1
- package/dist/{chunk-GOCODNQS.js → chunk-TF6Z7BOP.js} +2 -2
- package/dist/{chunk-WIFDNUKD.js → chunk-TJDXWZMO.js} +3 -3
- package/dist/{chunk-SFIXTOOJ.js → chunk-TL5ATBHZ.js} +3 -3
- package/dist/{chunk-XZCCEKPW.js → chunk-TMOHIOMT.js} +6 -6
- package/dist/{chunk-AVXDIRRW.js → chunk-UI5X63YC.js} +2 -2
- package/dist/{chunk-6QK65ZWM.js → chunk-UIY7BDZC.js} +3 -3
- package/dist/{chunk-VATYK3JQ.js → chunk-UMBFMEO7.js} +3 -3
- package/dist/{chunk-UU5FBVRX.js → chunk-UU5G7OA4.js} +2 -2
- package/dist/{chunk-EGKARC53.js → chunk-UZUCYCF4.js} +2 -2
- package/dist/{chunk-LPKJ77EK.js → chunk-V2A7G7S7.js} +2 -2
- package/dist/{chunk-CH4UQ4NO.js → chunk-V5G4TKRC.js} +5 -5
- package/dist/{chunk-UBRQ3PQD.js → chunk-VKAVW34W.js} +2 -2
- package/dist/{chunk-JV5ULONH.js → chunk-VVLEVNTQ.js} +36 -36
- package/dist/{chunk-44JWVYJB.js → chunk-VW7X7TWZ.js} +2 -2
- package/dist/{chunk-3CDJSKDW.js → chunk-VWA2CHSL.js} +3 -3
- package/dist/{chunk-IN3VQFKS.js → chunk-W43HZPM7.js} +2 -2
- package/dist/{chunk-SXGJL7UT.js → chunk-WHGD7Q2L.js} +14 -14
- package/dist/{chunk-XOIDUM2H.js → chunk-WNXKYEVN.js} +1 -1
- package/dist/{chunk-TKQL7EDB.js → chunk-WSA7UBX4.js} +2 -2
- package/dist/{chunk-AJDGP2N4.js → chunk-WZ5TQJ3T.js} +19 -19
- package/dist/{chunk-FBA2NXYH.js → chunk-X3TGNSOG.js} +3 -3
- package/dist/{chunk-R4JA5JFI.js → chunk-X4WXYI3N.js} +3 -3
- package/dist/{chunk-Q5EZNBPI.js → chunk-XIQ3AIAJ.js} +3 -3
- package/dist/{chunk-S27VZ5DO.js → chunk-XWYT4LEL.js} +6 -6
- package/dist/{chunk-477DTTMH.js → chunk-Y3PU75OC.js} +3 -3
- package/dist/{chunk-4JXPLTWV.js → chunk-Y5ZWX5YS.js} +2 -2
- package/dist/{chunk-4BWMAGJJ.js → chunk-YA5PABND.js} +3 -3
- package/dist/{chunk-VXORMNU4.js → chunk-YBHAAULA.js} +67 -2
- package/dist/chunk-YBHAAULA.js.map +1 -0
- package/dist/{chunk-OGU73VUN.js → chunk-YBPRR2QS.js} +2 -2
- package/dist/{chunk-TNSJFZ6Q.js → chunk-YDYR7XQE.js} +4 -4
- package/dist/{chunk-GTRAH4FG.js → chunk-YG6V2LQH.js} +2 -2
- package/dist/{chunk-XVLEBB4Y.js → chunk-YUXA7ALE.js} +2 -2
- package/dist/{chunk-SN2WENRP.js → chunk-YWHQDXPB.js} +3 -3
- package/dist/{chunk-BFFNINCC.js → chunk-YWRR5R7B.js} +3 -3
- package/dist/{chunk-FSDQQQIA.js → chunk-YYRK7A4N.js} +3 -3
- package/dist/{chunk-MRECRNVU.js → chunk-Z26CDLUV.js} +5 -5
- package/dist/{chunk-OYCK4JRS.js → chunk-Z27EXLMQ.js} +2 -2
- package/dist/{chunk-UTRNLNCW.js → chunk-Z7GDH7W2.js} +3 -3
- package/dist/{chunk-PRT4J2DL.js → chunk-ZGVLSAWL.js} +2 -2
- package/dist/{chunk-OK7BQMCI.js → chunk-ZM6Q5NQN.js} +9 -9
- package/dist/components/message-timeline.d.ts +10 -2
- package/dist/composer.js +8 -8
- package/dist/{computer-viewer-5LKRCEVQ.js → computer-viewer-SROXREYD.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-EIQY2VBF.js} +5 -5
- package/dist/{embedded-voice-ASQXBSTX.js → embedded-voice-LMWNH7F7.js} +5 -5
- package/dist/{fleet-decision-row-U7LDVBEM.js → fleet-decision-row-X2G56ZRA.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 +22 -21
- package/dist/meetings.js.map +1 -1
- package/dist/messages/en.d.ts +2 -0
- package/dist/messages.js +1 -1
- package/dist/{model-policy-picker-menu-E6XKMFTA.js → model-policy-picker-menu-SHWPT5VA.js} +4 -4
- package/dist/{payment-page-card-DJDKV2LW.js → payment-page-card-NNVUISN4.js} +4 -4
- package/dist/{platform-activity-row-MSDCSMET.js → platform-activity-row-7UDWSAHK.js} +2 -2
- package/dist/{queue-surface-implementation-GUAIG6TK.js → queue-surface-implementation-BUXSO24N.js} +5 -5
- package/dist/realtime.js +4 -4
- package/dist/{recorder-host-2MYDJPQW.js → recorder-host-POX54CFT.js} +5 -5
- package/dist/recordings.js +4 -4
- package/dist/{sandbox-files-W5W2LW4K.js → sandbox-files-33QD7DW2.js} +6 -6
- package/dist/session-app.js +156 -156
- package/dist/{session-connect-cards-HPH7JOZP.js → session-connect-cards-CXGNVA2A.js} +9 -9
- package/dist/session-list-model.js +2 -2
- package/dist/{session-realtime-SDTKFFIR.js → session-realtime-CVDSEULB.js} +3 -3
- 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-5J5TM5IP.js} +2 -2
- package/dist/{timeline-annotation-selection-MBCIDO2Q.js → timeline-annotation-selection-WLY7FB7F.js} +2 -2
- package/dist/{timeline-annotations-dialog-JPNKLOTE.js → timeline-annotations-dialog-67VRFKJU.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.js +3 -3
- package/dist/usage.js +2 -2
- package/dist/workbench.js +4 -4
- package/package.json +6 -5
- package/src/app/components/rail/session-row-content.tsx +27 -0
- 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/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-recordings.ts +5 -0
- package/src/index.ts +5 -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 +2 -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/dist/chunk-2OXSB2OL.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-PF2WU2IL.js.map +0 -1
- package/dist/chunk-PSM3CU7N.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-VXORMNU4.js.map +0 -1
- /package/dist/{browser-viewer-ZHQDVHZ2.js.map → browser-viewer-H7PKY67P.js.map} +0 -0
- /package/dist/{chat-interactive-block-VSDD6X3M.js.map → chat-interactive-block-47TCT4DN.js.map} +0 -0
- /package/dist/{chunk-5MHMCE2G.js.map → chunk-2X2B6D5G.js.map} +0 -0
- /package/dist/{chunk-OCXEY7HE.js.map → chunk-3BUI5DT7.js.map} +0 -0
- /package/dist/{chunk-OSJ366KR.js.map → chunk-3FWP3TD3.js.map} +0 -0
- /package/dist/{chunk-PWUSSSSL.js.map → chunk-3G5IA36N.js.map} +0 -0
- /package/dist/{chunk-RGR57NYY.js.map → chunk-3NK4JAHL.js.map} +0 -0
- /package/dist/{chunk-XUOYNJPB.js.map → chunk-3O7UZRWM.js.map} +0 -0
- /package/dist/{chunk-JV3UI7BH.js.map → chunk-3OR6HMA4.js.map} +0 -0
- /package/dist/{chunk-MV2CLIO6.js.map → chunk-3PC45I5N.js.map} +0 -0
- /package/dist/{chunk-SJYTQLN3.js.map → chunk-3PI2BYK5.js.map} +0 -0
- /package/dist/{chunk-DCEQCGVN.js.map → chunk-3PNA2P2Z.js.map} +0 -0
- /package/dist/{chunk-ESXAECZ3.js.map → chunk-3XBZKF3K.js.map} +0 -0
- /package/dist/{chunk-SBXSKRFA.js.map → chunk-45OGYO3S.js.map} +0 -0
- /package/dist/{chunk-M3FDGRB4.js.map → chunk-4A7TKVNX.js.map} +0 -0
- /package/dist/{chunk-RHXYO4H2.js.map → chunk-4BXRGXTD.js.map} +0 -0
- /package/dist/{chunk-CV4VVLPZ.js.map → chunk-4HQAJA3T.js.map} +0 -0
- /package/dist/{chunk-VCJQQYRE.js.map → chunk-4X2A3KPB.js.map} +0 -0
- /package/dist/{chunk-OCXTTKVA.js.map → chunk-555K37A7.js.map} +0 -0
- /package/dist/{chunk-EBIVTDEG.js.map → chunk-57L5ZXDS.js.map} +0 -0
- /package/dist/{chunk-3L465FBR.js.map → chunk-5IADORIV.js.map} +0 -0
- /package/dist/{chunk-PVB4YVDP.js.map → chunk-5Y2O2432.js.map} +0 -0
- /package/dist/{chunk-OOOSGPJL.js.map → chunk-6572EFE4.js.map} +0 -0
- /package/dist/{chunk-YMI27QPF.js.map → chunk-6BG5HCUP.js.map} +0 -0
- /package/dist/{chunk-QRECBCJM.js.map → chunk-6EXFJWII.js.map} +0 -0
- /package/dist/{chunk-74CBR5YE.js.map → chunk-6PNRUGOK.js.map} +0 -0
- /package/dist/{chunk-PUUEI4W3.js.map → chunk-6RJEY6TC.js.map} +0 -0
- /package/dist/{chunk-DLVIRJGK.js.map → chunk-727GL2YY.js.map} +0 -0
- /package/dist/{chunk-J2BTILRR.js.map → chunk-7FGYLFW6.js.map} +0 -0
- /package/dist/{chunk-MKDFYE2E.js.map → chunk-7IMWTFEG.js.map} +0 -0
- /package/dist/{chunk-FER6EVIY.js.map → chunk-7POKH54R.js.map} +0 -0
- /package/dist/{chunk-H6BX6WOW.js.map → chunk-7T26IH6W.js.map} +0 -0
- /package/dist/{chunk-R33SBMB7.js.map → chunk-7XQRVZZQ.js.map} +0 -0
- /package/dist/{chunk-NFCS5WYC.js.map → chunk-A3SPPXMC.js.map} +0 -0
- /package/dist/{chunk-DQPIEQGP.js.map → chunk-A7CWPDEH.js.map} +0 -0
- /package/dist/{chunk-3PM3M2Q6.js.map → chunk-AGOYVKTI.js.map} +0 -0
- /package/dist/{chunk-OBGOLHCP.js.map → chunk-AIQKZUPB.js.map} +0 -0
- /package/dist/{chunk-GSCGKJNK.js.map → chunk-AMYDHG3S.js.map} +0 -0
- /package/dist/{chunk-U4LTPFD2.js.map → chunk-APJPB6TX.js.map} +0 -0
- /package/dist/{chunk-SP44O3OU.js.map → chunk-APLGT5EI.js.map} +0 -0
- /package/dist/{chunk-M3HGBO2Y.js.map → chunk-ATNKMGLO.js.map} +0 -0
- /package/dist/{chunk-4O2XWOLZ.js.map → chunk-AVX4CZQ3.js.map} +0 -0
- /package/dist/{chunk-CXAN2FHF.js.map → chunk-B46MK44K.js.map} +0 -0
- /package/dist/{chunk-RMCLFSMX.js.map → chunk-BBKUPEGG.js.map} +0 -0
- /package/dist/{chunk-J2WY42FA.js.map → chunk-BES6OQE3.js.map} +0 -0
- /package/dist/{chunk-GU7T2S5N.js.map → chunk-BM2N26SH.js.map} +0 -0
- /package/dist/{chunk-HEGV4QMS.js.map → chunk-C3NS74PZ.js.map} +0 -0
- /package/dist/{chunk-752WXSDN.js.map → chunk-C56ABB5V.js.map} +0 -0
- /package/dist/{chunk-77SYIH6O.js.map → chunk-C6MATJQ5.js.map} +0 -0
- /package/dist/{chunk-KUE5BOQE.js.map → chunk-CRX47CO6.js.map} +0 -0
- /package/dist/{chunk-GTHCHCWW.js.map → chunk-D33KWZQJ.js.map} +0 -0
- /package/dist/{chunk-AH3DGOTK.js.map → chunk-D7E3BSCX.js.map} +0 -0
- /package/dist/{chunk-OJWDNNW3.js.map → chunk-DFR3TMTZ.js.map} +0 -0
- /package/dist/{chunk-WYGTAQMX.js.map → chunk-DICC75CU.js.map} +0 -0
- /package/dist/{chunk-736RUNIA.js.map → chunk-DJ2LMKKX.js.map} +0 -0
- /package/dist/{chunk-4F3AEJI6.js.map → chunk-DJI4D7PM.js.map} +0 -0
- /package/dist/{chunk-LVELUUK6.js.map → chunk-DSZUQL4W.js.map} +0 -0
- /package/dist/{chunk-MT2R57SF.js.map → chunk-DVF246BE.js.map} +0 -0
- /package/dist/{chunk-OI6VI6SU.js.map → chunk-DVOWBHWN.js.map} +0 -0
- /package/dist/{chunk-PZKHST7A.js.map → chunk-E2KPRSA4.js.map} +0 -0
- /package/dist/{chunk-EKJHOWTZ.js.map → chunk-E3LMLWEB.js.map} +0 -0
- /package/dist/{chunk-QURYQFDN.js.map → chunk-EDC7X7PW.js.map} +0 -0
- /package/dist/{chunk-HYEIA25Y.js.map → chunk-EDSMULHU.js.map} +0 -0
- /package/dist/{chunk-U6552Q3T.js.map → chunk-EQQOZ6DD.js.map} +0 -0
- /package/dist/{chunk-IFSXVU2S.js.map → chunk-ERBDQ2GY.js.map} +0 -0
- /package/dist/{chunk-IZXYFWA4.js.map → chunk-EWI73URG.js.map} +0 -0
- /package/dist/{chunk-N3FM4BNA.js.map → chunk-EZ6LFN33.js.map} +0 -0
- /package/dist/{chunk-4K64EKM7.js.map → chunk-F7YL6DPR.js.map} +0 -0
- /package/dist/{chunk-ICAMYP5M.js.map → chunk-FIGFXMUP.js.map} +0 -0
- /package/dist/{chunk-54U6ZBEX.js.map → chunk-FJRJK67G.js.map} +0 -0
- /package/dist/{chunk-E5KOWRDU.js.map → chunk-FLHB2NZT.js.map} +0 -0
- /package/dist/{chunk-D3PTVN2I.js.map → chunk-FUGGM76A.js.map} +0 -0
- /package/dist/{chunk-TDTD66BK.js.map → chunk-FXPZAZYT.js.map} +0 -0
- /package/dist/{chunk-KO3OHHY2.js.map → chunk-GAGAM4MT.js.map} +0 -0
- /package/dist/{chunk-TK5FWVZR.js.map → chunk-GESGH3HY.js.map} +0 -0
- /package/dist/{chunk-2VJOSU4H.js.map → chunk-GI4PWKXI.js.map} +0 -0
- /package/dist/{chunk-KFNZZ2N6.js.map → chunk-GJTEBAZ7.js.map} +0 -0
- /package/dist/{chunk-LTJFV2JI.js.map → chunk-GNCGEW7F.js.map} +0 -0
- /package/dist/{chunk-34NV52R3.js.map → chunk-GOMUNPB6.js.map} +0 -0
- /package/dist/{chunk-LIJNVIT3.js.map → chunk-GUMUILEI.js.map} +0 -0
- /package/dist/{chunk-7NLF35YL.js.map → chunk-GVGNHBFT.js.map} +0 -0
- /package/dist/{chunk-K3D7IQQP.js.map → chunk-GW4YI3FB.js.map} +0 -0
- /package/dist/{chunk-D5TIVCXG.js.map → chunk-GXKCV7X7.js.map} +0 -0
- /package/dist/{chunk-2J77TWGH.js.map → chunk-H467EQA6.js.map} +0 -0
- /package/dist/{chunk-3OK7Y6ES.js.map → chunk-HE77VDDR.js.map} +0 -0
- /package/dist/{chunk-UO35OEOX.js.map → chunk-HT65RGCX.js.map} +0 -0
- /package/dist/{chunk-G6ICCGJ3.js.map → chunk-HVQSFTE7.js.map} +0 -0
- /package/dist/{chunk-G5UQBTXY.js.map → chunk-HXJPDC76.js.map} +0 -0
- /package/dist/{chunk-GIWFLWXG.js.map → chunk-I6LQW24C.js.map} +0 -0
- /package/dist/{chunk-467WDSOK.js.map → chunk-I7A6S5YL.js.map} +0 -0
- /package/dist/{chunk-AAS7OWV6.js.map → chunk-IADS4ZYD.js.map} +0 -0
- /package/dist/{chunk-Y3XZEKDQ.js.map → chunk-IJWMWCGR.js.map} +0 -0
- /package/dist/{chunk-SGH7I7OY.js.map → chunk-IWFO6KOU.js.map} +0 -0
- /package/dist/{chunk-GMHIOYB7.js.map → chunk-IYC6QGV2.js.map} +0 -0
- /package/dist/{chunk-3NNAC43A.js.map → chunk-J5AODKJO.js.map} +0 -0
- /package/dist/{chunk-DIP7YALH.js.map → chunk-JKI3LMLH.js.map} +0 -0
- /package/dist/{chunk-IJR6VOLU.js.map → chunk-JSYRWOCE.js.map} +0 -0
- /package/dist/{chunk-CEMSIU4Z.js.map → chunk-JTQTWO4D.js.map} +0 -0
- /package/dist/{chunk-BASI553K.js.map → chunk-KBTKAAHM.js.map} +0 -0
- /package/dist/{chunk-OYOFPNLC.js.map → chunk-KD7VEMWY.js.map} +0 -0
- /package/dist/{chunk-3DRLCX5V.js.map → chunk-KPGFGRSA.js.map} +0 -0
- /package/dist/{chunk-PLYVGZIN.js.map → chunk-KWFDEJFI.js.map} +0 -0
- /package/dist/{chunk-FNXCFIPW.js.map → chunk-KYLEH4OF.js.map} +0 -0
- /package/dist/{chunk-WXF2RTS4.js.map → chunk-L7FJTFJN.js.map} +0 -0
- /package/dist/{chunk-KI46GKMD.js.map → chunk-L7VVQOSY.js.map} +0 -0
- /package/dist/{chunk-O2UPPN5M.js.map → chunk-LKLQVANM.js.map} +0 -0
- /package/dist/{chunk-YNTLWCF4.js.map → chunk-LLYEAZ4E.js.map} +0 -0
- /package/dist/{chunk-4Z5X7PLC.js.map → chunk-LWM7JUW6.js.map} +0 -0
- /package/dist/{chunk-CHU3RDV4.js.map → chunk-LXKV4ND3.js.map} +0 -0
- /package/dist/{chunk-AB5IW227.js.map → chunk-LYLICEQO.js.map} +0 -0
- /package/dist/{chunk-OTW25A6I.js.map → chunk-M5GRI5K4.js.map} +0 -0
- /package/dist/{chunk-X2QJXDE4.js.map → chunk-MF65PKKF.js.map} +0 -0
- /package/dist/{chunk-EDDKPIIV.js.map → chunk-MJ4XIOPM.js.map} +0 -0
- /package/dist/{chunk-FLWQJDJ5.js.map → chunk-MMPJJQG3.js.map} +0 -0
- /package/dist/{chunk-T67LTMSW.js.map → chunk-MOU54FGD.js.map} +0 -0
- /package/dist/{chunk-LQKVNREV.js.map → chunk-NAWHQ4IL.js.map} +0 -0
- /package/dist/{chunk-ZBHGNE2J.js.map → chunk-NBHBB2VV.js.map} +0 -0
- /package/dist/{chunk-U5UGM5XD.js.map → chunk-NMOZDAEZ.js.map} +0 -0
- /package/dist/{chunk-D74Z2N4K.js.map → chunk-NZA4R3BE.js.map} +0 -0
- /package/dist/{chunk-WRMUXZ7C.js.map → chunk-OB2CX7PJ.js.map} +0 -0
- /package/dist/{chunk-YJSCLGAW.js.map → chunk-OB4I4OIT.js.map} +0 -0
- /package/dist/{chunk-DWJ6J3YW.js.map → chunk-OKQW2FPL.js.map} +0 -0
- /package/dist/{chunk-2GCHGWNE.js.map → chunk-ORLX6A3C.js.map} +0 -0
- /package/dist/{chunk-EBTUPRRQ.js.map → chunk-P5N4EYFW.js.map} +0 -0
- /package/dist/{chunk-JKL5S7UQ.js.map → chunk-PL4JE3NI.js.map} +0 -0
- /package/dist/{chunk-OP2GD6QW.js.map → chunk-PNUHKDY2.js.map} +0 -0
- /package/dist/{chunk-MZY3VKKM.js.map → chunk-PWJE7D6V.js.map} +0 -0
- /package/dist/{chunk-RISUROBM.js.map → chunk-PYE27I6J.js.map} +0 -0
- /package/dist/{chunk-R5QAL43H.js.map → chunk-QIJHK6P4.js.map} +0 -0
- /package/dist/{chunk-AJBDAVX3.js.map → chunk-QK3A23NP.js.map} +0 -0
- /package/dist/{chunk-CYDXCILL.js.map → chunk-QLWDNAOV.js.map} +0 -0
- /package/dist/{chunk-BQYRZIZ7.js.map → chunk-QS6DQBVJ.js.map} +0 -0
- /package/dist/{chunk-3PZ3LRPV.js.map → chunk-QSUVFPG3.js.map} +0 -0
- /package/dist/{chunk-PYB4BFEC.js.map → chunk-QUC5MLTN.js.map} +0 -0
- /package/dist/{chunk-WDASYY4S.js.map → chunk-QVT5AWPI.js.map} +0 -0
- /package/dist/{chunk-K4DQS2ML.js.map → chunk-QZC6WCBR.js.map} +0 -0
- /package/dist/{chunk-HWVPLFIW.js.map → chunk-RAHNICPP.js.map} +0 -0
- /package/dist/{chunk-H6MJFMHZ.js.map → chunk-RME6RGIW.js.map} +0 -0
- /package/dist/{chunk-XMBOLFFS.js.map → chunk-RQIB2F53.js.map} +0 -0
- /package/dist/{chunk-OXQ2SXVC.js.map → chunk-RUA72NQY.js.map} +0 -0
- /package/dist/{chunk-UMX6DZME.js.map → chunk-SCJHWN4X.js.map} +0 -0
- /package/dist/{chunk-HTMQGS63.js.map → chunk-SIXBDT5F.js.map} +0 -0
- /package/dist/{chunk-ZAX4XQLN.js.map → chunk-SPK3T4JK.js.map} +0 -0
- /package/dist/{chunk-WTSQUCHB.js.map → chunk-SSN2YSST.js.map} +0 -0
- /package/dist/{chunk-5MIBQ4P5.js.map → chunk-SYJCDX5V.js.map} +0 -0
- /package/dist/{chunk-ZR5EKJT6.js.map → chunk-T6276OXI.js.map} +0 -0
- /package/dist/{chunk-DEHLWZSI.js.map → chunk-T7OARG4N.js.map} +0 -0
- /package/dist/{chunk-77BHKC43.js.map → chunk-TF5L3BEV.js.map} +0 -0
- /package/dist/{chunk-GOCODNQS.js.map → chunk-TF6Z7BOP.js.map} +0 -0
- /package/dist/{chunk-WIFDNUKD.js.map → chunk-TJDXWZMO.js.map} +0 -0
- /package/dist/{chunk-SFIXTOOJ.js.map → chunk-TL5ATBHZ.js.map} +0 -0
- /package/dist/{chunk-XZCCEKPW.js.map → chunk-TMOHIOMT.js.map} +0 -0
- /package/dist/{chunk-AVXDIRRW.js.map → chunk-UI5X63YC.js.map} +0 -0
- /package/dist/{chunk-6QK65ZWM.js.map → chunk-UIY7BDZC.js.map} +0 -0
- /package/dist/{chunk-VATYK3JQ.js.map → chunk-UMBFMEO7.js.map} +0 -0
- /package/dist/{chunk-UU5FBVRX.js.map → chunk-UU5G7OA4.js.map} +0 -0
- /package/dist/{chunk-EGKARC53.js.map → chunk-UZUCYCF4.js.map} +0 -0
- /package/dist/{chunk-LPKJ77EK.js.map → chunk-V2A7G7S7.js.map} +0 -0
- /package/dist/{chunk-CH4UQ4NO.js.map → chunk-V5G4TKRC.js.map} +0 -0
- /package/dist/{chunk-UBRQ3PQD.js.map → chunk-VKAVW34W.js.map} +0 -0
- /package/dist/{chunk-JV5ULONH.js.map → chunk-VVLEVNTQ.js.map} +0 -0
- /package/dist/{chunk-44JWVYJB.js.map → chunk-VW7X7TWZ.js.map} +0 -0
- /package/dist/{chunk-3CDJSKDW.js.map → chunk-VWA2CHSL.js.map} +0 -0
- /package/dist/{chunk-IN3VQFKS.js.map → chunk-W43HZPM7.js.map} +0 -0
- /package/dist/{chunk-SXGJL7UT.js.map → chunk-WHGD7Q2L.js.map} +0 -0
- /package/dist/{chunk-XOIDUM2H.js.map → chunk-WNXKYEVN.js.map} +0 -0
- /package/dist/{chunk-TKQL7EDB.js.map → chunk-WSA7UBX4.js.map} +0 -0
- /package/dist/{chunk-AJDGP2N4.js.map → chunk-WZ5TQJ3T.js.map} +0 -0
- /package/dist/{chunk-FBA2NXYH.js.map → chunk-X3TGNSOG.js.map} +0 -0
- /package/dist/{chunk-R4JA5JFI.js.map → chunk-X4WXYI3N.js.map} +0 -0
- /package/dist/{chunk-Q5EZNBPI.js.map → chunk-XIQ3AIAJ.js.map} +0 -0
- /package/dist/{chunk-S27VZ5DO.js.map → chunk-XWYT4LEL.js.map} +0 -0
- /package/dist/{chunk-477DTTMH.js.map → chunk-Y3PU75OC.js.map} +0 -0
- /package/dist/{chunk-4JXPLTWV.js.map → chunk-Y5ZWX5YS.js.map} +0 -0
- /package/dist/{chunk-4BWMAGJJ.js.map → chunk-YA5PABND.js.map} +0 -0
- /package/dist/{chunk-OGU73VUN.js.map → chunk-YBPRR2QS.js.map} +0 -0
- /package/dist/{chunk-TNSJFZ6Q.js.map → chunk-YDYR7XQE.js.map} +0 -0
- /package/dist/{chunk-GTRAH4FG.js.map → chunk-YG6V2LQH.js.map} +0 -0
- /package/dist/{chunk-XVLEBB4Y.js.map → chunk-YUXA7ALE.js.map} +0 -0
- /package/dist/{chunk-SN2WENRP.js.map → chunk-YWHQDXPB.js.map} +0 -0
- /package/dist/{chunk-BFFNINCC.js.map → chunk-YWRR5R7B.js.map} +0 -0
- /package/dist/{chunk-FSDQQQIA.js.map → chunk-YYRK7A4N.js.map} +0 -0
- /package/dist/{chunk-MRECRNVU.js.map → chunk-Z26CDLUV.js.map} +0 -0
- /package/dist/{chunk-OYCK4JRS.js.map → chunk-Z27EXLMQ.js.map} +0 -0
- /package/dist/{chunk-UTRNLNCW.js.map → chunk-Z7GDH7W2.js.map} +0 -0
- /package/dist/{chunk-PRT4J2DL.js.map → chunk-ZGVLSAWL.js.map} +0 -0
- /package/dist/{chunk-OK7BQMCI.js.map → chunk-ZM6Q5NQN.js.map} +0 -0
- /package/dist/{computer-viewer-5LKRCEVQ.js.map → computer-viewer-SROXREYD.js.map} +0 -0
- /package/dist/{embedded-new-voice-GHJRY3YL.js.map → embedded-new-voice-EIQY2VBF.js.map} +0 -0
- /package/dist/{embedded-voice-ASQXBSTX.js.map → embedded-voice-LMWNH7F7.js.map} +0 -0
- /package/dist/{fleet-decision-row-U7LDVBEM.js.map → fleet-decision-row-X2G56ZRA.js.map} +0 -0
- /package/dist/{latest-question-RNVF262Q.js.map → latest-question-KA7AQYVI.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-E6XKMFTA.js.map → model-policy-picker-menu-SHWPT5VA.js.map} +0 -0
- /package/dist/{payment-page-card-DJDKV2LW.js.map → payment-page-card-NNVUISN4.js.map} +0 -0
- /package/dist/{platform-activity-row-MSDCSMET.js.map → platform-activity-row-7UDWSAHK.js.map} +0 -0
- /package/dist/{queue-surface-implementation-GUAIG6TK.js.map → queue-surface-implementation-BUXSO24N.js.map} +0 -0
- /package/dist/{recorder-host-2MYDJPQW.js.map → recorder-host-POX54CFT.js.map} +0 -0
- /package/dist/{sandbox-files-W5W2LW4K.js.map → sandbox-files-33QD7DW2.js.map} +0 -0
- /package/dist/{session-connect-cards-HPH7JOZP.js.map → session-connect-cards-CXGNVA2A.js.map} +0 -0
- /package/dist/{session-realtime-SDTKFFIR.js.map → session-realtime-CVDSEULB.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-FNILLWNU.js.map → timeline-annotation-markers-5J5TM5IP.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-MBCIDO2Q.js.map → timeline-annotation-selection-WLY7FB7F.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-JPNKLOTE.js.map → timeline-annotations-dialog-67VRFKJU.js.map} +0 -0
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
workspaceNavigationPreferenceStorageId,
|
|
34
34
|
writeLastWorkspaceId,
|
|
35
35
|
writeLastWorkspaceIdForOrganization
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-QIJHK6P4.js";
|
|
37
37
|
import {
|
|
38
38
|
beginWorkspaceOperation,
|
|
39
39
|
beginWorkspaceTransition,
|
|
@@ -78,7 +78,7 @@ import {
|
|
|
78
78
|
applySessionPinProjection,
|
|
79
79
|
notifySessionPinChanged,
|
|
80
80
|
reconcileFailedSessionPin
|
|
81
|
-
} from "./chunk-
|
|
81
|
+
} from "./chunk-JWSRFXRN.js";
|
|
82
82
|
import {
|
|
83
83
|
isPaymentRequiredError,
|
|
84
84
|
paymentRefusalCode
|
|
@@ -97,10 +97,10 @@ import {
|
|
|
97
97
|
classifyCreateSessionFailure,
|
|
98
98
|
prepareCreateSessionAttempt,
|
|
99
99
|
retainCreateSessionAttemptAfterFailure
|
|
100
|
-
} from "./chunk-
|
|
100
|
+
} from "./chunk-UI5X63YC.js";
|
|
101
101
|
import {
|
|
102
102
|
t
|
|
103
|
-
} from "./chunk-
|
|
103
|
+
} from "./chunk-C3NS74PZ.js";
|
|
104
104
|
import {
|
|
105
105
|
buildOpenGeniUiTools,
|
|
106
106
|
buildResources,
|
|
@@ -2383,4 +2383,4 @@ export {
|
|
|
2383
2383
|
createSlackLinkPrepareController,
|
|
2384
2384
|
useAppState
|
|
2385
2385
|
};
|
|
2386
|
-
//# sourceMappingURL=chunk-
|
|
2386
|
+
//# sourceMappingURL=chunk-NMOZDAEZ.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
useDesktopThisComputer
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-OKQW2FPL.js";
|
|
5
5
|
import {
|
|
6
6
|
lastSessionMemoryId,
|
|
7
7
|
readLastSessionId
|
|
@@ -233,4 +233,4 @@ export {
|
|
|
233
233
|
appShotFileName,
|
|
234
234
|
AppShotCoordinator
|
|
235
235
|
};
|
|
236
|
-
//# sourceMappingURL=chunk-
|
|
236
|
+
//# sourceMappingURL=chunk-NZA4R3BE.js.map
|
|
@@ -14,13 +14,13 @@ import {
|
|
|
14
14
|
editableArtifactStatusLabel,
|
|
15
15
|
useArtifactSubmissions,
|
|
16
16
|
useEditableArtifactView
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-D33KWZQJ.js";
|
|
18
18
|
import {
|
|
19
19
|
cn
|
|
20
20
|
} from "./chunk-TXS65BB2.js";
|
|
21
21
|
import {
|
|
22
22
|
useOpenGeniText
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-CUIV2XPO.js";
|
|
24
24
|
|
|
25
25
|
// src/components/artifacts/document-editor.tsx
|
|
26
26
|
import {
|
|
@@ -2314,4 +2314,4 @@ export {
|
|
|
2314
2314
|
DocumentProjectionArtifactSurface,
|
|
2315
2315
|
EditableDocumentArtifactSurface
|
|
2316
2316
|
};
|
|
2317
|
-
//# sourceMappingURL=chunk-
|
|
2317
|
+
//# sourceMappingURL=chunk-OB2CX7PJ.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
useConnectSetupFlow
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TL5ATBHZ.js";
|
|
5
5
|
import {
|
|
6
6
|
copyTextToClipboard
|
|
7
7
|
} from "./chunk-PEHTX3V7.js";
|
|
8
8
|
import {
|
|
9
9
|
useOpenGeniText
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-CUIV2XPO.js";
|
|
11
11
|
|
|
12
12
|
// src/connect-setup.tsx
|
|
13
13
|
import { useState } from "react";
|
|
@@ -306,4 +306,4 @@ export {
|
|
|
306
306
|
accountServiceCapability,
|
|
307
307
|
isServiceConnectProvider
|
|
308
308
|
};
|
|
309
|
-
//# sourceMappingURL=chunk-
|
|
309
|
+
//# sourceMappingURL=chunk-OB4I4OIT.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
ComputerUseNotice,
|
|
4
4
|
ComputerUseRow
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-5Y2O2432.js";
|
|
6
6
|
import {
|
|
7
7
|
desktopBridge,
|
|
8
8
|
desktopCapability
|
|
@@ -13,10 +13,10 @@ import {
|
|
|
13
13
|
import {
|
|
14
14
|
thisComputerPermissionSteps,
|
|
15
15
|
useThisComputer
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-M5GRI5K4.js";
|
|
17
17
|
import {
|
|
18
18
|
defaultThisComputerLabels
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-PWJE7D6V.js";
|
|
20
20
|
import {
|
|
21
21
|
useComputerUse
|
|
22
22
|
} from "./chunk-WZGWXXO3.js";
|
|
@@ -130,4 +130,4 @@ export {
|
|
|
130
130
|
DesktopThisComputerPanel,
|
|
131
131
|
insideDesktopApp
|
|
132
132
|
};
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
133
|
+
//# sourceMappingURL=chunk-OKQW2FPL.js.map
|
|
@@ -20,14 +20,14 @@ import {
|
|
|
20
20
|
} from "./chunk-GM3LG6BG.js";
|
|
21
21
|
import {
|
|
22
22
|
FormDialog
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-BM2N26SH.js";
|
|
24
24
|
import {
|
|
25
25
|
userErrorText
|
|
26
26
|
} from "./chunk-O4OOG3D6.js";
|
|
27
27
|
import {
|
|
28
28
|
Field,
|
|
29
29
|
FieldStack
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-ZGVLSAWL.js";
|
|
31
31
|
import {
|
|
32
32
|
ADMIN_ACCESS_DURATIONS,
|
|
33
33
|
ADMIN_ACCESS_GRANT_DESCRIPTION,
|
|
@@ -231,4 +231,4 @@ export {
|
|
|
231
231
|
SessionAdminAccessMenuItems,
|
|
232
232
|
GrantSessionAdminAccessDialog
|
|
233
233
|
};
|
|
234
|
-
//# sourceMappingURL=chunk-
|
|
234
|
+
//# sourceMappingURL=chunk-ORLX6A3C.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
FILE_AUDIENCE_COPY,
|
|
12
12
|
editableArtifactAudienceCopy,
|
|
13
13
|
useArtifactAudience
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-W43HZPM7.js";
|
|
15
15
|
import {
|
|
16
16
|
ArtifactKindTile,
|
|
17
17
|
ArtifactTypeIcon
|
|
@@ -60,7 +60,7 @@ import {
|
|
|
60
60
|
ListRow,
|
|
61
61
|
ListRowSkeleton,
|
|
62
62
|
RowList
|
|
63
|
-
} from "./chunk-
|
|
63
|
+
} from "./chunk-45OGYO3S.js";
|
|
64
64
|
import {
|
|
65
65
|
cn
|
|
66
66
|
} from "./chunk-A3MTTRCX.js";
|
|
@@ -94,7 +94,7 @@ import {
|
|
|
94
94
|
} from "./chunk-HJO32O7Z.js";
|
|
95
95
|
import {
|
|
96
96
|
RelativeTime
|
|
97
|
-
} from "./chunk-
|
|
97
|
+
} from "./chunk-7IMWTFEG.js";
|
|
98
98
|
import {
|
|
99
99
|
Notice
|
|
100
100
|
} from "./chunk-FSOQDUCG.js";
|
|
@@ -911,4 +911,4 @@ export {
|
|
|
911
911
|
ArtifactCard,
|
|
912
912
|
ArtifactLibrary
|
|
913
913
|
};
|
|
914
|
-
//# sourceMappingURL=chunk-
|
|
914
|
+
//# sourceMappingURL=chunk-P5N4EYFW.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
ConnectionLogo
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-X4WXYI3N.js";
|
|
5
5
|
import {
|
|
6
6
|
ConnectSetup,
|
|
7
7
|
accountServiceCapability,
|
|
@@ -9,14 +9,14 @@ import {
|
|
|
9
9
|
connectionServicePresentation,
|
|
10
10
|
gmail_default,
|
|
11
11
|
isServiceConnectProvider
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-OB4I4OIT.js";
|
|
13
13
|
import {
|
|
14
14
|
McpConnectionCard
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-GOMUNPB6.js";
|
|
16
16
|
import {
|
|
17
17
|
mcpConnectionDiscoveryState,
|
|
18
18
|
useConnect
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-EDSMULHU.js";
|
|
20
20
|
import {
|
|
21
21
|
useNobodyToShareWith
|
|
22
22
|
} from "./chunk-RNC6B4BN.js";
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
} from "./chunk-PEHTX3V7.js";
|
|
26
26
|
import {
|
|
27
27
|
useOpenGeniText
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-CUIV2XPO.js";
|
|
29
29
|
|
|
30
30
|
// src/capability-catalog-row.tsx
|
|
31
31
|
import { AlertTriangleIcon, CheckIcon, Loader2Icon, PlusIcon } from "lucide-react";
|
|
@@ -1785,4 +1785,4 @@ export {
|
|
|
1785
1785
|
ConnectionTypePicker,
|
|
1786
1786
|
PluginDiscovery
|
|
1787
1787
|
};
|
|
1788
|
-
//# sourceMappingURL=chunk-
|
|
1788
|
+
//# sourceMappingURL=chunk-PL4JE3NI.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "./chunk-XEA5BCMA.js";
|
|
8
8
|
import {
|
|
9
9
|
useOpenGeniText
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-CUIV2XPO.js";
|
|
11
11
|
|
|
12
12
|
// src/components/session-capability-frame.tsx
|
|
13
13
|
import { CheckIcon, InfoIcon, ShieldCheckIcon, XIcon } from "lucide-react";
|
|
@@ -163,4 +163,4 @@ function SessionCapabilityFrame({
|
|
|
163
163
|
export {
|
|
164
164
|
SessionCapabilityFrame
|
|
165
165
|
};
|
|
166
|
-
//# sourceMappingURL=chunk-
|
|
166
|
+
//# sourceMappingURL=chunk-PNUHKDY2.js.map
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
createOpenGeniText,
|
|
10
10
|
useOpenGeniText
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-CUIV2XPO.js";
|
|
12
12
|
|
|
13
13
|
// src/components/this-computer/labels.ts
|
|
14
14
|
function defaultThisComputerLabels(t = createOpenGeniText()) {
|
|
@@ -330,4 +330,4 @@ export {
|
|
|
330
330
|
defaultThisComputerLabels,
|
|
331
331
|
ThisComputerCard
|
|
332
332
|
};
|
|
333
|
-
//# sourceMappingURL=chunk-
|
|
333
|
+
//# sourceMappingURL=chunk-PWJE7D6V.js.map
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
import {
|
|
3
3
|
SitePublishPage,
|
|
4
4
|
useSitePublication
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-WHGD7Q2L.js";
|
|
6
6
|
import {
|
|
7
7
|
sitesClientConfig
|
|
8
8
|
} from "./chunk-SYCDHPZF.js";
|
|
9
9
|
import {
|
|
10
10
|
useSiteAudience
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-W43HZPM7.js";
|
|
12
12
|
import {
|
|
13
13
|
useDuplicateSite
|
|
14
14
|
} from "./chunk-T6XI5FLY.js";
|
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
} from "./chunk-JDFDPMKX.js";
|
|
30
30
|
import {
|
|
31
31
|
ConfirmDialog
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-GAGAM4MT.js";
|
|
33
33
|
import {
|
|
34
34
|
userErrorText
|
|
35
35
|
} from "./chunk-O4OOG3D6.js";
|
|
@@ -291,4 +291,4 @@ export {
|
|
|
291
291
|
hasSiteSettings,
|
|
292
292
|
SiteSettings
|
|
293
293
|
};
|
|
294
|
-
//# sourceMappingURL=chunk-
|
|
294
|
+
//# sourceMappingURL=chunk-PYE27I6J.js.map
|
|
@@ -216,6 +216,7 @@ function useRecorder(options = {}) {
|
|
|
216
216
|
...merged.visibility ? { visibility: merged.visibility } : {},
|
|
217
217
|
...merged.externalRef ? { externalRef: merged.externalRef } : {},
|
|
218
218
|
...merged.metadata ? { metadata: merged.metadata } : {},
|
|
219
|
+
...merged.calendarEvent ? { calendarEvent: merged.calendarEvent } : {},
|
|
219
220
|
...merged.transcription ? { transcription: merged.transcription } : {},
|
|
220
221
|
...merged.ownerName?.trim() ? { ownerName: merged.ownerName } : {},
|
|
221
222
|
...merged.microphone !== void 0 ? { microphone: merged.microphone } : {},
|
|
@@ -751,4 +752,4 @@ export {
|
|
|
751
752
|
useRecordingModels,
|
|
752
753
|
useRecordingNotes
|
|
753
754
|
};
|
|
754
|
-
//# sourceMappingURL=chunk-
|
|
755
|
+
//# sourceMappingURL=chunk-PYMROAWS.js.map
|
|
@@ -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"]}
|
|
@@ -72,7 +72,7 @@ function createMeetingRecorderStore(onActivate = () => {
|
|
|
72
72
|
}
|
|
73
73
|
var MeetingRecorderContext = createContext(null);
|
|
74
74
|
var MeetingRecorderStoreProvider = MeetingRecorderContext.Provider;
|
|
75
|
-
var LazyRecorderHost = lazy(() => import("./recorder-host-
|
|
75
|
+
var LazyRecorderHost = lazy(() => import("./recorder-host-POX54CFT.js"));
|
|
76
76
|
var RECORDING_DATABASE = "opengeni-recordings";
|
|
77
77
|
async function hasLocalRecordings() {
|
|
78
78
|
if (typeof indexedDB === "undefined" || typeof indexedDB.databases !== "function") return false;
|
|
@@ -164,8 +164,18 @@ function useDesktopMeetingRequests(store, navigation) {
|
|
|
164
164
|
const recorder = store.get();
|
|
165
165
|
if (request.kind === "record") {
|
|
166
166
|
if (latest.current.signedOut) return;
|
|
167
|
+
const start = {
|
|
168
|
+
title: request.title,
|
|
169
|
+
titleSource: "app",
|
|
170
|
+
...request.calendarEvent ? { calendarEvent: request.calendarEvent } : {}
|
|
171
|
+
};
|
|
167
172
|
if (canStartRecording(recorder?.state)) {
|
|
168
|
-
store.requestStart(
|
|
173
|
+
store.requestStart(start);
|
|
174
|
+
} else if (request.replace === true && recorder && (recorder.state === "recording" || recorder.state === "paused")) {
|
|
175
|
+
void recorder.stop().then(
|
|
176
|
+
() => store.requestStart(start),
|
|
177
|
+
() => void 0
|
|
178
|
+
);
|
|
169
179
|
}
|
|
170
180
|
latest.current.onOpenMeetings?.();
|
|
171
181
|
return;
|
|
@@ -280,4 +290,4 @@ export {
|
|
|
280
290
|
useMeetingRecorderState,
|
|
281
291
|
useMeetingRecorderControls
|
|
282
292
|
};
|
|
283
|
-
//# sourceMappingURL=chunk-
|
|
293
|
+
//# sourceMappingURL=chunk-Q74FQK3A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/meetings/recorder-context.tsx","../src/meetings/recorder-state.ts"],"sourcesContent":["/**\n * The workspace's one meeting recorder, held above the routes so a recording\n * keeps going while the person moves around the app.\n *\n * The capture code (MediaRecorder, IndexedDB, the uploader) loads lazily: the\n * host mounts the first time someone opens Meetings, or at startup when this\n * browser still holds a recording that hasn't finished uploading. The live\n * snapshot changes several times a second while recording, so it lives in an\n * external store; only the components that read it re-render.\n *\n * In the desktop app, the provider also carries out the call notifications'\n * choices; the host says where Meetings and a meeting are with\n * `onOpenMeetings` and `onOpenMeeting`.\n *\n * A recording belongs to the workspace it started in and keeps going when the\n * person moves to another workspace: the recorder follows the host's current\n * workspace only while nothing is being captured. It belongs to the person\n * too: a host that signs people in passes them as `scope`, and a recording\n * ends at once when they sign out or someone else signs in.\n */\nimport {\n createContext,\n lazy,\n Suspense,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { getDesktopMeetingDetection } from \"@opengeni/sdk/desktop-bridge\";\nimport type { UseRecorderResult } from \"../recordings\";\nimport { canStartRecording, capturing } from \"./recorder-state\";\n\nexport { canStartRecording } from \"./recorder-state\";\n\nexport type MeetingRecorder = UseRecorderResult;\n\n/**\n * A recording someone asked for outside the recorder, such as from a desktop\n * call notification. An empty title leaves the name to Opengeni; `app` marks\n * a title the app guessed (the call app's name), which a calendar event or\n * the conversation replaces. `calendarEvent` is the owner's calendar event\n * the meeting is of, such as one joined from a reminder; it names the meeting.\n */\nexport type MeetingStartRequest = {\n title: string;\n titleSource?: \"person\" | \"app\";\n calendarEvent?: { provider: \"google\" | \"microsoft\"; id: string };\n};\n\nexport type MeetingRecorderStore = {\n get: () => MeetingRecorder | null;\n subscribe: (listener: () => void) => () => void;\n /** Publish the recorder, and the workspace its recordings go to. */\n set: (recorder: MeetingRecorder | null, workspaceId?: string | null) => void;\n /** Recordings whose upload finished in this tab, newest last. */\n finished: () => readonly string[];\n markFinished: (recordingId: string) => void;\n /** A start the recorder panel should make as soon as it can, or null. */\n pendingStart: () => MeetingStartRequest | null;\n requestStart: (request: MeetingStartRequest) => void;\n /** Take the pending start, so it happens once. */\n takeStart: () => MeetingStartRequest | null;\n /** Load the capture code. Idempotent. */\n activate: () => void;\n /**\n * The workspace the recorder's recordings go to: while one records, the\n * workspace it started in, even after the person moved to another one.\n * Absent from stores made before it existed.\n */\n workspaceId?: () => string | null;\n /**\n * Open a recorded meeting in its own workspace, through the host's\n * `onOpenMeeting`. False when the host gave no way to.\n */\n openMeeting?: (recordingId: string, workspaceId: string) => boolean;\n};\n\nexport function createMeetingRecorderStore(\n onActivate: () => void = () => {},\n onOpenMeeting: (recordingId: string, workspaceId: string) => boolean = () => false,\n): MeetingRecorderStore {\n let current: MeetingRecorder | null = null;\n let currentWorkspaceId: string | null = null;\n let finished: string[] = [];\n let pending: MeetingStartRequest | null = null;\n const listeners = new Set<() => void>();\n const notify = () => {\n for (const listener of listeners) listener();\n };\n return {\n get: () => current,\n subscribe: (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n set: (recorder, workspaceId = null) => {\n current = recorder;\n currentWorkspaceId = recorder ? workspaceId : null;\n // A recording that started some other way (the Start button) uses up a\n // start still waiting, so it can't begin a second one after Stop.\n if (pending && capturing(recorder?.state)) pending = null;\n notify();\n },\n workspaceId: () => currentWorkspaceId,\n finished: () => finished,\n markFinished: (recordingId) => {\n finished = [...finished.filter((id) => id !== recordingId), recordingId];\n notify();\n },\n pendingStart: () => pending,\n requestStart: (request) => {\n pending = request;\n onActivate();\n notify();\n },\n takeStart: () => {\n const request = pending;\n if (request) {\n pending = null;\n notify();\n }\n return request;\n },\n activate: onActivate,\n openMeeting: (recordingId, workspaceId) => onOpenMeeting(recordingId, workspaceId),\n };\n}\n\nconst MeetingRecorderContext = createContext<MeetingRecorderStore | null>(null);\n\nexport const MeetingRecorderStoreProvider = MeetingRecorderContext.Provider;\n\nconst LazyRecorderHost = lazy(() => import(\"./recorder-host\"));\n\nconst RECORDING_DATABASE = \"opengeni-recordings\";\n\n/** True when this browser still holds recording chunks from an earlier visit. */\nasync function hasLocalRecordings(): Promise<boolean> {\n if (typeof indexedDB === \"undefined\" || typeof indexedDB.databases !== \"function\") return false;\n try {\n const databases = await indexedDB.databases();\n return databases.some((database) => database.name === RECORDING_DATABASE);\n } catch {\n return false;\n }\n}\n\nexport function MeetingRecorderProvider({\n workspaceId,\n scope,\n client,\n onOpenMeetings,\n onOpenMeeting,\n children,\n}: {\n /** The workspace recordings go to; null while the host is still finding it. */\n workspaceId: string | null;\n /**\n * Who records, such as the signed-in person's id, for a host that mounts\n * this above sign-in. A new value ends a recording at once and starts a\n * fresh recorder; null means nobody is signed in, so there is no recorder.\n * Omit it when the host remounts the provider when the person changes.\n */\n scope?: string | null | undefined;\n /**\n * The SDK client the recorder uploads with, for a host that mounts this\n * above its routes without an <OpenGeniProvider> there. The provider's\n * client otherwise.\n */\n client?: object | undefined;\n /** Show the Meetings page, where a desktop call notification's recording starts. */\n onOpenMeetings?: (() => void) | undefined;\n /**\n * Show one meeting, after a desktop call notification stopped its recording\n * or a recording made in another workspace stopped. `workspaceId` is the\n * workspace the meeting is in, which may not be the one shown.\n */\n onOpenMeeting?: ((recordingId: string, workspaceId: string) => void) | undefined;\n children: ReactNode;\n}) {\n const [active, setActive] = useState(false);\n const openMeeting = useRef(onOpenMeeting);\n useEffect(() => {\n openMeeting.current = onOpenMeeting;\n });\n const store = useMemo(\n () =>\n createMeetingRecorderStore(\n () => setActive(true),\n (recordingId, recordingWorkspaceId) => {\n if (!openMeeting.current) return false;\n openMeeting.current(recordingId, recordingWorkspaceId);\n return true;\n },\n ),\n [],\n );\n useEffect(() => {\n let cancelled = false;\n void hasLocalRecordings().then((found) => {\n if (found && !cancelled) setActive(true);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n // Leaving a workspace must not end a recording made in it: the host, and\n // with it the capture, stays in the recording's workspace until it stops,\n // then follows the host's current workspace. Another person (scope) gets a\n // fresh host at once, which ends the capture.\n const busy = useSyncExternalStore(\n store.subscribe,\n () => capturing(store.get()?.state),\n () => false,\n );\n useDesktopMeetingRequests(store, {\n // The desktop app asks about calls only while a page can record them:\n // someone signed in, with a workspace to record to, or a recording going.\n canRecord: scope !== null && (workspaceId !== null || busy),\n signedOut: scope === null,\n onOpenMeetings,\n });\n // A start someone asked for belongs to who was signed in then.\n useEffect(() => {\n store.takeStart();\n }, [store, scope]);\n const [host, setHost] = useState({ scope, workspaceId });\n if (host.scope !== scope || (!busy && host.workspaceId !== workspaceId)) {\n setHost({ scope, workspaceId });\n }\n const hostWorkspaceId = host.scope === scope ? host.workspaceId : workspaceId;\n return (\n <MeetingRecorderContext.Provider value={store}>\n {children}\n {active && scope !== null && hostWorkspaceId ? (\n <Suspense fallback={null}>\n <LazyRecorderHost\n key={`${scope ?? \"\"}:${hostWorkspaceId}`}\n store={store}\n workspaceId={hostWorkspaceId}\n client={client}\n />\n </Suspense>\n ) : null}\n </MeetingRecorderContext.Provider>\n );\n}\n\nconst NO_FINISHED: readonly string[] = [];\n\n/**\n * The desktop app's meeting card: \"Record\" opens Meetings and starts\n * recording the call; \"Stop recording\" (the call ended) stops and opens the\n * meeting.\n */\nfunction useDesktopMeetingRequests(\n store: MeetingRecorderStore,\n navigation: {\n canRecord: boolean;\n signedOut: boolean;\n onOpenMeetings?: (() => void) | undefined;\n },\n): void {\n const latest = useRef(navigation);\n useEffect(() => {\n latest.current = navigation;\n });\n const canRecord = navigation.canRecord;\n useEffect(() => {\n // Taking choices tells the app this page can record; stopping while the\n // page stays (signed out, no workspace) tells it nobody can.\n if (!canRecord) return;\n // The bridge itself, not the app layer's helper, which would bring every\n // contract into this module, mounted above a host's routes. Any Electron\n // app that embeds these pages can offer it, not only the Opengeni app.\n const detection = getDesktopMeetingDetection();\n if (!detection) return;\n return detection.onRequest((request) => {\n const recorder = store.get();\n if (request.kind === \"record\") {\n // Nobody signed in: a start kept for later would record, for whoever\n // signs in next, a call that may be long over.\n if (latest.current.signedOut) return;\n // The call app's name is only a guess at the meeting's; the calendar\n // event a reminder joined names it.\n const start: MeetingStartRequest = {\n title: request.title,\n titleSource: \"app\",\n ...(request.calendarEvent ? { calendarEvent: request.calendarEvent } : {}),\n };\n // Already recording shows that recording rather than start a second\n // one, unless the person chose to switch to recording the next meeting:\n // this one stops and is kept, then the next starts.\n if (canStartRecording(recorder?.state)) {\n store.requestStart(start);\n } else if (\n request.replace === true &&\n recorder &&\n (recorder.state === \"recording\" || recorder.state === \"paused\")\n ) {\n // A stop that fails leaves that recording showing its error, and starts nothing.\n void recorder.stop().then(\n () => store.requestStart(start),\n () => undefined,\n );\n }\n latest.current.onOpenMeetings?.();\n return;\n }\n const recordingId = recorder?.recordingId ?? null;\n const recordingWorkspaceId = store.workspaceId?.() ?? null;\n if (request.kind === \"open\") {\n // The app's menu: show the meeting this page records, its live transcript.\n const opened =\n recordingId && recordingWorkspaceId && capturing(recorder?.state)\n ? store.openMeeting?.(recordingId, recordingWorkspaceId)\n : false;\n if (!opened) latest.current.onOpenMeetings?.();\n return;\n }\n if (request.kind !== \"stop\") return;\n if (!recorder || (recorder.state !== \"recording\" && recorder.state !== \"paused\")) return;\n void recorder.stop().then(() => {\n if (recordingId && recordingWorkspaceId) {\n store.openMeeting?.(recordingId, recordingWorkspaceId);\n }\n });\n });\n }, [store, canRecord]);\n}\n\n/** The start a desktop notification asked for, until the recorder panel takes it. */\nexport function usePendingMeetingStart(): {\n request: MeetingStartRequest | null;\n take: () => MeetingStartRequest | null;\n} {\n const store = useContext(MeetingRecorderContext);\n const request = useSyncExternalStore(\n store?.subscribe ?? noopSubscribe,\n store?.pendingStart ?? nullSnapshot,\n nullSnapshot,\n );\n return { request, take: store?.takeStart ?? nullSnapshot };\n}\n\n/** The live recorder, loading it on first use. Null until the capture code is ready. */\nexport function useMeetingRecorder(): {\n recorder: MeetingRecorder | null;\n finished: readonly string[];\n /** The workspace the recorder's recording is in; may differ from the one shown. */\n workspaceId: string | null;\n /**\n * Open a meeting the recorder made in its own workspace. False when the\n * host gave no way to, so the caller opens it as usual.\n */\n openMeeting: (recordingId: string, workspaceId: string) => boolean;\n} {\n const store = useContext(MeetingRecorderContext);\n useEffect(() => store?.activate(), [store]);\n const recorder = useSyncExternalStore(\n store?.subscribe ?? noopSubscribe,\n store?.get ?? nullSnapshot,\n nullSnapshot,\n );\n const finished = useSyncExternalStore(\n store?.subscribe ?? noopSubscribe,\n store?.finished ?? (() => NO_FINISHED),\n () => NO_FINISHED,\n );\n const workspaceId = useSyncExternalStore(\n store?.subscribe ?? noopSubscribe,\n store?.workspaceId ?? nullSnapshot,\n nullSnapshot,\n );\n return { recorder, finished, workspaceId, openMeeting: store?.openMeeting ?? neverOpens };\n}\n\n/** Only the recorder's state word, for the rail: re-renders on state changes, not on every tick. */\nexport function useMeetingRecorderState(): MeetingRecorder[\"state\"] | null {\n const store = useContext(MeetingRecorderContext);\n return useSyncExternalStore(\n store?.subscribe ?? noopSubscribe,\n () => store?.get()?.state ?? null,\n () => null,\n );\n}\n\n/**\n * The recorder's Start and Stop, for the app's actions (⌘K, keys, the desktop\n * menu bar). Null without a recorder provider. Re-renders on state changes,\n * not on every tick.\n */\nexport type MeetingRecorderControls = {\n /** The recorder's state; null until its capture code loads. */\n state: MeetingRecorder[\"state\"] | null;\n /** Whether this browser can record; null until the capture code loads. */\n supported: boolean | null;\n /**\n * Start recording as the Meetings page's Start recording button does, once\n * that page's recorder is ready; the caller shows Meetings next. Does\n * nothing while a recording is going.\n */\n requestStart: () => void;\n /** Stop the recording and open it, as a desktop call notification's Stop does. */\n stop: () => Promise<StoppedMeeting | null>;\n};\n\n/** The meeting a Stop ended; `opened` is false when the host gave no way to open it. */\nexport type StoppedMeeting = { recordingId: string; workspaceId: string; opened: boolean };\n\nexport function useMeetingRecorderControls(): MeetingRecorderControls | null {\n const store = useContext(MeetingRecorderContext);\n const state = useSyncExternalStore(\n store?.subscribe ?? noopSubscribe,\n () => store?.get()?.state ?? null,\n () => null,\n );\n const supported = useSyncExternalStore(\n store?.subscribe ?? noopSubscribe,\n () => store?.get()?.supported ?? null,\n () => null,\n );\n return useMemo(() => {\n if (!store) return null;\n return {\n state,\n supported,\n requestStart: () => {\n if (canStartRecording(store.get()?.state)) store.requestStart({ title: \"\" });\n },\n stop: async () => {\n const recorder = store.get();\n if (!recorder || (recorder.state !== \"recording\" && recorder.state !== \"paused\")) {\n return null;\n }\n const recordingId = recorder.recordingId;\n const recordingWorkspaceId = store.workspaceId?.() ?? null;\n await recorder.stop();\n if (!recordingId || !recordingWorkspaceId) return null;\n const opened = store.openMeeting?.(recordingId, recordingWorkspaceId) ?? false;\n return { recordingId, workspaceId: recordingWorkspaceId, opened };\n },\n };\n }, [store, state, supported]);\n}\n\nfunction noopSubscribe(): () => void {\n return () => {};\n}\n\nfunction nullSnapshot(): null {\n return null;\n}\n\nfunction neverOpens(): boolean {\n return false;\n}\n","/**\n * What the recorder's state word means for starting and keeping a recording.\n * Pure, so the app's action registry can read it without the recorder's\n * React context.\n */\nimport type { RecorderState } from \"@opengeni/sdk/recordings\";\n\n/** States in which the recorder holds a capture that unmounting its host would end. */\nexport function capturing(state: RecorderState | null | undefined): boolean {\n return (\n state === \"starting\" || state === \"recording\" || state === \"paused\" || state === \"stopping\"\n );\n}\n\n/**\n * States in which Start recording starts a new recording: nothing recorded\n * yet, the last one stopped, or the last start failed. Null is a recorder\n * whose capture code hasn't loaded yet.\n */\nexport function canStartRecording(state: RecorderState | null | undefined): boolean {\n return !capturing(state);\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-D7E3BSCX.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-QIJHK6P4.js.map
|
|
@@ -23,13 +23,13 @@ import {
|
|
|
23
23
|
readChatDirectory,
|
|
24
24
|
recordChatVisit,
|
|
25
25
|
rememberChats
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-6BG5HCUP.js";
|
|
27
27
|
import {
|
|
28
28
|
FORK_CURRENT_CHAT_EVENT,
|
|
29
29
|
OPEN_COMMAND_MENU_EVENT,
|
|
30
30
|
RENAME_CURRENT_CHAT_EVENT,
|
|
31
31
|
useRail
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-ATNKMGLO.js";
|
|
33
33
|
import {
|
|
34
34
|
requestConversationFind
|
|
35
35
|
} from "./chunk-7ZEGSUR7.js";
|
|
@@ -47,7 +47,7 @@ import {
|
|
|
47
47
|
} from "./chunk-FWXMQTVG.js";
|
|
48
48
|
import {
|
|
49
49
|
t
|
|
50
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-C3NS74PZ.js";
|
|
51
51
|
import {
|
|
52
52
|
hasWorkspacePermission
|
|
53
53
|
} from "./chunk-H2ALCTWC.js";
|
|
@@ -81,14 +81,14 @@ import {
|
|
|
81
81
|
} from "./chunk-O4OOG3D6.js";
|
|
82
82
|
import {
|
|
83
83
|
meetingTitle
|
|
84
|
-
} from "./chunk-
|
|
84
|
+
} from "./chunk-E2KPRSA4.js";
|
|
85
85
|
import {
|
|
86
86
|
sessionDisplayTitle
|
|
87
|
-
} from "./chunk-
|
|
87
|
+
} from "./chunk-FUGGM76A.js";
|
|
88
88
|
import {
|
|
89
89
|
canStartRecording,
|
|
90
90
|
useMeetingRecorderControls
|
|
91
|
-
} from "./chunk-
|
|
91
|
+
} from "./chunk-Q74FQK3A.js";
|
|
92
92
|
import {
|
|
93
93
|
workspacesByOrganization
|
|
94
94
|
} from "./chunk-NRP4REXE.js";
|
|
@@ -1353,4 +1353,4 @@ export {
|
|
|
1353
1353
|
useActionShortcut,
|
|
1354
1354
|
ActionsProvider
|
|
1355
1355
|
};
|
|
1356
|
-
//# sourceMappingURL=chunk-
|
|
1356
|
+
//# sourceMappingURL=chunk-QK3A23NP.js.map
|