@opengeni/react 6.5.2-canary.41607687019001 → 6.7.0
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.d.ts +4 -0
- package/dist/app/app-state.js +19 -14
- package/dist/app/components/Composer.js +25 -23
- package/dist/app/components/agent/agent-capability-picker.js +10 -8
- package/dist/app/components/artifacts/artifact-browse-controls.js +4 -4
- package/dist/app/components/artifacts/artifact-library.js +21 -19
- package/dist/app/components/artifacts/artifact-page-chrome.js +3 -3
- package/dist/app/components/artifacts/artifact-viewer.js +23 -22
- package/dist/app/components/artifacts/artifact-viewer.js.map +1 -1
- package/dist/app/components/artifacts/chat-interactive-block.js +12 -12
- package/dist/app/components/artifacts/copy-artifact-link.js +7 -5
- package/dist/app/components/artifacts/file-reach-dialog.js +11 -9
- package/dist/app/components/artifacts/inline-chat-image.js +18 -18
- package/dist/app/components/artifacts/retained-file-preview.js +24 -23
- package/dist/app/components/artifacts/retained-text-preview.js +3 -3
- package/dist/app/components/artifacts/site-audience.js +6 -5
- package/dist/app/components/artifacts/site-conversations.js +16 -14
- package/dist/app/components/artifacts/site-data.js +18 -16
- package/dist/app/components/artifacts/site-public-link.js +3 -2
- package/dist/app/components/artifacts/site-publishing-page.js +39 -37
- package/dist/app/components/artifacts/site-publishing.js +34 -32
- package/dist/app/components/artifacts/site-settings.js +38 -36
- package/dist/app/components/artifacts/site-version-menu.js +8 -7
- package/dist/app/components/billing-class-mark.js +3 -3
- package/dist/app/components/bots/bot-launch-strip.js +17 -17
- package/dist/app/components/bots/bot-template-dialog.js +30 -28
- package/dist/app/components/bots/bot-template-shortcuts.js +19 -19
- package/dist/app/components/bots/bot-templates-page.js +38 -36
- package/dist/app/components/bots/bot-templates-page.js.map +1 -1
- package/dist/app/components/capabilities/capability-detail-sheet.js +13 -11
- package/dist/app/components/capabilities/capability-logo-source.js +13 -13
- package/dist/app/components/capabilities/capability-logo.js +4 -3
- package/dist/app/components/capabilities/connector-tool-permissions.js +8 -6
- package/dist/app/components/capabilities/native-connect-setup.js +14 -14
- package/dist/app/components/capabilities/own-logins-shared-heads-up.js +7 -6
- package/dist/app/components/capabilities/perform-capability-action.js +7 -6
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +17 -17
- package/dist/app/components/capabilities/session-capability-card.js +72 -70
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.js +28 -26
- package/dist/app/components/capabilities/session-connection-accounts.js +4 -3
- package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -19
- package/dist/app/components/capabilities/session-github-card.js +22 -20
- package/dist/app/components/capabilities/session-machine-card.js +27 -25
- package/dist/app/components/capabilities/session-personal-github-card.js +16 -16
- package/dist/app/components/capabilities/session-plugin-card.js +10 -9
- package/dist/app/components/capabilities/use-capabilities-catalog.js +4 -3
- package/dist/app/components/capabilities/use-connection-accounts.js +5 -4
- package/dist/app/components/command-menu/chat-status.js +15 -13
- package/dist/app/components/command-menu/chat-switcher.js +35 -33
- package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
- package/dist/app/components/command-menu/command-menu.js +53 -50
- package/dist/app/components/command-menu/command-menu.js.map +1 -1
- package/dist/app/components/command-menu/shortcut-sheet.js +18 -16
- package/dist/app/components/command-menu/shortcut-sheet.js.map +1 -1
- package/dist/app/components/common.js +4 -3
- 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 +3 -3
- package/dist/app/components/credit-required-prompt.js +10 -8
- package/dist/app/components/credit-required-prompt.js.map +1 -1
- package/dist/app/components/credits/checkout-credits-celebration.js +3 -2
- package/dist/app/components/credits/checkout-return.js +3 -2
- package/dist/app/components/credits/checkout-return.js.map +1 -1
- package/dist/app/components/credits/coupon-redeem.js +5 -4
- package/dist/app/components/credits/credit-refusal-notice.js +7 -5
- package/dist/app/components/cross-slot-deep-link-recovery.js +5 -4
- package/dist/app/components/desktop/app-shots.js +13 -11
- package/dist/app/components/desktop/computer-use.js +6 -4
- package/dist/app/components/desktop/this-computer.js +9 -7
- package/dist/app/components/feedback.js +5 -4
- package/dist/app/components/follow-up-repository-menu-body.js +8 -6
- package/dist/app/components/follow-up-repository-menu-body.js.map +1 -1
- package/dist/app/components/follow-up-repository-picker.js +1 -1
- package/dist/app/components/github-app-connect-launcher.js +5 -4
- package/dist/app/components/in-app-help-link.js +3 -3
- package/dist/app/components/knowledge/agent-learning-settings.js +3 -2
- package/dist/app/components/knowledge/agent-learning-settings.js.map +1 -1
- package/dist/app/components/machines/connect-machine-dialog.js +18 -16
- package/dist/app/components/manual-repository-editor.js +3 -2
- package/dist/app/components/markdown.js +6 -6
- package/dist/app/components/models/models-ui.js +12 -10
- package/dist/app/components/my-things.js +12 -10
- package/dist/app/components/my-things.js.map +1 -1
- package/dist/app/components/new-session-starters.js +3 -3
- package/dist/app/components/own-where-it-works.js +9 -7
- 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 +7 -5
- package/dist/app/components/rail/project-glyph.js +17 -17
- package/dist/app/components/rail/project-profile.js +31 -29
- package/dist/app/components/rail/rail-context.js +3 -3
- package/dist/app/components/rail/rail-sections.js +68 -66
- package/dist/app/components/rail/session-header.js +59 -57
- package/dist/app/components/rail/session-list.js +66 -64
- package/dist/app/components/rail/session-row-content.js +4 -4
- package/dist/app/components/rail/session-row-hover-details.js +14 -12
- package/dist/app/components/rail/session-shell.js +90 -88
- package/dist/app/components/rail/site-session-group-heading.js +8 -8
- package/dist/app/components/repository-picker.js +8 -6
- package/dist/app/components/secrets/session-secrets-panel.js +4 -3
- package/dist/app/components/secrets/vault-model.js +3 -2
- package/dist/app/components/session/agent-configuration-panel.js +25 -23
- package/dist/app/components/session/agent-configuration-panel.js.map +1 -1
- package/dist/app/components/session/artifact-link-boundary.js +3 -3
- package/dist/app/components/session/artifact-session-page.js +11 -9
- package/dist/app/components/session/banners.js +8 -8
- package/dist/app/components/session/codex-usage-notice.js +5 -3
- package/dist/app/components/session/console-new-conversation.js +42 -40
- package/dist/app/components/session/context-text-reader.js +3 -2
- package/dist/app/components/session/descendant-requests.js +39 -37
- package/dist/app/components/session/descendant-requests.js.map +1 -1
- package/dist/app/components/session/editable-artifacts-workspace.js +36 -34
- package/dist/app/components/session/editable-artifacts-workspace.js.map +1 -1
- package/dist/app/components/session/failed-session-banner.js +13 -11
- package/dist/app/components/session/failed-session-banner.js.map +1 -1
- 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 -31
- package/dist/app/components/session/inspector.js +57 -55
- package/dist/app/components/session/inspector.js.map +1 -1
- package/dist/app/components/session/message-actions.js +5 -4
- package/dist/app/components/session/message-actions.js.map +1 -1
- package/dist/app/components/session/message-resource-attachments.js +12 -11
- package/dist/app/components/session/message-resource-attachments.js.map +1 -1
- package/dist/app/components/session/model-context-inspector.js +6 -4
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +11 -9
- package/dist/app/components/session/new-session-setup-strip.js +18 -18
- package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
- package/dist/app/components/session/sandbox-switcher.js +10 -9
- package/dist/app/components/session/sandbox-workspace.js +47 -46
- 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 +13 -11
- package/dist/app/components/session/session-admission-notice.js +7 -5
- package/dist/app/components/session/session-avatar-picker.js +22 -20
- package/dist/app/components/session/session-avatar.js +16 -16
- package/dist/app/components/session/session-machine-access-notice.js +7 -5
- package/dist/app/components/session/session-profile-dialog.js +29 -27
- package/dist/app/components/session/session-profile-editor.js +30 -28
- package/dist/app/components/session/session-retention.js +10 -8
- package/dist/app/components/session/session-search-dialog.js +10 -10
- package/dist/app/components/session/session-skill-reviews.js +2 -1
- package/dist/app/components/session/session-skill-reviews.js.map +1 -1
- package/dist/app/components/session/session-tenancy-control.js +13 -11
- package/dist/app/components/session/session-tenancy-control.js.map +1 -1
- package/dist/app/components/session/session-unattended-setting.js +7 -5
- package/dist/app/components/session/session-usage-limit-section.js +11 -9
- package/dist/app/components/session/share-chat-dialog.js +9 -7
- package/dist/app/components/session/site-origin-link.js +3 -3
- package/dist/app/components/session/subagents.js +8 -8
- package/dist/app/components/session/subscription-account-indicator.js +6 -6
- package/dist/app/components/session-connectors-menu-body.js +4 -3
- package/dist/app/components/session-connectors-menu-body.js.map +1 -1
- package/dist/app/components/settings/row-select.js +7 -5
- package/dist/app/components/toaster.js +3 -2
- package/dist/app/components/transcription-settings.js +11 -9
- package/dist/app/components/ui/destructive-confirm.js +11 -9
- package/dist/app/components/usage/usage-entry.js +5 -5
- package/dist/app/components/window-bar.js +16 -14
- package/dist/app/components/workspace-composer-plus.js +22 -21
- package/dist/app/components/workspace-reach.js +6 -4
- package/dist/app/components/workspace-tenant-boundary.js +5 -4
- package/dist/app/embed/memory-navigation.js +3 -3
- package/dist/app/embed/session-app.js +211 -209
- package/dist/app/lib/actions/actions-provider.js +15 -13
- package/dist/app/lib/agent-capabilities.js +3 -3
- package/dist/app/lib/app-surfaces.js +7 -6
- package/dist/app/lib/archive-session.d.ts +9 -4
- package/dist/app/lib/archive-session.js +4 -2
- package/dist/app/lib/bot-templates.js +3 -2
- package/dist/app/lib/capabilities.js +3 -2
- package/dist/app/lib/codex-usage-query.js +2 -2
- package/dist/app/lib/composer-connectors.js +17 -16
- package/dist/app/lib/console-site.js +2 -2
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/events.js +9 -9
- package/dist/app/lib/failed-session-copy.js +3 -3
- package/dist/app/lib/inbox.js +4 -2
- 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/navigation.js +2 -2
- package/dist/app/lib/session-branch-cache.js +6 -6
- package/dist/app/lib/session-create.js +4 -4
- package/dist/app/lib/session-group-pagination.js +6 -6
- package/dist/app/lib/session-hover-facts.js +13 -11
- package/dist/app/lib/session-model.js +2 -2
- package/dist/app/lib/session-rail.js +3 -3
- package/dist/app/lib/session-rename.js +3 -3
- package/dist/app/lib/session-restart-operation-controller.js +4 -3
- package/dist/app/lib/session-tenancy.js +3 -2
- package/dist/app/lib/session-usage-limit.js +3 -2
- package/dist/app/lib/sessions-group.js +5 -5
- package/dist/app/lib/site-publishing.js +3 -2
- package/dist/app/lib/site-tool-consent-dialog.js +9 -7
- package/dist/app/lib/site-tool-consent-dialog.js.map +1 -1
- package/dist/app/lib/site-tool-consent.js +1 -1
- package/dist/app/lib/subscription-plans.js +3 -2
- package/dist/app/lib/toast.js +2 -1
- package/dist/app/lib/turn-failure-analytics.js +4 -4
- package/dist/app/lib/use-duplicate-site.js +6 -5
- package/dist/app/lib/use-follow-up-repositories.js +6 -5
- package/dist/app/lib/use-workspace-integrations.js +4 -3
- package/dist/app/lib/use-workspace-machines.js +4 -4
- package/dist/app/lib/use-workspace-model-catalog.js +5 -4
- 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 +67 -66
- package/dist/app/routes/artifacts.js.map +1 -1
- package/dist/app/routes/retained-artifact.js +42 -40
- package/dist/app/routes/retained-artifact.js.map +1 -1
- package/dist/app/routes/session-unavailable.js +8 -7
- package/dist/app/routes/session.js +119 -117
- package/dist/app/routes/sessions-index-hydration.js +5 -5
- package/dist/app/routes/sessions-index.js +104 -102
- package/dist/app/routes/site-view.js +67 -65
- package/dist/app/routes/site-view.js.map +1 -1
- 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 +17 -15
- package/dist/automations.js.map +1 -1
- package/dist/browser-viewer-TC27OCIP.js +23 -0
- package/dist/chat-interactive-block-RWPQBHVS.js +18 -0
- package/dist/chunk-2BDT3UZQ.js +229 -0
- package/dist/chunk-2CLNIEK4.js +373 -0
- package/dist/chunk-2FSBSCZJ.js +451 -0
- package/dist/chunk-2I7HDP53.js +199 -0
- package/dist/chunk-2INLDVK3.js +15 -0
- package/dist/chunk-2KALVELR.js +126 -0
- package/dist/chunk-2M3J7ZWQ.js +418 -0
- package/dist/chunk-2OP6WLGV.js +708 -0
- package/dist/chunk-2RG7NIAS.js +2936 -0
- package/dist/chunk-2STUPWEL.js +135 -0
- package/dist/chunk-2YUOVM3G.js +271 -0
- package/dist/chunk-2Z3NQNTM.js +3670 -0
- package/dist/chunk-3CPWWGNK.js +920 -0
- package/dist/chunk-3ED2U6XE.js +37 -0
- package/dist/chunk-3GZA4BUW.js +216 -0
- package/dist/chunk-3IK6UYO6.js +1022 -0
- package/dist/chunk-3PZ7JZI2.js +431 -0
- package/dist/chunk-4DVJ6ONS.js +50 -0
- package/dist/chunk-4DVNUCRR.js +2386 -0
- package/dist/chunk-4DVNUCRR.js.map +1 -0
- package/dist/chunk-4E3ZJRTZ.js +41 -0
- package/dist/chunk-4SAWSRAA.js +141 -0
- package/dist/chunk-53AGXXZM.js +307 -0
- package/dist/chunk-54YW6SZZ.js +818 -0
- package/dist/chunk-57AZS3IE.js +2317 -0
- package/dist/chunk-5CPEEAFD.js +143 -0
- package/dist/chunk-5EWSRZ2Y.js +340 -0
- package/dist/chunk-5IE76VCY.js +387 -0
- package/dist/chunk-5NWEKLDZ.js +170 -0
- package/dist/chunk-5O2FCCHZ.js +198 -0
- package/dist/chunk-5QAY6K77.js +399 -0
- package/dist/chunk-5YKW2K6I.js +625 -0
- package/dist/chunk-5YKW2K6I.js.map +1 -0
- package/dist/chunk-6BCXNDEI.js +4116 -0
- package/dist/chunk-6BCXNDEI.js.map +1 -0
- package/dist/chunk-6DK6Z4UN.js +2599 -0
- package/dist/chunk-6DVCC7QS.js +702 -0
- package/dist/chunk-6JHU2UBS.js +2058 -0
- package/dist/chunk-6PZ7OBYU.js +490 -0
- package/dist/chunk-6WD2INST.js +539 -0
- package/dist/chunk-6WD2INST.js.map +1 -0
- package/dist/chunk-6WGRDRMA.js +163 -0
- package/dist/chunk-77WAKEAH.js +186 -0
- package/dist/chunk-7T2ZE3VT.js +5558 -0
- package/dist/chunk-7T2ZE3VT.js.map +1 -0
- package/dist/chunk-7TDO3CUM.js +393 -0
- package/dist/chunk-7TIX2UAR.js +247 -0
- package/dist/chunk-7V5REBCP.js +148 -0
- package/dist/chunk-7VMZGLYI.js +339 -0
- package/dist/chunk-7W37NS3I.js +236 -0
- package/dist/chunk-7X6SDK2C.js +111 -0
- package/dist/chunk-7ZNUHRP5.js +95 -0
- package/dist/chunk-A36PZALD.js +84 -0
- package/dist/chunk-AUI6VA63.js +107 -0
- package/dist/chunk-AW2MQB37.js +24 -0
- package/dist/chunk-AWKES45Y.js +198 -0
- package/dist/chunk-AXHZYXUV.js +132 -0
- package/dist/chunk-BHNSJVBC.js +129 -0
- package/dist/chunk-BJEJFISW.js +50 -0
- package/dist/chunk-BJFH6JI5.js +422 -0
- package/dist/chunk-BMICEQZQ.js +960 -0
- package/dist/chunk-BTLBYBLU.js +29 -0
- package/dist/chunk-BXBDYNRP.js +89 -0
- package/dist/chunk-C372BFOV.js +357 -0
- package/dist/chunk-C43KRXGA.js +234 -0
- package/dist/chunk-C43KRXGA.js.map +1 -0
- package/dist/chunk-CMKGILJK.js +4824 -0
- package/dist/chunk-CRAOSVHC.js +50 -0
- package/dist/chunk-CRU35QQH.js +281 -0
- package/dist/chunk-CUIWCGMA.js +172 -0
- package/dist/chunk-D5TWNFFE.js +38 -0
- package/dist/chunk-DF5EAHDN.js +4461 -0
- package/dist/chunk-DJAXC5OK.js +56 -0
- package/dist/chunk-DXBYWSL5.js +3550 -0
- package/dist/chunk-DXR5PDFP.js +84 -0
- package/dist/chunk-DZWARC4M.js +267 -0
- package/dist/chunk-DZXEDSQI.js +106 -0
- package/dist/chunk-E7XERZWC.js +48 -0
- package/dist/chunk-ECJBYNLJ.js +79 -0
- package/dist/chunk-EDI6SJ2N.js +43 -0
- package/dist/chunk-EWSOC6WF.js +114 -0
- package/dist/chunk-F2OPHAUN.js +103 -0
- package/dist/chunk-F4ISQGGM.js +81 -0
- package/dist/chunk-FO4LYKJL.js +197 -0
- package/dist/chunk-FPXASDG5.js +73 -0
- package/dist/chunk-FSOQDUCG.js +117 -0
- package/dist/chunk-FSOQDUCG.js.map +1 -0
- package/dist/chunk-FVXBNBHO.js +157 -0
- package/dist/chunk-FYWT2O76.js +34 -0
- package/dist/chunk-FYWT2O76.js.map +1 -0
- package/dist/chunk-FZC5N55X.js +981 -0
- package/dist/chunk-GAVYGBFI.js +99 -0
- package/dist/chunk-GFIMOUDT.js +846 -0
- package/dist/chunk-GFIMOUDT.js.map +1 -0
- package/dist/chunk-GKVJIDHF.js +33 -0
- package/dist/chunk-GVN5SZLX.js +212 -0
- package/dist/chunk-H3T7IWNA.js +134 -0
- package/dist/chunk-HAX4LCR5.js +261 -0
- package/dist/chunk-HC4JFZVU.js +121 -0
- package/dist/chunk-HEFPPMBQ.js +581 -0
- package/dist/chunk-HGKTHF2U.js +1356 -0
- package/dist/chunk-HGKTHF2U.js.map +1 -0
- package/dist/chunk-HNLR7Q4Z.js +83 -0
- package/dist/chunk-HSOXMJOT.js +12 -0
- package/dist/chunk-I4MRDSUF.js +281 -0
- package/dist/chunk-I4QEJ62Y.js +202 -0
- package/dist/chunk-I5B5L6Q4.js +56 -0
- package/dist/chunk-I5QZJODL.js +264 -0
- package/dist/chunk-I7ITSXSJ.js +603 -0
- package/dist/chunk-I7XIZRFD.js +390 -0
- package/dist/chunk-IDANQPRH.js +82 -0
- package/dist/chunk-IFB3WJ36.js +212 -0
- package/dist/chunk-IHTAKKTK.js +264 -0
- package/dist/chunk-IKXNLWAL.js +205 -0
- package/dist/chunk-IKXNLWAL.js.map +1 -0
- package/dist/chunk-ILDXWY37.js +173 -0
- package/dist/chunk-IMDQUHBJ.js +570 -0
- package/dist/chunk-IMZCQBOT.js +119 -0
- package/dist/chunk-IXPTECSC.js +403 -0
- package/dist/chunk-J255A3N5.js +71 -0
- package/dist/chunk-J5F5HPPW.js +141 -0
- package/dist/chunk-JDTGRRNU.js +5045 -0
- package/dist/chunk-JDTGRRNU.js.map +1 -0
- package/dist/chunk-JEA3QDX7.js +2469 -0
- package/dist/chunk-JEUPAVYY.js +156 -0
- package/dist/chunk-JKHKLL5W.js +194 -0
- package/dist/chunk-JQL7ZH6C.js +650 -0
- package/dist/chunk-JWB44UGJ.js +57 -0
- package/dist/chunk-JZ4NLCAP.js +333 -0
- package/dist/chunk-K2A5PXQ5.js +412 -0
- package/dist/chunk-K56XV3C3.js +623 -0
- package/dist/chunk-K6GAXXVA.js +23 -0
- package/dist/chunk-KCBMFSMS.js +199 -0
- package/dist/chunk-KF2FV3ZJ.js +268 -0
- package/dist/chunk-KJD65EJP.js +278 -0
- package/dist/chunk-KLEUWIMZ.js +386 -0
- package/dist/chunk-KODELWYT.js +309 -0
- package/dist/chunk-KRDR5RJD.js +83 -0
- package/dist/chunk-KUDGXAF7.js +914 -0
- package/dist/chunk-KY2R73CG.js +171 -0
- package/dist/chunk-KY2R73CG.js.map +1 -0
- package/dist/chunk-KYS77RPN.js +85 -0
- package/dist/chunk-L7YTNTIK.js +368 -0
- package/dist/chunk-LHPNABDH.js +686 -0
- package/dist/chunk-MFROMEKA.js +401 -0
- package/dist/chunk-MIHN76LX.js +2656 -0
- package/dist/chunk-MIYFS2XN.js +42 -0
- package/dist/chunk-MJUCFQMS.js +65 -0
- package/dist/chunk-MM4FNWI4.js +3064 -0
- package/dist/chunk-MNZG4OHU.js +790 -0
- package/dist/chunk-MVW6HNPI.js +250 -0
- package/dist/chunk-MVW6HNPI.js.map +1 -0
- package/dist/chunk-N6AACDUW.js +200 -0
- package/dist/chunk-NC55IFN3.js +781 -0
- package/dist/chunk-NC7PVOEK.js +98 -0
- package/dist/chunk-NCYMNCJO.js +70 -0
- package/dist/chunk-ND2BXV3P.js +259 -0
- package/dist/chunk-NDBTFUO6.js +272 -0
- package/dist/chunk-NDQJZ7HF.js +206 -0
- package/dist/chunk-NGJJJPZZ.js +162 -0
- package/dist/chunk-NJTSNNE7.js +251 -0
- package/dist/chunk-NPGISCU6.js +4159 -0
- package/dist/chunk-NPGISCU6.js.map +1 -0
- package/dist/chunk-NRTE7DNV.js +1270 -0
- package/dist/chunk-NULUNM7H.js +290 -0
- package/dist/chunk-NUNZS36W.js +227 -0
- package/dist/chunk-NW53H5RW.js +2424 -0
- package/dist/chunk-NXCMHIKI.js +263 -0
- package/dist/chunk-O3LKCBP5.js +159 -0
- package/dist/chunk-O4EA4F3W.js +103 -0
- package/dist/chunk-O4EA4F3W.js.map +1 -0
- package/dist/chunk-O4OOG3D6.js +116 -0
- package/dist/chunk-O4OOG3D6.js.map +1 -0
- package/dist/chunk-O6N4ABCA.js +376 -0
- package/dist/chunk-O732GAFC.js +112 -0
- package/dist/chunk-OF4TIKYC.js +690 -0
- package/dist/chunk-OMPVOMPP.js +70 -0
- package/dist/chunk-OPJJSKUK.js +118 -0
- package/dist/chunk-OPWCMA4D.js +196 -0
- package/dist/chunk-ORJPS5VN.js +1193 -0
- package/dist/chunk-OSY5K7L7.js +187 -0
- package/dist/chunk-OV6QJRT4.js +45 -0
- package/dist/chunk-OVKYVZMW.js +108 -0
- package/dist/chunk-OZCBM3UC.js +171 -0
- package/dist/chunk-P3A2EINJ.js +61 -0
- package/dist/chunk-PTAG4PDC.js +27 -0
- package/dist/chunk-PTF5B7TJ.js +298 -0
- package/dist/chunk-Q3DPEYX4.js +848 -0
- package/dist/chunk-Q6CGOPJD.js +215 -0
- package/dist/chunk-Q6CGOPJD.js.map +1 -0
- package/dist/chunk-QB2KMIDP.js +100 -0
- package/dist/chunk-QCSJ4CWE.js +1067 -0
- package/dist/chunk-QIOQ2NPQ.js +414 -0
- package/dist/chunk-QK5EFEUT.js +353 -0
- package/dist/chunk-QPQBLYQJ.js +41 -0
- package/dist/chunk-QPSGCC5D.js +184 -0
- package/dist/chunk-QZAAUQRN.js +474 -0
- package/dist/chunk-QZM6YDJW.js +489 -0
- package/dist/chunk-QZM6YDJW.js.map +1 -0
- package/dist/chunk-RGBI63KJ.js +188 -0
- package/dist/chunk-RLBKLAEY.js +138 -0
- package/dist/chunk-RMFKVOM7.js +304 -0
- package/dist/chunk-ROKQU7WG.js +258 -0
- package/dist/chunk-RPVREAU7.js +251 -0
- package/dist/chunk-RQKLF42C.js +723 -0
- package/dist/chunk-SC6RRD2D.js +38 -0
- package/dist/chunk-SC6RRD2D.js.map +1 -0
- package/dist/chunk-SEO7TICN.js +94 -0
- package/dist/chunk-SHHJCL7X.js +432 -0
- package/dist/chunk-SIRLACNZ.js +114 -0
- package/dist/chunk-SKPHMYAA.js +237 -0
- package/dist/chunk-SODC7T6L.js +1583 -0
- package/dist/chunk-SQJIKMN3.js +366 -0
- package/dist/chunk-SVINDKVW.js +26 -0
- package/dist/chunk-SYCDHPZF.js +335 -0
- package/dist/chunk-T2QX3FDP.js +133 -0
- package/dist/chunk-T3OWFVMS.js +1187 -0
- package/dist/chunk-T6XI5FLY.js +61 -0
- package/dist/chunk-T7OXJZCX.js +62 -0
- package/dist/chunk-TAT5USZN.js +353 -0
- package/dist/chunk-TPQTRNER.js +172 -0
- package/dist/chunk-TUIN4MB7.js +266 -0
- package/dist/chunk-TX3VECZU.js +71 -0
- package/dist/chunk-TXLIEOJX.js +9624 -0
- package/dist/chunk-U3DN4HEY.js +27 -0
- package/dist/chunk-U7XM7CB4.js +191 -0
- package/dist/chunk-UJK53QFL.js +140 -0
- package/dist/chunk-UMTXA2TH.js +319 -0
- package/dist/chunk-UPDSXFK5.js +199 -0
- package/dist/chunk-UTIAXH52.js +269 -0
- package/dist/chunk-UVN5TMHU.js +1184 -0
- package/dist/chunk-V4Z4B2E3.js +52 -0
- package/dist/chunk-V4Z4B2E3.js.map +1 -0
- package/dist/chunk-VGYXW3VG.js +246 -0
- package/dist/chunk-VS7AHPCZ.js +255 -0
- package/dist/chunk-VTTAJOQ7.js +121 -0
- package/dist/chunk-VWPOLUAO.js +99 -0
- package/dist/chunk-X3MWB2QU.js +3851 -0
- package/dist/chunk-X6KAJI3V.js +211 -0
- package/dist/chunk-XBLRHV5R.js +50 -0
- package/dist/chunk-XDFP2LMW.js +605 -0
- package/dist/chunk-XEQMZB3C.js +525 -0
- package/dist/chunk-XEYLT5VA.js +223 -0
- package/dist/chunk-XHIQ5I6N.js +918 -0
- package/dist/chunk-XLH7QY2R.js +378 -0
- package/dist/chunk-XWFAMUZQ.js +113 -0
- package/dist/chunk-Y4BB2KS2.js +294 -0
- package/dist/chunk-Y4BB2KS2.js.map +1 -0
- package/dist/chunk-Y4OBB2VN.js +84 -0
- package/dist/chunk-YCVD6CI3.js +234 -0
- package/dist/chunk-YENLNISG.js +270 -0
- package/dist/chunk-YIRVLKAX.js +351 -0
- package/dist/chunk-YL73CVNK.js +390 -0
- package/dist/chunk-YLS6QE5G.js +288 -0
- package/dist/chunk-YNF2OC54.js +366 -0
- package/dist/chunk-YNF2OC54.js.map +1 -0
- package/dist/chunk-YPWU5KPE.js +147 -0
- package/dist/chunk-YQXTDZSU.js +2984 -0
- package/dist/chunk-YSJEAAOL.js +178 -0
- package/dist/chunk-YWIFM7D7.js +499 -0
- package/dist/chunk-YWVI6ZMK.js +103 -0
- package/dist/chunk-Z4FMAFNH.js +847 -0
- package/dist/chunk-Z654FWNU.js +136 -0
- package/dist/chunk-Z7Y523PS.js +130 -0
- package/dist/chunk-ZD67RM6G.js +60 -0
- package/dist/chunk-ZEG4VPBL.js +187 -0
- package/dist/chunk-ZHDFQITM.js +283 -0
- package/dist/chunk-ZHDFQITM.js.map +1 -0
- package/dist/chunk-ZLYCOBHW.js +75 -0
- package/dist/chunk-ZNJ5MTXV.js +89 -0
- package/dist/chunk-ZSGY3H53.js +155 -0
- package/dist/chunk-ZTPXACWB.js +1788 -0
- package/dist/chunk-ZUA3JMI6.js +107 -0
- package/dist/chunk-ZYAZUPPV.js +559 -0
- package/dist/composer.js +8 -8
- package/dist/computer-viewer-TDDO25AV.js +21 -0
- package/dist/connect.js +12 -12
- package/dist/desktop-dictation.js +12 -10
- package/dist/desktop-dictation.js.map +1 -1
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/embedded-new-voice-2G3VLPVQ.js +24 -0
- package/dist/embedded-voice-T5IWOWGD.js +24 -0
- package/dist/fleet-decision-row-WM64KXP3.js +361 -0
- package/dist/in-chat-connect-model.js +5 -5
- package/dist/index.js +51 -51
- package/dist/interaction.js +5 -5
- package/dist/machines.js +3 -3
- package/dist/meetings-recorder.js +1 -1
- package/dist/meetings.js +40 -32
- package/dist/meetings.js.map +1 -1
- package/dist/messages/en.d.ts +3 -0
- package/dist/messages.js +1 -1
- package/dist/model-policy-picker-menu-SMC6J6QN.js +22 -0
- package/dist/payment-page-card-G4U63KUV.js +223 -0
- package/dist/platform-activity-row-BUZGZAKZ.js +128 -0
- package/dist/queue-surface-implementation-4KUZ4PJV.js +908 -0
- package/dist/realtime.js +4 -4
- package/dist/recorder-host-WF2RRR56.js +69 -0
- package/dist/recorder-host-WF2RRR56.js.map +1 -0
- package/dist/recordings.js +3 -3
- package/dist/sandbox-files-ESDMOFSD.js +27 -0
- package/dist/session-app.js +211 -209
- package/dist/session-connect-cards-Q53KMMYY.js +25 -0
- package/dist/session-list-model.js +2 -2
- package/dist/session-realtime-CF3I35WJ.js +30 -0
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +33 -31
- package/dist/session.js +5 -5
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline-annotation-markers-CJK4RYZ4.js +157 -0
- package/dist/timeline-annotation-selection-67GF5H26.js +208 -0
- package/dist/timeline-annotations-dialog-ONJPQDJQ.js +283 -0
- package/dist/ui/access-list.js +11 -9
- package/dist/ui/access-list.js.map +1 -1
- package/dist/ui/api-error.d.ts +6 -3
- package/dist/ui/api-error.js +2 -1
- package/dist/ui/cadence-picker.js +6 -4
- package/dist/ui/choice-cards.js +5 -3
- package/dist/ui/confirm-dialog.js +2 -2
- package/dist/ui/copy-field.js +5 -3
- package/dist/ui/detail-page.js +2 -2
- package/dist/ui/detail-sheet.js +2 -2
- package/dist/ui/diff-view.js +4 -3
- package/dist/ui/disclosure.js +3 -3
- package/dist/ui/email-chips-input.js +5 -3
- package/dist/ui/error-message.js +2 -1
- package/dist/ui/error-reference.d.ts +15 -0
- package/dist/ui/error-text.d.ts +10 -0
- package/dist/ui/error-text.js +9 -0
- package/dist/ui/error-text.js.map +1 -0
- package/dist/ui/field.js +4 -2
- package/dist/ui/flush-form-page.js +8 -6
- package/dist/ui/form-dialog.js +7 -5
- package/dist/ui/list-row.js +3 -3
- package/dist/ui/load-failure.js +3 -2
- package/dist/ui/load-failure.js.map +1 -1
- package/dist/ui/notice.js +3 -1
- package/dist/ui/relative-time.js +2 -2
- package/dist/ui/revision-history.js +9 -7
- package/dist/ui/revision-history.js.map +1 -1
- package/dist/ui/role-select.js +10 -8
- package/dist/ui/segmented-control.js +4 -2
- package/dist/ui/select-menu.js +5 -3
- package/dist/ui/setting-row.js +3 -1
- package/dist/ui/switch.js +4 -2
- package/dist/ui/usage-meter.js +3 -3
- package/dist/ui/word-list-row.js +4 -2
- package/dist/usage.js +2 -2
- package/dist/workbench.js +4 -4
- package/package.json +5 -6
- package/src/app/app-state.tsx +126 -14
- package/src/app/components/artifacts/site-data.tsx +2 -2
- package/src/app/components/artifacts/site-settings.tsx +2 -2
- package/src/app/components/rail/session-list.tsx +7 -8
- package/src/app/components/rail/session-shell.tsx +3 -3
- package/src/app/components/repository-picker.tsx +8 -1
- package/src/app/components/session/model-context-inspector.tsx +2 -1
- package/src/app/components/session/session-admin-access.tsx +2 -2
- package/src/app/lib/actions/chat-operations.ts +4 -4
- package/src/app/lib/archive-session.test.tsx +265 -2
- package/src/app/lib/archive-session.tsx +175 -9
- package/src/app/lib/copy-link.ts +2 -2
- package/src/app/lib/inbox.tsx +2 -2
- package/src/app/lib/session-failure-toasts.ts +3 -2
- package/src/app/lib/toast.test.tsx +215 -0
- package/src/app/lib/toast.tsx +67 -2
- package/src/app/personal-github-reconnect.test.tsx +356 -0
- package/src/app/routes/artifacts.tsx +1 -2
- package/src/components/tool-action-review.tsx +14 -1
- package/src/meetings/delete-meeting-dialog.tsx +2 -1
- package/src/meetings/meeting-ask.tsx +2 -1
- package/src/meetings/meeting-detail-page.tsx +2 -1
- package/src/meetings/meeting-notes.tsx +2 -1
- package/src/meetings/meeting-settings.tsx +4 -1
- package/src/meetings/meeting-transcript.tsx +4 -1
- package/src/meetings/recorder-context.tsx +10 -0
- package/src/meetings/recorder-host.test.tsx +60 -2
- package/src/meetings/recorder-host.tsx +16 -3
- package/src/meetings/recorder-panel.tsx +2 -1
- package/src/meetings/recorder-workspace.test.tsx +26 -1
- package/src/messages/en.ts +6 -0
- package/src/ui/api-error.test.ts +29 -5
- package/src/ui/api-error.tsx +10 -4
- package/src/ui/error-message.tsx +8 -0
- package/src/ui/error-reference.test.ts +54 -0
- package/src/ui/error-reference.ts +51 -0
- package/src/ui/error-text.test.tsx +66 -0
- package/src/ui/error-text.tsx +49 -0
- package/src/ui/field.tsx +4 -1
- package/src/ui/notice.tsx +7 -2
- package/src/ui/setting-row.tsx +4 -1
- package/styles/app.css +12 -0
- package/styles/compiled.css +9 -0
- package/dist/browser-viewer-NOP5EAUO.js +0 -23
- package/dist/chat-interactive-block-G7O44JHR.js +0 -18
- package/dist/chunk-26RWVLRD.js +0 -135
- package/dist/chunk-2AHTY7OT.js +0 -247
- package/dist/chunk-2GDNWKSC.js +0 -3670
- package/dist/chunk-2JENKGCE.js +0 -339
- package/dist/chunk-2KYQC4T5.js +0 -155
- package/dist/chunk-2RREGDQH.js +0 -708
- package/dist/chunk-2T7DX6KR.js +0 -353
- package/dist/chunk-2VB2O4FQ.js +0 -920
- package/dist/chunk-2VTTKH23.js +0 -94
- package/dist/chunk-2XNG2KNT.js +0 -172
- package/dist/chunk-2YC6JQRO.js +0 -399
- package/dist/chunk-2ZVRJRXC.js +0 -27
- package/dist/chunk-35737UT4.js +0 -162
- package/dist/chunk-366XZ4PM.js +0 -41
- package/dist/chunk-36MIDGAH.js +0 -199
- package/dist/chunk-3FD76LXM.js +0 -212
- package/dist/chunk-3OVIXY4O.js +0 -213
- package/dist/chunk-3OVIXY4O.js.map +0 -1
- package/dist/chunk-3QNRBEYH.js +0 -432
- package/dist/chunk-3QX55WLC.js +0 -15
- package/dist/chunk-3USJPT2S.js +0 -1022
- package/dist/chunk-42CMQ5VR.js +0 -251
- package/dist/chunk-4LPOWQJY.js +0 -42
- package/dist/chunk-4NBTZRKT.js +0 -79
- package/dist/chunk-4OXI6HCV.js +0 -118
- package/dist/chunk-4SZZAFYQ.js +0 -2317
- package/dist/chunk-4TQL3WP2.js +0 -140
- package/dist/chunk-4Y6BK7IU.js +0 -196
- package/dist/chunk-4YD7YZC5.js +0 -373
- package/dist/chunk-5DTST3TP.js +0 -81
- package/dist/chunk-5FH5LQVS.js +0 -130
- package/dist/chunk-5KWMYPJV.js +0 -847
- package/dist/chunk-5MUJDC6C.js +0 -84
- package/dist/chunk-5QM2WPKV.js +0 -41
- package/dist/chunk-5WUN7XPD.js +0 -1184
- package/dist/chunk-64PO2WXU.js +0 -1067
- package/dist/chunk-6AHATAAY.js +0 -431
- package/dist/chunk-6ED2YWBT.js +0 -56
- package/dist/chunk-6GXVYAGR.js +0 -170
- package/dist/chunk-6H4SJBPE.js +0 -85
- package/dist/chunk-6MT3HHUB.js +0 -84
- package/dist/chunk-6UHCBH4G.js +0 -198
- package/dist/chunk-6WLX3NR3.js +0 -198
- package/dist/chunk-73NXYYWE.js +0 -112
- package/dist/chunk-76ERNKIZ.js +0 -603
- package/dist/chunk-776QZ573.js +0 -57
- package/dist/chunk-7BYWOFVH.js +0 -171
- package/dist/chunk-7O5CGGIQ.js +0 -108
- package/dist/chunk-7QOHRZ67.js +0 -251
- package/dist/chunk-7WIDB4PL.js +0 -2058
- package/dist/chunk-7WKP3DYJ.js +0 -37
- package/dist/chunk-7XOVTPDI.js +0 -227
- package/dist/chunk-AB5MBIXY.js +0 -281
- package/dist/chunk-ADNMXBCX.js +0 -1193
- package/dist/chunk-AFBJTUFK.js +0 -202
- package/dist/chunk-ALVRWCXE.js +0 -61
- package/dist/chunk-AOHU6O3M.js +0 -247
- package/dist/chunk-AOHU6O3M.js.map +0 -1
- package/dist/chunk-APW4T4SW.js +0 -270
- package/dist/chunk-AXBSYWKX.js +0 -2656
- package/dist/chunk-B2I5ZW35.js +0 -422
- package/dist/chunk-B3LMRTRF.js +0 -223
- package/dist/chunk-BE2XENG2.js +0 -292
- package/dist/chunk-BE2XENG2.js.map +0 -1
- package/dist/chunk-BF4SADKX.js +0 -29
- package/dist/chunk-BKP43KK4.js +0 -1788
- package/dist/chunk-BM3NEZ6X.js +0 -781
- package/dist/chunk-BT3BAGB5.js +0 -216
- package/dist/chunk-BTSYDIVJ.js +0 -357
- package/dist/chunk-BUBNGKWG.js +0 -70
- package/dist/chunk-BVUJV5WR.js +0 -126
- package/dist/chunk-BZO5ZMUP.js +0 -27
- package/dist/chunk-C3HUF3M2.js +0 -157
- package/dist/chunk-C5QCAOES.js +0 -264
- package/dist/chunk-CGK6ALQU.js +0 -159
- package/dist/chunk-CPYGO76Q.js +0 -335
- package/dist/chunk-CQH4FWYA.js +0 -490
- package/dist/chunk-CZP5QXNB.js +0 -234
- package/dist/chunk-D2TOWEYH.js +0 -266
- package/dist/chunk-D6L4GHRH.js +0 -340
- package/dist/chunk-DKT3N37I.js +0 -50
- package/dist/chunk-DMMJIFKA.js +0 -84
- package/dist/chunk-DO74DQC7.js +0 -26
- package/dist/chunk-DOFJZ2JU.js +0 -83
- package/dist/chunk-DSXVY5WZ.js +0 -119
- package/dist/chunk-E337C2VK.js +0 -82
- package/dist/chunk-E6NRSRBE.js +0 -114
- package/dist/chunk-E6SQKHAU.js +0 -114
- package/dist/chunk-E7UIVD7F.js +0 -236
- package/dist/chunk-EGBII4CP.js +0 -229
- package/dist/chunk-EILSAQVJ.js +0 -200
- package/dist/chunk-ELL6HSYR.js +0 -307
- package/dist/chunk-EUBGLFFR.js +0 -73
- package/dist/chunk-EW6RNWSH.js +0 -212
- package/dist/chunk-EYUT5Y6V.js +0 -2599
- package/dist/chunk-F7U3QPZ3.js +0 -304
- package/dist/chunk-FBTJKSTM.js +0 -1270
- package/dist/chunk-FC2FTSK3.js +0 -2424
- package/dist/chunk-FOGNA3BU.js +0 -148
- package/dist/chunk-FQFKHNC7.js +0 -650
- package/dist/chunk-FTCHM755.js +0 -50
- package/dist/chunk-FXSHP4JZ.js +0 -3550
- package/dist/chunk-G6ZZC543.js +0 -818
- package/dist/chunk-G7FU6PUA.js +0 -100
- package/dist/chunk-GA4YEAMX.js +0 -3851
- package/dist/chunk-GE33BGB7.js +0 -12
- package/dist/chunk-GQ67HSJY.js +0 -570
- package/dist/chunk-GXXZ3WAK.js +0 -106
- package/dist/chunk-H2TCRX3H.js +0 -237
- package/dist/chunk-HLL4PBO7.js +0 -60
- package/dist/chunk-HLOEPV5C.js +0 -259
- package/dist/chunk-HUAGBS4O.js +0 -56
- package/dist/chunk-I36GSRUJ.js +0 -211
- package/dist/chunk-I6VBHT7S.js +0 -261
- package/dist/chunk-ICNNNOXE.js +0 -333
- package/dist/chunk-ICX64J4U.js +0 -172
- package/dist/chunk-ID36Y46W.js +0 -5046
- package/dist/chunk-ID36Y46W.js.map +0 -1
- package/dist/chunk-IGVVXLKJ.js +0 -559
- package/dist/chunk-IKJLSBUI.js +0 -2984
- package/dist/chunk-IKMUFDVS.js +0 -50
- package/dist/chunk-IKUNOX7F.js +0 -255
- package/dist/chunk-ILKDYBON.js +0 -288
- package/dist/chunk-IVYJX3OY.js +0 -187
- package/dist/chunk-JCY4CMDH.js +0 -107
- package/dist/chunk-JJZPLGIP.js +0 -474
- package/dist/chunk-JW33RV4V.js +0 -143
- package/dist/chunk-JWPA6ZPZ.js +0 -351
- package/dist/chunk-JZ4QXS6D.js +0 -50
- package/dist/chunk-K42OUZQ3.js +0 -386
- package/dist/chunk-K5TOVX5A.js +0 -206
- package/dist/chunk-K63HGHZX.js +0 -99
- package/dist/chunk-K6R5T44I.js +0 -75
- package/dist/chunk-KHJ5PXFM.js +0 -914
- package/dist/chunk-KJZRQ55O.js +0 -2319
- package/dist/chunk-KJZRQ55O.js.map +0 -1
- package/dist/chunk-KKI55ZMW.js +0 -65
- package/dist/chunk-KRPLAAFP.js +0 -199
- package/dist/chunk-KVFEZDBO.js +0 -134
- package/dist/chunk-L4I665WK.js +0 -45
- package/dist/chunk-L4OF77LE.js +0 -110
- package/dist/chunk-L4OF77LE.js.map +0 -1
- package/dist/chunk-LA5T52RM.js +0 -70
- package/dist/chunk-LM2W5YAT.js +0 -401
- package/dist/chunk-LQ62ECE6.js +0 -390
- package/dist/chunk-LQDUHU3Y.js +0 -71
- package/dist/chunk-LRJIYTZW.js +0 -4157
- package/dist/chunk-LRJIYTZW.js.map +0 -1
- package/dist/chunk-LRN6GYAZ.js +0 -138
- package/dist/chunk-M4SDVTKJ.js +0 -790
- package/dist/chunk-MA6O7CM6.js +0 -99
- package/dist/chunk-MBIBB6GI.js +0 -197
- package/dist/chunk-MF3ZFB4H.js +0 -199
- package/dist/chunk-MJJGJMYJ.js +0 -98
- package/dist/chunk-MLJADQFI.js +0 -4824
- package/dist/chunk-MQG7RV3B.js +0 -62
- package/dist/chunk-MTTGSQA5.js +0 -186
- package/dist/chunk-MW7Y3T55.js +0 -525
- package/dist/chunk-MYUFMVCH.js +0 -121
- package/dist/chunk-N3OARGH2.js +0 -61
- package/dist/chunk-NB2HMRT2.js +0 -353
- package/dist/chunk-NFDFYWMV.js +0 -141
- package/dist/chunk-NWGNFN3N.js +0 -1187
- package/dist/chunk-NWJRPDIO.js +0 -840
- package/dist/chunk-NWJRPDIO.js.map +0 -1
- package/dist/chunk-NXWBBZJV.js +0 -267
- package/dist/chunk-NY2QWROL.js +0 -71
- package/dist/chunk-O2IOPP3R.js +0 -848
- package/dist/chunk-O2UWH5RG.js +0 -141
- package/dist/chunk-O5YWDLYF.js +0 -393
- package/dist/chunk-OBMCZO7E.js +0 -121
- package/dist/chunk-OD3DCCCB.js +0 -132
- package/dist/chunk-OMH7R6I3.js +0 -390
- package/dist/chunk-OSA5EQG5.js +0 -113
- package/dist/chunk-OSJ3MUTZ.js +0 -2936
- package/dist/chunk-OWAYJ2OV.js +0 -368
- package/dist/chunk-OYXBFSGK.js +0 -269
- package/dist/chunk-PC2EBA5G.js +0 -4116
- package/dist/chunk-PC2EBA5G.js.map +0 -1
- package/dist/chunk-PC2MVXIP.js +0 -363
- package/dist/chunk-PC2MVXIP.js.map +0 -1
- package/dist/chunk-PENGLDR5.js +0 -309
- package/dist/chunk-PSMAWRPL.js +0 -191
- package/dist/chunk-PW4IMTYR.js +0 -702
- package/dist/chunk-PW54V7T5.js +0 -387
- package/dist/chunk-Q2EXYSMO.js +0 -24
- package/dist/chunk-Q2XJK5I4.js +0 -51
- package/dist/chunk-Q2XJK5I4.js.map +0 -1
- package/dist/chunk-Q4EFRI6X.js +0 -258
- package/dist/chunk-Q52CXW6C.js +0 -48
- package/dist/chunk-Q6XQ2R37.js +0 -184
- package/dist/chunk-QAJ53XBW.js +0 -23
- package/dist/chunk-QDTKECT4.js +0 -129
- package/dist/chunk-QE3ZFGI3.js +0 -43
- package/dist/chunk-QHHSUR2Y.js +0 -298
- package/dist/chunk-QHNVNR7B.js +0 -173
- package/dist/chunk-QIK2Q6N5.js +0 -376
- package/dist/chunk-QWL4L366.js +0 -38
- package/dist/chunk-R3J2PTVQ.js +0 -690
- package/dist/chunk-RBRX5ZS3.js +0 -319
- package/dist/chunk-REX6JIC7.js +0 -33
- package/dist/chunk-RGZ7EEC3.js +0 -537
- package/dist/chunk-RGZ7EEC3.js.map +0 -1
- package/dist/chunk-RIPS7GFR.js +0 -960
- package/dist/chunk-RTBZNFNV.js +0 -1354
- package/dist/chunk-RTBZNFNV.js.map +0 -1
- package/dist/chunk-SKMNW4SW.js +0 -187
- package/dist/chunk-SRFARKXC.js +0 -623
- package/dist/chunk-SWIHWCTW.js +0 -4461
- package/dist/chunk-TA5CFTO4.js +0 -103
- package/dist/chunk-TF4ZVJLI.js +0 -156
- package/dist/chunk-TG7DADJR.js +0 -9624
- package/dist/chunk-TI4R2ZD5.js +0 -623
- package/dist/chunk-TI4R2ZD5.js.map +0 -1
- package/dist/chunk-TNKWOUWP.js +0 -412
- package/dist/chunk-TNUSPXPW.js +0 -5555
- package/dist/chunk-TNUSPXPW.js.map +0 -1
- package/dist/chunk-TNYFHKVV.js +0 -366
- package/dist/chunk-TPMZBOFH.js +0 -178
- package/dist/chunk-TW3LKRJF.js +0 -263
- package/dist/chunk-TZAO65I4.js +0 -83
- package/dist/chunk-U5EFEMYU.js +0 -89
- package/dist/chunk-U6M4LS3M.js +0 -378
- package/dist/chunk-UI4HI5QK.js +0 -918
- package/dist/chunk-UJDOWCQ3.js +0 -272
- package/dist/chunk-UJUQ2QOX.js +0 -581
- package/dist/chunk-UQ3IM6FY.js +0 -133
- package/dist/chunk-UYE47LO6.js +0 -246
- package/dist/chunk-VADHIT26.js +0 -89
- package/dist/chunk-VFQ3H6CO.js +0 -163
- package/dist/chunk-VGUN6VB2.js +0 -188
- package/dist/chunk-VGWWEVSD.js +0 -723
- package/dist/chunk-VIEFJ2DM.js +0 -2469
- package/dist/chunk-VLXM36VS.js +0 -268
- package/dist/chunk-W3BFRR2G.js +0 -499
- package/dist/chunk-W5MPXR3A.js +0 -981
- package/dist/chunk-W5OWKVZG.js +0 -136
- package/dist/chunk-W6FRORMX.js +0 -486
- package/dist/chunk-W6FRORMX.js.map +0 -1
- package/dist/chunk-W7XROSZO.js +0 -232
- package/dist/chunk-W7XROSZO.js.map +0 -1
- package/dist/chunk-WEZ5PXZP.js +0 -403
- package/dist/chunk-WHWUWN2X.js +0 -197
- package/dist/chunk-WHWUWN2X.js.map +0 -1
- package/dist/chunk-WLEDGIVS.js +0 -114
- package/dist/chunk-WLEDGIVS.js.map +0 -1
- package/dist/chunk-WNDAKLHG.js +0 -281
- package/dist/chunk-WTJ4PLMU.js +0 -103
- package/dist/chunk-WV2KPJUW.js +0 -107
- package/dist/chunk-X3VY5EGY.js +0 -277
- package/dist/chunk-X3VY5EGY.js.map +0 -1
- package/dist/chunk-XDBYWVCW.js +0 -418
- package/dist/chunk-XF7MA4U5.js +0 -36
- package/dist/chunk-XF7MA4U5.js.map +0 -1
- package/dist/chunk-XOSQP3YA.js +0 -605
- package/dist/chunk-XYBV4ZJQ.js +0 -271
- package/dist/chunk-YBKVGLQR.js +0 -147
- package/dist/chunk-YDCUBUWH.js +0 -1583
- package/dist/chunk-YG6NARQY.js +0 -51
- package/dist/chunk-YG6NARQY.js.map +0 -1
- package/dist/chunk-YSVD5HI4.js +0 -278
- package/dist/chunk-YT3WGNG6.js +0 -290
- package/dist/chunk-YYICQDK4.js +0 -414
- package/dist/chunk-YYLMZLI6.js +0 -686
- package/dist/chunk-ZAMTKG5U.js +0 -95
- package/dist/chunk-ZDLYSXKN.js +0 -111
- package/dist/chunk-ZG447FSS.js +0 -194
- package/dist/chunk-ZIT5KD4Q.js +0 -264
- package/dist/chunk-ZUDOVDKR.js +0 -3064
- package/dist/chunk-ZW2ECJ3A.js +0 -451
- package/dist/computer-viewer-LPZ763KF.js +0 -21
- package/dist/embedded-new-voice-YVMKSLKJ.js +0 -24
- package/dist/embedded-voice-BJPQFXSU.js +0 -24
- package/dist/fleet-decision-row-AA4H5CDT.js +0 -361
- package/dist/model-policy-picker-menu-HSMWVO4P.js +0 -22
- package/dist/payment-page-card-3LTSFJGN.js +0 -223
- package/dist/platform-activity-row-5VYV6TX4.js +0 -128
- package/dist/queue-surface-implementation-NXHZUKD2.js +0 -908
- package/dist/recorder-host-ZKRWTDBM.js +0 -57
- package/dist/recorder-host-ZKRWTDBM.js.map +0 -1
- package/dist/sandbox-files-YCMLQUFU.js +0 -27
- package/dist/session-connect-cards-KSQLMRM5.js +0 -25
- package/dist/session-realtime-ZR6JLG3Y.js +0 -30
- package/dist/timeline-annotation-markers-YAHDPWVG.js +0 -157
- package/dist/timeline-annotation-selection-KHXNCEJP.js +0 -208
- package/dist/timeline-annotations-dialog-Y4XD3N7B.js +0 -283
- /package/dist/{browser-viewer-NOP5EAUO.js.map → browser-viewer-TC27OCIP.js.map} +0 -0
- /package/dist/{chat-interactive-block-G7O44JHR.js.map → chat-interactive-block-RWPQBHVS.js.map} +0 -0
- /package/dist/{chunk-EGBII4CP.js.map → chunk-2BDT3UZQ.js.map} +0 -0
- /package/dist/{chunk-4YD7YZC5.js.map → chunk-2CLNIEK4.js.map} +0 -0
- /package/dist/{chunk-ZW2ECJ3A.js.map → chunk-2FSBSCZJ.js.map} +0 -0
- /package/dist/{chunk-KRPLAAFP.js.map → chunk-2I7HDP53.js.map} +0 -0
- /package/dist/{chunk-3QX55WLC.js.map → chunk-2INLDVK3.js.map} +0 -0
- /package/dist/{chunk-BVUJV5WR.js.map → chunk-2KALVELR.js.map} +0 -0
- /package/dist/{chunk-XDBYWVCW.js.map → chunk-2M3J7ZWQ.js.map} +0 -0
- /package/dist/{chunk-2RREGDQH.js.map → chunk-2OP6WLGV.js.map} +0 -0
- /package/dist/{chunk-OSJ3MUTZ.js.map → chunk-2RG7NIAS.js.map} +0 -0
- /package/dist/{chunk-26RWVLRD.js.map → chunk-2STUPWEL.js.map} +0 -0
- /package/dist/{chunk-XYBV4ZJQ.js.map → chunk-2YUOVM3G.js.map} +0 -0
- /package/dist/{chunk-2GDNWKSC.js.map → chunk-2Z3NQNTM.js.map} +0 -0
- /package/dist/{chunk-2VB2O4FQ.js.map → chunk-3CPWWGNK.js.map} +0 -0
- /package/dist/{chunk-7WKP3DYJ.js.map → chunk-3ED2U6XE.js.map} +0 -0
- /package/dist/{chunk-BT3BAGB5.js.map → chunk-3GZA4BUW.js.map} +0 -0
- /package/dist/{chunk-3USJPT2S.js.map → chunk-3IK6UYO6.js.map} +0 -0
- /package/dist/{chunk-6AHATAAY.js.map → chunk-3PZ7JZI2.js.map} +0 -0
- /package/dist/{chunk-JZ4QXS6D.js.map → chunk-4DVJ6ONS.js.map} +0 -0
- /package/dist/{chunk-5QM2WPKV.js.map → chunk-4E3ZJRTZ.js.map} +0 -0
- /package/dist/{chunk-NFDFYWMV.js.map → chunk-4SAWSRAA.js.map} +0 -0
- /package/dist/{chunk-ELL6HSYR.js.map → chunk-53AGXXZM.js.map} +0 -0
- /package/dist/{chunk-G6ZZC543.js.map → chunk-54YW6SZZ.js.map} +0 -0
- /package/dist/{chunk-4SZZAFYQ.js.map → chunk-57AZS3IE.js.map} +0 -0
- /package/dist/{chunk-JW33RV4V.js.map → chunk-5CPEEAFD.js.map} +0 -0
- /package/dist/{chunk-D6L4GHRH.js.map → chunk-5EWSRZ2Y.js.map} +0 -0
- /package/dist/{chunk-PW54V7T5.js.map → chunk-5IE76VCY.js.map} +0 -0
- /package/dist/{chunk-6GXVYAGR.js.map → chunk-5NWEKLDZ.js.map} +0 -0
- /package/dist/{chunk-6UHCBH4G.js.map → chunk-5O2FCCHZ.js.map} +0 -0
- /package/dist/{chunk-2YC6JQRO.js.map → chunk-5QAY6K77.js.map} +0 -0
- /package/dist/{chunk-EYUT5Y6V.js.map → chunk-6DK6Z4UN.js.map} +0 -0
- /package/dist/{chunk-PW4IMTYR.js.map → chunk-6DVCC7QS.js.map} +0 -0
- /package/dist/{chunk-7WIDB4PL.js.map → chunk-6JHU2UBS.js.map} +0 -0
- /package/dist/{chunk-CQH4FWYA.js.map → chunk-6PZ7OBYU.js.map} +0 -0
- /package/dist/{chunk-VFQ3H6CO.js.map → chunk-6WGRDRMA.js.map} +0 -0
- /package/dist/{chunk-MTTGSQA5.js.map → chunk-77WAKEAH.js.map} +0 -0
- /package/dist/{chunk-O5YWDLYF.js.map → chunk-7TDO3CUM.js.map} +0 -0
- /package/dist/{chunk-2AHTY7OT.js.map → chunk-7TIX2UAR.js.map} +0 -0
- /package/dist/{chunk-FOGNA3BU.js.map → chunk-7V5REBCP.js.map} +0 -0
- /package/dist/{chunk-2JENKGCE.js.map → chunk-7VMZGLYI.js.map} +0 -0
- /package/dist/{chunk-E7UIVD7F.js.map → chunk-7W37NS3I.js.map} +0 -0
- /package/dist/{chunk-ZDLYSXKN.js.map → chunk-7X6SDK2C.js.map} +0 -0
- /package/dist/{chunk-ZAMTKG5U.js.map → chunk-7ZNUHRP5.js.map} +0 -0
- /package/dist/{chunk-DMMJIFKA.js.map → chunk-A36PZALD.js.map} +0 -0
- /package/dist/{chunk-WV2KPJUW.js.map → chunk-AUI6VA63.js.map} +0 -0
- /package/dist/{chunk-Q2EXYSMO.js.map → chunk-AW2MQB37.js.map} +0 -0
- /package/dist/{chunk-6WLX3NR3.js.map → chunk-AWKES45Y.js.map} +0 -0
- /package/dist/{chunk-OD3DCCCB.js.map → chunk-AXHZYXUV.js.map} +0 -0
- /package/dist/{chunk-QDTKECT4.js.map → chunk-BHNSJVBC.js.map} +0 -0
- /package/dist/{chunk-FTCHM755.js.map → chunk-BJEJFISW.js.map} +0 -0
- /package/dist/{chunk-B2I5ZW35.js.map → chunk-BJFH6JI5.js.map} +0 -0
- /package/dist/{chunk-RIPS7GFR.js.map → chunk-BMICEQZQ.js.map} +0 -0
- /package/dist/{chunk-BF4SADKX.js.map → chunk-BTLBYBLU.js.map} +0 -0
- /package/dist/{chunk-U5EFEMYU.js.map → chunk-BXBDYNRP.js.map} +0 -0
- /package/dist/{chunk-BTSYDIVJ.js.map → chunk-C372BFOV.js.map} +0 -0
- /package/dist/{chunk-MLJADQFI.js.map → chunk-CMKGILJK.js.map} +0 -0
- /package/dist/{chunk-DKT3N37I.js.map → chunk-CRAOSVHC.js.map} +0 -0
- /package/dist/{chunk-WNDAKLHG.js.map → chunk-CRU35QQH.js.map} +0 -0
- /package/dist/{chunk-2XNG2KNT.js.map → chunk-CUIWCGMA.js.map} +0 -0
- /package/dist/{chunk-QWL4L366.js.map → chunk-D5TWNFFE.js.map} +0 -0
- /package/dist/{chunk-SWIHWCTW.js.map → chunk-DF5EAHDN.js.map} +0 -0
- /package/dist/{chunk-HUAGBS4O.js.map → chunk-DJAXC5OK.js.map} +0 -0
- /package/dist/{chunk-FXSHP4JZ.js.map → chunk-DXBYWSL5.js.map} +0 -0
- /package/dist/{chunk-5MUJDC6C.js.map → chunk-DXR5PDFP.js.map} +0 -0
- /package/dist/{chunk-NXWBBZJV.js.map → chunk-DZWARC4M.js.map} +0 -0
- /package/dist/{chunk-GXXZ3WAK.js.map → chunk-DZXEDSQI.js.map} +0 -0
- /package/dist/{chunk-Q52CXW6C.js.map → chunk-E7XERZWC.js.map} +0 -0
- /package/dist/{chunk-4NBTZRKT.js.map → chunk-ECJBYNLJ.js.map} +0 -0
- /package/dist/{chunk-QE3ZFGI3.js.map → chunk-EDI6SJ2N.js.map} +0 -0
- /package/dist/{chunk-E6NRSRBE.js.map → chunk-EWSOC6WF.js.map} +0 -0
- /package/dist/{chunk-TA5CFTO4.js.map → chunk-F2OPHAUN.js.map} +0 -0
- /package/dist/{chunk-5DTST3TP.js.map → chunk-F4ISQGGM.js.map} +0 -0
- /package/dist/{chunk-MBIBB6GI.js.map → chunk-FO4LYKJL.js.map} +0 -0
- /package/dist/{chunk-EUBGLFFR.js.map → chunk-FPXASDG5.js.map} +0 -0
- /package/dist/{chunk-C3HUF3M2.js.map → chunk-FVXBNBHO.js.map} +0 -0
- /package/dist/{chunk-W5MPXR3A.js.map → chunk-FZC5N55X.js.map} +0 -0
- /package/dist/{chunk-MA6O7CM6.js.map → chunk-GAVYGBFI.js.map} +0 -0
- /package/dist/{chunk-REX6JIC7.js.map → chunk-GKVJIDHF.js.map} +0 -0
- /package/dist/{chunk-EW6RNWSH.js.map → chunk-GVN5SZLX.js.map} +0 -0
- /package/dist/{chunk-KVFEZDBO.js.map → chunk-H3T7IWNA.js.map} +0 -0
- /package/dist/{chunk-I6VBHT7S.js.map → chunk-HAX4LCR5.js.map} +0 -0
- /package/dist/{chunk-OBMCZO7E.js.map → chunk-HC4JFZVU.js.map} +0 -0
- /package/dist/{chunk-UJUQ2QOX.js.map → chunk-HEFPPMBQ.js.map} +0 -0
- /package/dist/{chunk-DOFJZ2JU.js.map → chunk-HNLR7Q4Z.js.map} +0 -0
- /package/dist/{chunk-GE33BGB7.js.map → chunk-HSOXMJOT.js.map} +0 -0
- /package/dist/{chunk-AB5MBIXY.js.map → chunk-I4MRDSUF.js.map} +0 -0
- /package/dist/{chunk-AFBJTUFK.js.map → chunk-I4QEJ62Y.js.map} +0 -0
- /package/dist/{chunk-6ED2YWBT.js.map → chunk-I5B5L6Q4.js.map} +0 -0
- /package/dist/{chunk-C5QCAOES.js.map → chunk-I5QZJODL.js.map} +0 -0
- /package/dist/{chunk-76ERNKIZ.js.map → chunk-I7ITSXSJ.js.map} +0 -0
- /package/dist/{chunk-OMH7R6I3.js.map → chunk-I7XIZRFD.js.map} +0 -0
- /package/dist/{chunk-E337C2VK.js.map → chunk-IDANQPRH.js.map} +0 -0
- /package/dist/{chunk-3FD76LXM.js.map → chunk-IFB3WJ36.js.map} +0 -0
- /package/dist/{chunk-ZIT5KD4Q.js.map → chunk-IHTAKKTK.js.map} +0 -0
- /package/dist/{chunk-QHNVNR7B.js.map → chunk-ILDXWY37.js.map} +0 -0
- /package/dist/{chunk-GQ67HSJY.js.map → chunk-IMDQUHBJ.js.map} +0 -0
- /package/dist/{chunk-DSXVY5WZ.js.map → chunk-IMZCQBOT.js.map} +0 -0
- /package/dist/{chunk-WEZ5PXZP.js.map → chunk-IXPTECSC.js.map} +0 -0
- /package/dist/{chunk-NY2QWROL.js.map → chunk-J255A3N5.js.map} +0 -0
- /package/dist/{chunk-O2UWH5RG.js.map → chunk-J5F5HPPW.js.map} +0 -0
- /package/dist/{chunk-VIEFJ2DM.js.map → chunk-JEA3QDX7.js.map} +0 -0
- /package/dist/{chunk-TF4ZVJLI.js.map → chunk-JEUPAVYY.js.map} +0 -0
- /package/dist/{chunk-ZG447FSS.js.map → chunk-JKHKLL5W.js.map} +0 -0
- /package/dist/{chunk-FQFKHNC7.js.map → chunk-JQL7ZH6C.js.map} +0 -0
- /package/dist/{chunk-776QZ573.js.map → chunk-JWB44UGJ.js.map} +0 -0
- /package/dist/{chunk-ICNNNOXE.js.map → chunk-JZ4NLCAP.js.map} +0 -0
- /package/dist/{chunk-TNKWOUWP.js.map → chunk-K2A5PXQ5.js.map} +0 -0
- /package/dist/{chunk-SRFARKXC.js.map → chunk-K56XV3C3.js.map} +0 -0
- /package/dist/{chunk-QAJ53XBW.js.map → chunk-K6GAXXVA.js.map} +0 -0
- /package/dist/{chunk-MF3ZFB4H.js.map → chunk-KCBMFSMS.js.map} +0 -0
- /package/dist/{chunk-VLXM36VS.js.map → chunk-KF2FV3ZJ.js.map} +0 -0
- /package/dist/{chunk-YSVD5HI4.js.map → chunk-KJD65EJP.js.map} +0 -0
- /package/dist/{chunk-K42OUZQ3.js.map → chunk-KLEUWIMZ.js.map} +0 -0
- /package/dist/{chunk-PENGLDR5.js.map → chunk-KODELWYT.js.map} +0 -0
- /package/dist/{chunk-TZAO65I4.js.map → chunk-KRDR5RJD.js.map} +0 -0
- /package/dist/{chunk-KHJ5PXFM.js.map → chunk-KUDGXAF7.js.map} +0 -0
- /package/dist/{chunk-6H4SJBPE.js.map → chunk-KYS77RPN.js.map} +0 -0
- /package/dist/{chunk-OWAYJ2OV.js.map → chunk-L7YTNTIK.js.map} +0 -0
- /package/dist/{chunk-YYLMZLI6.js.map → chunk-LHPNABDH.js.map} +0 -0
- /package/dist/{chunk-LM2W5YAT.js.map → chunk-MFROMEKA.js.map} +0 -0
- /package/dist/{chunk-AXBSYWKX.js.map → chunk-MIHN76LX.js.map} +0 -0
- /package/dist/{chunk-4LPOWQJY.js.map → chunk-MIYFS2XN.js.map} +0 -0
- /package/dist/{chunk-KKI55ZMW.js.map → chunk-MJUCFQMS.js.map} +0 -0
- /package/dist/{chunk-ZUDOVDKR.js.map → chunk-MM4FNWI4.js.map} +0 -0
- /package/dist/{chunk-M4SDVTKJ.js.map → chunk-MNZG4OHU.js.map} +0 -0
- /package/dist/{chunk-EILSAQVJ.js.map → chunk-N6AACDUW.js.map} +0 -0
- /package/dist/{chunk-BM3NEZ6X.js.map → chunk-NC55IFN3.js.map} +0 -0
- /package/dist/{chunk-MJJGJMYJ.js.map → chunk-NC7PVOEK.js.map} +0 -0
- /package/dist/{chunk-LA5T52RM.js.map → chunk-NCYMNCJO.js.map} +0 -0
- /package/dist/{chunk-HLOEPV5C.js.map → chunk-ND2BXV3P.js.map} +0 -0
- /package/dist/{chunk-UJDOWCQ3.js.map → chunk-NDBTFUO6.js.map} +0 -0
- /package/dist/{chunk-K5TOVX5A.js.map → chunk-NDQJZ7HF.js.map} +0 -0
- /package/dist/{chunk-35737UT4.js.map → chunk-NGJJJPZZ.js.map} +0 -0
- /package/dist/{chunk-42CMQ5VR.js.map → chunk-NJTSNNE7.js.map} +0 -0
- /package/dist/{chunk-FBTJKSTM.js.map → chunk-NRTE7DNV.js.map} +0 -0
- /package/dist/{chunk-YT3WGNG6.js.map → chunk-NULUNM7H.js.map} +0 -0
- /package/dist/{chunk-7XOVTPDI.js.map → chunk-NUNZS36W.js.map} +0 -0
- /package/dist/{chunk-FC2FTSK3.js.map → chunk-NW53H5RW.js.map} +0 -0
- /package/dist/{chunk-TW3LKRJF.js.map → chunk-NXCMHIKI.js.map} +0 -0
- /package/dist/{chunk-CGK6ALQU.js.map → chunk-O3LKCBP5.js.map} +0 -0
- /package/dist/{chunk-QIK2Q6N5.js.map → chunk-O6N4ABCA.js.map} +0 -0
- /package/dist/{chunk-73NXYYWE.js.map → chunk-O732GAFC.js.map} +0 -0
- /package/dist/{chunk-R3J2PTVQ.js.map → chunk-OF4TIKYC.js.map} +0 -0
- /package/dist/{chunk-BUBNGKWG.js.map → chunk-OMPVOMPP.js.map} +0 -0
- /package/dist/{chunk-4OXI6HCV.js.map → chunk-OPJJSKUK.js.map} +0 -0
- /package/dist/{chunk-4Y6BK7IU.js.map → chunk-OPWCMA4D.js.map} +0 -0
- /package/dist/{chunk-ADNMXBCX.js.map → chunk-ORJPS5VN.js.map} +0 -0
- /package/dist/{chunk-SKMNW4SW.js.map → chunk-OSY5K7L7.js.map} +0 -0
- /package/dist/{chunk-L4I665WK.js.map → chunk-OV6QJRT4.js.map} +0 -0
- /package/dist/{chunk-7O5CGGIQ.js.map → chunk-OVKYVZMW.js.map} +0 -0
- /package/dist/{chunk-7BYWOFVH.js.map → chunk-OZCBM3UC.js.map} +0 -0
- /package/dist/{chunk-ALVRWCXE.js.map → chunk-P3A2EINJ.js.map} +0 -0
- /package/dist/{chunk-BZO5ZMUP.js.map → chunk-PTAG4PDC.js.map} +0 -0
- /package/dist/{chunk-QHHSUR2Y.js.map → chunk-PTF5B7TJ.js.map} +0 -0
- /package/dist/{chunk-O2IOPP3R.js.map → chunk-Q3DPEYX4.js.map} +0 -0
- /package/dist/{chunk-G7FU6PUA.js.map → chunk-QB2KMIDP.js.map} +0 -0
- /package/dist/{chunk-64PO2WXU.js.map → chunk-QCSJ4CWE.js.map} +0 -0
- /package/dist/{chunk-YYICQDK4.js.map → chunk-QIOQ2NPQ.js.map} +0 -0
- /package/dist/{chunk-NB2HMRT2.js.map → chunk-QK5EFEUT.js.map} +0 -0
- /package/dist/{chunk-366XZ4PM.js.map → chunk-QPQBLYQJ.js.map} +0 -0
- /package/dist/{chunk-Q6XQ2R37.js.map → chunk-QPSGCC5D.js.map} +0 -0
- /package/dist/{chunk-JJZPLGIP.js.map → chunk-QZAAUQRN.js.map} +0 -0
- /package/dist/{chunk-VGUN6VB2.js.map → chunk-RGBI63KJ.js.map} +0 -0
- /package/dist/{chunk-LRN6GYAZ.js.map → chunk-RLBKLAEY.js.map} +0 -0
- /package/dist/{chunk-F7U3QPZ3.js.map → chunk-RMFKVOM7.js.map} +0 -0
- /package/dist/{chunk-Q4EFRI6X.js.map → chunk-ROKQU7WG.js.map} +0 -0
- /package/dist/{chunk-7QOHRZ67.js.map → chunk-RPVREAU7.js.map} +0 -0
- /package/dist/{chunk-VGWWEVSD.js.map → chunk-RQKLF42C.js.map} +0 -0
- /package/dist/{chunk-2VTTKH23.js.map → chunk-SEO7TICN.js.map} +0 -0
- /package/dist/{chunk-3QNRBEYH.js.map → chunk-SHHJCL7X.js.map} +0 -0
- /package/dist/{chunk-E6SQKHAU.js.map → chunk-SIRLACNZ.js.map} +0 -0
- /package/dist/{chunk-H2TCRX3H.js.map → chunk-SKPHMYAA.js.map} +0 -0
- /package/dist/{chunk-YDCUBUWH.js.map → chunk-SODC7T6L.js.map} +0 -0
- /package/dist/{chunk-TNYFHKVV.js.map → chunk-SQJIKMN3.js.map} +0 -0
- /package/dist/{chunk-DO74DQC7.js.map → chunk-SVINDKVW.js.map} +0 -0
- /package/dist/{chunk-CPYGO76Q.js.map → chunk-SYCDHPZF.js.map} +0 -0
- /package/dist/{chunk-UQ3IM6FY.js.map → chunk-T2QX3FDP.js.map} +0 -0
- /package/dist/{chunk-NWGNFN3N.js.map → chunk-T3OWFVMS.js.map} +0 -0
- /package/dist/{chunk-N3OARGH2.js.map → chunk-T6XI5FLY.js.map} +0 -0
- /package/dist/{chunk-MQG7RV3B.js.map → chunk-T7OXJZCX.js.map} +0 -0
- /package/dist/{chunk-2T7DX6KR.js.map → chunk-TAT5USZN.js.map} +0 -0
- /package/dist/{chunk-ICX64J4U.js.map → chunk-TPQTRNER.js.map} +0 -0
- /package/dist/{chunk-D2TOWEYH.js.map → chunk-TUIN4MB7.js.map} +0 -0
- /package/dist/{chunk-LQDUHU3Y.js.map → chunk-TX3VECZU.js.map} +0 -0
- /package/dist/{chunk-TG7DADJR.js.map → chunk-TXLIEOJX.js.map} +0 -0
- /package/dist/{chunk-2ZVRJRXC.js.map → chunk-U3DN4HEY.js.map} +0 -0
- /package/dist/{chunk-PSMAWRPL.js.map → chunk-U7XM7CB4.js.map} +0 -0
- /package/dist/{chunk-4TQL3WP2.js.map → chunk-UJK53QFL.js.map} +0 -0
- /package/dist/{chunk-RBRX5ZS3.js.map → chunk-UMTXA2TH.js.map} +0 -0
- /package/dist/{chunk-36MIDGAH.js.map → chunk-UPDSXFK5.js.map} +0 -0
- /package/dist/{chunk-OYXBFSGK.js.map → chunk-UTIAXH52.js.map} +0 -0
- /package/dist/{chunk-5WUN7XPD.js.map → chunk-UVN5TMHU.js.map} +0 -0
- /package/dist/{chunk-UYE47LO6.js.map → chunk-VGYXW3VG.js.map} +0 -0
- /package/dist/{chunk-IKUNOX7F.js.map → chunk-VS7AHPCZ.js.map} +0 -0
- /package/dist/{chunk-MYUFMVCH.js.map → chunk-VTTAJOQ7.js.map} +0 -0
- /package/dist/{chunk-K63HGHZX.js.map → chunk-VWPOLUAO.js.map} +0 -0
- /package/dist/{chunk-GA4YEAMX.js.map → chunk-X3MWB2QU.js.map} +0 -0
- /package/dist/{chunk-I36GSRUJ.js.map → chunk-X6KAJI3V.js.map} +0 -0
- /package/dist/{chunk-IKMUFDVS.js.map → chunk-XBLRHV5R.js.map} +0 -0
- /package/dist/{chunk-XOSQP3YA.js.map → chunk-XDFP2LMW.js.map} +0 -0
- /package/dist/{chunk-MW7Y3T55.js.map → chunk-XEQMZB3C.js.map} +0 -0
- /package/dist/{chunk-B3LMRTRF.js.map → chunk-XEYLT5VA.js.map} +0 -0
- /package/dist/{chunk-UI4HI5QK.js.map → chunk-XHIQ5I6N.js.map} +0 -0
- /package/dist/{chunk-U6M4LS3M.js.map → chunk-XLH7QY2R.js.map} +0 -0
- /package/dist/{chunk-OSA5EQG5.js.map → chunk-XWFAMUZQ.js.map} +0 -0
- /package/dist/{chunk-6MT3HHUB.js.map → chunk-Y4OBB2VN.js.map} +0 -0
- /package/dist/{chunk-CZP5QXNB.js.map → chunk-YCVD6CI3.js.map} +0 -0
- /package/dist/{chunk-APW4T4SW.js.map → chunk-YENLNISG.js.map} +0 -0
- /package/dist/{chunk-JWPA6ZPZ.js.map → chunk-YIRVLKAX.js.map} +0 -0
- /package/dist/{chunk-LQ62ECE6.js.map → chunk-YL73CVNK.js.map} +0 -0
- /package/dist/{chunk-ILKDYBON.js.map → chunk-YLS6QE5G.js.map} +0 -0
- /package/dist/{chunk-YBKVGLQR.js.map → chunk-YPWU5KPE.js.map} +0 -0
- /package/dist/{chunk-IKJLSBUI.js.map → chunk-YQXTDZSU.js.map} +0 -0
- /package/dist/{chunk-TPMZBOFH.js.map → chunk-YSJEAAOL.js.map} +0 -0
- /package/dist/{chunk-W3BFRR2G.js.map → chunk-YWIFM7D7.js.map} +0 -0
- /package/dist/{chunk-WTJ4PLMU.js.map → chunk-YWVI6ZMK.js.map} +0 -0
- /package/dist/{chunk-5KWMYPJV.js.map → chunk-Z4FMAFNH.js.map} +0 -0
- /package/dist/{chunk-W5OWKVZG.js.map → chunk-Z654FWNU.js.map} +0 -0
- /package/dist/{chunk-5FH5LQVS.js.map → chunk-Z7Y523PS.js.map} +0 -0
- /package/dist/{chunk-HLL4PBO7.js.map → chunk-ZD67RM6G.js.map} +0 -0
- /package/dist/{chunk-IVYJX3OY.js.map → chunk-ZEG4VPBL.js.map} +0 -0
- /package/dist/{chunk-K6R5T44I.js.map → chunk-ZLYCOBHW.js.map} +0 -0
- /package/dist/{chunk-VADHIT26.js.map → chunk-ZNJ5MTXV.js.map} +0 -0
- /package/dist/{chunk-2KYQC4T5.js.map → chunk-ZSGY3H53.js.map} +0 -0
- /package/dist/{chunk-BKP43KK4.js.map → chunk-ZTPXACWB.js.map} +0 -0
- /package/dist/{chunk-JCY4CMDH.js.map → chunk-ZUA3JMI6.js.map} +0 -0
- /package/dist/{chunk-IGVVXLKJ.js.map → chunk-ZYAZUPPV.js.map} +0 -0
- /package/dist/{computer-viewer-LPZ763KF.js.map → computer-viewer-TDDO25AV.js.map} +0 -0
- /package/dist/{embedded-new-voice-YVMKSLKJ.js.map → embedded-new-voice-2G3VLPVQ.js.map} +0 -0
- /package/dist/{embedded-voice-BJPQFXSU.js.map → embedded-voice-T5IWOWGD.js.map} +0 -0
- /package/dist/{fleet-decision-row-AA4H5CDT.js.map → fleet-decision-row-WM64KXP3.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-HSMWVO4P.js.map → model-policy-picker-menu-SMC6J6QN.js.map} +0 -0
- /package/dist/{payment-page-card-3LTSFJGN.js.map → payment-page-card-G4U63KUV.js.map} +0 -0
- /package/dist/{platform-activity-row-5VYV6TX4.js.map → platform-activity-row-BUZGZAKZ.js.map} +0 -0
- /package/dist/{queue-surface-implementation-NXHZUKD2.js.map → queue-surface-implementation-4KUZ4PJV.js.map} +0 -0
- /package/dist/{sandbox-files-YCMLQUFU.js.map → sandbox-files-ESDMOFSD.js.map} +0 -0
- /package/dist/{session-connect-cards-KSQLMRM5.js.map → session-connect-cards-Q53KMMYY.js.map} +0 -0
- /package/dist/{session-realtime-ZR6JLG3Y.js.map → session-realtime-CF3I35WJ.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-YAHDPWVG.js.map → timeline-annotation-markers-CJK4RYZ4.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-KHXNCEJP.js.map → timeline-annotation-selection-67GF5H26.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-Y4XD3N7B.js.map → timeline-annotations-dialog-ONJPQDJQ.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/desktop-dictation/host.tsx","../src/components/desktop-dictation/settings.tsx","../src/components/desktop-dictation/shortcuts.ts"],"sourcesContent":["// Records and transcribes for the desktop app's dictation shortcut. The app\n// owns the shortcut, the small window that shows progress and where the text\n// goes; this page records with the signed-in account, as the composer does.\nimport { resolveWorkspaceVoiceInputEnabled } from \"@opengeni/contracts\";\nimport type { ClientConfig, ClientVoiceInputConfig, OpenGeniClient } from \"@opengeni/sdk\";\nimport {\n getDesktopDictation,\n type DesktopDictation,\n type DesktopDictationAudio,\n type DesktopDictationModel,\n type DesktopDictationReport,\n type DesktopDictationRequest,\n} from \"@opengeni/sdk/desktop-bridge\";\nimport type { RecorderPlatform } from \"@opengeni/sdk/recordings\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useVoiceInput,\n type UseVoiceInputResult,\n type VoiceInputRecordingsClient,\n} from \"../../hooks/use-voice-input\";\nimport { readClientConfig } from \"../../lib/client-config-read\";\nimport { useOpenGeniText, type OpenGeniText } from \"../../messages/runtime\";\n\nexport type DesktopDictationClient = Pick<OpenGeniClient, \"transcribeAudio\"> &\n Partial<Pick<OpenGeniClient, \"requestJson\" | \"getClientConfig\" | \"getWorkspace\">>;\n\nexport type DesktopDictationHostProps = {\n /** The signed-in SDK client; dictations are recordings of this account. */\n client: DesktopDictationClient | null;\n /** The workspace that hears dictations; null records nothing. */\n workspaceId: string | null;\n /** The workspace's voice input. Read from the client's config when omitted. */\n capability?: ClientVoiceInputConfig | null | undefined;\n /** The workspace allows voice input. Read from its settings when omitted. */\n enabled?: boolean | undefined;\n /**\n * Asked before each dictation takes the microphone, such as a consent\n * check. Resolving false (or throwing) keeps the microphone off.\n */\n beforeStart?: (() => boolean | Promise<boolean>) | undefined;\n /** A recordings client, such as a host proxy. Built from `client` otherwise. */\n recordings?: Partial<VoiceInputRecordingsClient> | undefined;\n /** How this device records; the browser's by default. */\n platform?: RecorderPlatform | undefined;\n /** The app's dictation. `getDesktopDictation()` by default. */\n dictation?: DesktopDictation | null | undefined;\n};\n\n/** The voice input this page may record with, once it is known. */\ntype HostVoiceInput = { key: string; capability: ClientVoiceInputConfig | null; enabled: boolean };\n\n/** The app's dictation this page is recording: what it last reported. */\ntype Current = {\n id: string;\n phase: \"starting\" | \"recording\" | \"transcribing\" | \"failed\";\n /** Start returned without recording and without an error: it was declined. */\n declined: boolean;\n /** Speech the app kept, transcribed again rather than recorded. */\n again: boolean;\n};\n\n/** What the next render starts: a recording, or kept speech to transcribe. */\ntype Pending = { id: string; audio: DesktopDictationAudio | null };\n\nconst LEVEL_REPORT_MILLISECONDS = 100;\nconst CONFIG_RETRY_MILLISECONDS = [2_000, 10_000, 30_000, 60_000];\nconst NO_WORDS: readonly string[] = [];\n\n/**\n * Mount once on a signed-in page inside a desktop app with dictation from\n * anywhere (`getDesktopDictation()`). It renders nothing: when the person\n * presses the dictation shortcut in any app, it records the microphone here\n * and transcribes with the workspace's voice input, and the app types the\n * text where their cursor is. A dictation that fails stays saved, and the\n * composer offers it later. A cancelled one is deleted; its speech goes to the\n * app's recent dictations only, to play or transcribe again there.\n */\nexport function DesktopDictationHost(props: DesktopDictationHostProps): null {\n const t = useOpenGeniText();\n const dictation = useMemo(\n () => (props.dictation === undefined ? getDesktopDictation() : props.dictation),\n [props.dictation],\n );\n const { client, workspaceId } = props;\n const voiceInput = useHostVoiceInput(\n dictation ? client : null,\n workspaceId,\n props.capability,\n props.enabled,\n );\n const [language, setLanguage] = useState<string | null>(null);\n const [model, setModel] = useState<DesktopDictationModel | null>(null);\n const [vocabulary, setVocabulary] = useState<readonly string[]>(NO_WORDS);\n const [pending, setPending] = useState<Pending | null>(null);\n const [declined, setDeclined] = useState(0);\n const current = useRef<Current | null>(null);\n /** The speech of the dictation being recorded, read for the app to keep. */\n const kept = useRef<{ id: string; audio: Promise<DesktopDictationAudio | null> } | null>(null);\n /** While the app's Cancel runs: the cancelled dictation's speech, when it is worth keeping. */\n const cancelling = useRef<{ audio: Promise<DesktopDictationAudio | null> | null } | null>(null);\n\n const report = useCallback(\n (next: DesktopDictationReport) => {\n try {\n dictation?.report(next);\n } catch {\n // The app went away; its own watchdog ends the dictation.\n }\n },\n [dictation],\n );\n\n const voice = useVoiceInput({\n client,\n workspaceId: workspaceId ?? \"\",\n capability: voiceInput?.capability ?? null,\n enabled: voiceInput?.enabled ?? false,\n // The text goes to the app, never into a draft here.\n value: \"\",\n setValue: (text) => {\n const active = current.current;\n if (!active) return;\n current.current = null;\n const audio = kept.current?.id === active.id ? kept.current.audio : null;\n kept.current = null;\n if (!audio) {\n report({ dictationId: active.id, phase: \"done\", text });\n return;\n }\n void audio.then((speech) =>\n report({\n dictationId: active.id,\n phase: \"done\",\n text,\n ...(speech ? { audio: speech } : {}),\n }),\n );\n },\n focusInput: noop,\n language,\n model,\n keyterms: vocabulary,\n beforeStart: props.beforeStart,\n // Dictations an earlier page left are for the composer to offer.\n recover: false,\n // The app keeps each dictation's speech with its text, to play or transcribe\n // again, and a cancelled dictation's speech on its own.\n onAudio: ({ audio, durationMilliseconds, cancelled }) => {\n const asked = cancelled ? cancelling.current : null;\n if (asked) {\n asked.audio = readSpeech(audio, durationMilliseconds);\n return;\n }\n const active = current.current;\n if (!active || active.again) return;\n if (cancelled) {\n // Cancelled on this page rather than by the app: the dictation ends here.\n current.current = null;\n kept.current = null;\n void readSpeech(audio, durationMilliseconds).then((speech) =>\n report({\n dictationId: active.id,\n phase: \"cancelled\",\n ...(speech ? { audio: speech } : {}),\n }),\n );\n return;\n }\n kept.current = { id: active.id, audio: readSpeech(audio, durationMilliseconds) };\n },\n recordings: props.recordings,\n platform: props.platform,\n });\n const voiceRef = useRef<UseVoiceInputResult>(voice);\n voiceRef.current = voice;\n const available = Boolean(voiceInput?.capability?.available && voiceInput.enabled);\n const availableRef = useRef(available);\n availableRef.current = available;\n const capabilityRef = useRef(voiceInput?.capability ?? null);\n capabilityRef.current = voiceInput?.capability ?? null;\n\n const words = useRef({ t, report });\n words.current = { t, report };\n\n const handle = useCallback((request: DesktopDictationRequest) => {\n const voiceNow = voiceRef.current;\n const { t: text, report: send } = words.current;\n if (request.kind === \"start\" || request.kind === \"transcribe\") {\n if (!availableRef.current) {\n send({\n dictationId: request.dictationId,\n phase: \"failed\",\n message: text(\"desktopDictation.host.voiceInputOff\"),\n retryable: false,\n });\n return;\n }\n // A dictation still held here (one that failed) stays saved for the\n // composer; this one starts fresh.\n if (voiceNow.status !== \"idle\") voiceNow.release();\n const again = request.kind === \"transcribe\";\n current.current = { id: request.dictationId, phase: \"starting\", declined: false, again };\n kept.current = null;\n setLanguage(request.language);\n setModel(offeredModel(request.model, capabilityRef.current));\n setVocabulary(request.vocabulary ?? NO_WORDS);\n setPending({ id: request.dictationId, audio: again ? request.audio : null });\n return;\n }\n const active = current.current;\n if (!active || active.id !== request.dictationId) return;\n switch (request.kind) {\n case \"stop\":\n voiceNow.stop();\n return;\n case \"cancel\": {\n current.current = null;\n kept.current = null;\n if (active.again) {\n // The app still has the speech: nothing here needs keeping.\n void voiceNow.discard();\n send({ dictationId: active.id, phase: \"cancelled\" });\n return;\n }\n // Deleted here; speech worth keeping comes back for the app's recent dictations.\n const asked: { audio: Promise<DesktopDictationAudio | null> | null } = { audio: null };\n cancelling.current = asked;\n try {\n voiceNow.cancel();\n } finally {\n cancelling.current = null;\n }\n const { audio } = asked;\n if (!audio) {\n send({ dictationId: active.id, phase: \"cancelled\" });\n return;\n }\n void audio.then((speech) =>\n send({\n dictationId: active.id,\n phase: \"cancelled\",\n ...(speech ? { audio: speech } : {}),\n }),\n );\n return;\n }\n case \"dismiss\":\n current.current = null;\n if (active.again) void voiceNow.discard();\n else voiceNow.release();\n return;\n case \"retry\":\n voiceNow.retry();\n return;\n }\n }, []);\n\n // Record for the app's shortcut once this workspace's voice input is known,\n // so a press that opened this page waits for it rather than failing.\n const listening = Boolean(dictation && workspaceId && voiceInput);\n useEffect(() => {\n if (!dictation || !listening) return;\n const off = dictation.onRequest(handle);\n return () => {\n off();\n const active = current.current;\n current.current = null;\n if (active) {\n voiceRef.current.release();\n const { t: text, report: send } = words.current;\n send({\n dictationId: active.id,\n phase: \"failed\",\n message: text(\"desktopDictation.host.stopped\"),\n retryable: false,\n });\n }\n };\n }, [dictation, handle, listening, workspaceId]);\n\n // Start after the render that applied the dictation's language and vocabulary.\n useEffect(() => {\n if (!pending) return;\n setPending(null);\n const { id, audio } = pending;\n // Cancelled before it could start: nothing to record.\n if (current.current?.id !== id) return;\n const starting = audio\n ? voiceRef.current.transcribe(new Blob([audio.bytes as BlobPart], { type: audio.mimeType }), {\n durationMilliseconds: audio.durationMilliseconds,\n })\n : voiceRef.current.start();\n void starting.then(\n (started) => {\n const active = current.current;\n if (started || active?.id !== id) return;\n active.declined = true;\n setDeclined((count) => count + 1);\n },\n () => {\n const active = current.current;\n if (active?.id !== id) return;\n active.declined = true;\n setDeclined((count) => count + 1);\n },\n );\n }, [pending]);\n\n const { status, error, hasRecoverableRecording, recordingStartedAt } = voice;\n useEffect(() => {\n const active = current.current;\n if (!active) return;\n switch (status) {\n case \"requesting-permission\":\n return;\n case \"recording\":\n if (active.phase === \"starting\") {\n active.phase = \"recording\";\n report({\n dictationId: active.id,\n phase: \"recording\",\n startedAt: recordingStartedAt ?? Date.now(),\n level: voiceRef.current.level(),\n });\n }\n return;\n case \"saving\":\n case \"transcribing\":\n case \"retrying\":\n if (active.phase !== \"transcribing\") {\n active.phase = \"transcribing\";\n report({ dictationId: active.id, phase: \"transcribing\" });\n }\n return;\n case \"transcript-ready\":\n // Held while something else had the page; it is this dictation's text.\n void voiceRef.current.insertSavedTranscript();\n return;\n case \"error\":\n if (active.phase !== \"failed\") {\n active.phase = \"failed\";\n report({\n dictationId: active.id,\n phase: \"failed\",\n message: dictationErrorMessage(error, t),\n retryable: hasRecoverableRecording,\n });\n }\n return;\n case \"recovered\":\n // Set aside here without transcribing: it stays saved for the composer.\n current.current = null;\n report({ dictationId: active.id, phase: \"cancelled\" });\n return;\n case \"idle\":\n if (active.phase === \"recording\" || active.phase === \"transcribing\") {\n // Nothing was heard (the text arrives through `setValue` otherwise).\n current.current = null;\n report({ dictationId: active.id, phase: \"done\", text: \"\" });\n } else if (active.phase === \"starting\" && active.declined) {\n current.current = null;\n report({ dictationId: active.id, phase: \"cancelled\" });\n }\n return;\n }\n }, [declined, error, hasRecoverableRecording, recordingStartedAt, report, status, t]);\n\n // The level drives the bars in the app's window.\n useEffect(() => {\n if (status !== \"recording\") return;\n const timer = setInterval(() => {\n const active = current.current;\n if (active?.phase !== \"recording\") return;\n report({\n dictationId: active.id,\n phase: \"recording\",\n startedAt: recordingStartedAt ?? Date.now(),\n level: voiceRef.current.level(),\n });\n }, LEVEL_REPORT_MILLISECONDS);\n return () => clearInterval(timer);\n }, [recordingStartedAt, report, status]);\n\n return null;\n}\n\n/** The workspace's voice input and whether its settings allow it, read once per workspace. */\nfunction useHostVoiceInput(\n client: DesktopDictationClient | null,\n workspaceId: string | null,\n capability: ClientVoiceInputConfig | null | undefined,\n enabled: boolean | undefined,\n): HostVoiceInput | null {\n const [state, setState] = useState<HostVoiceInput | null>(null);\n // By value: a host may pass a fresh object on every render.\n const capabilityKey = capability === undefined ? null : JSON.stringify(capability);\n const given = useRef(capability);\n given.current = capability;\n useEffect(() => {\n if (!client || !workspaceId) return;\n let live = true;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const key = workspaceId;\n const readCapability = async (): Promise<ClientVoiceInputConfig | null> => {\n if (capabilityKey !== null) return given.current ?? null;\n if (typeof client.getClientConfig !== \"function\") return null;\n const config = await readClientConfig<ClientConfig>(\n client as Pick<OpenGeniClient, \"getClientConfig\">,\n workspaceId,\n );\n return config.voiceInput ?? null;\n };\n const readEnabled = async (): Promise<boolean> => {\n if (enabled !== undefined) return enabled;\n if (typeof client.getWorkspace !== \"function\") return true;\n // The transcription request still enforces the setting.\n return client.getWorkspace(workspaceId).then(\n (workspace) => resolveWorkspaceVoiceInputEnabled(workspace.settings) ?? true,\n () => true,\n );\n };\n const read = (attempt: number) => {\n Promise.all([readCapability(), readEnabled()]).then(\n ([nextCapability, nextEnabled]) => {\n if (live) setState({ key, capability: nextCapability, enabled: nextEnabled });\n },\n () => {\n // Offline at start: try again, and record nothing until it is known.\n if (!live) return;\n const delay =\n CONFIG_RETRY_MILLISECONDS[Math.min(attempt, CONFIG_RETRY_MILLISECONDS.length - 1)]!;\n timer = setTimeout(() => read(attempt + 1), delay);\n },\n );\n };\n read(0);\n return () => {\n live = false;\n if (timer) clearTimeout(timer);\n };\n }, [capabilityKey, client, enabled, workspaceId]);\n return state && state.key === workspaceId ? state : null;\n}\n\n/** A short sentence for the app's dictation window. */\nexport function dictationErrorMessage(code: string | null, t: OpenGeniText): string {\n switch (code) {\n case \"permission_denied\":\n return t(\"desktopDictation.host.microphoneBlocked\");\n case \"not_supported\":\n return t(\"desktopDictation.host.cantRecord\");\n case \"unavailable\":\n return t(\"desktopDictation.host.voiceInputOff\");\n case \"insufficient_credits\":\n return t(\"desktopDictation.host.needsCredits\");\n case \"allowance_exhausted\":\n case \"monthly_model_cost_limit\":\n return t(\"desktopDictation.host.usageLimit\");\n case \"policy_blocked\":\n return t(\"desktopDictation.host.notAllowed\");\n case \"too_large\":\n return t(\"desktopDictation.host.tooLong\");\n case \"invalid_audio\":\n return t(\"desktopDictation.host.unreadable\");\n case \"storage_unavailable\":\n return t(\"desktopDictation.host.notSaved\");\n case \"network\":\n case \"provider\":\n case \"timeout\":\n return t(\"desktopDictation.host.transcriptionFailed\");\n default:\n return t(\"desktopDictation.host.couldNotStart\");\n }\n}\n\nfunction noop(): void {}\n\n/** A dictation's speech as the app keeps it, or null when it can't be read. */\nfunction readSpeech(\n audio: Blob,\n durationMilliseconds: number,\n): Promise<DesktopDictationAudio | null> {\n return audio.arrayBuffer().then(\n (buffer) => ({\n mimeType: audio.type || \"audio/webm\",\n bytes: new Uint8Array(buffer),\n durationMilliseconds,\n }),\n () => null,\n );\n}\n\n/**\n * The shortcut's own model when this workspace offers it; otherwise null, so\n * the workspace's voice input model hears it rather than the dictation failing.\n */\nfunction offeredModel(\n wanted: DesktopDictationModel | null | undefined,\n capability: ClientVoiceInputConfig | null | undefined,\n): DesktopDictationModel | null {\n if (!wanted) return null;\n const offered = capability?.models?.some(\n (entry) => entry.providerId === wanted.providerId && entry.model === wanted.model,\n );\n return offered ? { providerId: wanted.providerId, model: wanted.model } : null;\n}\n","// The desktop app's dictation settings: turning dictation from anywhere on,\n// its shortcuts and their languages, where the text goes, what the system\n// must allow, the words to listen for, and the recent dictations kept on this\n// computer, to copy, play or transcribe again.\nimport {\n getDesktopDictation,\n type DesktopDictation,\n type DesktopDictationAction,\n type DesktopDictationHistoryEntry,\n type DesktopDictationKeys,\n type DesktopDictationModel,\n type DesktopDictationModifier,\n type DesktopDictationOutput,\n type DesktopDictationPasteBlocker,\n type DesktopDictationPermissionId,\n type DesktopDictationProfile,\n type DesktopDictationSettings,\n type DesktopDictationShortcut,\n type DesktopDictationShortcutProblem,\n type DesktopDictationStatus,\n type DesktopPlatform,\n} from \"@opengeni/sdk/desktop-bridge\";\nimport { CheckIcon, CopyIcon, PlayIcon, RotateCcwIcon, SquareIcon, Trash2Icon } from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { copyTextToClipboard } from \"../../lib/clipboard\";\nimport { MEETING_LANGUAGES } from \"../../meetings/meeting-languages\";\nimport { useOpenGeniText, type OpenGeniText } from \"../../messages/runtime\";\nimport { languageName } from \"../../recordings-model\";\nimport { Button } from \"../../ui/button\";\nimport { RelativeTime } from \"../../ui/relative-time\";\nimport { Section } from \"../../ui/section\";\nimport { SelectMenu, type SelectOption } from \"../../ui/select-menu\";\nimport { SettingRow } from \"../../ui/setting-row\";\nimport { Switch } from \"../../ui/switch\";\nimport { WordListRow } from \"../../ui/word-list-row\";\nimport { acceleratorFromKey, desktopShortcutLabel, sameDesktopShortcut } from \"./shortcuts\";\n\n/** At most this many shortcuts, as the app keeps them. */\nconst PROFILES_MAX = 8;\nconst DETECT = \"auto\";\n/** A shortcut without a model of its own: the workspace's voice input model. */\nconst WORKSPACE_MODEL = \"workspace\";\nconst CUSTOM = \"custom\";\n/** Modifier keys held together that make a good shortcut on a Mac, the usual one first. */\nconst CHORDS: DesktopDictationModifier[][] = [\n [\"control\", \"fn\"],\n [\"option\", \"fn\"],\n [\"command\", \"fn\"],\n [\"shift\", \"fn\"],\n];\n/** Key combinations offered to a new shortcut where modifier keys can't be watched. */\nconst ACCELERATORS = [\n \"Control+Shift+Space\",\n \"Control+Alt+Space\",\n \"Control+Shift+D\",\n \"Control+Alt+D\",\n];\nconst CHORD_ORDER: DesktopDictationModifier[] = [\"command\", \"option\", \"control\", \"shift\", \"fn\"];\n/** What `recordingFor` holds while the retry or cancel shortcut's keys are recorded. */\nconst ACTION_PREFIX = \"action:\";\nconst NONE = \"none\";\nconst KEYS = \"keys\";\n/** As the app keeps them. */\n\nexport type UseDesktopDictationResult = {\n /** The app's dictation, or null outside a desktop app that offers it. */\n dictation: DesktopDictation | null;\n /** Null until read. */\n status: DesktopDictationStatus | null;\n /** Newest first. */\n history: DesktopDictationHistoryEntry[];\n saving: boolean;\n /** A plain sentence when the last change couldn't be saved. */\n error: string | null;\n /** Saves a change; resolves to the app's status after it, or null when it wasn't saved. */\n update: (change: Partial<DesktopDictationSettings>) => Promise<DesktopDictationStatus | null>;\n requestPermission: (id: DesktopDictationPermissionId) => void;\n clearHistory: () => Promise<void>;\n /** Transcribe a kept dictation again; null in apps that can't. */\n transcribeAgain: ((id: string) => void) | null;\n};\n\n/** The app's dictation settings and recent dictations, kept current. */\nexport function useDesktopDictation(\n given?: DesktopDictation | null | undefined,\n): UseDesktopDictationResult {\n const t = useOpenGeniText();\n const dictation = useMemo(() => (given === undefined ? getDesktopDictation() : given), [given]);\n const [status, setStatus] = useState<DesktopDictationStatus | null>(null);\n const [history, setHistory] = useState<DesktopDictationHistoryEntry[]>([]);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(() => {\n if (!dictation) return;\n void dictation.status().then(setStatus, () => undefined);\n void dictation.history().then(setHistory, () => undefined);\n }, [dictation]);\n\n useEffect(() => {\n if (!dictation) return;\n refresh();\n const off = dictation.onChange(refresh);\n // Permissions are granted in the system's settings, outside the app.\n const onFocus = () => refresh();\n globalThis.addEventListener?.(\"focus\", onFocus);\n return () => {\n off();\n globalThis.removeEventListener?.(\"focus\", onFocus);\n };\n }, [dictation, refresh]);\n\n const update = useCallback(\n async (change: Partial<DesktopDictationSettings>): Promise<DesktopDictationStatus | null> => {\n if (!dictation) return null;\n setSaving(true);\n setError(null);\n try {\n const next = await dictation.update(change);\n setStatus(next);\n return next;\n } catch {\n setError(t(\"desktopDictation.settings.saveFailed\"));\n return null;\n } finally {\n setSaving(false);\n }\n },\n [dictation, t],\n );\n\n const requestPermission = useCallback(\n (id: DesktopDictationPermissionId) => {\n void dictation\n ?.requestPermission(id)\n .then(refresh)\n .catch(() => undefined);\n },\n [dictation, refresh],\n );\n\n const clearHistory = useCallback(async () => {\n if (!dictation) return;\n await dictation.clearHistory().catch(() => undefined);\n setHistory([]);\n }, [dictation]);\n\n const transcribeAgain = useCallback(\n (id: string) => void dictation?.transcribeAgain?.(id).catch(() => undefined),\n [dictation],\n );\n\n return {\n dictation,\n status,\n history,\n saving,\n error,\n update,\n requestPermission,\n clearHistory,\n transcribeAgain: typeof dictation?.transcribeAgain === \"function\" ? transcribeAgain : null,\n };\n}\n\nexport type DesktopDictationSettingsProps = {\n /** The app's dictation. `getDesktopDictation()` by default. */\n dictation?: DesktopDictation | null | undefined;\n /** Languages offered for each shortcut, as ISO codes. Common languages by default. */\n languages?: readonly string[] | undefined;\n /**\n * The speech-to-text models a shortcut can pick, such as one for English\n * and another for Norwegian: the signed-in workspace's\n * `clientConfig.voiceInput.models`. Without them each shortcut uses the\n * workspace's voice input model and no model is offered.\n */\n models?: readonly DictationModelChoice[] | undefined;\n className?: string | undefined;\n};\n\n/** A model a dictation shortcut can pick, as the workspace's voice input lists it. */\nexport type DictationModelChoice = DesktopDictationModel & {\n providerName: string;\n /** The model's name, such as \"MAI-Transcribe-2\". */\n name: string;\n};\n\n/**\n * Settings for dictation from anywhere, shown only inside a desktop app that\n * offers it on this computer. Pair it with {@link DesktopDictationHost}\n * mounted on the signed-in pages.\n */\nexport function DesktopDictationSettings({\n dictation: given,\n languages = MEETING_LANGUAGES,\n models = NO_MODELS,\n className,\n}: DesktopDictationSettingsProps) {\n const t = useOpenGeniText();\n const {\n dictation,\n status,\n history,\n saving,\n error,\n update,\n requestPermission,\n clearHistory,\n transcribeAgain,\n } = useDesktopDictation(given);\n const [recordingFor, setRecordingFor] = useState<string | null>(null);\n const [keysError, setKeysError] = useState<{ profileId: string; message: string } | null>(null);\n const playback = usePlayback(dictation);\n const platform: DesktopPlatform = status?.platform ?? \"macos\";\n const settings = status?.settings ?? null;\n\n const saveProfiles = useCallback(\n (profiles: DesktopDictationProfile[]) => {\n setKeysError(null);\n void update({ profiles });\n },\n [update],\n );\n\n // Recording a key combination: the next one pressed becomes the shortcut.\n useEffect(() => {\n if (!recordingFor || !settings) return;\n const onKey = (event: KeyboardEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (event.key === \"Escape\" && !event.metaKey && !event.ctrlKey && !event.altKey) {\n setRecordingFor(null);\n return;\n }\n const accelerator = acceleratorFromKey(event, platform);\n if (!accelerator) return;\n setRecordingFor(null);\n const shortcut: DesktopDictationShortcut = { kind: \"accelerator\", accelerator };\n if (usedByAnother(settings, recordingFor, shortcut)) {\n setKeysError({\n profileId: recordingFor,\n message: t(\"desktopDictation.settings.usedByAnother\"),\n });\n return;\n }\n if (recordingFor.startsWith(ACTION_PREFIX)) {\n const action = recordingFor.slice(ACTION_PREFIX.length) as DesktopDictationAction;\n void update({ [actionKey(action)]: { kind: \"accelerator\", accelerator } });\n return;\n }\n saveProfiles(\n settings.profiles.map((profile) =>\n profile.id === recordingFor ? { ...profile, shortcut } : profile,\n ),\n );\n };\n globalThis.addEventListener(\"keydown\", onKey, true);\n return () => globalThis.removeEventListener(\"keydown\", onKey, true);\n }, [platform, recordingFor, saveProfiles, settings, t, update]);\n\n if (!dictation || !status?.supported || !settings) return null;\n const { profiles } = settings;\n const single = profiles.length === 1;\n const modifierShortcuts = profiles.some((profile) => profile.shortcut.kind !== \"accelerator\");\n const accessibility = status.permissions.find((permission) => permission.id === \"accessibility\");\n const first = profiles[0]!;\n\n const languageOptions = (current: string | null): SelectOption[] => {\n const codes: string[] = [...languages];\n if (current && !codes.includes(current)) codes.push(current);\n return [\n { value: DETECT, label: t(\"desktopDictation.settings.detectAutomatically\") },\n ...codes.map((code) => ({ value: code, label: languageName(code, t.locale) })),\n ];\n };\n\n const setLanguage = (id: string, value: string) => {\n const language = value === DETECT ? null : value;\n saveProfiles(\n profiles.map((profile) =>\n profile.id === id ? { ...profile, language, name: profileName(language, t) } : profile,\n ),\n );\n };\n\n const modelOptions = (current: DesktopDictationModel | null | undefined): SelectOption[] => [\n { value: WORKSPACE_MODEL, label: t(\"desktopDictation.settings.workspaceModel\") },\n ...(current && !models.some((entry) => sameModel(entry, current))\n ? [\n {\n value: modelValue(current),\n label: current.model,\n disabled: true,\n disabledReason: t(\"desktopDictation.settings.modelUnavailable\"),\n },\n ]\n : []),\n ...models.map((entry) => ({\n value: modelValue(entry),\n label: `${entry.providerName} · ${entry.name}`,\n })),\n ];\n\n const setModel = (id: string, value: string) => {\n const chosen = models.find((entry) => modelValue(entry) === value);\n saveProfiles(\n profiles.map((profile) =>\n profile.id === id\n ? {\n ...profile,\n model: chosen ? { providerId: chosen.providerId, model: chosen.model } : null,\n }\n : profile,\n ),\n );\n };\n // Offered once there is a choice, and always while a shortcut has one picked.\n const offerModels = models.length > 0 || profiles.some((profile) => profile.model);\n\n const addProfile = () => {\n const used = new Set(profiles.map((profile) => profile.language));\n const language = [...languages].find((code) => !used.has(code)) ?? null;\n const shortcut = freeShortcut(profiles, status);\n if (!shortcut) return;\n const id = newProfileId(profiles);\n // With more than one, each is named for its language wherever it shows.\n saveProfiles([\n ...profiles.map((profile) => ({ ...profile, name: profileName(profile.language, t) })),\n { id, name: profileName(language, t), shortcut, language },\n ]);\n };\n\n const onToggle = (enabled: boolean) => {\n void update({ enabled }).then((next) => {\n // Typing into other apps needs Accessibility on a Mac: ask once it is on\n // (an app may keep it off, such as until the person agrees to something).\n const permission = next?.permissions.find((entry) => entry.id === \"accessibility\");\n if (\n next?.settings.enabled &&\n next.settings.output !== \"copy\" &&\n permission?.granted === false\n ) {\n requestPermission(\"accessibility\");\n }\n });\n };\n\n return (\n <>\n <Section\n variant=\"group\"\n title={t(\"desktopDictation.settings.title\")}\n description={t(\"desktopDictation.settings.description\")}\n className={className}\n >\n <SettingRow\n label={t(\"desktopDictation.settings.toggleLabel\")}\n description={\n settings.enabled\n ? single\n ? t(\n settings.mode === \"hold\" && first.shortcut.kind !== \"accelerator\"\n ? \"desktopDictation.settings.toggleOnHold\"\n : \"desktopDictation.settings.toggleOn\",\n { shortcut: desktopShortcutLabel(first.shortcut, platform) },\n )\n : t(\"desktopDictation.settings.toggleOnMany\")\n : t(\"desktopDictation.settings.toggleOff\")\n }\n error={error}\n control={\n <Switch\n checked={settings.enabled}\n pending={saving}\n aria-label={t(\"desktopDictation.settings.toggleLabel\")}\n onCheckedChange={onToggle}\n />\n }\n >\n {settings.enabled ? (\n <>\n {profiles.map((profile) => (\n <ProfileRows\n key={profile.id}\n profile={profile}\n profiles={profiles}\n status={status}\n single={single}\n saving={saving}\n recording={recordingFor === profile.id}\n error={\n (keysError?.profileId === profile.id ? keysError.message : null) ??\n shortcutProblemMessage(\n status.shortcutErrors.find((item) => item.profileId === profile.id)?.problem,\n t,\n )\n }\n languageOptions={languageOptions(profile.language)}\n modelOptions={offerModels ? modelOptions(profile.model) : null}\n onModel={(value) => setModel(profile.id, value)}\n onRecord={(recording) => {\n setKeysError(null);\n setRecordingFor(recording ? profile.id : null);\n }}\n onShortcut={(shortcut) =>\n saveProfiles(\n profiles.map((item) =>\n item.id === profile.id ? { ...item, shortcut } : item,\n ),\n )\n }\n onLanguage={(value) => setLanguage(profile.id, value)}\n onRemove={() => saveProfiles(profiles.filter((item) => item.id !== profile.id))}\n />\n ))}\n {profiles.length < PROFILES_MAX && freeShortcut(profiles, status) ? (\n <SettingRow\n label={t(\"desktopDictation.settings.addLabel\")}\n description={t(\"desktopDictation.settings.addDescription\")}\n control={\n <Button size=\"sm\" variant=\"outline\" disabled={saving} onClick={addProfile}>\n {t(\"desktopDictation.settings.add\")}\n </Button>\n }\n />\n ) : null}\n {modifierShortcuts ? (\n <SettingRow\n label={t(\"desktopDictation.settings.modeLabel\")}\n controlWidth=\"select\"\n control={\n <SelectMenu\n size=\"sm\"\n className=\"w-56\"\n align=\"end\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.modeLabel\")}\n value={settings.mode}\n options={[\n {\n value: \"toggle\",\n label: t(\"desktopDictation.settings.modeToggle\"),\n description: t(\"desktopDictation.settings.modeToggleDescription\"),\n },\n {\n value: \"hold\",\n label: t(\"desktopDictation.settings.modeHold\"),\n description: t(\"desktopDictation.settings.modeHoldDescription\"),\n },\n ]}\n onValueChange={(mode) => void update({ mode })}\n />\n }\n />\n ) : null}\n <SettingRow\n label={t(\"desktopDictation.settings.outputLabel\")}\n description={\n status.paste.available\n ? t(\"desktopDictation.settings.outputDescription\")\n : pasteBlockedMessage(status.paste.blocker, t)\n }\n controlWidth=\"select\"\n control={\n <SelectMenu<DesktopDictationOutput>\n size=\"sm\"\n className=\"w-56\"\n align=\"end\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.outputLabel\")}\n value={settings.output}\n options={[\n {\n value: \"paste\",\n label: t(\"desktopDictation.settings.outputPaste\"),\n description: t(\"desktopDictation.settings.outputPasteDescription\"),\n },\n {\n value: \"pasteAndCopy\",\n label: t(\"desktopDictation.settings.outputPasteAndCopy\"),\n description: t(\"desktopDictation.settings.outputPasteAndCopyDescription\"),\n },\n {\n value: \"copy\",\n label: t(\"desktopDictation.settings.outputCopy\"),\n description: t(\"desktopDictation.settings.outputCopyDescription\"),\n },\n ]}\n onValueChange={(output) => void update({ output })}\n />\n }\n />\n {accessibility && settings.output !== \"copy\" ? (\n <SettingRow\n label={t(\"desktopDictation.settings.accessibilityLabel\")}\n description={t(\"desktopDictation.settings.accessibilityDescription\")}\n control={\n accessibility.granted ? (\n <span className=\"inline-flex items-center gap-1.5 text-sm text-fg-muted\">\n <CheckIcon className=\"size-4 text-status-success\" aria-hidden />\n {t(\"desktopDictation.settings.allowed\")}\n </span>\n ) : (\n <Button size=\"sm\" onClick={() => requestPermission(\"accessibility\")}>\n {t(\"desktopDictation.settings.allow\")}\n </Button>\n )\n }\n />\n ) : null}\n {settings.retryShortcut !== undefined\n ? ([\"retry\", \"cancel\"] as const).map((action) => (\n <ActionShortcutRow\n key={action}\n action={action}\n keys={settings[actionKey(action)] ?? null}\n platform={platform}\n saving={saving}\n recording={recordingFor === `${ACTION_PREFIX}${action}`}\n error={\n (keysError?.profileId === `${ACTION_PREFIX}${action}`\n ? keysError.message\n : null) ??\n shortcutProblemMessage(\n status.actionShortcutErrors?.find((item) => item.action === action)\n ?.problem,\n t,\n )\n }\n onRecord={(recording) => {\n setKeysError(null);\n setRecordingFor(recording ? `${ACTION_PREFIX}${action}` : null);\n }}\n onClear={() => void update({ [actionKey(action)]: null })}\n />\n ))\n : null}\n {settings.vocabulary !== undefined ? (\n <WordListRow\n words={settings.vocabulary}\n saving={saving}\n text={{\n label: t(\"desktopDictation.settings.vocabularyLabel\"),\n description: t(\"desktopDictation.settings.vocabularyDescription\"),\n placeholder: t(\"desktopDictation.settings.vocabularyPlaceholder\"),\n termTooLong: (term, max) =>\n t(\"desktopDictation.settings.vocabularyTermTooLong\", {\n term,\n max: String(max),\n }),\n tooMany: (max) =>\n t(\"desktopDictation.settings.vocabularyTooMany\", { max: String(max) }),\n }}\n onChange={(vocabulary) => void update({ vocabulary })}\n />\n ) : null}\n </>\n ) : null}\n </SettingRow>\n </Section>\n {history.length > 0 ? (\n <Section\n variant=\"group\"\n title={t(\"desktopDictation.settings.historyTitle\")}\n description={t(\"desktopDictation.settings.historyDescription\")}\n action={\n <Button size=\"sm\" variant=\"ghost\" onClick={() => void clearHistory()}>\n {t(\"desktopDictation.settings.clearHistory\")}\n </Button>\n }\n >\n {history.slice(0, 10).map((entry) => (\n <SettingRow\n key={entry.id}\n label={\n entry.cancelled ? (\n <span className=\"font-normal text-fg-muted\">\n {t(\"desktopDictation.settings.cancelledDictation\")}\n </span>\n ) : (\n <span className=\"line-clamp-2 font-normal break-words\">{entry.text}</span>\n )\n }\n description={\n <>\n <RelativeTime date={entry.at} focusable={false} />\n {profiles.length > 1 ? ` · ${entry.profileName}` : null}\n </>\n }\n control={\n <div className=\"flex items-center gap-0.5\">\n {entry.audio && dictation.historyAudio ? (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label={t(\n playback.playing === entry.id\n ? \"desktopDictation.settings.stopPlaying\"\n : \"desktopDictation.settings.play\",\n )}\n title={t(\n playback.playing === entry.id\n ? \"desktopDictation.settings.stopPlaying\"\n : \"desktopDictation.settings.play\",\n )}\n onClick={() => playback.toggle(entry.id)}\n >\n {playback.playing === entry.id ? (\n <SquareIcon aria-hidden />\n ) : (\n <PlayIcon aria-hidden />\n )}\n </Button>\n ) : null}\n {entry.audio && transcribeAgain ? (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label={t(\"desktopDictation.settings.transcribeAgain\")}\n title={t(\"desktopDictation.settings.transcribeAgain\")}\n onClick={() => transcribeAgain(entry.id)}\n >\n <RotateCcwIcon aria-hidden />\n </Button>\n ) : null}\n {entry.text ? (\n <CopyText text={entry.text} label={t(\"desktopDictation.settings.copyText\")} />\n ) : null}\n </div>\n }\n />\n ))}\n </Section>\n ) : null}\n </>\n );\n}\n\n/** Copies a dictation's text again; a check shows it worked. */\nfunction CopyText({ text, label }: { text: string; label: string }) {\n const [copied, setCopied] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(\n () => () => {\n if (timer.current) clearTimeout(timer.current);\n },\n [],\n );\n return (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label={label}\n title={label}\n onClick={() => {\n void copyTextToClipboard(text).then((ok) => {\n if (!ok) return;\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), 1_600);\n });\n }}\n >\n {copied ? (\n <CheckIcon className=\"text-status-success\" aria-hidden />\n ) : (\n <CopyIcon aria-hidden />\n )}\n </Button>\n );\n}\n\n/** The retry or cancel shortcut: none, or a key combination the person presses. */\nfunction ActionShortcutRow({\n action,\n keys,\n platform,\n saving,\n recording,\n error,\n onRecord,\n onClear,\n}: {\n action: DesktopDictationAction;\n keys: DesktopDictationKeys | null;\n platform: DesktopPlatform;\n saving: boolean;\n recording: boolean;\n error: string | null;\n onRecord: (recording: boolean) => void;\n onClear: () => void;\n}) {\n const t = useOpenGeniText();\n const label = t(\n action === \"retry\"\n ? \"desktopDictation.settings.retryShortcutLabel\"\n : \"desktopDictation.settings.cancelShortcutLabel\",\n );\n const options: SelectOption[] = [\n { value: NONE, label: t(\"desktopDictation.settings.noShortcut\") },\n ...(keys ? [{ value: KEYS, label: desktopShortcutLabel(keys, platform) }] : []),\n {\n value: CUSTOM,\n label: t(\n keys\n ? \"desktopDictation.settings.otherKeyCombination\"\n : \"desktopDictation.settings.keyCombination\",\n ),\n description: t(\"desktopDictation.settings.keyCombinationDescription\"),\n },\n ];\n return (\n <SettingRow\n label={label}\n description={\n recording\n ? t(\"desktopDictation.settings.recordKeys\")\n : t(\n action === \"retry\"\n ? \"desktopDictation.settings.retryShortcutDescription\"\n : \"desktopDictation.settings.cancelShortcutDescription\",\n )\n }\n error={error}\n controlWidth=\"select\"\n control={\n recording ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => onRecord(false)}>\n {t(\"desktopDictation.settings.cancelRecording\")}\n </Button>\n ) : (\n <SelectMenu\n size=\"sm\"\n className=\"w-56\"\n align=\"end\"\n disabled={saving}\n aria-label={label}\n options={options}\n value={keys ? KEYS : NONE}\n onValueChange={(value) => {\n if (value === CUSTOM) onRecord(true);\n else if (value === NONE) onClear();\n }}\n />\n )\n }\n />\n );\n}\n\n/** Plays one kept dictation's speech at a time. */\nfunction usePlayback(dictation: DesktopDictation | null): {\n playing: string | null;\n toggle: (id: string) => void;\n} {\n const [playing, setPlaying] = useState<string | null>(null);\n const current = useRef<{ id: string; context: AudioContext } | null>(null);\n const stop = useCallback(() => {\n const now = current.current;\n current.current = null;\n setPlaying(null);\n void now?.context.close().catch(() => undefined);\n }, []);\n useEffect(() => stop, [stop]);\n const toggle = useCallback(\n (id: string) => {\n const wasPlaying = current.current?.id === id;\n stop();\n if (wasPlaying || !dictation?.historyAudio) return;\n const Context =\n (globalThis as { AudioContext?: typeof AudioContext }).AudioContext ??\n (globalThis as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!Context) return;\n const context = new Context();\n const mine = { id, context };\n current.current = mine;\n setPlaying(id);\n void (async () => {\n try {\n const audio = await dictation.historyAudio!(id);\n if (!audio || current.current !== mine) throw new Error(\"gone\");\n // A copy: decoding takes the buffer over.\n const buffer = await context.decodeAudioData(audio.bytes.slice().buffer as ArrayBuffer);\n if (current.current !== mine) return;\n const source = context.createBufferSource();\n source.buffer = buffer;\n source.connect(context.destination);\n source.onended = () => {\n if (current.current === mine) stop();\n };\n source.start();\n } catch {\n if (current.current === mine) stop();\n }\n })();\n },\n [dictation, stop],\n );\n return { playing, toggle };\n}\n\nfunction ProfileRows({\n profile,\n profiles,\n status,\n single,\n saving,\n recording,\n error,\n languageOptions,\n modelOptions,\n onRecord,\n onShortcut,\n onLanguage,\n onModel,\n onRemove,\n}: {\n profile: DesktopDictationProfile;\n profiles: DesktopDictationProfile[];\n status: DesktopDictationStatus;\n single: boolean;\n saving: boolean;\n recording: boolean;\n error: string | null;\n languageOptions: SelectOption[];\n /** Null when there is no model to pick. */\n modelOptions: SelectOption[] | null;\n onRecord: (recording: boolean) => void;\n onShortcut: (shortcut: DesktopDictationShortcut) => void;\n onLanguage: (value: string) => void;\n onModel: (value: string) => void;\n onRemove: () => void;\n}) {\n const t = useOpenGeniText();\n const { shortcut } = profile;\n const options = shortcutOptions(profile, profiles, status, t);\n const hold = status.settings.mode === \"hold\";\n const description = recording\n ? t(\"desktopDictation.settings.recordKeys\")\n : shortcut.kind === \"modifierChord\"\n ? t(hold ? \"desktopDictation.settings.chordHold\" : \"desktopDictation.settings.chordToggle\")\n : shortcut.kind === \"modifierPair\"\n ? t(hold ? \"desktopDictation.settings.pairHold\" : \"desktopDictation.settings.pairToggle\")\n : t(\"desktopDictation.settings.acceleratorToggle\");\n return (\n <>\n <SettingRow\n label={single ? t(\"desktopDictation.settings.shortcutLabel\") : profile.name}\n description={description}\n error={error}\n controlWidth=\"select\"\n control={\n recording ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => onRecord(false)}>\n {t(\"desktopDictation.settings.cancelRecording\")}\n </Button>\n ) : (\n <div className=\"flex w-full items-center gap-1\">\n <SelectMenu\n size=\"sm\"\n className=\"min-w-0 flex-1\"\n align=\"end\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.shortcutLabel\")}\n options={options}\n value={shortcutValue(shortcut)}\n onValueChange={(value) => {\n if (value === CUSTOM) {\n onRecord(true);\n return;\n }\n const next = shortcutFromValue(value);\n if (next) onShortcut(next);\n }}\n />\n {single ? null : (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.remove\")}\n title={t(\"desktopDictation.settings.remove\")}\n onClick={onRemove}\n >\n <Trash2Icon aria-hidden />\n </Button>\n )}\n </div>\n )\n }\n />\n <SettingRow\n label={t(\"desktopDictation.settings.languageLabel\")}\n description={t(\"desktopDictation.settings.languageDescription\")}\n controlWidth=\"select\"\n control={\n <SelectMenu\n size=\"sm\"\n className=\"w-56\"\n align=\"end\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.languageLabel\")}\n options={languageOptions}\n value={profile.language ?? DETECT}\n onValueChange={onLanguage}\n />\n }\n />\n {modelOptions ? (\n <SettingRow\n label={t(\"desktopDictation.settings.modelLabel\")}\n description={t(\"desktopDictation.settings.modelDescription\")}\n controlWidth=\"select\"\n control={\n <SelectMenu\n size=\"sm\"\n className=\"w-56\"\n align=\"end\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.modelLabel\")}\n options={modelOptions}\n value={profile.model ? modelValue(profile.model) : WORKSPACE_MODEL}\n onValueChange={onModel}\n />\n }\n />\n ) : null}\n </>\n );\n}\n\nconst NO_MODELS: readonly DictationModelChoice[] = [];\n\nfunction modelValue(model: DesktopDictationModel): string {\n return `${model.providerId}::${model.model}`;\n}\n\nfunction sameModel(a: DesktopDictationModel, b: DesktopDictationModel): boolean {\n return a.providerId === b.providerId && a.model === b.model;\n}\n\n/** The shortcuts a profile can pick: modifier keys first where they work, then any combination. */\nfunction shortcutOptions(\n profile: DesktopDictationProfile,\n profiles: DesktopDictationProfile[],\n status: DesktopDictationStatus,\n t: OpenGeniText,\n): SelectOption[] {\n const { platform } = status;\n const candidates: DesktopDictationShortcut[] = [];\n if (status.modifierChords) {\n for (const modifiers of CHORDS) candidates.push({ kind: \"modifierChord\", modifiers });\n }\n for (const modifier of status.modifierPairs) candidates.push({ kind: \"modifierPair\", modifier });\n const own = profile.shortcut;\n if (own.kind !== \"accelerator\" && !candidates.some((item) => sameDesktopShortcut(item, own))) {\n candidates.unshift(own);\n }\n const options: SelectOption[] = candidates.map((candidate) => {\n const taken = usedByAnother({ ...status.settings, profiles }, profile.id, candidate);\n return {\n value: shortcutValue(candidate),\n label: desktopShortcutLabel(candidate, platform),\n disabled: taken,\n ...(taken ? { disabledReason: t(\"desktopDictation.settings.usedByAnother\") } : {}),\n };\n });\n options.push({\n value: CUSTOM,\n label:\n own.kind === \"accelerator\"\n ? desktopShortcutLabel(own, platform)\n : t(\"desktopDictation.settings.keyCombination\"),\n description: t(\"desktopDictation.settings.keyCombinationDescription\"),\n });\n return options;\n}\n\nfunction shortcutValue(shortcut: DesktopDictationShortcut): string {\n if (shortcut.kind === \"modifierPair\") return `pair:${shortcut.modifier}`;\n if (shortcut.kind === \"modifierChord\") {\n return `chord:${CHORD_ORDER.filter((modifier) => shortcut.modifiers.includes(modifier)).join(\"+\")}`;\n }\n return CUSTOM;\n}\n\nfunction shortcutFromValue(value: string): DesktopDictationShortcut | null {\n if (value.startsWith(\"pair:\")) {\n const modifier = value.slice(\"pair:\".length);\n return modifier === \"fn\" || !CHORD_ORDER.includes(modifier as DesktopDictationModifier)\n ? null\n : { kind: \"modifierPair\", modifier: modifier as Exclude<DesktopDictationModifier, \"fn\"> };\n }\n if (value.startsWith(\"chord:\")) {\n const modifiers = value\n .slice(\"chord:\".length)\n .split(\"+\")\n .filter((part): part is DesktopDictationModifier =>\n CHORD_ORDER.includes(part as DesktopDictationModifier),\n );\n return modifiers.length >= 2 ? { kind: \"modifierChord\", modifiers } : null;\n }\n return null;\n}\n\n/** Another shortcut (a dictation's, or retry or cancel) uses these keys. */\nfunction usedByAnother(\n settings: DesktopDictationSettings,\n ownerId: string,\n shortcut: DesktopDictationShortcut,\n): boolean {\n if (\n settings.profiles.some(\n (profile) => profile.id !== ownerId && sameDesktopShortcut(profile.shortcut, shortcut),\n )\n ) {\n return true;\n }\n return ([\"retry\", \"cancel\"] as const).some((action) => {\n const keys = settings[actionKey(action)];\n return `${ACTION_PREFIX}${action}` !== ownerId && keys\n ? sameDesktopShortcut(keys, shortcut)\n : false;\n });\n}\n\nfunction actionKey(action: DesktopDictationAction): \"retryShortcut\" | \"cancelShortcut\" {\n return action === \"retry\" ? \"retryShortcut\" : \"cancelShortcut\";\n}\n\n/** A shortcut no profile uses yet, for a new one. */\nfunction freeShortcut(\n profiles: DesktopDictationProfile[],\n status: DesktopDictationStatus,\n): DesktopDictationShortcut | null {\n const candidates: DesktopDictationShortcut[] = status.modifierChords\n ? CHORDS.map((modifiers) => ({ kind: \"modifierChord\", modifiers }))\n : [];\n for (const accelerator of ACCELERATORS) candidates.push({ kind: \"accelerator\", accelerator });\n return (\n candidates.find(\n (candidate) => !usedByAnother({ ...status.settings, profiles }, \"\", candidate),\n ) ?? null\n );\n}\n\nfunction newProfileId(profiles: DesktopDictationProfile[]): string {\n for (let index = profiles.length + 1; ; index += 1) {\n const id = `shortcut-${index}`;\n if (!profiles.some((profile) => profile.id === id)) return id;\n }\n}\n\n/** What a shortcut is called: its language, or \"Any language\" when it detects one. */\nexport function profileName(language: string | null, t: OpenGeniText): string {\n return language ? languageName(language, t.locale) : t(\"desktopDictation.settings.anyLanguage\");\n}\n\nfunction shortcutProblemMessage(\n problem: DesktopDictationShortcutProblem | undefined,\n t: OpenGeniText,\n): string | null {\n switch (problem) {\n case \"taken\":\n return t(\"desktopDictation.settings.shortcutTaken\");\n case \"unsupported\":\n return t(\"desktopDictation.settings.shortcutUnsupported\");\n case \"stopped\":\n return t(\"desktopDictation.settings.shortcutStopped\");\n case \"failed\":\n return t(\"desktopDictation.settings.shortcutFailed\");\n default:\n return null;\n }\n}\n\n/** Why the text is copied instead of typed, and what would change that. */\nfunction pasteBlockedMessage(\n blocker: DesktopDictationPasteBlocker | null,\n t: OpenGeniText,\n): string {\n switch (blocker) {\n case \"accessibility\":\n return t(\"desktopDictation.settings.pasteAccessibility\");\n case \"xdotool\":\n return t(\"desktopDictation.settings.pasteXdotool\");\n case \"wtype\":\n return t(\"desktopDictation.settings.pasteWtype\");\n default:\n return t(\"desktopDictation.settings.pasteUnsupported\");\n }\n}\n","// How the desktop app's global shortcuts are named and recorded, shared by\n// the dictation and app-shot settings.\nimport type {\n DesktopDictationModifier,\n DesktopDictationShortcut,\n DesktopPlatform,\n} from \"@opengeni/sdk/desktop-bridge\";\n\nconst MODIFIER_NAMES: Record<DesktopDictationModifier, { mac: string; other: string }> = {\n command: { mac: \"⌘ Command\", other: \"Windows\" },\n option: { mac: \"⌥ Option\", other: \"Alt\" },\n control: { mac: \"⌃ Control\", other: \"Ctrl\" },\n shift: { mac: \"⇧ Shift\", other: \"Shift\" },\n fn: { mac: \"Fn\", other: \"Fn\" },\n};\n\nconst MAC_KEYS: Record<string, string> = {\n Command: \"⌘\",\n Cmd: \"⌘\",\n CommandOrControl: \"⌘\",\n CmdOrCtrl: \"⌘\",\n Control: \"⌃\",\n Ctrl: \"⌃\",\n Option: \"⌥\",\n Alt: \"⌥\",\n Shift: \"⇧\",\n};\n\n/** \"⌥ Option\" on a Mac, \"Alt\" elsewhere. */\nexport function modifierName(\n modifier: DesktopDictationModifier,\n platform: DesktopPlatform,\n): string {\n const name = MODIFIER_NAMES[modifier];\n return platform === \"macos\" ? name.mac : name.other;\n}\n\n/**\n * A shortcut as people read it: \"⌘⇧2\" or \"Ctrl+Shift+2\" for a key\n * combination, \"Both ⌥ Option keys\" for a pair, \"⌃ Control + Fn\" for\n * modifier keys held together.\n */\nexport function desktopShortcutLabel(\n shortcut: DesktopDictationShortcut,\n platform: DesktopPlatform,\n): string {\n if (shortcut.kind === \"modifierPair\") {\n return `Both ${modifierName(shortcut.modifier, platform)} keys`;\n }\n if (shortcut.kind === \"modifierChord\") {\n return shortcut.modifiers.map((modifier) => modifierName(modifier, platform)).join(\" + \");\n }\n const parts = shortcut.accelerator.split(\"+\");\n if (platform === \"macos\") return parts.map((part) => MAC_KEYS[part] ?? part).join(\"\");\n return parts\n .map((part) =>\n part === \"CommandOrControl\" || part === \"CmdOrCtrl\" || part === \"Control\" ? \"Ctrl\" : part,\n )\n .join(\"+\");\n}\n\n/**\n * The key combination a keydown makes, in Electron's accelerator syntax, or\n * null while only modifiers are held or none is (a shortcut needs one).\n */\nexport function acceleratorFromKey(\n event: Pick<KeyboardEvent, \"code\" | \"metaKey\" | \"ctrlKey\" | \"altKey\" | \"shiftKey\">,\n platform: DesktopPlatform,\n): string | null {\n const key = acceleratorKey(event.code);\n if (!key) return null;\n const modifiers: string[] = [];\n if (event.metaKey) modifiers.push(platform === \"macos\" ? \"Command\" : \"Super\");\n if (event.ctrlKey) modifiers.push(\"Control\");\n if (event.altKey) modifiers.push(\"Alt\");\n if (event.shiftKey) modifiers.push(\"Shift\");\n // Shift alone would take an ordinary character from every app.\n if (modifiers.length === 0 || (modifiers.length === 1 && event.shiftKey)) return null;\n return [...modifiers, key].join(\"+\");\n}\n\nconst NAMED_KEYS: Record<string, string> = {\n Space: \"Space\",\n Enter: \"Enter\",\n Tab: \"Tab\",\n Backspace: \"Backspace\",\n Delete: \"Delete\",\n Insert: \"Insert\",\n Home: \"Home\",\n End: \"End\",\n PageUp: \"PageUp\",\n PageDown: \"PageDown\",\n ArrowUp: \"Up\",\n ArrowDown: \"Down\",\n ArrowLeft: \"Left\",\n ArrowRight: \"Right\",\n Minus: \"-\",\n Equal: \"=\",\n BracketLeft: \"[\",\n BracketRight: \"]\",\n Semicolon: \";\",\n Quote: \"'\",\n Comma: \",\",\n Period: \".\",\n Slash: \"/\",\n Backslash: \"\\\\\",\n Backquote: \"`\",\n};\n\nfunction acceleratorKey(code: string): string | null {\n const letter = /^Key([A-Z])$/u.exec(code);\n if (letter) return letter[1]!;\n const digit = /^Digit([0-9])$/u.exec(code);\n if (digit) return digit[1]!;\n if (/^F([1-9]|1[0-9]|2[0-4])$/u.test(code)) return code;\n return NAMED_KEYS[code] ?? null;\n}\n\n/** The same physical keys, so two shortcuts never fight over one press. */\nexport function sameDesktopShortcut(\n a: DesktopDictationShortcut,\n b: DesktopDictationShortcut,\n): boolean {\n if (a.kind === \"accelerator\" && b.kind === \"accelerator\") {\n return a.accelerator.toLowerCase() === b.accelerator.toLowerCase();\n }\n if (a.kind === \"modifierPair\" && b.kind === \"modifierPair\") return a.modifier === b.modifier;\n if (a.kind === \"modifierChord\" && b.kind === \"modifierChord\") {\n return [...a.modifiers].sort().join(\"+\") === [...b.modifiers].sort().join(\"+\");\n }\n return false;\n}\n"],"mappings":"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","names":["getDesktopDictation","useCallback","useEffect","useMemo","useRef","useState","useMemo","getDesktopDictation","useState","useCallback","useEffect","profiles","useRef"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/desktop-dictation/host.tsx","../src/components/desktop-dictation/settings.tsx","../src/components/desktop-dictation/shortcuts.ts"],"sourcesContent":["// Records and transcribes for the desktop app's dictation shortcut. The app\n// owns the shortcut, the small window that shows progress and where the text\n// goes; this page records with the signed-in account, as the composer does.\nimport { resolveWorkspaceVoiceInputEnabled } from \"@opengeni/contracts\";\nimport type { ClientConfig, ClientVoiceInputConfig, OpenGeniClient } from \"@opengeni/sdk\";\nimport {\n getDesktopDictation,\n type DesktopDictation,\n type DesktopDictationAudio,\n type DesktopDictationModel,\n type DesktopDictationReport,\n type DesktopDictationRequest,\n} from \"@opengeni/sdk/desktop-bridge\";\nimport type { RecorderPlatform } from \"@opengeni/sdk/recordings\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useVoiceInput,\n type UseVoiceInputResult,\n type VoiceInputRecordingsClient,\n} from \"../../hooks/use-voice-input\";\nimport { readClientConfig } from \"../../lib/client-config-read\";\nimport { useOpenGeniText, type OpenGeniText } from \"../../messages/runtime\";\n\nexport type DesktopDictationClient = Pick<OpenGeniClient, \"transcribeAudio\"> &\n Partial<Pick<OpenGeniClient, \"requestJson\" | \"getClientConfig\" | \"getWorkspace\">>;\n\nexport type DesktopDictationHostProps = {\n /** The signed-in SDK client; dictations are recordings of this account. */\n client: DesktopDictationClient | null;\n /** The workspace that hears dictations; null records nothing. */\n workspaceId: string | null;\n /** The workspace's voice input. Read from the client's config when omitted. */\n capability?: ClientVoiceInputConfig | null | undefined;\n /** The workspace allows voice input. Read from its settings when omitted. */\n enabled?: boolean | undefined;\n /**\n * Asked before each dictation takes the microphone, such as a consent\n * check. Resolving false (or throwing) keeps the microphone off.\n */\n beforeStart?: (() => boolean | Promise<boolean>) | undefined;\n /** A recordings client, such as a host proxy. Built from `client` otherwise. */\n recordings?: Partial<VoiceInputRecordingsClient> | undefined;\n /** How this device records; the browser's by default. */\n platform?: RecorderPlatform | undefined;\n /** The app's dictation. `getDesktopDictation()` by default. */\n dictation?: DesktopDictation | null | undefined;\n};\n\n/** The voice input this page may record with, once it is known. */\ntype HostVoiceInput = { key: string; capability: ClientVoiceInputConfig | null; enabled: boolean };\n\n/** The app's dictation this page is recording: what it last reported. */\ntype Current = {\n id: string;\n phase: \"starting\" | \"recording\" | \"transcribing\" | \"failed\";\n /** Start returned without recording and without an error: it was declined. */\n declined: boolean;\n /** Speech the app kept, transcribed again rather than recorded. */\n again: boolean;\n};\n\n/** What the next render starts: a recording, or kept speech to transcribe. */\ntype Pending = { id: string; audio: DesktopDictationAudio | null };\n\nconst LEVEL_REPORT_MILLISECONDS = 100;\nconst CONFIG_RETRY_MILLISECONDS = [2_000, 10_000, 30_000, 60_000];\nconst NO_WORDS: readonly string[] = [];\n\n/**\n * Mount once on a signed-in page inside a desktop app with dictation from\n * anywhere (`getDesktopDictation()`). It renders nothing: when the person\n * presses the dictation shortcut in any app, it records the microphone here\n * and transcribes with the workspace's voice input, and the app types the\n * text where their cursor is. A dictation that fails stays saved, and the\n * composer offers it later. A cancelled one is deleted; its speech goes to the\n * app's recent dictations only, to play or transcribe again there.\n */\nexport function DesktopDictationHost(props: DesktopDictationHostProps): null {\n const t = useOpenGeniText();\n const dictation = useMemo(\n () => (props.dictation === undefined ? getDesktopDictation() : props.dictation),\n [props.dictation],\n );\n const { client, workspaceId } = props;\n const voiceInput = useHostVoiceInput(\n dictation ? client : null,\n workspaceId,\n props.capability,\n props.enabled,\n );\n const [language, setLanguage] = useState<string | null>(null);\n const [model, setModel] = useState<DesktopDictationModel | null>(null);\n const [vocabulary, setVocabulary] = useState<readonly string[]>(NO_WORDS);\n const [pending, setPending] = useState<Pending | null>(null);\n const [declined, setDeclined] = useState(0);\n const current = useRef<Current | null>(null);\n /** The speech of the dictation being recorded, read for the app to keep. */\n const kept = useRef<{ id: string; audio: Promise<DesktopDictationAudio | null> } | null>(null);\n /** While the app's Cancel runs: the cancelled dictation's speech, when it is worth keeping. */\n const cancelling = useRef<{ audio: Promise<DesktopDictationAudio | null> | null } | null>(null);\n\n const report = useCallback(\n (next: DesktopDictationReport) => {\n try {\n dictation?.report(next);\n } catch {\n // The app went away; its own watchdog ends the dictation.\n }\n },\n [dictation],\n );\n\n const voice = useVoiceInput({\n client,\n workspaceId: workspaceId ?? \"\",\n capability: voiceInput?.capability ?? null,\n enabled: voiceInput?.enabled ?? false,\n // The text goes to the app, never into a draft here.\n value: \"\",\n setValue: (text) => {\n const active = current.current;\n if (!active) return;\n current.current = null;\n const audio = kept.current?.id === active.id ? kept.current.audio : null;\n kept.current = null;\n if (!audio) {\n report({ dictationId: active.id, phase: \"done\", text });\n return;\n }\n void audio.then((speech) =>\n report({\n dictationId: active.id,\n phase: \"done\",\n text,\n ...(speech ? { audio: speech } : {}),\n }),\n );\n },\n focusInput: noop,\n language,\n model,\n keyterms: vocabulary,\n beforeStart: props.beforeStart,\n // Dictations an earlier page left are for the composer to offer.\n recover: false,\n // The app keeps each dictation's speech with its text, to play or transcribe\n // again, and a cancelled dictation's speech on its own.\n onAudio: ({ audio, durationMilliseconds, cancelled }) => {\n const asked = cancelled ? cancelling.current : null;\n if (asked) {\n asked.audio = readSpeech(audio, durationMilliseconds);\n return;\n }\n const active = current.current;\n if (!active || active.again) return;\n if (cancelled) {\n // Cancelled on this page rather than by the app: the dictation ends here.\n current.current = null;\n kept.current = null;\n void readSpeech(audio, durationMilliseconds).then((speech) =>\n report({\n dictationId: active.id,\n phase: \"cancelled\",\n ...(speech ? { audio: speech } : {}),\n }),\n );\n return;\n }\n kept.current = { id: active.id, audio: readSpeech(audio, durationMilliseconds) };\n },\n recordings: props.recordings,\n platform: props.platform,\n });\n const voiceRef = useRef<UseVoiceInputResult>(voice);\n voiceRef.current = voice;\n const available = Boolean(voiceInput?.capability?.available && voiceInput.enabled);\n const availableRef = useRef(available);\n availableRef.current = available;\n const capabilityRef = useRef(voiceInput?.capability ?? null);\n capabilityRef.current = voiceInput?.capability ?? null;\n\n const words = useRef({ t, report });\n words.current = { t, report };\n\n const handle = useCallback((request: DesktopDictationRequest) => {\n const voiceNow = voiceRef.current;\n const { t: text, report: send } = words.current;\n if (request.kind === \"start\" || request.kind === \"transcribe\") {\n if (!availableRef.current) {\n send({\n dictationId: request.dictationId,\n phase: \"failed\",\n message: text(\"desktopDictation.host.voiceInputOff\"),\n retryable: false,\n });\n return;\n }\n // A dictation still held here (one that failed) stays saved for the\n // composer; this one starts fresh.\n if (voiceNow.status !== \"idle\") voiceNow.release();\n const again = request.kind === \"transcribe\";\n current.current = { id: request.dictationId, phase: \"starting\", declined: false, again };\n kept.current = null;\n setLanguage(request.language);\n setModel(offeredModel(request.model, capabilityRef.current));\n setVocabulary(request.vocabulary ?? NO_WORDS);\n setPending({ id: request.dictationId, audio: again ? request.audio : null });\n return;\n }\n const active = current.current;\n if (!active || active.id !== request.dictationId) return;\n switch (request.kind) {\n case \"stop\":\n voiceNow.stop();\n return;\n case \"cancel\": {\n current.current = null;\n kept.current = null;\n if (active.again) {\n // The app still has the speech: nothing here needs keeping.\n void voiceNow.discard();\n send({ dictationId: active.id, phase: \"cancelled\" });\n return;\n }\n // Deleted here; speech worth keeping comes back for the app's recent dictations.\n const asked: { audio: Promise<DesktopDictationAudio | null> | null } = { audio: null };\n cancelling.current = asked;\n try {\n voiceNow.cancel();\n } finally {\n cancelling.current = null;\n }\n const { audio } = asked;\n if (!audio) {\n send({ dictationId: active.id, phase: \"cancelled\" });\n return;\n }\n void audio.then((speech) =>\n send({\n dictationId: active.id,\n phase: \"cancelled\",\n ...(speech ? { audio: speech } : {}),\n }),\n );\n return;\n }\n case \"dismiss\":\n current.current = null;\n if (active.again) void voiceNow.discard();\n else voiceNow.release();\n return;\n case \"retry\":\n voiceNow.retry();\n return;\n }\n }, []);\n\n // Record for the app's shortcut once this workspace's voice input is known,\n // so a press that opened this page waits for it rather than failing.\n const listening = Boolean(dictation && workspaceId && voiceInput);\n useEffect(() => {\n if (!dictation || !listening) return;\n const off = dictation.onRequest(handle);\n return () => {\n off();\n const active = current.current;\n current.current = null;\n if (active) {\n voiceRef.current.release();\n const { t: text, report: send } = words.current;\n send({\n dictationId: active.id,\n phase: \"failed\",\n message: text(\"desktopDictation.host.stopped\"),\n retryable: false,\n });\n }\n };\n }, [dictation, handle, listening, workspaceId]);\n\n // Start after the render that applied the dictation's language and vocabulary.\n useEffect(() => {\n if (!pending) return;\n setPending(null);\n const { id, audio } = pending;\n // Cancelled before it could start: nothing to record.\n if (current.current?.id !== id) return;\n const starting = audio\n ? voiceRef.current.transcribe(new Blob([audio.bytes as BlobPart], { type: audio.mimeType }), {\n durationMilliseconds: audio.durationMilliseconds,\n })\n : voiceRef.current.start();\n void starting.then(\n (started) => {\n const active = current.current;\n if (started || active?.id !== id) return;\n active.declined = true;\n setDeclined((count) => count + 1);\n },\n () => {\n const active = current.current;\n if (active?.id !== id) return;\n active.declined = true;\n setDeclined((count) => count + 1);\n },\n );\n }, [pending]);\n\n const { status, error, hasRecoverableRecording, recordingStartedAt } = voice;\n useEffect(() => {\n const active = current.current;\n if (!active) return;\n switch (status) {\n case \"requesting-permission\":\n return;\n case \"recording\":\n if (active.phase === \"starting\") {\n active.phase = \"recording\";\n report({\n dictationId: active.id,\n phase: \"recording\",\n startedAt: recordingStartedAt ?? Date.now(),\n level: voiceRef.current.level(),\n });\n }\n return;\n case \"saving\":\n case \"transcribing\":\n case \"retrying\":\n if (active.phase !== \"transcribing\") {\n active.phase = \"transcribing\";\n report({ dictationId: active.id, phase: \"transcribing\" });\n }\n return;\n case \"transcript-ready\":\n // Held while something else had the page; it is this dictation's text.\n void voiceRef.current.insertSavedTranscript();\n return;\n case \"error\":\n if (active.phase !== \"failed\") {\n active.phase = \"failed\";\n report({\n dictationId: active.id,\n phase: \"failed\",\n message: dictationErrorMessage(error, t),\n retryable: hasRecoverableRecording,\n });\n }\n return;\n case \"recovered\":\n // Set aside here without transcribing: it stays saved for the composer.\n current.current = null;\n report({ dictationId: active.id, phase: \"cancelled\" });\n return;\n case \"idle\":\n if (active.phase === \"recording\" || active.phase === \"transcribing\") {\n // Nothing was heard (the text arrives through `setValue` otherwise).\n current.current = null;\n report({ dictationId: active.id, phase: \"done\", text: \"\" });\n } else if (active.phase === \"starting\" && active.declined) {\n current.current = null;\n report({ dictationId: active.id, phase: \"cancelled\" });\n }\n return;\n }\n }, [declined, error, hasRecoverableRecording, recordingStartedAt, report, status, t]);\n\n // The level drives the bars in the app's window.\n useEffect(() => {\n if (status !== \"recording\") return;\n const timer = setInterval(() => {\n const active = current.current;\n if (active?.phase !== \"recording\") return;\n report({\n dictationId: active.id,\n phase: \"recording\",\n startedAt: recordingStartedAt ?? Date.now(),\n level: voiceRef.current.level(),\n });\n }, LEVEL_REPORT_MILLISECONDS);\n return () => clearInterval(timer);\n }, [recordingStartedAt, report, status]);\n\n return null;\n}\n\n/** The workspace's voice input and whether its settings allow it, read once per workspace. */\nfunction useHostVoiceInput(\n client: DesktopDictationClient | null,\n workspaceId: string | null,\n capability: ClientVoiceInputConfig | null | undefined,\n enabled: boolean | undefined,\n): HostVoiceInput | null {\n const [state, setState] = useState<HostVoiceInput | null>(null);\n // By value: a host may pass a fresh object on every render.\n const capabilityKey = capability === undefined ? null : JSON.stringify(capability);\n const given = useRef(capability);\n given.current = capability;\n useEffect(() => {\n if (!client || !workspaceId) return;\n let live = true;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const key = workspaceId;\n const readCapability = async (): Promise<ClientVoiceInputConfig | null> => {\n if (capabilityKey !== null) return given.current ?? null;\n if (typeof client.getClientConfig !== \"function\") return null;\n const config = await readClientConfig<ClientConfig>(\n client as Pick<OpenGeniClient, \"getClientConfig\">,\n workspaceId,\n );\n return config.voiceInput ?? null;\n };\n const readEnabled = async (): Promise<boolean> => {\n if (enabled !== undefined) return enabled;\n if (typeof client.getWorkspace !== \"function\") return true;\n // The transcription request still enforces the setting.\n return client.getWorkspace(workspaceId).then(\n (workspace) => resolveWorkspaceVoiceInputEnabled(workspace.settings) ?? true,\n () => true,\n );\n };\n const read = (attempt: number) => {\n Promise.all([readCapability(), readEnabled()]).then(\n ([nextCapability, nextEnabled]) => {\n if (live) setState({ key, capability: nextCapability, enabled: nextEnabled });\n },\n () => {\n // Offline at start: try again, and record nothing until it is known.\n if (!live) return;\n const delay =\n CONFIG_RETRY_MILLISECONDS[Math.min(attempt, CONFIG_RETRY_MILLISECONDS.length - 1)]!;\n timer = setTimeout(() => read(attempt + 1), delay);\n },\n );\n };\n read(0);\n return () => {\n live = false;\n if (timer) clearTimeout(timer);\n };\n }, [capabilityKey, client, enabled, workspaceId]);\n return state && state.key === workspaceId ? state : null;\n}\n\n/** A short sentence for the app's dictation window. */\nexport function dictationErrorMessage(code: string | null, t: OpenGeniText): string {\n switch (code) {\n case \"permission_denied\":\n return t(\"desktopDictation.host.microphoneBlocked\");\n case \"not_supported\":\n return t(\"desktopDictation.host.cantRecord\");\n case \"unavailable\":\n return t(\"desktopDictation.host.voiceInputOff\");\n case \"insufficient_credits\":\n return t(\"desktopDictation.host.needsCredits\");\n case \"allowance_exhausted\":\n case \"monthly_model_cost_limit\":\n return t(\"desktopDictation.host.usageLimit\");\n case \"policy_blocked\":\n return t(\"desktopDictation.host.notAllowed\");\n case \"too_large\":\n return t(\"desktopDictation.host.tooLong\");\n case \"invalid_audio\":\n return t(\"desktopDictation.host.unreadable\");\n case \"storage_unavailable\":\n return t(\"desktopDictation.host.notSaved\");\n case \"network\":\n case \"provider\":\n case \"timeout\":\n return t(\"desktopDictation.host.transcriptionFailed\");\n default:\n return t(\"desktopDictation.host.couldNotStart\");\n }\n}\n\nfunction noop(): void {}\n\n/** A dictation's speech as the app keeps it, or null when it can't be read. */\nfunction readSpeech(\n audio: Blob,\n durationMilliseconds: number,\n): Promise<DesktopDictationAudio | null> {\n return audio.arrayBuffer().then(\n (buffer) => ({\n mimeType: audio.type || \"audio/webm\",\n bytes: new Uint8Array(buffer),\n durationMilliseconds,\n }),\n () => null,\n );\n}\n\n/**\n * The shortcut's own model when this workspace offers it; otherwise null, so\n * the workspace's voice input model hears it rather than the dictation failing.\n */\nfunction offeredModel(\n wanted: DesktopDictationModel | null | undefined,\n capability: ClientVoiceInputConfig | null | undefined,\n): DesktopDictationModel | null {\n if (!wanted) return null;\n const offered = capability?.models?.some(\n (entry) => entry.providerId === wanted.providerId && entry.model === wanted.model,\n );\n return offered ? { providerId: wanted.providerId, model: wanted.model } : null;\n}\n","// The desktop app's dictation settings: turning dictation from anywhere on,\n// its shortcuts and their languages, where the text goes, what the system\n// must allow, the words to listen for, and the recent dictations kept on this\n// computer, to copy, play or transcribe again.\nimport {\n getDesktopDictation,\n type DesktopDictation,\n type DesktopDictationAction,\n type DesktopDictationHistoryEntry,\n type DesktopDictationKeys,\n type DesktopDictationModel,\n type DesktopDictationModifier,\n type DesktopDictationOutput,\n type DesktopDictationPasteBlocker,\n type DesktopDictationPermissionId,\n type DesktopDictationProfile,\n type DesktopDictationSettings,\n type DesktopDictationShortcut,\n type DesktopDictationShortcutProblem,\n type DesktopDictationStatus,\n type DesktopPlatform,\n} from \"@opengeni/sdk/desktop-bridge\";\nimport { CheckIcon, CopyIcon, PlayIcon, RotateCcwIcon, SquareIcon, Trash2Icon } from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { copyTextToClipboard } from \"../../lib/clipboard\";\nimport { MEETING_LANGUAGES } from \"../../meetings/meeting-languages\";\nimport { useOpenGeniText, type OpenGeniText } from \"../../messages/runtime\";\nimport { languageName } from \"../../recordings-model\";\nimport { Button } from \"../../ui/button\";\nimport { RelativeTime } from \"../../ui/relative-time\";\nimport { Section } from \"../../ui/section\";\nimport { SelectMenu, type SelectOption } from \"../../ui/select-menu\";\nimport { SettingRow } from \"../../ui/setting-row\";\nimport { Switch } from \"../../ui/switch\";\nimport { WordListRow } from \"../../ui/word-list-row\";\nimport { acceleratorFromKey, desktopShortcutLabel, sameDesktopShortcut } from \"./shortcuts\";\n\n/** At most this many shortcuts, as the app keeps them. */\nconst PROFILES_MAX = 8;\nconst DETECT = \"auto\";\n/** A shortcut without a model of its own: the workspace's voice input model. */\nconst WORKSPACE_MODEL = \"workspace\";\nconst CUSTOM = \"custom\";\n/** Modifier keys held together that make a good shortcut on a Mac, the usual one first. */\nconst CHORDS: DesktopDictationModifier[][] = [\n [\"control\", \"fn\"],\n [\"option\", \"fn\"],\n [\"command\", \"fn\"],\n [\"shift\", \"fn\"],\n];\n/** Key combinations offered to a new shortcut where modifier keys can't be watched. */\nconst ACCELERATORS = [\n \"Control+Shift+Space\",\n \"Control+Alt+Space\",\n \"Control+Shift+D\",\n \"Control+Alt+D\",\n];\nconst CHORD_ORDER: DesktopDictationModifier[] = [\"command\", \"option\", \"control\", \"shift\", \"fn\"];\n/** What `recordingFor` holds while the retry or cancel shortcut's keys are recorded. */\nconst ACTION_PREFIX = \"action:\";\nconst NONE = \"none\";\nconst KEYS = \"keys\";\n/** As the app keeps them. */\n\nexport type UseDesktopDictationResult = {\n /** The app's dictation, or null outside a desktop app that offers it. */\n dictation: DesktopDictation | null;\n /** Null until read. */\n status: DesktopDictationStatus | null;\n /** Newest first. */\n history: DesktopDictationHistoryEntry[];\n saving: boolean;\n /** A plain sentence when the last change couldn't be saved. */\n error: string | null;\n /** Saves a change; resolves to the app's status after it, or null when it wasn't saved. */\n update: (change: Partial<DesktopDictationSettings>) => Promise<DesktopDictationStatus | null>;\n requestPermission: (id: DesktopDictationPermissionId) => void;\n clearHistory: () => Promise<void>;\n /** Transcribe a kept dictation again; null in apps that can't. */\n transcribeAgain: ((id: string) => void) | null;\n};\n\n/** The app's dictation settings and recent dictations, kept current. */\nexport function useDesktopDictation(\n given?: DesktopDictation | null | undefined,\n): UseDesktopDictationResult {\n const t = useOpenGeniText();\n const dictation = useMemo(() => (given === undefined ? getDesktopDictation() : given), [given]);\n const [status, setStatus] = useState<DesktopDictationStatus | null>(null);\n const [history, setHistory] = useState<DesktopDictationHistoryEntry[]>([]);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(() => {\n if (!dictation) return;\n void dictation.status().then(setStatus, () => undefined);\n void dictation.history().then(setHistory, () => undefined);\n }, [dictation]);\n\n useEffect(() => {\n if (!dictation) return;\n refresh();\n const off = dictation.onChange(refresh);\n // Permissions are granted in the system's settings, outside the app.\n const onFocus = () => refresh();\n globalThis.addEventListener?.(\"focus\", onFocus);\n return () => {\n off();\n globalThis.removeEventListener?.(\"focus\", onFocus);\n };\n }, [dictation, refresh]);\n\n const update = useCallback(\n async (change: Partial<DesktopDictationSettings>): Promise<DesktopDictationStatus | null> => {\n if (!dictation) return null;\n setSaving(true);\n setError(null);\n try {\n const next = await dictation.update(change);\n setStatus(next);\n return next;\n } catch {\n setError(t(\"desktopDictation.settings.saveFailed\"));\n return null;\n } finally {\n setSaving(false);\n }\n },\n [dictation, t],\n );\n\n const requestPermission = useCallback(\n (id: DesktopDictationPermissionId) => {\n void dictation\n ?.requestPermission(id)\n .then(refresh)\n .catch(() => undefined);\n },\n [dictation, refresh],\n );\n\n const clearHistory = useCallback(async () => {\n if (!dictation) return;\n await dictation.clearHistory().catch(() => undefined);\n setHistory([]);\n }, [dictation]);\n\n const transcribeAgain = useCallback(\n (id: string) => void dictation?.transcribeAgain?.(id).catch(() => undefined),\n [dictation],\n );\n\n return {\n dictation,\n status,\n history,\n saving,\n error,\n update,\n requestPermission,\n clearHistory,\n transcribeAgain: typeof dictation?.transcribeAgain === \"function\" ? transcribeAgain : null,\n };\n}\n\nexport type DesktopDictationSettingsProps = {\n /** The app's dictation. `getDesktopDictation()` by default. */\n dictation?: DesktopDictation | null | undefined;\n /** Languages offered for each shortcut, as ISO codes. Common languages by default. */\n languages?: readonly string[] | undefined;\n /**\n * The speech-to-text models a shortcut can pick, such as one for English\n * and another for Norwegian: the signed-in workspace's\n * `clientConfig.voiceInput.models`. Without them each shortcut uses the\n * workspace's voice input model and no model is offered.\n */\n models?: readonly DictationModelChoice[] | undefined;\n className?: string | undefined;\n};\n\n/** A model a dictation shortcut can pick, as the workspace's voice input lists it. */\nexport type DictationModelChoice = DesktopDictationModel & {\n providerName: string;\n /** The model's name, such as \"MAI-Transcribe-2\". */\n name: string;\n};\n\n/**\n * Settings for dictation from anywhere, shown only inside a desktop app that\n * offers it on this computer. Pair it with {@link DesktopDictationHost}\n * mounted on the signed-in pages.\n */\nexport function DesktopDictationSettings({\n dictation: given,\n languages = MEETING_LANGUAGES,\n models = NO_MODELS,\n className,\n}: DesktopDictationSettingsProps) {\n const t = useOpenGeniText();\n const {\n dictation,\n status,\n history,\n saving,\n error,\n update,\n requestPermission,\n clearHistory,\n transcribeAgain,\n } = useDesktopDictation(given);\n const [recordingFor, setRecordingFor] = useState<string | null>(null);\n const [keysError, setKeysError] = useState<{ profileId: string; message: string } | null>(null);\n const playback = usePlayback(dictation);\n const platform: DesktopPlatform = status?.platform ?? \"macos\";\n const settings = status?.settings ?? null;\n\n const saveProfiles = useCallback(\n (profiles: DesktopDictationProfile[]) => {\n setKeysError(null);\n void update({ profiles });\n },\n [update],\n );\n\n // Recording a key combination: the next one pressed becomes the shortcut.\n useEffect(() => {\n if (!recordingFor || !settings) return;\n const onKey = (event: KeyboardEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (event.key === \"Escape\" && !event.metaKey && !event.ctrlKey && !event.altKey) {\n setRecordingFor(null);\n return;\n }\n const accelerator = acceleratorFromKey(event, platform);\n if (!accelerator) return;\n setRecordingFor(null);\n const shortcut: DesktopDictationShortcut = { kind: \"accelerator\", accelerator };\n if (usedByAnother(settings, recordingFor, shortcut)) {\n setKeysError({\n profileId: recordingFor,\n message: t(\"desktopDictation.settings.usedByAnother\"),\n });\n return;\n }\n if (recordingFor.startsWith(ACTION_PREFIX)) {\n const action = recordingFor.slice(ACTION_PREFIX.length) as DesktopDictationAction;\n void update({ [actionKey(action)]: { kind: \"accelerator\", accelerator } });\n return;\n }\n saveProfiles(\n settings.profiles.map((profile) =>\n profile.id === recordingFor ? { ...profile, shortcut } : profile,\n ),\n );\n };\n globalThis.addEventListener(\"keydown\", onKey, true);\n return () => globalThis.removeEventListener(\"keydown\", onKey, true);\n }, [platform, recordingFor, saveProfiles, settings, t, update]);\n\n if (!dictation || !status?.supported || !settings) return null;\n const { profiles } = settings;\n const single = profiles.length === 1;\n const modifierShortcuts = profiles.some((profile) => profile.shortcut.kind !== \"accelerator\");\n const accessibility = status.permissions.find((permission) => permission.id === \"accessibility\");\n const first = profiles[0]!;\n\n const languageOptions = (current: string | null): SelectOption[] => {\n const codes: string[] = [...languages];\n if (current && !codes.includes(current)) codes.push(current);\n return [\n { value: DETECT, label: t(\"desktopDictation.settings.detectAutomatically\") },\n ...codes.map((code) => ({ value: code, label: languageName(code, t.locale) })),\n ];\n };\n\n const setLanguage = (id: string, value: string) => {\n const language = value === DETECT ? null : value;\n saveProfiles(\n profiles.map((profile) =>\n profile.id === id ? { ...profile, language, name: profileName(language, t) } : profile,\n ),\n );\n };\n\n const modelOptions = (current: DesktopDictationModel | null | undefined): SelectOption[] => [\n { value: WORKSPACE_MODEL, label: t(\"desktopDictation.settings.workspaceModel\") },\n ...(current && !models.some((entry) => sameModel(entry, current))\n ? [\n {\n value: modelValue(current),\n label: current.model,\n disabled: true,\n disabledReason: t(\"desktopDictation.settings.modelUnavailable\"),\n },\n ]\n : []),\n ...models.map((entry) => ({\n value: modelValue(entry),\n label: `${entry.providerName} · ${entry.name}`,\n })),\n ];\n\n const setModel = (id: string, value: string) => {\n const chosen = models.find((entry) => modelValue(entry) === value);\n saveProfiles(\n profiles.map((profile) =>\n profile.id === id\n ? {\n ...profile,\n model: chosen ? { providerId: chosen.providerId, model: chosen.model } : null,\n }\n : profile,\n ),\n );\n };\n // Offered once there is a choice, and always while a shortcut has one picked.\n const offerModels = models.length > 0 || profiles.some((profile) => profile.model);\n\n const addProfile = () => {\n const used = new Set(profiles.map((profile) => profile.language));\n const language = [...languages].find((code) => !used.has(code)) ?? null;\n const shortcut = freeShortcut(profiles, status);\n if (!shortcut) return;\n const id = newProfileId(profiles);\n // With more than one, each is named for its language wherever it shows.\n saveProfiles([\n ...profiles.map((profile) => ({ ...profile, name: profileName(profile.language, t) })),\n { id, name: profileName(language, t), shortcut, language },\n ]);\n };\n\n const onToggle = (enabled: boolean) => {\n void update({ enabled }).then((next) => {\n // Typing into other apps needs Accessibility on a Mac: ask once it is on\n // (an app may keep it off, such as until the person agrees to something).\n const permission = next?.permissions.find((entry) => entry.id === \"accessibility\");\n if (\n next?.settings.enabled &&\n next.settings.output !== \"copy\" &&\n permission?.granted === false\n ) {\n requestPermission(\"accessibility\");\n }\n });\n };\n\n return (\n <>\n <Section\n variant=\"group\"\n title={t(\"desktopDictation.settings.title\")}\n description={t(\"desktopDictation.settings.description\")}\n className={className}\n >\n <SettingRow\n label={t(\"desktopDictation.settings.toggleLabel\")}\n description={\n settings.enabled\n ? single\n ? t(\n settings.mode === \"hold\" && first.shortcut.kind !== \"accelerator\"\n ? \"desktopDictation.settings.toggleOnHold\"\n : \"desktopDictation.settings.toggleOn\",\n { shortcut: desktopShortcutLabel(first.shortcut, platform) },\n )\n : t(\"desktopDictation.settings.toggleOnMany\")\n : t(\"desktopDictation.settings.toggleOff\")\n }\n error={error}\n control={\n <Switch\n checked={settings.enabled}\n pending={saving}\n aria-label={t(\"desktopDictation.settings.toggleLabel\")}\n onCheckedChange={onToggle}\n />\n }\n >\n {settings.enabled ? (\n <>\n {profiles.map((profile) => (\n <ProfileRows\n key={profile.id}\n profile={profile}\n profiles={profiles}\n status={status}\n single={single}\n saving={saving}\n recording={recordingFor === profile.id}\n error={\n (keysError?.profileId === profile.id ? keysError.message : null) ??\n shortcutProblemMessage(\n status.shortcutErrors.find((item) => item.profileId === profile.id)?.problem,\n t,\n )\n }\n languageOptions={languageOptions(profile.language)}\n modelOptions={offerModels ? modelOptions(profile.model) : null}\n onModel={(value) => setModel(profile.id, value)}\n onRecord={(recording) => {\n setKeysError(null);\n setRecordingFor(recording ? profile.id : null);\n }}\n onShortcut={(shortcut) =>\n saveProfiles(\n profiles.map((item) =>\n item.id === profile.id ? { ...item, shortcut } : item,\n ),\n )\n }\n onLanguage={(value) => setLanguage(profile.id, value)}\n onRemove={() => saveProfiles(profiles.filter((item) => item.id !== profile.id))}\n />\n ))}\n {profiles.length < PROFILES_MAX && freeShortcut(profiles, status) ? (\n <SettingRow\n label={t(\"desktopDictation.settings.addLabel\")}\n description={t(\"desktopDictation.settings.addDescription\")}\n control={\n <Button size=\"sm\" variant=\"outline\" disabled={saving} onClick={addProfile}>\n {t(\"desktopDictation.settings.add\")}\n </Button>\n }\n />\n ) : null}\n {modifierShortcuts ? (\n <SettingRow\n label={t(\"desktopDictation.settings.modeLabel\")}\n controlWidth=\"select\"\n control={\n <SelectMenu\n size=\"sm\"\n className=\"w-56\"\n align=\"end\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.modeLabel\")}\n value={settings.mode}\n options={[\n {\n value: \"toggle\",\n label: t(\"desktopDictation.settings.modeToggle\"),\n description: t(\"desktopDictation.settings.modeToggleDescription\"),\n },\n {\n value: \"hold\",\n label: t(\"desktopDictation.settings.modeHold\"),\n description: t(\"desktopDictation.settings.modeHoldDescription\"),\n },\n ]}\n onValueChange={(mode) => void update({ mode })}\n />\n }\n />\n ) : null}\n <SettingRow\n label={t(\"desktopDictation.settings.outputLabel\")}\n description={\n status.paste.available\n ? t(\"desktopDictation.settings.outputDescription\")\n : pasteBlockedMessage(status.paste.blocker, t)\n }\n controlWidth=\"select\"\n control={\n <SelectMenu<DesktopDictationOutput>\n size=\"sm\"\n className=\"w-56\"\n align=\"end\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.outputLabel\")}\n value={settings.output}\n options={[\n {\n value: \"paste\",\n label: t(\"desktopDictation.settings.outputPaste\"),\n description: t(\"desktopDictation.settings.outputPasteDescription\"),\n },\n {\n value: \"pasteAndCopy\",\n label: t(\"desktopDictation.settings.outputPasteAndCopy\"),\n description: t(\"desktopDictation.settings.outputPasteAndCopyDescription\"),\n },\n {\n value: \"copy\",\n label: t(\"desktopDictation.settings.outputCopy\"),\n description: t(\"desktopDictation.settings.outputCopyDescription\"),\n },\n ]}\n onValueChange={(output) => void update({ output })}\n />\n }\n />\n {accessibility && settings.output !== \"copy\" ? (\n <SettingRow\n label={t(\"desktopDictation.settings.accessibilityLabel\")}\n description={t(\"desktopDictation.settings.accessibilityDescription\")}\n control={\n accessibility.granted ? (\n <span className=\"inline-flex items-center gap-1.5 text-sm text-fg-muted\">\n <CheckIcon className=\"size-4 text-status-success\" aria-hidden />\n {t(\"desktopDictation.settings.allowed\")}\n </span>\n ) : (\n <Button size=\"sm\" onClick={() => requestPermission(\"accessibility\")}>\n {t(\"desktopDictation.settings.allow\")}\n </Button>\n )\n }\n />\n ) : null}\n {settings.retryShortcut !== undefined\n ? ([\"retry\", \"cancel\"] as const).map((action) => (\n <ActionShortcutRow\n key={action}\n action={action}\n keys={settings[actionKey(action)] ?? null}\n platform={platform}\n saving={saving}\n recording={recordingFor === `${ACTION_PREFIX}${action}`}\n error={\n (keysError?.profileId === `${ACTION_PREFIX}${action}`\n ? keysError.message\n : null) ??\n shortcutProblemMessage(\n status.actionShortcutErrors?.find((item) => item.action === action)\n ?.problem,\n t,\n )\n }\n onRecord={(recording) => {\n setKeysError(null);\n setRecordingFor(recording ? `${ACTION_PREFIX}${action}` : null);\n }}\n onClear={() => void update({ [actionKey(action)]: null })}\n />\n ))\n : null}\n {settings.vocabulary !== undefined ? (\n <WordListRow\n words={settings.vocabulary}\n saving={saving}\n text={{\n label: t(\"desktopDictation.settings.vocabularyLabel\"),\n description: t(\"desktopDictation.settings.vocabularyDescription\"),\n placeholder: t(\"desktopDictation.settings.vocabularyPlaceholder\"),\n termTooLong: (term, max) =>\n t(\"desktopDictation.settings.vocabularyTermTooLong\", {\n term,\n max: String(max),\n }),\n tooMany: (max) =>\n t(\"desktopDictation.settings.vocabularyTooMany\", { max: String(max) }),\n }}\n onChange={(vocabulary) => void update({ vocabulary })}\n />\n ) : null}\n </>\n ) : null}\n </SettingRow>\n </Section>\n {history.length > 0 ? (\n <Section\n variant=\"group\"\n title={t(\"desktopDictation.settings.historyTitle\")}\n description={t(\"desktopDictation.settings.historyDescription\")}\n action={\n <Button size=\"sm\" variant=\"ghost\" onClick={() => void clearHistory()}>\n {t(\"desktopDictation.settings.clearHistory\")}\n </Button>\n }\n >\n {history.slice(0, 10).map((entry) => (\n <SettingRow\n key={entry.id}\n label={\n entry.cancelled ? (\n <span className=\"font-normal text-fg-muted\">\n {t(\"desktopDictation.settings.cancelledDictation\")}\n </span>\n ) : (\n <span className=\"line-clamp-2 font-normal break-words\">{entry.text}</span>\n )\n }\n description={\n <>\n <RelativeTime date={entry.at} focusable={false} />\n {profiles.length > 1 ? ` · ${entry.profileName}` : null}\n </>\n }\n control={\n <div className=\"flex items-center gap-0.5\">\n {entry.audio && dictation.historyAudio ? (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label={t(\n playback.playing === entry.id\n ? \"desktopDictation.settings.stopPlaying\"\n : \"desktopDictation.settings.play\",\n )}\n title={t(\n playback.playing === entry.id\n ? \"desktopDictation.settings.stopPlaying\"\n : \"desktopDictation.settings.play\",\n )}\n onClick={() => playback.toggle(entry.id)}\n >\n {playback.playing === entry.id ? (\n <SquareIcon aria-hidden />\n ) : (\n <PlayIcon aria-hidden />\n )}\n </Button>\n ) : null}\n {entry.audio && transcribeAgain ? (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label={t(\"desktopDictation.settings.transcribeAgain\")}\n title={t(\"desktopDictation.settings.transcribeAgain\")}\n onClick={() => transcribeAgain(entry.id)}\n >\n <RotateCcwIcon aria-hidden />\n </Button>\n ) : null}\n {entry.text ? (\n <CopyText text={entry.text} label={t(\"desktopDictation.settings.copyText\")} />\n ) : null}\n </div>\n }\n />\n ))}\n </Section>\n ) : null}\n </>\n );\n}\n\n/** Copies a dictation's text again; a check shows it worked. */\nfunction CopyText({ text, label }: { text: string; label: string }) {\n const [copied, setCopied] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(\n () => () => {\n if (timer.current) clearTimeout(timer.current);\n },\n [],\n );\n return (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label={label}\n title={label}\n onClick={() => {\n void copyTextToClipboard(text).then((ok) => {\n if (!ok) return;\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), 1_600);\n });\n }}\n >\n {copied ? (\n <CheckIcon className=\"text-status-success\" aria-hidden />\n ) : (\n <CopyIcon aria-hidden />\n )}\n </Button>\n );\n}\n\n/** The retry or cancel shortcut: none, or a key combination the person presses. */\nfunction ActionShortcutRow({\n action,\n keys,\n platform,\n saving,\n recording,\n error,\n onRecord,\n onClear,\n}: {\n action: DesktopDictationAction;\n keys: DesktopDictationKeys | null;\n platform: DesktopPlatform;\n saving: boolean;\n recording: boolean;\n error: string | null;\n onRecord: (recording: boolean) => void;\n onClear: () => void;\n}) {\n const t = useOpenGeniText();\n const label = t(\n action === \"retry\"\n ? \"desktopDictation.settings.retryShortcutLabel\"\n : \"desktopDictation.settings.cancelShortcutLabel\",\n );\n const options: SelectOption[] = [\n { value: NONE, label: t(\"desktopDictation.settings.noShortcut\") },\n ...(keys ? [{ value: KEYS, label: desktopShortcutLabel(keys, platform) }] : []),\n {\n value: CUSTOM,\n label: t(\n keys\n ? \"desktopDictation.settings.otherKeyCombination\"\n : \"desktopDictation.settings.keyCombination\",\n ),\n description: t(\"desktopDictation.settings.keyCombinationDescription\"),\n },\n ];\n return (\n <SettingRow\n label={label}\n description={\n recording\n ? t(\"desktopDictation.settings.recordKeys\")\n : t(\n action === \"retry\"\n ? \"desktopDictation.settings.retryShortcutDescription\"\n : \"desktopDictation.settings.cancelShortcutDescription\",\n )\n }\n error={error}\n controlWidth=\"select\"\n control={\n recording ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => onRecord(false)}>\n {t(\"desktopDictation.settings.cancelRecording\")}\n </Button>\n ) : (\n <SelectMenu\n size=\"sm\"\n className=\"w-56\"\n align=\"end\"\n disabled={saving}\n aria-label={label}\n options={options}\n value={keys ? KEYS : NONE}\n onValueChange={(value) => {\n if (value === CUSTOM) onRecord(true);\n else if (value === NONE) onClear();\n }}\n />\n )\n }\n />\n );\n}\n\n/** Plays one kept dictation's speech at a time. */\nfunction usePlayback(dictation: DesktopDictation | null): {\n playing: string | null;\n toggle: (id: string) => void;\n} {\n const [playing, setPlaying] = useState<string | null>(null);\n const current = useRef<{ id: string; context: AudioContext } | null>(null);\n const stop = useCallback(() => {\n const now = current.current;\n current.current = null;\n setPlaying(null);\n void now?.context.close().catch(() => undefined);\n }, []);\n useEffect(() => stop, [stop]);\n const toggle = useCallback(\n (id: string) => {\n const wasPlaying = current.current?.id === id;\n stop();\n if (wasPlaying || !dictation?.historyAudio) return;\n const Context =\n (globalThis as { AudioContext?: typeof AudioContext }).AudioContext ??\n (globalThis as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!Context) return;\n const context = new Context();\n const mine = { id, context };\n current.current = mine;\n setPlaying(id);\n void (async () => {\n try {\n const audio = await dictation.historyAudio!(id);\n if (!audio || current.current !== mine) throw new Error(\"gone\");\n // A copy: decoding takes the buffer over.\n const buffer = await context.decodeAudioData(audio.bytes.slice().buffer as ArrayBuffer);\n if (current.current !== mine) return;\n const source = context.createBufferSource();\n source.buffer = buffer;\n source.connect(context.destination);\n source.onended = () => {\n if (current.current === mine) stop();\n };\n source.start();\n } catch {\n if (current.current === mine) stop();\n }\n })();\n },\n [dictation, stop],\n );\n return { playing, toggle };\n}\n\nfunction ProfileRows({\n profile,\n profiles,\n status,\n single,\n saving,\n recording,\n error,\n languageOptions,\n modelOptions,\n onRecord,\n onShortcut,\n onLanguage,\n onModel,\n onRemove,\n}: {\n profile: DesktopDictationProfile;\n profiles: DesktopDictationProfile[];\n status: DesktopDictationStatus;\n single: boolean;\n saving: boolean;\n recording: boolean;\n error: string | null;\n languageOptions: SelectOption[];\n /** Null when there is no model to pick. */\n modelOptions: SelectOption[] | null;\n onRecord: (recording: boolean) => void;\n onShortcut: (shortcut: DesktopDictationShortcut) => void;\n onLanguage: (value: string) => void;\n onModel: (value: string) => void;\n onRemove: () => void;\n}) {\n const t = useOpenGeniText();\n const { shortcut } = profile;\n const options = shortcutOptions(profile, profiles, status, t);\n const hold = status.settings.mode === \"hold\";\n const description = recording\n ? t(\"desktopDictation.settings.recordKeys\")\n : shortcut.kind === \"modifierChord\"\n ? t(hold ? \"desktopDictation.settings.chordHold\" : \"desktopDictation.settings.chordToggle\")\n : shortcut.kind === \"modifierPair\"\n ? t(hold ? \"desktopDictation.settings.pairHold\" : \"desktopDictation.settings.pairToggle\")\n : t(\"desktopDictation.settings.acceleratorToggle\");\n return (\n <>\n <SettingRow\n label={single ? t(\"desktopDictation.settings.shortcutLabel\") : profile.name}\n description={description}\n error={error}\n controlWidth=\"select\"\n control={\n recording ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => onRecord(false)}>\n {t(\"desktopDictation.settings.cancelRecording\")}\n </Button>\n ) : (\n <div className=\"flex w-full items-center gap-1\">\n <SelectMenu\n size=\"sm\"\n className=\"min-w-0 flex-1\"\n align=\"end\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.shortcutLabel\")}\n options={options}\n value={shortcutValue(shortcut)}\n onValueChange={(value) => {\n if (value === CUSTOM) {\n onRecord(true);\n return;\n }\n const next = shortcutFromValue(value);\n if (next) onShortcut(next);\n }}\n />\n {single ? null : (\n <Button\n size=\"icon-sm\"\n variant=\"ghost\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.remove\")}\n title={t(\"desktopDictation.settings.remove\")}\n onClick={onRemove}\n >\n <Trash2Icon aria-hidden />\n </Button>\n )}\n </div>\n )\n }\n />\n <SettingRow\n label={t(\"desktopDictation.settings.languageLabel\")}\n description={t(\"desktopDictation.settings.languageDescription\")}\n controlWidth=\"select\"\n control={\n <SelectMenu\n size=\"sm\"\n className=\"w-56\"\n align=\"end\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.languageLabel\")}\n options={languageOptions}\n value={profile.language ?? DETECT}\n onValueChange={onLanguage}\n />\n }\n />\n {modelOptions ? (\n <SettingRow\n label={t(\"desktopDictation.settings.modelLabel\")}\n description={t(\"desktopDictation.settings.modelDescription\")}\n controlWidth=\"select\"\n control={\n <SelectMenu\n size=\"sm\"\n className=\"w-56\"\n align=\"end\"\n disabled={saving}\n aria-label={t(\"desktopDictation.settings.modelLabel\")}\n options={modelOptions}\n value={profile.model ? modelValue(profile.model) : WORKSPACE_MODEL}\n onValueChange={onModel}\n />\n }\n />\n ) : null}\n </>\n );\n}\n\nconst NO_MODELS: readonly DictationModelChoice[] = [];\n\nfunction modelValue(model: DesktopDictationModel): string {\n return `${model.providerId}::${model.model}`;\n}\n\nfunction sameModel(a: DesktopDictationModel, b: DesktopDictationModel): boolean {\n return a.providerId === b.providerId && a.model === b.model;\n}\n\n/** The shortcuts a profile can pick: modifier keys first where they work, then any combination. */\nfunction shortcutOptions(\n profile: DesktopDictationProfile,\n profiles: DesktopDictationProfile[],\n status: DesktopDictationStatus,\n t: OpenGeniText,\n): SelectOption[] {\n const { platform } = status;\n const candidates: DesktopDictationShortcut[] = [];\n if (status.modifierChords) {\n for (const modifiers of CHORDS) candidates.push({ kind: \"modifierChord\", modifiers });\n }\n for (const modifier of status.modifierPairs) candidates.push({ kind: \"modifierPair\", modifier });\n const own = profile.shortcut;\n if (own.kind !== \"accelerator\" && !candidates.some((item) => sameDesktopShortcut(item, own))) {\n candidates.unshift(own);\n }\n const options: SelectOption[] = candidates.map((candidate) => {\n const taken = usedByAnother({ ...status.settings, profiles }, profile.id, candidate);\n return {\n value: shortcutValue(candidate),\n label: desktopShortcutLabel(candidate, platform),\n disabled: taken,\n ...(taken ? { disabledReason: t(\"desktopDictation.settings.usedByAnother\") } : {}),\n };\n });\n options.push({\n value: CUSTOM,\n label:\n own.kind === \"accelerator\"\n ? desktopShortcutLabel(own, platform)\n : t(\"desktopDictation.settings.keyCombination\"),\n description: t(\"desktopDictation.settings.keyCombinationDescription\"),\n });\n return options;\n}\n\nfunction shortcutValue(shortcut: DesktopDictationShortcut): string {\n if (shortcut.kind === \"modifierPair\") return `pair:${shortcut.modifier}`;\n if (shortcut.kind === \"modifierChord\") {\n return `chord:${CHORD_ORDER.filter((modifier) => shortcut.modifiers.includes(modifier)).join(\"+\")}`;\n }\n return CUSTOM;\n}\n\nfunction shortcutFromValue(value: string): DesktopDictationShortcut | null {\n if (value.startsWith(\"pair:\")) {\n const modifier = value.slice(\"pair:\".length);\n return modifier === \"fn\" || !CHORD_ORDER.includes(modifier as DesktopDictationModifier)\n ? null\n : { kind: \"modifierPair\", modifier: modifier as Exclude<DesktopDictationModifier, \"fn\"> };\n }\n if (value.startsWith(\"chord:\")) {\n const modifiers = value\n .slice(\"chord:\".length)\n .split(\"+\")\n .filter((part): part is DesktopDictationModifier =>\n CHORD_ORDER.includes(part as DesktopDictationModifier),\n );\n return modifiers.length >= 2 ? { kind: \"modifierChord\", modifiers } : null;\n }\n return null;\n}\n\n/** Another shortcut (a dictation's, or retry or cancel) uses these keys. */\nfunction usedByAnother(\n settings: DesktopDictationSettings,\n ownerId: string,\n shortcut: DesktopDictationShortcut,\n): boolean {\n if (\n settings.profiles.some(\n (profile) => profile.id !== ownerId && sameDesktopShortcut(profile.shortcut, shortcut),\n )\n ) {\n return true;\n }\n return ([\"retry\", \"cancel\"] as const).some((action) => {\n const keys = settings[actionKey(action)];\n return `${ACTION_PREFIX}${action}` !== ownerId && keys\n ? sameDesktopShortcut(keys, shortcut)\n : false;\n });\n}\n\nfunction actionKey(action: DesktopDictationAction): \"retryShortcut\" | \"cancelShortcut\" {\n return action === \"retry\" ? \"retryShortcut\" : \"cancelShortcut\";\n}\n\n/** A shortcut no profile uses yet, for a new one. */\nfunction freeShortcut(\n profiles: DesktopDictationProfile[],\n status: DesktopDictationStatus,\n): DesktopDictationShortcut | null {\n const candidates: DesktopDictationShortcut[] = status.modifierChords\n ? CHORDS.map((modifiers) => ({ kind: \"modifierChord\", modifiers }))\n : [];\n for (const accelerator of ACCELERATORS) candidates.push({ kind: \"accelerator\", accelerator });\n return (\n candidates.find(\n (candidate) => !usedByAnother({ ...status.settings, profiles }, \"\", candidate),\n ) ?? null\n );\n}\n\nfunction newProfileId(profiles: DesktopDictationProfile[]): string {\n for (let index = profiles.length + 1; ; index += 1) {\n const id = `shortcut-${index}`;\n if (!profiles.some((profile) => profile.id === id)) return id;\n }\n}\n\n/** What a shortcut is called: its language, or \"Any language\" when it detects one. */\nexport function profileName(language: string | null, t: OpenGeniText): string {\n return language ? languageName(language, t.locale) : t(\"desktopDictation.settings.anyLanguage\");\n}\n\nfunction shortcutProblemMessage(\n problem: DesktopDictationShortcutProblem | undefined,\n t: OpenGeniText,\n): string | null {\n switch (problem) {\n case \"taken\":\n return t(\"desktopDictation.settings.shortcutTaken\");\n case \"unsupported\":\n return t(\"desktopDictation.settings.shortcutUnsupported\");\n case \"stopped\":\n return t(\"desktopDictation.settings.shortcutStopped\");\n case \"failed\":\n return t(\"desktopDictation.settings.shortcutFailed\");\n default:\n return null;\n }\n}\n\n/** Why the text is copied instead of typed, and what would change that. */\nfunction pasteBlockedMessage(\n blocker: DesktopDictationPasteBlocker | null,\n t: OpenGeniText,\n): string {\n switch (blocker) {\n case \"accessibility\":\n return t(\"desktopDictation.settings.pasteAccessibility\");\n case \"xdotool\":\n return t(\"desktopDictation.settings.pasteXdotool\");\n case \"wtype\":\n return t(\"desktopDictation.settings.pasteWtype\");\n default:\n return t(\"desktopDictation.settings.pasteUnsupported\");\n }\n}\n","// How the desktop app's global shortcuts are named and recorded, shared by\n// the dictation and app-shot settings.\nimport type {\n DesktopDictationModifier,\n DesktopDictationShortcut,\n DesktopPlatform,\n} from \"@opengeni/sdk/desktop-bridge\";\n\nconst MODIFIER_NAMES: Record<DesktopDictationModifier, { mac: string; other: string }> = {\n command: { mac: \"⌘ Command\", other: \"Windows\" },\n option: { mac: \"⌥ Option\", other: \"Alt\" },\n control: { mac: \"⌃ Control\", other: \"Ctrl\" },\n shift: { mac: \"⇧ Shift\", other: \"Shift\" },\n fn: { mac: \"Fn\", other: \"Fn\" },\n};\n\nconst MAC_KEYS: Record<string, string> = {\n Command: \"⌘\",\n Cmd: \"⌘\",\n CommandOrControl: \"⌘\",\n CmdOrCtrl: \"⌘\",\n Control: \"⌃\",\n Ctrl: \"⌃\",\n Option: \"⌥\",\n Alt: \"⌥\",\n Shift: \"⇧\",\n};\n\n/** \"⌥ Option\" on a Mac, \"Alt\" elsewhere. */\nexport function modifierName(\n modifier: DesktopDictationModifier,\n platform: DesktopPlatform,\n): string {\n const name = MODIFIER_NAMES[modifier];\n return platform === \"macos\" ? name.mac : name.other;\n}\n\n/**\n * A shortcut as people read it: \"⌘⇧2\" or \"Ctrl+Shift+2\" for a key\n * combination, \"Both ⌥ Option keys\" for a pair, \"⌃ Control + Fn\" for\n * modifier keys held together.\n */\nexport function desktopShortcutLabel(\n shortcut: DesktopDictationShortcut,\n platform: DesktopPlatform,\n): string {\n if (shortcut.kind === \"modifierPair\") {\n return `Both ${modifierName(shortcut.modifier, platform)} keys`;\n }\n if (shortcut.kind === \"modifierChord\") {\n return shortcut.modifiers.map((modifier) => modifierName(modifier, platform)).join(\" + \");\n }\n const parts = shortcut.accelerator.split(\"+\");\n if (platform === \"macos\") return parts.map((part) => MAC_KEYS[part] ?? part).join(\"\");\n return parts\n .map((part) =>\n part === \"CommandOrControl\" || part === \"CmdOrCtrl\" || part === \"Control\" ? \"Ctrl\" : part,\n )\n .join(\"+\");\n}\n\n/**\n * The key combination a keydown makes, in Electron's accelerator syntax, or\n * null while only modifiers are held or none is (a shortcut needs one).\n */\nexport function acceleratorFromKey(\n event: Pick<KeyboardEvent, \"code\" | \"metaKey\" | \"ctrlKey\" | \"altKey\" | \"shiftKey\">,\n platform: DesktopPlatform,\n): string | null {\n const key = acceleratorKey(event.code);\n if (!key) return null;\n const modifiers: string[] = [];\n if (event.metaKey) modifiers.push(platform === \"macos\" ? \"Command\" : \"Super\");\n if (event.ctrlKey) modifiers.push(\"Control\");\n if (event.altKey) modifiers.push(\"Alt\");\n if (event.shiftKey) modifiers.push(\"Shift\");\n // Shift alone would take an ordinary character from every app.\n if (modifiers.length === 0 || (modifiers.length === 1 && event.shiftKey)) return null;\n return [...modifiers, key].join(\"+\");\n}\n\nconst NAMED_KEYS: Record<string, string> = {\n Space: \"Space\",\n Enter: \"Enter\",\n Tab: \"Tab\",\n Backspace: \"Backspace\",\n Delete: \"Delete\",\n Insert: \"Insert\",\n Home: \"Home\",\n End: \"End\",\n PageUp: \"PageUp\",\n PageDown: \"PageDown\",\n ArrowUp: \"Up\",\n ArrowDown: \"Down\",\n ArrowLeft: \"Left\",\n ArrowRight: \"Right\",\n Minus: \"-\",\n Equal: \"=\",\n BracketLeft: \"[\",\n BracketRight: \"]\",\n Semicolon: \";\",\n Quote: \"'\",\n Comma: \",\",\n Period: \".\",\n Slash: \"/\",\n Backslash: \"\\\\\",\n Backquote: \"`\",\n};\n\nfunction acceleratorKey(code: string): string | null {\n const letter = /^Key([A-Z])$/u.exec(code);\n if (letter) return letter[1]!;\n const digit = /^Digit([0-9])$/u.exec(code);\n if (digit) return digit[1]!;\n if (/^F([1-9]|1[0-9]|2[0-4])$/u.test(code)) return code;\n return NAMED_KEYS[code] ?? null;\n}\n\n/** The same physical keys, so two shortcuts never fight over one press. */\nexport function sameDesktopShortcut(\n a: DesktopDictationShortcut,\n b: DesktopDictationShortcut,\n): boolean {\n if (a.kind === \"accelerator\" && b.kind === \"accelerator\") {\n return a.accelerator.toLowerCase() === b.accelerator.toLowerCase();\n }\n if (a.kind === \"modifierPair\" && b.kind === \"modifierPair\") return a.modifier === b.modifier;\n if (a.kind === \"modifierChord\" && b.kind === \"modifierChord\") {\n return [...a.modifiers].sort().join(\"+\") === [...b.modifiers].sort().join(\"+\");\n }\n return false;\n}\n"],"mappings":"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","names":["getDesktopDictation","useCallback","useEffect","useMemo","useRef","useState","useMemo","getDesktopDictation","useState","useCallback","useEffect","profiles","useRef"]}
|
package/dist/desktop.js
CHANGED
|
@@ -5,14 +5,14 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
DesktopViewer,
|
|
7
7
|
useDesktopStream
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-Z4FMAFNH.js";
|
|
9
9
|
import "./chunk-ZUWF4NF7.js";
|
|
10
10
|
import "./chunk-TNEZNMSN.js";
|
|
11
11
|
import {
|
|
12
12
|
registerDesktopViewer
|
|
13
13
|
} from "./chunk-5I4VRWBB.js";
|
|
14
14
|
import "./chunk-TXS65BB2.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-7T2ZE3VT.js";
|
|
16
16
|
export {
|
|
17
17
|
DesktopViewer,
|
|
18
18
|
enableDesktopViewer,
|
package/dist/editor.js
CHANGED
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
CodeEditor,
|
|
7
7
|
languageForPath
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-KLEUWIMZ.js";
|
|
9
9
|
import {
|
|
10
10
|
registerCodeEditor
|
|
11
11
|
} from "./chunk-5I4VRWBB.js";
|
|
12
12
|
import "./chunk-TXS65BB2.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-7T2ZE3VT.js";
|
|
14
14
|
export {
|
|
15
15
|
CodeEditor,
|
|
16
16
|
enableCodeEditor,
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
NewSessionRealtimeControl
|
|
4
|
+
} from "./chunk-NRTE7DNV.js";
|
|
5
|
+
import "./chunk-6F34IWSA.js";
|
|
6
|
+
import "./chunk-XLH7QY2R.js";
|
|
7
|
+
import "./chunk-PNNTR6KP.js";
|
|
8
|
+
import "./chunk-WJPMYXKZ.js";
|
|
9
|
+
import "./chunk-VYT4POBH.js";
|
|
10
|
+
import "./chunk-EDYVC3U3.js";
|
|
11
|
+
import "./chunk-N7S72EXK.js";
|
|
12
|
+
import "./chunk-UD6AAZSC.js";
|
|
13
|
+
import "./chunk-XEA5BCMA.js";
|
|
14
|
+
import "./chunk-I7ITSXSJ.js";
|
|
15
|
+
import "./chunk-TVQCDDSZ.js";
|
|
16
|
+
import "./chunk-AMHRWKKH.js";
|
|
17
|
+
import "./chunk-ZHC47M2B.js";
|
|
18
|
+
import "./chunk-MBSN5HHQ.js";
|
|
19
|
+
import "./chunk-TXS65BB2.js";
|
|
20
|
+
import "./chunk-7T2ZE3VT.js";
|
|
21
|
+
export {
|
|
22
|
+
NewSessionRealtimeControl as default
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=embedded-new-voice-2G3VLPVQ.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
SessionRealtimeControl
|
|
4
|
+
} from "./chunk-NRTE7DNV.js";
|
|
5
|
+
import "./chunk-6F34IWSA.js";
|
|
6
|
+
import "./chunk-XLH7QY2R.js";
|
|
7
|
+
import "./chunk-PNNTR6KP.js";
|
|
8
|
+
import "./chunk-WJPMYXKZ.js";
|
|
9
|
+
import "./chunk-VYT4POBH.js";
|
|
10
|
+
import "./chunk-EDYVC3U3.js";
|
|
11
|
+
import "./chunk-N7S72EXK.js";
|
|
12
|
+
import "./chunk-UD6AAZSC.js";
|
|
13
|
+
import "./chunk-XEA5BCMA.js";
|
|
14
|
+
import "./chunk-I7ITSXSJ.js";
|
|
15
|
+
import "./chunk-TVQCDDSZ.js";
|
|
16
|
+
import "./chunk-AMHRWKKH.js";
|
|
17
|
+
import "./chunk-ZHC47M2B.js";
|
|
18
|
+
import "./chunk-MBSN5HHQ.js";
|
|
19
|
+
import "./chunk-TXS65BB2.js";
|
|
20
|
+
import "./chunk-7T2ZE3VT.js";
|
|
21
|
+
export {
|
|
22
|
+
SessionRealtimeControl as default
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=embedded-voice-T5IWOWGD.js.map
|