@mieweb/ui 0.11.0-dev.6 → 0.11.0-dev.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ag-grid.cjs +11 -2
- package/dist/ag-grid.cjs.map +1 -1
- package/dist/ag-grid.d.cts +8 -0
- package/dist/ag-grid.d.ts +8 -0
- package/dist/ag-grid.js +11 -2
- package/dist/ag-grid.js.map +1 -1
- package/dist/brands/index.cjs +12 -12
- package/dist/brands/index.js +3 -3
- package/dist/chunk-3TUULOTW.cjs +333 -0
- package/dist/chunk-3TUULOTW.cjs.map +1 -0
- package/dist/{chunk-OODVC2UD.cjs → chunk-AWSSWNJY.cjs} +2 -2
- package/dist/{chunk-OODVC2UD.cjs.map → chunk-AWSSWNJY.cjs.map} +1 -1
- package/dist/{chunk-QJ2L5RU6.js → chunk-DSQCYX7L.js} +2 -2
- package/dist/{chunk-QJ2L5RU6.js.map → chunk-DSQCYX7L.js.map} +1 -1
- package/dist/{chunk-JTSKPDPH.cjs → chunk-HIYQ3M5V.cjs} +4 -3
- package/dist/chunk-HIYQ3M5V.cjs.map +1 -0
- package/dist/chunk-IZY4CMOO.js +715 -0
- package/dist/chunk-IZY4CMOO.js.map +1 -0
- package/dist/{chunk-753ENNB6.js → chunk-J3QEMZCH.js} +2 -2
- package/dist/{chunk-753ENNB6.js.map → chunk-J3QEMZCH.js.map} +1 -1
- package/dist/{chunk-VNWJTCBQ.js → chunk-MQOYDQTF.js} +4 -3
- package/dist/chunk-MQOYDQTF.js.map +1 -0
- package/dist/{chunk-NAH65KPK.cjs → chunk-TOJ56HKQ.cjs} +2 -2
- package/dist/{chunk-NAH65KPK.cjs.map → chunk-TOJ56HKQ.cjs.map} +1 -1
- package/dist/chunk-TRZLN32I.cjs +740 -0
- package/dist/chunk-TRZLN32I.cjs.map +1 -0
- package/dist/chunk-XQIQX5OB.js +309 -0
- package/dist/chunk-XQIQX5OB.js.map +1 -0
- package/dist/components/DictationButton/index.cjs +23 -0
- package/dist/components/DictationButton/index.cjs.map +1 -0
- package/dist/components/DictationButton/index.d.cts +67 -0
- package/dist/components/DictationButton/index.d.ts +67 -0
- package/dist/components/DictationButton/index.js +6 -0
- package/dist/components/DictationButton/index.js.map +1 -0
- package/dist/components/Markdown/index.cjs +10 -10
- package/dist/components/Markdown/index.js +2 -2
- package/dist/components/RecordButton/index.cjs +4 -4
- package/dist/components/RecordButton/index.js +1 -1
- package/dist/components/SuperChat/index.d.cts +2 -2
- package/dist/components/SuperChat/index.d.ts +2 -2
- package/dist/components/SuperChat/plugins/index.d.cts +2 -2
- package/dist/components/SuperChat/plugins/index.d.ts +2 -2
- package/dist/index.cjs +221 -844
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +63 -1
- package/dist/index.d.ts +63 -1
- package/dist/index.js +25 -716
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/{types-Cx1FHLq2.d.cts → types-DSWbrVkM.d.cts} +1 -1
- package/dist/{types-Cx1FHLq2.d.ts → types-DSWbrVkM.d.ts} +1 -1
- package/dist/whisperTranscribe-AV752TZI.cjs +81 -0
- package/dist/whisperTranscribe-AV752TZI.cjs.map +1 -0
- package/dist/whisperTranscribe-UBNUWXUQ.js +4 -0
- package/dist/whisperTranscribe-UBNUWXUQ.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-JTSKPDPH.cjs.map +0 -1
- package/dist/chunk-VNWJTCBQ.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { getModelBytes } from './chunk-6I7IDZ4A.js';
|
|
2
|
+
import { registerModelServiceWorker, warmWhisper, transcribeSegments, decodeTo16kMono, isOzwellConfigured, askOzwell, subscribeDictationLoad, getDictationLoad, toOzwellMessages, askOzwellStream, transcribeSamples, trimTrailingStopPhrase, stripStopPhrase, transcribeBlob, transcribeServer } from './chunk-IZY4CMOO.js';
|
|
3
|
+
export { askOzwell, askOzwellStream, decodeTo16kMono, endsWithDone, getDictationLoad, getOzwellConfig, isOzwellConfigured, isWhisperLoaded, stripStopPhrase, subscribeDictationLoad, toOzwellMessages, transcribeBlob, transcribeGate, transcribeSamples, transcribeSegments, transcribeServer, trimTrailingStopPhrase, warmStopGate, warmWhisper } from './chunk-IZY4CMOO.js';
|
|
2
4
|
import { loadWhatPrints, saveWhatPrints, clearWhatPrints } from './chunk-74ENCTIK.js';
|
|
3
5
|
export { clearVoiceprints, clearWhatPrints, getVoiceprints, loadWhatPrints, saveWhatPrints, setVoiceprints } from './chunk-74ENCTIK.js';
|
|
6
|
+
export { Rating, ReviewCard, defaultRatingLabels, defaultReviewCardLabels } from './chunk-CBBKWRLG.js';
|
|
4
7
|
export { RecordHeader, defaultRecordHeaderLabels } from './chunk-DXFP53KF.js';
|
|
5
8
|
export { RecordLayout, defaultRecordLayoutLabels } from './chunk-EGPDT7SM.js';
|
|
6
9
|
export { TagEditor, defaultTagEditorLabels } from './chunk-DGHS5IVD.js';
|
|
7
10
|
export { UserPicker, defaultUserPickerLabels } from './chunk-SZSRGUVO.js';
|
|
8
|
-
export { brands } from './chunk-
|
|
11
|
+
export { brands } from './chunk-J3QEMZCH.js';
|
|
12
|
+
export { defaultBrand } from './chunk-PSTGFXQG.js';
|
|
9
13
|
export { enterpriseHealthBrand } from './chunk-Q77TE5DZ.js';
|
|
10
14
|
export { miewebBrand } from './chunk-NERS5ZT6.js';
|
|
11
15
|
export { wagglelineBrand } from './chunk-2NTYAALC.js';
|
|
12
16
|
export { webchartBrand } from './chunk-CW66SO5O.js';
|
|
17
|
+
export { ccmeBrand } from './chunk-SCQRJPSV.js';
|
|
13
18
|
export { ozwellBrand } from './chunk-5YUBQIC7.js';
|
|
14
|
-
export { defaultBrand } from './chunk-PSTGFXQG.js';
|
|
15
19
|
export { createBrandPreset, generateBrandCSS, generateTailwindTheme } from './chunk-5GOWFNQ6.js';
|
|
16
20
|
export { bluehiveBrand } from './chunk-PJEL5ZZV.js';
|
|
17
|
-
|
|
21
|
+
import './chunk-GY5SP4ST.js';
|
|
18
22
|
export { CalendarHeatmap, defaultCalendarHeatmapLabels } from './chunk-EPCUPHEO.js';
|
|
19
23
|
export { CompletenessMeter, defaultCompletenessMeterLabels, getCompleteness } from './chunk-RLVYWUXG.js';
|
|
20
24
|
export { FieldHistory, defaultFieldHistoryLabels } from './chunk-6N7NMOSV.js';
|
|
@@ -22,7 +26,7 @@ export { LogoUploader, defaultLogoUploaderLabels } from './chunk-WQHBMZSC.js';
|
|
|
22
26
|
export { PhiMask, defaultPhiMaskLabels } from './chunk-DHGCLPFZ.js';
|
|
23
27
|
export { PropertyList, defaultPropertyListLabels } from './chunk-7HUTR6RX.js';
|
|
24
28
|
export { InlineEdit, defaultInlineEditLabels } from './chunk-M3VPGJMV.js';
|
|
25
|
-
export {
|
|
29
|
+
export { ViewSet } from './chunk-4RI3CQGE.js';
|
|
26
30
|
export { TranscriptView, formatTimestampMs } from './chunk-LAEIVOIY.js';
|
|
27
31
|
export { PlayButton, VideoCard } from './chunk-43K7OQ3E.js';
|
|
28
32
|
export { VisuallyHidden } from './chunk-H2CIKJQI.js';
|
|
@@ -33,13 +37,15 @@ import './chunk-YGS2TRMP.js';
|
|
|
33
37
|
export { AssociationList, defaultAssociationListLabels } from './chunk-5HKZR6UG.js';
|
|
34
38
|
import './chunk-FTEZNCRI.js';
|
|
35
39
|
import './chunk-Y424YL55.js';
|
|
36
|
-
import './chunk-
|
|
40
|
+
import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from './chunk-5ILCNY74.js';
|
|
41
|
+
export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from './chunk-5ILCNY74.js';
|
|
37
42
|
import { Text } from './chunk-3YSIZ2CK.js';
|
|
38
43
|
export { SmallMuted, Text, textVariants } from './chunk-3YSIZ2CK.js';
|
|
39
44
|
export { ThemeProvider, ThemeProviderContext, ThemeToggle, themeToggleIconVariants, themeToggleVariants, useThemeContext } from './chunk-EI4JU5JF.js';
|
|
40
45
|
export { Toggle, toggleVariants } from './chunk-PTZB2GKL.js';
|
|
41
|
-
export { ViewSet } from './chunk-4RI3CQGE.js';
|
|
42
46
|
export { ViewSwitcher, viewSwitcherVariants } from './chunk-2W73UQ3T.js';
|
|
47
|
+
import { Skeleton } from './chunk-ZIUADGAR.js';
|
|
48
|
+
export { Skeleton, SkeletonCard, SkeletonTable, SkeletonText, skeletonVariants } from './chunk-ZIUADGAR.js';
|
|
43
49
|
export { SourceTip } from './chunk-KFEN2SRZ.js';
|
|
44
50
|
export { Sparkline } from './chunk-CG4ZKJLE.js';
|
|
45
51
|
import { ButtonGroup, SparklesIcon, RefreshIcon, CloseIcon, JumpToBottomButton, AIMessageDisplay } from './chunk-MQ5WJ3NO.js';
|
|
@@ -48,21 +54,18 @@ import { useTypingEmulation, EmptyState } from './chunk-NKG2UNXE.js';
|
|
|
48
54
|
export { AttachmentPreview, ConversationHeader, ConversationListItem, ConversationListSkeleton, DateSeparator, EmptyState, LightboxModal, LoadMoreButton, MessageBubble, MessageList, MessageStatusIcon, MessageThread, MessagingSplitView, ReadReceiptIndicator, SkeletonMessage, TypingIndicator, bubbleVariants, formatDateLabel, formatFileSize, formatLastSeen, getConversationSubtitle, getConversationTitle, groupMessagesByDate, headerVariants, isSameSenderGroup, useMessageScroll, useMessages, useReadReceipts, useTypingEmulation, useTypingIndicator } from './chunk-NKG2UNXE.js';
|
|
49
55
|
import { notifyComposerMigrationOnce, ChatComposer, DEFAULT_MAX_FILE_SIZE, DEFAULT_ACCEPTED_FILE_TYPES } from './chunk-GJPCWR4C.js';
|
|
50
56
|
export { AttachmentPicker, AttachmentPreviewItem, CameraButton, ChatComposer, ComposerModelSelector, DragDropZone, generateAttachmentId, getFileType, validateFile } from './chunk-GJPCWR4C.js';
|
|
51
|
-
import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from './chunk-5ILCNY74.js';
|
|
52
|
-
export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from './chunk-5ILCNY74.js';
|
|
53
57
|
export { DateButton, DatePicker, RadioOption, SchedulePicker, TimeButton, TimePicker, dateButtonVariants, radioOptionVariants, timeButtonVariants } from './chunk-23AYDOCH.js';
|
|
54
58
|
export { ScrollArea, scrollAreaVariants } from './chunk-HS25RPDW.js';
|
|
55
59
|
export { SectionSpyNav } from './chunk-FIKO4WR6.js';
|
|
56
60
|
export { AnimatedNumber, SliderCalculator } from './chunk-DT3X3RBM.js';
|
|
57
|
-
import { Skeleton } from './chunk-ZIUADGAR.js';
|
|
58
|
-
export { Skeleton, SkeletonCard, SkeletonTable, SkeletonText, skeletonVariants } from './chunk-ZIUADGAR.js';
|
|
59
61
|
export { PhoneInput, PhoneInputGroup } from './chunk-QDNHN7R2.js';
|
|
60
62
|
import { Progress } from './chunk-P4E3K3ND.js';
|
|
61
63
|
export { CircularProgress, Progress, circularProgressVariants, progressBarFillVariants, progressBarTrackVariants } from './chunk-P4E3K3ND.js';
|
|
62
64
|
export { QuickAction, QuickActionGroup, QuickActionIcons, quickActionIconVariants, quickActionVariants } from './chunk-TQDZLRIE.js';
|
|
63
65
|
export { ReadingProgressBar } from './chunk-WKSUL2ZN.js';
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
export { DictationButton, defaultDictationLabels, useDictation } from './chunk-XQIQX5OB.js';
|
|
67
|
+
import { RecordButton } from './chunk-MQOYDQTF.js';
|
|
68
|
+
export { RecordButton, formatDuration, recordButtonVariants } from './chunk-MQOYDQTF.js';
|
|
66
69
|
export { FillerWordsModal, MediaEditor, SilenceSettingsModal, SpeedMarkerMenu, WordEditorModal } from './chunk-JM4YFLO4.js';
|
|
67
70
|
export { Slider, sliderRangeVariants, sliderThumbVariants, sliderTrackVariants } from './chunk-V5VPECJI.js';
|
|
68
71
|
export { MediaFeed } from './chunk-2X54ZLT6.js';
|
|
@@ -78,11 +81,11 @@ export { GanttView, defaultGanttLabels } from './chunk-Y4QNLW7W.js';
|
|
|
78
81
|
export { GlossaryTooltip } from './chunk-SRMTRD7F.js';
|
|
79
82
|
export { Kbd, KeyboardShortcutsOverlay } from './chunk-JMAZ2GKT.js';
|
|
80
83
|
export { ListView, itemVariants as listViewItemVariants } from './chunk-UNFDIBKJ.js';
|
|
81
|
-
export { CodeBlock, MarkdownRenderer, highlightCode, useMarkdown } from './chunk-
|
|
84
|
+
export { CodeBlock, MarkdownRenderer, highlightCode, useMarkdown } from './chunk-DSQCYX7L.js';
|
|
85
|
+
export { SurveyBlock } from './chunk-RSJGTWLM.js';
|
|
82
86
|
export { CsvBlock } from './chunk-P7D7BYFE.js';
|
|
83
87
|
export { HtmlPreviewBlock } from './chunk-FGLIP6YR.js';
|
|
84
88
|
export { MermaidBlock } from './chunk-7QW6TU4X.js';
|
|
85
|
-
export { SurveyBlock } from './chunk-RSJGTWLM.js';
|
|
86
89
|
export { FenceBlock } from './chunk-HDY7YQFX.js';
|
|
87
90
|
export { CopyButton } from './chunk-5QZ73PZC.js';
|
|
88
91
|
import { CountryDropdownBase } from './chunk-OTIKWEFZ.js';
|
|
@@ -3128,27 +3131,6 @@ function OzwellSettingsMenu({
|
|
|
3128
3131
|
}
|
|
3129
3132
|
);
|
|
3130
3133
|
}
|
|
3131
|
-
|
|
3132
|
-
// src/components/AI/modelCache.ts
|
|
3133
|
-
var registered = /* @__PURE__ */ new Set();
|
|
3134
|
-
function registerModelServiceWorker(swUrl = "/ozwell-model-sw.js") {
|
|
3135
|
-
if (typeof navigator === "undefined" || !("serviceWorker" in navigator))
|
|
3136
|
-
return;
|
|
3137
|
-
if (registered.has(swUrl)) return;
|
|
3138
|
-
registered.add(swUrl);
|
|
3139
|
-
navigator.serviceWorker.register(swUrl).then(
|
|
3140
|
-
() => console.log("[modelCache] model service worker registered"),
|
|
3141
|
-
(e) => {
|
|
3142
|
-
registered.delete(swUrl);
|
|
3143
|
-
console.warn(
|
|
3144
|
-
"[modelCache] SW registration failed (models will still load, just not cached):",
|
|
3145
|
-
e
|
|
3146
|
-
);
|
|
3147
|
-
}
|
|
3148
|
-
);
|
|
3149
|
-
}
|
|
3150
|
-
|
|
3151
|
-
// src/components/AI/HeyOzwell/WakeWord/useWakeWord.ts
|
|
3152
3134
|
var DEFAULT_ASSET_BASE = "https://huggingface.co/jlocala/ozwell-voice-assets/resolve/main";
|
|
3153
3135
|
var DEFAULT_ASSET = `${DEFAULT_ASSET_BASE}/wakeword`;
|
|
3154
3136
|
var PHRASES = ["hey-ozwell", "ozwell-i'm-done"];
|
|
@@ -3427,679 +3409,6 @@ function useWakeWord(opts = {}) {
|
|
|
3427
3409
|
}
|
|
3428
3410
|
};
|
|
3429
3411
|
}
|
|
3430
|
-
|
|
3431
|
-
// src/components/AI/ozwellChat.ts
|
|
3432
|
-
var DEFAULT_BASE = "https://api.ozwell.ai";
|
|
3433
|
-
var OLLAMA_BASE = "http://localhost:11434";
|
|
3434
|
-
var DEFAULTS = {
|
|
3435
|
-
model: "gpt-4o-mini",
|
|
3436
|
-
system: "You are Ozwell, a concise and helpful clinical assistant. Answer briefly and clearly.",
|
|
3437
|
-
temperature: 0.7
|
|
3438
|
-
};
|
|
3439
|
-
function readWindowGlobal() {
|
|
3440
|
-
if (typeof window === "undefined") return {};
|
|
3441
|
-
const get = (w) => {
|
|
3442
|
-
try {
|
|
3443
|
-
return w?.__ozwell;
|
|
3444
|
-
} catch {
|
|
3445
|
-
return void 0;
|
|
3446
|
-
}
|
|
3447
|
-
};
|
|
3448
|
-
return get(window) || get(window.parent) || get(window.top) || {};
|
|
3449
|
-
}
|
|
3450
|
-
function sanitizeConfig(o) {
|
|
3451
|
-
if (!o || typeof o !== "object") return {};
|
|
3452
|
-
const out = {};
|
|
3453
|
-
for (const k of Object.keys(o)) {
|
|
3454
|
-
if (k === "__proto__" || k === "constructor" || k === "prototype") continue;
|
|
3455
|
-
out[k] = o[k];
|
|
3456
|
-
}
|
|
3457
|
-
return out;
|
|
3458
|
-
}
|
|
3459
|
-
function readRaw() {
|
|
3460
|
-
let stored = {};
|
|
3461
|
-
try {
|
|
3462
|
-
stored = sanitizeConfig(
|
|
3463
|
-
JSON.parse(localStorage.getItem("ozwellConfig") || "{}")
|
|
3464
|
-
);
|
|
3465
|
-
} catch {
|
|
3466
|
-
}
|
|
3467
|
-
return { ...stored, ...sanitizeConfig(readWindowGlobal()) };
|
|
3468
|
-
}
|
|
3469
|
-
function getOzwellConfig() {
|
|
3470
|
-
const c = readRaw();
|
|
3471
|
-
const apiKey = c.apiKey || "";
|
|
3472
|
-
const baseURL = c.baseURL || (apiKey === "ollama" ? OLLAMA_BASE : DEFAULT_BASE);
|
|
3473
|
-
return {
|
|
3474
|
-
baseURL,
|
|
3475
|
-
apiKey,
|
|
3476
|
-
model: c.model || DEFAULTS.model,
|
|
3477
|
-
system: c.system ?? DEFAULTS.system,
|
|
3478
|
-
// Coerce: temperature set via console/localStorage often arrives as a string; a string in the request
|
|
3479
|
-
// body can be rejected by OpenAI-compatible servers. Fall back to the default if it's not a real number —
|
|
3480
|
-
// and guard the empty/whitespace string explicitly, since Number('') is 0 (a valid-looking temperature)
|
|
3481
|
-
// and would silently pin sampling to 0 instead of using the default.
|
|
3482
|
-
temperature: c.temperature != null && String(c.temperature).trim() !== "" && Number.isFinite(Number(c.temperature)) ? Number(c.temperature) : DEFAULTS.temperature
|
|
3483
|
-
};
|
|
3484
|
-
}
|
|
3485
|
-
function isOzwellConfigured() {
|
|
3486
|
-
return !!getOzwellConfig().apiKey;
|
|
3487
|
-
}
|
|
3488
|
-
function toOzwellMessages(msgs) {
|
|
3489
|
-
const out = [];
|
|
3490
|
-
for (const m of msgs) {
|
|
3491
|
-
if (m.role !== "user" && m.role !== "assistant") continue;
|
|
3492
|
-
const text = (m.content || []).map((c) => c.text || "").join(" ").trim();
|
|
3493
|
-
if (text) out.push({ role: m.role, content: text });
|
|
3494
|
-
}
|
|
3495
|
-
return out;
|
|
3496
|
-
}
|
|
3497
|
-
function withSystem(messages, system) {
|
|
3498
|
-
if (!system || messages.some((m) => m.role === "system")) return messages;
|
|
3499
|
-
return [{ role: "system", content: system }, ...messages];
|
|
3500
|
-
}
|
|
3501
|
-
function buildRequest(messages, cfg, stream) {
|
|
3502
|
-
const msgs = typeof messages === "string" ? [{ role: "user", content: messages }] : messages;
|
|
3503
|
-
return {
|
|
3504
|
-
url: `${cfg.baseURL.replace(/\/$/, "")}/v1/chat/completions`,
|
|
3505
|
-
headers: {
|
|
3506
|
-
"Content-Type": "application/json",
|
|
3507
|
-
// 'ollama' is a sentinel that points baseURL at the local Ollama server, not a real credential —
|
|
3508
|
-
// don't send it as a Bearer token (some local OpenAI-compatible servers reject unexpected auth).
|
|
3509
|
-
...cfg.apiKey && cfg.apiKey !== "ollama" ? { Authorization: `Bearer ${cfg.apiKey}` } : {}
|
|
3510
|
-
},
|
|
3511
|
-
body: JSON.stringify({
|
|
3512
|
-
model: cfg.model,
|
|
3513
|
-
messages: withSystem(msgs, cfg.system),
|
|
3514
|
-
temperature: cfg.temperature,
|
|
3515
|
-
stream
|
|
3516
|
-
})
|
|
3517
|
-
};
|
|
3518
|
-
}
|
|
3519
|
-
function resolveConfig(opts) {
|
|
3520
|
-
const cfg = { ...getOzwellConfig(), ...opts };
|
|
3521
|
-
if (opts.apiKey && !opts.baseURL && !readRaw().baseURL) {
|
|
3522
|
-
cfg.baseURL = cfg.apiKey === "ollama" ? OLLAMA_BASE : DEFAULT_BASE;
|
|
3523
|
-
}
|
|
3524
|
-
return cfg;
|
|
3525
|
-
}
|
|
3526
|
-
async function askOzwell(messages, opts = {}) {
|
|
3527
|
-
const cfg = resolveConfig(opts);
|
|
3528
|
-
const req = buildRequest(messages, cfg, false);
|
|
3529
|
-
const res = await fetch(req.url, {
|
|
3530
|
-
method: "POST",
|
|
3531
|
-
headers: req.headers,
|
|
3532
|
-
body: req.body,
|
|
3533
|
-
signal: opts.signal
|
|
3534
|
-
});
|
|
3535
|
-
if (!res.ok) throw new Error(`Ozwell API ${res.status}: ${res.statusText}`);
|
|
3536
|
-
const data = await res.json();
|
|
3537
|
-
return (data?.choices?.[0]?.message?.content ?? "").trim();
|
|
3538
|
-
}
|
|
3539
|
-
async function askOzwellStream(messages, onToken, opts = {}) {
|
|
3540
|
-
const cfg = resolveConfig(opts);
|
|
3541
|
-
const req = buildRequest(messages, cfg, true);
|
|
3542
|
-
const res = await fetch(req.url, {
|
|
3543
|
-
method: "POST",
|
|
3544
|
-
headers: req.headers,
|
|
3545
|
-
body: req.body,
|
|
3546
|
-
signal: opts.signal
|
|
3547
|
-
});
|
|
3548
|
-
if (!res.ok || !res.body)
|
|
3549
|
-
throw new Error(`Ozwell API ${res.status}: ${res.statusText}`);
|
|
3550
|
-
const reader = res.body.getReader();
|
|
3551
|
-
const decoder = new TextDecoder();
|
|
3552
|
-
let buf = "";
|
|
3553
|
-
let full = "";
|
|
3554
|
-
const processEvent = (ev) => {
|
|
3555
|
-
for (const line of ev.split(/\r?\n/)) {
|
|
3556
|
-
if (!line.startsWith("data:")) continue;
|
|
3557
|
-
const payload = line.slice(5).trim();
|
|
3558
|
-
if (payload === "[DONE]") return true;
|
|
3559
|
-
try {
|
|
3560
|
-
const json = JSON.parse(payload);
|
|
3561
|
-
const delta = json?.choices?.[0]?.delta?.content || "";
|
|
3562
|
-
if (delta) {
|
|
3563
|
-
full += delta;
|
|
3564
|
-
onToken(delta, full);
|
|
3565
|
-
}
|
|
3566
|
-
} catch {
|
|
3567
|
-
}
|
|
3568
|
-
}
|
|
3569
|
-
return false;
|
|
3570
|
-
};
|
|
3571
|
-
try {
|
|
3572
|
-
for (; ; ) {
|
|
3573
|
-
const { done, value } = await reader.read();
|
|
3574
|
-
if (done) break;
|
|
3575
|
-
buf += decoder.decode(value, { stream: true });
|
|
3576
|
-
const events = buf.split(/\r?\n\r?\n/);
|
|
3577
|
-
buf = events.pop() || "";
|
|
3578
|
-
for (const ev of events) if (processEvent(ev)) return full;
|
|
3579
|
-
}
|
|
3580
|
-
buf += decoder.decode();
|
|
3581
|
-
if (buf.trim()) processEvent(buf);
|
|
3582
|
-
} finally {
|
|
3583
|
-
try {
|
|
3584
|
-
await reader.cancel();
|
|
3585
|
-
} catch {
|
|
3586
|
-
}
|
|
3587
|
-
}
|
|
3588
|
-
return full;
|
|
3589
|
-
}
|
|
3590
|
-
|
|
3591
|
-
// src/components/AI/whisperTranscribe.ts
|
|
3592
|
-
var HF_HOST = "https://huggingface.co";
|
|
3593
|
-
var HF_PATH = "{model}/resolve/{revision}/";
|
|
3594
|
-
var R2_HOST = "https://pub-64db68afc2cb4e108ff06e7e583f09d1.r2.dev";
|
|
3595
|
-
function whisperHost() {
|
|
3596
|
-
if (typeof window === "undefined") return R2_HOST;
|
|
3597
|
-
const fromWin = (w) => {
|
|
3598
|
-
try {
|
|
3599
|
-
return w?.__ozwellWhisperHost;
|
|
3600
|
-
} catch {
|
|
3601
|
-
return void 0;
|
|
3602
|
-
}
|
|
3603
|
-
};
|
|
3604
|
-
const win = fromWin(window) || fromWin(window.parent) || fromWin(window.top);
|
|
3605
|
-
if (win) return win.replace(/\/$/, "");
|
|
3606
|
-
try {
|
|
3607
|
-
const h = JSON.parse(
|
|
3608
|
-
localStorage.getItem("ozwellConfig") || "{}"
|
|
3609
|
-
).whisperHost;
|
|
3610
|
-
if (h) return String(h).replace(/\/$/, "");
|
|
3611
|
-
} catch {
|
|
3612
|
-
}
|
|
3613
|
-
return R2_HOST;
|
|
3614
|
-
}
|
|
3615
|
-
var SMALL_MODELS = {
|
|
3616
|
-
tiny: "Xenova/whisper-tiny.en",
|
|
3617
|
-
"tiny.en": "Xenova/whisper-tiny.en",
|
|
3618
|
-
base: "Xenova/whisper-base.en",
|
|
3619
|
-
"base.en": "Xenova/whisper-base.en",
|
|
3620
|
-
small: "Xenova/whisper-small.en",
|
|
3621
|
-
"small.en": "Xenova/whisper-small.en"
|
|
3622
|
-
};
|
|
3623
|
-
var GATE_MODEL = "Xenova/whisper-base.en";
|
|
3624
|
-
function whisperPref() {
|
|
3625
|
-
if (typeof window === "undefined") return null;
|
|
3626
|
-
const fromWin = (w) => {
|
|
3627
|
-
try {
|
|
3628
|
-
return w?.__ozwell?.whisper;
|
|
3629
|
-
} catch {
|
|
3630
|
-
return void 0;
|
|
3631
|
-
}
|
|
3632
|
-
};
|
|
3633
|
-
const win = fromWin(window) || fromWin(window.parent) || fromWin(window.top);
|
|
3634
|
-
if (win) return win;
|
|
3635
|
-
try {
|
|
3636
|
-
return JSON.parse(localStorage.getItem("ozwellConfig") || "{}").whisper || null;
|
|
3637
|
-
} catch {
|
|
3638
|
-
return null;
|
|
3639
|
-
}
|
|
3640
|
-
}
|
|
3641
|
-
function whisperDevice() {
|
|
3642
|
-
if (typeof window === "undefined") return null;
|
|
3643
|
-
const fromWin = (w) => {
|
|
3644
|
-
try {
|
|
3645
|
-
return w?.__ozwell?.whisperDevice;
|
|
3646
|
-
} catch {
|
|
3647
|
-
return void 0;
|
|
3648
|
-
}
|
|
3649
|
-
};
|
|
3650
|
-
const win = fromWin(window) || fromWin(window.parent) || fromWin(window.top);
|
|
3651
|
-
if (win) return win;
|
|
3652
|
-
try {
|
|
3653
|
-
return JSON.parse(localStorage.getItem("ozwellConfig") || "{}").whisperDevice || null;
|
|
3654
|
-
} catch {
|
|
3655
|
-
return null;
|
|
3656
|
-
}
|
|
3657
|
-
}
|
|
3658
|
-
function whisperDtype() {
|
|
3659
|
-
if (typeof window === "undefined") return null;
|
|
3660
|
-
const fromWin = (w) => {
|
|
3661
|
-
try {
|
|
3662
|
-
return w?.__ozwell?.whisperDtype;
|
|
3663
|
-
} catch {
|
|
3664
|
-
return void 0;
|
|
3665
|
-
}
|
|
3666
|
-
};
|
|
3667
|
-
const win = fromWin(window) || fromWin(window.parent) || fromWin(window.top);
|
|
3668
|
-
if (win) return win;
|
|
3669
|
-
try {
|
|
3670
|
-
return JSON.parse(localStorage.getItem("ozwellConfig") || "{}").whisperDtype || null;
|
|
3671
|
-
} catch {
|
|
3672
|
-
return null;
|
|
3673
|
-
}
|
|
3674
|
-
}
|
|
3675
|
-
var DEFAULT_TRANSFORMERS_URL = "https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.8.1";
|
|
3676
|
-
function transformersUrl() {
|
|
3677
|
-
try {
|
|
3678
|
-
const w = window.__ozwellTransformersUrl;
|
|
3679
|
-
if (w) return w;
|
|
3680
|
-
const ls = localStorage.getItem("ozwellTransformersUrl");
|
|
3681
|
-
if (ls) return ls;
|
|
3682
|
-
} catch {
|
|
3683
|
-
}
|
|
3684
|
-
return DEFAULT_TRANSFORMERS_URL;
|
|
3685
|
-
}
|
|
3686
|
-
var dictationLoad = {
|
|
3687
|
-
active: false,
|
|
3688
|
-
progress: 0,
|
|
3689
|
-
done: false
|
|
3690
|
-
};
|
|
3691
|
-
var loadListeners = /* @__PURE__ */ new Set();
|
|
3692
|
-
function setDictationLoad(patch) {
|
|
3693
|
-
dictationLoad = { ...dictationLoad, ...patch };
|
|
3694
|
-
loadListeners.forEach((l) => l());
|
|
3695
|
-
}
|
|
3696
|
-
function getDictationLoad() {
|
|
3697
|
-
return dictationLoad;
|
|
3698
|
-
}
|
|
3699
|
-
function subscribeDictationLoad(cb) {
|
|
3700
|
-
loadListeners.add(cb);
|
|
3701
|
-
return () => {
|
|
3702
|
-
loadListeners.delete(cb);
|
|
3703
|
-
};
|
|
3704
|
-
}
|
|
3705
|
-
var WORKER_SRC = `
|
|
3706
|
-
let cfg = null, modP = null, pipeP = null, gateP = null, isMulti = false;
|
|
3707
|
-
let chain = Promise.resolve();
|
|
3708
|
-
const serialize = (fn) => { const r = chain.then(fn, fn); chain = r.then(() => {}, () => {}); return r; };
|
|
3709
|
-
|
|
3710
|
-
function getMod() {
|
|
3711
|
-
if (modP) return modP;
|
|
3712
|
-
modP = (async () => {
|
|
3713
|
-
const mod = await import(cfg.transformersUrl);
|
|
3714
|
-
mod.env.allowLocalModels = false;
|
|
3715
|
-
// transformers.js's OWN cache STREAMS the model straight to the Cache API (how whisper-web caches this
|
|
3716
|
-
// 1.2GB turbo model). A hand-rolled SW that buffers the whole file chokes (QuotaExceeded).
|
|
3717
|
-
mod.env.useBrowserCache = true;
|
|
3718
|
-
mod.env.backends.onnx.wasm.numThreads = 1;
|
|
3719
|
-
try { if (navigator.storage && navigator.storage.persist) await navigator.storage.persist(); } catch (e) {}
|
|
3720
|
-
return mod;
|
|
3721
|
-
})();
|
|
3722
|
-
return modP;
|
|
3723
|
-
}
|
|
3724
|
-
|
|
3725
|
-
function progressCb() {
|
|
3726
|
-
const frac = {};
|
|
3727
|
-
const report = () => {
|
|
3728
|
-
const v = Object.values(frac);
|
|
3729
|
-
self.postMessage({ type: 'progress', frac: v.length ? v.reduce((a, b) => a + b, 0) / v.length : 0 });
|
|
3730
|
-
};
|
|
3731
|
-
return (p) => {
|
|
3732
|
-
if (!p || !p.file) return;
|
|
3733
|
-
if (p.status === 'initiate') { frac[p.file] = frac[p.file] || 0; report(); }
|
|
3734
|
-
else if (p.status === 'done') { frac[p.file] = 1; report(); }
|
|
3735
|
-
else if (p.status === 'progress' && typeof p.progress === 'number') { frac[p.file] = p.progress / 100; report(); }
|
|
3736
|
-
};
|
|
3737
|
-
}
|
|
3738
|
-
|
|
3739
|
-
async function buildEnglish(modelId) {
|
|
3740
|
-
const mod = await getMod();
|
|
3741
|
-
mod.env.remoteHost = cfg.hfHost;
|
|
3742
|
-
mod.env.remotePathTemplate = cfg.hfPath;
|
|
3743
|
-
if ((cfg.whisperDevice || '').toLowerCase() !== 'wasm') {
|
|
3744
|
-
try {
|
|
3745
|
-
const gpuDtype = cfg.whisperDtype || 'q8';
|
|
3746
|
-
const pipe = await mod.pipeline('automatic-speech-recognition', modelId, { device: 'webgpu', dtype: gpuDtype, progress_callback: progressCb() });
|
|
3747
|
-
console.log('[whisper] ready (' + modelId + ' / WebGPU ' + gpuDtype + ', worker)');
|
|
3748
|
-
return pipe;
|
|
3749
|
-
} catch (e) { /* fall through to wasm */ }
|
|
3750
|
-
}
|
|
3751
|
-
const pipe = await mod.pipeline('automatic-speech-recognition', modelId, { dtype: 'q8', progress_callback: progressCb() });
|
|
3752
|
-
console.log('[whisper] ready (' + modelId + ' / wasm, worker)');
|
|
3753
|
-
return pipe;
|
|
3754
|
-
}
|
|
3755
|
-
|
|
3756
|
-
async function buildTurbo() {
|
|
3757
|
-
const mod = await getMod();
|
|
3758
|
-
mod.env.remoteHost = cfg.whisperHost;
|
|
3759
|
-
mod.env.remotePathTemplate = '{model}/';
|
|
3760
|
-
const pipe = await mod.pipeline('automatic-speech-recognition', 'whisper-turbo', {
|
|
3761
|
-
device: 'webgpu',
|
|
3762
|
-
dtype: { encoder_model: 'fp16', decoder_model_merged: 'q4' },
|
|
3763
|
-
progress_callback: progressCb(),
|
|
3764
|
-
});
|
|
3765
|
-
isMulti = true;
|
|
3766
|
-
console.log('[whisper] ready (turbo / worker)');
|
|
3767
|
-
return pipe;
|
|
3768
|
-
}
|
|
3769
|
-
|
|
3770
|
-
function loadWhisper() {
|
|
3771
|
-
if (pipeP) return pipeP;
|
|
3772
|
-
self.postMessage({ type: 'loadState', patch: { active: true, progress: 0, done: false } });
|
|
3773
|
-
pipeP = (async () => {
|
|
3774
|
-
const pref = (cfg.whisperPref || '').toLowerCase();
|
|
3775
|
-
if (pref && pref !== 'turbo' && cfg.smallModels[pref]) {
|
|
3776
|
-
console.log('[whisper] loading ' + pref + ' (forced via ozwellConfig.whisper)\u2026');
|
|
3777
|
-
return serialize(() => buildEnglish(cfg.smallModels[pref]));
|
|
3778
|
-
}
|
|
3779
|
-
console.log('[whisper] loading turbo\u2026');
|
|
3780
|
-
try { return await serialize(() => buildTurbo()); }
|
|
3781
|
-
catch (e) {
|
|
3782
|
-
console.log('[whisper] turbo unavailable (' + (e && e.message ? e.message : e) + ') \u2192 base.en fallback');
|
|
3783
|
-
return serialize(() => buildEnglish(cfg.gateModel));
|
|
3784
|
-
}
|
|
3785
|
-
})();
|
|
3786
|
-
pipeP.then(
|
|
3787
|
-
() => self.postMessage({ type: 'loadState', patch: { active: false, progress: 1, done: true } }),
|
|
3788
|
-
() => { pipeP = null; self.postMessage({ type: 'loadState', patch: { active: false } }); }
|
|
3789
|
-
);
|
|
3790
|
-
return pipeP;
|
|
3791
|
-
}
|
|
3792
|
-
|
|
3793
|
-
function loadGate() {
|
|
3794
|
-
if (gateP) return gateP;
|
|
3795
|
-
console.log('[whisper] loading stop-confirm gate (base.en)\u2026');
|
|
3796
|
-
gateP = serialize(() => buildEnglish(cfg.gateModel));
|
|
3797
|
-
gateP.catch(() => { gateP = null; });
|
|
3798
|
-
return gateP;
|
|
3799
|
-
}
|
|
3800
|
-
|
|
3801
|
-
self.onmessage = async (e) => {
|
|
3802
|
-
const m = e.data;
|
|
3803
|
-
if (!m) return;
|
|
3804
|
-
if (m.type === 'init') { cfg = m.cfg; return; }
|
|
3805
|
-
if (m.type === 'warm') { loadWhisper().catch(() => {}); return; }
|
|
3806
|
-
if (m.type === 'warmGate') { loadGate().catch(() => {}); return; }
|
|
3807
|
-
if (m.type === 'transcribe') {
|
|
3808
|
-
try {
|
|
3809
|
-
let pipe, opts;
|
|
3810
|
-
if (m.want === 'gate') { pipe = await loadGate(); opts = { chunk_length_s: 30 }; }
|
|
3811
|
-
else {
|
|
3812
|
-
pipe = await loadWhisper();
|
|
3813
|
-
if (m.want === 'segments' || m.want === 'words') opts = Object.assign({ chunk_length_s: 30, return_timestamps: m.want === 'words' ? 'word' : true }, isMulti ? { language: 'english', task: 'transcribe' } : {});
|
|
3814
|
-
else opts = isMulti ? { chunk_length_s: 30, language: 'english', task: 'transcribe' } : { chunk_length_s: 30 };
|
|
3815
|
-
}
|
|
3816
|
-
const out = await pipe(m.samples, opts);
|
|
3817
|
-
self.postMessage({ type: 'result', id: m.id, text: (out && out.text ? out.text : '').trim(), chunks: (out && out.chunks) || null });
|
|
3818
|
-
} catch (err) {
|
|
3819
|
-
self.postMessage({ type: 'error', id: m.id, message: err && err.message ? err.message : String(err) });
|
|
3820
|
-
}
|
|
3821
|
-
}
|
|
3822
|
-
};
|
|
3823
|
-
`;
|
|
3824
|
-
var worker = null;
|
|
3825
|
-
var reqId = 0;
|
|
3826
|
-
var pending = /* @__PURE__ */ new Map();
|
|
3827
|
-
function buildWorkerCfg() {
|
|
3828
|
-
return {
|
|
3829
|
-
transformersUrl: transformersUrl(),
|
|
3830
|
-
whisperHost: whisperHost(),
|
|
3831
|
-
whisperPref: whisperPref(),
|
|
3832
|
-
whisperDevice: whisperDevice(),
|
|
3833
|
-
whisperDtype: whisperDtype(),
|
|
3834
|
-
hfHost: HF_HOST,
|
|
3835
|
-
hfPath: HF_PATH,
|
|
3836
|
-
smallModels: SMALL_MODELS,
|
|
3837
|
-
gateModel: GATE_MODEL
|
|
3838
|
-
};
|
|
3839
|
-
}
|
|
3840
|
-
function getWorker() {
|
|
3841
|
-
if (worker) return worker;
|
|
3842
|
-
registerModelServiceWorker();
|
|
3843
|
-
const url = URL.createObjectURL(
|
|
3844
|
-
new Blob([WORKER_SRC], { type: "application/javascript" })
|
|
3845
|
-
);
|
|
3846
|
-
const w = new Worker(url, { type: "module" });
|
|
3847
|
-
w.onmessage = (e) => {
|
|
3848
|
-
const m = e.data;
|
|
3849
|
-
if (!m) return;
|
|
3850
|
-
if (m.type === "loadState") {
|
|
3851
|
-
setDictationLoad(m.patch);
|
|
3852
|
-
return;
|
|
3853
|
-
}
|
|
3854
|
-
if (m.type === "progress") {
|
|
3855
|
-
setDictationLoad({ progress: m.frac });
|
|
3856
|
-
return;
|
|
3857
|
-
}
|
|
3858
|
-
if (m.type === "result") {
|
|
3859
|
-
const p = pending.get(m.id);
|
|
3860
|
-
if (p) {
|
|
3861
|
-
pending.delete(m.id);
|
|
3862
|
-
p.resolve({ text: m.text, chunks: m.chunks });
|
|
3863
|
-
}
|
|
3864
|
-
return;
|
|
3865
|
-
}
|
|
3866
|
-
if (m.type === "error") {
|
|
3867
|
-
const p = pending.get(m.id);
|
|
3868
|
-
if (p) {
|
|
3869
|
-
pending.delete(m.id);
|
|
3870
|
-
p.reject(new Error(m.message));
|
|
3871
|
-
}
|
|
3872
|
-
return;
|
|
3873
|
-
}
|
|
3874
|
-
};
|
|
3875
|
-
w.onerror = (e) => {
|
|
3876
|
-
const err = new Error(
|
|
3877
|
-
`whisper worker error: ${e.message || "failed to load"}`
|
|
3878
|
-
);
|
|
3879
|
-
pending.forEach((p) => p.reject(err));
|
|
3880
|
-
pending.clear();
|
|
3881
|
-
setDictationLoad({ active: false });
|
|
3882
|
-
};
|
|
3883
|
-
w.postMessage({ type: "init", cfg: buildWorkerCfg() });
|
|
3884
|
-
worker = w;
|
|
3885
|
-
return worker;
|
|
3886
|
-
}
|
|
3887
|
-
function callWorker(want, samples) {
|
|
3888
|
-
const w = getWorker();
|
|
3889
|
-
const id = ++reqId;
|
|
3890
|
-
return new Promise((resolve, reject) => {
|
|
3891
|
-
pending.set(id, { resolve, reject });
|
|
3892
|
-
w.postMessage({ type: "transcribe", id, want, samples }, [samples.buffer]);
|
|
3893
|
-
});
|
|
3894
|
-
}
|
|
3895
|
-
function isWhisperLoaded() {
|
|
3896
|
-
return getDictationLoad().done;
|
|
3897
|
-
}
|
|
3898
|
-
function warmWhisper() {
|
|
3899
|
-
getWorker().postMessage({ type: "warm" });
|
|
3900
|
-
}
|
|
3901
|
-
function warmStopGate() {
|
|
3902
|
-
getWorker().postMessage({ type: "warmGate" });
|
|
3903
|
-
}
|
|
3904
|
-
function downmixToMono(audio) {
|
|
3905
|
-
if (audio.numberOfChannels <= 1) return audio.getChannelData(0);
|
|
3906
|
-
const n = audio.length;
|
|
3907
|
-
const out = new Float32Array(n);
|
|
3908
|
-
for (let ch = 0; ch < audio.numberOfChannels; ch++) {
|
|
3909
|
-
const data = audio.getChannelData(ch);
|
|
3910
|
-
for (let i = 0; i < n; i++) out[i] += data[i];
|
|
3911
|
-
}
|
|
3912
|
-
for (let i = 0; i < n; i++) out[i] /= audio.numberOfChannels;
|
|
3913
|
-
return out;
|
|
3914
|
-
}
|
|
3915
|
-
function resampleTo16kMono(src, sampleRate) {
|
|
3916
|
-
const ratio = 16e3 / sampleRate;
|
|
3917
|
-
const n = Math.round(src.length * ratio);
|
|
3918
|
-
const out = new Float32Array(n);
|
|
3919
|
-
for (let i = 0; i < n; i++) {
|
|
3920
|
-
const t = i / ratio;
|
|
3921
|
-
const i0 = Math.floor(t);
|
|
3922
|
-
const i1 = Math.min(i0 + 1, src.length - 1);
|
|
3923
|
-
out[i] = src[i0] + (src[i1] - src[i0]) * (t - i0);
|
|
3924
|
-
}
|
|
3925
|
-
return out;
|
|
3926
|
-
}
|
|
3927
|
-
async function decodeTo16kMono(blob) {
|
|
3928
|
-
const Ctx = window.AudioContext || window.webkitAudioContext;
|
|
3929
|
-
const ctx = new Ctx();
|
|
3930
|
-
try {
|
|
3931
|
-
const audio = await ctx.decodeAudioData(await blob.arrayBuffer());
|
|
3932
|
-
return resampleTo16kMono(downmixToMono(audio), audio.sampleRate);
|
|
3933
|
-
} finally {
|
|
3934
|
-
void ctx.close();
|
|
3935
|
-
}
|
|
3936
|
-
}
|
|
3937
|
-
function encodeWav16kMono(samples) {
|
|
3938
|
-
const sr = 16e3;
|
|
3939
|
-
const buf = new ArrayBuffer(44 + samples.length * 2);
|
|
3940
|
-
const view = new DataView(buf);
|
|
3941
|
-
const str = (o2, s) => {
|
|
3942
|
-
for (let i = 0; i < s.length; i++) view.setUint8(o2 + i, s.charCodeAt(i));
|
|
3943
|
-
};
|
|
3944
|
-
str(0, "RIFF");
|
|
3945
|
-
view.setUint32(4, 36 + samples.length * 2, true);
|
|
3946
|
-
str(8, "WAVE");
|
|
3947
|
-
str(12, "fmt ");
|
|
3948
|
-
view.setUint32(16, 16, true);
|
|
3949
|
-
view.setUint16(20, 1, true);
|
|
3950
|
-
view.setUint16(22, 1, true);
|
|
3951
|
-
view.setUint32(24, sr, true);
|
|
3952
|
-
view.setUint32(28, sr * 2, true);
|
|
3953
|
-
view.setUint16(32, 2, true);
|
|
3954
|
-
view.setUint16(34, 16, true);
|
|
3955
|
-
str(36, "data");
|
|
3956
|
-
view.setUint32(40, samples.length * 2, true);
|
|
3957
|
-
let o = 44;
|
|
3958
|
-
for (let i = 0; i < samples.length; i++) {
|
|
3959
|
-
const s = Math.max(-1, Math.min(1, samples[i]));
|
|
3960
|
-
view.setInt16(o, s < 0 ? s * 32768 : s * 32767, true);
|
|
3961
|
-
o += 2;
|
|
3962
|
-
}
|
|
3963
|
-
return new Blob([buf], { type: "audio/wav" });
|
|
3964
|
-
}
|
|
3965
|
-
async function trimTrailingStopPhrase(blob, phraseHintSec = 0) {
|
|
3966
|
-
let samples;
|
|
3967
|
-
try {
|
|
3968
|
-
samples = await decodeTo16kMono(blob);
|
|
3969
|
-
} catch {
|
|
3970
|
-
return blob;
|
|
3971
|
-
}
|
|
3972
|
-
const SR2 = 16e3;
|
|
3973
|
-
const n = samples.length;
|
|
3974
|
-
if (n < SR2 * 0.8) return blob;
|
|
3975
|
-
const fr = Math.round(SR2 * 0.03);
|
|
3976
|
-
const nf = Math.ceil(n / fr);
|
|
3977
|
-
const e = new Float32Array(nf);
|
|
3978
|
-
let peak = 0;
|
|
3979
|
-
for (let f = 0; f < nf; f++) {
|
|
3980
|
-
const a = f * fr, b = Math.min(n, a + fr);
|
|
3981
|
-
let s = 0;
|
|
3982
|
-
for (let i = a; i < b; i++) s += samples[i] * samples[i];
|
|
3983
|
-
e[f] = Math.sqrt(s / (b - a));
|
|
3984
|
-
if (e[f] > peak) peak = e[f];
|
|
3985
|
-
}
|
|
3986
|
-
const sil = Math.max(8e-3, peak * 0.15);
|
|
3987
|
-
const minGap = Math.max(1, Math.round(0.15 * SR2 / fr));
|
|
3988
|
-
const maxTrimFrames = Math.round(2.2 * SR2 / fr);
|
|
3989
|
-
const floor = Math.max(0, nf - maxTrimFrames);
|
|
3990
|
-
let cutFrame;
|
|
3991
|
-
if (phraseHintSec > 0.2) {
|
|
3992
|
-
const anchor = Math.max(0, nf - Math.round(phraseHintSec * SR2 / fr));
|
|
3993
|
-
const win = Math.round(0.35 * SR2 / fr);
|
|
3994
|
-
let best = -1, bestDist = Infinity;
|
|
3995
|
-
for (let f = Math.max(0, anchor - win); f <= Math.min(nf - 1, anchor + win); f++) {
|
|
3996
|
-
if (e[f] < sil) {
|
|
3997
|
-
const dist = Math.abs(f - anchor);
|
|
3998
|
-
if (dist < bestDist) {
|
|
3999
|
-
bestDist = dist;
|
|
4000
|
-
best = f;
|
|
4001
|
-
}
|
|
4002
|
-
}
|
|
4003
|
-
}
|
|
4004
|
-
cutFrame = best >= 0 ? best : anchor;
|
|
4005
|
-
} else {
|
|
4006
|
-
let k = nf - 1;
|
|
4007
|
-
while (k >= floor && e[k] < sil) k--;
|
|
4008
|
-
cutFrame = -1;
|
|
4009
|
-
while (k >= floor) {
|
|
4010
|
-
if (e[k] < sil) {
|
|
4011
|
-
let m = k;
|
|
4012
|
-
while (m >= floor && e[m] < sil) m--;
|
|
4013
|
-
if (k - m >= minGap) {
|
|
4014
|
-
cutFrame = k + 1;
|
|
4015
|
-
break;
|
|
4016
|
-
}
|
|
4017
|
-
k = m;
|
|
4018
|
-
} else k--;
|
|
4019
|
-
}
|
|
4020
|
-
if (cutFrame < 0) cutFrame = Math.max(0, nf - Math.round(1.1 * SR2 / fr));
|
|
4021
|
-
}
|
|
4022
|
-
cutFrame = Math.max(cutFrame, floor);
|
|
4023
|
-
const cutSample = Math.min(n, cutFrame * fr);
|
|
4024
|
-
if (cutSample < SR2 * 0.2) return blob;
|
|
4025
|
-
return encodeWav16kMono(samples.subarray(0, cutSample));
|
|
4026
|
-
}
|
|
4027
|
-
async function transcribeBlob(blob, trimEndSeconds = 0) {
|
|
4028
|
-
let samples = await decodeTo16kMono(blob);
|
|
4029
|
-
if (trimEndSeconds > 0) {
|
|
4030
|
-
const cut = Math.round(trimEndSeconds * 16e3);
|
|
4031
|
-
if (samples.length > cut + 16e3)
|
|
4032
|
-
samples = samples.slice(0, samples.length - cut);
|
|
4033
|
-
}
|
|
4034
|
-
const out = await callWorker("text", samples);
|
|
4035
|
-
return (out.text ?? "").trim();
|
|
4036
|
-
}
|
|
4037
|
-
async function transcribeSamples(samples, sampleRate) {
|
|
4038
|
-
const out = await callWorker("text", resampleTo16kMono(samples, sampleRate));
|
|
4039
|
-
return (out.text ?? "").trim();
|
|
4040
|
-
}
|
|
4041
|
-
function chunksToSegments(chunks) {
|
|
4042
|
-
return (chunks ?? []).map((c) => ({
|
|
4043
|
-
start: c.timestamp?.[0] ?? 0,
|
|
4044
|
-
end: c.timestamp?.[1] ?? c.timestamp?.[0] ?? 0,
|
|
4045
|
-
text: (c.text ?? "").trim()
|
|
4046
|
-
})).filter((s) => s.text);
|
|
4047
|
-
}
|
|
4048
|
-
async function transcribeSegments(blob) {
|
|
4049
|
-
const samples = await decodeTo16kMono(blob);
|
|
4050
|
-
const out = await callWorker("segments", samples);
|
|
4051
|
-
return chunksToSegments(out.chunks);
|
|
4052
|
-
}
|
|
4053
|
-
function serverAsrModel() {
|
|
4054
|
-
try {
|
|
4055
|
-
return JSON.parse(localStorage.getItem("ozwellConfig") || "{}").serverWhisper || "whisper-1";
|
|
4056
|
-
} catch {
|
|
4057
|
-
return "whisper-1";
|
|
4058
|
-
}
|
|
4059
|
-
}
|
|
4060
|
-
async function transcribeServer(blob) {
|
|
4061
|
-
const cfg = getOzwellConfig();
|
|
4062
|
-
const form = new FormData();
|
|
4063
|
-
form.append("file", blob, "audio.webm");
|
|
4064
|
-
form.append("model", serverAsrModel());
|
|
4065
|
-
const url = `${cfg.baseURL.replace(/\/$/, "")}/v1/audio/transcriptions`;
|
|
4066
|
-
const headers = {};
|
|
4067
|
-
if (cfg.apiKey && cfg.apiKey !== "ollama")
|
|
4068
|
-
headers.Authorization = `Bearer ${cfg.apiKey}`;
|
|
4069
|
-
const res = await fetch(url, { method: "POST", headers, body: form });
|
|
4070
|
-
if (!res.ok) {
|
|
4071
|
-
const body = await res.text().catch(() => "");
|
|
4072
|
-
throw new Error(
|
|
4073
|
-
`Server ASR ${res.status}: ${res.statusText || body.slice(0, 200) || "request failed"}`
|
|
4074
|
-
);
|
|
4075
|
-
}
|
|
4076
|
-
const data = await res.json();
|
|
4077
|
-
return (typeof data?.text === "string" ? data.text : "").trim();
|
|
4078
|
-
}
|
|
4079
|
-
async function transcribeGate(samples, sampleRate) {
|
|
4080
|
-
const out = await callWorker("gate", resampleTo16kMono(samples, sampleRate));
|
|
4081
|
-
return (out.text ?? "").trim();
|
|
4082
|
-
}
|
|
4083
|
-
function stripStopPhrase(text) {
|
|
4084
|
-
const tail = /(?:\b(?:oz\s{0,4}well|all(?:['’]?s|\s{1,4}was)?\s{0,4}well|as\s{0,4}well|also|oswald)\b[\s,]{0,6}i(?:['’]?m|\s{1,4}am)\s{1,4}done\b|\b(?:oz\s{0,4}well|all(?:['’]?s|\s{1,4}was)?\s{0,4}well|oswald)\b|\bi(?:['’]?m|\s{1,4}am)\s{1,4}done\b|\b(?:that\s{1,4}was\s{1,4}|was\s{1,4})?well\s{1,4}done\b|\bthat['’]?s?\s{1,4}(?:was\s{1,4})?all\b|\bthank(?:s|\s{1,4}you)(?:\s{1,4}for\s{1,4}watching)?\b|\bbye\b)[\s.,!?-]{0,24}$/i;
|
|
4085
|
-
let prev = null;
|
|
4086
|
-
let t = text;
|
|
4087
|
-
while (t !== prev && t) {
|
|
4088
|
-
prev = t;
|
|
4089
|
-
t = trimTrailingPunct(t.replace(tail, ""));
|
|
4090
|
-
}
|
|
4091
|
-
return t.trim();
|
|
4092
|
-
}
|
|
4093
|
-
function trimTrailingPunct(s) {
|
|
4094
|
-
let end = s.length;
|
|
4095
|
-
while (end > 0 && /[\s.,!?-]/.test(s[end - 1])) end--;
|
|
4096
|
-
return end === s.length ? s : s.slice(0, end);
|
|
4097
|
-
}
|
|
4098
|
-
function endsWithDone(text) {
|
|
4099
|
-
return /\b(?:i(?:['’]?m|\s{1,4}am)\s{1,4}|all\s{1,4}|well\s{1,4})?done\b[\s.,!?-]{0,24}$/i.test(
|
|
4100
|
-
text
|
|
4101
|
-
);
|
|
4102
|
-
}
|
|
4103
3412
|
function useSpeakerVerify(opts = {}) {
|
|
4104
3413
|
const { enabled = true, voiceprintNamespace } = opts;
|
|
4105
3414
|
const [ready, setReady] = React13.useState(false);
|
|
@@ -12929,7 +12238,7 @@ function CheckrIntegration({
|
|
|
12929
12238
|
viewReports = "View Reports",
|
|
12930
12239
|
noReports = "No background checks yet",
|
|
12931
12240
|
refresh = "Refresh",
|
|
12932
|
-
pending
|
|
12241
|
+
pending = "Pending",
|
|
12933
12242
|
running = "Running",
|
|
12934
12243
|
complete = "Complete",
|
|
12935
12244
|
failed = "Failed",
|
|
@@ -12961,7 +12270,7 @@ function CheckrIntegration({
|
|
|
12961
12270
|
setSelectedReports((prev) => prev.size > 0 ? /* @__PURE__ */ new Set() : prev);
|
|
12962
12271
|
}, [reports, connected]);
|
|
12963
12272
|
const statusLabels = {
|
|
12964
|
-
pending
|
|
12273
|
+
pending,
|
|
12965
12274
|
running,
|
|
12966
12275
|
complete,
|
|
12967
12276
|
failed,
|
|
@@ -39751,13 +39060,13 @@ var DEFAULT_SERVICE_PRICING_MANAGER_LABELS = {
|
|
|
39751
39060
|
function ServiceNote({ service, onNoteChange, labels }) {
|
|
39752
39061
|
const [editing, setEditing] = React13.useState(false);
|
|
39753
39062
|
const [draft, setDraft] = React13.useState("");
|
|
39754
|
-
const [
|
|
39063
|
+
const [pending, setPending] = React13.useState(null);
|
|
39755
39064
|
const [failed, setFailed] = React13.useState(false);
|
|
39756
39065
|
const inputRef = React13.useRef(null);
|
|
39757
39066
|
const buttonRef = React13.useRef(null);
|
|
39758
39067
|
const cancelRef = React13.useRef(false);
|
|
39759
39068
|
const refocusRef = React13.useRef(false);
|
|
39760
|
-
const note =
|
|
39069
|
+
const note = pending ?? service.note ?? "";
|
|
39761
39070
|
React13.useEffect(() => {
|
|
39762
39071
|
if (editing) inputRef.current?.focus();
|
|
39763
39072
|
else if (refocusRef.current) {
|
|
@@ -39811,12 +39120,12 @@ function ServiceNote({ service, onNoteChange, labels }) {
|
|
|
39811
39120
|
ref: buttonRef,
|
|
39812
39121
|
type: "button",
|
|
39813
39122
|
onClick: () => {
|
|
39814
|
-
if (
|
|
39123
|
+
if (pending !== null) return;
|
|
39815
39124
|
setDraft(note);
|
|
39816
39125
|
setEditing(true);
|
|
39817
39126
|
},
|
|
39818
|
-
"aria-disabled":
|
|
39819
|
-
"aria-busy":
|
|
39127
|
+
"aria-disabled": pending !== null,
|
|
39128
|
+
"aria-busy": pending !== null,
|
|
39820
39129
|
"aria-label": `${labels.noteLabel(service.serviceName)}: ${note || labels.addNote}`,
|
|
39821
39130
|
className: cn(
|
|
39822
39131
|
"w-full truncate rounded text-start text-sm",
|
|
@@ -44856,6 +44165,6 @@ function WebsiteInputGroup({
|
|
|
44856
44165
|
}
|
|
44857
44166
|
WebsiteInputGroup.displayName = "WebsiteInputGroup";
|
|
44858
44167
|
|
|
44859
|
-
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, BUSINESS_HOURS_END_OF_DAY, BookAppointmentButton, BookingDialog, BusinessHours, BusinessHoursEditor, 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_BUSINESS_HOURS_EDITOR_LABELS, DEFAULT_ERROR_CONFIGS, DEFAULT_LANGUAGES, DEFAULT_RADIUS_OPTIONS, DEFAULT_SERVICE_PRICING_MANAGER_LABELS, 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,
|
|
44168
|
+
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, BUSINESS_HOURS_END_OF_DAY, BookAppointmentButton, BookingDialog, BusinessHours, BusinessHoursEditor, 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_BUSINESS_HOURS_EDITOR_LABELS, DEFAULT_ERROR_CONFIGS, DEFAULT_LANGUAGES, DEFAULT_RADIUS_OPTIONS, DEFAULT_SERVICE_PRICING_MANAGER_LABELS, 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, attributeSegments, calculateDateRange, centroid, chime, clusterEmbeddings, concernGroupKey, concernHistoryContent, cosine, countBadgeVariants, countChipVariants, create24HourSchedule, createDefaultSchedule, createWeekdaySchedule, currentAssertion, defaultCaseManagementHeaderLabels, defaultOrderTabs, defaultReconciliationIsEqual, formatAddressLines, formatAddressSingleLine, formatCityState, formatCityStateZip, generateId, getDefaultPresets, getExtendedPresets, getGoogleMapsSearchUrl, getGoogleMapsUrl, getWakeWarm, inferSpeakerRoles, isConditionCodetype, isValidUrl, labelClusters, medicationToOrder, mergeTurns, normalizeClosingTime, normalizeConditionCodingSystem, openRollingRecorder, orderToMedication, orderTypeForCodetype, parseTimeInput, panelVariants as reconciliationPanelVariants, subscribeWakeWarm, useCamera, useCommandPalette, useConnectionStatus, useCookieConsent, useDiarization, useDocumentDetection, useDropzone, useFileUpload, useHeyOzwell, useOptionalToast, useSidebar, useSpeakerVerify, useToast, useVisitScribe, useVoiceSetup, useWakeWord, warmWakeModels, widgetVariants };
|
|
44860
44169
|
//# sourceMappingURL=index.js.map
|
|
44861
44170
|
//# sourceMappingURL=index.js.map
|