@mieweb/ui 0.6.1 → 0.7.0-dev.178

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 (450) hide show
  1. package/README.md +90 -53
  2. package/dist/CsvBlock-2A5VEDD3.cjs +15 -0
  3. package/dist/CsvBlock-2A5VEDD3.cjs.map +1 -0
  4. package/dist/CsvBlock-D6PWAJ5X.js +6 -0
  5. package/dist/CsvBlock-D6PWAJ5X.js.map +1 -0
  6. package/dist/HtmlPreviewBlock-PEHTJ6C3.js +6 -0
  7. package/dist/HtmlPreviewBlock-PEHTJ6C3.js.map +1 -0
  8. package/dist/HtmlPreviewBlock-SYXCV5RH.cjs +15 -0
  9. package/dist/HtmlPreviewBlock-SYXCV5RH.cjs.map +1 -0
  10. package/dist/MedicationEditor-Bp4NLy7y.d.cts +352 -0
  11. package/dist/MedicationEditor-Bp4NLy7y.d.ts +352 -0
  12. package/dist/MermaidBlock-7NK3AVK2.js +6 -0
  13. package/dist/MermaidBlock-7NK3AVK2.js.map +1 -0
  14. package/dist/MermaidBlock-AFXNP5NK.cjs +15 -0
  15. package/dist/MermaidBlock-AFXNP5NK.cjs.map +1 -0
  16. package/dist/SurveyBlock-6KRNKFH5.cjs +15 -0
  17. package/dist/SurveyBlock-6KRNKFH5.cjs.map +1 -0
  18. package/dist/SurveyBlock-NNDGXGG4.js +6 -0
  19. package/dist/SurveyBlock-NNDGXGG4.js.map +1 -0
  20. package/dist/ag-grid.cjs +6 -6
  21. package/dist/ag-grid.cjs.map +1 -1
  22. package/dist/ag-grid.js +2 -2
  23. package/dist/ag-grid.js.map +1 -1
  24. package/dist/brands/index.cjs +17 -17
  25. package/dist/brands/index.js +4 -4
  26. package/dist/chunk-372IIHUA.cjs +2017 -0
  27. package/dist/chunk-372IIHUA.cjs.map +1 -0
  28. package/dist/{chunk-2DS3RJ2D.js → chunk-3TERETXH.js} +112 -3
  29. package/dist/chunk-3TERETXH.js.map +1 -0
  30. package/dist/chunk-44CK4CT2.cjs +336 -0
  31. package/dist/chunk-44CK4CT2.cjs.map +1 -0
  32. package/dist/{chunk-FSBFQBNE.cjs → chunk-4GXECTPS.cjs} +2 -2
  33. package/dist/{chunk-FSBFQBNE.cjs.map → chunk-4GXECTPS.cjs.map} +1 -1
  34. package/dist/chunk-4LVPQ44A.js +228 -0
  35. package/dist/chunk-4LVPQ44A.js.map +1 -0
  36. package/dist/{chunk-6555OYRU.js → chunk-5BQE6BEL.js} +2 -2
  37. package/dist/{chunk-6555OYRU.js.map → chunk-5BQE6BEL.js.map} +1 -1
  38. package/dist/chunk-62ZOA6PX.js +31 -0
  39. package/dist/chunk-62ZOA6PX.js.map +1 -0
  40. package/dist/chunk-63KVQHGQ.cjs +1802 -0
  41. package/dist/chunk-63KVQHGQ.cjs.map +1 -0
  42. package/dist/chunk-6AHYYWVB.js +78 -0
  43. package/dist/chunk-6AHYYWVB.js.map +1 -0
  44. package/dist/chunk-6I7IDZ4A.js +51 -0
  45. package/dist/chunk-6I7IDZ4A.js.map +1 -0
  46. package/dist/chunk-6ZYE6JUK.cjs +80 -0
  47. package/dist/chunk-6ZYE6JUK.cjs.map +1 -0
  48. package/dist/chunk-7QXG5BBB.cjs +164 -0
  49. package/dist/chunk-7QXG5BBB.cjs.map +1 -0
  50. package/dist/chunk-7WMSUXOQ.js +182 -0
  51. package/dist/chunk-7WMSUXOQ.js.map +1 -0
  52. package/dist/chunk-7XUN3OQT.js +3 -0
  53. package/dist/{chunk-V2DF2GUE.js.map → chunk-7XUN3OQT.js.map} +1 -1
  54. package/dist/chunk-7ZVTLTJF.js +109 -0
  55. package/dist/chunk-7ZVTLTJF.js.map +1 -0
  56. package/dist/chunk-AES2BKEW.cjs +229 -0
  57. package/dist/chunk-AES2BKEW.cjs.map +1 -0
  58. package/dist/chunk-AFKKJEV5.cjs +72 -0
  59. package/dist/chunk-AFKKJEV5.cjs.map +1 -0
  60. package/dist/chunk-AT732HC6.cjs +4 -0
  61. package/dist/{chunk-74K3RRU7.cjs.map → chunk-AT732HC6.cjs.map} +1 -1
  62. package/dist/chunk-BB4WQ4LV.cjs +137 -0
  63. package/dist/chunk-BB4WQ4LV.cjs.map +1 -0
  64. package/dist/chunk-BIT27PPD.js +49 -0
  65. package/dist/chunk-BIT27PPD.js.map +1 -0
  66. package/dist/chunk-BLPCYP4D.cjs +537 -0
  67. package/dist/chunk-BLPCYP4D.cjs.map +1 -0
  68. package/dist/chunk-BT3ZQJGT.cjs +130 -0
  69. package/dist/chunk-BT3ZQJGT.cjs.map +1 -0
  70. package/dist/chunk-BX6BTDTR.js +34 -0
  71. package/dist/chunk-BX6BTDTR.js.map +1 -0
  72. package/dist/chunk-C2544GKZ.js +313 -0
  73. package/dist/chunk-C2544GKZ.js.map +1 -0
  74. package/dist/chunk-C7RVKV25.cjs +25 -0
  75. package/dist/chunk-C7RVKV25.cjs.map +1 -0
  76. package/dist/chunk-CKD554XR.cjs +100 -0
  77. package/dist/chunk-CKD554XR.cjs.map +1 -0
  78. package/dist/chunk-CVC4NWFA.cjs +154 -0
  79. package/dist/chunk-CVC4NWFA.cjs.map +1 -0
  80. package/dist/{chunk-K3IVCUPP.js → chunk-CYMZ2QS5.js} +2 -2
  81. package/dist/{chunk-K3IVCUPP.js.map → chunk-CYMZ2QS5.js.map} +1 -1
  82. package/dist/{chunk-FRT6RQND.cjs → chunk-DAPZPT5N.cjs} +92 -56
  83. package/dist/chunk-DAPZPT5N.cjs.map +1 -0
  84. package/dist/chunk-DHKYGVP7.js +3 -0
  85. package/dist/{chunk-LEMY57MI.js.map → chunk-DHKYGVP7.js.map} +1 -1
  86. package/dist/chunk-DLNJLCNO.cjs +101 -0
  87. package/dist/chunk-DLNJLCNO.cjs.map +1 -0
  88. package/dist/chunk-DUPR6FEL.js +43 -0
  89. package/dist/chunk-DUPR6FEL.js.map +1 -0
  90. package/dist/{chunk-4FALCEJI.cjs → chunk-EL2RSQTJ.cjs} +2 -2
  91. package/dist/{chunk-4FALCEJI.cjs.map → chunk-EL2RSQTJ.cjs.map} +1 -1
  92. package/dist/chunk-ERLPVXOV.js +22 -0
  93. package/dist/chunk-ERLPVXOV.js.map +1 -0
  94. package/dist/chunk-FIWKHLWY.js +197 -0
  95. package/dist/chunk-FIWKHLWY.js.map +1 -0
  96. package/dist/chunk-FJH7P5WG.js +513 -0
  97. package/dist/chunk-FJH7P5WG.js.map +1 -0
  98. package/dist/chunk-FSGEDDF2.cjs +33 -0
  99. package/dist/chunk-FSGEDDF2.cjs.map +1 -0
  100. package/dist/chunk-GLXTVCHN.cjs +4 -0
  101. package/dist/{chunk-4ZU53GNR.cjs.map → chunk-GLXTVCHN.cjs.map} +1 -1
  102. package/dist/chunk-HRS6W74P.js +1568 -0
  103. package/dist/chunk-HRS6W74P.js.map +1 -0
  104. package/dist/chunk-I2W24RHW.js +196 -0
  105. package/dist/chunk-I2W24RHW.js.map +1 -0
  106. package/dist/chunk-I6CY5C6A.js +12 -0
  107. package/dist/chunk-I6CY5C6A.js.map +1 -0
  108. package/dist/chunk-IQ4KQJAO.js +3 -0
  109. package/dist/chunk-IQ4KQJAO.js.map +1 -0
  110. package/dist/chunk-IWDQPSJN.cjs +1452 -0
  111. package/dist/chunk-IWDQPSJN.cjs.map +1 -0
  112. package/dist/chunk-J7KWQJOB.js +14 -0
  113. package/dist/chunk-J7KWQJOB.js.map +1 -0
  114. package/dist/{chunk-R25H4N4Z.js → chunk-J7Z7467B.js} +92 -56
  115. package/dist/chunk-J7Z7467B.js.map +1 -0
  116. package/dist/{chunk-NINI4WVS.cjs → chunk-JC6Y3LGF.cjs} +297 -84
  117. package/dist/chunk-JC6Y3LGF.cjs.map +1 -0
  118. package/dist/chunk-JCNPVK74.cjs +347 -0
  119. package/dist/chunk-JCNPVK74.cjs.map +1 -0
  120. package/dist/chunk-JFLC7SHM.cjs +35 -0
  121. package/dist/chunk-JFLC7SHM.cjs.map +1 -0
  122. package/dist/chunk-JHYFHEHS.js +1967 -0
  123. package/dist/chunk-JHYFHEHS.js.map +1 -0
  124. package/dist/{chunk-IBZXDX4L.cjs → chunk-JQEY53SH.cjs} +112 -3
  125. package/dist/chunk-JQEY53SH.cjs.map +1 -0
  126. package/dist/chunk-JTBQNOSL.cjs +1605 -0
  127. package/dist/chunk-JTBQNOSL.cjs.map +1 -0
  128. package/dist/chunk-JYZW2PZS.cjs +166 -0
  129. package/dist/chunk-JYZW2PZS.cjs.map +1 -0
  130. package/dist/chunk-KBEKQMVY.cjs +198 -0
  131. package/dist/chunk-KBEKQMVY.cjs.map +1 -0
  132. package/dist/chunk-KJ5BSGEO.cjs +258 -0
  133. package/dist/chunk-KJ5BSGEO.cjs.map +1 -0
  134. package/dist/{chunk-DNPRRYPQ.js → chunk-KL2S36FM.js} +2 -2
  135. package/dist/chunk-KL2S36FM.js.map +1 -0
  136. package/dist/chunk-LIH3IZYK.js +689 -0
  137. package/dist/chunk-LIH3IZYK.js.map +1 -0
  138. package/dist/chunk-MAMY5HTT.cjs +1177 -0
  139. package/dist/chunk-MAMY5HTT.cjs.map +1 -0
  140. package/dist/{chunk-WFS6R2F5.js → chunk-MKWGKASO.js} +114 -101
  141. package/dist/chunk-MKWGKASO.js.map +1 -0
  142. package/dist/{chunk-CV4CVGLO.cjs → chunk-MZPF2QGM.cjs} +95 -74
  143. package/dist/chunk-MZPF2QGM.cjs.map +1 -0
  144. package/dist/chunk-NQME7MCK.js +1416 -0
  145. package/dist/chunk-NQME7MCK.js.map +1 -0
  146. package/dist/chunk-NTYGCBCL.js +543 -0
  147. package/dist/chunk-NTYGCBCL.js.map +1 -0
  148. package/dist/chunk-OF7NTZ2I.js +3 -0
  149. package/dist/chunk-OF7NTZ2I.js.map +1 -0
  150. package/dist/chunk-OXYFTCRW.cjs +57 -0
  151. package/dist/chunk-OXYFTCRW.cjs.map +1 -0
  152. package/dist/chunk-QA6ZDHFP.js +117 -0
  153. package/dist/chunk-QA6ZDHFP.js.map +1 -0
  154. package/dist/chunk-RHNPILZQ.cjs +4 -0
  155. package/dist/chunk-RHNPILZQ.cjs.map +1 -0
  156. package/dist/chunk-RHYIFIT5.js +98 -0
  157. package/dist/chunk-RHYIFIT5.js.map +1 -0
  158. package/dist/chunk-RI56YPED.cjs +201 -0
  159. package/dist/chunk-RI56YPED.cjs.map +1 -0
  160. package/dist/chunk-RISZWWEQ.js +3 -0
  161. package/dist/chunk-RISZWWEQ.js.map +1 -0
  162. package/dist/chunk-S6Z3KDEM.js +140 -0
  163. package/dist/chunk-S6Z3KDEM.js.map +1 -0
  164. package/dist/chunk-S7JQ3FV5.cjs +16 -0
  165. package/dist/chunk-S7JQ3FV5.cjs.map +1 -0
  166. package/dist/{chunk-OXGUG57G.cjs → chunk-SNEQXSC5.cjs} +2 -2
  167. package/dist/{chunk-OXGUG57G.cjs.map → chunk-SNEQXSC5.cjs.map} +1 -1
  168. package/dist/chunk-SQHMGT4W.js +164 -0
  169. package/dist/chunk-SQHMGT4W.js.map +1 -0
  170. package/dist/{chunk-JHPFOG2N.cjs → chunk-ST2RE5UB.cjs} +30 -18
  171. package/dist/chunk-ST2RE5UB.cjs.map +1 -0
  172. package/dist/{chunk-QVJBUWJQ.js → chunk-STPK44AU.js} +46 -12
  173. package/dist/chunk-STPK44AU.js.map +1 -0
  174. package/dist/chunk-T3C4RNJ4.js +106 -0
  175. package/dist/chunk-T3C4RNJ4.js.map +1 -0
  176. package/dist/chunk-T3RWXOCM.js +148 -0
  177. package/dist/chunk-T3RWXOCM.js.map +1 -0
  178. package/dist/{chunk-DCER2QQB.js → chunk-T42BCIUA.js} +2 -2
  179. package/dist/{chunk-DCER2QQB.js.map → chunk-T42BCIUA.js.map} +1 -1
  180. package/dist/{chunk-OYKS2JBB.cjs → chunk-TN33E2VN.cjs} +2 -2
  181. package/dist/chunk-TN33E2VN.cjs.map +1 -0
  182. package/dist/{chunk-K7IGBNZA.cjs → chunk-TR2OJKQ4.cjs} +46 -12
  183. package/dist/chunk-TR2OJKQ4.cjs.map +1 -0
  184. package/dist/chunk-UFYXU7KV.js +135 -0
  185. package/dist/chunk-UFYXU7KV.js.map +1 -0
  186. package/dist/chunk-UM6NA7HL.js +1145 -0
  187. package/dist/chunk-UM6NA7HL.js.map +1 -0
  188. package/dist/chunk-UO3KEUYK.cjs +220 -0
  189. package/dist/chunk-UO3KEUYK.cjs.map +1 -0
  190. package/dist/chunk-UOOH356R.cjs +66 -0
  191. package/dist/chunk-UOOH356R.cjs.map +1 -0
  192. package/dist/{chunk-4ZU53GNR.cjs → chunk-UTYUT5YY.cjs} +62 -2
  193. package/dist/chunk-UTYUT5YY.cjs.map +1 -0
  194. package/dist/chunk-UVSODK6V.cjs +53 -0
  195. package/dist/chunk-UVSODK6V.cjs.map +1 -0
  196. package/dist/chunk-V25Z5GR6.cjs +184 -0
  197. package/dist/chunk-V25Z5GR6.cjs.map +1 -0
  198. package/dist/chunk-VBWRH4UW.cjs +4 -0
  199. package/dist/chunk-VBWRH4UW.cjs.map +1 -0
  200. package/dist/chunk-VJOVJTFP.cjs +370 -0
  201. package/dist/chunk-VJOVJTFP.cjs.map +1 -0
  202. package/dist/{chunk-7BARESXI.cjs → chunk-VPNURIAY.cjs} +114 -101
  203. package/dist/chunk-VPNURIAY.cjs.map +1 -0
  204. package/dist/{chunk-I56VBDSC.js → chunk-XDFDVF2O.js} +30 -18
  205. package/dist/chunk-XDFDVF2O.js.map +1 -0
  206. package/dist/chunk-XL7TTKHP.js +327 -0
  207. package/dist/chunk-XL7TTKHP.js.map +1 -0
  208. package/dist/chunk-Y2S6QMKU.js +78 -0
  209. package/dist/chunk-Y2S6QMKU.js.map +1 -0
  210. package/dist/chunk-Y4ESBDQ5.cjs +552 -0
  211. package/dist/chunk-Y4ESBDQ5.cjs.map +1 -0
  212. package/dist/chunk-Y5KEFV5O.js +192 -0
  213. package/dist/chunk-Y5KEFV5O.js.map +1 -0
  214. package/dist/chunk-YBLIDESO.js +365 -0
  215. package/dist/chunk-YBLIDESO.js.map +1 -0
  216. package/dist/chunk-YVLP3ATI.js +1776 -0
  217. package/dist/chunk-YVLP3ATI.js.map +1 -0
  218. package/dist/chunk-YVPC65ZJ.cjs +134 -0
  219. package/dist/chunk-YVPC65ZJ.cjs.map +1 -0
  220. package/dist/{chunk-MPOWJVV4.js → chunk-YZT62IMX.js} +95 -74
  221. package/dist/chunk-YZT62IMX.js.map +1 -0
  222. package/dist/chunk-ZAIEQWRA.js +207 -0
  223. package/dist/chunk-ZAIEQWRA.js.map +1 -0
  224. package/dist/chunk-ZDEYV373.cjs +139 -0
  225. package/dist/chunk-ZDEYV373.cjs.map +1 -0
  226. package/dist/{chunk-Q7NBJFEB.js → chunk-ZGSC2CB2.js} +2 -2
  227. package/dist/{chunk-Q7NBJFEB.js.map → chunk-ZGSC2CB2.js.map} +1 -1
  228. package/dist/{chunk-3M4P2KMG.cjs → chunk-ZHBANUBI.cjs} +2 -2
  229. package/dist/{chunk-3M4P2KMG.cjs.map → chunk-ZHBANUBI.cjs.map} +1 -1
  230. package/dist/components/AlertDialog/index.cjs +18 -0
  231. package/dist/components/AlertDialog/index.cjs.map +1 -0
  232. package/dist/components/AlertDialog/index.d.cts +56 -0
  233. package/dist/components/AlertDialog/index.d.ts +56 -0
  234. package/dist/components/AlertDialog/index.js +9 -0
  235. package/dist/components/AlertDialog/index.js.map +1 -0
  236. package/dist/components/AudioRecorder/index.d.cts +1 -1
  237. package/dist/components/AudioRecorder/index.d.ts +1 -1
  238. package/dist/components/Autocomplete/index.cjs +16 -0
  239. package/dist/components/Autocomplete/index.cjs.map +1 -0
  240. package/dist/components/Autocomplete/index.d.cts +77 -0
  241. package/dist/components/Autocomplete/index.d.ts +77 -0
  242. package/dist/components/Autocomplete/index.js +7 -0
  243. package/dist/components/Autocomplete/index.js.map +1 -0
  244. package/dist/components/Badge/index.cjs +4 -3
  245. package/dist/components/Badge/index.js +2 -1
  246. package/dist/components/Card/index.cjs +16 -15
  247. package/dist/components/Card/index.js +2 -1
  248. package/dist/components/Collapsible/index.cjs +21 -0
  249. package/dist/components/Collapsible/index.cjs.map +1 -0
  250. package/dist/components/Collapsible/index.d.cts +33 -0
  251. package/dist/components/Collapsible/index.d.ts +33 -0
  252. package/dist/components/Collapsible/index.js +4 -0
  253. package/dist/components/Collapsible/index.js.map +1 -0
  254. package/dist/components/CountryCodeDropdown/index.cjs +6 -5
  255. package/dist/components/CountryCodeDropdown/index.js +3 -2
  256. package/dist/components/DateInput/index.cjs +2 -2
  257. package/dist/components/DateInput/index.d.cts +8 -2
  258. package/dist/components/DateInput/index.d.ts +8 -2
  259. package/dist/components/DateInput/index.js +1 -1
  260. package/dist/components/Dropdown/index.cjs +9 -8
  261. package/dist/components/Dropdown/index.d.cts +2 -1
  262. package/dist/components/Dropdown/index.d.ts +2 -1
  263. package/dist/components/Dropdown/index.js +3 -2
  264. package/dist/components/FloatingWindow/index.cjs +18 -0
  265. package/dist/components/FloatingWindow/index.cjs.map +1 -0
  266. package/dist/components/FloatingWindow/index.d.cts +64 -0
  267. package/dist/components/FloatingWindow/index.d.ts +64 -0
  268. package/dist/components/FloatingWindow/index.js +5 -0
  269. package/dist/components/FloatingWindow/index.js.map +1 -0
  270. package/dist/components/Label/index.cjs +17 -0
  271. package/dist/components/Label/index.cjs.map +1 -0
  272. package/dist/components/Label/index.d.cts +23 -0
  273. package/dist/components/Label/index.d.ts +23 -0
  274. package/dist/components/Label/index.js +4 -0
  275. package/dist/components/Label/index.js.map +1 -0
  276. package/dist/components/Markdown/index.cjs +51 -0
  277. package/dist/components/Markdown/index.cjs.map +1 -0
  278. package/dist/components/Markdown/index.css +331 -0
  279. package/dist/components/Markdown/index.css.map +1 -0
  280. package/dist/components/Markdown/index.d.cts +82 -0
  281. package/dist/components/Markdown/index.d.ts +82 -0
  282. package/dist/components/Markdown/index.js +10 -0
  283. package/dist/components/Markdown/index.js.map +1 -0
  284. package/dist/components/Markdown/styles.css +354 -0
  285. package/dist/components/MediaEditor/index.cjs +44 -0
  286. package/dist/components/MediaEditor/index.cjs.map +1 -0
  287. package/dist/components/MediaEditor/index.d.cts +151 -0
  288. package/dist/components/MediaEditor/index.d.ts +151 -0
  289. package/dist/components/MediaEditor/index.js +19 -0
  290. package/dist/components/MediaEditor/index.js.map +1 -0
  291. package/dist/components/MediaPlayer/index.cjs +24 -0
  292. package/dist/components/MediaPlayer/index.cjs.map +1 -0
  293. package/dist/components/MediaPlayer/index.d.cts +71 -0
  294. package/dist/components/MediaPlayer/index.d.ts +71 -0
  295. package/dist/components/MediaPlayer/index.js +7 -0
  296. package/dist/components/MediaPlayer/index.js.map +1 -0
  297. package/dist/components/RecordButton/index.cjs +4 -4
  298. package/dist/components/RecordButton/index.js +1 -1
  299. package/dist/components/RichTextEditor/index.cjs +33 -0
  300. package/dist/components/RichTextEditor/index.cjs.map +1 -0
  301. package/dist/components/RichTextEditor/index.d.cts +62 -0
  302. package/dist/components/RichTextEditor/index.d.ts +62 -0
  303. package/dist/components/RichTextEditor/index.js +12 -0
  304. package/dist/components/RichTextEditor/index.js.map +1 -0
  305. package/dist/components/ScrollArea/index.cjs +17 -0
  306. package/dist/components/ScrollArea/index.cjs.map +1 -0
  307. package/dist/components/ScrollArea/index.d.cts +22 -0
  308. package/dist/components/ScrollArea/index.d.ts +22 -0
  309. package/dist/components/ScrollArea/index.js +4 -0
  310. package/dist/components/ScrollArea/index.js.map +1 -0
  311. package/dist/components/Select/index.cjs +5 -3
  312. package/dist/components/Select/index.js +3 -1
  313. package/dist/components/Separator/index.cjs +17 -0
  314. package/dist/components/Separator/index.cjs.map +1 -0
  315. package/dist/components/Separator/index.d.cts +27 -0
  316. package/dist/components/Separator/index.d.ts +27 -0
  317. package/dist/components/Separator/index.js +4 -0
  318. package/dist/components/Separator/index.js.map +1 -0
  319. package/dist/components/Sheet/index.cjs +48 -0
  320. package/dist/components/Sheet/index.cjs.map +1 -0
  321. package/dist/components/Sheet/index.d.cts +62 -0
  322. package/dist/components/Sheet/index.d.ts +62 -0
  323. package/dist/components/Sheet/index.js +7 -0
  324. package/dist/components/Sheet/index.js.map +1 -0
  325. package/dist/components/SuperChat/index.cjs +1373 -0
  326. package/dist/components/SuperChat/index.cjs.map +1 -0
  327. package/dist/components/SuperChat/index.d.cts +189 -0
  328. package/dist/components/SuperChat/index.d.ts +189 -0
  329. package/dist/components/SuperChat/index.js +1336 -0
  330. package/dist/components/SuperChat/index.js.map +1 -0
  331. package/dist/components/SuperChat/plugins/index.cjs +1292 -0
  332. package/dist/components/SuperChat/plugins/index.cjs.map +1 -0
  333. package/dist/components/SuperChat/plugins/index.d.cts +233 -0
  334. package/dist/components/SuperChat/plugins/index.d.ts +233 -0
  335. package/dist/components/SuperChat/plugins/index.js +1252 -0
  336. package/dist/components/SuperChat/plugins/index.js.map +1 -0
  337. package/dist/components/Table/index.cjs +9 -9
  338. package/dist/components/Table/index.d.cts +4 -0
  339. package/dist/components/Table/index.d.ts +4 -0
  340. package/dist/components/Table/index.js +1 -1
  341. package/dist/components/ThemeProvider/index.cjs +7 -7
  342. package/dist/components/ThemeProvider/index.js +1 -1
  343. package/dist/components/Toggle/index.cjs +17 -0
  344. package/dist/components/Toggle/index.cjs.map +1 -0
  345. package/dist/components/Toggle/index.d.cts +28 -0
  346. package/dist/components/Toggle/index.d.ts +28 -0
  347. package/dist/components/Toggle/index.js +4 -0
  348. package/dist/components/Toggle/index.js.map +1 -0
  349. package/dist/components/TranscriptView/index.cjs +21 -0
  350. package/dist/components/TranscriptView/index.cjs.map +1 -0
  351. package/dist/components/TranscriptView/index.d.cts +55 -0
  352. package/dist/components/TranscriptView/index.d.ts +55 -0
  353. package/dist/components/TranscriptView/index.js +4 -0
  354. package/dist/components/TranscriptView/index.js.map +1 -0
  355. package/dist/datavis.cjs +268 -227
  356. package/dist/datavis.cjs.map +1 -1
  357. package/dist/datavis.d.cts +83 -9
  358. package/dist/datavis.d.ts +83 -9
  359. package/dist/datavis.js +235 -229
  360. package/dist/datavis.js.map +1 -1
  361. package/dist/esheet.cjs +184 -0
  362. package/dist/esheet.cjs.map +1 -1
  363. package/dist/esheet.d.cts +117 -0
  364. package/dist/esheet.d.ts +117 -0
  365. package/dist/esheet.js +163 -0
  366. package/dist/esheet.js.map +1 -1
  367. package/dist/hey-buddy-CLUVAY2X.cjs +1133 -0
  368. package/dist/hey-buddy-CLUVAY2X.cjs.map +1 -0
  369. package/dist/hey-buddy-NMSWZ4TN.js +1131 -0
  370. package/dist/hey-buddy-NMSWZ4TN.js.map +1 -0
  371. package/dist/hooks/index.cjs +76 -16
  372. package/dist/hooks/index.d.cts +151 -2
  373. package/dist/hooks/index.d.ts +151 -2
  374. package/dist/hooks/index.js +6 -2
  375. package/dist/html-MdxqSzjD.d.cts +13 -0
  376. package/dist/html-MdxqSzjD.d.ts +13 -0
  377. package/dist/index.cjs +10394 -6565
  378. package/dist/index.cjs.map +1 -1
  379. package/dist/index.css +331 -0
  380. package/dist/index.css.map +1 -0
  381. package/dist/index.d.cts +2020 -249
  382. package/dist/index.d.ts +2020 -249
  383. package/dist/index.js +9223 -5969
  384. package/dist/index.js.map +1 -1
  385. package/dist/kerebron.cjs +119 -0
  386. package/dist/kerebron.cjs.map +1 -0
  387. package/dist/kerebron.css +11 -0
  388. package/dist/kerebron.d.cts +23 -0
  389. package/dist/kerebron.d.ts +23 -0
  390. package/dist/kerebron.js +116 -0
  391. package/dist/kerebron.js.map +1 -0
  392. package/dist/nitroTableGrid-3J2GY6CK.cjs +47 -0
  393. package/dist/nitroTableGrid-3J2GY6CK.cjs.map +1 -0
  394. package/dist/nitroTableGrid-SIMT7635.js +25 -0
  395. package/dist/nitroTableGrid-SIMT7635.js.map +1 -0
  396. package/dist/orderRows-BUJYgSc7.d.cts +221 -0
  397. package/dist/orderRows-BUJYgSc7.d.ts +221 -0
  398. package/dist/speaker-verify-5GTWAN5Y.cjs +357 -0
  399. package/dist/speaker-verify-5GTWAN5Y.cjs.map +1 -0
  400. package/dist/speaker-verify-R67P433H.js +355 -0
  401. package/dist/speaker-verify-R67P433H.js.map +1 -0
  402. package/dist/styles/init.css +5 -0
  403. package/dist/styles.css +1 -1
  404. package/dist/tailwind-preset.cjs +4 -4
  405. package/dist/tailwind-preset.js +1 -1
  406. package/dist/transcript-oaWqY3yr.d.cts +81 -0
  407. package/dist/transcript-oaWqY3yr.d.ts +81 -0
  408. package/dist/types-BYnLjEFg.d.cts +248 -0
  409. package/dist/types-BYnLjEFg.d.ts +248 -0
  410. package/dist/types-CBh8Zlje.d.cts +240 -0
  411. package/dist/types-CyCwYBlr.d.ts +240 -0
  412. package/dist/useAnchoredPosition-nXdSFKHf.d.cts +65 -0
  413. package/dist/useAnchoredPosition-nXdSFKHf.d.ts +65 -0
  414. package/dist/useTranscriptEdits-BUylQFg0.d.cts +168 -0
  415. package/dist/useTranscriptEdits-CWYnjbGP.d.ts +168 -0
  416. package/dist/utils/index.cjs +27 -18
  417. package/dist/utils/index.d.cts +1 -0
  418. package/dist/utils/index.d.ts +1 -0
  419. package/dist/utils/index.js +3 -2
  420. package/package.json +180 -55
  421. package/dist/chunk-2DS3RJ2D.js.map +0 -1
  422. package/dist/chunk-74K3RRU7.cjs +0 -4
  423. package/dist/chunk-7BARESXI.cjs.map +0 -1
  424. package/dist/chunk-CV4CVGLO.cjs.map +0 -1
  425. package/dist/chunk-DNPRRYPQ.js.map +0 -1
  426. package/dist/chunk-FRT6RQND.cjs.map +0 -1
  427. package/dist/chunk-HYEJLKXI.js +0 -476
  428. package/dist/chunk-HYEJLKXI.js.map +0 -1
  429. package/dist/chunk-I56VBDSC.js.map +0 -1
  430. package/dist/chunk-IBZXDX4L.cjs.map +0 -1
  431. package/dist/chunk-IKMR2ADM.cjs +0 -25
  432. package/dist/chunk-IKMR2ADM.cjs.map +0 -1
  433. package/dist/chunk-JHPFOG2N.cjs.map +0 -1
  434. package/dist/chunk-K7IGBNZA.cjs.map +0 -1
  435. package/dist/chunk-LEMY57MI.js +0 -3
  436. package/dist/chunk-MPOWJVV4.js.map +0 -1
  437. package/dist/chunk-NINI4WVS.cjs.map +0 -1
  438. package/dist/chunk-OKBR6PX4.js +0 -23
  439. package/dist/chunk-OKBR6PX4.js.map +0 -1
  440. package/dist/chunk-OYKS2JBB.cjs.map +0 -1
  441. package/dist/chunk-QVJBUWJQ.js.map +0 -1
  442. package/dist/chunk-R25H4N4Z.js.map +0 -1
  443. package/dist/chunk-V2DF2GUE.js +0 -3
  444. package/dist/chunk-WFS6R2F5.js.map +0 -1
  445. package/dist/ozwell.cjs +0 -385
  446. package/dist/ozwell.cjs.map +0 -1
  447. package/dist/ozwell.d.cts +0 -15
  448. package/dist/ozwell.d.ts +0 -15
  449. package/dist/ozwell.js +0 -360
  450. package/dist/ozwell.js.map +0 -1
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Patient history — the minimal longitudinal facts the health-surveillance
3
+ * due engine needs: who the patient is (age, sex) and what has been done or
4
+ * is in flight (orders with status, observations, procedures, immunizations),
5
+ * plus problem-list context (conditions) and allergies for display/interop.
6
+ *
7
+ * All clinical entries are keyed by `CODETYPE|FULLCODE` — the same keys used
8
+ * by programs.json order sets and the codify shards — so the due engine can
9
+ * match history against a program's satisfying orders with plain string
10
+ * equality.
11
+ */
12
+ /** ISO date string (YYYY-MM-DD or full ISO timestamp). */
13
+ type IsoDate = string;
14
+ interface HistoryOrder {
15
+ /** CODETYPE|FULLCODE, e.g. "Quest Order|3058" or "HCPCS|92551" */
16
+ key: string;
17
+ /** Display label (optional; the due list falls back to the key) */
18
+ label?: string;
19
+ status: 'completed' | 'pending';
20
+ /** Completion date for completed orders; order date for pending ones */
21
+ date: IsoDate;
22
+ /** Ordering/performing provider display name (e.g. "Dr. Patel") */
23
+ provider?: string;
24
+ /** Requisition the order was bundled into — the document routing a batch
25
+ * of encounter orders to a provider/referral (e.g. "REQ-2024-0117") */
26
+ requisitionId?: string;
27
+ /** Encounter (visit) the order was placed in (e.g. "ENC-2024-0117") */
28
+ encounterId?: string;
29
+ }
30
+ interface HistoryObservation {
31
+ /** CODETYPE|FULLCODE, e.g. "LOINC|4548-4" (HbA1c) */
32
+ key: string;
33
+ label?: string;
34
+ /** Display value with units, e.g. "7.2 %" or "38 ug/dL" */
35
+ value?: string;
36
+ date: IsoDate;
37
+ }
38
+ interface HistoryProcedure {
39
+ key: string;
40
+ label?: string;
41
+ date: IsoDate;
42
+ }
43
+ interface HistoryImmunization {
44
+ /** CODETYPE|FULLCODE, e.g. "CVX|88" */
45
+ key: string;
46
+ label?: string;
47
+ date: IsoDate;
48
+ }
49
+ interface HistoryCondition {
50
+ key: string;
51
+ label?: string;
52
+ onset?: IsoDate;
53
+ }
54
+ interface HistoryAllergy {
55
+ /** Allergen key when coded (e.g. "RxNORM|7980"), else omit */
56
+ key?: string;
57
+ label: string;
58
+ reaction?: string;
59
+ severity?: 'mild' | 'moderate' | 'severe';
60
+ }
61
+ interface HistoryMedication {
62
+ key?: string;
63
+ label: string;
64
+ /** Sig / dose display, e.g. "10 mg daily" */
65
+ detail?: string;
66
+ }
67
+ interface PatientHistory {
68
+ /** Age in years */
69
+ age: number;
70
+ sex: 'M' | 'F';
71
+ /** Past + in-flight orders (completion drives the due engine) */
72
+ orders: HistoryOrder[];
73
+ observations?: HistoryObservation[];
74
+ procedures?: HistoryProcedure[];
75
+ immunizations?: HistoryImmunization[];
76
+ conditions?: HistoryCondition[];
77
+ allergies?: HistoryAllergy[];
78
+ medications?: HistoryMedication[];
79
+ }
80
+
81
+ /**
82
+ * Due-evaluation engine — the "knowledge" layer of health surveillance.
83
+ * Given a patient's history and the program metadata (programs.json from
84
+ * mieweb/codify, or a deployment's own), decides which programs/measures are
85
+ * due, overdue, pending, or satisfied. Pure functions, no I/O — the metadata
86
+ * is small, so this runs on the main thread.
87
+ */
88
+
89
+ /**
90
+ * One entry in a program's order set:
91
+ * - `"CODETYPE|FULLCODE"` — a plain required order
92
+ * - `{ alt: [a, b] }` — mutually exclusive alternatives (one-of): a
93
+ * colonoscopy OR a FIT satisfies colorectal screening
94
+ * - `{ key, after: […] }` — depends on completed prerequisites (Gantt edge):
95
+ * the RMO's fitness-for-duty determination needs the panel results first,
96
+ * and a program may carry several determinations (per panel / per SEG)
97
+ */
98
+ type ProgramOrder = string | {
99
+ key?: string;
100
+ alt?: string[];
101
+ after?: string[];
102
+ };
103
+ /** Program metadata — mirrors programs.json (see mieweb/codify). */
104
+ interface ProgramMeta {
105
+ kind?: 'surveillance' | 'fitness' | 'credential' | 'quality';
106
+ /** Omitted = one-time / event-driven (satisfied forever once done) */
107
+ periodicityMonths?: number;
108
+ ageMin?: number;
109
+ ageMax?: number;
110
+ sex?: 'M' | 'F';
111
+ /** Satisfying orders — plain keys, one-of alternatives, or dependent
112
+ * entries (see ProgramOrder) */
113
+ orders?: ProgramOrder[];
114
+ }
115
+ type ProgramsMap = Record<string, ProgramMeta>;
116
+ type DueStatus = 'due' | 'overdue' | 'pending' | 'satisfied' | 'not-applicable';
117
+ interface DueItem {
118
+ /** Program key, CODETYPE|FULLCODE (e.g. "OSHA|1910.95", "eCQM|CMS125") */
119
+ key: string;
120
+ program: ProgramMeta;
121
+ status: DueStatus;
122
+ /** Most recent completion date of any satisfying order */
123
+ lastCompleted?: string;
124
+ /** When the current/last satisfaction lapses (satisfied/overdue only) */
125
+ dueDate?: string;
126
+ /** Satisfying orders currently pending */
127
+ pendingKeys: string[];
128
+ }
129
+ /** Is the patient inside the program's age/sex gates? */
130
+ declare function isApplicable(history: Pick<PatientHistory, 'age' | 'sex'>, program: ProgramMeta): boolean;
131
+ /**
132
+ * Evaluate one program against the history.
133
+ * `now` defaults to today; injectable for tests.
134
+ */
135
+ declare function evaluateProgram(key: string, program: ProgramMeta, history: PatientHistory, now?: Date): DueItem;
136
+ /**
137
+ * Evaluate a set of programs against the history, most actionable first
138
+ * (overdue → due → pending → satisfied; not-applicable omitted unless
139
+ * `includeNotApplicable`).
140
+ *
141
+ * `enrolledKeys` restricts occupational programs to the patient's actual
142
+ * enrollments (a clerk isn't due for cadmium surveillance just because the
143
+ * program exists); quality measures apply to everyone passing their gates.
144
+ */
145
+ declare function evaluateDue(history: PatientHistory, programs: ProgramsMap, options?: {
146
+ enrolledKeys?: string[];
147
+ includeNotApplicable?: boolean;
148
+ now?: Date;
149
+ }): DueItem[];
150
+ /**
151
+ * Ordering-time prompt: is this order key part of a due/overdue program?
152
+ * Returns the matching due items so the UI can badge "due for OSHA 1910.95"
153
+ * or warn "already satisfied" while the clinician is ordering.
154
+ */
155
+ declare function dueForOrder(orderKey: string, dueItems: DueItem[]): DueItem[];
156
+
157
+ /**
158
+ * Order-row builders — flatten the order history and the due-evaluation
159
+ * output into grid-friendly rows (one row per encounter order) for the
160
+ * NITRO-backed ChartOrdersGrid / EncounterOrdersGrid.
161
+ *
162
+ * Pure functions, no I/O. Every field is a flat string so the DataVis engine
163
+ * can group/filter/aggregate on any of them (reason, provider, requisition,
164
+ * status, kind, date).
165
+ */
166
+
167
+ /** Per-order status — finer grained than the program-level DueStatus. */
168
+ type OrderRowStatus = 'completed' | 'pending' | 'available' | 'blocked';
169
+ /** One encounter order as a flat grid row. */
170
+ interface OrderRow {
171
+ /** CODETYPE|FULLCODE of the order */
172
+ orderKey: string;
173
+ /** Order display label */
174
+ order: string;
175
+ /** Reason/concern — the surveillance program or quality measure label */
176
+ reason: string;
177
+ /** Program key (CODETYPE|FULLCODE); '' when no program matches */
178
+ reasonKey: string;
179
+ /** Program kind label ('surveillance', 'quality measure', …) */
180
+ kind: string;
181
+ status: OrderRowStatus;
182
+ /** Completion date (completed) or order date (pending); '' otherwise */
183
+ date: string;
184
+ /** Program due date, when known */
185
+ dueDate: string;
186
+ /** Ordering/performing provider; '' when unknown */
187
+ provider: string;
188
+ /** Requisition the order is bundled into; '' = unprocessed */
189
+ requisitionId: string;
190
+ /** Encounter the order was placed in; '' for not-yet-placed rows */
191
+ encounterId: string;
192
+ /** Unmet prerequisite labels, comma-joined ('' when unblocked) */
193
+ blockedBy: string;
194
+ }
195
+ interface OrderRowsOptions {
196
+ /** Occupational enrollments; quality measures apply to everyone in-gate */
197
+ enrolledKeys?: string[];
198
+ /** Evaluation clock (defaults to today; inject for determinism) */
199
+ now?: Date;
200
+ /** Display labels for program keys (falls back to the key) */
201
+ programLabels?: Record<string, string>;
202
+ /** Display labels for order keys (falls back to history labels, then key) */
203
+ orderLabels?: Record<string, string>;
204
+ /** Include not-yet-placed due-list orders as available/blocked rows
205
+ * (default true) */
206
+ includeDue?: boolean;
207
+ }
208
+ /**
209
+ * Chart-wide rows: every past + in-flight order in the history, plus (by
210
+ * default) the actionable due-list orders that haven't been placed yet
211
+ * (`available`, or `blocked` while prerequisites are incomplete).
212
+ */
213
+ declare function buildChartOrderRows(history: PatientHistory, programs: ProgramsMap, options?: OrderRowsOptions): OrderRow[];
214
+ /**
215
+ * Current-encounter rows: the encounter's own orders (pending unprocessed
216
+ * ones are the mass-operation targets) plus the actionable due-list orders
217
+ * available to place this visit.
218
+ */
219
+ declare function buildEncounterOrderRows(history: PatientHistory, programs: ProgramsMap, encounterId: string, options?: OrderRowsOptions): OrderRow[];
220
+
221
+ export { type DueItem as D, type HistoryAllergy as H, type IsoDate as I, type OrderRow as O, type PatientHistory as P, type ProgramsMap as a, type DueStatus as b, type HistoryCondition as c, type HistoryImmunization as d, type HistoryMedication as e, type HistoryObservation as f, type HistoryOrder as g, type HistoryProcedure as h, type OrderRowStatus as i, type OrderRowsOptions as j, type ProgramMeta as k, buildChartOrderRows as l, buildEncounterOrderRows as m, dueForOrder as n, evaluateDue as o, evaluateProgram as p, isApplicable as q };
@@ -0,0 +1,357 @@
1
+ 'use strict';
2
+
3
+ // src/components/AI/HeyOzwell/SpeakerVerify/lib/speaker-verify.js
4
+ (function() {
5
+ const SV_DIR = (function() {
6
+ var pick = function(w) {
7
+ try {
8
+ return w && w.__ozwellAssets;
9
+ } catch (e) {
10
+ return null;
11
+ }
12
+ };
13
+ var g = typeof window !== "undefined" ? pick(window) || pick(window.parent) || pick(window.top) : null;
14
+ var strip = function(s) {
15
+ return String(s).replace(/\/$/, "");
16
+ };
17
+ if (typeof g === "string") return strip(g) + "/sv-runtime";
18
+ if (g && g.svRuntime) return strip(g.svRuntime);
19
+ if (g && g.base) return strip(g.base) + "/sv-runtime";
20
+ try {
21
+ var ls = localStorage.getItem("ozwellAssetBase");
22
+ if (ls) return strip(ls) + "/sv-runtime";
23
+ } catch (e) {
24
+ }
25
+ return "https://huggingface.co/jlocala/ozwell-voice-assets/resolve/main/sv-runtime";
26
+ })();
27
+ const MODEL = "./nemo_en_titanet_small.onnx";
28
+ const LS_KEY = "ozwellDoctorVoiceprint";
29
+ const DEFAULT_THRESHOLD = 0.45;
30
+ let Module = null, handle = 0, dim = 0;
31
+ let cohort = [];
32
+ let readyResolve, readyReject;
33
+ const readyPromise = new Promise((res, rej) => {
34
+ readyResolve = res;
35
+ readyReject = rej;
36
+ });
37
+ function loadScript(src) {
38
+ return new Promise((res, rej) => {
39
+ const s = document.createElement("script");
40
+ s.src = src;
41
+ s.onload = res;
42
+ s.onerror = () => rej(new Error("failed to load " + src));
43
+ document.head.appendChild(s);
44
+ });
45
+ }
46
+ function computeEmbedding(samples, sampleRate) {
47
+ const M = Module;
48
+ const stream = M._SherpaOnnxSpeakerEmbeddingExtractorCreateStream(handle);
49
+ const ptr = M._malloc(samples.length * 4);
50
+ M.HEAPF32.set(samples, ptr / 4);
51
+ M._SherpaOnnxOnlineStreamAcceptWaveform(stream, sampleRate, ptr, samples.length);
52
+ M._free(ptr);
53
+ M._SherpaOnnxOnlineStreamInputFinished(stream);
54
+ const ep = M._SherpaOnnxSpeakerEmbeddingExtractorComputeEmbedding(handle, stream);
55
+ const out = M.HEAPF32.subarray(ep / 4, ep / 4 + dim).slice();
56
+ if (M._SherpaOnnxSpeakerEmbeddingExtractorDestroyEmbedding) {
57
+ M._SherpaOnnxSpeakerEmbeddingExtractorDestroyEmbedding(ep);
58
+ }
59
+ M._SherpaOnnxDestroyOnlineStream(stream);
60
+ return l2normalize(out);
61
+ }
62
+ function l2normalize(v) {
63
+ let s = 0;
64
+ for (let i = 0; i < v.length; i++) s += v[i] * v[i];
65
+ s = Math.sqrt(s);
66
+ if (s > 0) for (let i = 0; i < v.length; i++) v[i] /= s;
67
+ return v;
68
+ }
69
+ function cosine(a, b) {
70
+ let d = 0;
71
+ const n = Math.min(a.length, b.length);
72
+ for (let i = 0; i < n; i++) d += a[i] * b[i];
73
+ return d;
74
+ }
75
+ const IDB_DB = "ozwell-voice", IDB_STORE = "voiceprints";
76
+ function idbOpen() {
77
+ return new Promise((resolve, reject) => {
78
+ const req = indexedDB.open(IDB_DB, 1);
79
+ req.onupgradeneeded = () => {
80
+ if (!req.result.objectStoreNames.contains(IDB_STORE)) req.result.createObjectStore(IDB_STORE);
81
+ };
82
+ req.onsuccess = () => resolve(req.result);
83
+ req.onerror = () => reject(req.error);
84
+ });
85
+ }
86
+ function idbReq(mode, run) {
87
+ return idbOpen().then((db) => new Promise((resolve, reject) => {
88
+ const tx = db.transaction(IDB_STORE, mode);
89
+ const r = run(tx.objectStore(IDB_STORE));
90
+ tx.oncomplete = () => {
91
+ resolve(r && r.result);
92
+ db.close();
93
+ };
94
+ tx.onerror = () => {
95
+ reject(tx.error);
96
+ db.close();
97
+ };
98
+ tx.onabort = () => {
99
+ reject(tx.error);
100
+ db.close();
101
+ };
102
+ }));
103
+ }
104
+ const idbGet = (key) => idbReq("readonly", (s) => s.get(key));
105
+ const idbPut = (key, v) => idbReq("readwrite", (s) => s.put(v, key));
106
+ const idbDel = (key) => idbReq("readwrite", (s) => s.delete(key));
107
+ let _store = null;
108
+ const normalizeWho = (o) => o && Array.isArray(o.centroid) ? {} : o || {};
109
+ async function hydrateStore() {
110
+ try {
111
+ let v = await idbGet(LS_KEY);
112
+ if (v === void 0) {
113
+ let raw = null;
114
+ try {
115
+ raw = localStorage.getItem(LS_KEY);
116
+ } catch (e) {
117
+ }
118
+ if (raw != null) {
119
+ v = normalizeWho(JSON.parse(raw || "{}"));
120
+ await idbPut(LS_KEY, v);
121
+ try {
122
+ localStorage.removeItem(LS_KEY);
123
+ } catch (e) {
124
+ }
125
+ }
126
+ }
127
+ _store = v || {};
128
+ } catch (e) {
129
+ _store = _store || {};
130
+ }
131
+ }
132
+ function loadAll() {
133
+ if (_store) return _store;
134
+ try {
135
+ return normalizeWho(JSON.parse(localStorage.getItem(LS_KEY) || "{}"));
136
+ } catch (e) {
137
+ return {};
138
+ }
139
+ }
140
+ function saveAll(obj) {
141
+ _store = obj;
142
+ idbPut(LS_KEY, obj).catch((e) => console.warn("SV save failed", e));
143
+ }
144
+ const DEFAULT_VOICE_ID = "you";
145
+ function normPhrase(o) {
146
+ if (!o) return { voices: {} };
147
+ if (o.voices) return o;
148
+ if (Array.isArray(o.centroids)) return { voices: { [DEFAULT_VOICE_ID]: { label: "You", createdAt: 0, centroids: o.centroids } } };
149
+ if (Array.isArray(o.centroid)) return { voices: { [DEFAULT_VOICE_ID]: { label: "You", createdAt: 0, centroids: [o.centroid] } } };
150
+ return { voices: {} };
151
+ }
152
+ function allCentroids(phrase) {
153
+ const voices = normPhrase(loadAll()[phrase]).voices;
154
+ const out = [];
155
+ for (const id in voices) for (const c of voices[id].centroids || []) out.push(Float32Array.from(c));
156
+ return out;
157
+ }
158
+ const SpeakerVerify = {
159
+ ready: () => readyPromise,
160
+ isLoaded: () => handle !== 0,
161
+ threshold: DEFAULT_THRESHOLD,
162
+ // AS-norm (score normalization): normalize the raw cosine against a crowd of other voices, so the
163
+ // threshold stays stable when a room/mic drags scores down. PRIMARY gate when a cohort is loaded (znorm
164
+ // != null); falls back to raw cosine only when there's no cohort. Turned on after live diagnostics showed
165
+ // the genuine speaker scoring z 2–3.4 (well clear of 1.5) while raw cosine sat at 0.33–0.43 — i.e. raw
166
+ // cosine was rejecting the real speaker in a room/mic that differed from enrollment, and AS-norm fixes it.
167
+ useAsnorm: true,
168
+ znormThreshold: 1.5,
169
+ // "at least N std above the crowd"; tune from genuine vs real-impostor z-scores
170
+ cohortSize: () => cohort.length,
171
+ embeddingDim: () => dim,
172
+ /** Enroll a VOICE for a phrase from N utterances → one condition-centroid under opts.voiceId
173
+ * (default "you"). opts.append ADDS it as another condition for that voice; otherwise it replaces
174
+ * that voice's conditions. opts.label names the voice. Capped to the most recent SV_CENTROID_CAP. */
175
+ enroll(phrase, utterances, opts) {
176
+ if (!handle) throw new Error("SpeakerVerify not ready");
177
+ const voiceId = opts && opts.voiceId || DEFAULT_VOICE_ID;
178
+ const embs = utterances.map((u) => computeEmbedding(u.samples, u.sampleRate));
179
+ const c = new Float32Array(dim);
180
+ for (const e of embs) for (let i = 0; i < dim; i++) c[i] += e[i];
181
+ for (let i = 0; i < dim; i++) c[i] /= embs.length;
182
+ l2normalize(c);
183
+ const all = loadAll();
184
+ const entry = normPhrase(all[phrase]);
185
+ const prevVoice = entry.voices[voiceId];
186
+ const prev = opts && opts.append && prevVoice && Array.isArray(prevVoice.centroids) ? prevVoice.centroids.map((x) => Float32Array.from(x)) : [];
187
+ const centroids = prev.concat([c]).slice(-6).map((v) => Array.from(v));
188
+ entry.voices[voiceId] = {
189
+ // keep the existing label when appending; otherwise use the provided one (or a sensible default)
190
+ label: prevVoice && opts && opts.append ? prevVoice.label : opts && opts.label || (voiceId === DEFAULT_VOICE_ID ? "You" : "Voice"),
191
+ createdAt: prevVoice && prevVoice.createdAt || Date.now(),
192
+ centroids
193
+ };
194
+ all[phrase] = entry;
195
+ saveAll(all);
196
+ return { n: embs.length, conditions: centroids.length, voiceId };
197
+ },
198
+ /** Verify a live utterance against the BEST condition-centroid across ALL enrolled voices. */
199
+ verify(phrase, samples, sampleRate) {
200
+ const cents = allCentroids(phrase);
201
+ if (!cents.length) return { score: 0, znorm: null, pass: false, enrolled: false };
202
+ const live = computeEmbedding(samples, sampleRate);
203
+ let score = -1;
204
+ for (const c of cents) {
205
+ const s = cosine(live, c);
206
+ if (s > score) score = s;
207
+ }
208
+ let znorm = null;
209
+ if (cohort.length) {
210
+ let sum = 0, sum2 = 0;
211
+ for (const cv of cohort) {
212
+ const s = cosine(live, cv);
213
+ sum += s;
214
+ sum2 += s * s;
215
+ }
216
+ const m = cohort.length, mean = sum / m, std = Math.sqrt(Math.max(sum2 / m - mean * mean, 1e-9));
217
+ znorm = (score - mean) / std;
218
+ }
219
+ const pass = SpeakerVerify.useAsnorm && znorm !== null ? znorm >= SpeakerVerify.znormThreshold : score >= SpeakerVerify.threshold;
220
+ return { score, znorm, pass, enrolled: true };
221
+ },
222
+ /** How many conditions are enrolled for a phrase, across ALL voices (0 = none). */
223
+ conditionCount: (phrase) => allCentroids(phrase).length,
224
+ /** TitaNet speaker embedding for a raw utterance (Float32 + true sample rate). For diarization /
225
+ * clustering. Returns the L2-normalized embedding, or null if the runtime isn't ready. */
226
+ embed(samples, sampleRate) {
227
+ return handle ? computeEmbedding(samples, sampleRate) : null;
228
+ },
229
+ /** Best-matching ENROLLED voice for a live utterance, across all voices + phrases (text-independent,
230
+ * so conversational audio works). Returns { voiceId, label, score } (max cosine) or null if nothing
231
+ * enrolled / not ready. The caller applies a threshold to decide whether to trust the name. */
232
+ identify(samples, sampleRate) {
233
+ if (!handle) return null;
234
+ const live = computeEmbedding(samples, sampleRate);
235
+ const all = loadAll();
236
+ const best = {};
237
+ for (const phrase in all) {
238
+ const voices = normPhrase(all[phrase]).voices;
239
+ for (const id in voices) {
240
+ for (const c of voices[id].centroids || []) {
241
+ const s = cosine(live, Float32Array.from(c));
242
+ if (!best[id] || s > best[id].score) best[id] = { label: voices[id].label, score: s };
243
+ }
244
+ }
245
+ }
246
+ let top = null;
247
+ for (const id in best) {
248
+ if (!top || best[id].score > top.score) top = { voiceId: id, label: best[id].label, score: best[id].score };
249
+ }
250
+ return top;
251
+ },
252
+ /** List enrolled voices aggregated across phrases: [{ id, label, createdAt, conditions }]. */
253
+ listVoices() {
254
+ const all = loadAll();
255
+ const acc = {};
256
+ for (const phrase in all) {
257
+ const voices = normPhrase(all[phrase]).voices;
258
+ for (const id in voices) {
259
+ const v = voices[id];
260
+ const conds = (v.centroids || []).length;
261
+ if (!acc[id]) acc[id] = { id, label: v.label || id, createdAt: v.createdAt || 0, conditions: conds };
262
+ else {
263
+ acc[id].conditions = Math.max(acc[id].conditions, conds);
264
+ if (v.label) acc[id].label = v.label;
265
+ if (v.createdAt && (!acc[id].createdAt || v.createdAt < acc[id].createdAt)) acc[id].createdAt = v.createdAt;
266
+ }
267
+ }
268
+ }
269
+ return Object.keys(acc).map((k) => acc[k]).sort((a, b) => a.createdAt - b.createdAt);
270
+ },
271
+ /** Remove a voice across all phrases — revokes that person's WHO match (the WHAT phrase-prints,
272
+ * which are shared/speaker-independent, are left in voiceprintStore). */
273
+ removeVoice(voiceId) {
274
+ const all = loadAll();
275
+ let changed = false;
276
+ for (const phrase in all) {
277
+ const entry = normPhrase(all[phrase]);
278
+ if (entry.voices[voiceId]) {
279
+ delete entry.voices[voiceId];
280
+ all[phrase] = entry;
281
+ changed = true;
282
+ }
283
+ }
284
+ if (changed) saveAll(all);
285
+ },
286
+ /** Rename a voice across all phrases. */
287
+ renameVoice(voiceId, label) {
288
+ const all = loadAll();
289
+ let changed = false;
290
+ for (const phrase in all) {
291
+ const entry = normPhrase(all[phrase]);
292
+ if (entry.voices[voiceId]) {
293
+ entry.voices[voiceId].label = label;
294
+ all[phrase] = entry;
295
+ changed = true;
296
+ }
297
+ }
298
+ if (changed) saveAll(all);
299
+ },
300
+ // hasEnrollment(phrase) -> is that phrase enrolled; hasEnrollment() -> is anything enrolled.
301
+ hasEnrollment: (phrase) => phrase ? allCentroids(phrase).length > 0 : Object.keys(loadAll()).some((p) => allCentroids(p).length > 0),
302
+ enrolledPhrases: () => Object.keys(loadAll()),
303
+ clearEnrollment: () => {
304
+ _store = {};
305
+ idbDel(LS_KEY).catch(() => {
306
+ });
307
+ try {
308
+ localStorage.removeItem(LS_KEY);
309
+ } catch (e) {
310
+ }
311
+ }
312
+ };
313
+ async function init() {
314
+ const prevModule = window.Module;
315
+ try {
316
+ window.Module = { locateFile: (path) => SV_DIR + "/" + path };
317
+ const onRuntime = new Promise((res) => {
318
+ window.Module.onRuntimeInitialized = res;
319
+ });
320
+ await loadScript(SV_DIR + "/sherpa-onnx-speaker-diarization.js");
321
+ await loadScript(SV_DIR + "/sherpa-onnx-wasm-main-speaker-diarization.js");
322
+ await onRuntime;
323
+ Module = window.Module;
324
+ window.Module = prevModule;
325
+ const cfg = initSherpaOnnxSpeakerEmbeddingExtractorConfig(
326
+ { model: MODEL, numThreads: 1, debug: 0, provider: "cpu" },
327
+ Module
328
+ );
329
+ handle = Module._SherpaOnnxCreateSpeakerEmbeddingExtractor(cfg.ptr);
330
+ Module._free(cfg.buffer);
331
+ Module._free(cfg.ptr);
332
+ if (!handle) throw new Error("CreateSpeakerEmbeddingExtractor returned null");
333
+ dim = Module._SherpaOnnxSpeakerEmbeddingExtractorDim(handle);
334
+ console.log("[SpeakerVerify] ready \u2014 embedding dim", dim);
335
+ try {
336
+ const r = await fetch(SV_DIR + "/sv-cohort.json");
337
+ if (r.ok) {
338
+ cohort = (await r.json()).map((v) => Float32Array.from(v));
339
+ console.log("[SpeakerVerify] AS-norm cohort:", cohort.length);
340
+ }
341
+ } catch (e) {
342
+ console.warn("[SpeakerVerify] cohort load failed (AS-norm off):", e);
343
+ }
344
+ await hydrateStore();
345
+ readyResolve(SpeakerVerify);
346
+ } catch (e) {
347
+ window.Module = prevModule;
348
+ console.error("[SpeakerVerify] init failed:", e);
349
+ readyReject(e);
350
+ }
351
+ }
352
+ window.SpeakerVerify = SpeakerVerify;
353
+ if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", init);
354
+ else init();
355
+ })();
356
+ //# sourceMappingURL=speaker-verify-5GTWAN5Y.cjs.map
357
+ //# sourceMappingURL=speaker-verify-5GTWAN5Y.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/AI/HeyOzwell/SpeakerVerify/lib/speaker-verify.js"],"names":[],"mappings":"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","file":"speaker-verify-5GTWAN5Y.cjs","sourcesContent":["/**\n * On-device speaker-verification gate (the \"only the enrolled doctor can wake it\" layer).\n *\n * Loads the custom single-threaded sherpa-onnx WASM build (in /sv-wasm/) that exports the\n * SpeakerEmbeddingExtractor C-API, runs TitaNet speaker embeddings fully in-browser, and\n * verifies a live utterance against enrolled per-voice centroids stored in IndexedDB (db `ozwell-voice`,\n * migrated from the old localStorage format on first read).\n *\n * Proven in the /sv-wasm/ spike: a ~1s \"hey ozwell\" gives genuine cosine ~0.66 / impostor\n * ~0.30 (enroll-centroid: ~0.75 vs ~0.22, EER ~1.3%). This is a DIFFERENT axis from the\n * content voiceprint in hey-buddy.js: that BOOSTS the doctor's accented phrase (recall);\n * this BLOCKS a non-doctor's clean phrase (act/no-act). They compose.\n *\n * Loaded via dynamic import by the `useSpeakerVerify` hook (NOT a classic <script>). Exposes window.SpeakerVerify.\n * Audio in == Float32Array; pass its TRUE sample rate (sherpa resamples to 16k internally).\n */\n(function () {\n // Production runtime artifacts live in their OWN folder so they never clobber the\n // frozen feasibility proof in /sv-wasm (test.html + mic-test.html, kept for the\n // progression demo / YouTube short). This loads the single-threaded slim build.\n // Where the sherpa runtime (.js glue + .wasm + .data) and the AS-norm cohort are served from.\n // Default \"/sv-runtime\" (Storybook static dir). Set window.__ozwellAssets (a base URL string, or\n // { base, svRuntime }) to fetch the ~50 MB off the repo from a host — see AI/MODEL-HOSTING.md.\n const SV_DIR = (function () {\n // Storybook runs in an iframe; a console-set window.__ozwellAssets often lands on the parent frame,\n // so check current -> parent -> top (all same-origin).\n var pick = function (w) { try { return w && w.__ozwellAssets; } catch (e) { return null; } };\n var g = (typeof window !== \"undefined\") ? (pick(window) || pick(window.parent) || pick(window.top)) : null;\n var strip = function (s) { return String(s).replace(/\\/$/, \"\"); };\n if (typeof g === \"string\") return strip(g) + \"/sv-runtime\";\n if (g && g.svRuntime) return strip(g.svRuntime);\n if (g && g.base) return strip(g.base) + \"/sv-runtime\";\n // localStorage fallback — shared across Storybook frames, survives reload (the reliable path).\n try { var ls = localStorage.getItem(\"ozwellAssetBase\"); if (ls) return strip(ls) + \"/sv-runtime\"; } catch (e) { /* ignore */ }\n // Default host: the runtime was moved off the repo (see AI/MODEL-HOSTING.md) so a fresh clone\n // fetches it from here with no config. Override via window.__ozwellAssets / localStorage.\n return \"https://huggingface.co/jlocala/ozwell-voice-assets/resolve/main/sv-runtime\";\n })();\n const MODEL = \"./nemo_en_titanet_small.onnx\"; // preloaded into the WASM filesystem\n const LS_KEY = \"ozwellDoctorVoiceprint\"; // { centroid: number[], n: number }\n // Threshold from the spike's enroll-centroid distributions (genuine ~0.75 / impostor ~0.22).\n // 0.45 (2026-06-22): with mic DSP on + matched enrollment the genuine doctor scores ~0.75-0.93 clean,\n // so 0.45 passes with wide margin and rejects impostors harder. Heavy background can still drag the doctor\n // toward ~0.4 (then 0.45 rejects -> \"say it again\", a fail-safe miss in an unrealistic-noise case).\n // Re-tune live: window.SpeakerVerify.threshold = 0.4 / 0.35 for heavy noise (don't go below ~0.3 — impostors).\n const DEFAULT_THRESHOLD = 0.45;\n\n let Module = null, handle = 0, dim = 0;\n let cohort = []; // AS-norm crowd: other-voice embeddings; live/centroid scored against it cancels channel\n let readyResolve, readyReject;\n const readyPromise = new Promise((res, rej) => { readyResolve = res; readyReject = rej; });\n\n function loadScript(src) {\n return new Promise((res, rej) => {\n const s = document.createElement(\"script\");\n s.src = src; s.onload = res; s.onerror = () => rej(new Error(\"failed to load \" + src));\n document.head.appendChild(s);\n });\n }\n\n // --- speaker-embedding extraction over the WASM C-API (names confirmed from the build) ---\n function computeEmbedding(samples, sampleRate) {\n const M = Module;\n const stream = M._SherpaOnnxSpeakerEmbeddingExtractorCreateStream(handle);\n const ptr = M._malloc(samples.length * 4);\n M.HEAPF32.set(samples, ptr / 4);\n M._SherpaOnnxOnlineStreamAcceptWaveform(stream, sampleRate, ptr, samples.length); // stream-only\n M._free(ptr);\n M._SherpaOnnxOnlineStreamInputFinished(stream);\n const ep = M._SherpaOnnxSpeakerEmbeddingExtractorComputeEmbedding(handle, stream);\n const out = M.HEAPF32.subarray(ep / 4, ep / 4 + dim).slice();\n // free the embedding (exported in the slim rebuild); guard in case it's absent.\n if (M._SherpaOnnxSpeakerEmbeddingExtractorDestroyEmbedding) {\n M._SherpaOnnxSpeakerEmbeddingExtractorDestroyEmbedding(ep);\n }\n M._SherpaOnnxDestroyOnlineStream(stream);\n return l2normalize(out);\n }\n\n function l2normalize(v) {\n let s = 0; for (let i = 0; i < v.length; i++) s += v[i] * v[i];\n s = Math.sqrt(s); if (s > 0) for (let i = 0; i < v.length; i++) v[i] /= s;\n return v;\n }\n function cosine(a, b) { let d = 0; const n = Math.min(a.length, b.length); for (let i = 0; i < n; i++) d += a[i] * b[i]; return d; } // both L2-normalized\n\n // --- enrollment storage: PER-PHRASE centroids of the doctor's embeddings (vectors, not\n // audio). Per-phrase because on a ~1s clip a speaker embedding still carries a little of\n // WHAT was said, so the doctor's \"hey ozwell\" centroid scores their \"ozwell i'm done\"\n // too low. We enroll + gate each phrase against its own centroid. ---\n // --- WHO-centroid persistence on IndexedDB (replaces localStorage; same db/store as voiceprintStore.ts).\n // verify()/enroll() read these synchronously, so we keep an in-memory `_store` hydrated from IndexedDB on\n // init (before ready() resolves) and write through on save. ---\n const IDB_DB = \"ozwell-voice\", IDB_STORE = \"voiceprints\";\n function idbOpen() {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(IDB_DB, 1);\n req.onupgradeneeded = () => { if (!req.result.objectStoreNames.contains(IDB_STORE)) req.result.createObjectStore(IDB_STORE); };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n }\n function idbReq(mode, run) {\n return idbOpen().then((db) => new Promise((resolve, reject) => {\n const tx = db.transaction(IDB_STORE, mode);\n const r = run(tx.objectStore(IDB_STORE));\n tx.oncomplete = () => { resolve(r && r.result); db.close(); };\n tx.onerror = () => { reject(tx.error); db.close(); };\n tx.onabort = () => { reject(tx.error); db.close(); }; // else an aborted tx leaves the promise pending\n }));\n }\n const idbGet = (key) => idbReq(\"readonly\", (s) => s.get(key));\n const idbPut = (key, v) => idbReq(\"readwrite\", (s) => s.put(v, key));\n const idbDel = (key) => idbReq(\"readwrite\", (s) => s.delete(key));\n\n let _store = null; // in-memory WHO map; hydrated from IndexedDB before ready() resolves\n // Ignore the old single-centroid format ({centroid, n}) from earlier builds.\n const normalizeWho = (o) => (o && Array.isArray(o.centroid)) ? {} : (o || {});\n\n async function hydrateStore() {\n try {\n let v = await idbGet(LS_KEY);\n if (v === undefined) { // nothing in IndexedDB — migrate a legacy localStorage value once, then drop it\n let raw = null; try { raw = localStorage.getItem(LS_KEY); } catch (e) { /* ignore */ }\n if (raw != null) {\n v = normalizeWho(JSON.parse(raw || \"{}\"));\n await idbPut(LS_KEY, v);\n try { localStorage.removeItem(LS_KEY); } catch (e) { /* ignore */ }\n }\n }\n _store = v || {};\n } catch (e) { _store = _store || {}; }\n }\n function loadAll() {\n if (_store) return _store;\n // Pre-hydration fallback (verify/enroll only run after ready(), which awaits hydrateStore).\n try { return normalizeWho(JSON.parse(localStorage.getItem(LS_KEY) || \"{}\")); } catch (e) { return {}; }\n }\n function saveAll(obj) {\n _store = obj;\n idbPut(LS_KEY, obj).catch((e) => console.warn(\"SV save failed\", e));\n }\n // Multi-VOICE, multi-condition: each phrase stores a map of voices, each with a LIST of condition\n // centroids. Verify passes if ANY voice's ANY condition matches (so the doctor AND an enrolled\n // assistant both wake it; adding \"across the room\"/\"with background\" extends a voice's coverage).\n // Backward-compatible: legacy flat shapes ({centroids} / {centroid}) normalize to a default \"You\" voice.\n const SV_CENTROID_CAP = 6; // keep the most recent N conditions per voice\n const DEFAULT_VOICE_ID = \"you\";\n // Normalize any legacy per-phrase entry into { voices: { [id]: { label, createdAt, centroids:number[][] } } }.\n function normPhrase(o) {\n if (!o) return { voices: {} };\n if (o.voices) return o; // already voice-keyed\n if (Array.isArray(o.centroids)) return { voices: { [DEFAULT_VOICE_ID]: { label: \"You\", createdAt: 0, centroids: o.centroids } } };\n if (Array.isArray(o.centroid)) return { voices: { [DEFAULT_VOICE_ID]: { label: \"You\", createdAt: 0, centroids: [o.centroid] } } };\n return { voices: {} };\n }\n // Flat list of EVERY enrolled voice's centroids for a phrase (verify passes if any matches).\n function allCentroids(phrase) {\n const voices = normPhrase(loadAll()[phrase]).voices;\n const out = [];\n for (const id in voices) for (const c of (voices[id].centroids || [])) out.push(Float32Array.from(c));\n return out;\n }\n\n const SpeakerVerify = {\n ready: () => readyPromise,\n isLoaded: () => handle !== 0,\n threshold: DEFAULT_THRESHOLD,\n // AS-norm (score normalization): normalize the raw cosine against a crowd of other voices, so the\n // threshold stays stable when a room/mic drags scores down. PRIMARY gate when a cohort is loaded (znorm\n // != null); falls back to raw cosine only when there's no cohort. Turned on after live diagnostics showed\n // the genuine speaker scoring z 2–3.4 (well clear of 1.5) while raw cosine sat at 0.33–0.43 — i.e. raw\n // cosine was rejecting the real speaker in a room/mic that differed from enrollment, and AS-norm fixes it.\n useAsnorm: true,\n znormThreshold: 1.5, // \"at least N std above the crowd\"; tune from genuine vs real-impostor z-scores\n cohortSize: () => cohort.length,\n embeddingDim: () => dim,\n\n /** Enroll a VOICE for a phrase from N utterances → one condition-centroid under opts.voiceId\n * (default \"you\"). opts.append ADDS it as another condition for that voice; otherwise it replaces\n * that voice's conditions. opts.label names the voice. Capped to the most recent SV_CENTROID_CAP. */\n enroll(phrase, utterances /* [{samples, sampleRate}] */, opts) {\n if (!handle) throw new Error(\"SpeakerVerify not ready\");\n const voiceId = (opts && opts.voiceId) || DEFAULT_VOICE_ID;\n const embs = utterances.map(u => computeEmbedding(u.samples, u.sampleRate));\n const c = new Float32Array(dim);\n for (const e of embs) for (let i = 0; i < dim; i++) c[i] += e[i];\n for (let i = 0; i < dim; i++) c[i] /= embs.length;\n l2normalize(c);\n const all = loadAll();\n const entry = normPhrase(all[phrase]);\n const prevVoice = entry.voices[voiceId];\n const prev = (opts && opts.append && prevVoice && Array.isArray(prevVoice.centroids))\n ? prevVoice.centroids.map((x) => Float32Array.from(x)) : [];\n const centroids = prev.concat([c]).slice(-SV_CENTROID_CAP).map((v) => Array.from(v));\n entry.voices[voiceId] = {\n // keep the existing label when appending; otherwise use the provided one (or a sensible default)\n label: (prevVoice && opts && opts.append) ? prevVoice.label : ((opts && opts.label) || (voiceId === DEFAULT_VOICE_ID ? \"You\" : \"Voice\")),\n createdAt: (prevVoice && prevVoice.createdAt) || Date.now(),\n centroids,\n };\n all[phrase] = entry; saveAll(all);\n return { n: embs.length, conditions: centroids.length, voiceId };\n },\n\n /** Verify a live utterance against the BEST condition-centroid across ALL enrolled voices. */\n verify(phrase, samples, sampleRate) {\n const cents = allCentroids(phrase);\n if (!cents.length) return { score: 0, znorm: null, pass: false, enrolled: false };\n const live = computeEmbedding(samples, sampleRate);\n let score = -1;\n for (const c of cents) { const s = cosine(live, c); if (s > score) score = s; }\n // AS-norm: z = how many std the raw score sits above the crowd's scores against this same live clip.\n // A weird room drags the crowd scores down too, so the offset cancels and z stays stable.\n let znorm = null;\n if (cohort.length) {\n let sum = 0, sum2 = 0;\n for (const cv of cohort) { const s = cosine(live, cv); sum += s; sum2 += s * s; }\n const m = cohort.length, mean = sum / m, std = Math.sqrt(Math.max(sum2 / m - mean * mean, 1e-9));\n znorm = (score - mean) / std;\n }\n const pass = (SpeakerVerify.useAsnorm && znorm !== null)\n ? (znorm >= SpeakerVerify.znormThreshold)\n : (score >= SpeakerVerify.threshold);\n return { score, znorm, pass, enrolled: true };\n },\n\n /** How many conditions are enrolled for a phrase, across ALL voices (0 = none). */\n conditionCount: (phrase) => allCentroids(phrase).length,\n\n /** TitaNet speaker embedding for a raw utterance (Float32 + true sample rate). For diarization /\n * clustering. Returns the L2-normalized embedding, or null if the runtime isn't ready. */\n embed(samples, sampleRate) {\n return handle ? computeEmbedding(samples, sampleRate) : null;\n },\n\n /** Best-matching ENROLLED voice for a live utterance, across all voices + phrases (text-independent,\n * so conversational audio works). Returns { voiceId, label, score } (max cosine) or null if nothing\n * enrolled / not ready. The caller applies a threshold to decide whether to trust the name. */\n identify(samples, sampleRate) {\n if (!handle) return null;\n const live = computeEmbedding(samples, sampleRate);\n const all = loadAll();\n const best = {}; // voiceId -> { label, score }\n for (const phrase in all) {\n const voices = normPhrase(all[phrase]).voices;\n for (const id in voices) {\n for (const c of (voices[id].centroids || [])) {\n const s = cosine(live, Float32Array.from(c));\n if (!best[id] || s > best[id].score) best[id] = { label: voices[id].label, score: s };\n }\n }\n }\n let top = null;\n for (const id in best) {\n if (!top || best[id].score > top.score) top = { voiceId: id, label: best[id].label, score: best[id].score };\n }\n return top;\n },\n\n /** List enrolled voices aggregated across phrases: [{ id, label, createdAt, conditions }]. */\n listVoices() {\n const all = loadAll();\n const acc = {};\n for (const phrase in all) {\n const voices = normPhrase(all[phrase]).voices;\n for (const id in voices) {\n const v = voices[id];\n const conds = (v.centroids || []).length;\n if (!acc[id]) acc[id] = { id, label: v.label || id, createdAt: v.createdAt || 0, conditions: conds };\n else {\n acc[id].conditions = Math.max(acc[id].conditions, conds);\n if (v.label) acc[id].label = v.label;\n if (v.createdAt && (!acc[id].createdAt || v.createdAt < acc[id].createdAt)) acc[id].createdAt = v.createdAt;\n }\n }\n }\n return Object.keys(acc).map((k) => acc[k]).sort((a, b) => a.createdAt - b.createdAt);\n },\n\n /** Remove a voice across all phrases — revokes that person's WHO match (the WHAT phrase-prints,\n * which are shared/speaker-independent, are left in voiceprintStore). */\n removeVoice(voiceId) {\n const all = loadAll();\n let changed = false;\n for (const phrase in all) {\n const entry = normPhrase(all[phrase]);\n if (entry.voices[voiceId]) { delete entry.voices[voiceId]; all[phrase] = entry; changed = true; }\n }\n if (changed) saveAll(all);\n },\n\n /** Rename a voice across all phrases. */\n renameVoice(voiceId, label) {\n const all = loadAll();\n let changed = false;\n for (const phrase in all) {\n const entry = normPhrase(all[phrase]);\n if (entry.voices[voiceId]) { entry.voices[voiceId].label = label; all[phrase] = entry; changed = true; }\n }\n if (changed) saveAll(all);\n },\n\n // hasEnrollment(phrase) -> is that phrase enrolled; hasEnrollment() -> is anything enrolled.\n hasEnrollment: (phrase) => phrase ? allCentroids(phrase).length > 0 : Object.keys(loadAll()).some((p) => allCentroids(p).length > 0),\n enrolledPhrases: () => Object.keys(loadAll()),\n clearEnrollment: () => { _store = {}; idbDel(LS_KEY).catch(() => {}); try { localStorage.removeItem(LS_KEY); } catch (e) { /* ignore */ } },\n };\n\n async function init() {\n // Save the existing Emscripten global so we can restore it — don't permanently clobber window.Module\n // for any other emscripten bundle the host loads.\n const prevModule = window.Module;\n try {\n // locateFile: the page is at \"/\" but the glue + .wasm/.data live in SV_DIR, so\n // tell emscripten exactly where to fetch them (otherwise it 404s and init hangs).\n window.Module = { locateFile: (path) => SV_DIR + \"/\" + path };\n const onRuntime = new Promise((res) => { window.Module.onRuntimeInitialized = res; });\n // order matters: config-marshaling helper, then the glue (which fires onRuntimeInitialized)\n await loadScript(SV_DIR + \"/sherpa-onnx-speaker-diarization.js\");\n await loadScript(SV_DIR + \"/sherpa-onnx-wasm-main-speaker-diarization.js\");\n await onRuntime;\n Module = window.Module;\n window.Module = prevModule; // restore the global; we keep our own ref in `Module`\n const cfg = initSherpaOnnxSpeakerEmbeddingExtractorConfig(\n { model: MODEL, numThreads: 1, debug: 0, provider: \"cpu\" }, Module);\n handle = Module._SherpaOnnxCreateSpeakerEmbeddingExtractor(cfg.ptr);\n Module._free(cfg.buffer); Module._free(cfg.ptr);\n if (!handle) throw new Error(\"CreateSpeakerEmbeddingExtractor returned null\");\n dim = Module._SherpaOnnxSpeakerEmbeddingExtractorDim(handle);\n console.log(\"[SpeakerVerify] ready — embedding dim\", dim);\n // Load the AS-norm cohort (other-voice embeddings, same model). Optional — gate works without it.\n try {\n const r = await fetch(SV_DIR + \"/sv-cohort.json\");\n if (r.ok) { cohort = (await r.json()).map((v) => Float32Array.from(v)); console.log(\"[SpeakerVerify] AS-norm cohort:\", cohort.length); }\n } catch (e) { console.warn(\"[SpeakerVerify] cohort load failed (AS-norm off):\", e); }\n await hydrateStore(); // load enrolled WHO centroids from IndexedDB before reporting ready\n readyResolve(SpeakerVerify);\n } catch (e) {\n window.Module = prevModule; // restore the global even on failure\n console.error(\"[SpeakerVerify] init failed:\", e);\n readyReject(e);\n }\n }\n\n window.SpeakerVerify = SpeakerVerify;\n if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n else init();\n})();\n"]}