@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.
Files changed (1154) hide show
  1. package/dist/app/app-state.d.ts +4 -0
  2. package/dist/app/app-state.js +19 -14
  3. package/dist/app/components/Composer.js +25 -23
  4. package/dist/app/components/agent/agent-capability-picker.js +10 -8
  5. package/dist/app/components/artifacts/artifact-browse-controls.js +4 -4
  6. package/dist/app/components/artifacts/artifact-library.js +21 -19
  7. package/dist/app/components/artifacts/artifact-page-chrome.js +3 -3
  8. package/dist/app/components/artifacts/artifact-viewer.js +23 -22
  9. package/dist/app/components/artifacts/artifact-viewer.js.map +1 -1
  10. package/dist/app/components/artifacts/chat-interactive-block.js +12 -12
  11. package/dist/app/components/artifacts/copy-artifact-link.js +7 -5
  12. package/dist/app/components/artifacts/file-reach-dialog.js +11 -9
  13. package/dist/app/components/artifacts/inline-chat-image.js +18 -18
  14. package/dist/app/components/artifacts/retained-file-preview.js +24 -23
  15. package/dist/app/components/artifacts/retained-text-preview.js +3 -3
  16. package/dist/app/components/artifacts/site-audience.js +6 -5
  17. package/dist/app/components/artifacts/site-conversations.js +16 -14
  18. package/dist/app/components/artifacts/site-data.js +18 -16
  19. package/dist/app/components/artifacts/site-public-link.js +3 -2
  20. package/dist/app/components/artifacts/site-publishing-page.js +39 -37
  21. package/dist/app/components/artifacts/site-publishing.js +34 -32
  22. package/dist/app/components/artifacts/site-settings.js +38 -36
  23. package/dist/app/components/artifacts/site-version-menu.js +8 -7
  24. package/dist/app/components/billing-class-mark.js +3 -3
  25. package/dist/app/components/bots/bot-launch-strip.js +17 -17
  26. package/dist/app/components/bots/bot-template-dialog.js +30 -28
  27. package/dist/app/components/bots/bot-template-shortcuts.js +19 -19
  28. package/dist/app/components/bots/bot-templates-page.js +38 -36
  29. package/dist/app/components/bots/bot-templates-page.js.map +1 -1
  30. package/dist/app/components/capabilities/capability-detail-sheet.js +13 -11
  31. package/dist/app/components/capabilities/capability-logo-source.js +13 -13
  32. package/dist/app/components/capabilities/capability-logo.js +4 -3
  33. package/dist/app/components/capabilities/connector-tool-permissions.js +8 -6
  34. package/dist/app/components/capabilities/native-connect-setup.js +14 -14
  35. package/dist/app/components/capabilities/own-logins-shared-heads-up.js +7 -6
  36. package/dist/app/components/capabilities/perform-capability-action.js +7 -6
  37. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +17 -17
  38. package/dist/app/components/capabilities/session-capability-card.js +72 -70
  39. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  40. package/dist/app/components/capabilities/session-chrome-card.js +28 -26
  41. package/dist/app/components/capabilities/session-connection-accounts.js +4 -3
  42. package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -19
  43. package/dist/app/components/capabilities/session-github-card.js +22 -20
  44. package/dist/app/components/capabilities/session-machine-card.js +27 -25
  45. package/dist/app/components/capabilities/session-personal-github-card.js +16 -16
  46. package/dist/app/components/capabilities/session-plugin-card.js +10 -9
  47. package/dist/app/components/capabilities/use-capabilities-catalog.js +4 -3
  48. package/dist/app/components/capabilities/use-connection-accounts.js +5 -4
  49. package/dist/app/components/command-menu/chat-status.js +15 -13
  50. package/dist/app/components/command-menu/chat-switcher.js +35 -33
  51. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  52. package/dist/app/components/command-menu/command-menu.js +53 -50
  53. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  54. package/dist/app/components/command-menu/shortcut-sheet.js +18 -16
  55. package/dist/app/components/command-menu/shortcut-sheet.js.map +1 -1
  56. package/dist/app/components/common.js +4 -3
  57. package/dist/app/components/composer-capabilities-menu-body.js +4 -4
  58. package/dist/app/components/composer-mobile-plus-panel.js +8 -8
  59. package/dist/app/components/composer-mobile-plus.js +1 -1
  60. package/dist/app/components/credit-required-gate.js +3 -3
  61. package/dist/app/components/credit-required-prompt.js +10 -8
  62. package/dist/app/components/credit-required-prompt.js.map +1 -1
  63. package/dist/app/components/credits/checkout-credits-celebration.js +3 -2
  64. package/dist/app/components/credits/checkout-return.js +3 -2
  65. package/dist/app/components/credits/checkout-return.js.map +1 -1
  66. package/dist/app/components/credits/coupon-redeem.js +5 -4
  67. package/dist/app/components/credits/credit-refusal-notice.js +7 -5
  68. package/dist/app/components/cross-slot-deep-link-recovery.js +5 -4
  69. package/dist/app/components/desktop/app-shots.js +13 -11
  70. package/dist/app/components/desktop/computer-use.js +6 -4
  71. package/dist/app/components/desktop/this-computer.js +9 -7
  72. package/dist/app/components/feedback.js +5 -4
  73. package/dist/app/components/follow-up-repository-menu-body.js +8 -6
  74. package/dist/app/components/follow-up-repository-menu-body.js.map +1 -1
  75. package/dist/app/components/follow-up-repository-picker.js +1 -1
  76. package/dist/app/components/github-app-connect-launcher.js +5 -4
  77. package/dist/app/components/in-app-help-link.js +3 -3
  78. package/dist/app/components/knowledge/agent-learning-settings.js +3 -2
  79. package/dist/app/components/knowledge/agent-learning-settings.js.map +1 -1
  80. package/dist/app/components/machines/connect-machine-dialog.js +18 -16
  81. package/dist/app/components/manual-repository-editor.js +3 -2
  82. package/dist/app/components/markdown.js +6 -6
  83. package/dist/app/components/models/models-ui.js +12 -10
  84. package/dist/app/components/my-things.js +12 -10
  85. package/dist/app/components/my-things.js.map +1 -1
  86. package/dist/app/components/new-session-starters.js +3 -3
  87. package/dist/app/components/own-where-it-works.js +9 -7
  88. package/dist/app/components/personal-resource-attachment-surface.js +4 -4
  89. package/dist/app/components/pickers.js +5 -5
  90. package/dist/app/components/rail/channel-create-dialog.js +7 -5
  91. package/dist/app/components/rail/project-glyph.js +17 -17
  92. package/dist/app/components/rail/project-profile.js +31 -29
  93. package/dist/app/components/rail/rail-context.js +3 -3
  94. package/dist/app/components/rail/rail-sections.js +68 -66
  95. package/dist/app/components/rail/session-header.js +59 -57
  96. package/dist/app/components/rail/session-list.js +66 -64
  97. package/dist/app/components/rail/session-row-content.js +4 -4
  98. package/dist/app/components/rail/session-row-hover-details.js +14 -12
  99. package/dist/app/components/rail/session-shell.js +90 -88
  100. package/dist/app/components/rail/site-session-group-heading.js +8 -8
  101. package/dist/app/components/repository-picker.js +8 -6
  102. package/dist/app/components/secrets/session-secrets-panel.js +4 -3
  103. package/dist/app/components/secrets/vault-model.js +3 -2
  104. package/dist/app/components/session/agent-configuration-panel.js +25 -23
  105. package/dist/app/components/session/agent-configuration-panel.js.map +1 -1
  106. package/dist/app/components/session/artifact-link-boundary.js +3 -3
  107. package/dist/app/components/session/artifact-session-page.js +11 -9
  108. package/dist/app/components/session/banners.js +8 -8
  109. package/dist/app/components/session/codex-usage-notice.js +5 -3
  110. package/dist/app/components/session/console-new-conversation.js +42 -40
  111. package/dist/app/components/session/context-text-reader.js +3 -2
  112. package/dist/app/components/session/descendant-requests.js +39 -37
  113. package/dist/app/components/session/descendant-requests.js.map +1 -1
  114. package/dist/app/components/session/editable-artifacts-workspace.js +36 -34
  115. package/dist/app/components/session/editable-artifacts-workspace.js.map +1 -1
  116. package/dist/app/components/session/failed-session-banner.js +13 -11
  117. package/dist/app/components/session/failed-session-banner.js.map +1 -1
  118. package/dist/app/components/session/failure-recovery-boundary.js +3 -3
  119. package/dist/app/components/session/human-input-delegation-record.js +2 -2
  120. package/dist/app/components/session/human-input.js +33 -31
  121. package/dist/app/components/session/inspector.js +57 -55
  122. package/dist/app/components/session/inspector.js.map +1 -1
  123. package/dist/app/components/session/message-actions.js +5 -4
  124. package/dist/app/components/session/message-actions.js.map +1 -1
  125. package/dist/app/components/session/message-resource-attachments.js +12 -11
  126. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  127. package/dist/app/components/session/model-context-inspector.js +6 -4
  128. package/dist/app/components/session/model-recovery-notice.js +3 -3
  129. package/dist/app/components/session/new-session-settings-menu.js +11 -9
  130. package/dist/app/components/session/new-session-setup-strip.js +18 -18
  131. package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
  132. package/dist/app/components/session/sandbox-switcher.js +10 -9
  133. package/dist/app/components/session/sandbox-workspace.js +47 -46
  134. package/dist/app/components/session/search-markdown-highlight.js +7 -7
  135. package/dist/app/components/session/search-results-view.js +8 -8
  136. package/dist/app/components/session/session-admin-access.js +13 -11
  137. package/dist/app/components/session/session-admission-notice.js +7 -5
  138. package/dist/app/components/session/session-avatar-picker.js +22 -20
  139. package/dist/app/components/session/session-avatar.js +16 -16
  140. package/dist/app/components/session/session-machine-access-notice.js +7 -5
  141. package/dist/app/components/session/session-profile-dialog.js +29 -27
  142. package/dist/app/components/session/session-profile-editor.js +30 -28
  143. package/dist/app/components/session/session-retention.js +10 -8
  144. package/dist/app/components/session/session-search-dialog.js +10 -10
  145. package/dist/app/components/session/session-skill-reviews.js +2 -1
  146. package/dist/app/components/session/session-skill-reviews.js.map +1 -1
  147. package/dist/app/components/session/session-tenancy-control.js +13 -11
  148. package/dist/app/components/session/session-tenancy-control.js.map +1 -1
  149. package/dist/app/components/session/session-unattended-setting.js +7 -5
  150. package/dist/app/components/session/session-usage-limit-section.js +11 -9
  151. package/dist/app/components/session/share-chat-dialog.js +9 -7
  152. package/dist/app/components/session/site-origin-link.js +3 -3
  153. package/dist/app/components/session/subagents.js +8 -8
  154. package/dist/app/components/session/subscription-account-indicator.js +6 -6
  155. package/dist/app/components/session-connectors-menu-body.js +4 -3
  156. package/dist/app/components/session-connectors-menu-body.js.map +1 -1
  157. package/dist/app/components/settings/row-select.js +7 -5
  158. package/dist/app/components/toaster.js +3 -2
  159. package/dist/app/components/transcription-settings.js +11 -9
  160. package/dist/app/components/ui/destructive-confirm.js +11 -9
  161. package/dist/app/components/usage/usage-entry.js +5 -5
  162. package/dist/app/components/window-bar.js +16 -14
  163. package/dist/app/components/workspace-composer-plus.js +22 -21
  164. package/dist/app/components/workspace-reach.js +6 -4
  165. package/dist/app/components/workspace-tenant-boundary.js +5 -4
  166. package/dist/app/embed/memory-navigation.js +3 -3
  167. package/dist/app/embed/session-app.js +211 -209
  168. package/dist/app/lib/actions/actions-provider.js +15 -13
  169. package/dist/app/lib/agent-capabilities.js +3 -3
  170. package/dist/app/lib/app-surfaces.js +7 -6
  171. package/dist/app/lib/archive-session.d.ts +9 -4
  172. package/dist/app/lib/archive-session.js +4 -2
  173. package/dist/app/lib/bot-templates.js +3 -2
  174. package/dist/app/lib/capabilities.js +3 -2
  175. package/dist/app/lib/codex-usage-query.js +2 -2
  176. package/dist/app/lib/composer-connectors.js +17 -16
  177. package/dist/app/lib/console-site.js +2 -2
  178. package/dist/app/lib/console-text.js +2 -2
  179. package/dist/app/lib/events.js +9 -9
  180. package/dist/app/lib/failed-session-copy.js +3 -3
  181. package/dist/app/lib/inbox.js +4 -2
  182. package/dist/app/lib/model-access-onboarding.js +3 -3
  183. package/dist/app/lib/move-chat-to-machine.js +3 -3
  184. package/dist/app/lib/navigation.js +2 -2
  185. package/dist/app/lib/session-branch-cache.js +6 -6
  186. package/dist/app/lib/session-create.js +4 -4
  187. package/dist/app/lib/session-group-pagination.js +6 -6
  188. package/dist/app/lib/session-hover-facts.js +13 -11
  189. package/dist/app/lib/session-model.js +2 -2
  190. package/dist/app/lib/session-rail.js +3 -3
  191. package/dist/app/lib/session-rename.js +3 -3
  192. package/dist/app/lib/session-restart-operation-controller.js +4 -3
  193. package/dist/app/lib/session-tenancy.js +3 -2
  194. package/dist/app/lib/session-usage-limit.js +3 -2
  195. package/dist/app/lib/sessions-group.js +5 -5
  196. package/dist/app/lib/site-publishing.js +3 -2
  197. package/dist/app/lib/site-tool-consent-dialog.js +9 -7
  198. package/dist/app/lib/site-tool-consent-dialog.js.map +1 -1
  199. package/dist/app/lib/site-tool-consent.js +1 -1
  200. package/dist/app/lib/subscription-plans.js +3 -2
  201. package/dist/app/lib/toast.js +2 -1
  202. package/dist/app/lib/turn-failure-analytics.js +4 -4
  203. package/dist/app/lib/use-duplicate-site.js +6 -5
  204. package/dist/app/lib/use-follow-up-repositories.js +6 -5
  205. package/dist/app/lib/use-workspace-integrations.js +4 -3
  206. package/dist/app/lib/use-workspace-machines.js +4 -4
  207. package/dist/app/lib/use-workspace-model-catalog.js +5 -4
  208. package/dist/app/lib/use-workspace-rigs.js +2 -2
  209. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  210. package/dist/app/lib/workspace-scope-context.js +3 -3
  211. package/dist/app/routes/artifacts.js +67 -66
  212. package/dist/app/routes/artifacts.js.map +1 -1
  213. package/dist/app/routes/retained-artifact.js +42 -40
  214. package/dist/app/routes/retained-artifact.js.map +1 -1
  215. package/dist/app/routes/session-unavailable.js +8 -7
  216. package/dist/app/routes/session.js +119 -117
  217. package/dist/app/routes/sessions-index-hydration.js +5 -5
  218. package/dist/app/routes/sessions-index.js +104 -102
  219. package/dist/app/routes/site-view.js +67 -65
  220. package/dist/app/routes/site-view.js.map +1 -1
  221. package/dist/artifacts-document.js +4 -4
  222. package/dist/artifacts-presentation.js +4 -4
  223. package/dist/artifacts-spreadsheet.js +4 -4
  224. package/dist/artifacts.js +10 -10
  225. package/dist/automations.js +17 -15
  226. package/dist/automations.js.map +1 -1
  227. package/dist/browser-viewer-TC27OCIP.js +23 -0
  228. package/dist/chat-interactive-block-RWPQBHVS.js +18 -0
  229. package/dist/chunk-2BDT3UZQ.js +229 -0
  230. package/dist/chunk-2CLNIEK4.js +373 -0
  231. package/dist/chunk-2FSBSCZJ.js +451 -0
  232. package/dist/chunk-2I7HDP53.js +199 -0
  233. package/dist/chunk-2INLDVK3.js +15 -0
  234. package/dist/chunk-2KALVELR.js +126 -0
  235. package/dist/chunk-2M3J7ZWQ.js +418 -0
  236. package/dist/chunk-2OP6WLGV.js +708 -0
  237. package/dist/chunk-2RG7NIAS.js +2936 -0
  238. package/dist/chunk-2STUPWEL.js +135 -0
  239. package/dist/chunk-2YUOVM3G.js +271 -0
  240. package/dist/chunk-2Z3NQNTM.js +3670 -0
  241. package/dist/chunk-3CPWWGNK.js +920 -0
  242. package/dist/chunk-3ED2U6XE.js +37 -0
  243. package/dist/chunk-3GZA4BUW.js +216 -0
  244. package/dist/chunk-3IK6UYO6.js +1022 -0
  245. package/dist/chunk-3PZ7JZI2.js +431 -0
  246. package/dist/chunk-4DVJ6ONS.js +50 -0
  247. package/dist/chunk-4DVNUCRR.js +2386 -0
  248. package/dist/chunk-4DVNUCRR.js.map +1 -0
  249. package/dist/chunk-4E3ZJRTZ.js +41 -0
  250. package/dist/chunk-4SAWSRAA.js +141 -0
  251. package/dist/chunk-53AGXXZM.js +307 -0
  252. package/dist/chunk-54YW6SZZ.js +818 -0
  253. package/dist/chunk-57AZS3IE.js +2317 -0
  254. package/dist/chunk-5CPEEAFD.js +143 -0
  255. package/dist/chunk-5EWSRZ2Y.js +340 -0
  256. package/dist/chunk-5IE76VCY.js +387 -0
  257. package/dist/chunk-5NWEKLDZ.js +170 -0
  258. package/dist/chunk-5O2FCCHZ.js +198 -0
  259. package/dist/chunk-5QAY6K77.js +399 -0
  260. package/dist/chunk-5YKW2K6I.js +625 -0
  261. package/dist/chunk-5YKW2K6I.js.map +1 -0
  262. package/dist/chunk-6BCXNDEI.js +4116 -0
  263. package/dist/chunk-6BCXNDEI.js.map +1 -0
  264. package/dist/chunk-6DK6Z4UN.js +2599 -0
  265. package/dist/chunk-6DVCC7QS.js +702 -0
  266. package/dist/chunk-6JHU2UBS.js +2058 -0
  267. package/dist/chunk-6PZ7OBYU.js +490 -0
  268. package/dist/chunk-6WD2INST.js +539 -0
  269. package/dist/chunk-6WD2INST.js.map +1 -0
  270. package/dist/chunk-6WGRDRMA.js +163 -0
  271. package/dist/chunk-77WAKEAH.js +186 -0
  272. package/dist/chunk-7T2ZE3VT.js +5558 -0
  273. package/dist/chunk-7T2ZE3VT.js.map +1 -0
  274. package/dist/chunk-7TDO3CUM.js +393 -0
  275. package/dist/chunk-7TIX2UAR.js +247 -0
  276. package/dist/chunk-7V5REBCP.js +148 -0
  277. package/dist/chunk-7VMZGLYI.js +339 -0
  278. package/dist/chunk-7W37NS3I.js +236 -0
  279. package/dist/chunk-7X6SDK2C.js +111 -0
  280. package/dist/chunk-7ZNUHRP5.js +95 -0
  281. package/dist/chunk-A36PZALD.js +84 -0
  282. package/dist/chunk-AUI6VA63.js +107 -0
  283. package/dist/chunk-AW2MQB37.js +24 -0
  284. package/dist/chunk-AWKES45Y.js +198 -0
  285. package/dist/chunk-AXHZYXUV.js +132 -0
  286. package/dist/chunk-BHNSJVBC.js +129 -0
  287. package/dist/chunk-BJEJFISW.js +50 -0
  288. package/dist/chunk-BJFH6JI5.js +422 -0
  289. package/dist/chunk-BMICEQZQ.js +960 -0
  290. package/dist/chunk-BTLBYBLU.js +29 -0
  291. package/dist/chunk-BXBDYNRP.js +89 -0
  292. package/dist/chunk-C372BFOV.js +357 -0
  293. package/dist/chunk-C43KRXGA.js +234 -0
  294. package/dist/chunk-C43KRXGA.js.map +1 -0
  295. package/dist/chunk-CMKGILJK.js +4824 -0
  296. package/dist/chunk-CRAOSVHC.js +50 -0
  297. package/dist/chunk-CRU35QQH.js +281 -0
  298. package/dist/chunk-CUIWCGMA.js +172 -0
  299. package/dist/chunk-D5TWNFFE.js +38 -0
  300. package/dist/chunk-DF5EAHDN.js +4461 -0
  301. package/dist/chunk-DJAXC5OK.js +56 -0
  302. package/dist/chunk-DXBYWSL5.js +3550 -0
  303. package/dist/chunk-DXR5PDFP.js +84 -0
  304. package/dist/chunk-DZWARC4M.js +267 -0
  305. package/dist/chunk-DZXEDSQI.js +106 -0
  306. package/dist/chunk-E7XERZWC.js +48 -0
  307. package/dist/chunk-ECJBYNLJ.js +79 -0
  308. package/dist/chunk-EDI6SJ2N.js +43 -0
  309. package/dist/chunk-EWSOC6WF.js +114 -0
  310. package/dist/chunk-F2OPHAUN.js +103 -0
  311. package/dist/chunk-F4ISQGGM.js +81 -0
  312. package/dist/chunk-FO4LYKJL.js +197 -0
  313. package/dist/chunk-FPXASDG5.js +73 -0
  314. package/dist/chunk-FSOQDUCG.js +117 -0
  315. package/dist/chunk-FSOQDUCG.js.map +1 -0
  316. package/dist/chunk-FVXBNBHO.js +157 -0
  317. package/dist/chunk-FYWT2O76.js +34 -0
  318. package/dist/chunk-FYWT2O76.js.map +1 -0
  319. package/dist/chunk-FZC5N55X.js +981 -0
  320. package/dist/chunk-GAVYGBFI.js +99 -0
  321. package/dist/chunk-GFIMOUDT.js +846 -0
  322. package/dist/chunk-GFIMOUDT.js.map +1 -0
  323. package/dist/chunk-GKVJIDHF.js +33 -0
  324. package/dist/chunk-GVN5SZLX.js +212 -0
  325. package/dist/chunk-H3T7IWNA.js +134 -0
  326. package/dist/chunk-HAX4LCR5.js +261 -0
  327. package/dist/chunk-HC4JFZVU.js +121 -0
  328. package/dist/chunk-HEFPPMBQ.js +581 -0
  329. package/dist/chunk-HGKTHF2U.js +1356 -0
  330. package/dist/chunk-HGKTHF2U.js.map +1 -0
  331. package/dist/chunk-HNLR7Q4Z.js +83 -0
  332. package/dist/chunk-HSOXMJOT.js +12 -0
  333. package/dist/chunk-I4MRDSUF.js +281 -0
  334. package/dist/chunk-I4QEJ62Y.js +202 -0
  335. package/dist/chunk-I5B5L6Q4.js +56 -0
  336. package/dist/chunk-I5QZJODL.js +264 -0
  337. package/dist/chunk-I7ITSXSJ.js +603 -0
  338. package/dist/chunk-I7XIZRFD.js +390 -0
  339. package/dist/chunk-IDANQPRH.js +82 -0
  340. package/dist/chunk-IFB3WJ36.js +212 -0
  341. package/dist/chunk-IHTAKKTK.js +264 -0
  342. package/dist/chunk-IKXNLWAL.js +205 -0
  343. package/dist/chunk-IKXNLWAL.js.map +1 -0
  344. package/dist/chunk-ILDXWY37.js +173 -0
  345. package/dist/chunk-IMDQUHBJ.js +570 -0
  346. package/dist/chunk-IMZCQBOT.js +119 -0
  347. package/dist/chunk-IXPTECSC.js +403 -0
  348. package/dist/chunk-J255A3N5.js +71 -0
  349. package/dist/chunk-J5F5HPPW.js +141 -0
  350. package/dist/chunk-JDTGRRNU.js +5045 -0
  351. package/dist/chunk-JDTGRRNU.js.map +1 -0
  352. package/dist/chunk-JEA3QDX7.js +2469 -0
  353. package/dist/chunk-JEUPAVYY.js +156 -0
  354. package/dist/chunk-JKHKLL5W.js +194 -0
  355. package/dist/chunk-JQL7ZH6C.js +650 -0
  356. package/dist/chunk-JWB44UGJ.js +57 -0
  357. package/dist/chunk-JZ4NLCAP.js +333 -0
  358. package/dist/chunk-K2A5PXQ5.js +412 -0
  359. package/dist/chunk-K56XV3C3.js +623 -0
  360. package/dist/chunk-K6GAXXVA.js +23 -0
  361. package/dist/chunk-KCBMFSMS.js +199 -0
  362. package/dist/chunk-KF2FV3ZJ.js +268 -0
  363. package/dist/chunk-KJD65EJP.js +278 -0
  364. package/dist/chunk-KLEUWIMZ.js +386 -0
  365. package/dist/chunk-KODELWYT.js +309 -0
  366. package/dist/chunk-KRDR5RJD.js +83 -0
  367. package/dist/chunk-KUDGXAF7.js +914 -0
  368. package/dist/chunk-KY2R73CG.js +171 -0
  369. package/dist/chunk-KY2R73CG.js.map +1 -0
  370. package/dist/chunk-KYS77RPN.js +85 -0
  371. package/dist/chunk-L7YTNTIK.js +368 -0
  372. package/dist/chunk-LHPNABDH.js +686 -0
  373. package/dist/chunk-MFROMEKA.js +401 -0
  374. package/dist/chunk-MIHN76LX.js +2656 -0
  375. package/dist/chunk-MIYFS2XN.js +42 -0
  376. package/dist/chunk-MJUCFQMS.js +65 -0
  377. package/dist/chunk-MM4FNWI4.js +3064 -0
  378. package/dist/chunk-MNZG4OHU.js +790 -0
  379. package/dist/chunk-MVW6HNPI.js +250 -0
  380. package/dist/chunk-MVW6HNPI.js.map +1 -0
  381. package/dist/chunk-N6AACDUW.js +200 -0
  382. package/dist/chunk-NC55IFN3.js +781 -0
  383. package/dist/chunk-NC7PVOEK.js +98 -0
  384. package/dist/chunk-NCYMNCJO.js +70 -0
  385. package/dist/chunk-ND2BXV3P.js +259 -0
  386. package/dist/chunk-NDBTFUO6.js +272 -0
  387. package/dist/chunk-NDQJZ7HF.js +206 -0
  388. package/dist/chunk-NGJJJPZZ.js +162 -0
  389. package/dist/chunk-NJTSNNE7.js +251 -0
  390. package/dist/chunk-NPGISCU6.js +4159 -0
  391. package/dist/chunk-NPGISCU6.js.map +1 -0
  392. package/dist/chunk-NRTE7DNV.js +1270 -0
  393. package/dist/chunk-NULUNM7H.js +290 -0
  394. package/dist/chunk-NUNZS36W.js +227 -0
  395. package/dist/chunk-NW53H5RW.js +2424 -0
  396. package/dist/chunk-NXCMHIKI.js +263 -0
  397. package/dist/chunk-O3LKCBP5.js +159 -0
  398. package/dist/chunk-O4EA4F3W.js +103 -0
  399. package/dist/chunk-O4EA4F3W.js.map +1 -0
  400. package/dist/chunk-O4OOG3D6.js +116 -0
  401. package/dist/chunk-O4OOG3D6.js.map +1 -0
  402. package/dist/chunk-O6N4ABCA.js +376 -0
  403. package/dist/chunk-O732GAFC.js +112 -0
  404. package/dist/chunk-OF4TIKYC.js +690 -0
  405. package/dist/chunk-OMPVOMPP.js +70 -0
  406. package/dist/chunk-OPJJSKUK.js +118 -0
  407. package/dist/chunk-OPWCMA4D.js +196 -0
  408. package/dist/chunk-ORJPS5VN.js +1193 -0
  409. package/dist/chunk-OSY5K7L7.js +187 -0
  410. package/dist/chunk-OV6QJRT4.js +45 -0
  411. package/dist/chunk-OVKYVZMW.js +108 -0
  412. package/dist/chunk-OZCBM3UC.js +171 -0
  413. package/dist/chunk-P3A2EINJ.js +61 -0
  414. package/dist/chunk-PTAG4PDC.js +27 -0
  415. package/dist/chunk-PTF5B7TJ.js +298 -0
  416. package/dist/chunk-Q3DPEYX4.js +848 -0
  417. package/dist/chunk-Q6CGOPJD.js +215 -0
  418. package/dist/chunk-Q6CGOPJD.js.map +1 -0
  419. package/dist/chunk-QB2KMIDP.js +100 -0
  420. package/dist/chunk-QCSJ4CWE.js +1067 -0
  421. package/dist/chunk-QIOQ2NPQ.js +414 -0
  422. package/dist/chunk-QK5EFEUT.js +353 -0
  423. package/dist/chunk-QPQBLYQJ.js +41 -0
  424. package/dist/chunk-QPSGCC5D.js +184 -0
  425. package/dist/chunk-QZAAUQRN.js +474 -0
  426. package/dist/chunk-QZM6YDJW.js +489 -0
  427. package/dist/chunk-QZM6YDJW.js.map +1 -0
  428. package/dist/chunk-RGBI63KJ.js +188 -0
  429. package/dist/chunk-RLBKLAEY.js +138 -0
  430. package/dist/chunk-RMFKVOM7.js +304 -0
  431. package/dist/chunk-ROKQU7WG.js +258 -0
  432. package/dist/chunk-RPVREAU7.js +251 -0
  433. package/dist/chunk-RQKLF42C.js +723 -0
  434. package/dist/chunk-SC6RRD2D.js +38 -0
  435. package/dist/chunk-SC6RRD2D.js.map +1 -0
  436. package/dist/chunk-SEO7TICN.js +94 -0
  437. package/dist/chunk-SHHJCL7X.js +432 -0
  438. package/dist/chunk-SIRLACNZ.js +114 -0
  439. package/dist/chunk-SKPHMYAA.js +237 -0
  440. package/dist/chunk-SODC7T6L.js +1583 -0
  441. package/dist/chunk-SQJIKMN3.js +366 -0
  442. package/dist/chunk-SVINDKVW.js +26 -0
  443. package/dist/chunk-SYCDHPZF.js +335 -0
  444. package/dist/chunk-T2QX3FDP.js +133 -0
  445. package/dist/chunk-T3OWFVMS.js +1187 -0
  446. package/dist/chunk-T6XI5FLY.js +61 -0
  447. package/dist/chunk-T7OXJZCX.js +62 -0
  448. package/dist/chunk-TAT5USZN.js +353 -0
  449. package/dist/chunk-TPQTRNER.js +172 -0
  450. package/dist/chunk-TUIN4MB7.js +266 -0
  451. package/dist/chunk-TX3VECZU.js +71 -0
  452. package/dist/chunk-TXLIEOJX.js +9624 -0
  453. package/dist/chunk-U3DN4HEY.js +27 -0
  454. package/dist/chunk-U7XM7CB4.js +191 -0
  455. package/dist/chunk-UJK53QFL.js +140 -0
  456. package/dist/chunk-UMTXA2TH.js +319 -0
  457. package/dist/chunk-UPDSXFK5.js +199 -0
  458. package/dist/chunk-UTIAXH52.js +269 -0
  459. package/dist/chunk-UVN5TMHU.js +1184 -0
  460. package/dist/chunk-V4Z4B2E3.js +52 -0
  461. package/dist/chunk-V4Z4B2E3.js.map +1 -0
  462. package/dist/chunk-VGYXW3VG.js +246 -0
  463. package/dist/chunk-VS7AHPCZ.js +255 -0
  464. package/dist/chunk-VTTAJOQ7.js +121 -0
  465. package/dist/chunk-VWPOLUAO.js +99 -0
  466. package/dist/chunk-X3MWB2QU.js +3851 -0
  467. package/dist/chunk-X6KAJI3V.js +211 -0
  468. package/dist/chunk-XBLRHV5R.js +50 -0
  469. package/dist/chunk-XDFP2LMW.js +605 -0
  470. package/dist/chunk-XEQMZB3C.js +525 -0
  471. package/dist/chunk-XEYLT5VA.js +223 -0
  472. package/dist/chunk-XHIQ5I6N.js +918 -0
  473. package/dist/chunk-XLH7QY2R.js +378 -0
  474. package/dist/chunk-XWFAMUZQ.js +113 -0
  475. package/dist/chunk-Y4BB2KS2.js +294 -0
  476. package/dist/chunk-Y4BB2KS2.js.map +1 -0
  477. package/dist/chunk-Y4OBB2VN.js +84 -0
  478. package/dist/chunk-YCVD6CI3.js +234 -0
  479. package/dist/chunk-YENLNISG.js +270 -0
  480. package/dist/chunk-YIRVLKAX.js +351 -0
  481. package/dist/chunk-YL73CVNK.js +390 -0
  482. package/dist/chunk-YLS6QE5G.js +288 -0
  483. package/dist/chunk-YNF2OC54.js +366 -0
  484. package/dist/chunk-YNF2OC54.js.map +1 -0
  485. package/dist/chunk-YPWU5KPE.js +147 -0
  486. package/dist/chunk-YQXTDZSU.js +2984 -0
  487. package/dist/chunk-YSJEAAOL.js +178 -0
  488. package/dist/chunk-YWIFM7D7.js +499 -0
  489. package/dist/chunk-YWVI6ZMK.js +103 -0
  490. package/dist/chunk-Z4FMAFNH.js +847 -0
  491. package/dist/chunk-Z654FWNU.js +136 -0
  492. package/dist/chunk-Z7Y523PS.js +130 -0
  493. package/dist/chunk-ZD67RM6G.js +60 -0
  494. package/dist/chunk-ZEG4VPBL.js +187 -0
  495. package/dist/chunk-ZHDFQITM.js +283 -0
  496. package/dist/chunk-ZHDFQITM.js.map +1 -0
  497. package/dist/chunk-ZLYCOBHW.js +75 -0
  498. package/dist/chunk-ZNJ5MTXV.js +89 -0
  499. package/dist/chunk-ZSGY3H53.js +155 -0
  500. package/dist/chunk-ZTPXACWB.js +1788 -0
  501. package/dist/chunk-ZUA3JMI6.js +107 -0
  502. package/dist/chunk-ZYAZUPPV.js +559 -0
  503. package/dist/composer.js +8 -8
  504. package/dist/computer-viewer-TDDO25AV.js +21 -0
  505. package/dist/connect.js +12 -12
  506. package/dist/desktop-dictation.js +12 -10
  507. package/dist/desktop-dictation.js.map +1 -1
  508. package/dist/desktop.js +2 -2
  509. package/dist/editor.js +2 -2
  510. package/dist/embedded-new-voice-2G3VLPVQ.js +24 -0
  511. package/dist/embedded-voice-T5IWOWGD.js +24 -0
  512. package/dist/fleet-decision-row-WM64KXP3.js +361 -0
  513. package/dist/in-chat-connect-model.js +5 -5
  514. package/dist/index.js +51 -51
  515. package/dist/interaction.js +5 -5
  516. package/dist/machines.js +3 -3
  517. package/dist/meetings-recorder.js +1 -1
  518. package/dist/meetings.js +40 -32
  519. package/dist/meetings.js.map +1 -1
  520. package/dist/messages/en.d.ts +3 -0
  521. package/dist/messages.js +1 -1
  522. package/dist/model-policy-picker-menu-SMC6J6QN.js +22 -0
  523. package/dist/payment-page-card-G4U63KUV.js +223 -0
  524. package/dist/platform-activity-row-BUZGZAKZ.js +128 -0
  525. package/dist/queue-surface-implementation-4KUZ4PJV.js +908 -0
  526. package/dist/realtime.js +4 -4
  527. package/dist/recorder-host-WF2RRR56.js +69 -0
  528. package/dist/recorder-host-WF2RRR56.js.map +1 -0
  529. package/dist/recordings.js +3 -3
  530. package/dist/sandbox-files-ESDMOFSD.js +27 -0
  531. package/dist/session-app.js +211 -209
  532. package/dist/session-connect-cards-Q53KMMYY.js +25 -0
  533. package/dist/session-list-model.js +2 -2
  534. package/dist/session-realtime-CF3I35WJ.js +30 -0
  535. package/dist/session-realtime.js +2 -2
  536. package/dist/session-ui.js +33 -31
  537. package/dist/session.js +5 -5
  538. package/dist/sites.js +2 -2
  539. package/dist/terminal.js +2 -2
  540. package/dist/this-computer.js +3 -3
  541. package/dist/timeline-annotation-markers-CJK4RYZ4.js +157 -0
  542. package/dist/timeline-annotation-selection-67GF5H26.js +208 -0
  543. package/dist/timeline-annotations-dialog-ONJPQDJQ.js +283 -0
  544. package/dist/ui/access-list.js +11 -9
  545. package/dist/ui/access-list.js.map +1 -1
  546. package/dist/ui/api-error.d.ts +6 -3
  547. package/dist/ui/api-error.js +2 -1
  548. package/dist/ui/cadence-picker.js +6 -4
  549. package/dist/ui/choice-cards.js +5 -3
  550. package/dist/ui/confirm-dialog.js +2 -2
  551. package/dist/ui/copy-field.js +5 -3
  552. package/dist/ui/detail-page.js +2 -2
  553. package/dist/ui/detail-sheet.js +2 -2
  554. package/dist/ui/diff-view.js +4 -3
  555. package/dist/ui/disclosure.js +3 -3
  556. package/dist/ui/email-chips-input.js +5 -3
  557. package/dist/ui/error-message.js +2 -1
  558. package/dist/ui/error-reference.d.ts +15 -0
  559. package/dist/ui/error-text.d.ts +10 -0
  560. package/dist/ui/error-text.js +9 -0
  561. package/dist/ui/error-text.js.map +1 -0
  562. package/dist/ui/field.js +4 -2
  563. package/dist/ui/flush-form-page.js +8 -6
  564. package/dist/ui/form-dialog.js +7 -5
  565. package/dist/ui/list-row.js +3 -3
  566. package/dist/ui/load-failure.js +3 -2
  567. package/dist/ui/load-failure.js.map +1 -1
  568. package/dist/ui/notice.js +3 -1
  569. package/dist/ui/relative-time.js +2 -2
  570. package/dist/ui/revision-history.js +9 -7
  571. package/dist/ui/revision-history.js.map +1 -1
  572. package/dist/ui/role-select.js +10 -8
  573. package/dist/ui/segmented-control.js +4 -2
  574. package/dist/ui/select-menu.js +5 -3
  575. package/dist/ui/setting-row.js +3 -1
  576. package/dist/ui/switch.js +4 -2
  577. package/dist/ui/usage-meter.js +3 -3
  578. package/dist/ui/word-list-row.js +4 -2
  579. package/dist/usage.js +2 -2
  580. package/dist/workbench.js +4 -4
  581. package/package.json +5 -6
  582. package/src/app/app-state.tsx +126 -14
  583. package/src/app/components/artifacts/site-data.tsx +2 -2
  584. package/src/app/components/artifacts/site-settings.tsx +2 -2
  585. package/src/app/components/rail/session-list.tsx +7 -8
  586. package/src/app/components/rail/session-shell.tsx +3 -3
  587. package/src/app/components/repository-picker.tsx +8 -1
  588. package/src/app/components/session/model-context-inspector.tsx +2 -1
  589. package/src/app/components/session/session-admin-access.tsx +2 -2
  590. package/src/app/lib/actions/chat-operations.ts +4 -4
  591. package/src/app/lib/archive-session.test.tsx +265 -2
  592. package/src/app/lib/archive-session.tsx +175 -9
  593. package/src/app/lib/copy-link.ts +2 -2
  594. package/src/app/lib/inbox.tsx +2 -2
  595. package/src/app/lib/session-failure-toasts.ts +3 -2
  596. package/src/app/lib/toast.test.tsx +215 -0
  597. package/src/app/lib/toast.tsx +67 -2
  598. package/src/app/personal-github-reconnect.test.tsx +356 -0
  599. package/src/app/routes/artifacts.tsx +1 -2
  600. package/src/components/tool-action-review.tsx +14 -1
  601. package/src/meetings/delete-meeting-dialog.tsx +2 -1
  602. package/src/meetings/meeting-ask.tsx +2 -1
  603. package/src/meetings/meeting-detail-page.tsx +2 -1
  604. package/src/meetings/meeting-notes.tsx +2 -1
  605. package/src/meetings/meeting-settings.tsx +4 -1
  606. package/src/meetings/meeting-transcript.tsx +4 -1
  607. package/src/meetings/recorder-context.tsx +10 -0
  608. package/src/meetings/recorder-host.test.tsx +60 -2
  609. package/src/meetings/recorder-host.tsx +16 -3
  610. package/src/meetings/recorder-panel.tsx +2 -1
  611. package/src/meetings/recorder-workspace.test.tsx +26 -1
  612. package/src/messages/en.ts +6 -0
  613. package/src/ui/api-error.test.ts +29 -5
  614. package/src/ui/api-error.tsx +10 -4
  615. package/src/ui/error-message.tsx +8 -0
  616. package/src/ui/error-reference.test.ts +54 -0
  617. package/src/ui/error-reference.ts +51 -0
  618. package/src/ui/error-text.test.tsx +66 -0
  619. package/src/ui/error-text.tsx +49 -0
  620. package/src/ui/field.tsx +4 -1
  621. package/src/ui/notice.tsx +7 -2
  622. package/src/ui/setting-row.tsx +4 -1
  623. package/styles/app.css +12 -0
  624. package/styles/compiled.css +9 -0
  625. package/dist/browser-viewer-NOP5EAUO.js +0 -23
  626. package/dist/chat-interactive-block-G7O44JHR.js +0 -18
  627. package/dist/chunk-26RWVLRD.js +0 -135
  628. package/dist/chunk-2AHTY7OT.js +0 -247
  629. package/dist/chunk-2GDNWKSC.js +0 -3670
  630. package/dist/chunk-2JENKGCE.js +0 -339
  631. package/dist/chunk-2KYQC4T5.js +0 -155
  632. package/dist/chunk-2RREGDQH.js +0 -708
  633. package/dist/chunk-2T7DX6KR.js +0 -353
  634. package/dist/chunk-2VB2O4FQ.js +0 -920
  635. package/dist/chunk-2VTTKH23.js +0 -94
  636. package/dist/chunk-2XNG2KNT.js +0 -172
  637. package/dist/chunk-2YC6JQRO.js +0 -399
  638. package/dist/chunk-2ZVRJRXC.js +0 -27
  639. package/dist/chunk-35737UT4.js +0 -162
  640. package/dist/chunk-366XZ4PM.js +0 -41
  641. package/dist/chunk-36MIDGAH.js +0 -199
  642. package/dist/chunk-3FD76LXM.js +0 -212
  643. package/dist/chunk-3OVIXY4O.js +0 -213
  644. package/dist/chunk-3OVIXY4O.js.map +0 -1
  645. package/dist/chunk-3QNRBEYH.js +0 -432
  646. package/dist/chunk-3QX55WLC.js +0 -15
  647. package/dist/chunk-3USJPT2S.js +0 -1022
  648. package/dist/chunk-42CMQ5VR.js +0 -251
  649. package/dist/chunk-4LPOWQJY.js +0 -42
  650. package/dist/chunk-4NBTZRKT.js +0 -79
  651. package/dist/chunk-4OXI6HCV.js +0 -118
  652. package/dist/chunk-4SZZAFYQ.js +0 -2317
  653. package/dist/chunk-4TQL3WP2.js +0 -140
  654. package/dist/chunk-4Y6BK7IU.js +0 -196
  655. package/dist/chunk-4YD7YZC5.js +0 -373
  656. package/dist/chunk-5DTST3TP.js +0 -81
  657. package/dist/chunk-5FH5LQVS.js +0 -130
  658. package/dist/chunk-5KWMYPJV.js +0 -847
  659. package/dist/chunk-5MUJDC6C.js +0 -84
  660. package/dist/chunk-5QM2WPKV.js +0 -41
  661. package/dist/chunk-5WUN7XPD.js +0 -1184
  662. package/dist/chunk-64PO2WXU.js +0 -1067
  663. package/dist/chunk-6AHATAAY.js +0 -431
  664. package/dist/chunk-6ED2YWBT.js +0 -56
  665. package/dist/chunk-6GXVYAGR.js +0 -170
  666. package/dist/chunk-6H4SJBPE.js +0 -85
  667. package/dist/chunk-6MT3HHUB.js +0 -84
  668. package/dist/chunk-6UHCBH4G.js +0 -198
  669. package/dist/chunk-6WLX3NR3.js +0 -198
  670. package/dist/chunk-73NXYYWE.js +0 -112
  671. package/dist/chunk-76ERNKIZ.js +0 -603
  672. package/dist/chunk-776QZ573.js +0 -57
  673. package/dist/chunk-7BYWOFVH.js +0 -171
  674. package/dist/chunk-7O5CGGIQ.js +0 -108
  675. package/dist/chunk-7QOHRZ67.js +0 -251
  676. package/dist/chunk-7WIDB4PL.js +0 -2058
  677. package/dist/chunk-7WKP3DYJ.js +0 -37
  678. package/dist/chunk-7XOVTPDI.js +0 -227
  679. package/dist/chunk-AB5MBIXY.js +0 -281
  680. package/dist/chunk-ADNMXBCX.js +0 -1193
  681. package/dist/chunk-AFBJTUFK.js +0 -202
  682. package/dist/chunk-ALVRWCXE.js +0 -61
  683. package/dist/chunk-AOHU6O3M.js +0 -247
  684. package/dist/chunk-AOHU6O3M.js.map +0 -1
  685. package/dist/chunk-APW4T4SW.js +0 -270
  686. package/dist/chunk-AXBSYWKX.js +0 -2656
  687. package/dist/chunk-B2I5ZW35.js +0 -422
  688. package/dist/chunk-B3LMRTRF.js +0 -223
  689. package/dist/chunk-BE2XENG2.js +0 -292
  690. package/dist/chunk-BE2XENG2.js.map +0 -1
  691. package/dist/chunk-BF4SADKX.js +0 -29
  692. package/dist/chunk-BKP43KK4.js +0 -1788
  693. package/dist/chunk-BM3NEZ6X.js +0 -781
  694. package/dist/chunk-BT3BAGB5.js +0 -216
  695. package/dist/chunk-BTSYDIVJ.js +0 -357
  696. package/dist/chunk-BUBNGKWG.js +0 -70
  697. package/dist/chunk-BVUJV5WR.js +0 -126
  698. package/dist/chunk-BZO5ZMUP.js +0 -27
  699. package/dist/chunk-C3HUF3M2.js +0 -157
  700. package/dist/chunk-C5QCAOES.js +0 -264
  701. package/dist/chunk-CGK6ALQU.js +0 -159
  702. package/dist/chunk-CPYGO76Q.js +0 -335
  703. package/dist/chunk-CQH4FWYA.js +0 -490
  704. package/dist/chunk-CZP5QXNB.js +0 -234
  705. package/dist/chunk-D2TOWEYH.js +0 -266
  706. package/dist/chunk-D6L4GHRH.js +0 -340
  707. package/dist/chunk-DKT3N37I.js +0 -50
  708. package/dist/chunk-DMMJIFKA.js +0 -84
  709. package/dist/chunk-DO74DQC7.js +0 -26
  710. package/dist/chunk-DOFJZ2JU.js +0 -83
  711. package/dist/chunk-DSXVY5WZ.js +0 -119
  712. package/dist/chunk-E337C2VK.js +0 -82
  713. package/dist/chunk-E6NRSRBE.js +0 -114
  714. package/dist/chunk-E6SQKHAU.js +0 -114
  715. package/dist/chunk-E7UIVD7F.js +0 -236
  716. package/dist/chunk-EGBII4CP.js +0 -229
  717. package/dist/chunk-EILSAQVJ.js +0 -200
  718. package/dist/chunk-ELL6HSYR.js +0 -307
  719. package/dist/chunk-EUBGLFFR.js +0 -73
  720. package/dist/chunk-EW6RNWSH.js +0 -212
  721. package/dist/chunk-EYUT5Y6V.js +0 -2599
  722. package/dist/chunk-F7U3QPZ3.js +0 -304
  723. package/dist/chunk-FBTJKSTM.js +0 -1270
  724. package/dist/chunk-FC2FTSK3.js +0 -2424
  725. package/dist/chunk-FOGNA3BU.js +0 -148
  726. package/dist/chunk-FQFKHNC7.js +0 -650
  727. package/dist/chunk-FTCHM755.js +0 -50
  728. package/dist/chunk-FXSHP4JZ.js +0 -3550
  729. package/dist/chunk-G6ZZC543.js +0 -818
  730. package/dist/chunk-G7FU6PUA.js +0 -100
  731. package/dist/chunk-GA4YEAMX.js +0 -3851
  732. package/dist/chunk-GE33BGB7.js +0 -12
  733. package/dist/chunk-GQ67HSJY.js +0 -570
  734. package/dist/chunk-GXXZ3WAK.js +0 -106
  735. package/dist/chunk-H2TCRX3H.js +0 -237
  736. package/dist/chunk-HLL4PBO7.js +0 -60
  737. package/dist/chunk-HLOEPV5C.js +0 -259
  738. package/dist/chunk-HUAGBS4O.js +0 -56
  739. package/dist/chunk-I36GSRUJ.js +0 -211
  740. package/dist/chunk-I6VBHT7S.js +0 -261
  741. package/dist/chunk-ICNNNOXE.js +0 -333
  742. package/dist/chunk-ICX64J4U.js +0 -172
  743. package/dist/chunk-ID36Y46W.js +0 -5046
  744. package/dist/chunk-ID36Y46W.js.map +0 -1
  745. package/dist/chunk-IGVVXLKJ.js +0 -559
  746. package/dist/chunk-IKJLSBUI.js +0 -2984
  747. package/dist/chunk-IKMUFDVS.js +0 -50
  748. package/dist/chunk-IKUNOX7F.js +0 -255
  749. package/dist/chunk-ILKDYBON.js +0 -288
  750. package/dist/chunk-IVYJX3OY.js +0 -187
  751. package/dist/chunk-JCY4CMDH.js +0 -107
  752. package/dist/chunk-JJZPLGIP.js +0 -474
  753. package/dist/chunk-JW33RV4V.js +0 -143
  754. package/dist/chunk-JWPA6ZPZ.js +0 -351
  755. package/dist/chunk-JZ4QXS6D.js +0 -50
  756. package/dist/chunk-K42OUZQ3.js +0 -386
  757. package/dist/chunk-K5TOVX5A.js +0 -206
  758. package/dist/chunk-K63HGHZX.js +0 -99
  759. package/dist/chunk-K6R5T44I.js +0 -75
  760. package/dist/chunk-KHJ5PXFM.js +0 -914
  761. package/dist/chunk-KJZRQ55O.js +0 -2319
  762. package/dist/chunk-KJZRQ55O.js.map +0 -1
  763. package/dist/chunk-KKI55ZMW.js +0 -65
  764. package/dist/chunk-KRPLAAFP.js +0 -199
  765. package/dist/chunk-KVFEZDBO.js +0 -134
  766. package/dist/chunk-L4I665WK.js +0 -45
  767. package/dist/chunk-L4OF77LE.js +0 -110
  768. package/dist/chunk-L4OF77LE.js.map +0 -1
  769. package/dist/chunk-LA5T52RM.js +0 -70
  770. package/dist/chunk-LM2W5YAT.js +0 -401
  771. package/dist/chunk-LQ62ECE6.js +0 -390
  772. package/dist/chunk-LQDUHU3Y.js +0 -71
  773. package/dist/chunk-LRJIYTZW.js +0 -4157
  774. package/dist/chunk-LRJIYTZW.js.map +0 -1
  775. package/dist/chunk-LRN6GYAZ.js +0 -138
  776. package/dist/chunk-M4SDVTKJ.js +0 -790
  777. package/dist/chunk-MA6O7CM6.js +0 -99
  778. package/dist/chunk-MBIBB6GI.js +0 -197
  779. package/dist/chunk-MF3ZFB4H.js +0 -199
  780. package/dist/chunk-MJJGJMYJ.js +0 -98
  781. package/dist/chunk-MLJADQFI.js +0 -4824
  782. package/dist/chunk-MQG7RV3B.js +0 -62
  783. package/dist/chunk-MTTGSQA5.js +0 -186
  784. package/dist/chunk-MW7Y3T55.js +0 -525
  785. package/dist/chunk-MYUFMVCH.js +0 -121
  786. package/dist/chunk-N3OARGH2.js +0 -61
  787. package/dist/chunk-NB2HMRT2.js +0 -353
  788. package/dist/chunk-NFDFYWMV.js +0 -141
  789. package/dist/chunk-NWGNFN3N.js +0 -1187
  790. package/dist/chunk-NWJRPDIO.js +0 -840
  791. package/dist/chunk-NWJRPDIO.js.map +0 -1
  792. package/dist/chunk-NXWBBZJV.js +0 -267
  793. package/dist/chunk-NY2QWROL.js +0 -71
  794. package/dist/chunk-O2IOPP3R.js +0 -848
  795. package/dist/chunk-O2UWH5RG.js +0 -141
  796. package/dist/chunk-O5YWDLYF.js +0 -393
  797. package/dist/chunk-OBMCZO7E.js +0 -121
  798. package/dist/chunk-OD3DCCCB.js +0 -132
  799. package/dist/chunk-OMH7R6I3.js +0 -390
  800. package/dist/chunk-OSA5EQG5.js +0 -113
  801. package/dist/chunk-OSJ3MUTZ.js +0 -2936
  802. package/dist/chunk-OWAYJ2OV.js +0 -368
  803. package/dist/chunk-OYXBFSGK.js +0 -269
  804. package/dist/chunk-PC2EBA5G.js +0 -4116
  805. package/dist/chunk-PC2EBA5G.js.map +0 -1
  806. package/dist/chunk-PC2MVXIP.js +0 -363
  807. package/dist/chunk-PC2MVXIP.js.map +0 -1
  808. package/dist/chunk-PENGLDR5.js +0 -309
  809. package/dist/chunk-PSMAWRPL.js +0 -191
  810. package/dist/chunk-PW4IMTYR.js +0 -702
  811. package/dist/chunk-PW54V7T5.js +0 -387
  812. package/dist/chunk-Q2EXYSMO.js +0 -24
  813. package/dist/chunk-Q2XJK5I4.js +0 -51
  814. package/dist/chunk-Q2XJK5I4.js.map +0 -1
  815. package/dist/chunk-Q4EFRI6X.js +0 -258
  816. package/dist/chunk-Q52CXW6C.js +0 -48
  817. package/dist/chunk-Q6XQ2R37.js +0 -184
  818. package/dist/chunk-QAJ53XBW.js +0 -23
  819. package/dist/chunk-QDTKECT4.js +0 -129
  820. package/dist/chunk-QE3ZFGI3.js +0 -43
  821. package/dist/chunk-QHHSUR2Y.js +0 -298
  822. package/dist/chunk-QHNVNR7B.js +0 -173
  823. package/dist/chunk-QIK2Q6N5.js +0 -376
  824. package/dist/chunk-QWL4L366.js +0 -38
  825. package/dist/chunk-R3J2PTVQ.js +0 -690
  826. package/dist/chunk-RBRX5ZS3.js +0 -319
  827. package/dist/chunk-REX6JIC7.js +0 -33
  828. package/dist/chunk-RGZ7EEC3.js +0 -537
  829. package/dist/chunk-RGZ7EEC3.js.map +0 -1
  830. package/dist/chunk-RIPS7GFR.js +0 -960
  831. package/dist/chunk-RTBZNFNV.js +0 -1354
  832. package/dist/chunk-RTBZNFNV.js.map +0 -1
  833. package/dist/chunk-SKMNW4SW.js +0 -187
  834. package/dist/chunk-SRFARKXC.js +0 -623
  835. package/dist/chunk-SWIHWCTW.js +0 -4461
  836. package/dist/chunk-TA5CFTO4.js +0 -103
  837. package/dist/chunk-TF4ZVJLI.js +0 -156
  838. package/dist/chunk-TG7DADJR.js +0 -9624
  839. package/dist/chunk-TI4R2ZD5.js +0 -623
  840. package/dist/chunk-TI4R2ZD5.js.map +0 -1
  841. package/dist/chunk-TNKWOUWP.js +0 -412
  842. package/dist/chunk-TNUSPXPW.js +0 -5555
  843. package/dist/chunk-TNUSPXPW.js.map +0 -1
  844. package/dist/chunk-TNYFHKVV.js +0 -366
  845. package/dist/chunk-TPMZBOFH.js +0 -178
  846. package/dist/chunk-TW3LKRJF.js +0 -263
  847. package/dist/chunk-TZAO65I4.js +0 -83
  848. package/dist/chunk-U5EFEMYU.js +0 -89
  849. package/dist/chunk-U6M4LS3M.js +0 -378
  850. package/dist/chunk-UI4HI5QK.js +0 -918
  851. package/dist/chunk-UJDOWCQ3.js +0 -272
  852. package/dist/chunk-UJUQ2QOX.js +0 -581
  853. package/dist/chunk-UQ3IM6FY.js +0 -133
  854. package/dist/chunk-UYE47LO6.js +0 -246
  855. package/dist/chunk-VADHIT26.js +0 -89
  856. package/dist/chunk-VFQ3H6CO.js +0 -163
  857. package/dist/chunk-VGUN6VB2.js +0 -188
  858. package/dist/chunk-VGWWEVSD.js +0 -723
  859. package/dist/chunk-VIEFJ2DM.js +0 -2469
  860. package/dist/chunk-VLXM36VS.js +0 -268
  861. package/dist/chunk-W3BFRR2G.js +0 -499
  862. package/dist/chunk-W5MPXR3A.js +0 -981
  863. package/dist/chunk-W5OWKVZG.js +0 -136
  864. package/dist/chunk-W6FRORMX.js +0 -486
  865. package/dist/chunk-W6FRORMX.js.map +0 -1
  866. package/dist/chunk-W7XROSZO.js +0 -232
  867. package/dist/chunk-W7XROSZO.js.map +0 -1
  868. package/dist/chunk-WEZ5PXZP.js +0 -403
  869. package/dist/chunk-WHWUWN2X.js +0 -197
  870. package/dist/chunk-WHWUWN2X.js.map +0 -1
  871. package/dist/chunk-WLEDGIVS.js +0 -114
  872. package/dist/chunk-WLEDGIVS.js.map +0 -1
  873. package/dist/chunk-WNDAKLHG.js +0 -281
  874. package/dist/chunk-WTJ4PLMU.js +0 -103
  875. package/dist/chunk-WV2KPJUW.js +0 -107
  876. package/dist/chunk-X3VY5EGY.js +0 -277
  877. package/dist/chunk-X3VY5EGY.js.map +0 -1
  878. package/dist/chunk-XDBYWVCW.js +0 -418
  879. package/dist/chunk-XF7MA4U5.js +0 -36
  880. package/dist/chunk-XF7MA4U5.js.map +0 -1
  881. package/dist/chunk-XOSQP3YA.js +0 -605
  882. package/dist/chunk-XYBV4ZJQ.js +0 -271
  883. package/dist/chunk-YBKVGLQR.js +0 -147
  884. package/dist/chunk-YDCUBUWH.js +0 -1583
  885. package/dist/chunk-YG6NARQY.js +0 -51
  886. package/dist/chunk-YG6NARQY.js.map +0 -1
  887. package/dist/chunk-YSVD5HI4.js +0 -278
  888. package/dist/chunk-YT3WGNG6.js +0 -290
  889. package/dist/chunk-YYICQDK4.js +0 -414
  890. package/dist/chunk-YYLMZLI6.js +0 -686
  891. package/dist/chunk-ZAMTKG5U.js +0 -95
  892. package/dist/chunk-ZDLYSXKN.js +0 -111
  893. package/dist/chunk-ZG447FSS.js +0 -194
  894. package/dist/chunk-ZIT5KD4Q.js +0 -264
  895. package/dist/chunk-ZUDOVDKR.js +0 -3064
  896. package/dist/chunk-ZW2ECJ3A.js +0 -451
  897. package/dist/computer-viewer-LPZ763KF.js +0 -21
  898. package/dist/embedded-new-voice-YVMKSLKJ.js +0 -24
  899. package/dist/embedded-voice-BJPQFXSU.js +0 -24
  900. package/dist/fleet-decision-row-AA4H5CDT.js +0 -361
  901. package/dist/model-policy-picker-menu-HSMWVO4P.js +0 -22
  902. package/dist/payment-page-card-3LTSFJGN.js +0 -223
  903. package/dist/platform-activity-row-5VYV6TX4.js +0 -128
  904. package/dist/queue-surface-implementation-NXHZUKD2.js +0 -908
  905. package/dist/recorder-host-ZKRWTDBM.js +0 -57
  906. package/dist/recorder-host-ZKRWTDBM.js.map +0 -1
  907. package/dist/sandbox-files-YCMLQUFU.js +0 -27
  908. package/dist/session-connect-cards-KSQLMRM5.js +0 -25
  909. package/dist/session-realtime-ZR6JLG3Y.js +0 -30
  910. package/dist/timeline-annotation-markers-YAHDPWVG.js +0 -157
  911. package/dist/timeline-annotation-selection-KHXNCEJP.js +0 -208
  912. package/dist/timeline-annotations-dialog-Y4XD3N7B.js +0 -283
  913. /package/dist/{browser-viewer-NOP5EAUO.js.map → browser-viewer-TC27OCIP.js.map} +0 -0
  914. /package/dist/{chat-interactive-block-G7O44JHR.js.map → chat-interactive-block-RWPQBHVS.js.map} +0 -0
  915. /package/dist/{chunk-EGBII4CP.js.map → chunk-2BDT3UZQ.js.map} +0 -0
  916. /package/dist/{chunk-4YD7YZC5.js.map → chunk-2CLNIEK4.js.map} +0 -0
  917. /package/dist/{chunk-ZW2ECJ3A.js.map → chunk-2FSBSCZJ.js.map} +0 -0
  918. /package/dist/{chunk-KRPLAAFP.js.map → chunk-2I7HDP53.js.map} +0 -0
  919. /package/dist/{chunk-3QX55WLC.js.map → chunk-2INLDVK3.js.map} +0 -0
  920. /package/dist/{chunk-BVUJV5WR.js.map → chunk-2KALVELR.js.map} +0 -0
  921. /package/dist/{chunk-XDBYWVCW.js.map → chunk-2M3J7ZWQ.js.map} +0 -0
  922. /package/dist/{chunk-2RREGDQH.js.map → chunk-2OP6WLGV.js.map} +0 -0
  923. /package/dist/{chunk-OSJ3MUTZ.js.map → chunk-2RG7NIAS.js.map} +0 -0
  924. /package/dist/{chunk-26RWVLRD.js.map → chunk-2STUPWEL.js.map} +0 -0
  925. /package/dist/{chunk-XYBV4ZJQ.js.map → chunk-2YUOVM3G.js.map} +0 -0
  926. /package/dist/{chunk-2GDNWKSC.js.map → chunk-2Z3NQNTM.js.map} +0 -0
  927. /package/dist/{chunk-2VB2O4FQ.js.map → chunk-3CPWWGNK.js.map} +0 -0
  928. /package/dist/{chunk-7WKP3DYJ.js.map → chunk-3ED2U6XE.js.map} +0 -0
  929. /package/dist/{chunk-BT3BAGB5.js.map → chunk-3GZA4BUW.js.map} +0 -0
  930. /package/dist/{chunk-3USJPT2S.js.map → chunk-3IK6UYO6.js.map} +0 -0
  931. /package/dist/{chunk-6AHATAAY.js.map → chunk-3PZ7JZI2.js.map} +0 -0
  932. /package/dist/{chunk-JZ4QXS6D.js.map → chunk-4DVJ6ONS.js.map} +0 -0
  933. /package/dist/{chunk-5QM2WPKV.js.map → chunk-4E3ZJRTZ.js.map} +0 -0
  934. /package/dist/{chunk-NFDFYWMV.js.map → chunk-4SAWSRAA.js.map} +0 -0
  935. /package/dist/{chunk-ELL6HSYR.js.map → chunk-53AGXXZM.js.map} +0 -0
  936. /package/dist/{chunk-G6ZZC543.js.map → chunk-54YW6SZZ.js.map} +0 -0
  937. /package/dist/{chunk-4SZZAFYQ.js.map → chunk-57AZS3IE.js.map} +0 -0
  938. /package/dist/{chunk-JW33RV4V.js.map → chunk-5CPEEAFD.js.map} +0 -0
  939. /package/dist/{chunk-D6L4GHRH.js.map → chunk-5EWSRZ2Y.js.map} +0 -0
  940. /package/dist/{chunk-PW54V7T5.js.map → chunk-5IE76VCY.js.map} +0 -0
  941. /package/dist/{chunk-6GXVYAGR.js.map → chunk-5NWEKLDZ.js.map} +0 -0
  942. /package/dist/{chunk-6UHCBH4G.js.map → chunk-5O2FCCHZ.js.map} +0 -0
  943. /package/dist/{chunk-2YC6JQRO.js.map → chunk-5QAY6K77.js.map} +0 -0
  944. /package/dist/{chunk-EYUT5Y6V.js.map → chunk-6DK6Z4UN.js.map} +0 -0
  945. /package/dist/{chunk-PW4IMTYR.js.map → chunk-6DVCC7QS.js.map} +0 -0
  946. /package/dist/{chunk-7WIDB4PL.js.map → chunk-6JHU2UBS.js.map} +0 -0
  947. /package/dist/{chunk-CQH4FWYA.js.map → chunk-6PZ7OBYU.js.map} +0 -0
  948. /package/dist/{chunk-VFQ3H6CO.js.map → chunk-6WGRDRMA.js.map} +0 -0
  949. /package/dist/{chunk-MTTGSQA5.js.map → chunk-77WAKEAH.js.map} +0 -0
  950. /package/dist/{chunk-O5YWDLYF.js.map → chunk-7TDO3CUM.js.map} +0 -0
  951. /package/dist/{chunk-2AHTY7OT.js.map → chunk-7TIX2UAR.js.map} +0 -0
  952. /package/dist/{chunk-FOGNA3BU.js.map → chunk-7V5REBCP.js.map} +0 -0
  953. /package/dist/{chunk-2JENKGCE.js.map → chunk-7VMZGLYI.js.map} +0 -0
  954. /package/dist/{chunk-E7UIVD7F.js.map → chunk-7W37NS3I.js.map} +0 -0
  955. /package/dist/{chunk-ZDLYSXKN.js.map → chunk-7X6SDK2C.js.map} +0 -0
  956. /package/dist/{chunk-ZAMTKG5U.js.map → chunk-7ZNUHRP5.js.map} +0 -0
  957. /package/dist/{chunk-DMMJIFKA.js.map → chunk-A36PZALD.js.map} +0 -0
  958. /package/dist/{chunk-WV2KPJUW.js.map → chunk-AUI6VA63.js.map} +0 -0
  959. /package/dist/{chunk-Q2EXYSMO.js.map → chunk-AW2MQB37.js.map} +0 -0
  960. /package/dist/{chunk-6WLX3NR3.js.map → chunk-AWKES45Y.js.map} +0 -0
  961. /package/dist/{chunk-OD3DCCCB.js.map → chunk-AXHZYXUV.js.map} +0 -0
  962. /package/dist/{chunk-QDTKECT4.js.map → chunk-BHNSJVBC.js.map} +0 -0
  963. /package/dist/{chunk-FTCHM755.js.map → chunk-BJEJFISW.js.map} +0 -0
  964. /package/dist/{chunk-B2I5ZW35.js.map → chunk-BJFH6JI5.js.map} +0 -0
  965. /package/dist/{chunk-RIPS7GFR.js.map → chunk-BMICEQZQ.js.map} +0 -0
  966. /package/dist/{chunk-BF4SADKX.js.map → chunk-BTLBYBLU.js.map} +0 -0
  967. /package/dist/{chunk-U5EFEMYU.js.map → chunk-BXBDYNRP.js.map} +0 -0
  968. /package/dist/{chunk-BTSYDIVJ.js.map → chunk-C372BFOV.js.map} +0 -0
  969. /package/dist/{chunk-MLJADQFI.js.map → chunk-CMKGILJK.js.map} +0 -0
  970. /package/dist/{chunk-DKT3N37I.js.map → chunk-CRAOSVHC.js.map} +0 -0
  971. /package/dist/{chunk-WNDAKLHG.js.map → chunk-CRU35QQH.js.map} +0 -0
  972. /package/dist/{chunk-2XNG2KNT.js.map → chunk-CUIWCGMA.js.map} +0 -0
  973. /package/dist/{chunk-QWL4L366.js.map → chunk-D5TWNFFE.js.map} +0 -0
  974. /package/dist/{chunk-SWIHWCTW.js.map → chunk-DF5EAHDN.js.map} +0 -0
  975. /package/dist/{chunk-HUAGBS4O.js.map → chunk-DJAXC5OK.js.map} +0 -0
  976. /package/dist/{chunk-FXSHP4JZ.js.map → chunk-DXBYWSL5.js.map} +0 -0
  977. /package/dist/{chunk-5MUJDC6C.js.map → chunk-DXR5PDFP.js.map} +0 -0
  978. /package/dist/{chunk-NXWBBZJV.js.map → chunk-DZWARC4M.js.map} +0 -0
  979. /package/dist/{chunk-GXXZ3WAK.js.map → chunk-DZXEDSQI.js.map} +0 -0
  980. /package/dist/{chunk-Q52CXW6C.js.map → chunk-E7XERZWC.js.map} +0 -0
  981. /package/dist/{chunk-4NBTZRKT.js.map → chunk-ECJBYNLJ.js.map} +0 -0
  982. /package/dist/{chunk-QE3ZFGI3.js.map → chunk-EDI6SJ2N.js.map} +0 -0
  983. /package/dist/{chunk-E6NRSRBE.js.map → chunk-EWSOC6WF.js.map} +0 -0
  984. /package/dist/{chunk-TA5CFTO4.js.map → chunk-F2OPHAUN.js.map} +0 -0
  985. /package/dist/{chunk-5DTST3TP.js.map → chunk-F4ISQGGM.js.map} +0 -0
  986. /package/dist/{chunk-MBIBB6GI.js.map → chunk-FO4LYKJL.js.map} +0 -0
  987. /package/dist/{chunk-EUBGLFFR.js.map → chunk-FPXASDG5.js.map} +0 -0
  988. /package/dist/{chunk-C3HUF3M2.js.map → chunk-FVXBNBHO.js.map} +0 -0
  989. /package/dist/{chunk-W5MPXR3A.js.map → chunk-FZC5N55X.js.map} +0 -0
  990. /package/dist/{chunk-MA6O7CM6.js.map → chunk-GAVYGBFI.js.map} +0 -0
  991. /package/dist/{chunk-REX6JIC7.js.map → chunk-GKVJIDHF.js.map} +0 -0
  992. /package/dist/{chunk-EW6RNWSH.js.map → chunk-GVN5SZLX.js.map} +0 -0
  993. /package/dist/{chunk-KVFEZDBO.js.map → chunk-H3T7IWNA.js.map} +0 -0
  994. /package/dist/{chunk-I6VBHT7S.js.map → chunk-HAX4LCR5.js.map} +0 -0
  995. /package/dist/{chunk-OBMCZO7E.js.map → chunk-HC4JFZVU.js.map} +0 -0
  996. /package/dist/{chunk-UJUQ2QOX.js.map → chunk-HEFPPMBQ.js.map} +0 -0
  997. /package/dist/{chunk-DOFJZ2JU.js.map → chunk-HNLR7Q4Z.js.map} +0 -0
  998. /package/dist/{chunk-GE33BGB7.js.map → chunk-HSOXMJOT.js.map} +0 -0
  999. /package/dist/{chunk-AB5MBIXY.js.map → chunk-I4MRDSUF.js.map} +0 -0
  1000. /package/dist/{chunk-AFBJTUFK.js.map → chunk-I4QEJ62Y.js.map} +0 -0
  1001. /package/dist/{chunk-6ED2YWBT.js.map → chunk-I5B5L6Q4.js.map} +0 -0
  1002. /package/dist/{chunk-C5QCAOES.js.map → chunk-I5QZJODL.js.map} +0 -0
  1003. /package/dist/{chunk-76ERNKIZ.js.map → chunk-I7ITSXSJ.js.map} +0 -0
  1004. /package/dist/{chunk-OMH7R6I3.js.map → chunk-I7XIZRFD.js.map} +0 -0
  1005. /package/dist/{chunk-E337C2VK.js.map → chunk-IDANQPRH.js.map} +0 -0
  1006. /package/dist/{chunk-3FD76LXM.js.map → chunk-IFB3WJ36.js.map} +0 -0
  1007. /package/dist/{chunk-ZIT5KD4Q.js.map → chunk-IHTAKKTK.js.map} +0 -0
  1008. /package/dist/{chunk-QHNVNR7B.js.map → chunk-ILDXWY37.js.map} +0 -0
  1009. /package/dist/{chunk-GQ67HSJY.js.map → chunk-IMDQUHBJ.js.map} +0 -0
  1010. /package/dist/{chunk-DSXVY5WZ.js.map → chunk-IMZCQBOT.js.map} +0 -0
  1011. /package/dist/{chunk-WEZ5PXZP.js.map → chunk-IXPTECSC.js.map} +0 -0
  1012. /package/dist/{chunk-NY2QWROL.js.map → chunk-J255A3N5.js.map} +0 -0
  1013. /package/dist/{chunk-O2UWH5RG.js.map → chunk-J5F5HPPW.js.map} +0 -0
  1014. /package/dist/{chunk-VIEFJ2DM.js.map → chunk-JEA3QDX7.js.map} +0 -0
  1015. /package/dist/{chunk-TF4ZVJLI.js.map → chunk-JEUPAVYY.js.map} +0 -0
  1016. /package/dist/{chunk-ZG447FSS.js.map → chunk-JKHKLL5W.js.map} +0 -0
  1017. /package/dist/{chunk-FQFKHNC7.js.map → chunk-JQL7ZH6C.js.map} +0 -0
  1018. /package/dist/{chunk-776QZ573.js.map → chunk-JWB44UGJ.js.map} +0 -0
  1019. /package/dist/{chunk-ICNNNOXE.js.map → chunk-JZ4NLCAP.js.map} +0 -0
  1020. /package/dist/{chunk-TNKWOUWP.js.map → chunk-K2A5PXQ5.js.map} +0 -0
  1021. /package/dist/{chunk-SRFARKXC.js.map → chunk-K56XV3C3.js.map} +0 -0
  1022. /package/dist/{chunk-QAJ53XBW.js.map → chunk-K6GAXXVA.js.map} +0 -0
  1023. /package/dist/{chunk-MF3ZFB4H.js.map → chunk-KCBMFSMS.js.map} +0 -0
  1024. /package/dist/{chunk-VLXM36VS.js.map → chunk-KF2FV3ZJ.js.map} +0 -0
  1025. /package/dist/{chunk-YSVD5HI4.js.map → chunk-KJD65EJP.js.map} +0 -0
  1026. /package/dist/{chunk-K42OUZQ3.js.map → chunk-KLEUWIMZ.js.map} +0 -0
  1027. /package/dist/{chunk-PENGLDR5.js.map → chunk-KODELWYT.js.map} +0 -0
  1028. /package/dist/{chunk-TZAO65I4.js.map → chunk-KRDR5RJD.js.map} +0 -0
  1029. /package/dist/{chunk-KHJ5PXFM.js.map → chunk-KUDGXAF7.js.map} +0 -0
  1030. /package/dist/{chunk-6H4SJBPE.js.map → chunk-KYS77RPN.js.map} +0 -0
  1031. /package/dist/{chunk-OWAYJ2OV.js.map → chunk-L7YTNTIK.js.map} +0 -0
  1032. /package/dist/{chunk-YYLMZLI6.js.map → chunk-LHPNABDH.js.map} +0 -0
  1033. /package/dist/{chunk-LM2W5YAT.js.map → chunk-MFROMEKA.js.map} +0 -0
  1034. /package/dist/{chunk-AXBSYWKX.js.map → chunk-MIHN76LX.js.map} +0 -0
  1035. /package/dist/{chunk-4LPOWQJY.js.map → chunk-MIYFS2XN.js.map} +0 -0
  1036. /package/dist/{chunk-KKI55ZMW.js.map → chunk-MJUCFQMS.js.map} +0 -0
  1037. /package/dist/{chunk-ZUDOVDKR.js.map → chunk-MM4FNWI4.js.map} +0 -0
  1038. /package/dist/{chunk-M4SDVTKJ.js.map → chunk-MNZG4OHU.js.map} +0 -0
  1039. /package/dist/{chunk-EILSAQVJ.js.map → chunk-N6AACDUW.js.map} +0 -0
  1040. /package/dist/{chunk-BM3NEZ6X.js.map → chunk-NC55IFN3.js.map} +0 -0
  1041. /package/dist/{chunk-MJJGJMYJ.js.map → chunk-NC7PVOEK.js.map} +0 -0
  1042. /package/dist/{chunk-LA5T52RM.js.map → chunk-NCYMNCJO.js.map} +0 -0
  1043. /package/dist/{chunk-HLOEPV5C.js.map → chunk-ND2BXV3P.js.map} +0 -0
  1044. /package/dist/{chunk-UJDOWCQ3.js.map → chunk-NDBTFUO6.js.map} +0 -0
  1045. /package/dist/{chunk-K5TOVX5A.js.map → chunk-NDQJZ7HF.js.map} +0 -0
  1046. /package/dist/{chunk-35737UT4.js.map → chunk-NGJJJPZZ.js.map} +0 -0
  1047. /package/dist/{chunk-42CMQ5VR.js.map → chunk-NJTSNNE7.js.map} +0 -0
  1048. /package/dist/{chunk-FBTJKSTM.js.map → chunk-NRTE7DNV.js.map} +0 -0
  1049. /package/dist/{chunk-YT3WGNG6.js.map → chunk-NULUNM7H.js.map} +0 -0
  1050. /package/dist/{chunk-7XOVTPDI.js.map → chunk-NUNZS36W.js.map} +0 -0
  1051. /package/dist/{chunk-FC2FTSK3.js.map → chunk-NW53H5RW.js.map} +0 -0
  1052. /package/dist/{chunk-TW3LKRJF.js.map → chunk-NXCMHIKI.js.map} +0 -0
  1053. /package/dist/{chunk-CGK6ALQU.js.map → chunk-O3LKCBP5.js.map} +0 -0
  1054. /package/dist/{chunk-QIK2Q6N5.js.map → chunk-O6N4ABCA.js.map} +0 -0
  1055. /package/dist/{chunk-73NXYYWE.js.map → chunk-O732GAFC.js.map} +0 -0
  1056. /package/dist/{chunk-R3J2PTVQ.js.map → chunk-OF4TIKYC.js.map} +0 -0
  1057. /package/dist/{chunk-BUBNGKWG.js.map → chunk-OMPVOMPP.js.map} +0 -0
  1058. /package/dist/{chunk-4OXI6HCV.js.map → chunk-OPJJSKUK.js.map} +0 -0
  1059. /package/dist/{chunk-4Y6BK7IU.js.map → chunk-OPWCMA4D.js.map} +0 -0
  1060. /package/dist/{chunk-ADNMXBCX.js.map → chunk-ORJPS5VN.js.map} +0 -0
  1061. /package/dist/{chunk-SKMNW4SW.js.map → chunk-OSY5K7L7.js.map} +0 -0
  1062. /package/dist/{chunk-L4I665WK.js.map → chunk-OV6QJRT4.js.map} +0 -0
  1063. /package/dist/{chunk-7O5CGGIQ.js.map → chunk-OVKYVZMW.js.map} +0 -0
  1064. /package/dist/{chunk-7BYWOFVH.js.map → chunk-OZCBM3UC.js.map} +0 -0
  1065. /package/dist/{chunk-ALVRWCXE.js.map → chunk-P3A2EINJ.js.map} +0 -0
  1066. /package/dist/{chunk-BZO5ZMUP.js.map → chunk-PTAG4PDC.js.map} +0 -0
  1067. /package/dist/{chunk-QHHSUR2Y.js.map → chunk-PTF5B7TJ.js.map} +0 -0
  1068. /package/dist/{chunk-O2IOPP3R.js.map → chunk-Q3DPEYX4.js.map} +0 -0
  1069. /package/dist/{chunk-G7FU6PUA.js.map → chunk-QB2KMIDP.js.map} +0 -0
  1070. /package/dist/{chunk-64PO2WXU.js.map → chunk-QCSJ4CWE.js.map} +0 -0
  1071. /package/dist/{chunk-YYICQDK4.js.map → chunk-QIOQ2NPQ.js.map} +0 -0
  1072. /package/dist/{chunk-NB2HMRT2.js.map → chunk-QK5EFEUT.js.map} +0 -0
  1073. /package/dist/{chunk-366XZ4PM.js.map → chunk-QPQBLYQJ.js.map} +0 -0
  1074. /package/dist/{chunk-Q6XQ2R37.js.map → chunk-QPSGCC5D.js.map} +0 -0
  1075. /package/dist/{chunk-JJZPLGIP.js.map → chunk-QZAAUQRN.js.map} +0 -0
  1076. /package/dist/{chunk-VGUN6VB2.js.map → chunk-RGBI63KJ.js.map} +0 -0
  1077. /package/dist/{chunk-LRN6GYAZ.js.map → chunk-RLBKLAEY.js.map} +0 -0
  1078. /package/dist/{chunk-F7U3QPZ3.js.map → chunk-RMFKVOM7.js.map} +0 -0
  1079. /package/dist/{chunk-Q4EFRI6X.js.map → chunk-ROKQU7WG.js.map} +0 -0
  1080. /package/dist/{chunk-7QOHRZ67.js.map → chunk-RPVREAU7.js.map} +0 -0
  1081. /package/dist/{chunk-VGWWEVSD.js.map → chunk-RQKLF42C.js.map} +0 -0
  1082. /package/dist/{chunk-2VTTKH23.js.map → chunk-SEO7TICN.js.map} +0 -0
  1083. /package/dist/{chunk-3QNRBEYH.js.map → chunk-SHHJCL7X.js.map} +0 -0
  1084. /package/dist/{chunk-E6SQKHAU.js.map → chunk-SIRLACNZ.js.map} +0 -0
  1085. /package/dist/{chunk-H2TCRX3H.js.map → chunk-SKPHMYAA.js.map} +0 -0
  1086. /package/dist/{chunk-YDCUBUWH.js.map → chunk-SODC7T6L.js.map} +0 -0
  1087. /package/dist/{chunk-TNYFHKVV.js.map → chunk-SQJIKMN3.js.map} +0 -0
  1088. /package/dist/{chunk-DO74DQC7.js.map → chunk-SVINDKVW.js.map} +0 -0
  1089. /package/dist/{chunk-CPYGO76Q.js.map → chunk-SYCDHPZF.js.map} +0 -0
  1090. /package/dist/{chunk-UQ3IM6FY.js.map → chunk-T2QX3FDP.js.map} +0 -0
  1091. /package/dist/{chunk-NWGNFN3N.js.map → chunk-T3OWFVMS.js.map} +0 -0
  1092. /package/dist/{chunk-N3OARGH2.js.map → chunk-T6XI5FLY.js.map} +0 -0
  1093. /package/dist/{chunk-MQG7RV3B.js.map → chunk-T7OXJZCX.js.map} +0 -0
  1094. /package/dist/{chunk-2T7DX6KR.js.map → chunk-TAT5USZN.js.map} +0 -0
  1095. /package/dist/{chunk-ICX64J4U.js.map → chunk-TPQTRNER.js.map} +0 -0
  1096. /package/dist/{chunk-D2TOWEYH.js.map → chunk-TUIN4MB7.js.map} +0 -0
  1097. /package/dist/{chunk-LQDUHU3Y.js.map → chunk-TX3VECZU.js.map} +0 -0
  1098. /package/dist/{chunk-TG7DADJR.js.map → chunk-TXLIEOJX.js.map} +0 -0
  1099. /package/dist/{chunk-2ZVRJRXC.js.map → chunk-U3DN4HEY.js.map} +0 -0
  1100. /package/dist/{chunk-PSMAWRPL.js.map → chunk-U7XM7CB4.js.map} +0 -0
  1101. /package/dist/{chunk-4TQL3WP2.js.map → chunk-UJK53QFL.js.map} +0 -0
  1102. /package/dist/{chunk-RBRX5ZS3.js.map → chunk-UMTXA2TH.js.map} +0 -0
  1103. /package/dist/{chunk-36MIDGAH.js.map → chunk-UPDSXFK5.js.map} +0 -0
  1104. /package/dist/{chunk-OYXBFSGK.js.map → chunk-UTIAXH52.js.map} +0 -0
  1105. /package/dist/{chunk-5WUN7XPD.js.map → chunk-UVN5TMHU.js.map} +0 -0
  1106. /package/dist/{chunk-UYE47LO6.js.map → chunk-VGYXW3VG.js.map} +0 -0
  1107. /package/dist/{chunk-IKUNOX7F.js.map → chunk-VS7AHPCZ.js.map} +0 -0
  1108. /package/dist/{chunk-MYUFMVCH.js.map → chunk-VTTAJOQ7.js.map} +0 -0
  1109. /package/dist/{chunk-K63HGHZX.js.map → chunk-VWPOLUAO.js.map} +0 -0
  1110. /package/dist/{chunk-GA4YEAMX.js.map → chunk-X3MWB2QU.js.map} +0 -0
  1111. /package/dist/{chunk-I36GSRUJ.js.map → chunk-X6KAJI3V.js.map} +0 -0
  1112. /package/dist/{chunk-IKMUFDVS.js.map → chunk-XBLRHV5R.js.map} +0 -0
  1113. /package/dist/{chunk-XOSQP3YA.js.map → chunk-XDFP2LMW.js.map} +0 -0
  1114. /package/dist/{chunk-MW7Y3T55.js.map → chunk-XEQMZB3C.js.map} +0 -0
  1115. /package/dist/{chunk-B3LMRTRF.js.map → chunk-XEYLT5VA.js.map} +0 -0
  1116. /package/dist/{chunk-UI4HI5QK.js.map → chunk-XHIQ5I6N.js.map} +0 -0
  1117. /package/dist/{chunk-U6M4LS3M.js.map → chunk-XLH7QY2R.js.map} +0 -0
  1118. /package/dist/{chunk-OSA5EQG5.js.map → chunk-XWFAMUZQ.js.map} +0 -0
  1119. /package/dist/{chunk-6MT3HHUB.js.map → chunk-Y4OBB2VN.js.map} +0 -0
  1120. /package/dist/{chunk-CZP5QXNB.js.map → chunk-YCVD6CI3.js.map} +0 -0
  1121. /package/dist/{chunk-APW4T4SW.js.map → chunk-YENLNISG.js.map} +0 -0
  1122. /package/dist/{chunk-JWPA6ZPZ.js.map → chunk-YIRVLKAX.js.map} +0 -0
  1123. /package/dist/{chunk-LQ62ECE6.js.map → chunk-YL73CVNK.js.map} +0 -0
  1124. /package/dist/{chunk-ILKDYBON.js.map → chunk-YLS6QE5G.js.map} +0 -0
  1125. /package/dist/{chunk-YBKVGLQR.js.map → chunk-YPWU5KPE.js.map} +0 -0
  1126. /package/dist/{chunk-IKJLSBUI.js.map → chunk-YQXTDZSU.js.map} +0 -0
  1127. /package/dist/{chunk-TPMZBOFH.js.map → chunk-YSJEAAOL.js.map} +0 -0
  1128. /package/dist/{chunk-W3BFRR2G.js.map → chunk-YWIFM7D7.js.map} +0 -0
  1129. /package/dist/{chunk-WTJ4PLMU.js.map → chunk-YWVI6ZMK.js.map} +0 -0
  1130. /package/dist/{chunk-5KWMYPJV.js.map → chunk-Z4FMAFNH.js.map} +0 -0
  1131. /package/dist/{chunk-W5OWKVZG.js.map → chunk-Z654FWNU.js.map} +0 -0
  1132. /package/dist/{chunk-5FH5LQVS.js.map → chunk-Z7Y523PS.js.map} +0 -0
  1133. /package/dist/{chunk-HLL4PBO7.js.map → chunk-ZD67RM6G.js.map} +0 -0
  1134. /package/dist/{chunk-IVYJX3OY.js.map → chunk-ZEG4VPBL.js.map} +0 -0
  1135. /package/dist/{chunk-K6R5T44I.js.map → chunk-ZLYCOBHW.js.map} +0 -0
  1136. /package/dist/{chunk-VADHIT26.js.map → chunk-ZNJ5MTXV.js.map} +0 -0
  1137. /package/dist/{chunk-2KYQC4T5.js.map → chunk-ZSGY3H53.js.map} +0 -0
  1138. /package/dist/{chunk-BKP43KK4.js.map → chunk-ZTPXACWB.js.map} +0 -0
  1139. /package/dist/{chunk-JCY4CMDH.js.map → chunk-ZUA3JMI6.js.map} +0 -0
  1140. /package/dist/{chunk-IGVVXLKJ.js.map → chunk-ZYAZUPPV.js.map} +0 -0
  1141. /package/dist/{computer-viewer-LPZ763KF.js.map → computer-viewer-TDDO25AV.js.map} +0 -0
  1142. /package/dist/{embedded-new-voice-YVMKSLKJ.js.map → embedded-new-voice-2G3VLPVQ.js.map} +0 -0
  1143. /package/dist/{embedded-voice-BJPQFXSU.js.map → embedded-voice-T5IWOWGD.js.map} +0 -0
  1144. /package/dist/{fleet-decision-row-AA4H5CDT.js.map → fleet-decision-row-WM64KXP3.js.map} +0 -0
  1145. /package/dist/{model-policy-picker-menu-HSMWVO4P.js.map → model-policy-picker-menu-SMC6J6QN.js.map} +0 -0
  1146. /package/dist/{payment-page-card-3LTSFJGN.js.map → payment-page-card-G4U63KUV.js.map} +0 -0
  1147. /package/dist/{platform-activity-row-5VYV6TX4.js.map → platform-activity-row-BUZGZAKZ.js.map} +0 -0
  1148. /package/dist/{queue-surface-implementation-NXHZUKD2.js.map → queue-surface-implementation-4KUZ4PJV.js.map} +0 -0
  1149. /package/dist/{sandbox-files-YCMLQUFU.js.map → sandbox-files-ESDMOFSD.js.map} +0 -0
  1150. /package/dist/{session-connect-cards-KSQLMRM5.js.map → session-connect-cards-Q53KMMYY.js.map} +0 -0
  1151. /package/dist/{session-realtime-ZR6JLG3Y.js.map → session-realtime-CF3I35WJ.js.map} +0 -0
  1152. /package/dist/{timeline-annotation-markers-YAHDPWVG.js.map → timeline-annotation-markers-CJK4RYZ4.js.map} +0 -0
  1153. /package/dist/{timeline-annotation-selection-KHXNCEJP.js.map → timeline-annotation-selection-67GF5H26.js.map} +0 -0
  1154. /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-5KWMYPJV.js";
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-TNUSPXPW.js";
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-K42OUZQ3.js";
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-TNUSPXPW.js";
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