@corti/dictation-web 0.7.0-ambient.9 → 0.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 (242) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +110 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/{bundle.js → dist/bundle.js} +4459 -4823
  5. package/{components → dist/components}/corti-dictation.d.ts +3 -3
  6. package/{components → dist/components}/corti-dictation.js +5 -4
  7. package/dist/components/corti-dictation.js.map +1 -0
  8. package/dist/components/dictation-device-selector.d.ts +8 -0
  9. package/dist/components/dictation-device-selector.js +15 -0
  10. package/dist/components/dictation-device-selector.js.map +1 -0
  11. package/dist/components/dictation-keybinding-selector.d.ts +8 -0
  12. package/dist/components/dictation-keybinding-selector.js +15 -0
  13. package/dist/components/dictation-keybinding-selector.js.map +1 -0
  14. package/dist/components/dictation-language-selector.d.ts +8 -0
  15. package/dist/components/dictation-language-selector.js +15 -0
  16. package/dist/components/dictation-language-selector.js.map +1 -0
  17. package/{components → dist/components}/dictation-recording-button.d.ts +2 -1
  18. package/{components → dist/components}/dictation-recording-button.js +9 -4
  19. package/dist/components/dictation-recording-button.js.map +1 -0
  20. package/dist/components/dictation-settings-menu.d.ts +15 -0
  21. package/dist/components/dictation-settings-menu.js +34 -0
  22. package/dist/components/dictation-settings-menu.js.map +1 -0
  23. package/dist/constants.d.ts +2 -0
  24. package/dist/constants.js +6 -0
  25. package/dist/constants.js.map +1 -0
  26. package/{contexts → dist/contexts}/dictation-context.d.ts +1 -1
  27. package/{contexts → dist/contexts}/dictation-context.js +4 -3
  28. package/dist/contexts/dictation-context.js.map +1 -0
  29. package/{controllers → dist/controllers}/dictation-controller.d.ts +4 -4
  30. package/{controllers → dist/controllers}/dictation-controller.js +1 -1
  31. package/dist/controllers/dictation-controller.js.map +1 -0
  32. package/dist/core/.tsbuildinfo +1 -0
  33. package/{components → dist/core/components}/corti-root.d.ts +1 -1
  34. package/dist/core/components/corti-root.js.map +1 -0
  35. package/dist/core/components/device-selector-base.d.ts +9 -0
  36. package/{components/device-selector.js → dist/core/components/device-selector-base.js} +11 -17
  37. package/dist/core/components/device-selector-base.js.map +1 -0
  38. package/dist/core/components/keybinding-selector-base.d.ts +10 -0
  39. package/{components/keybinding-selector.js → dist/core/components/keybinding-selector-base.js} +21 -21
  40. package/dist/core/components/keybinding-selector-base.js.map +1 -0
  41. package/dist/core/components/language-selector-base.d.ts +10 -0
  42. package/{components/language-selector.js → dist/core/components/language-selector-base.js} +11 -18
  43. package/dist/core/components/language-selector-base.js.map +1 -0
  44. package/{components → dist/core/components}/recording-button-base.d.ts +10 -7
  45. package/{components → dist/core/components}/recording-button-base.js +17 -15
  46. package/dist/core/components/recording-button-base.js.map +1 -0
  47. package/dist/core/components/settings-menu-base.d.ts +13 -0
  48. package/{components/settings-menu.js → dist/core/components/settings-menu-base.js} +14 -36
  49. package/dist/core/components/settings-menu-base.js.map +1 -0
  50. package/{components/audio-visualiser.d.ts → dist/core/components/speech-audio-visualiser.d.ts} +3 -4
  51. package/{components/audio-visualiser.js → dist/core/components/speech-audio-visualiser.js} +11 -12
  52. package/dist/core/components/speech-audio-visualiser.js.map +1 -0
  53. package/{components/keybinding-input.d.ts → dist/core/components/speech-keybinding-input.d.ts} +3 -4
  54. package/{components/keybinding-input.js → dist/core/components/speech-keybinding-input.js} +22 -22
  55. package/dist/core/components/speech-keybinding-input.js.map +1 -0
  56. package/{constants.d.ts → dist/core/constants.d.ts} +0 -2
  57. package/{constants.js → dist/core/constants.js} +0 -14
  58. package/dist/core/constants.js.map +1 -0
  59. package/dist/core/contexts/mixins/auth-context.js.map +1 -0
  60. package/dist/core/contexts/mixins/devices-context.js.map +1 -0
  61. package/{contexts → dist/core/contexts}/mixins/keybindings-context.js +3 -2
  62. package/dist/core/contexts/mixins/keybindings-context.js.map +1 -0
  63. package/dist/core/contexts/mixins/languages-context.js.map +1 -0
  64. package/dist/core/contexts/mixins/proxy-context.js.map +1 -0
  65. package/dist/core/contexts/mixins/recording-state-context.js.map +1 -0
  66. package/dist/core/contexts/mixins/types.js.map +1 -0
  67. package/{contexts → dist/core/contexts}/root-context.d.ts +1 -1
  68. package/dist/core/contexts/root-context.js.map +1 -0
  69. package/dist/core/controllers/devices-controller.js.map +1 -0
  70. package/dist/core/controllers/keybinding-controller.js.map +1 -0
  71. package/dist/core/controllers/languages-controller.js.map +1 -0
  72. package/dist/core/controllers/media-controller.js.map +1 -0
  73. package/dist/core/controllers/socket-controller.js.map +1 -0
  74. package/{icons → dist/core/icons}/icons.d.ts +6 -6
  75. package/{icons → dist/core/icons}/icons.js +7 -7
  76. package/dist/core/icons/icons.js.map +1 -0
  77. package/dist/core/icons/index.js.map +1 -0
  78. package/dist/core/socket-messages.d.ts +4 -0
  79. package/dist/core/socket-messages.js +2 -0
  80. package/dist/core/socket-messages.js.map +1 -0
  81. package/dist/core/styles/audio-visualiser.js.map +1 -0
  82. package/dist/core/styles/buttons.js.map +1 -0
  83. package/dist/core/styles/callout.js.map +1 -0
  84. package/dist/core/styles/component-styles.js.map +1 -0
  85. package/dist/core/styles/keybinding-selector.js.map +1 -0
  86. package/dist/core/styles/recording-button.js.map +1 -0
  87. package/dist/core/styles/select.js.map +1 -0
  88. package/dist/core/styles/settings-menu.js.map +1 -0
  89. package/{types.d.ts → dist/core/types.d.ts} +0 -3
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/core/utils/auth.js.map +1 -0
  92. package/dist/core/utils/converters.js.map +1 -0
  93. package/dist/core/utils/custom-elements.d.ts +6 -0
  94. package/dist/core/utils/custom-elements.js +23 -0
  95. package/dist/core/utils/custom-elements.js.map +1 -0
  96. package/dist/core/utils/devices.js.map +1 -0
  97. package/dist/core/utils/events.js.map +1 -0
  98. package/dist/core/utils/keybinding.js.map +1 -0
  99. package/dist/core/utils/languages.js.map +1 -0
  100. package/dist/core/utils/media.js.map +1 -0
  101. package/dist/core/utils/token.js.map +1 -0
  102. package/dist/core/utils/validation.js.map +1 -0
  103. package/{index.d.ts → dist/index.d.ts} +6 -6
  104. package/dist/index.js +8 -0
  105. package/dist/index.js.map +1 -0
  106. package/package.json +19 -13
  107. package/.tsbuildinfo +0 -1
  108. package/components/ambient-recording-button.d.ts +0 -16
  109. package/components/ambient-recording-button.js +0 -68
  110. package/components/ambient-recording-button.js.map +0 -1
  111. package/components/ambient-virtual-mode-selector.d.ts +0 -14
  112. package/components/ambient-virtual-mode-selector.js +0 -69
  113. package/components/ambient-virtual-mode-selector.js.map +0 -1
  114. package/components/audio-visualiser.js.map +0 -1
  115. package/components/corti-ambient.d.ts +0 -35
  116. package/components/corti-ambient.js +0 -126
  117. package/components/corti-ambient.js.map +0 -1
  118. package/components/corti-dictation.js.map +0 -1
  119. package/components/corti-root.js.map +0 -1
  120. package/components/device-selector.d.ts +0 -15
  121. package/components/device-selector.js.map +0 -1
  122. package/components/dictation-recording-button.js.map +0 -1
  123. package/components/keybinding-input.js.map +0 -1
  124. package/components/keybinding-selector.d.ts +0 -15
  125. package/components/keybinding-selector.js.map +0 -1
  126. package/components/language-selector.d.ts +0 -16
  127. package/components/language-selector.js.map +0 -1
  128. package/components/recording-button-base.js.map +0 -1
  129. package/components/settings-menu.d.ts +0 -19
  130. package/components/settings-menu.js.map +0 -1
  131. package/constants.js.map +0 -1
  132. package/contexts/ambient-context.d.ts +0 -24
  133. package/contexts/ambient-context.js +0 -93
  134. package/contexts/ambient-context.js.map +0 -1
  135. package/contexts/dictation-context.js.map +0 -1
  136. package/contexts/mixins/auth-context.js.map +0 -1
  137. package/contexts/mixins/devices-context.js.map +0 -1
  138. package/contexts/mixins/keybindings-context.js.map +0 -1
  139. package/contexts/mixins/languages-context.js.map +0 -1
  140. package/contexts/mixins/proxy-context.js.map +0 -1
  141. package/contexts/mixins/recording-state-context.js.map +0 -1
  142. package/contexts/mixins/types.js.map +0 -1
  143. package/contexts/root-context.js.map +0 -1
  144. package/controllers/ambient-controller.d.ts +0 -16
  145. package/controllers/ambient-controller.js +0 -24
  146. package/controllers/ambient-controller.js.map +0 -1
  147. package/controllers/devices-controller.js.map +0 -1
  148. package/controllers/dictation-controller.js.map +0 -1
  149. package/controllers/keybinding-controller.js.map +0 -1
  150. package/controllers/languages-controller.js.map +0 -1
  151. package/controllers/media-controller.js.map +0 -1
  152. package/controllers/socket-controller.js.map +0 -1
  153. package/icons/icons.js.map +0 -1
  154. package/icons/index.js.map +0 -1
  155. package/index.js +0 -8
  156. package/index.js.map +0 -1
  157. package/styles/ambient-virtual-mode-selector.d.ts +0 -2
  158. package/styles/ambient-virtual-mode-selector.js +0 -101
  159. package/styles/ambient-virtual-mode-selector.js.map +0 -1
  160. package/styles/audio-visualiser.js.map +0 -1
  161. package/styles/buttons.js.map +0 -1
  162. package/styles/callout.js.map +0 -1
  163. package/styles/component-styles.js.map +0 -1
  164. package/styles/keybinding-selector.js.map +0 -1
  165. package/styles/recording-button.js.map +0 -1
  166. package/styles/select.js.map +0 -1
  167. package/styles/settings-menu.js.map +0 -1
  168. package/types.js.map +0 -1
  169. package/utils/auth.js.map +0 -1
  170. package/utils/converters.js.map +0 -1
  171. package/utils/custom-elements.d.ts +0 -6
  172. package/utils/custom-elements.js +0 -11
  173. package/utils/custom-elements.js.map +0 -1
  174. package/utils/devices.js.map +0 -1
  175. package/utils/events.js.map +0 -1
  176. package/utils/keybinding.js.map +0 -1
  177. package/utils/languages.js.map +0 -1
  178. package/utils/media.js.map +0 -1
  179. package/utils/token.js.map +0 -1
  180. package/utils/validation.js.map +0 -1
  181. /package/{components → dist/core/components}/corti-root.js +0 -0
  182. /package/{contexts → dist/core/contexts}/mixins/auth-context.d.ts +0 -0
  183. /package/{contexts → dist/core/contexts}/mixins/auth-context.js +0 -0
  184. /package/{contexts → dist/core/contexts}/mixins/devices-context.d.ts +0 -0
  185. /package/{contexts → dist/core/contexts}/mixins/devices-context.js +0 -0
  186. /package/{contexts → dist/core/contexts}/mixins/keybindings-context.d.ts +0 -0
  187. /package/{contexts → dist/core/contexts}/mixins/languages-context.d.ts +0 -0
  188. /package/{contexts → dist/core/contexts}/mixins/languages-context.js +0 -0
  189. /package/{contexts → dist/core/contexts}/mixins/proxy-context.d.ts +0 -0
  190. /package/{contexts → dist/core/contexts}/mixins/proxy-context.js +0 -0
  191. /package/{contexts → dist/core/contexts}/mixins/recording-state-context.d.ts +0 -0
  192. /package/{contexts → dist/core/contexts}/mixins/recording-state-context.js +0 -0
  193. /package/{contexts → dist/core/contexts}/mixins/types.d.ts +0 -0
  194. /package/{contexts → dist/core/contexts}/mixins/types.js +0 -0
  195. /package/{contexts → dist/core/contexts}/root-context.js +0 -0
  196. /package/{controllers → dist/core/controllers}/devices-controller.d.ts +0 -0
  197. /package/{controllers → dist/core/controllers}/devices-controller.js +0 -0
  198. /package/{controllers → dist/core/controllers}/keybinding-controller.d.ts +0 -0
  199. /package/{controllers → dist/core/controllers}/keybinding-controller.js +0 -0
  200. /package/{controllers → dist/core/controllers}/languages-controller.d.ts +0 -0
  201. /package/{controllers → dist/core/controllers}/languages-controller.js +0 -0
  202. /package/{controllers → dist/core/controllers}/media-controller.d.ts +0 -0
  203. /package/{controllers → dist/core/controllers}/media-controller.js +0 -0
  204. /package/{controllers → dist/core/controllers}/socket-controller.d.ts +0 -0
  205. /package/{controllers → dist/core/controllers}/socket-controller.js +0 -0
  206. /package/{icons → dist/core/icons}/index.d.ts +0 -0
  207. /package/{icons → dist/core/icons}/index.js +0 -0
  208. /package/{styles → dist/core/styles}/audio-visualiser.d.ts +0 -0
  209. /package/{styles → dist/core/styles}/audio-visualiser.js +0 -0
  210. /package/{styles → dist/core/styles}/buttons.d.ts +0 -0
  211. /package/{styles → dist/core/styles}/buttons.js +0 -0
  212. /package/{styles → dist/core/styles}/callout.d.ts +0 -0
  213. /package/{styles → dist/core/styles}/callout.js +0 -0
  214. /package/{styles → dist/core/styles}/component-styles.d.ts +0 -0
  215. /package/{styles → dist/core/styles}/component-styles.js +0 -0
  216. /package/{styles → dist/core/styles}/keybinding-selector.d.ts +0 -0
  217. /package/{styles → dist/core/styles}/keybinding-selector.js +0 -0
  218. /package/{styles → dist/core/styles}/recording-button.d.ts +0 -0
  219. /package/{styles → dist/core/styles}/recording-button.js +0 -0
  220. /package/{styles → dist/core/styles}/select.d.ts +0 -0
  221. /package/{styles → dist/core/styles}/select.js +0 -0
  222. /package/{styles → dist/core/styles}/settings-menu.d.ts +0 -0
  223. /package/{styles → dist/core/styles}/settings-menu.js +0 -0
  224. /package/{types.js → dist/core/types.js} +0 -0
  225. /package/{utils → dist/core/utils}/auth.d.ts +0 -0
  226. /package/{utils → dist/core/utils}/auth.js +0 -0
  227. /package/{utils → dist/core/utils}/converters.d.ts +0 -0
  228. /package/{utils → dist/core/utils}/converters.js +0 -0
  229. /package/{utils → dist/core/utils}/devices.d.ts +0 -0
  230. /package/{utils → dist/core/utils}/devices.js +0 -0
  231. /package/{utils → dist/core/utils}/events.d.ts +0 -0
  232. /package/{utils → dist/core/utils}/events.js +0 -0
  233. /package/{utils → dist/core/utils}/keybinding.d.ts +0 -0
  234. /package/{utils → dist/core/utils}/keybinding.js +0 -0
  235. /package/{utils → dist/core/utils}/languages.d.ts +0 -0
  236. /package/{utils → dist/core/utils}/languages.js +0 -0
  237. /package/{utils → dist/core/utils}/media.d.ts +0 -0
  238. /package/{utils → dist/core/utils}/media.js +0 -0
  239. /package/{utils → dist/core/utils}/token.d.ts +0 -0
  240. /package/{utils → dist/core/utils}/token.js +0 -0
  241. /package/{utils → dist/core/utils}/validation.d.ts +0 -0
  242. /package/{utils → dist/core/utils}/validation.js +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"audio-visualiser.js","sourceRoot":"","sources":["../../../src/styles/audio-visualiser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,qBAAqB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BhC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["import { css } from \"lit\";\n\nconst AudioVisualiserStyles = css`\n :host {\n height: 100%;\n }\n\n .container {\n display: flex;\n width: 8px;\n flex-direction: column-reverse; /* Bottom-up stacking */\n height: 100%;\n gap: 1px;\n opacity: 0.5;\n\n &.active {\n opacity: 1;\n }\n }\n\n .segment {\n flex: 1;\n background-color: var(--action-accent-text-color, light-dark(#fff, #fff));\n transition: background-color 0.25s;\n border-radius: 1px;\n opacity: 0.5;\n }\n\n .segment.active {\n opacity: 1;\n }\n`;\n\nexport default AudioVisualiserStyles;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"buttons.js","sourceRoot":"","sources":["../../../src/styles/buttons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,YAAY,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CvB,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import { css } from \"lit\";\n\nconst ButtonStyles = css`\n /* Default (plain) button styling */\n button {\n background: var(--action-plain-background, transparent);\n /* border: 1px solid var(--action-plain-border-color); */\n border: none;\n color: var(--component-text-color, light-dark(#333, #eee));\n cursor: pointer;\n padding: 8px;\n border-radius: var(--card-inner-border-radius, 6px);\n display: inline-flex;\n gap: 4px;\n align-items: center;\n justify-content: center;\n transition: background 0.3s ease;\n }\n\n button:hover {\n background: var(--action-plain-background-hover, light-dark(#ddd, #444));\n }\n\n button:focus-visible {\n outline: 2px solid var(--action-accent-background, light-dark(#007bff, #0056b3));\n outline-offset: 2px;\n }\n\n /* Accent variant */\n button.accent {\n background: var(--action-accent-background, light-dark(#007bff, #0056b3));\n color: var(--action-accent-text-color, #fff);\n border: none;\n }\n\n button.accent:hover {\n background: var(--action-accent-background-hover, light-dark(#0056b3, #003d80));\n }\n\n /* Red variant */\n button.red {\n background: var(--action-red-background, light-dark(#dc3545, #bd2130));\n color: var(--action-red-text-color, #fff);\n border: none;\n }\n\n button.red:hover {\n background: var(--action-red-background-hover, light-dark(#bd2130, #a71c24));\n }\n`;\n\nexport default ButtonStyles;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"callout.js","sourceRoot":"","sources":["../../../src/styles/callout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,aAAa,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;CAmBxB,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { css } from \"lit\";\n\nconst CalloutStyles = css`\n .callout {\n background: var(--callout-info-background, light-dark(#007bff33, #0056b333));\n border: 1px solid var(--callout-info-border, light-dark(#007bff99, #0056b399));\n color: var(--callout-info-text, light-dark(#007bff, #0056b3));\n padding: 8px;\n border-radius: var(--card-inner-border-radius, 6px);\n display: flex;\n font-size: 0.9rem;\n gap: 8px;\n align-items: center;\n max-width: 100%;\n height: fit-content;\n &.warn {\n background: var(--callout-warn-background, light-dark(#fd7e1433, #e06c1233));\n border: 1px solid var(--callout-warn-border, light-dark(#fd7e1499, #e06c1299));\n color: var(--callout-warn-text, light-dark(#fd7e14, #e06c12));\n }\n }\n`;\n\nexport default CalloutStyles;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"component-styles.js","sourceRoot":"","sources":["../../../src/styles/component-styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,eAAe,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;CAkB1B,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAA;;;;;;;;;CAS7B,CAAC;AAEF,eAAe,eAAe,CAAC","sourcesContent":["import { css } from \"lit\";\n\nconst ComponentStyles = css`\n :host {\n font-family: var(--component-font-family, -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, Cantarell, Ubuntu, roboto, noto, helvetica, arial, sans-serif);\n }\n\n .wrapper {\n background-color: var(--card-background, light-dark(#fff, #333));\n border: 1px solid var(--card-border-color, light-dark(#ddd, #555));\n border-radius: var(--card-border-radius, 8px);\n box-shadow: var(--card-box-shadow, 0 2px 5px rgba(0, 0, 0, 0.1));\n padding: var(--card-padding, 4px);\n display: flex;\n gap: 4px;\n height: 46px;\n width: fit-content;\n box-sizing: border-box;\n overflow: hidden;\n }\n`;\n\nexport const LabelStyles = css`\n label {\n display: block;\n font-size: 0.8rem;\n padding-bottom: 0.5rem;\n font-weight: 500;\n color: var(--component-text-color, light-dark(#333, #eee));\n pointer-events: none;\n }\n`;\n\nexport default ComponentStyles;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"keybinding-selector.js","sourceRoot":"","sources":["../../../src/styles/keybinding-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,wBAAwB,GAAG;IAC/B,WAAW;IACX,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEJ;CACA,CAAC;AAEF,eAAe,wBAAwB,CAAC","sourcesContent":["import { css } from \"lit\";\nimport { LabelStyles } from \"./component-styles.js\";\n\nconst KeybindingSelectorStyles = [\n LabelStyles,\n css`\n :host {\n display: block;\n }\n .keybinding-selector-wrapper {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: var(--card-padding, 4px) 8px;\n background: var(--card-background, light-dark(#fff, #333));\n border: 1px solid var(--card-border-color, light-dark(#ddd, #555));\n border-radius: var(--card-inner-border-radius, 6px);\n overflow: hidden;\n }\n .keybinding-selector-wrapper:focus-within {\n border-color: var(--action-accent-background, light-dark(#007bff, #0056b3));\n outline: 2px solid var(--action-accent-background, light-dark(#007bff, #0056b3));\n }\n .keybinding-selector-input {\n flex: 1;\n min-width: 0;\n border: none;\n background: transparent;\n line-height: 24px;\n color: var(--component-text-color, light-dark(#333, #eee));\n outline: none;\n padding: 0;\n cursor: text;\n }\n .keybinding-selector-input::placeholder {\n opacity: 0.6;\n color: var(--component-text-color, light-dark(#333, #eee));\n }\n .keybinding-selector-input:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n .keybinding-key {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 0.5rem;\n height: 24px;\n background: var(--card-background, light-dark(#fff, #333));\n border: 1px solid var(--card-border-color, light-dark(#ddd, #555));\n border-radius: var(--card-inner-border-radius, 6px);\n box-shadow: var(--card-box-shadow, 0 2px 5px rgba(0, 0, 0, 0.1));\n font-size: 14px;\n line-height: 24px;\n color: var(--component-text-color, light-dark(#333, #eee));\n opacity: 0.6;\n text-align: center;\n flex-shrink: 0;\n }\n .keybinding-help {\n font-size: 12px;\n line-height: 20px;\n color: var(--component-text-color, light-dark(#333, #eee));\n opacity: 0.6;\n margin: 0;\n letter-spacing: 0.01px;\n }\n .settings-group {\n background: var(--card-background, light-dark(#fafafa, #2a2a2a));\n padding: 12px;\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n`,\n];\n\nexport default KeybindingSelectorStyles;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"recording-button.js","sourceRoot":"","sources":["../../../src/styles/recording-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,qBAAqB,GAAG,GAAG,CAAA;;;;CAIhC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["import { css } from \"lit\";\n\nconst RecordingButtonStyles = css`\n :host {\n display: inline-flex;\n }\n`;\n\nexport default RecordingButtonStyles;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/styles/select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,YAAY,GAAG;IACnB,WAAW;IACX,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;CAwBJ;CACA,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import { css } from \"lit\";\nimport { LabelStyles } from \"./component-styles.js\";\n\nconst SelectStyles = [\n LabelStyles,\n css`\n select {\n background: var(--card-background, light-dark(#fff, #333));\n color: var(--component-text-color, light-dark(#333, #eee));\n border: 1px solid var(--card-border-color, light-dark(#ddd, #555));\n padding: var(--card-padding, 4px);\n border-radius: var(--card-inner-border-radius, 6px);\n outline: none;\n width: 100%;\n }\n\n select:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n select:hover {\n background: var(--action-plain-background-hover, light-dark(#ddd, #444));\n }\n\n select:focus-visible {\n outline: 2px solid var(--action-accent-background, light-dark(#007bff, #0056b3));\n /* outline-offset: 2px; */\n }\n`,\n];\n\nexport default SelectStyles;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-menu.js","sourceRoot":"","sources":["../../../src/styles/settings-menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,kBAAkB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B7B,CAAC;AAEF,eAAe,kBAAkB,CAAC","sourcesContent":["import { css } from \"lit\";\n\nconst SettingsMenuStyles = css`\n :host {\n display: block;\n }\n /* Retain the anchor-name styling for this component */\n #settings-popover-button {\n anchor-name: --settings_popover_btn;\n }\n [popover] {\n margin: 0;\n padding: 16px;\n background: var(--card-background, light-dark(#fff, #333));\n border: 1px solid var(--card-border-color, light-dark(#ddd, #555));\n border-radius: var(--card-border-radius, 8px);\n box-shadow: var(--card-box-shadow, 0 2px 5px rgba(0, 0, 0, 0.1));\n z-index: 1000;\n max-width: 260px;\n width: 100%;\n min-width: 200px;\n position-anchor: --settings_popover_btn;\n position-area: bottom span-right;\n position-visibility: always;\n position-try-fallbacks: flip-inline;\n overflow-x: hidden;\n }\n .settings-wrapper {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n`;\n\nexport default SettingsMenuStyles;\n"]}
package/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { StreamAmbientMessage } from \"./controllers/ambient-controller.js\";\nimport type { TranscribeMessage } from \"./controllers/dictation-controller.js\";\n\nexport type RecordingSocketInboundMessage =\n | TranscribeMessage\n | StreamAmbientMessage;\n\nexport type RecordingState =\n | \"initializing\"\n | \"recording\"\n | \"stopping\"\n | \"stopped\";\n\nexport type Keybinding = string;\n\nexport type ConfigurableSettings =\n | \"device\"\n | \"language\"\n | \"keybinding\"\n | \"virtualMode\";\n\nexport type ProxyOptions = {\n url: string;\n protocols?: string[];\n queryParameters?: Record<string, string>;\n};\n"]}
package/utils/auth.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/utils/auth.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoC;IAEpC,MAAM,YAAY,GAChB,aAAa,IAAI,MAAM;QACrB,CAAC,CAAC;YACE,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC;QACH,CAAC,CAAC,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;IAExC,IACE,CAAC,YAAY,EAAE,WAAW;QAC1B,OAAO,YAAY,CAAC,WAAW,KAAK,QAAQ,EAC5C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,OAAO;QACL,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,YAAY,EAAE,YAAY,CAAC,YAAY;KACxC,CAAC;AACJ,CAAC","sourcesContent":["import type { CortiAuth } from \"@corti/sdk\";\n\n/**\n * Extracts the initial access token from auth config\n * @throws Error if token is missing or invalid\n */\nexport async function getInitialToken(\n config: CortiAuth.AuthTokenDerivable,\n): Promise<{ accessToken: string; refreshToken?: string }> {\n const initialToken =\n \"accessToken\" in config\n ? {\n accessToken: config.accessToken,\n refreshToken: config.refreshToken,\n }\n : await config.refreshAccessToken();\n\n if (\n !initialToken?.accessToken ||\n typeof initialToken.accessToken !== \"string\"\n ) {\n throw new Error(\"Access token is required and must be a string\");\n }\n\n return {\n accessToken: initialToken.accessToken,\n refreshToken: initialToken.refreshToken,\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../src/utils/converters.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,aAAa,EAAE,CAAC,KAAoB,EAAE,EAAE,CACtC,KAAK;QACH,EAAE,KAAK,CAAC,GAAG,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;IACpB,WAAW,EAAE,CAAC,KAA2B,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;CAC/D,CAAC","sourcesContent":["export const commaSeparatedConverter = {\n fromAttribute: (value: string | null) =>\n value\n ?.split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n toAttribute: (value: string[] | undefined) => value?.join(\",\"),\n};\n"]}
@@ -1,6 +0,0 @@
1
- type CustomElementClass = CustomElementConstructor & {
2
- new (...args: unknown[]): HTMLElement;
3
- };
4
- /** Registers the class under both `dictation-*` and `ambient-*` tag names. */
5
- export declare const dualCustomElement: (dictationTag: string, ambientTag: string) => <T extends CustomElementClass>(target: T) => T;
6
- export {};
@@ -1,11 +0,0 @@
1
- /** Registers the class under both `dictation-*` and `ambient-*` tag names. */
2
- export const dualCustomElement = (dictationTag, ambientTag) => (target) => {
3
- if (!customElements.get(dictationTag)) {
4
- customElements.define(dictationTag, target);
5
- }
6
- if (!customElements.get(ambientTag)) {
7
- customElements.define(ambientTag, target);
8
- }
9
- return target;
10
- };
11
- //# sourceMappingURL=custom-elements.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"custom-elements.js","sourceRoot":"","sources":["../../../src/utils/custom-elements.ts"],"names":[],"mappings":"AAIA,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAC5B,CAAC,YAAoB,EAAE,UAAkB,EAAE,EAAE,CAC7C,CAA+B,MAAS,EAAK,EAAE;IAC7C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","sourcesContent":["type CustomElementClass = CustomElementConstructor & {\n new (...args: unknown[]): HTMLElement;\n};\n\n/** Registers the class under both `dictation-*` and `ambient-*` tag names. */\nexport const dualCustomElement =\n (dictationTag: string, ambientTag: string) =>\n <T extends CustomElementClass>(target: T): T => {\n if (!customElements.get(dictationTag)) {\n customElements.define(dictationTag, target);\n }\n\n if (!customElements.get(ambientTag)) {\n customElements.define(ambientTag, target);\n }\n\n return target;\n };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../../src/utils/devices.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC;YACzD,IAAI,EAAE,YAA8B;SACrC,CAAC,CAAC;QAEH,IAAI,gBAAgB,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACnC,KAAK,CAAC,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IAInC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,gBAAgB,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,YAAY,GAAG,MAAM,eAAe,EAAE,CAAC;IAE3C,IAAI,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,MAAM,cAAc,EAAE,CAAC;QACvB,YAAY,GAAG,MAAM,eAAe,EAAE,CAAC;IACzC,CAAC;IAED,OAAO;QACL,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;QAC9B,OAAO,EAAE,YAAY;KACtB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;IAChE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,eAAe,CAAC,WAA8B;IACrD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,CAAC,sDAAsD;IACtE,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;AACtE,CAAC","sourcesContent":["/**\n * Primes the document with an active microphone stream.\n *\n * Opens (and immediately stops) a media stream so the document holds an\n * active mic permission for this session. In Firefox this is what makes\n * real deviceIds and labels appear in subsequent enumerateDevices() calls.\n * Throws early if the user has already denied permission.\n *\n * @returns A promise that resolves once the stream has been opened and stopped.\n * @throws Error if microphone access is denied or unavailable.\n */\nexport async function primeMicStream(): Promise<void> {\n if (navigator.permissions) {\n const permissionStatus = await navigator.permissions.query({\n name: \"microphone\" as PermissionName,\n });\n\n if (permissionStatus.state === \"denied\") {\n throw new Error(\"Microphone permission is denied\");\n }\n }\n\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n\n stream.getTracks().forEach((track) => {\n track.stop();\n });\n}\n\n/**\n * Retrieves available audio input devices.\n *\n * Enumerates devices first; if the result looks like Firefox's pre-permission\n * placeholder (an entry with empty deviceId/label even though the Permissions\n * API reports access), primes the document with getUserMedia and re-enumerates.\n * Browsers that already return populated entries (Chrome, Safari) skip the\n * priming call entirely.\n *\n * @returns A promise that resolves with an object containing:\n * - `devices`: an array of MediaDeviceInfo objects for audio inputs.\n * - `defaultDevice`: the first audio input device, if available.\n * @throws Error if mediaDevices API is unavailable or device enumeration fails.\n */\nexport async function getAudioDevices(): Promise<{\n devices: MediaDeviceInfo[];\n defaultDevice?: MediaDeviceInfo;\n}> {\n if (!navigator.mediaDevices?.enumerateDevices) {\n throw new Error(\"MediaDevices API is not available\");\n }\n\n let audioDevices = await listAudioInputs();\n\n if (needsMicPriming(audioDevices)) {\n await primeMicStream();\n audioDevices = await listAudioInputs();\n }\n\n return {\n defaultDevice: audioDevices[0],\n devices: audioDevices,\n };\n}\n\nasync function listAudioInputs(): Promise<MediaDeviceInfo[]> {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === \"audioinput\");\n}\n\nfunction needsMicPriming(audioInputs: MediaDeviceInfo[]): boolean {\n if (audioInputs.length === 0) {\n return false; // no mic hardware — don't trigger a permission prompt\n }\n return audioInputs.some((d) => d.deviceId === \"\" || d.label === \"\");\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/utils/events.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport type { RecordingState } from \"../types.js\";\n\nexport type LanguagesChangedEventDetail = {\n languages: Corti.TranscribeSupportedLanguage[];\n selectedLanguage: string | undefined;\n};\n\nexport type LanguageChangedEventDetail = {\n language: string;\n};\n\nexport type RecordingDevicesChangedEventDetail = {\n devices: MediaDeviceInfo[];\n selectedDevice: MediaDeviceInfo | undefined;\n};\n\nexport type RecordingStateChangedEventDetail = {\n state: RecordingState;\n connection?: \"CONNECTING\" | \"OPEN\" | \"CLOSING\" | \"CLOSED\" | null;\n processing?: boolean;\n};\n\nexport type AudioLevelChangedEventDetail = {\n audioLevel: number;\n};\n\nexport type TranscriptEventDetail =\n | Corti.TranscribeTranscriptMessage\n | Corti.StreamTranscriptMessage;\n\nexport type CommandEventDetail = Corti.TranscribeCommandMessage;\n\nexport type UsageEventDetail =\n | Corti.TranscribeUsageMessage\n | Corti.StreamUsageMessage;\n\nexport type DeltaUsageEventDetail =\n | Corti.TranscribeDeltaUsageMessage\n | Corti.StreamDeltaUsageMessage;\n\nexport type FactsEventDetail = Corti.StreamFactsMessage;\n\nexport type AudioEventEventDetail =\n | Corti.TranscribeAudioEventMessage\n | Corti.StreamAudioEventMessage;\n\nexport type ErrorEventDetail = {\n message: string;\n};\n\nexport function languagesChangedEvent(\n languages: Corti.TranscribeSupportedLanguage[],\n selectedLanguage: string | undefined,\n): CustomEvent<LanguagesChangedEventDetail> {\n return new CustomEvent(\"languages-changed\", {\n bubbles: true,\n composed: true,\n detail: { languages, selectedLanguage },\n });\n}\n\n/**\n * @deprecated Use languagesChangedEvent instead. This event is kept for backward compatibility.\n */\nexport function languageChangedEvent(\n language: string,\n): CustomEvent<LanguageChangedEventDetail> {\n return new CustomEvent(\"language-changed\", {\n bubbles: true,\n composed: true,\n detail: { language },\n });\n}\n\nexport function recordingDevicesChangedEvent(\n devices: MediaDeviceInfo[],\n selectedDevice: MediaDeviceInfo | undefined,\n): CustomEvent<RecordingDevicesChangedEventDetail> {\n return new CustomEvent(\"recording-devices-changed\", {\n bubbles: true,\n composed: true,\n detail: { devices, selectedDevice },\n });\n}\n\nexport function recordingStateChangedEvent(\n state: RecordingState,\n options: Partial<{\n connection: \"CONNECTING\" | \"OPEN\" | \"CLOSING\" | \"CLOSED\" | null;\n processing: boolean;\n }> = {},\n): CustomEvent<RecordingStateChangedEventDetail> {\n return new CustomEvent(\"recording-state-changed\", {\n bubbles: true,\n composed: true,\n detail: {\n connection: options.connection,\n processing: options.processing,\n state,\n },\n });\n}\n\nexport function transcriptEvent(\n detail: TranscriptEventDetail,\n): CustomEvent<TranscriptEventDetail> {\n return new CustomEvent(\"transcript\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function commandEvent(\n detail: CommandEventDetail,\n): CustomEvent<CommandEventDetail> {\n return new CustomEvent(\"command\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function usageEvent(\n detail: UsageEventDetail,\n): CustomEvent<UsageEventDetail> {\n return new CustomEvent(\"usage\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function deltaUsageEvent(\n detail: DeltaUsageEventDetail,\n): CustomEvent<DeltaUsageEventDetail> {\n return new CustomEvent(\"delta-usage\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function factsEvent(\n detail: FactsEventDetail,\n): CustomEvent<FactsEventDetail> {\n return new CustomEvent(\"facts\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function audioEventEvent(\n detail: AudioEventEventDetail,\n): CustomEvent<AudioEventEventDetail> {\n return new CustomEvent(\"audio-event\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nfunction errorToMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === \"object\" && error !== null) {\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n }\n\n return String(error);\n}\n\nexport function errorEvent(error: unknown): CustomEvent<ErrorEventDetail> {\n const message = errorToMessage(error);\n\n return new CustomEvent(\"error\", {\n bubbles: false,\n composed: true,\n detail: { message },\n });\n}\n\n/**\n * @deprecated Use recording-state-changed event with detail.connection field instead.\n */\nexport function streamClosedEvent(detail: unknown): CustomEvent {\n return new CustomEvent(\"stream-closed\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function readyEvent(): CustomEvent {\n return new CustomEvent(\"ready\", {\n bubbles: true,\n composed: true,\n });\n}\n\nexport function audioLevelChangedEvent(\n audioLevel: number,\n): CustomEvent<AudioLevelChangedEventDetail> {\n return new CustomEvent(\"audio-level-changed\", {\n bubbles: true,\n composed: true,\n detail: { audioLevel },\n });\n}\n\nexport type NetworkActivityEventDetail = {\n direction: \"sent\" | \"received\";\n data: unknown;\n};\n\nexport function networkActivityEvent(\n direction: \"sent\" | \"received\",\n data: unknown,\n): CustomEvent<NetworkActivityEventDetail> {\n return new CustomEvent(\"network-activity\", {\n bubbles: true,\n composed: true,\n detail: { data, direction },\n });\n}\n\nexport type KeybindingChangedEventDetail = {\n key: string | null | undefined;\n code: string | null | undefined;\n keybinding: string | null;\n type?: \"push-to-talk\" | \"toggle-to-talk\";\n};\n\nexport type KeybindingActivatedEventDetail = {\n keyboardEvent: KeyboardEvent;\n};\n\nexport function keybindingChangedEvent(\n key: string | null | undefined,\n code: string | null | undefined,\n keybinding: string | null,\n type?: \"push-to-talk\" | \"toggle-to-talk\",\n): CustomEvent<KeybindingChangedEventDetail> {\n return new CustomEvent(\"keybinding-changed\", {\n bubbles: true,\n composed: true,\n detail: { code, key, keybinding, type },\n });\n}\n\nexport function keybindingActivatedEvent(\n keyboardEvent: KeyboardEvent,\n): CustomEvent<KeybindingActivatedEventDetail> {\n return new CustomEvent(\"keybinding-activated\", {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { keyboardEvent },\n });\n}\n\nexport type VirtualModeChangedEventDetail = {\n enabled: boolean;\n};\n\nexport function virtualModeChangedEvent(\n enabled: boolean,\n): CustomEvent<VirtualModeChangedEventDetail> {\n return new CustomEvent(\"virtual-mode-changed\", {\n bubbles: true,\n composed: true,\n detail: { enabled },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"keybinding.js","sourceRoot":"","sources":["../../../src/utils/keybinding.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Checks if the current platform is macOS.\n * Uses userAgent string for reliable cross-browser detection.\n *\n * @returns true if running on macOS\n */\nfunction isMac(): boolean {\n if (typeof navigator === \"undefined\") {\n return false;\n }\n\n // Check user agent for Mac patterns (most reliable method)\n return /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n}\n\n/**\n * Capitalizes the first letter of a string.\n *\n * @param str - String to capitalize\n * @returns String with first letter capitalized\n */\nfunction capitalize(str: string): string {\n if (str.length === 0) {\n return str;\n }\n\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Normalizes a key string to the keybinding format.\n * Handles platform-specific mappings and capitalization.\n *\n * @param key - Key string to normalize (will be trimmed and uppercased)\n * @returns Formatted key string for keybinding\n *\n * @example\n * normalizeKeyForKeybinding(\"Control\") // \"Ctrl\"\n * normalizeKeyForKeybinding(\"META\") // \"Cmd\" on Mac, \"Meta\" elsewhere\n * normalizeKeyForKeybinding(\" alt \") // \"Opt\" on Mac, \"Alt\" elsewhere\n * normalizeKeyForKeybinding(\"shift\") // \"Shift\"\n * normalizeKeyForKeybinding(\"k\") // \"K\"\n * normalizeKeyForKeybinding(\" \") // \"Space\"\n */\nfunction normalizeKeyForKeybinding(key: string): string {\n if (key === \" \") {\n return \"Space\";\n }\n\n const normalized = key.trim().toLowerCase();\n\n if (normalized === \"control\") {\n return \"Ctrl\";\n }\n if (normalized === \"meta\" || normalized === \"cmd\") {\n return isMac() ? \"Cmd\" : \"Meta\";\n }\n if (normalized === \"alt\" || normalized === \"opt\") {\n return isMac() ? \"Opt\" : \"Alt\";\n }\n if (normalized === \"space\") {\n return \"Space\";\n }\n\n // TODO: Uncomment this for v1 to avoid breaking changes now\n // Capitalize single letters (a-z) for consistent display\n // if (/^[a-z]$/.test(normalized)) {\n // return normalized.toUpperCase();\n // }\n\n return normalized.length > 1 ? capitalize(normalized) : normalized;\n}\n\n/**\n * Normalizes a keybinding string.\n *\n * @param keybinding - Keybinding string to normalize\n * @returns Normalized keybinding string or null if empty\n *\n * @example\n * normalizeKeybinding(\"k\") // \"K\"\n * normalizeKeybinding(\"meta\") // \"Cmd\" on Mac\n * normalizeKeybinding(\" \") // \"Space\"\n * normalizeKeybinding(\" space \") // \"Space\"\n */\nexport function normalizeKeybinding(\n keybinding: string | null | undefined,\n): string | null {\n if (!keybinding) {\n return null;\n }\n if (keybinding !== \" \" && keybinding.trim() === \"\") {\n return null;\n }\n\n return normalizeKeyForKeybinding(keybinding);\n}\n\n/**\n * Checks if a pressed key matches the keybinding.\n * Checks both event.key and event.code for better reliability.\n *\n * @param event - KeyboardEvent to check\n * @param keybinding - Keybinding string to match against\n * @returns true if either the key or code matches the keybinding\n *\n * @example\n * matchesKeybinding(event, \"k\") // true if event.key is \"k\" or event.code is \"KeyK\"\n * matchesKeybinding(event, \"`\") // true if event.key is \"`\" or event.code is \"Backquote\"\n */\nexport function matchesKeybinding(\n event: KeyboardEvent,\n keybinding: string | null | undefined,\n): boolean {\n const normalizedKeybinding = normalizeKeybinding(keybinding);\n\n if (!normalizedKeybinding) {\n return false;\n }\n\n const normalizedKey = normalizeKeyForKeybinding(event.key);\n const normalizedCode = normalizeKeyForKeybinding(event.code);\n\n return (\n normalizedKey === normalizedKeybinding ||\n normalizedCode === normalizedKeybinding\n );\n}\n\n/**\n * Checks if keybindings should be ignored for the current active element.\n * Returns true if the user is typing in an input field.\n *\n * @param element - Element to check\n * @returns true if keybindings should be ignored for this element\n *\n * @example\n * shouldIgnoreKeybinding(document.activeElement) // true if input/textarea/contenteditable\n */\nexport function shouldIgnoreKeybinding(element: Element | null): boolean {\n if (!element) {\n return false;\n }\n\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === \"input\" || tagName === \"textarea\") {\n return true;\n }\n\n if (element instanceof HTMLElement && element.contentEditable === \"true\") {\n return true;\n }\n\n return false;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"languages.js","sourceRoot":"","sources":["../../../src/utils/languages.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,CAAC,MAAM,2BAA2B,GAGpC;IACF,OAAO,EAAE,sBAAsB;IAC/B,EAAE,EAAE,sBAAsB;IAC1B,EAAE,EAAE,sBAAsB;CAC3B,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,YAAoB;IAClD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC;QAC9C,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,EAAE;YACvD,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAEnD,OAAO,YAAY,IAAI,YAAY,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,YAAiD,EAAE;IAEnD,OAAO,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,IAAI,CACpD,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,SAAS,CAC7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,YAAiD,EAAE;IAEnD,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAe;IAIlD,MAAM,SAAS,GACb,2BAA2B,CAAC,MAAM,IAAI,SAAS,CAAC;QAChD,2BAA2B,CAAC,OAAO,CAAC;IACtC,MAAM,eAAe,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;IAE/D,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport {\n LANGUAGES_SUPPORTED_EU,\n LANGUAGES_SUPPORTED_US,\n} from \"../constants.js\";\n\nexport const DEFAULT_LANGUAGES_BY_REGION: Record<\n string,\n Corti.TranscribeSupportedLanguage[]\n> = {\n default: LANGUAGES_SUPPORTED_EU,\n eu: LANGUAGES_SUPPORTED_EU,\n us: LANGUAGES_SUPPORTED_US,\n};\n\nexport function getLanguageName(languageCode: string): string {\n try {\n const userLocale = navigator.language || \"en\";\n const displayNames = new Intl.DisplayNames([userLocale], {\n type: \"language\",\n });\n const languageName = displayNames.of(languageCode);\n\n return languageName || languageCode;\n } catch {\n return languageCode;\n }\n}\n\nexport function checkIfDefaultLanguagesList(\n languages: Corti.TranscribeSupportedLanguage[] = [],\n): boolean {\n return Object.values(DEFAULT_LANGUAGES_BY_REGION).some(\n (languageList) => languageList === languages,\n );\n}\n\nexport function getPreferredDefaultLanguage(\n languages: Corti.TranscribeSupportedLanguage[] = [],\n): Corti.TranscribeSupportedLanguage | undefined {\n if (languages.includes(\"en\")) {\n return \"en\";\n }\n\n if (languages.includes(\"en-GB\")) {\n return \"en-GB\";\n }\n\n return languages[0];\n}\n\nexport function getLanguagesByRegion(region?: string): {\n languages: Corti.TranscribeSupportedLanguage[];\n defaultLanguage: string | undefined;\n} {\n const languages =\n DEFAULT_LANGUAGES_BY_REGION[region || \"default\"] ??\n DEFAULT_LANGUAGES_BY_REGION.default;\n const defaultLanguage = getPreferredDefaultLanguage(languages);\n\n return { defaultLanguage, languages };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/utils/media.ts"],"names":[],"mappings":"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","sourcesContent":["export type MediaCaptureResult = {\n stream: MediaStream;\n sourceStreams: MediaStream[];\n cleanupContext?: AudioContext;\n};\n\nasync function getMicStream(deviceId?: string): Promise<MediaStream> {\n if (!deviceId) {\n throw new Error(\"No device ID provided\");\n }\n\n const constraints: MediaStreamConstraints =\n deviceId !== \"default\"\n ? { audio: { deviceId: { exact: deviceId } } }\n : { audio: true };\n\n return await navigator.mediaDevices.getUserMedia(constraints);\n}\n\nasync function getDisplayAudioStream(): Promise<MediaStream> {\n const stream = await navigator.mediaDevices.getDisplayMedia({\n audio: true,\n video: true,\n });\n\n if (stream.getAudioTracks().length === 0) {\n stream.getTracks().forEach((track) => {\n track.stop();\n });\n throw new Error(\n \"Virtual mode requires sharing audio. The selected source did not include audio.\",\n );\n }\n\n stream.getVideoTracks().forEach((track) => {\n stream.removeTrack(track);\n track.stop();\n });\n\n return stream;\n}\n\nfunction mixAudioStreams(\n micStream: MediaStream,\n displayStream: MediaStream,\n): {\n stream: MediaStream;\n cleanupContext: AudioContext;\n} {\n const audioContext = new AudioContext();\n const destination = audioContext.createMediaStreamDestination();\n const merger = audioContext.createChannelMerger(2);\n\n merger.connect(destination);\n\n const microphoneSource = audioContext.createMediaStreamSource(micStream);\n microphoneSource.connect(merger, 0, 0);\n\n const systemSource = audioContext.createMediaStreamSource(displayStream);\n systemSource.connect(merger, 0, 1);\n\n return {\n cleanupContext: audioContext,\n stream: destination.stream,\n };\n}\n\nexport async function getMediaStream(\n deviceId?: string,\n virtualMode?: boolean,\n debug_displayAudio?: boolean,\n): Promise<MediaCaptureResult> {\n if (virtualMode) {\n const micStream = await getMicStream(deviceId);\n try {\n const displayStream = await getDisplayAudioStream();\n const mixed = mixAudioStreams(micStream, displayStream);\n return {\n cleanupContext: mixed.cleanupContext,\n sourceStreams: [micStream, displayStream],\n stream: mixed.stream,\n };\n } catch (error) {\n micStream.getTracks().forEach((track) => {\n track.stop();\n });\n throw error;\n }\n }\n\n if (debug_displayAudio) {\n const displayStream = await getDisplayAudioStream();\n return {\n sourceStreams: [displayStream],\n stream: displayStream,\n };\n }\n\n const micStream = await getMicStream(deviceId);\n return {\n sourceStreams: [micStream],\n stream: micStream,\n };\n}\n\nexport function createAudioAnalyzer(mediaStream: MediaStream): {\n audioContext: AudioContext;\n analyser: AnalyserNode;\n} {\n const audioContext = new AudioContext();\n const source = audioContext.createMediaStreamSource(mediaStream);\n const analyser = audioContext.createAnalyser();\n\n analyser.fftSize = 8192;\n\n source.connect(analyser);\n\n return { analyser, audioContext };\n}\n\nexport function calculateAudioLevel(analyser: AnalyserNode): number {\n const dataArray = new Uint8Array(analyser.fftSize);\n analyser.getByteTimeDomainData(dataArray);\n\n const sumSquares = Array.from(dataArray).reduce((sum, value) => {\n const normalized = (value - 128) / 128;\n return sum + normalized * normalized;\n }, 0);\n\n return Math.sqrt(sumSquares / dataArray.length);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/utils/token.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,kFAAkF;IAClF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,sDAAsD;IACtD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,gEAAgE;IAChE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE/D,8CAA8C;IAC9C,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,kBAAkB,CAC9B,IAAI,CAAC,MAAM,CAAC;aACT,KAAK,CAAC,EAAE,CAAC;aACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aACjE,IAAI,CAAC,EAAE,CAAC,CACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,gDAAgD;IAChD,IAAI,YAAmE,CAAC;IACxE,IAAI,CAAC;QACH,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,gDAAgD;IAChD,MAAM,SAAS,GAAW,YAAY,CAAC,GAAG,CAAC;IAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,2DAA2D;IAC3D,4EAA4E;IAC5E,MAAM,KAAK,GACT,kEAAkE,CAAC;IACrE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAErC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,mGAAmG;IACnG,MAAM,SAAS,GACb,YAAY,CAAC,GAAG,IAAI,OAAO,YAAY,CAAC,GAAG,KAAK,QAAQ;QACtD,CAAC,CAAC,YAAY,CAAC,GAAG;QAClB,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;QACrB,SAAS;QACT,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;KACjB,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Decodes a JWT token and extracts environment and tenant information.\n *\n * @param token - The JWT token to decode\n * @returns Object containing environment, tenant, accessToken, and expiresAt\n * @throws Error if token format is invalid or cannot be decoded\n */\nexport function decodeToken(token: string) {\n // Validate the token structure (should contain at least header and payload parts)\n const parts = token.split(\".\");\n if (parts.length < 2) {\n throw new Error(\"Invalid token format\");\n }\n\n // Retrieve the payload (second part) of the JWT token\n const base64Url = parts[1];\n\n // Replace URL-safe characters to match standard base64 encoding\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n // Decode the base64 string into a JSON string\n let jsonPayload: string;\n try {\n jsonPayload = decodeURIComponent(\n atob(base64)\n .split(\"\")\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\n .join(\"\"),\n );\n } catch (error) {\n throw new Error(\"Failed to decode token payload\");\n }\n\n // Parse the JSON string to obtain token details\n let tokenDetails: { iss: string; exp?: number; [key: string]: unknown };\n try {\n tokenDetails = JSON.parse(jsonPayload);\n } catch (error) {\n throw new Error(\"Invalid JSON payload in token\");\n }\n\n // Extract the issuer URL from the token details\n const issuerUrl: string = tokenDetails.iss;\n if (!issuerUrl) {\n throw new Error(\"Token payload does not contain an issuer (iss) field\");\n }\n\n // Regex to extract environment and tenant from issuer URL:\n // Expected format: https://keycloak.{environment}.corti.app/realms/{tenant}\n const regex =\n /^https:\\/\\/(keycloak|auth)\\.([^.]+)\\.corti\\.app\\/realms\\/([^/]+)/;\n const match = issuerUrl.match(regex);\n\n if (!match) {\n throw new Error(\"Access token does not match expected format\");\n }\n\n // If the issuer URL matches the expected pattern, return the extracted values along with the token\n const expiresAt =\n tokenDetails.exp && typeof tokenDetails.exp === \"number\"\n ? tokenDetails.exp\n : undefined;\n\n return {\n accessToken: token,\n environment: match[2],\n expiresAt,\n tenant: match[3],\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,MAAc,CAAC,EACf,MAAc,CAAC;IAEf,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["export function normalizeToRange(\n value: number,\n min: number = 0,\n max: number = 1,\n): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return min;\n }\n\n return Math.max(min, Math.min(max, value));\n}\n"]}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes