@mieweb/ui 0.10.0-dev.2 → 0.10.0-dev.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9,6 +9,8 @@ export { bluehiveBrand } from './chunk-3T7QGLNB.js';
9
9
  export { ccmeBrand } from './chunk-SCQRJPSV.js';
10
10
  export { ozwellBrand } from './chunk-5YUBQIC7.js';
11
11
  import { getModelBytes } from './chunk-6I7IDZ4A.js';
12
+ import { loadWhatPrints, saveWhatPrints, clearWhatPrints } from './chunk-74ENCTIK.js';
13
+ export { clearVoiceprints, clearWhatPrints, getVoiceprints, loadWhatPrints, saveWhatPrints, setVoiceprints } from './chunk-74ENCTIK.js';
12
14
  export { ThemeProvider, ThemeProviderContext, ThemeToggle, themeToggleIconVariants, themeToggleVariants, useThemeContext } from './chunk-LL6IWKI3.js';
13
15
  export { Toggle, toggleVariants } from './chunk-PTZB2GKL.js';
14
16
  export { TranscriptView, formatTimestampMs } from './chunk-LAEIVOIY.js';
@@ -145,6 +147,7 @@ import { isStorybookDocsMode } from './chunk-VSQF22GL.js';
145
147
  export { isStorybookDocsMode } from './chunk-VSQF22GL.js';
146
148
  import { Plus, GripVertical, RefreshCw, Pencil, Trash2, AlertCircle, ArrowLeft, Users, FilePlus, CheckCircle, ChevronDown, Clock, FileText, ClipboardList, Stethoscope, Mail, Phone, ClipboardCheck, Eye, Info, Link, ChevronUp, History, StickyNote, ExternalLink, MoreVertical, Send, Scan, TestTube2, Pill, Share, User, Download, ChevronRight, Calendar, Printer, ClipboardPlus, FileCheck, Wheat, Bell, FileHeart, HeartPulse, Paperclip, HelpCircle, MoreHorizontal, AlertTriangle, Upload as Upload$1, Camera, Check as Check$1, X as X$1, ScanLine, Image } from './chunk-BKSPDTX4.js';
147
149
  export { Accessibility as AccessibilityIcon, Activity as ActivityIcon, AlertCircle as AlertCircleIcon, AlertTriangle as AlertTriangleIcon, Wheat as AllergyIcon, WheatOff as AllergyOffIcon, Ambulance as AmbulanceIcon, ArrowLeft as ArrowLeftIcon, ArrowRight as ArrowRightIcon, ArrowUpDown as ArrowUpDownIcon, ArrowUp as ArrowUpIcon, AtSign as AtSignIcon, Baby as BabyIcon, BadgeAlert as BadgeAlertIcon, BadgeCheck as BadgeCheckIcon, BadgeMinus as BadgeMinusIcon, BadgePlus as BadgePlusIcon, BadgeX as BadgeXIcon, Ban as BanIcon, Bandage as BandageIcon, BedDouble as BedDoubleIcon, Bed as BedIcon, BedSingle as BedSingleIcon, Bell as BellIcon, BellOff as BellOffIcon, Biohazard as BiohazardIcon, Bone as BoneIcon, BookOpenCheck as BookOpenCheckIcon, BookOpen as BookOpenIcon, Bookmark as BookmarkIcon, Bot as BotIcon, Brain as BrainIcon, Briefcase as BriefcaseIcon, BriefcaseMedical as BriefcaseMedicalIcon, Building as BuildingIcon, CalendarCheck as CalendarCheckIcon, Calendar as CalendarIcon, Camera as CameraIcon, Cannabis as CannabisIcon, BarChart3 as ChartIcon, CheckCircle as CheckCircleIcon, Check as CheckIcon, ChevronDown as ChevronDownIcon, ChevronLeft as ChevronLeftIcon, ChevronRight as ChevronRightIcon, ChevronUp as ChevronUpIcon, Cigarette as CigaretteIcon, CigaretteOff as CigaretteOffIcon, CircleDotDashed as CircleDotDashedIcon, CircleDot as CircleDotIcon, CircleUser as CircleUserIcon, ClipboardCheck as ClipboardCheckIcon, Clipboard as ClipboardIcon, ClipboardList as ClipboardListIcon, ClipboardPlus as ClipboardPlusIcon, Clock as ClockIcon, Cog as CogIcon, Columns as ColumnsIcon, Copy as CopyIcon, CreditCard as CreditCardIcon, Cross as CrossIcon, Dna as DnaIcon, DollarSign as DollarSignIcon, Download as DownloadIcon, Droplet as DropletIcon, Droplets as DropletsIcon, Ear as EarIcon, ExternalLink as ExternalLinkIcon, Eye as EyeIcon, EyeOff as EyeOffIcon, FileCheck2 as FileCheck2Icon, FileCheck as FileCheckIcon, FileHeart as FileHeartIcon, File as FileIcon, FilePlus2 as FilePlus2Icon, FilePlus as FilePlusIcon, FileText as FileTextIcon, Filter as FilterIcon, Fingerprint as FingerprintIcon, Flag as FlagIcon, FlaskConical as FlaskIcon, FlaskRound as FlaskRoundIcon, Folder as FolderIcon, FolderOpen as FolderOpenIcon, Footprints as FootprintsIcon, Glasses as GlassesIcon, Globe as GlobeIcon, LayoutGrid as GridIcon, GripVertical as GripVerticalIcon, Hand as HandIcon, HandMetal as HandMetalIcon, Hash as HashIcon, Heart as HeartIcon, HeartOff as HeartOffIcon, HeartPulse as HeartPulseIcon, HelpCircle as HelpCircleIcon, History as HistoryIcon, Home as HomeIcon, Hospital as HospitalIcon, Image as ImageIcon, Info as InfoIcon, Key as KeyIcon, Link as LinkIcon, List as ListIcon, Loader2 as LoaderIcon, Lock as LockIcon, LogIn as LogInIcon, LogOut as LogOutIcon, Mail as MailIcon, MapPin as MapPinIcon, Maximize as MaximizeIcon, Menu as MenuIcon, MessageSquare as MessageIcon, Mic as MicIcon, Microscope as MicroscopeIcon, Minimize as MinimizeIcon, Minus as MinusIcon, Monitor as MonitorIcon, Moon as MoonIcon, MoreHorizontal as MoreHorizontalIcon, MoreVertical as MoreVerticalIcon, NotebookPen as NotebookPenIcon, Palette as PaletteIcon, Paperclip as PaperclipIcon, CircleUserRound as PatientIcon, Pencil as PencilIcon, UserRound as PersonIcon, Phone as PhoneIcon, PieChart as PieChartIcon, Pill as PillIcon, Plus as PlusIcon, Printer as PrinterIcon, Radiation as RadiationIcon, Ruler as RulerIcon, Save as SaveIcon, Scale as ScaleIcon, Scaling as ScalingIcon, ScanEye as ScanEyeIcon, Scan as ScanIcon, ScanLine as ScanLineIcon, Search as SearchIcon, Settings as SettingsIcon, Share as ShareIcon, ShieldCheck as ShieldCheckIcon, Shield as ShieldIcon, ShieldPlus as ShieldPlusIcon, Sliders as SlidersIcon, Sparkle as SparkleIcon, Star as StarIcon, Stethoscope as StethoscopeIcon, StickyNote as StickyNoteIcon, Square as StopIcon, Sun as SunIcon, Syringe as SyringeIcon, Table as TableIcon, Tablets as TabletsIcon, Tag as TagIcon, TestTube2 as TestTubeIcon, TestTubes as TestTubesIcon, Thermometer as ThermometerIcon, ThermometerSun as ThermometerSunIcon, ThumbsDown as ThumbsDownIcon, ThumbsUp as ThumbsUpIcon, Timer as TimerIcon, Trash2 as TrashIcon, TrendingDown as TrendingDownIcon, TrendingUp as TrendingUpIcon, Truck as TruckIcon, Unlock as UnlockIcon, Upload as UploadIcon, UserCheck as UserCheckIcon, User as UserIcon, UserMinus as UserMinusIcon, UserPlus as UserPlusIcon, UserRoundCheck as UserRoundCheckIcon, UserRoundMinus as UserRoundMinusIcon, UserRoundPlus as UserRoundPlusIcon, UserRoundX as UserRoundXIcon, Users as UsersIcon, Weight as WeightIcon, Wrench as WrenchIcon, XCircle as XCircleIcon, X2 as XIcon, Zap as ZapIcon } from './chunk-BKSPDTX4.js';
