@happyvertical/smrt-svelte 0.55.6 → 0.55.8

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 (318) hide show
  1. package/AGENTS.md +9 -31
  2. package/README.md +195 -5
  3. package/agents/browser-ai.md +47 -0
  4. package/agents/command-palette.md +85 -0
  5. package/agents/import-export.md +62 -0
  6. package/agents/overview-surfaces.md +255 -0
  7. package/agents/screens.md +57 -0
  8. package/agents/workspace.md +202 -5
  9. package/dist/browser-ai/adapters/stt/dictation-source.d.ts.map +1 -1
  10. package/dist/browser-ai/adapters/stt/dictation-source.js +8 -2
  11. package/dist/browser-ai/adapters/stt/factory.d.ts +6 -3
  12. package/dist/browser-ai/adapters/stt/factory.d.ts.map +1 -1
  13. package/dist/browser-ai/adapters/stt/factory.js +19 -9
  14. package/dist/browser-ai/adapters/stt/index.d.ts +3 -1
  15. package/dist/browser-ai/adapters/stt/index.d.ts.map +1 -1
  16. package/dist/browser-ai/adapters/stt/index.js +3 -1
  17. package/dist/browser-ai/adapters/stt/local-speech-model.d.ts +111 -0
  18. package/dist/browser-ai/adapters/stt/local-speech-model.d.ts.map +1 -0
  19. package/dist/browser-ai/adapters/stt/local-speech-model.js +377 -0
  20. package/dist/browser-ai/adapters/stt/local-speech.d.ts +82 -0
  21. package/dist/browser-ai/adapters/stt/local-speech.d.ts.map +1 -0
  22. package/dist/browser-ai/adapters/stt/local-speech.js +317 -0
  23. package/dist/browser-ai/adapters/stt/local-speech.worker.d.ts +2 -0
  24. package/dist/browser-ai/adapters/stt/local-speech.worker.d.ts.map +1 -0
  25. package/dist/browser-ai/adapters/stt/local-speech.worker.js +32 -0
  26. package/dist/browser-ai/adapters/stt/transformers-env.d.ts +8 -0
  27. package/dist/browser-ai/adapters/stt/transformers-env.d.ts.map +1 -0
  28. package/dist/browser-ai/adapters/stt/transformers-env.js +17 -0
  29. package/dist/browser-ai/adapters/stt/types.d.ts +54 -9
  30. package/dist/browser-ai/adapters/stt/types.d.ts.map +1 -1
  31. package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts +5 -0
  32. package/dist/browser-ai/adapters/tts/browser-synthesis.d.ts.map +1 -1
  33. package/dist/browser-ai/adapters/tts/browser-synthesis.js +83 -55
  34. package/dist/browser-ai/capabilities/speech-probe.d.ts +29 -0
  35. package/dist/browser-ai/capabilities/speech-probe.d.ts.map +1 -0
  36. package/dist/browser-ai/capabilities/speech-probe.js +19 -0
  37. package/dist/browser-ai/core/errors.d.ts +9 -0
  38. package/dist/browser-ai/core/errors.d.ts.map +1 -1
  39. package/dist/browser-ai/core/errors.js +12 -0
  40. package/dist/browser-ai/index.d.ts +1 -0
  41. package/dist/browser-ai/index.d.ts.map +1 -1
  42. package/dist/browser-ai/index.js +1 -0
  43. package/dist/components/app/AppShell.svelte +587 -33
  44. package/dist/components/app/AppShell.svelte.d.ts +75 -4
  45. package/dist/components/app/AppShell.svelte.d.ts.map +1 -1
  46. package/dist/components/app/DockToggles.svelte +0 -1
  47. package/dist/components/app/dock-toggle.d.ts +7 -1
  48. package/dist/components/app/dock-toggle.d.ts.map +1 -1
  49. package/dist/components/app/index.d.ts +2 -1
  50. package/dist/components/app/index.d.ts.map +1 -1
  51. package/dist/components/app/slot-item.d.ts +21 -0
  52. package/dist/components/app/slot-item.d.ts.map +1 -0
  53. package/dist/components/app/slot-item.js +1 -0
  54. package/dist/components/command-palette/CommandPalette.svelte +75 -0
  55. package/dist/components/command-palette/CommandPalette.svelte.d.ts +22 -0
  56. package/dist/components/command-palette/CommandPalette.svelte.d.ts.map +1 -0
  57. package/dist/components/command-palette/CommandPaletteDialog.svelte +406 -0
  58. package/dist/components/command-palette/CommandPaletteDialog.svelte.d.ts +18 -0
  59. package/dist/components/command-palette/CommandPaletteDialog.svelte.d.ts.map +1 -0
  60. package/dist/components/command-palette/CommandPaletteTrigger.svelte +91 -0
  61. package/dist/components/command-palette/CommandPaletteTrigger.svelte.d.ts +17 -0
  62. package/dist/components/command-palette/CommandPaletteTrigger.svelte.d.ts.map +1 -0
  63. package/dist/components/command-palette/context.d.ts +18 -0
  64. package/dist/components/command-palette/context.d.ts.map +1 -0
  65. package/dist/components/command-palette/context.js +38 -0
  66. package/dist/components/command-palette/controller.svelte.d.ts +70 -0
  67. package/dist/components/command-palette/controller.svelte.d.ts.map +1 -0
  68. package/dist/components/command-palette/controller.svelte.js +379 -0
  69. package/dist/components/command-palette/hotkeys.d.ts +30 -0
  70. package/dist/components/command-palette/hotkeys.d.ts.map +1 -0
  71. package/dist/components/command-palette/hotkeys.js +161 -0
  72. package/dist/components/command-palette/index.d.ts +19 -0
  73. package/dist/components/command-palette/index.d.ts.map +1 -0
  74. package/dist/components/command-palette/index.js +17 -0
  75. package/dist/components/command-palette/match.d.ts +38 -0
  76. package/dist/components/command-palette/match.d.ts.map +1 -0
  77. package/dist/components/command-palette/match.js +172 -0
  78. package/dist/components/command-palette/providers.d.ts +159 -0
  79. package/dist/components/command-palette/providers.d.ts.map +1 -0
  80. package/dist/components/command-palette/providers.js +345 -0
  81. package/dist/components/command-palette/rank.d.ts +20 -0
  82. package/dist/components/command-palette/rank.d.ts.map +1 -0
  83. package/dist/components/command-palette/rank.js +74 -0
  84. package/dist/components/command-palette/types.d.ts +119 -0
  85. package/dist/components/command-palette/types.d.ts.map +1 -0
  86. package/dist/components/command-palette/types.js +10 -0
  87. package/dist/components/command-palette/use-provider.svelte.d.ts +14 -0
  88. package/dist/components/command-palette/use-provider.svelte.d.ts.map +1 -0
  89. package/dist/components/command-palette/use-provider.svelte.js +23 -0
  90. package/dist/components/forms/AddressInput.svelte +2 -15
  91. package/dist/components/forms/AddressInput.svelte.d.ts.map +1 -1
  92. package/dist/components/forms/DateRangeInput.svelte +2 -15
  93. package/dist/components/forms/DateRangeInput.svelte.d.ts.map +1 -1
  94. package/dist/components/forms/DateTimeInput.svelte +8 -15
  95. package/dist/components/forms/DateTimeInput.svelte.d.ts.map +1 -1
  96. package/dist/components/forms/MeasurementInput.svelte +2 -15
  97. package/dist/components/forms/MeasurementInput.svelte.d.ts.map +1 -1
  98. package/dist/components/forms/MoneyInput.svelte +8 -25
  99. package/dist/components/forms/MoneyInput.svelte.d.ts.map +1 -1
  100. package/dist/components/forms/NumberInput.svelte +7 -15
  101. package/dist/components/forms/NumberInput.svelte.d.ts.map +1 -1
  102. package/dist/components/forms/PhoneInput.svelte +7 -15
  103. package/dist/components/forms/PhoneInput.svelte.d.ts.map +1 -1
  104. package/dist/components/forms/SelectInput.svelte +34 -40
  105. package/dist/components/forms/SelectInput.svelte.d.ts.map +1 -1
  106. package/dist/components/forms/TextInput.svelte +20 -37
  107. package/dist/components/forms/TextInput.svelte.d.ts.map +1 -1
  108. package/dist/components/forms/TextareaInput.svelte +19 -35
  109. package/dist/components/forms/TextareaInput.svelte.d.ts.map +1 -1
  110. package/dist/components/import-export/ImportExport.svelte +678 -0
  111. package/dist/components/import-export/ImportExport.svelte.d.ts +5 -0
  112. package/dist/components/import-export/ImportExport.svelte.d.ts.map +1 -0
  113. package/dist/components/import-export/collection-adapter.d.ts +35 -0
  114. package/dist/components/import-export/collection-adapter.d.ts.map +1 -0
  115. package/dist/components/import-export/collection-adapter.js +42 -0
  116. package/dist/components/import-export/csv.d.ts +60 -0
  117. package/dist/components/import-export/csv.d.ts.map +1 -0
  118. package/dist/components/import-export/csv.js +192 -0
  119. package/dist/components/import-export/download.d.ts +4 -0
  120. package/dist/components/import-export/download.d.ts.map +1 -0
  121. package/dist/components/import-export/download.js +17 -0
  122. package/dist/components/import-export/export.d.ts +25 -0
  123. package/dist/components/import-export/export.d.ts.map +1 -0
  124. package/dist/components/import-export/export.js +68 -0
  125. package/dist/components/import-export/fields.d.ts +48 -0
  126. package/dist/components/import-export/fields.d.ts.map +1 -0
  127. package/dist/components/import-export/fields.js +103 -0
  128. package/dist/components/import-export/index.d.ts +12 -0
  129. package/dist/components/import-export/index.d.ts.map +1 -0
  130. package/dist/components/import-export/index.js +9 -0
  131. package/dist/components/import-export/mapping.d.ts +12 -0
  132. package/dist/components/import-export/mapping.d.ts.map +1 -0
  133. package/dist/components/import-export/mapping.js +38 -0
  134. package/dist/components/import-export/props.d.ts +34 -0
  135. package/dist/components/import-export/props.d.ts.map +1 -0
  136. package/dist/components/import-export/props.js +1 -0
  137. package/dist/components/import-export/report.d.ts +13 -0
  138. package/dist/components/import-export/report.d.ts.map +1 -0
  139. package/dist/components/import-export/report.js +50 -0
  140. package/dist/components/import-export/runner.d.ts +17 -0
  141. package/dist/components/import-export/runner.d.ts.map +1 -0
  142. package/dist/components/import-export/runner.js +39 -0
  143. package/dist/components/import-export/types.d.ts +100 -0
  144. package/dist/components/import-export/types.d.ts.map +1 -0
  145. package/dist/components/import-export/types.js +6 -0
  146. package/dist/components/import-export/validate.d.ts +39 -0
  147. package/dist/components/import-export/validate.d.ts.map +1 -0
  148. package/dist/components/import-export/validate.js +268 -0
  149. package/dist/components/overview/OverviewGrid.svelte +579 -0
  150. package/dist/components/overview/OverviewGrid.svelte.d.ts +5 -0
  151. package/dist/components/overview/OverviewGrid.svelte.d.ts.map +1 -0
  152. package/dist/components/overview/WidgetOptionsForm.svelte +193 -0
  153. package/dist/components/overview/WidgetOptionsForm.svelte.d.ts +5 -0
  154. package/dist/components/overview/WidgetOptionsForm.svelte.d.ts.map +1 -0
  155. package/dist/components/overview/controller.svelte.d.ts +92 -0
  156. package/dist/components/overview/controller.svelte.d.ts.map +1 -0
  157. package/dist/components/overview/controller.svelte.js +336 -0
  158. package/dist/components/overview/format.d.ts +13 -0
  159. package/dist/components/overview/format.d.ts.map +1 -0
  160. package/dist/components/overview/format.js +45 -0
  161. package/dist/components/overview/grid-types.d.ts +52 -0
  162. package/dist/components/overview/grid-types.d.ts.map +1 -0
  163. package/dist/components/overview/grid-types.js +1 -0
  164. package/dist/components/overview/index.d.ts +24 -0
  165. package/dist/components/overview/index.d.ts.map +1 -0
  166. package/dist/components/overview/index.js +22 -0
  167. package/dist/components/overview/load.d.ts +30 -0
  168. package/dist/components/overview/load.d.ts.map +1 -0
  169. package/dist/components/overview/load.js +92 -0
  170. package/dist/components/overview/markdown.d.ts +53 -0
  171. package/dist/components/overview/markdown.d.ts.map +1 -0
  172. package/dist/components/overview/markdown.js +203 -0
  173. package/dist/components/overview/model.d.ts +100 -0
  174. package/dist/components/overview/model.d.ts.map +1 -0
  175. package/dist/components/overview/model.js +460 -0
  176. package/dist/components/overview/recipe-widgets.d.ts +77 -0
  177. package/dist/components/overview/recipe-widgets.d.ts.map +1 -0
  178. package/dist/components/overview/recipe-widgets.js +151 -0
  179. package/dist/components/overview/registry.d.ts +45 -0
  180. package/dist/components/overview/registry.d.ts.map +1 -0
  181. package/dist/components/overview/registry.js +112 -0
  182. package/dist/components/overview/resize.d.ts +25 -0
  183. package/dist/components/overview/resize.d.ts.map +1 -0
  184. package/dist/components/overview/resize.js +41 -0
  185. package/dist/components/overview/schema.d.ts +34 -0
  186. package/dist/components/overview/schema.d.ts.map +1 -0
  187. package/dist/components/overview/schema.js +180 -0
  188. package/dist/components/overview/server.d.ts +14 -0
  189. package/dist/components/overview/server.d.ts.map +1 -0
  190. package/dist/components/overview/server.js +13 -0
  191. package/dist/components/overview/types.d.ts +235 -0
  192. package/dist/components/overview/types.d.ts.map +1 -0
  193. package/dist/components/overview/types.js +17 -0
  194. package/dist/components/overview/widgets/ChartWidget.svelte +111 -0
  195. package/dist/components/overview/widgets/ChartWidget.svelte.d.ts +6 -0
  196. package/dist/components/overview/widgets/ChartWidget.svelte.d.ts.map +1 -0
  197. package/dist/components/overview/widgets/MetricWidget.svelte +86 -0
  198. package/dist/components/overview/widgets/MetricWidget.svelte.d.ts +6 -0
  199. package/dist/components/overview/widgets/MetricWidget.svelte.d.ts.map +1 -0
  200. package/dist/components/overview/widgets/NoteWidget.svelte +61 -0
  201. package/dist/components/overview/widgets/NoteWidget.svelte.d.ts +5 -0
  202. package/dist/components/overview/widgets/NoteWidget.svelte.d.ts.map +1 -0
  203. package/dist/components/overview/widgets/RecordListWidget.svelte +91 -0
  204. package/dist/components/overview/widgets/RecordListWidget.svelte.d.ts +6 -0
  205. package/dist/components/overview/widgets/RecordListWidget.svelte.d.ts.map +1 -0
  206. package/dist/components/overview/widgets/ShortcutsWidget.svelte +80 -0
  207. package/dist/components/overview/widgets/ShortcutsWidget.svelte.d.ts +6 -0
  208. package/dist/components/overview/widgets/ShortcutsWidget.svelte.d.ts.map +1 -0
  209. package/dist/components/overview/widgets/core.d.ts +44 -0
  210. package/dist/components/overview/widgets/core.d.ts.map +1 -0
  211. package/dist/components/overview/widgets/core.js +222 -0
  212. package/dist/components/overview/widgets/data.d.ts +76 -0
  213. package/dist/components/overview/widgets/data.d.ts.map +1 -0
  214. package/dist/components/overview/widgets/data.js +40 -0
  215. package/dist/components/screens/DetailScreen.svelte +220 -0
  216. package/dist/components/screens/DetailScreen.svelte.d.ts +5 -0
  217. package/dist/components/screens/DetailScreen.svelte.d.ts.map +1 -0
  218. package/dist/components/screens/EditForm.svelte +313 -0
  219. package/dist/components/screens/EditForm.svelte.d.ts +5 -0
  220. package/dist/components/screens/EditForm.svelte.d.ts.map +1 -0
  221. package/dist/components/screens/ListScreen.svelte +191 -0
  222. package/dist/components/screens/ListScreen.svelte.d.ts +5 -0
  223. package/dist/components/screens/ListScreen.svelte.d.ts.map +1 -0
  224. package/dist/components/screens/RecipeScreens.svelte +237 -0
  225. package/dist/components/screens/RecipeScreens.svelte.d.ts +5 -0
  226. package/dist/components/screens/RecipeScreens.svelte.d.ts.map +1 -0
  227. package/dist/components/screens/fields.d.ts +54 -0
  228. package/dist/components/screens/fields.d.ts.map +1 -0
  229. package/dist/components/screens/fields.js +229 -0
  230. package/dist/components/screens/index.d.ts +8 -0
  231. package/dist/components/screens/index.d.ts.map +1 -0
  232. package/dist/components/screens/index.js +6 -0
  233. package/dist/components/screens/types.d.ts +215 -0
  234. package/dist/components/screens/types.d.ts.map +1 -0
  235. package/dist/components/screens/types.js +1 -0
  236. package/dist/components/screens/values.d.ts +62 -0
  237. package/dist/components/screens/values.d.ts.map +1 -0
  238. package/dist/components/screens/values.js +289 -0
  239. package/dist/components/sortable/Sortable.svelte +6 -33
  240. package/dist/components/sortable/Sortable.svelte.d.ts.map +1 -1
  241. package/dist/components/sortable/announce.d.ts +5 -0
  242. package/dist/components/sortable/announce.d.ts.map +1 -0
  243. package/dist/components/sortable/announce.js +33 -0
  244. package/dist/components/sortable/controller.svelte.d.ts +10 -0
  245. package/dist/components/sortable/controller.svelte.d.ts.map +1 -1
  246. package/dist/components/sortable/controller.svelte.js +29 -7
  247. package/dist/components/workspace/admin-shell/AdminShell.svelte +424 -58
  248. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts +27 -2
  249. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts.map +1 -1
  250. package/dist/components/workspace/admin-shell/ShellBrand.svelte +86 -0
  251. package/dist/components/workspace/admin-shell/ShellBrand.svelte.d.ts +18 -0
  252. package/dist/components/workspace/admin-shell/ShellBrand.svelte.d.ts.map +1 -0
  253. package/dist/components/workspace/admin-shell/ShellIconButton.svelte +77 -0
  254. package/dist/components/workspace/admin-shell/ShellIconButton.svelte.d.ts +26 -0
  255. package/dist/components/workspace/admin-shell/ShellIconButton.svelte.d.ts.map +1 -0
  256. package/dist/components/workspace/admin-shell/ShellLayoutEditor.svelte +88 -16
  257. package/dist/components/workspace/admin-shell/ShellLayoutEditor.svelte.d.ts.map +1 -1
  258. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte +531 -0
  259. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte.d.ts +26 -0
  260. package/dist/components/workspace/admin-shell/ShellNavEditor.svelte.d.ts.map +1 -0
  261. package/dist/components/workspace/admin-shell/ShellSectionIcon.svelte +57 -0
  262. package/dist/components/workspace/admin-shell/ShellSectionIcon.svelte.d.ts +22 -0
  263. package/dist/components/workspace/admin-shell/ShellSectionIcon.svelte.d.ts.map +1 -0
  264. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte +290 -0
  265. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte.d.ts +32 -0
  266. package/dist/components/workspace/admin-shell/ShellSectionMenu.svelte.d.ts.map +1 -0
  267. package/dist/components/workspace/admin-shell/TenantNav.svelte +67 -2
  268. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts +8 -0
  269. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts.map +1 -1
  270. package/dist/components/workspace/admin-shell/layout-controller.svelte.d.ts +67 -0
  271. package/dist/components/workspace/admin-shell/layout-controller.svelte.d.ts.map +1 -1
  272. package/dist/components/workspace/admin-shell/layout-controller.svelte.js +129 -1
  273. package/dist/components/workspace/admin-shell/layout.d.ts +122 -0
  274. package/dist/components/workspace/admin-shell/layout.d.ts.map +1 -1
  275. package/dist/components/workspace/admin-shell/layout.js +410 -10
  276. package/dist/components/workspace/admin-shell/settings.js +4 -4
  277. package/dist/components/workspace/admin-shell/shell-icons.d.ts +45 -0
  278. package/dist/components/workspace/admin-shell/shell-icons.d.ts.map +1 -0
  279. package/dist/components/workspace/admin-shell/shell-icons.js +66 -0
  280. package/dist/components/workspace/admin-shell/slot-labels.d.ts +33 -0
  281. package/dist/components/workspace/admin-shell/slot-labels.d.ts.map +1 -0
  282. package/dist/components/workspace/admin-shell/slot-labels.js +33 -0
  283. package/dist/components/workspace/admin-shell/slots.d.ts +50 -0
  284. package/dist/components/workspace/admin-shell/slots.d.ts.map +1 -0
  285. package/dist/components/workspace/admin-shell/slots.js +77 -0
  286. package/dist/components/workspace/admin-shell/state.svelte.d.ts +35 -0
  287. package/dist/components/workspace/admin-shell/state.svelte.d.ts.map +1 -1
  288. package/dist/components/workspace/admin-shell/state.svelte.js +111 -0
  289. package/dist/components/workspace/admin-shell/types.d.ts +101 -1
  290. package/dist/components/workspace/admin-shell/types.d.ts.map +1 -1
  291. package/dist/components/workspace/index.d.ts +9 -2
  292. package/dist/components/workspace/index.d.ts.map +1 -1
  293. package/dist/components/workspace/index.js +6 -0
  294. package/dist/components/workspace/manifest-nav.d.ts +20 -0
  295. package/dist/components/workspace/manifest-nav.d.ts.map +1 -1
  296. package/dist/components/workspace/manifest-nav.js +42 -13
  297. package/dist/i18n/server.d.ts +6 -0
  298. package/dist/i18n/server.d.ts.map +1 -1
  299. package/dist/i18n/server.js +6 -0
  300. package/dist/i18n/strings.import-export.d.ts +88 -0
  301. package/dist/i18n/strings.import-export.d.ts.map +1 -0
  302. package/dist/i18n/strings.import-export.js +88 -0
  303. package/dist/i18n/strings.overview.d.ts +100 -0
  304. package/dist/i18n/strings.overview.d.ts.map +1 -0
  305. package/dist/i18n/strings.overview.js +107 -0
  306. package/dist/i18n/strings.palette.d.ts +18 -0
  307. package/dist/i18n/strings.palette.d.ts.map +1 -0
  308. package/dist/i18n/strings.palette.js +18 -0
  309. package/dist/i18n/strings.screens.d.ts +31 -0
  310. package/dist/i18n/strings.screens.d.ts.map +1 -0
  311. package/dist/i18n/strings.screens.js +31 -0
  312. package/dist/i18n/strings.workspace.d.ts +49 -0
  313. package/dist/i18n/strings.workspace.d.ts.map +1 -1
  314. package/dist/i18n/strings.workspace.js +49 -0
  315. package/package.json +59 -19
  316. package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts +0 -51
  317. package/dist/browser-ai/adapters/stt/whisper-wasm.d.ts.map +0 -1
  318. package/dist/browser-ai/adapters/stt/whisper-wasm.js +0 -380
@@ -0,0 +1,317 @@
1
+ /**
2
+ * On-device speech-to-text (`whisper-local`, alias `whisper-wasm`, and
3
+ * `moonshine`).
4
+ *
5
+ * For browsers whose own speech recognition is missing or unreliable
6
+ * (Firefox, Brave). It is push-to-talk: `start()` records from the
7
+ * microphone, `stop()` ends the recording and transcribes it with a Whisper
8
+ * or Moonshine model running in the browser (WebGPU when available,
9
+ * single-thread WASM otherwise, in a Web Worker when the host supplies one),
10
+ * then emits one final result. `transcribePcm()` transcribes one finished
11
+ * utterance directly, which smrt-ui's hands-free dictation uses. The engine
12
+ * is `@happyvertical/speech/local`; the model is a one-time download kept in
13
+ * Cache Storage; see `LocalSpeechModel` for the consent/progress API.
14
+ */
15
+ import { createMediaRecorderCapture, } from '@happyvertical/smrt-ui/forms';
16
+ import { ModelNotDownloadedError } from '../../core/errors.js';
17
+ import { createLocalSpeechModel, } from './local-speech-model.js';
18
+ const SIZE_MODELS = {
19
+ tiny: 'onnx-community/whisper-tiny.en',
20
+ base: 'onnx-community/whisper-base.en',
21
+ small: 'onnx-community/whisper-small.en',
22
+ };
23
+ /** Sample rate the speech models expect. */
24
+ const SAMPLE_RATE = 16_000;
25
+ /**
26
+ * How long a caller should wait after `stop()` for the text: the dictation
27
+ * state machine would otherwise give up after 1.5 s, long before a model
28
+ * running in the browser has finished.
29
+ */
30
+ const STOP_TIMEOUT_MS = 90_000;
31
+ /** Decode a recording into 16 kHz mono PCM with the Web Audio API. */
32
+ async function decodeAudio(blob) {
33
+ const bytes = await blob.arrayBuffer();
34
+ const context = new AudioContext({ sampleRate: SAMPLE_RATE });
35
+ try {
36
+ const buffer = await context.decodeAudioData(bytes);
37
+ // A copy: the channel data belongs to the AudioBuffer, and the worker
38
+ // takes ownership of what it is sent.
39
+ return buffer.getChannelData(0).slice();
40
+ }
41
+ finally {
42
+ void context.close().catch(() => undefined);
43
+ }
44
+ }
45
+ export class LocalSpeechSTTAdapter {
46
+ type;
47
+ /**
48
+ * `Dictation` waits this long for the text after the person stops.
49
+ */
50
+ stopTimeoutMs = STOP_TIMEOUT_MS;
51
+ options;
52
+ _model;
53
+ makeCapture;
54
+ capture = null;
55
+ captureOff = null;
56
+ _isListening = false;
57
+ language = 'en';
58
+ session = 0;
59
+ starting = false;
60
+ stopping = null;
61
+ resultListeners = new Set();
62
+ errorListeners = new Set();
63
+ startListeners = new Set();
64
+ endListeners = new Set();
65
+ constructor(options = {}) {
66
+ this.options = {
67
+ type: 'whisper-local',
68
+ defaultLanguage: 'en',
69
+ ...options,
70
+ };
71
+ this.type = this.options.type;
72
+ this.language = this.options.defaultLanguage ?? 'en';
73
+ this.makeCapture = options.capture ?? createMediaRecorderCapture;
74
+ const model = this.options.model ??
75
+ this.options.modelId ??
76
+ (this.options.modelSize
77
+ ? SIZE_MODELS[this.options.modelSize]
78
+ : this.type === 'moonshine'
79
+ ? 'moonshine-tiny'
80
+ : undefined);
81
+ this._model =
82
+ this.options.modelHandle ??
83
+ createLocalSpeechModel({
84
+ model,
85
+ device: this.options.device,
86
+ dtype: this.options.dtype,
87
+ createWorker: this.options.createWorker,
88
+ loadSpeech: this.options.loadSpeech,
89
+ loadModule: this.options.loadModule,
90
+ allowLocalModels: this.options.allowLocalModels,
91
+ });
92
+ }
93
+ /** The downloadable model, for consent UIs. */
94
+ get model() {
95
+ return this._model;
96
+ }
97
+ get initState() {
98
+ switch (this._model.state) {
99
+ case 'ready':
100
+ return 'ready';
101
+ case 'loading':
102
+ return 'initializing';
103
+ case 'error':
104
+ return 'error';
105
+ default:
106
+ return 'uninitialized';
107
+ }
108
+ }
109
+ estimateSize() {
110
+ return this._model.estimateSize();
111
+ }
112
+ isCached() {
113
+ return this._model.isCached();
114
+ }
115
+ load(options) {
116
+ return this._model.load(options);
117
+ }
118
+ async ensureInitialized(onProgress) {
119
+ await this._model.load({
120
+ onProgress: onProgress ?? this.options.onProgress,
121
+ });
122
+ }
123
+ /**
124
+ * Make the model ready for dictation without ever downloading it: a model
125
+ * already loaded is used, one stored on this device is loaded from there,
126
+ * and anything else rejects with `ModelNotDownloadedError`. The host asks
127
+ * for consent and calls `load()` itself.
128
+ */
129
+ async prepare() {
130
+ if (this._model.state === 'ready')
131
+ return;
132
+ if (!(await this._model.isCached())) {
133
+ throw new ModelNotDownloadedError(this._model.modelId, this.type);
134
+ }
135
+ await this.ensureInitialized();
136
+ }
137
+ getCapabilities() {
138
+ return {
139
+ continuous: false,
140
+ interimResults: false,
141
+ languages: this._model.englishOnly
142
+ ? ['en']
143
+ : [
144
+ 'en',
145
+ 'es',
146
+ 'fr',
147
+ 'de',
148
+ 'it',
149
+ 'pt',
150
+ 'nl',
151
+ 'pl',
152
+ 'ru',
153
+ 'zh',
154
+ 'ja',
155
+ 'ko',
156
+ ],
157
+ accuracy: 'medium',
158
+ requiresDownload: true,
159
+ downloadSize: this._model.estimateSize(),
160
+ };
161
+ }
162
+ /**
163
+ * Transcribe one finished utterance (16 kHz mono PCM). Loads the model
164
+ * first if it is not ready. This is what hands-free dictation calls for
165
+ * each utterance the voice activity detector cuts out.
166
+ */
167
+ async transcribePcm(pcm, options = {}) {
168
+ await this.prepare();
169
+ return this._model.transcribe(pcm, options.language ?? this.options.defaultLanguage ?? 'en');
170
+ }
171
+ async start(options = {}) {
172
+ if (this._isListening || this.starting)
173
+ return;
174
+ // The session token is taken before the (possibly long) model load, so a
175
+ // stop() or abort() meanwhile cancels this start instead of letting the
176
+ // microphone open once the load finishes.
177
+ const session = ++this.session;
178
+ this.starting = true;
179
+ try {
180
+ await this.prepare();
181
+ }
182
+ finally {
183
+ this.starting = false;
184
+ }
185
+ if (session !== this.session || this._isListening)
186
+ return;
187
+ this.language = options.language ?? this.options.defaultLanguage ?? 'en';
188
+ const capture = this.makeCapture({
189
+ maxDurationMs: this.options.maxDurationMs,
190
+ });
191
+ try {
192
+ await capture.start();
193
+ }
194
+ catch (error) {
195
+ const err = error instanceof Error ? error : new Error(String(error));
196
+ this.emitError(err);
197
+ throw err;
198
+ }
199
+ if (session !== this.session) {
200
+ capture.cancel();
201
+ return;
202
+ }
203
+ this.capture = capture;
204
+ this.captureOff = capture.onLimit((reason) => {
205
+ if (reason === 'time')
206
+ void this.stop();
207
+ else {
208
+ this.captureOff?.();
209
+ void this.finish(session, null, new Error('The recording is too long'));
210
+ }
211
+ });
212
+ this._isListening = true;
213
+ for (const cb of this.startListeners)
214
+ cb();
215
+ }
216
+ /** End the recording, transcribe it, emit the final result, then end. */
217
+ stop() {
218
+ if (this.stopping)
219
+ return this.stopping;
220
+ const capture = this.capture;
221
+ if (this.starting)
222
+ this.session++;
223
+ if (!capture || !this._isListening)
224
+ return Promise.resolve();
225
+ const session = this.session;
226
+ this.stopping = (async () => {
227
+ let text = null;
228
+ let failure = null;
229
+ try {
230
+ const recording = await capture.stop();
231
+ if (session !== this.session)
232
+ return;
233
+ const audio = await decodeAudio(recording.audio);
234
+ text = await this._model.transcribe(audio, this.language);
235
+ }
236
+ catch (error) {
237
+ failure = error instanceof Error ? error : new Error(String(error));
238
+ }
239
+ await this.finish(session, text, failure);
240
+ })();
241
+ return this.stopping;
242
+ }
243
+ async finish(session, text, failure) {
244
+ if (session !== this.session)
245
+ return;
246
+ this.captureOff?.();
247
+ this.captureOff = null;
248
+ this.capture = null;
249
+ this._isListening = false;
250
+ this.stopping = null;
251
+ if (failure)
252
+ this.emitError(failure);
253
+ else if (text) {
254
+ const result = {
255
+ text,
256
+ confidence: 1,
257
+ isFinal: true,
258
+ timestamp: Date.now(),
259
+ };
260
+ for (const cb of this.resultListeners)
261
+ cb(result);
262
+ }
263
+ for (const cb of this.endListeners)
264
+ cb();
265
+ }
266
+ emitError(error) {
267
+ for (const cb of this.errorListeners)
268
+ cb(error);
269
+ }
270
+ abort() {
271
+ if (this.starting)
272
+ this.session++;
273
+ if (!this._isListening)
274
+ return;
275
+ this.session++;
276
+ this.captureOff?.();
277
+ this.captureOff = null;
278
+ this.capture?.cancel();
279
+ this.capture = null;
280
+ this._isListening = false;
281
+ this.stopping = null;
282
+ for (const cb of this.endListeners)
283
+ cb();
284
+ }
285
+ isListening() {
286
+ return this._isListening;
287
+ }
288
+ onResult(callback) {
289
+ this.resultListeners.add(callback);
290
+ return () => this.resultListeners.delete(callback);
291
+ }
292
+ onError(callback) {
293
+ this.errorListeners.add(callback);
294
+ return () => this.errorListeners.delete(callback);
295
+ }
296
+ onStart(callback) {
297
+ this.startListeners.add(callback);
298
+ return () => this.startListeners.delete(callback);
299
+ }
300
+ onEnd(callback) {
301
+ this.endListeners.add(callback);
302
+ return () => this.endListeners.delete(callback);
303
+ }
304
+ async dispose() {
305
+ this.abort();
306
+ // A shared handle belongs to whoever made it.
307
+ if (!this.options.modelHandle)
308
+ this._model.dispose();
309
+ this.resultListeners.clear();
310
+ this.errorListeners.clear();
311
+ this.startListeners.clear();
312
+ this.endListeners.clear();
313
+ }
314
+ }
315
+ /** @deprecated Use {@link LocalSpeechSTTAdapter}. */
316
+ /** @deprecated Use {@link LocalSpeechSTTAdapter}. */
317
+ export { LocalSpeechSTTAdapter as WhisperLocalSTTAdapter, LocalSpeechSTTAdapter as WhisperWasmSTTAdapter, };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=local-speech.worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-speech.worker.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/stt/local-speech.worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Web Worker entry for on-device speech (`whisper-local`, `moonshine`): runs
3
+ * `@happyvertical/speech/local`'s worker host off the main thread so the
4
+ * page stays responsive while it downloads and transcribes.
5
+ *
6
+ * This is the one module that imports `@huggingface/transformers` (and
7
+ * `@happyvertical/speech/local`) statically, so a bundler resolves (and
8
+ * bundles) them for the app that creates this worker, and for no other app.
9
+ * Create it from the host, where the optional peers are installed:
10
+ *
11
+ * ```ts
12
+ * import SpeechWorker from '@happyvertical/smrt-svelte/browser-ai/whisper-worker?worker';
13
+ * createLocalSpeechModel({
14
+ * model: 'moonshine-tiny',
15
+ * createWorker: () => new SpeechWorker(),
16
+ * loadSpeech: () => import('@happyvertical/speech/local'),
17
+ * });
18
+ * ```
19
+ *
20
+ * The worker runs the quantised (`q8`) model on WebGPU where an adapter
21
+ * exists, else single-thread WASM. The model is chosen per request by the
22
+ * main thread, so one worker serves whichever model the handle names.
23
+ */
24
+ import { serveLocalTranscriber } from '@happyvertical/speech/local';
25
+ import * as transformers from '@huggingface/transformers';
26
+ import { configureTransformersEnv } from './transformers-env.js';
27
+ serveLocalTranscriber({
28
+ transformers: transformers,
29
+ device: 'auto',
30
+ dtype: 'q8',
31
+ configureEnv: configureTransformersEnv(false),
32
+ });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The transformers.js `env` settings both the page thread and the worker
3
+ * entry use: Cache Storage for downloads, and one WASM thread where the page
4
+ * cannot be cross-origin isolated (static hosts cannot send COOP/COEP, so
5
+ * there is no SharedArrayBuffer).
6
+ */
7
+ export declare function configureTransformersEnv(allowLocalModels: boolean): (env: Record<string, unknown>) => void;
8
+ //# sourceMappingURL=transformers-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformers-env.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/stt/transformers-env.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,gBAAgB,EAAE,OAAO,GACxB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAYxC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The transformers.js `env` settings both the page thread and the worker
3
+ * entry use: Cache Storage for downloads, and one WASM thread where the page
4
+ * cannot be cross-origin isolated (static hosts cannot send COOP/COEP, so
5
+ * there is no SharedArrayBuffer).
6
+ */
7
+ export function configureTransformersEnv(allowLocalModels) {
8
+ return (env) => {
9
+ env.allowLocalModels = allowLocalModels;
10
+ env.useBrowserCache = true;
11
+ const isolated = globalThis.crossOriginIsolated ===
12
+ true;
13
+ const wasm = env.backends?.onnx?.wasm;
14
+ if (wasm && !isolated)
15
+ wasm.numThreads = 1;
16
+ };
17
+ }
@@ -64,7 +64,7 @@ export interface STTEventHandlers {
64
64
  */
65
65
  export interface STTAdapter {
66
66
  /** Adapter type identifier */
67
- readonly type: 'browser-speech' | 'whisper-wasm' | 'whisper-cpp';
67
+ readonly type: 'browser-speech' | 'whisper-wasm' | 'whisper-local' | 'moonshine' | 'whisper-cpp';
68
68
  /** Current initialization state */
69
69
  readonly initState: InitState;
70
70
  /**
@@ -128,17 +128,62 @@ export interface BrowserSpeechSTTOptions extends BaseBrowserAIOptions {
128
128
  maxAlternatives?: number;
129
129
  }
130
130
  /**
131
- * Whisper WASM adapter options
131
+ * On-device speech-to-text options (`@happyvertical/speech/local` on
132
+ * transformers.js): speech recognition that runs in the browser after a
133
+ * one-time model download, for browsers whose own speech recognition is
134
+ * missing or unreliable (Firefox, Brave).
135
+ *
136
+ * `'whisper-local'` defaults to English-only Whisper; `'moonshine'` defaults
137
+ * to Moonshine tiny, the fastest model for live dictation. `'whisper-wasm'`
138
+ * is the older name for `'whisper-local'` and is accepted as an alias;
139
+ * `modelSize` maps to the English-only Whisper model of that size.
132
140
  */
133
- export interface WhisperWasmSTTOptions extends BaseBrowserAIOptions {
134
- type: 'whisper-wasm';
135
- /** Model size: 'tiny', 'base', 'small' */
141
+ export interface LocalSpeechSTTOptions extends BaseBrowserAIOptions {
142
+ type: 'whisper-local' | 'whisper-wasm' | 'moonshine';
143
+ /**
144
+ * A short name (`'moonshine-tiny'`, `'moonshine-base'`, `'whisper-tiny.en'`,
145
+ * ...) or a Hugging Face model id. Default `onnx-community/whisper-tiny.en`
146
+ * (`moonshine-tiny` for `type: 'moonshine'`).
147
+ */
148
+ model?: string;
149
+ /** Alias of `model`. */
150
+ modelId?: string;
151
+ /** Legacy size selector (`whisper-wasm`): picks `whisper-<size>.en`. */
136
152
  modelSize?: 'tiny' | 'base' | 'small';
137
- /** Custom model URL (overrides modelSize) */
138
- modelUrl?: string;
139
- /** Language code for transcription */
153
+ /** `'auto'` (default): WebGPU when available, else single-thread WASM. */
154
+ device?: 'auto' | 'webgpu' | 'wasm';
155
+ /** Weight quantisation. Default `'q8'`. */
156
+ dtype?: string;
157
+ /** Language code for transcription (`en`, `fr-CA`, ...). */
140
158
  defaultLanguage?: string;
159
+ /**
160
+ * Make the Web Worker that runs the model. Pass one from the host app, where
161
+ * the optional `@happyvertical/speech` and `@huggingface/transformers`
162
+ * peers are installed (see `local-speech.worker.ts`). Without it the model
163
+ * runs on the page's own thread.
164
+ */
165
+ createWorker?: () => Worker;
166
+ /**
167
+ * Load `@happyvertical/speech/local`, e.g.
168
+ * `() => import('@happyvertical/speech/local')`. Needed in a bundled
169
+ * browser app.
170
+ */
171
+ loadSpeech?: () => Promise<unknown>;
172
+ /**
173
+ * Load `@huggingface/transformers` for the in-page fallback, e.g.
174
+ * `() => import('@huggingface/transformers')`. Needed in a browser when
175
+ * there is no `createWorker`.
176
+ */
177
+ loadModule?: () => Promise<unknown>;
178
+ /** Share one downloaded model between adapters and a consent UI. */
179
+ modelHandle?: import('./local-speech-model.js').LocalSpeechModel;
180
+ /** Longest recording in ms (default 2 minutes). */
181
+ maxDurationMs?: number;
141
182
  }
183
+ /** @deprecated Use {@link LocalSpeechSTTOptions}. */
184
+ export type WhisperLocalSTTOptions = LocalSpeechSTTOptions;
185
+ /** @deprecated Use {@link LocalSpeechSTTOptions}. */
186
+ export type WhisperWasmSTTOptions = LocalSpeechSTTOptions;
142
187
  /**
143
188
  * Whisper.cpp WASM adapter options (using @remotion/whisper-web)
144
189
  */
@@ -150,5 +195,5 @@ export interface WhisperCppSTTOptions extends BaseBrowserAIOptions {
150
195
  /**
151
196
  * Union type for STT factory options
152
197
  */
153
- export type GetSTTOptions = BrowserSpeechSTTOptions | WhisperWasmSTTOptions | WhisperCppSTTOptions;
198
+ export type GetSTTOptions = BrowserSpeechSTTOptions | LocalSpeechSTTOptions | WhisperCppSTTOptions;
154
199
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/stt/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/stt/types.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,11 @@ export declare class BrowserSynthesisTTSAdapter implements TTSAdapter {
16
16
  private options;
17
17
  private voices;
18
18
  private currentUtterance;
19
+ private operationGeneration;
20
+ private initializationGeneration;
21
+ private initialization;
22
+ private cancelVoiceLoad;
23
+ private settleCurrentSpeech;
19
24
  private startListeners;
20
25
  private endListeners;
21
26
  private errorListeners;
@@ -1 +1 @@
1
- {"version":3,"file":"browser-synthesis.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/tts/browser-synthesis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,0BAA0B,EAC1B,UAAU,EACV,eAAe,EACf,UAAU,EACV,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,0BAA2B,YAAW,UAAU;IAC3D,QAAQ,CAAC,IAAI,EAAG,mBAAmB,CAAU;IAE7C,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,gBAAgB,CAAyC;IAGjE,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,iBAAiB,CAErB;gBAEQ,OAAO,GAAE,0BAA+B;IAUpD,IAAI,SAAS,IAAI,SAAS,CAEzB;IAEK,iBAAiB,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAqClD,UAAU;IA+BxB,eAAe,IAAI,eAAe;IAUlC,SAAS,IAAI,QAAQ,EAAE;IAUvB,OAAO,CAAC,SAAS;IAkCX,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAiElE,IAAI,IAAI,IAAI;IAOZ,KAAK,IAAI,IAAI;IAMb,MAAM,IAAI,IAAI;IAMd,UAAU,IAAI,OAAO;IAIrB,QAAQ,IAAI,OAAO;IAInB,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKzC,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKvC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI;IAKrD,UAAU,CACR,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GACxD,MAAM,IAAI;IAKP,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAU/B"}
1
+ {"version":3,"file":"browser-synthesis.d.ts","sourceRoot":"","sources":["../../../../src/browser-ai/adapters/tts/browser-synthesis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,0BAA0B,EAC1B,UAAU,EACV,eAAe,EACf,UAAU,EACV,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,0BAA2B,YAAW,UAAU;IAC3D,QAAQ,CAAC,IAAI,EAAG,mBAAmB,CAAU;IAE7C,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,gBAAgB,CAAyC;IACjE,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,wBAAwB,CAAK;IACrC,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,mBAAmB,CAA6B;IAGxD,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,iBAAiB,CAErB;gBAEQ,OAAO,GAAE,0BAA+B;IAUpD,IAAI,SAAS,IAAI,SAAS,CAEzB;IAEK,iBAAiB,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAmClD,UAAU;IAwBxB,eAAe,IAAI,eAAe;IAUlC,SAAS,IAAI,QAAQ,EAAE;IAUvB,OAAO,CAAC,SAAS;IAkCX,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAgFlE,IAAI,IAAI,IAAI;IAOZ,KAAK,IAAI,IAAI;IAMb,MAAM,IAAI,IAAI;IAMd,UAAU,IAAI,OAAO;IAIrB,QAAQ,IAAI,OAAO;IAInB,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKzC,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKvC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI;IAKrD,UAAU,CACR,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GACxD,MAAM,IAAI;IAKP,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAa/B"}