150
+ import { usePrefersReducedMotion } from './chunk-HB7C7NB5.js';
148
151
  export { usePrefersReducedMotion } from './chunk-HB7C7NB5.js';
149
152
  import { Badge } from './chunk-BMSG4NBH.js';
150
153
  export { Badge, badgeVariants } from './chunk-BMSG4NBH.js';
@@ -157,7 +160,7 @@ import { cn } from './chunk-TQONQSJO.js';
157
160
  export { cn, miewebUITwMergeConflicts } from './chunk-TQONQSJO.js';
158
161
  import './chunk-PX6F3LHL.js';
159
162
  import * as React13 from 'react';
160
- import React13__default, { createContext, useState, useEffect, useCallback, useMemo, useContext, useRef } from 'react';
163
+ import React13__default, { createContext, useState, useEffect, useCallback, useMemo, useContext, useRef, useId } from 'react';
161
164
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
162
165
  import { cva } from 'class-variance-authority';
163
166
  import * as ReactDOM from 'react-dom';
@@ -3938,21 +3941,27 @@ function endsWithDone(text) {
3938
3941
  );
3939
3942
  }
3940
3943
  function useSpeakerVerify(opts = {}) {
3941
- const { enabled = true } = opts;
3944
+ const { enabled = true, voiceprintNamespace } = opts;
3942
3945
  const [ready, setReady] = React13.useState(false);
3946
+ const [loadedNamespace, setLoadedNamespace] = React13.useState();
3943
3947
  const [error, setError] = React13.useState(null);
3944
3948
  const svRef = React13.useRef(null);
3945
3949
  React13.useEffect(() => {
3946
3950
  if (!enabled) return;
3951
+ setReady(false);
3952
+ setError(null);
3953
+ svRef.current = null;
3947
3954
  let cancelled = false;
3948
3955
  (async () => {
3949
3956
  try {
3950
- await import('./speaker-verify-R67P433H.js');
3957
+ await import('./speaker-verify-AWSKI6DI.js');
3951
3958
  const sv = window.SpeakerVerify;
3952
3959
  if (!sv) throw new Error("SpeakerVerify failed to initialize");
3953
3960
  await sv.ready();
3961
+ await sv.loadNamespace(voiceprintNamespace);
3954
3962
  if (cancelled) return;
3955
3963
  svRef.current = sv;
3964
+ setLoadedNamespace(voiceprintNamespace);
3956
3965
  console.log("[speaker] TitaNet ready");
3957
3966
  setReady(true);
3958
3967
  } catch (e) {
@@ -3962,21 +3971,22 @@ function useSpeakerVerify(opts = {}) {
3962
3971
  return () => {
3963
3972
  cancelled = true;
3964
3973
  };
3965
- }, [enabled]);
3974
+ }, [enabled, voiceprintNamespace]);
3975
+ const scopedApi = enabled && ready && loadedNamespace === voiceprintNamespace ? svRef.current : null;
3966
3976
  return {
3967
- ready,
3977
+ ready: scopedApi !== null,
3968
3978
  error,
3969
- enroll: (phrase, utterances, opts2) => svRef.current?.enroll(phrase, utterances, opts2) ?? null,
3970
- verify: (phrase, samples, sampleRate) => svRef.current?.verify(phrase, samples, sampleRate) ?? null,
3971
- conditionCount: (phrase) => svRef.current?.conditionCount(phrase) ?? 0,
3972
- embed: (samples, sampleRate) => svRef.current?.embed(samples, sampleRate) ?? null,
3973
- identify: (samples, sampleRate) => svRef.current?.identify(samples, sampleRate) ?? null,
3974
- listVoices: () => svRef.current?.listVoices() ?? [],
3975
- removeVoice: (voiceId) => svRef.current?.removeVoice(voiceId),
3976
- renameVoice: (voiceId, label) => svRef.current?.renameVoice(voiceId, label),
3977
- clear: () => svRef.current?.clearEnrollment(),
3979
+ enroll: (phrase, utterances, opts2) => scopedApi?.enroll(phrase, utterances, opts2, voiceprintNamespace) ?? null,
3980
+ verify: (phrase, samples, sampleRate) => scopedApi?.verify(phrase, samples, sampleRate, voiceprintNamespace) ?? null,
3981
+ conditionCount: (phrase) => scopedApi?.conditionCount(phrase, voiceprintNamespace) ?? 0,
3982
+ embed: (samples, sampleRate) => scopedApi?.embed(samples, sampleRate) ?? null,
3983
+ identify: (samples, sampleRate) => scopedApi?.identify(samples, sampleRate, voiceprintNamespace) ?? null,
3984
+ listVoices: () => scopedApi?.listVoices(voiceprintNamespace) ?? [],
3985
+ removeVoice: (voiceId) => scopedApi?.removeVoice(voiceId, voiceprintNamespace),
3986
+ renameVoice: (voiceId, label) => scopedApi?.renameVoice(voiceId, label, voiceprintNamespace),
3987
+ clear: () => scopedApi?.clearEnrollment(voiceprintNamespace),
3978
3988
  setGates: (g) => {
3979
- const sv = svRef.current;
3989
+ const sv = scopedApi;
3980
3990
  if (!sv) return;
3981
3991
  if (g.cosine != null) sv.threshold = g.cosine;
3982
3992
  if (g.znorm != null) sv.znormThreshold = g.znorm;
@@ -4159,11 +4169,14 @@ function useDiarization(options = {}) {
4159
4169
  merge = true,
4160
4170
  inferRoles = false,
4161
4171
  enabled = true,
4162
- minSegmentSeconds = 1
4172
+ minSegmentSeconds = 1,
4173
+ voiceprintNamespace
4163
4174
  } = options;
4164
- const sv = useSpeakerVerify({ enabled });
4175
+ const sv = useSpeakerVerify({ enabled, voiceprintNamespace });
4165
4176
  const svRef = React13.useRef(sv);
4166
4177
  svRef.current = sv;
4178
+ const nsRef = React13.useRef(voiceprintNamespace);
4179
+ nsRef.current = voiceprintNamespace;
4167
4180
  const [busy, setBusy] = React13.useState(false);
4168
4181
  const [error, setError] = React13.useState(null);
4169
4182
  const [result, setResult] = React13.useState(null);
@@ -4176,10 +4189,16 @@ function useDiarization(options = {}) {
4176
4189
  setError(null);
4177
4190
  try {
4178
4191
  const svh = svRef.current;
4192
+ const passNamespace = nsRef.current;
4193
+ const assertNamespace = () => {
4194
+ if (nsRef.current !== passNamespace)
4195
+ throw new Error("voiceprint namespace changed during diarization");
4196
+ };
4179
4197
  const [segments, samples] = await Promise.all([
4180
4198
  transcribeSegments(blob),
4181
4199
  decodeTo16kMono(blob)
4182
4200
  ]);
4201
+ assertNamespace();
4183
4202
  if (!segments.length) {
4184
4203
  setResult([]);
4185
4204
  return [];
@@ -4234,6 +4253,7 @@ function useDiarization(options = {}) {
4234
4253
  }
4235
4254
  }
4236
4255
  if (merge) out = mergeTurns(out);
4256
+ assertNamespace();
4237
4257
  setResult(out);
4238
4258
  return out;
4239
4259
  } catch (e) {
@@ -4256,158 +4276,6 @@ function useDiarization(options = {}) {
4256
4276
  return { ready: sv.ready, busy, error, result, diarize };
4257
4277
  }
4258
4278
 
4259
- // src/components/AI/voiceprintStore.ts
4260
- var DB_NAME = "ozwell-voice";
4261
- var STORE = "voiceprints";
4262
- var DB_VERSION = 1;
4263
- function openDb() {
4264
- return new Promise((resolve, reject) => {
4265
- const req = indexedDB.open(DB_NAME, DB_VERSION);
4266
- req.onupgradeneeded = () => {
4267
- if (!req.result.objectStoreNames.contains(STORE))
4268
- req.result.createObjectStore(STORE);
4269
- };
4270
- req.onsuccess = () => resolve(req.result);
4271
- req.onerror = () => reject(req.error);
4272
- req.onblocked = () => reject(
4273
- new Error("IndexedDB open blocked (another tab holds an upgrade lock)")
4274
- );
4275
- });
4276
- }
4277
- function idbGet(key) {
4278
- return openDb().then(
4279
- (db) => new Promise((resolve, reject) => {
4280
- const req = db.transaction(STORE, "readonly").objectStore(STORE).get(key);
4281
- req.onsuccess = () => {
4282
- resolve(req.result);
4283
- db.close();
4284
- };
4285
- req.onerror = () => {
4286
- reject(req.error);
4287
- db.close();
4288
- };
4289
- })
4290
- );
4291
- }
4292
- function idbSet(key, value) {
4293
- return openDb().then(
4294
- (db) => new Promise((resolve, reject) => {
4295
- const tx = db.transaction(STORE, "readwrite");
4296
- tx.objectStore(STORE).put(value, key);
4297
- tx.oncomplete = () => {
4298
- resolve();
4299
- db.close();
4300
- };
4301
- tx.onerror = () => {
4302
- reject(tx.error);
4303
- db.close();
4304
- };
4305
- tx.onabort = () => {
4306
- reject(tx.error);
4307
- db.close();
4308
- };
4309
- })
4310
- );
4311
- }
4312
- function idbDel(key) {
4313
- return openDb().then(
4314
- (db) => new Promise((resolve, reject) => {
4315
- const tx = db.transaction(STORE, "readwrite");
4316
- tx.objectStore(STORE).delete(key);
4317
- tx.oncomplete = () => {
4318
- resolve();
4319
- db.close();
4320
- };
4321
- tx.onerror = () => {
4322
- reject(tx.error);
4323
- db.close();
4324
- };
4325
- tx.onabort = () => {
4326
- reject(tx.error);
4327
- db.close();
4328
- };
4329
- })
4330
- );
4331
- }
4332
- async function getVoiceprints(key, migrateLegacy) {
4333
- try {
4334
- const existing = await idbGet(key);
4335
- if (existing !== void 0) return existing;
4336
- if (migrateLegacy) {
4337
- let raw = null;
4338
- try {
4339
- raw = localStorage.getItem(key);
4340
- } catch {
4341
- }
4342
- if (raw != null) {
4343
- let migrated;
4344
- try {
4345
- migrated = migrateLegacy(raw);
4346
- } catch {
4347
- try {
4348
- localStorage.removeItem(key);
4349
- } catch {
4350
- }
4351
- return void 0;
4352
- }
4353
- try {
4354
- await idbSet(key, migrated);
4355
- } catch {
4356
- }
4357
- try {
4358
- localStorage.removeItem(key);
4359
- } catch {
4360
- }
4361
- return migrated;
4362
- }
4363
- }
4364
- return void 0;
4365
- } catch {
4366
- return void 0;
4367
- }
4368
- }
4369
- async function setVoiceprints(key, value) {
4370
- try {
4371
- await idbSet(key, value);
4372
- } catch {
4373
- }
4374
- }
4375
- async function clearVoiceprints(key) {
4376
- try {
4377
- await idbDel(key);
4378
- } catch {
4379
- }
4380
- try {
4381
- localStorage.removeItem(key);
4382
- } catch {
4383
- }
4384
- }
4385
- var WHAT_KEY = "ozwellWhatPrints";
4386
- function parseLegacyWhat(raw) {
4387
- let o;
4388
- try {
4389
- o = JSON.parse(raw || "{}") || {};
4390
- } catch {
4391
- return {};
4392
- }
4393
- const out = /* @__PURE__ */ Object.create(null);
4394
- for (const k of Object.keys(o))
4395
- out[k] = (o[k] || []).map((a) => Float32Array.from(a));
4396
- return out;
4397
- }
4398
- function loadWhatPrints() {
4399
- return getVoiceprints(
4400
- WHAT_KEY,
4401
- parseLegacyWhat
4402
- ).then((v) => v ?? {});
4403
- }
4404
- function saveWhatPrints(map) {
4405
- return setVoiceprints(WHAT_KEY, map);
4406
- }
4407
- function clearWhatPrints() {
4408
- return clearVoiceprints(WHAT_KEY);
4409
- }
4410
-
4411
4279
  // src/components/AI/HeyOzwell/audio.ts
4412
4280
  function openRollingRecorder(stream, maxSeconds = 2) {
4413
4281
  const Ctx = window.AudioContext || window.webkitAudioContext;
@@ -4575,6 +4443,7 @@ function useRoomLevel(getStream, ready) {
4575
4443
  }
4576
4444
  function useHeyOzwell(options = {}) {
4577
4445
  const {
4446
+ voiceprintNamespace,
4578
4447
  autoDictateOnWake = false,
4579
4448
  closeChatOnDone = false,
4580
4449
  transcription = "browser",
@@ -4634,13 +4503,14 @@ function useHeyOzwell(options = {}) {
4634
4503
  setLiveText("");
4635
4504
  }, []);
4636
4505
  const wakeRef = React13.useRef(null);
4637
- const sv = useSpeakerVerify({ enabled: requireDoctor });
4506
+ const sv = useSpeakerVerify({ enabled: requireDoctor, voiceprintNamespace });
4638
4507
  const svRef = React13.useRef(sv);
4639
4508
  svRef.current = sv;
4640
4509
  const rollRef = React13.useRef(null);
4641
4510
  const diar = useDiarization({
4642
4511
  ...diarizationOptions,
4643
- enabled: conversationMode
4512
+ enabled: conversationMode,
4513
+ voiceprintNamespace
4644
4514
  });
4645
4515
  const diarRef = React13.useRef(diar);
4646
4516
  diarRef.current = diar;
@@ -4648,6 +4518,7 @@ function useHeyOzwell(options = {}) {
4648
4518
  (name) => {
4649
4519
  if (!requireDoctor) return true;
4650
4520
  const svh = svRef.current;
4521
+ if (!svh.ready) return false;
4651
4522
  const enrolled = svh.conditionCount(name) > 0;
4652
4523
  if (!enrolled) return true;
4653
4524
  const roll = rollRef.current;
@@ -4852,9 +4723,14 @@ function useHeyOzwell(options = {}) {
4852
4723
  if (!requireDoctor || !active || !wake.ready) return;
4853
4724
  let cancelled = false;
4854
4725
  let tries = 0;
4855
- void loadWhatPrints().then((loaded) => {
4726
+ const applied = /* @__PURE__ */ new Set(["hey-ozwell", "ozwell-i'm-done"]);
4727
+ for (const k of applied) wakeRef.current?.setVoiceprint(k, []);
4728
+ void loadWhatPrints(voiceprintNamespace).then((loaded) => {
4856
4729
  if (cancelled) return;
4857
- for (const k in loaded) wakeRef.current?.setVoiceprint(k, loaded[k]);
4730
+ for (const k in loaded) {
4731
+ applied.add(k);
4732
+ wakeRef.current?.setVoiceprint(k, loaded[k]);
4733
+ }
4858
4734
  });
4859
4735
  const tryOpen = () => {
4860
4736
  if (cancelled || rollRef.current) return;
@@ -4865,10 +4741,11 @@ function useHeyOzwell(options = {}) {
4865
4741
  tryOpen();
4866
4742
  return () => {
4867
4743
  cancelled = true;
4744
+ for (const k of applied) wakeRef.current?.setVoiceprint(k, []);
4868
4745
  rollRef.current?.close();
4869
4746
  rollRef.current = null;
4870
4747
  };
4871
- }, [requireDoctor, active, wake.ready]);
4748
+ }, [requireDoctor, active, wake.ready, voiceprintNamespace]);
4872
4749
  const hasListenedRef = React13.useRef(false);
4873
4750
  React13.useEffect(() => {
4874
4751
  if (listening) hasListenedRef.current = true;
@@ -5160,11 +5037,11 @@ var REPS = 3;
5160
5037
  var TIMEOUT_MS = 5e3;
5161
5038
  var delay = (ms) => new Promise((r) => setTimeout(r, ms));
5162
5039
  function useVoiceSetup(options = {}) {
5163
- const { startAdding = false, voiceId, label } = options;
5040
+ const { startAdding = false, voiceId, label, voiceprintNamespace } = options;
5164
5041
  const [enrollVoiceId] = React13.useState(
5165
5042
  () => voiceId || (startAdding ? `voice-${Date.now()}-${Math.floor(Math.random() * 1e4)}` : "you")
5166
5043
  );
5167
- const sv = useSpeakerVerify();
5044
+ const sv = useSpeakerVerify({ voiceprintNamespace });
5168
5045
  const expectRef = React13.useRef(null);
5169
5046
  const resolveRef = React13.useRef(null);
5170
5047
  const whatRef = React13.useRef({});
@@ -5186,10 +5063,19 @@ function useVoiceSetup(options = {}) {
5186
5063
  const total = PHRASES2.length * REPS;
5187
5064
  React13.useEffect(() => {
5188
5065
  warmWhisper();
5189
- void loadWhatPrints().then((w) => {
5190
- whatRef.current = w;
5066
+ let cancelled = false;
5067
+ whatRef.current = {};
5068
+ void loadWhatPrints(voiceprintNamespace).then((w) => {
5069
+ if (!cancelled) whatRef.current = w;
5191
5070
  });
5192
- }, []);
5071
+ return () => {
5072
+ cancelled = true;
5073
+ abortRef.current = true;
5074
+ resolveRef.current?.("__cancelled__");
5075
+ setPhase("intro");
5076
+ setStep(0);
5077
+ };
5078
+ }, [voiceprintNamespace]);
5193
5079
  React13.useEffect(() => {
5194
5080
  if (!wake.ready) {
5195
5081
  setLevel(0);
@@ -5301,10 +5187,10 @@ function useVoiceSetup(options = {}) {
5301
5187
  whatRef.current[ph.key] = merged;
5302
5188
  wakeRef.current.setVoiceprint(ph.key, merged);
5303
5189
  }
5304
- void saveWhatPrints(whatRef.current);
5190
+ void saveWhatPrints(whatRef.current, voiceprintNamespace);
5305
5191
  setAdding(false);
5306
5192
  setPhase("done");
5307
- }, [bothReady, phase, adding, sv, enrollVoiceId, label]);
5193
+ }, [bothReady, phase, adding, sv, enrollVoiceId, label, voiceprintNamespace]);
5308
5194
  const addAnotherSpot = React13.useCallback(() => {
5309
5195
  setAdding(true);
5310
5196
  setPhase("intro");
@@ -5337,6 +5223,7 @@ var SUCCESS = "var(--mieweb-success, hsl(142.1 76.2% 36.3%))";
5337
5223
  var ozA2 = (pct) => `color-mix(in srgb, ${OZ2} ${pct}%, transparent)`;
5338
5224
  var ozBtn = "bg-ozwell hover:bg-ozwell active:bg-ozwell text-ozwell-foreground hover:brightness-95 active:brightness-90";
5339
5225
  function VoiceSetup({
5226
+ voiceprintNamespace,
5340
5227
  mode = "enroll",
5341
5228
  voiceId,
5342
5229
  label,
@@ -5344,7 +5231,12 @@ function VoiceSetup({
5344
5231
  onDone,
5345
5232
  onCancel
5346
5233
  }) {
5347
- const oz = useVoiceSetup({ startAdding: mode === "add", voiceId, label });
5234
+ const oz = useVoiceSetup({
5235
+ startAdding: mode === "add",
5236
+ voiceId,
5237
+ label,
5238
+ voiceprintNamespace
5239
+ });
5348
5240
  const { phase, phrase, step, total, adding, level, ready, error } = oz;
5349
5241
  const octoScale = 1 + Math.min(0.32, level * 2.2);
5350
5242
  const glowOpacity = 0.35 + Math.min(0.6, level * 4);
@@ -5555,8 +5447,11 @@ function VoiceSetup({
5555
5447
  var OZ3 = "var(--mieweb-ozwell, #0BA0E0)";
5556
5448
  var ozBtn2 = "bg-ozwell hover:bg-ozwell active:bg-ozwell text-ozwell-foreground hover:brightness-95 active:brightness-90";
5557
5449
  var dangerOutline = "border-destructive text-destructive hover:bg-destructive/10 hover:text-destructive";
5558
- function VoiceManager({ logoSrc }) {
5559
- const sv = useSpeakerVerify();
5450
+ function VoiceManager({
5451
+ logoSrc,
5452
+ voiceprintNamespace
5453
+ }) {
5454
+ const sv = useSpeakerVerify({ voiceprintNamespace });
5560
5455
  const [inSetup, setInSetup] = React13.useState(null);
5561
5456
  const [, setTick] = React13.useState(0);
5562
5457
  const [addName, setAddName] = React13.useState("");
@@ -5568,6 +5463,7 @@ function VoiceManager({ logoSrc }) {
5568
5463
  return /* @__PURE__ */ jsx(
5569
5464
  VoiceSetup,
5570
5465
  {
5466
+ voiceprintNamespace,
5571
5467
  mode: inSetup.mode,
5572
5468
  voiceId: inSetup.voiceId,
5573
5469
  label: inSetup.label,
@@ -5599,7 +5495,7 @@ function VoiceManager({ logoSrc }) {
5599
5495
  };
5600
5496
  const clearAll = () => {
5601
5497
  sv.clear();
5602
- void clearWhatPrints();
5498
+ void clearWhatPrints(voiceprintNamespace);
5603
5499
  setTick((t) => t + 1);
5604
5500
  };
5605
5501
  return /* @__PURE__ */ jsxs("div", { className: "bg-background text-foreground flex min-h-full flex-col items-center justify-center p-6 text-center", children: [
@@ -5749,6 +5645,7 @@ function VoiceManager({ logoSrc }) {
5749
5645
  ] });
5750
5646
  }
5751
5647
  function HandsFreeChat({
5648
+ voiceprintNamespace,
5752
5649
  title = "Ozwell Assistant \u2014 hands-free",
5753
5650
  suggestions,
5754
5651
  userName,
@@ -5761,6 +5658,7 @@ function HandsFreeChat({
5761
5658
  autoDictateOnWake = true
5762
5659
  }) {
5763
5660
  const oz = useHeyOzwell({
5661
+ voiceprintNamespace,
5764
5662
  autoStart: true,
5765
5663
  // always listening while mounted
5766
5664
  autoDictateOnWake,
@@ -5839,7 +5737,13 @@ function HandsFreeChat({
5839
5737
  /* @__PURE__ */ jsx(ModalTitle, { children: "Your voice" }),
5840
5738
  /* @__PURE__ */ jsx(ModalClose, {})
5841
5739
  ] }),
5842
- /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsx(VoiceManager, { logoSrc }) })
5740
+ /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsx(
5741
+ VoiceManager,
5742
+ {
5743
+ logoSrc,
5744
+ voiceprintNamespace
5745
+ }
5746
+ ) })
5843
5747
  ] })
5844
5748
  ] });
5845
5749
  }
@@ -40808,86 +40712,149 @@ function SidebarNavGroup({
40808
40712
  children,
40809
40713
  defaultExpanded = false,
40810
40714
  groupId,
40811
- className
40715
+ className,
40716
+ forceMount
40812
40717
  }) {
40813
40718
  const { isCollapsed, isMobileViewport, expandedGroup, toggleGroup } = useSidebar();
40814
40719
  const showCollapsed = !isMobileViewport && isCollapsed;
40720
+ const prefersReducedMotion = usePrefersReducedMotion();
40721
+ const contentId = useId();
40722
+ const groupRef = useRef(null);
40723
+ const triggerRef = useRef(null);
40815
40724
  const isExpanded = groupId ? expandedGroup === groupId : defaultExpanded;
40816
40725
  const [localExpanded, setLocalExpanded] = useState(defaultExpanded);
40817
40726
  const effectiveExpanded = groupId ? isExpanded : localExpanded;
40727
+ const itemsVisible = !showCollapsed && effectiveExpanded;
40728
+ const focusWasInsideRef = useRef(false);
40729
+ const captureFocusInside = useCallback(() => {
40730
+ const active = document.activeElement;
40731
+ focusWasInsideRef.current = active !== triggerRef.current && groupRef.current?.contains(active) === true;
40732
+ }, []);
40733
+ useEffect(() => {
40734
+ if (!itemsVisible) return;
40735
+ function trackFocus(event) {
40736
+ const target = event.target;
40737
+ focusWasInsideRef.current = target !== triggerRef.current && groupRef.current?.contains(target) === true;
40738
+ }
40739
+ document.addEventListener("focusin", trackFocus);
40740
+ return () => document.removeEventListener("focusin", trackFocus);
40741
+ }, [itemsVisible]);
40742
+ useEffect(() => {
40743
+ if (itemsVisible) return;
40744
+ if (focusWasInsideRef.current) {
40745
+ focusWasInsideRef.current = false;
40746
+ triggerRef.current?.focus();
40747
+ }
40748
+ }, [itemsVisible]);
40818
40749
  const handleToggle = useCallback(() => {
40750
+ captureFocusInside();
40819
40751
  if (groupId) {
40820
40752
  toggleGroup(groupId);
40821
40753
  } else {
40822
40754
  setLocalExpanded((prev) => !prev);
40823
40755
  }
40824
- }, [groupId, toggleGroup]);
40825
- return /* @__PURE__ */ jsxs("div", { "data-slot": "sidebar-nav-group", className: cn("mb-2", className), children: [
40826
- /* @__PURE__ */ jsxs(
40827
- "button",
40828
- {
40829
- "data-slot": "sidebar-nav-group-button",
40830
- onClick: handleToggle,
40831
- className: cn(
40832
- "flex w-full items-center rounded-lg px-3 py-2 text-sm font-semibold",
40833
- "text-neutral-700 dark:text-neutral-300",
40834
- "transition-colors hover:bg-neutral-100 dark:hover:bg-neutral-800",
40835
- showCollapsed && "justify-center"
40836
- ),
40837
- title: showCollapsed ? label : void 0,
40838
- "aria-label": showCollapsed ? label : void 0,
40839
- children: [
40840
- icon && /* @__PURE__ */ jsx(
40841
- "span",
40842
- {
40843
- className: cn(
40844
- "text-muted-foreground h-5 w-5 flex-shrink-0",
40845
- !showCollapsed && "me-3"
40846
- ),
40847
- children: icon
40848
- }
40849
- ),
40850
- /* @__PURE__ */ jsxs(AnimatedPresence, { initial: false, children: [
40851
- !showCollapsed && /* @__PURE__ */ jsx(
40852
- Animated,
40853
- {
40854
- as: "span",
40855
- preset: "sidebarLabel",
40856
- mode: "presence",
40857
- className: "flex-1 truncate text-start",
40858
- children: label
40859
- },
40860
- "label"
40756
+ }, [captureFocusInside, groupId, toggleGroup]);
40757
+ const items = /* @__PURE__ */ jsx("div", { className: "mt-1 ps-2", children });
40758
+ const panelInDom = forceMount || itemsVisible;
40759
+ return /* @__PURE__ */ jsxs(
40760
+ "div",
40761
+ {
40762
+ ref: groupRef,
40763
+ "data-slot": "sidebar-nav-group",
40764
+ className: cn("mb-2", className),
40765
+ children: [
40766
+ /* @__PURE__ */ jsxs(
40767
+ "button",
40768
+ {
40769
+ ref: triggerRef,
40770
+ "data-slot": "sidebar-nav-group-button",
40771
+ onClick: handleToggle,
40772
+ "aria-expanded": itemsVisible,
40773
+ "aria-controls": panelInDom ? contentId : void 0,
40774
+ className: cn(
40775
+ "flex w-full items-center rounded-lg px-3 py-2 text-sm font-semibold",
40776
+ "text-neutral-700 dark:text-neutral-300",
40777
+ "transition-colors hover:bg-neutral-100 dark:hover:bg-neutral-800",
40778
+ showCollapsed && "justify-center"
40861
40779
  ),
40862
- !showCollapsed && /* @__PURE__ */ jsx(
40863
- Animated,
40864
- {
40865
- as: "span",
40866
- preset: "sidebarLabel",
40867
- mode: "presence",
40868
- className: cn(
40869
- "ms-2 flex-shrink-0 transition-transform duration-200",
40870
- effectiveExpanded && "rotate-180"
40780
+ title: showCollapsed ? label : void 0,
40781
+ "aria-label": showCollapsed ? label : void 0,
40782
+ children: [
40783
+ icon && /* @__PURE__ */ jsx(
40784
+ "span",
40785
+ {
40786
+ className: cn(
40787
+ "text-muted-foreground h-5 w-5 flex-shrink-0",
40788
+ !showCollapsed && "me-3"
40789
+ ),
40790
+ children: icon
40791
+ }
40792
+ ),
40793
+ /* @__PURE__ */ jsxs(AnimatedPresence, { initial: false, children: [
40794
+ !showCollapsed && /* @__PURE__ */ jsx(
40795
+ Animated,
40796
+ {
40797
+ as: "span",
40798
+ preset: "sidebarLabel",
40799
+ mode: "presence",
40800
+ className: "flex-1 truncate text-start",
40801
+ children: label
40802
+ },
40803
+ "label"
40871
40804
  ),
40872
- children: /* @__PURE__ */ jsx(ChevronDownIcon4, {})
40873
- },
40874
- "chevron"
40875
- )
40876
- ] })
40877
- ]
40878
- }
40879
- ),
40880
- !showCollapsed && /* @__PURE__ */ jsx(
40881
- "div",
40882
- {
40883
- className: cn(
40884
- "overflow-hidden transition-all duration-300",
40885
- effectiveExpanded ? "mt-1 max-h-[1000px] opacity-100" : "max-h-0 opacity-0"
40805
+ !showCollapsed && /* @__PURE__ */ jsx(
40806
+ Animated,
40807
+ {
40808
+ as: "span",
40809
+ preset: "sidebarLabel",
40810
+ mode: "presence",
40811
+ className: cn(
40812
+ "ms-2 flex-shrink-0 transition-transform duration-200",
40813
+ effectiveExpanded && "rotate-180"
40814
+ ),
40815
+ children: /* @__PURE__ */ jsx(ChevronDownIcon4, {})
40816
+ },
40817
+ "chevron"
40818
+ )
40819
+ ] })
40820
+ ]
40821
+ }
40886
40822
  ),
40887
- children: /* @__PURE__ */ jsx("div", { className: "ps-2", children })
40888
- }
40889
- )
40890
- ] });
40823
+ forceMount ? (
40824
+ /*
40825
+ * Deliberately outside the rail-collapsed gate. Gating it there would
40826
+ * unmount the items whenever the sidebar collapsed, destroying exactly
40827
+ * the state this prop exists to preserve — the prop would hold its
40828
+ * promise for the group's own toggle and quietly break it for the
40829
+ * rail's, which is worse than not offering it.
40830
+ */
40831
+ /* @__PURE__ */ jsx(
40832
+ "div",
40833
+ {
40834
+ id: contentId,
40835
+ "data-slot": "sidebar-nav-group-items",
40836
+ "data-state": itemsVisible ? "open" : "closed",
40837
+ hidden: !itemsVisible,
40838
+ children: items
40839
+ }
40840
+ )
40841
+ ) : !showCollapsed && /* @__PURE__ */ jsx(AnimatedPresence, { initial: false, children: effectiveExpanded && /* @__PURE__ */ jsx(
40842
+ Animated,
40843
+ {
40844
+ id: contentId,
40845
+ "data-slot": "sidebar-nav-group-items",
40846
+ "data-state": "open",
40847
+ preset: "collapse",
40848
+ mode: "presence",
40849
+ enabled: !prefersReducedMotion,
40850
+ className: "overflow-hidden",
40851
+ children: items
40852
+ },
40853
+ "items"
40854
+ ) })
40855
+ ]
40856
+ }
40857
+ );
40891
40858
  }
40892
40859
  function SidebarNavItem({
40893
40860
  label,
@@ -44442,6 +44409,6 @@ function WebsiteInputGroup({
44442
44409
  }
44443
44410
  WebsiteInputGroup.displayName = "WebsiteInputGroup";
44444
44411
 
44445
- export { AIChat, AIChatModal, AIChatTrigger, AIReconciliationPanel, AccessDeniedPage, ActionButton2 as ActionButton, ActionButtonsBar, ActiveFilters, AddContactModal, AddServiceCard, AdditionalFields, Address, AddressCard, AddressCompact, AddressDisplay, AddressForm, AddressInline, AppHeader, AppHeaderActions, AppHeaderBrand, AppHeaderDivider, AppHeaderIconButton, AppHeaderSearch, AppHeaderSection, AppHeaderTitle, AppHeaderUserMenu, Assessment, AuthButtons, AuthDialog, BookAppointmentButton, BookingDialog, BusinessHours, BusinessHoursEditor, ButtonGroup, CHANGE_TYPE_LABELS, CONCERN_STATUS_LABELS, CSVColumnMapper, CSVFileUpload, CardSkeleton, CaseContextBar, CaseManagementHeader, CheckrIntegration, ClaimListingButton, ClaimProviderForm, CodingChips, CommandPalette, CommandPaletteProvider, CommandPaletteTrigger, CompactCookieBanner, CompactFilterBar, CompactHeader, CompactHours, CompactProviderHeader, ConditionEditor, ConnectionStatusBadge, ConnectionStatusBar, ConnectionStatusOverlay, ConsentSwitch, CookieConsentBanner, CopyrightText, CountBadge, CountryDropdown, CreateInvoiceModal, CreateReferralModal, DEFAULT_ERROR_CONFIGS, DEFAULT_LANGUAGES, DEFAULT_RADIUS_OPTIONS, DEFAULT_SOCIAL_PROVIDERS, DOTBadge, DashboardWidget, DashboardWidgetActions, DashboardWidgetDataCards, DashboardWidgetInfo, DashboardWidgetTable, DateRangeFilter, DateRangePicker, DialogOverlay, DisclaimerText, DockablePanel, DocumentDetectionOverlay, DocumentScanner, DropZone, DropzoneOverlay, EditUserRoleModal, EmployeeForm, EmployeeProfileCard, EmployerContactCard, EmployerList, EmployerPricingCard, EmployerServiceModal, EmployerView, ErrorPage, FileManager, FilePreview, FloatingAIChat, FloatingInput, FooterLinkSection, SocialMediaLinks2 as FooterSocialLinks, HRISProviderSelector, HandsFreeChat, HealthSurveillance, HelpSupportPanel, HeroSearchBar, HeyOzwell, HeyOzwellToggle, HoursSummary, ImagingOrderEditor, InlineBookingForm, InventoryManager, InviteUserModal, InvoiceList, InvoicePaymentPage, InvoiceView, LabOrderEditor, LanguageSelector, LanguageSelectorInline, LanguageSelectorNative, LegalLinks, LoadingBar, LoadingDots, LoadingOverlay, LoadingPage, LoadingSkeleton, MODEL_MANIFEST, MaintenancePage, MobileBackButton, MobileMenuButton, MobileMenuPanel, ModelInfoList, NavLinks, NewsletterForm, NotFoundPage, NotificationCenter, ORDER_TYPE_META, ORDER_TYPE_SEARCH_DOMAINS, OfflinePage, OnboardingCompletion, OnboardingStepQuestion, OnboardingWizard, OpenStatusBadge, OrderCard, OrderConfirmation, OrderConfirmationWizard, OrderDetailSidebar, OrderEditor, OrderList, OrderLookupForm, OrderSidebar, OrderSidebarTabs, OzwellChat, OzwellSettingsMenu, PageHeader, PatientHeader, PaymentHistoryTable, PaymentMethodBank, PaymentMethodCard, PaymentMethodList, PendingClaimsTable, PermissionsEditor, PillSelect, PresentingProblems, ProblemList, ProcedureOrderEditor, ProductVersion, ProductVersionBadge, Breadcrumb2 as ProviderBreadcrumb, ProviderCard, ProviderCardGrid, ProviderCardSkeleton, ProviderDetailHeader, ProviderDetailHeaderSkeleton, ProviderLogo2 as ProviderLogo, ProviderOverview, ProviderSearchBar, ProviderSearchFilters, ProviderSelector, ProviderSettings, SocialMediaLinks as ProviderSocialLinks, ProviderUsersTable, QuickBookCard, QuickLinksCard, RELEVANCE_LABELS, RecurringServiceAddCard, RecurringServiceCard, RecurringServiceGrid, RecurringServiceSetupModal, ReferralEditor, RejectionModal, ReportDashboard, ReportDatePicker, ReportLink, ReportTimeRange, ResultsEntryCard, ResultsEntryForm, ResultsEntryModal, SSOConfigForm, ScheduleCalendar, SearchResultsMessage, SelectedServicesBadges, ServerErrorPage, ServiceAccordion, ServiceBadge, ServiceBadgeGroup, ServiceCard, ServiceCategoryBadge, ServiceGeneralSettings, ServiceGrid, ServiceLink, ServiceList, ServiceMultiSelect, ServicePicker, ServicePricingManager, ServiceSelect, ServiceShippingSettings, ServiceTagCloud, ServiceTagCloudBadges, SetupServiceModal, Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarMobileToggle, SidebarNav, SidebarNavGroup, SidebarNavItem, SidebarProvider, SidebarSearch, SidebarToggle, SimpleFooter, SiteFooter, SiteHeader, SiteLogo, StepIndicator, StripeBadge, StripeSecureBadge, SuggestedActions, TableOfContents, TimelineEventList, TimelineProgress, Toast, ToastContainer, ToastProvider, UncertaintyBadge, UpdateAvailableOverlay, UserMenu, VerifiedBadge2 as VerifiedBadge, VisitScribe, VoiceManager, VoiceSetup, WEBSITE_TYPES, WebChartReportViewer, WebcamModal, WebsiteInput, WebsiteInputGroup, askOzwell, askOzwellStream, attributeSegments, calculateDateRange, centroid, chime, clearVoiceprints, clearWhatPrints, clusterEmbeddings, concernGroupKey, concernHistoryContent, cosine, countBadgeVariants, countChipVariants, create24HourSchedule, createDefaultSchedule, createWeekdaySchedule, currentAssertion, decodeTo16kMono, defaultCaseManagementHeaderLabels, defaultOrderTabs, defaultReconciliationIsEqual, endsWithDone, formatAddressLines, formatAddressSingleLine, formatCityState, formatCityStateZip, generateId, getDefaultPresets, getDictationLoad, getExtendedPresets, getGoogleMapsSearchUrl, getGoogleMapsUrl, getOzwellConfig, getVoiceprints, getWakeWarm, inferSpeakerRoles, isConditionCodetype, isOzwellConfigured, isValidUrl, isWhisperLoaded, labelClusters, loadWhatPrints, medicationToOrder, mergeTurns, normalizeConditionCodingSystem, openRollingRecorder, orderToMedication, orderTypeForCodetype, panelVariants as reconciliationPanelVariants, saveWhatPrints, setVoiceprints, stripStopPhrase, subscribeDictationLoad, subscribeWakeWarm, toOzwellMessages, transcribeBlob, transcribeGate, transcribeSamples, transcribeSegments, transcribeServer, trimTrailingStopPhrase, useCamera, useCommandPalette, useConnectionStatus, useCookieConsent, useDiarization, useDocumentDetection, useDropzone, useFileUpload, useHeyOzwell, useOptionalToast, useSidebar, useSpeakerVerify, useToast, useVisitScribe, useVoiceSetup, useWakeWord, warmStopGate, warmWakeModels, warmWhisper, widgetVariants };
44412
+ export { AIChat, AIChatModal, AIChatTrigger, AIReconciliationPanel, AccessDeniedPage, ActionButton2 as ActionButton, ActionButtonsBar, ActiveFilters, AddContactModal, AddServiceCard, AdditionalFields, Address, AddressCard, AddressCompact, AddressDisplay, AddressForm, AddressInline, AppHeader, AppHeaderActions, AppHeaderBrand, AppHeaderDivider, AppHeaderIconButton, AppHeaderSearch, AppHeaderSection, AppHeaderTitle, AppHeaderUserMenu, Assessment, AuthButtons, AuthDialog, BookAppointmentButton, BookingDialog, BusinessHours, BusinessHoursEditor, ButtonGroup, CHANGE_TYPE_LABELS, CONCERN_STATUS_LABELS, CSVColumnMapper, CSVFileUpload, CardSkeleton, CaseContextBar, CaseManagementHeader, CheckrIntegration, ClaimListingButton, ClaimProviderForm, CodingChips, CommandPalette, CommandPaletteProvider, CommandPaletteTrigger, CompactCookieBanner, CompactFilterBar, CompactHeader, CompactHours, CompactProviderHeader, ConditionEditor, ConnectionStatusBadge, ConnectionStatusBar, ConnectionStatusOverlay, ConsentSwitch, CookieConsentBanner, CopyrightText, CountBadge, CountryDropdown, CreateInvoiceModal, CreateReferralModal, DEFAULT_ERROR_CONFIGS, DEFAULT_LANGUAGES, DEFAULT_RADIUS_OPTIONS, DEFAULT_SOCIAL_PROVIDERS, DOTBadge, DashboardWidget, DashboardWidgetActions, DashboardWidgetDataCards, DashboardWidgetInfo, DashboardWidgetTable, DateRangeFilter, DateRangePicker, DialogOverlay, DisclaimerText, DockablePanel, DocumentDetectionOverlay, DocumentScanner, DropZone, DropzoneOverlay, EditUserRoleModal, EmployeeForm, EmployeeProfileCard, EmployerContactCard, EmployerList, EmployerPricingCard, EmployerServiceModal, EmployerView, ErrorPage, FileManager, FilePreview, FloatingAIChat, FloatingInput, FooterLinkSection, SocialMediaLinks2 as FooterSocialLinks, HRISProviderSelector, HandsFreeChat, HealthSurveillance, HelpSupportPanel, HeroSearchBar, HeyOzwell, HeyOzwellToggle, HoursSummary, ImagingOrderEditor, InlineBookingForm, InventoryManager, InviteUserModal, InvoiceList, InvoicePaymentPage, InvoiceView, LabOrderEditor, LanguageSelector, LanguageSelectorInline, LanguageSelectorNative, LegalLinks, LoadingBar, LoadingDots, LoadingOverlay, LoadingPage, LoadingSkeleton, MODEL_MANIFEST, MaintenancePage, MobileBackButton, MobileMenuButton, MobileMenuPanel, ModelInfoList, NavLinks, NewsletterForm, NotFoundPage, NotificationCenter, ORDER_TYPE_META, ORDER_TYPE_SEARCH_DOMAINS, OfflinePage, OnboardingCompletion, OnboardingStepQuestion, OnboardingWizard, OpenStatusBadge, OrderCard, OrderConfirmation, OrderConfirmationWizard, OrderDetailSidebar, OrderEditor, OrderList, OrderLookupForm, OrderSidebar, OrderSidebarTabs, OzwellChat, OzwellSettingsMenu, PageHeader, PatientHeader, PaymentHistoryTable, PaymentMethodBank, PaymentMethodCard, PaymentMethodList, PendingClaimsTable, PermissionsEditor, PillSelect, PresentingProblems, ProblemList, ProcedureOrderEditor, ProductVersion, ProductVersionBadge, Breadcrumb2 as ProviderBreadcrumb, ProviderCard, ProviderCardGrid, ProviderCardSkeleton, ProviderDetailHeader, ProviderDetailHeaderSkeleton, ProviderLogo2 as ProviderLogo, ProviderOverview, ProviderSearchBar, ProviderSearchFilters, ProviderSelector, ProviderSettings, SocialMediaLinks as ProviderSocialLinks, ProviderUsersTable, QuickBookCard, QuickLinksCard, RELEVANCE_LABELS, RecurringServiceAddCard, RecurringServiceCard, RecurringServiceGrid, RecurringServiceSetupModal, ReferralEditor, RejectionModal, ReportDashboard, ReportDatePicker, ReportLink, ReportTimeRange, ResultsEntryCard, ResultsEntryForm, ResultsEntryModal, SSOConfigForm, ScheduleCalendar, SearchResultsMessage, SelectedServicesBadges, ServerErrorPage, ServiceAccordion, ServiceBadge, ServiceBadgeGroup, ServiceCard, ServiceCategoryBadge, ServiceGeneralSettings, ServiceGrid, ServiceLink, ServiceList, ServiceMultiSelect, ServicePicker, ServicePricingManager, ServiceSelect, ServiceShippingSettings, ServiceTagCloud, ServiceTagCloudBadges, SetupServiceModal, Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarMobileToggle, SidebarNav, SidebarNavGroup, SidebarNavItem, SidebarProvider, SidebarSearch, SidebarToggle, SimpleFooter, SiteFooter, SiteHeader, SiteLogo, StepIndicator, StripeBadge, StripeSecureBadge, SuggestedActions, TableOfContents, TimelineEventList, TimelineProgress, Toast, ToastContainer, ToastProvider, UncertaintyBadge, UpdateAvailableOverlay, UserMenu, VerifiedBadge2 as VerifiedBadge, VisitScribe, VoiceManager, VoiceSetup, WEBSITE_TYPES, WebChartReportViewer, WebcamModal, WebsiteInput, WebsiteInputGroup, askOzwell, askOzwellStream, attributeSegments, calculateDateRange, centroid, chime, clusterEmbeddings, concernGroupKey, concernHistoryContent, cosine, countBadgeVariants, countChipVariants, create24HourSchedule, createDefaultSchedule, createWeekdaySchedule, currentAssertion, decodeTo16kMono, defaultCaseManagementHeaderLabels, defaultOrderTabs, defaultReconciliationIsEqual, endsWithDone, formatAddressLines, formatAddressSingleLine, formatCityState, formatCityStateZip, generateId, getDefaultPresets, getDictationLoad, getExtendedPresets, getGoogleMapsSearchUrl, getGoogleMapsUrl, getOzwellConfig, getWakeWarm, inferSpeakerRoles, isConditionCodetype, isOzwellConfigured, isValidUrl, isWhisperLoaded, labelClusters, medicationToOrder, mergeTurns, normalizeConditionCodingSystem, openRollingRecorder, orderToMedication, orderTypeForCodetype, panelVariants as reconciliationPanelVariants, stripStopPhrase, subscribeDictationLoad, subscribeWakeWarm, toOzwellMessages, transcribeBlob, transcribeGate, transcribeSamples, transcribeSegments, transcribeServer, trimTrailingStopPhrase, useCamera, useCommandPalette, useConnectionStatus, useCookieConsent, useDiarization, useDocumentDetection, useDropzone, useFileUpload, useHeyOzwell, useOptionalToast, useSidebar, useSpeakerVerify, useToast, useVisitScribe, useVoiceSetup, useWakeWord, warmStopGate, warmWakeModels, warmWhisper, widgetVariants };
44446
44413
  //# sourceMappingURL=index.js.map
44447
44414
  //# sourceMappingURL=index.js.map