@absolutejs/voice 0.0.22-beta.151 → 0.0.22-beta.153
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/README.md +30 -0
- package/dist/angular/index.d.ts +2 -0
- package/dist/angular/index.js +604 -124
- package/dist/angular/voice-delivery-runtime.component.d.ts +17 -0
- package/dist/angular/voice-delivery-runtime.service.d.ts +16 -0
- package/dist/client/deliveryRuntime.d.ts +34 -0
- package/dist/client/deliveryRuntimeWidget.d.ts +37 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.js +371 -100
- package/dist/deliveryRuntime.d.ts +14 -2
- package/dist/index.js +44 -1
- package/dist/react/VoiceDeliveryRuntime.d.ts +7 -0
- package/dist/react/index.d.ts +2 -0
- package/dist/react/index.js +632 -256
- package/dist/react/useVoiceDeliveryRuntime.d.ts +13 -0
- package/dist/svelte/createVoiceDeliveryRuntime.d.ts +11 -0
- package/dist/svelte/index.d.ts +1 -0
- package/dist/svelte/index.js +394 -114
- package/dist/vue/VoiceDeliveryRuntime.d.ts +30 -0
- package/dist/vue/index.d.ts +2 -0
- package/dist/vue/index.js +649 -261
- package/dist/vue/useVoiceDeliveryRuntime.d.ts +13 -0
- package/package.json +1 -1
package/dist/vue/index.js
CHANGED
|
@@ -374,8 +374,394 @@ var VoiceOpsStatus = defineComponent({
|
|
|
374
374
|
};
|
|
375
375
|
}
|
|
376
376
|
});
|
|
377
|
+
// src/vue/VoiceDeliveryRuntime.ts
|
|
378
|
+
import { defineComponent as defineComponent2, h as h2 } from "vue";
|
|
379
|
+
|
|
380
|
+
// src/client/deliveryRuntime.ts
|
|
381
|
+
var getDefaultActionPath = (path, action, options) => {
|
|
382
|
+
if (action === "tick") {
|
|
383
|
+
return options.tickPath ?? `${path.replace(/\/$/, "")}/tick`;
|
|
384
|
+
}
|
|
385
|
+
return options.requeueDeadLettersPath ?? `${path.replace(/\/$/, "")}/requeue-dead-letters`;
|
|
386
|
+
};
|
|
387
|
+
var fetchVoiceDeliveryRuntime = async (path = "/api/voice-delivery-runtime", options = {}) => {
|
|
388
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
389
|
+
const response = await fetchImpl(path);
|
|
390
|
+
if (!response.ok) {
|
|
391
|
+
throw new Error(`Voice delivery runtime failed: HTTP ${response.status}`);
|
|
392
|
+
}
|
|
393
|
+
return await response.json();
|
|
394
|
+
};
|
|
395
|
+
var runVoiceDeliveryRuntimeAction = async (action, path = "/api/voice-delivery-runtime", options = {}) => {
|
|
396
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
397
|
+
const response = await fetchImpl(getDefaultActionPath(path, action, options), {
|
|
398
|
+
method: "POST"
|
|
399
|
+
});
|
|
400
|
+
if (!response.ok) {
|
|
401
|
+
throw new Error(`Voice delivery runtime ${action} failed: HTTP ${response.status}`);
|
|
402
|
+
}
|
|
403
|
+
const body = await response.json();
|
|
404
|
+
return {
|
|
405
|
+
action,
|
|
406
|
+
result: body.result,
|
|
407
|
+
summary: body.summary,
|
|
408
|
+
updatedAt: Date.now()
|
|
409
|
+
};
|
|
410
|
+
};
|
|
411
|
+
var createVoiceDeliveryRuntimeStore = (path = "/api/voice-delivery-runtime", options = {}) => {
|
|
412
|
+
const listeners = new Set;
|
|
413
|
+
let closed = false;
|
|
414
|
+
let timer;
|
|
415
|
+
let snapshot = {
|
|
416
|
+
actionError: null,
|
|
417
|
+
actionStatus: "idle",
|
|
418
|
+
error: null,
|
|
419
|
+
isLoading: false
|
|
420
|
+
};
|
|
421
|
+
const emit = () => {
|
|
422
|
+
for (const listener of listeners) {
|
|
423
|
+
listener();
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
const refresh = async () => {
|
|
427
|
+
if (closed) {
|
|
428
|
+
return snapshot.report;
|
|
429
|
+
}
|
|
430
|
+
snapshot = {
|
|
431
|
+
...snapshot,
|
|
432
|
+
error: null,
|
|
433
|
+
isLoading: true
|
|
434
|
+
};
|
|
435
|
+
emit();
|
|
436
|
+
try {
|
|
437
|
+
const report = await fetchVoiceDeliveryRuntime(path, options);
|
|
438
|
+
snapshot = {
|
|
439
|
+
...snapshot,
|
|
440
|
+
error: null,
|
|
441
|
+
isLoading: false,
|
|
442
|
+
report,
|
|
443
|
+
updatedAt: Date.now()
|
|
444
|
+
};
|
|
445
|
+
emit();
|
|
446
|
+
return report;
|
|
447
|
+
} catch (error) {
|
|
448
|
+
snapshot = {
|
|
449
|
+
...snapshot,
|
|
450
|
+
error: error instanceof Error ? error.message : String(error),
|
|
451
|
+
isLoading: false
|
|
452
|
+
};
|
|
453
|
+
emit();
|
|
454
|
+
throw error;
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
const runAction = async (action) => {
|
|
458
|
+
if (closed) {
|
|
459
|
+
return snapshot.lastAction;
|
|
460
|
+
}
|
|
461
|
+
snapshot = {
|
|
462
|
+
...snapshot,
|
|
463
|
+
actionError: null,
|
|
464
|
+
actionStatus: "running"
|
|
465
|
+
};
|
|
466
|
+
emit();
|
|
467
|
+
try {
|
|
468
|
+
const result = await runVoiceDeliveryRuntimeAction(action, path, options);
|
|
469
|
+
snapshot = {
|
|
470
|
+
...snapshot,
|
|
471
|
+
actionError: null,
|
|
472
|
+
actionStatus: "completed",
|
|
473
|
+
lastAction: result
|
|
474
|
+
};
|
|
475
|
+
emit();
|
|
476
|
+
await refresh();
|
|
477
|
+
return result;
|
|
478
|
+
} catch (error) {
|
|
479
|
+
snapshot = {
|
|
480
|
+
...snapshot,
|
|
481
|
+
actionError: error instanceof Error ? error.message : String(error),
|
|
482
|
+
actionStatus: "failed"
|
|
483
|
+
};
|
|
484
|
+
emit();
|
|
485
|
+
throw error;
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
const close = () => {
|
|
489
|
+
closed = true;
|
|
490
|
+
if (timer) {
|
|
491
|
+
clearInterval(timer);
|
|
492
|
+
timer = undefined;
|
|
493
|
+
}
|
|
494
|
+
listeners.clear();
|
|
495
|
+
};
|
|
496
|
+
if (typeof window !== "undefined" && options.intervalMs && options.intervalMs > 0) {
|
|
497
|
+
timer = setInterval(() => {
|
|
498
|
+
refresh().catch(() => {});
|
|
499
|
+
}, options.intervalMs);
|
|
500
|
+
}
|
|
501
|
+
return {
|
|
502
|
+
close,
|
|
503
|
+
getServerSnapshot: () => snapshot,
|
|
504
|
+
getSnapshot: () => snapshot,
|
|
505
|
+
requeueDeadLetters: () => runAction("requeue-dead-letters"),
|
|
506
|
+
refresh,
|
|
507
|
+
tick: () => runAction("tick"),
|
|
508
|
+
subscribe: (listener) => {
|
|
509
|
+
listeners.add(listener);
|
|
510
|
+
return () => {
|
|
511
|
+
listeners.delete(listener);
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
};
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
// src/client/deliveryRuntimeWidget.ts
|
|
518
|
+
var DEFAULT_TITLE2 = "Voice Delivery Runtime";
|
|
519
|
+
var DEFAULT_DESCRIPTION2 = "Audit and trace delivery worker health from your AbsoluteJS voice app.";
|
|
520
|
+
var escapeHtml2 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
521
|
+
var createSurface = (id, summary) => {
|
|
522
|
+
if (!summary) {
|
|
523
|
+
return {
|
|
524
|
+
deadLettered: 0,
|
|
525
|
+
detail: "Worker disabled",
|
|
526
|
+
failed: 0,
|
|
527
|
+
id,
|
|
528
|
+
label: id === "audit" ? "Audit delivery" : "Trace delivery",
|
|
529
|
+
pending: 0,
|
|
530
|
+
status: "disabled",
|
|
531
|
+
total: 0
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
const blocked = summary.failed + summary.deadLettered;
|
|
535
|
+
return {
|
|
536
|
+
deadLettered: summary.deadLettered,
|
|
537
|
+
detail: `${summary.delivered}/${summary.total} delivered, ${summary.pending} pending`,
|
|
538
|
+
failed: summary.failed,
|
|
539
|
+
id,
|
|
540
|
+
label: id === "audit" ? "Audit delivery" : "Trace delivery",
|
|
541
|
+
pending: summary.pending,
|
|
542
|
+
status: blocked > 0 ? "warn" : "pass",
|
|
543
|
+
total: summary.total
|
|
544
|
+
};
|
|
545
|
+
};
|
|
546
|
+
var createVoiceDeliveryRuntimeViewModel = (snapshot, options = {}) => {
|
|
547
|
+
const report = snapshot.report;
|
|
548
|
+
const surfaces = [
|
|
549
|
+
createSurface("audit", report?.summary.audit),
|
|
550
|
+
createSurface("trace", report?.summary.trace)
|
|
551
|
+
];
|
|
552
|
+
const hasWarnings = surfaces.some((surface) => surface.status === "warn");
|
|
553
|
+
return {
|
|
554
|
+
description: options.description ?? DEFAULT_DESCRIPTION2,
|
|
555
|
+
error: snapshot.error,
|
|
556
|
+
actionError: snapshot.actionError,
|
|
557
|
+
actionStatus: snapshot.actionStatus,
|
|
558
|
+
isLoading: snapshot.isLoading,
|
|
559
|
+
isRunning: Boolean(report?.isRunning),
|
|
560
|
+
label: snapshot.error ? "Unavailable" : report ? report.isRunning ? "Running" : "Stopped" : "Checking",
|
|
561
|
+
status: snapshot.error ? "error" : report ? hasWarnings ? "warn" : "pass" : "loading",
|
|
562
|
+
surfaces,
|
|
563
|
+
title: options.title ?? DEFAULT_TITLE2,
|
|
564
|
+
updatedAt: snapshot.updatedAt
|
|
565
|
+
};
|
|
566
|
+
};
|
|
567
|
+
var renderVoiceDeliveryRuntimeHTML = (snapshot, options = {}) => {
|
|
568
|
+
const model = createVoiceDeliveryRuntimeViewModel(snapshot, options);
|
|
569
|
+
const surfaces = model.surfaces.map((surface) => `<li class="absolute-voice-delivery-runtime__surface absolute-voice-delivery-runtime__surface--${escapeHtml2(surface.status)}">
|
|
570
|
+
<span>${escapeHtml2(surface.label)}</span>
|
|
571
|
+
<strong>${escapeHtml2(surface.detail)}</strong>
|
|
572
|
+
<small>${String(surface.failed)} failed · ${String(surface.deadLettered)} dead-lettered</small>
|
|
573
|
+
</li>`).join("");
|
|
574
|
+
const actions = options.includeActions === false ? "" : `<div class="absolute-voice-delivery-runtime__actions">
|
|
575
|
+
<button type="button" data-absolute-voice-delivery-runtime-action="tick">${model.actionStatus === "running" ? "Working..." : "Tick workers"}</button>
|
|
576
|
+
<button type="button" data-absolute-voice-delivery-runtime-action="requeue-dead-letters"${model.surfaces.some((surface) => surface.deadLettered > 0) ? "" : " disabled"}>Requeue dead letters</button>
|
|
577
|
+
</div>`;
|
|
578
|
+
const actionError = model.actionError ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml2(model.actionError)}</p>` : "";
|
|
579
|
+
return `<section class="absolute-voice-delivery-runtime absolute-voice-delivery-runtime--${escapeHtml2(model.status)}">
|
|
580
|
+
<header class="absolute-voice-delivery-runtime__header">
|
|
581
|
+
<span class="absolute-voice-delivery-runtime__eyebrow">${escapeHtml2(model.title)}</span>
|
|
582
|
+
<strong class="absolute-voice-delivery-runtime__label">${escapeHtml2(model.label)}</strong>
|
|
583
|
+
</header>
|
|
584
|
+
<p class="absolute-voice-delivery-runtime__description">${escapeHtml2(model.description)}</p>
|
|
585
|
+
<ul class="absolute-voice-delivery-runtime__surfaces">${surfaces}</ul>
|
|
586
|
+
${actions}
|
|
587
|
+
${actionError}
|
|
588
|
+
${model.error ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml2(model.error)}</p>` : ""}
|
|
589
|
+
</section>`;
|
|
590
|
+
};
|
|
591
|
+
var getVoiceDeliveryRuntimeCSS = () => `.absolute-voice-delivery-runtime{border:1px solid #c9d8cf;border-radius:20px;background:#f6fff9;color:#0d1b12;padding:18px;box-shadow:0 18px 40px rgba(19,55,35,.12);font-family:inherit}.absolute-voice-delivery-runtime--warn,.absolute-voice-delivery-runtime--error{border-color:#f2b56b;background:#fff9ed}.absolute-voice-delivery-runtime__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-delivery-runtime__eyebrow{color:#4e6b59;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-delivery-runtime__label{font-size:28px;line-height:1}.absolute-voice-delivery-runtime__description{color:#33483b;margin:12px 0 0}.absolute-voice-delivery-runtime__surfaces{display:grid;gap:8px;list-style:none;margin:16px 0 0;padding:0}.absolute-voice-delivery-runtime__surface{background:#fff;border:1px solid #d9eadf;border-radius:14px;display:grid;gap:4px;padding:10px 12px}.absolute-voice-delivery-runtime__surface--warn{border-color:#f2b56b}.absolute-voice-delivery-runtime__surface--disabled{opacity:.72}.absolute-voice-delivery-runtime__surface span,.absolute-voice-delivery-runtime__surface small{color:#587063}.absolute-voice-delivery-runtime__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}.absolute-voice-delivery-runtime__actions button{background:#134e2d;border:0;border-radius:999px;color:#f6fff9;cursor:pointer;font:inherit;font-weight:800;padding:8px 12px}.absolute-voice-delivery-runtime__actions button:disabled{cursor:not-allowed;opacity:.48}.absolute-voice-delivery-runtime__error{color:#9f1239;font-weight:700}`;
|
|
592
|
+
var mountVoiceDeliveryRuntime = (element, path = "/api/voice-delivery-runtime", options = {}) => {
|
|
593
|
+
const store = createVoiceDeliveryRuntimeStore(path, options);
|
|
594
|
+
const render = () => {
|
|
595
|
+
element.innerHTML = renderVoiceDeliveryRuntimeHTML(store.getSnapshot(), options);
|
|
596
|
+
};
|
|
597
|
+
const unsubscribe = store.subscribe(render);
|
|
598
|
+
const handleClick = (event) => {
|
|
599
|
+
const target = event.target;
|
|
600
|
+
if (!(target instanceof Element)) {
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
const action = target.closest("[data-absolute-voice-delivery-runtime-action]");
|
|
604
|
+
const actionName = action?.getAttribute("data-absolute-voice-delivery-runtime-action");
|
|
605
|
+
if (actionName === "tick") {
|
|
606
|
+
store.tick().catch(() => {});
|
|
607
|
+
}
|
|
608
|
+
if (actionName === "requeue-dead-letters") {
|
|
609
|
+
store.requeueDeadLetters().catch(() => {});
|
|
610
|
+
}
|
|
611
|
+
};
|
|
612
|
+
element.addEventListener?.("click", handleClick);
|
|
613
|
+
render();
|
|
614
|
+
store.refresh().catch(() => {});
|
|
615
|
+
return {
|
|
616
|
+
close: () => {
|
|
617
|
+
element.removeEventListener?.("click", handleClick);
|
|
618
|
+
unsubscribe();
|
|
619
|
+
store.close();
|
|
620
|
+
},
|
|
621
|
+
refresh: store.refresh
|
|
622
|
+
};
|
|
623
|
+
};
|
|
624
|
+
var defineVoiceDeliveryRuntimeElement = (tagName = "absolute-voice-delivery-runtime") => {
|
|
625
|
+
if (typeof window === "undefined" || typeof customElements === "undefined" || customElements.get(tagName)) {
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
customElements.define(tagName, class AbsoluteVoiceDeliveryRuntimeElement extends HTMLElement {
|
|
629
|
+
mounted;
|
|
630
|
+
connectedCallback() {
|
|
631
|
+
const intervalMs = Number(this.getAttribute("interval-ms") ?? 5000);
|
|
632
|
+
this.mounted = mountVoiceDeliveryRuntime(this, this.getAttribute("path") ?? "/api/voice-delivery-runtime", {
|
|
633
|
+
description: this.getAttribute("description") ?? undefined,
|
|
634
|
+
intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000,
|
|
635
|
+
title: this.getAttribute("title") ?? undefined
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
disconnectedCallback() {
|
|
639
|
+
this.mounted?.close();
|
|
640
|
+
this.mounted = undefined;
|
|
641
|
+
}
|
|
642
|
+
});
|
|
643
|
+
};
|
|
644
|
+
|
|
645
|
+
// src/vue/useVoiceDeliveryRuntime.ts
|
|
646
|
+
import { onUnmounted as onUnmounted2, ref as ref2, shallowRef as shallowRef2 } from "vue";
|
|
647
|
+
function useVoiceDeliveryRuntime(path = "/api/voice-delivery-runtime", options = {}) {
|
|
648
|
+
const store = createVoiceDeliveryRuntimeStore(path, options);
|
|
649
|
+
const actionError = ref2(null);
|
|
650
|
+
const actionStatus = ref2("idle");
|
|
651
|
+
const error = ref2(null);
|
|
652
|
+
const isLoading = ref2(false);
|
|
653
|
+
const report = shallowRef2(undefined);
|
|
654
|
+
const updatedAt = ref2(undefined);
|
|
655
|
+
const sync = () => {
|
|
656
|
+
const snapshot = store.getSnapshot();
|
|
657
|
+
actionError.value = snapshot.actionError;
|
|
658
|
+
actionStatus.value = snapshot.actionStatus;
|
|
659
|
+
error.value = snapshot.error;
|
|
660
|
+
isLoading.value = snapshot.isLoading;
|
|
661
|
+
report.value = snapshot.report;
|
|
662
|
+
updatedAt.value = snapshot.updatedAt;
|
|
663
|
+
};
|
|
664
|
+
const unsubscribe = store.subscribe(sync);
|
|
665
|
+
sync();
|
|
666
|
+
if (typeof window !== "undefined") {
|
|
667
|
+
store.refresh().catch(() => {});
|
|
668
|
+
}
|
|
669
|
+
onUnmounted2(() => {
|
|
670
|
+
unsubscribe();
|
|
671
|
+
store.close();
|
|
672
|
+
});
|
|
673
|
+
return {
|
|
674
|
+
actionError,
|
|
675
|
+
actionStatus,
|
|
676
|
+
error,
|
|
677
|
+
isLoading,
|
|
678
|
+
requeueDeadLetters: store.requeueDeadLetters,
|
|
679
|
+
refresh: store.refresh,
|
|
680
|
+
report,
|
|
681
|
+
tick: store.tick,
|
|
682
|
+
updatedAt
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
// src/vue/VoiceDeliveryRuntime.ts
|
|
687
|
+
var VoiceDeliveryRuntime = defineComponent2({
|
|
688
|
+
name: "VoiceDeliveryRuntime",
|
|
689
|
+
props: {
|
|
690
|
+
description: String,
|
|
691
|
+
includeActions: {
|
|
692
|
+
default: true,
|
|
693
|
+
type: Boolean
|
|
694
|
+
},
|
|
695
|
+
intervalMs: Number,
|
|
696
|
+
path: {
|
|
697
|
+
default: "/api/voice-delivery-runtime",
|
|
698
|
+
type: String
|
|
699
|
+
},
|
|
700
|
+
title: String
|
|
701
|
+
},
|
|
702
|
+
setup(props) {
|
|
703
|
+
const options = {
|
|
704
|
+
description: props.description,
|
|
705
|
+
intervalMs: props.intervalMs,
|
|
706
|
+
title: props.title
|
|
707
|
+
};
|
|
708
|
+
const runtime = useVoiceDeliveryRuntime(props.path, options);
|
|
709
|
+
return () => {
|
|
710
|
+
const model = createVoiceDeliveryRuntimeViewModel({
|
|
711
|
+
error: runtime.error.value,
|
|
712
|
+
actionError: runtime.actionError.value,
|
|
713
|
+
actionStatus: runtime.actionStatus.value,
|
|
714
|
+
isLoading: runtime.isLoading.value,
|
|
715
|
+
report: runtime.report.value,
|
|
716
|
+
updatedAt: runtime.updatedAt.value
|
|
717
|
+
}, options);
|
|
718
|
+
const hasDeadLetters = model.surfaces.some((surface) => surface.deadLettered > 0);
|
|
719
|
+
return h2("section", {
|
|
720
|
+
class: [
|
|
721
|
+
"absolute-voice-delivery-runtime",
|
|
722
|
+
`absolute-voice-delivery-runtime--${model.status}`
|
|
723
|
+
]
|
|
724
|
+
}, [
|
|
725
|
+
h2("header", { class: "absolute-voice-delivery-runtime__header" }, [
|
|
726
|
+
h2("span", { class: "absolute-voice-delivery-runtime__eyebrow" }, model.title),
|
|
727
|
+
h2("strong", { class: "absolute-voice-delivery-runtime__label" }, model.label)
|
|
728
|
+
]),
|
|
729
|
+
h2("p", { class: "absolute-voice-delivery-runtime__description" }, model.description),
|
|
730
|
+
h2("ul", { class: "absolute-voice-delivery-runtime__surfaces" }, model.surfaces.map((surface) => h2("li", {
|
|
731
|
+
class: [
|
|
732
|
+
"absolute-voice-delivery-runtime__surface",
|
|
733
|
+
`absolute-voice-delivery-runtime__surface--${surface.status}`
|
|
734
|
+
],
|
|
735
|
+
key: surface.id
|
|
736
|
+
}, [
|
|
737
|
+
h2("span", surface.label),
|
|
738
|
+
h2("strong", surface.detail),
|
|
739
|
+
h2("small", `${surface.failed} failed / ${surface.deadLettered} dead-lettered`)
|
|
740
|
+
]))),
|
|
741
|
+
props.includeActions ? h2("div", { class: "absolute-voice-delivery-runtime__actions" }, [
|
|
742
|
+
h2("button", {
|
|
743
|
+
disabled: model.actionStatus === "running",
|
|
744
|
+
onClick: () => {
|
|
745
|
+
runtime.tick().catch(() => {});
|
|
746
|
+
},
|
|
747
|
+
type: "button"
|
|
748
|
+
}, model.actionStatus === "running" ? "Working..." : "Tick workers"),
|
|
749
|
+
h2("button", {
|
|
750
|
+
disabled: model.actionStatus === "running" || !hasDeadLetters,
|
|
751
|
+
onClick: () => {
|
|
752
|
+
runtime.requeueDeadLetters().catch(() => {});
|
|
753
|
+
},
|
|
754
|
+
type: "button"
|
|
755
|
+
}, "Requeue dead letters")
|
|
756
|
+
]) : null,
|
|
757
|
+
model.actionError ? h2("p", { class: "absolute-voice-delivery-runtime__error" }, model.actionError) : null,
|
|
758
|
+
model.error ? h2("p", { class: "absolute-voice-delivery-runtime__error" }, model.error) : null
|
|
759
|
+
]);
|
|
760
|
+
};
|
|
761
|
+
}
|
|
762
|
+
});
|
|
377
763
|
// src/vue/VoiceProviderSimulationControls.ts
|
|
378
|
-
import { computed, defineComponent as
|
|
764
|
+
import { computed, defineComponent as defineComponent3, h as h3 } from "vue";
|
|
379
765
|
|
|
380
766
|
// src/client/providerSimulationControls.ts
|
|
381
767
|
var postSimulation = async (pathPrefix, mode, provider, fetchImpl) => {
|
|
@@ -457,7 +843,7 @@ var createVoiceProviderSimulationControlsStore = (options) => {
|
|
|
457
843
|
};
|
|
458
844
|
|
|
459
845
|
// src/client/providerSimulationControlsWidget.ts
|
|
460
|
-
var
|
|
846
|
+
var escapeHtml3 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
461
847
|
var formatKind = (kind) => (kind ?? "stt").toUpperCase();
|
|
462
848
|
var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
|
|
463
849
|
const configuredProviders = options.providers.filter((provider) => provider.configured !== false);
|
|
@@ -477,18 +863,18 @@ var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
|
|
|
477
863
|
};
|
|
478
864
|
var renderVoiceProviderSimulationControlsHTML = (snapshot, options) => {
|
|
479
865
|
const model = createVoiceProviderSimulationControlsViewModel(snapshot, options);
|
|
480
|
-
const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${
|
|
481
|
-
const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${
|
|
866
|
+
const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${escapeHtml3(provider.provider)}"${!model.canSimulateFailure || snapshot.isRunning ? " disabled" : ""}>Simulate ${escapeHtml3(provider.provider)} ${escapeHtml3(formatKind(options.kind))} failure</button>`).join("");
|
|
867
|
+
const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${escapeHtml3(provider.provider)}"${snapshot.isRunning ? " disabled" : ""}>Mark ${escapeHtml3(provider.provider)} recovered</button>`).join("");
|
|
482
868
|
return `<section class="absolute-voice-provider-simulation absolute-voice-provider-simulation--${snapshot.error ? "error" : snapshot.isRunning ? "running" : "ready"}">
|
|
483
869
|
<header class="absolute-voice-provider-simulation__header">
|
|
484
|
-
<span class="absolute-voice-provider-simulation__eyebrow">${
|
|
485
|
-
<strong class="absolute-voice-provider-simulation__label">${
|
|
870
|
+
<span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml3(model.title)}</span>
|
|
871
|
+
<strong class="absolute-voice-provider-simulation__label">${escapeHtml3(model.label)}</strong>
|
|
486
872
|
</header>
|
|
487
|
-
<p class="absolute-voice-provider-simulation__description">${
|
|
488
|
-
${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${
|
|
873
|
+
<p class="absolute-voice-provider-simulation__description">${escapeHtml3(model.description)}</p>
|
|
874
|
+
${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml3(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
|
|
489
875
|
<div class="absolute-voice-provider-simulation__actions">${failureButtons}${recoveryButtons}</div>
|
|
490
|
-
${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${
|
|
491
|
-
${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${
|
|
876
|
+
${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml3(snapshot.error)}</p>` : ""}
|
|
877
|
+
${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml3(model.resultText)}</pre>` : ""}
|
|
492
878
|
</section>`;
|
|
493
879
|
};
|
|
494
880
|
var bindVoiceProviderSimulationControls = (element, store) => {
|
|
@@ -554,15 +940,15 @@ var defineVoiceProviderSimulationControlsElement = (tagName = "absolute-voice-pr
|
|
|
554
940
|
};
|
|
555
941
|
|
|
556
942
|
// src/vue/useVoiceProviderSimulationControls.ts
|
|
557
|
-
import { onUnmounted as
|
|
943
|
+
import { onUnmounted as onUnmounted3, ref as ref3 } from "vue";
|
|
558
944
|
function useVoiceProviderSimulationControls(options) {
|
|
559
945
|
const store = createVoiceProviderSimulationControlsStore(options);
|
|
560
|
-
const error =
|
|
561
|
-
const isRunning =
|
|
562
|
-
const lastResult =
|
|
563
|
-
const mode =
|
|
564
|
-
const provider =
|
|
565
|
-
const updatedAt =
|
|
946
|
+
const error = ref3(null);
|
|
947
|
+
const isRunning = ref3(false);
|
|
948
|
+
const lastResult = ref3(null);
|
|
949
|
+
const mode = ref3(null);
|
|
950
|
+
const provider = ref3(null);
|
|
951
|
+
const updatedAt = ref3(undefined);
|
|
566
952
|
const sync = () => {
|
|
567
953
|
const snapshot = store.getSnapshot();
|
|
568
954
|
error.value = snapshot.error;
|
|
@@ -574,7 +960,7 @@ function useVoiceProviderSimulationControls(options) {
|
|
|
574
960
|
};
|
|
575
961
|
const unsubscribe = store.subscribe(sync);
|
|
576
962
|
sync();
|
|
577
|
-
|
|
963
|
+
onUnmounted3(() => {
|
|
578
964
|
unsubscribe();
|
|
579
965
|
store.close();
|
|
580
966
|
});
|
|
@@ -590,7 +976,7 @@ function useVoiceProviderSimulationControls(options) {
|
|
|
590
976
|
}
|
|
591
977
|
|
|
592
978
|
// src/vue/VoiceProviderSimulationControls.ts
|
|
593
|
-
var VoiceProviderSimulationControls =
|
|
979
|
+
var VoiceProviderSimulationControls = defineComponent3({
|
|
594
980
|
name: "VoiceProviderSimulationControls",
|
|
595
981
|
props: {
|
|
596
982
|
class: { default: "", type: String },
|
|
@@ -632,40 +1018,40 @@ var VoiceProviderSimulationControls = defineComponent2({
|
|
|
632
1018
|
const run = (provider, mode) => {
|
|
633
1019
|
controls.run(provider, mode).catch(() => {});
|
|
634
1020
|
};
|
|
635
|
-
return () =>
|
|
1021
|
+
return () => h3("section", {
|
|
636
1022
|
class: [
|
|
637
1023
|
"absolute-voice-provider-simulation",
|
|
638
1024
|
`absolute-voice-provider-simulation--${controls.error.value ? "error" : controls.isRunning.value ? "running" : "ready"}`,
|
|
639
1025
|
props.class
|
|
640
1026
|
]
|
|
641
1027
|
}, [
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
1028
|
+
h3("header", { class: "absolute-voice-provider-simulation__header" }, [
|
|
1029
|
+
h3("span", { class: "absolute-voice-provider-simulation__eyebrow" }, model.value.title),
|
|
1030
|
+
h3("strong", { class: "absolute-voice-provider-simulation__label" }, model.value.label)
|
|
645
1031
|
]),
|
|
646
|
-
|
|
647
|
-
model.value.canSimulateFailure ? null :
|
|
648
|
-
|
|
649
|
-
...model.value.failureProviders.map((provider) =>
|
|
1032
|
+
h3("p", { class: "absolute-voice-provider-simulation__description" }, model.value.description),
|
|
1033
|
+
model.value.canSimulateFailure ? null : h3("p", { class: "absolute-voice-provider-simulation__empty" }, props.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure."),
|
|
1034
|
+
h3("div", { class: "absolute-voice-provider-simulation__actions" }, [
|
|
1035
|
+
...model.value.failureProviders.map((provider) => h3("button", {
|
|
650
1036
|
disabled: !model.value.canSimulateFailure || controls.isRunning.value,
|
|
651
1037
|
key: `fail-${provider.provider}`,
|
|
652
1038
|
onClick: () => run(provider.provider, "failure"),
|
|
653
1039
|
type: "button"
|
|
654
1040
|
}, `Simulate ${provider.provider} ${props.kind.toUpperCase()} failure`)),
|
|
655
|
-
...model.value.providers.map((provider) =>
|
|
1041
|
+
...model.value.providers.map((provider) => h3("button", {
|
|
656
1042
|
disabled: controls.isRunning.value,
|
|
657
1043
|
key: `recover-${provider.provider}`,
|
|
658
1044
|
onClick: () => run(provider.provider, "recovery"),
|
|
659
1045
|
type: "button"
|
|
660
1046
|
}, `Mark ${provider.provider} recovered`))
|
|
661
1047
|
]),
|
|
662
|
-
controls.error.value ?
|
|
663
|
-
model.value.resultText ?
|
|
1048
|
+
controls.error.value ? h3("p", { class: "absolute-voice-provider-simulation__error" }, controls.error.value) : null,
|
|
1049
|
+
model.value.resultText ? h3("pre", { class: "absolute-voice-provider-simulation__result" }, model.value.resultText) : null
|
|
664
1050
|
]);
|
|
665
1051
|
}
|
|
666
1052
|
});
|
|
667
1053
|
// src/vue/VoiceProviderCapabilities.ts
|
|
668
|
-
import { computed as computed2, defineComponent as
|
|
1054
|
+
import { computed as computed2, defineComponent as defineComponent4, h as h4 } from "vue";
|
|
669
1055
|
|
|
670
1056
|
// src/client/providerCapabilities.ts
|
|
671
1057
|
var fetchVoiceProviderCapabilities = async (path = "/api/provider-capabilities", options = {}) => {
|
|
@@ -747,9 +1133,9 @@ var createVoiceProviderCapabilitiesStore = (path = "/api/provider-capabilities",
|
|
|
747
1133
|
};
|
|
748
1134
|
|
|
749
1135
|
// src/client/providerCapabilitiesWidget.ts
|
|
750
|
-
var
|
|
751
|
-
var
|
|
752
|
-
var
|
|
1136
|
+
var DEFAULT_TITLE3 = "Provider Capabilities";
|
|
1137
|
+
var DEFAULT_DESCRIPTION3 = "Configured, selected, and healthy voice providers for this deployment.";
|
|
1138
|
+
var escapeHtml4 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
753
1139
|
var formatProvider = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
|
|
754
1140
|
var formatKind2 = (kind) => kind.toUpperCase();
|
|
755
1141
|
var formatStatus = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
|
|
@@ -793,36 +1179,36 @@ var createVoiceProviderCapabilitiesViewModel = (snapshot, options = {}) => {
|
|
|
793
1179
|
const selectedCount = snapshot.report?.selected ?? capabilities.filter((capability) => capability.selected).length;
|
|
794
1180
|
return {
|
|
795
1181
|
capabilities,
|
|
796
|
-
description: options.description ??
|
|
1182
|
+
description: options.description ?? DEFAULT_DESCRIPTION3,
|
|
797
1183
|
error: snapshot.error,
|
|
798
1184
|
isLoading: snapshot.isLoading,
|
|
799
1185
|
label: snapshot.error ? "Unavailable" : capabilities.length ? warningCount > 0 ? `${warningCount} needs attention` : `${selectedCount} selected` : snapshot.isLoading ? "Checking" : "No capabilities",
|
|
800
1186
|
status: snapshot.error ? "error" : capabilities.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
801
|
-
title: options.title ??
|
|
1187
|
+
title: options.title ?? DEFAULT_TITLE3,
|
|
802
1188
|
updatedAt: snapshot.updatedAt
|
|
803
1189
|
};
|
|
804
1190
|
};
|
|
805
1191
|
var renderVoiceProviderCapabilitiesHTML = (snapshot, options = {}) => {
|
|
806
1192
|
const model = createVoiceProviderCapabilitiesViewModel(snapshot, options);
|
|
807
|
-
const capabilities = model.capabilities.length ? `<div class="absolute-voice-provider-capabilities__providers">${model.capabilities.map((capability) => `<article class="absolute-voice-provider-capabilities__provider absolute-voice-provider-capabilities__provider--${
|
|
1193
|
+
const capabilities = model.capabilities.length ? `<div class="absolute-voice-provider-capabilities__providers">${model.capabilities.map((capability) => `<article class="absolute-voice-provider-capabilities__provider absolute-voice-provider-capabilities__provider--${escapeHtml4(capability.status)}">
|
|
808
1194
|
<header>
|
|
809
|
-
<strong>${
|
|
810
|
-
<span>${
|
|
1195
|
+
<strong>${escapeHtml4(capability.label)}</strong>
|
|
1196
|
+
<span>${escapeHtml4(formatStatus(capability.status))}</span>
|
|
811
1197
|
</header>
|
|
812
|
-
<p>${
|
|
1198
|
+
<p>${escapeHtml4(capability.detail)}</p>
|
|
813
1199
|
<dl>${capability.rows.map((row) => `<div>
|
|
814
|
-
<dt>${
|
|
815
|
-
<dd>${
|
|
1200
|
+
<dt>${escapeHtml4(row.label)}</dt>
|
|
1201
|
+
<dd>${escapeHtml4(row.value)}</dd>
|
|
816
1202
|
</div>`).join("")}</dl>
|
|
817
1203
|
</article>`).join("")}</div>` : '<p class="absolute-voice-provider-capabilities__empty">Configure provider capabilities to see deployment coverage.</p>';
|
|
818
|
-
return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${
|
|
1204
|
+
return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${escapeHtml4(model.status)}">
|
|
819
1205
|
<header class="absolute-voice-provider-capabilities__header">
|
|
820
|
-
<span class="absolute-voice-provider-capabilities__eyebrow">${
|
|
821
|
-
<strong class="absolute-voice-provider-capabilities__label">${
|
|
1206
|
+
<span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml4(model.title)}</span>
|
|
1207
|
+
<strong class="absolute-voice-provider-capabilities__label">${escapeHtml4(model.label)}</strong>
|
|
822
1208
|
</header>
|
|
823
|
-
<p class="absolute-voice-provider-capabilities__description">${
|
|
1209
|
+
<p class="absolute-voice-provider-capabilities__description">${escapeHtml4(model.description)}</p>
|
|
824
1210
|
${capabilities}
|
|
825
|
-
${model.error ? `<p class="absolute-voice-provider-capabilities__error">${
|
|
1211
|
+
${model.error ? `<p class="absolute-voice-provider-capabilities__error">${escapeHtml4(model.error)}</p>` : ""}
|
|
826
1212
|
</section>`;
|
|
827
1213
|
};
|
|
828
1214
|
var getVoiceProviderCapabilitiesCSS = () => `.absolute-voice-provider-capabilities{border:1px solid #bfd7ea;border-radius:20px;background:#f6fbff;color:#08131f;padding:18px;box-shadow:0 18px 40px rgba(14,51,78,.12);font-family:inherit}.absolute-voice-provider-capabilities--error,.absolute-voice-provider-capabilities--warning{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-provider-capabilities__header,.absolute-voice-provider-capabilities__provider header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-provider-capabilities__eyebrow{color:#255f85;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-provider-capabilities__label{font-size:24px;line-height:1}.absolute-voice-provider-capabilities__description,.absolute-voice-provider-capabilities__provider p,.absolute-voice-provider-capabilities__provider dt,.absolute-voice-provider-capabilities__empty{color:#405467}.absolute-voice-provider-capabilities__providers{display:grid;gap:12px;margin-top:14px}.absolute-voice-provider-capabilities__provider{background:#fff;border:1px solid #d7e7f3;border-radius:16px;padding:14px}.absolute-voice-provider-capabilities__provider--selected,.absolute-voice-provider-capabilities__provider--healthy{border-color:#86efac}.absolute-voice-provider-capabilities__provider--degraded,.absolute-voice-provider-capabilities__provider--rate-limited,.absolute-voice-provider-capabilities__provider--suppressed,.absolute-voice-provider-capabilities__provider--unconfigured{border-color:#f2a7a7}.absolute-voice-provider-capabilities__provider p{margin:10px 0}.absolute-voice-provider-capabilities__provider dl{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin:0}.absolute-voice-provider-capabilities__provider div{background:#f6fbff;border:1px solid #d7e7f3;border-radius:12px;padding:8px}.absolute-voice-provider-capabilities__provider dt{font-size:12px}.absolute-voice-provider-capabilities__provider dd{font-weight:800;margin:4px 0 0}.absolute-voice-provider-capabilities__empty{margin:14px 0 0}.absolute-voice-provider-capabilities__error{color:#9f1239;font-weight:700}`;
|
|
@@ -864,13 +1250,13 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
|
|
|
864
1250
|
};
|
|
865
1251
|
|
|
866
1252
|
// src/vue/useVoiceProviderCapabilities.ts
|
|
867
|
-
import { onUnmounted as
|
|
1253
|
+
import { onUnmounted as onUnmounted4, shallowRef as shallowRef3 } from "vue";
|
|
868
1254
|
function useVoiceProviderCapabilities(path = "/api/provider-capabilities", options = {}) {
|
|
869
1255
|
const store = createVoiceProviderCapabilitiesStore(path, options);
|
|
870
|
-
const error =
|
|
871
|
-
const isLoading =
|
|
872
|
-
const report =
|
|
873
|
-
const updatedAt =
|
|
1256
|
+
const error = shallowRef3(null);
|
|
1257
|
+
const isLoading = shallowRef3(false);
|
|
1258
|
+
const report = shallowRef3();
|
|
1259
|
+
const updatedAt = shallowRef3(undefined);
|
|
874
1260
|
const sync = () => {
|
|
875
1261
|
const snapshot = store.getSnapshot();
|
|
876
1262
|
error.value = snapshot.error;
|
|
@@ -881,7 +1267,7 @@ function useVoiceProviderCapabilities(path = "/api/provider-capabilities", optio
|
|
|
881
1267
|
const unsubscribe = store.subscribe(sync);
|
|
882
1268
|
sync();
|
|
883
1269
|
store.refresh().catch(() => {});
|
|
884
|
-
|
|
1270
|
+
onUnmounted4(() => {
|
|
885
1271
|
unsubscribe();
|
|
886
1272
|
store.close();
|
|
887
1273
|
});
|
|
@@ -895,7 +1281,7 @@ function useVoiceProviderCapabilities(path = "/api/provider-capabilities", optio
|
|
|
895
1281
|
}
|
|
896
1282
|
|
|
897
1283
|
// src/vue/VoiceProviderCapabilities.ts
|
|
898
|
-
var VoiceProviderCapabilities =
|
|
1284
|
+
var VoiceProviderCapabilities = defineComponent4({
|
|
899
1285
|
name: "VoiceProviderCapabilities",
|
|
900
1286
|
props: {
|
|
901
1287
|
class: {
|
|
@@ -932,41 +1318,41 @@ var VoiceProviderCapabilities = defineComponent3({
|
|
|
932
1318
|
report: capabilities.report.value,
|
|
933
1319
|
updatedAt: capabilities.updatedAt.value
|
|
934
1320
|
}, options));
|
|
935
|
-
return () =>
|
|
1321
|
+
return () => h4("section", {
|
|
936
1322
|
class: [
|
|
937
1323
|
"absolute-voice-provider-capabilities",
|
|
938
1324
|
`absolute-voice-provider-capabilities--${model.value.status}`,
|
|
939
1325
|
props.class
|
|
940
1326
|
]
|
|
941
1327
|
}, [
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
1328
|
+
h4("header", { class: "absolute-voice-provider-capabilities__header" }, [
|
|
1329
|
+
h4("span", { class: "absolute-voice-provider-capabilities__eyebrow" }, model.value.title),
|
|
1330
|
+
h4("strong", { class: "absolute-voice-provider-capabilities__label" }, model.value.label)
|
|
945
1331
|
]),
|
|
946
|
-
|
|
947
|
-
model.value.capabilities.length ?
|
|
1332
|
+
h4("p", { class: "absolute-voice-provider-capabilities__description" }, model.value.description),
|
|
1333
|
+
model.value.capabilities.length ? h4("div", { class: "absolute-voice-provider-capabilities__providers" }, model.value.capabilities.map((capability) => h4("article", {
|
|
948
1334
|
class: [
|
|
949
1335
|
"absolute-voice-provider-capabilities__provider",
|
|
950
1336
|
`absolute-voice-provider-capabilities__provider--${capability.status}`
|
|
951
1337
|
],
|
|
952
1338
|
key: `${capability.kind}:${capability.provider}`
|
|
953
1339
|
}, [
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
1340
|
+
h4("header", [
|
|
1341
|
+
h4("strong", capability.label),
|
|
1342
|
+
h4("span", capability.status)
|
|
957
1343
|
]),
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
1344
|
+
h4("p", capability.detail),
|
|
1345
|
+
h4("dl", capability.rows.map((row) => h4("div", { key: row.label }, [
|
|
1346
|
+
h4("dt", row.label),
|
|
1347
|
+
h4("dd", row.value)
|
|
962
1348
|
])))
|
|
963
|
-
]))) :
|
|
964
|
-
model.value.error ?
|
|
1349
|
+
]))) : h4("p", { class: "absolute-voice-provider-capabilities__empty" }, "Configure provider capabilities to see deployment coverage."),
|
|
1350
|
+
model.value.error ? h4("p", { class: "absolute-voice-provider-capabilities__error" }, model.value.error) : null
|
|
965
1351
|
]);
|
|
966
1352
|
}
|
|
967
1353
|
});
|
|
968
1354
|
// src/vue/VoiceProviderStatus.ts
|
|
969
|
-
import { computed as computed3, defineComponent as
|
|
1355
|
+
import { computed as computed3, defineComponent as defineComponent5, h as h5 } from "vue";
|
|
970
1356
|
|
|
971
1357
|
// src/client/providerStatus.ts
|
|
972
1358
|
var fetchVoiceProviderStatus = async (path = "/api/provider-status", options = {}) => {
|
|
@@ -1049,9 +1435,9 @@ var createVoiceProviderStatusStore = (path = "/api/provider-status", options = {
|
|
|
1049
1435
|
};
|
|
1050
1436
|
|
|
1051
1437
|
// src/client/providerStatusWidget.ts
|
|
1052
|
-
var
|
|
1053
|
-
var
|
|
1054
|
-
var
|
|
1438
|
+
var DEFAULT_TITLE4 = "Voice Providers";
|
|
1439
|
+
var DEFAULT_DESCRIPTION4 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
|
|
1440
|
+
var escapeHtml5 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
1055
1441
|
var formatProvider2 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
|
|
1056
1442
|
var formatStatus2 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
|
|
1057
1443
|
var formatLatency = (value) => typeof value === "number" ? `${value}ms` : "No samples";
|
|
@@ -1095,37 +1481,37 @@ var createVoiceProviderStatusViewModel = (snapshot, options = {}) => {
|
|
|
1095
1481
|
const warningCount = providers.filter((provider) => isWarningStatus2(provider.status)).length;
|
|
1096
1482
|
const healthyCount = providers.filter((provider) => provider.status === "healthy").length;
|
|
1097
1483
|
return {
|
|
1098
|
-
description: options.description ??
|
|
1484
|
+
description: options.description ?? DEFAULT_DESCRIPTION4,
|
|
1099
1485
|
error: snapshot.error,
|
|
1100
1486
|
isLoading: snapshot.isLoading,
|
|
1101
1487
|
label: snapshot.error ? "Unavailable" : providers.length ? warningCount > 0 ? `${warningCount} needs attention` : `${healthyCount} healthy` : snapshot.isLoading ? "Checking" : "No provider traffic",
|
|
1102
1488
|
providers,
|
|
1103
1489
|
status: snapshot.error ? "error" : providers.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
1104
|
-
title: options.title ??
|
|
1490
|
+
title: options.title ?? DEFAULT_TITLE4,
|
|
1105
1491
|
updatedAt: snapshot.updatedAt
|
|
1106
1492
|
};
|
|
1107
1493
|
};
|
|
1108
1494
|
var renderVoiceProviderStatusHTML = (snapshot, options = {}) => {
|
|
1109
1495
|
const model = createVoiceProviderStatusViewModel(snapshot, options);
|
|
1110
|
-
const providers = model.providers.length ? `<div class="absolute-voice-provider-status__providers">${model.providers.map((provider) => `<article class="absolute-voice-provider-status__provider absolute-voice-provider-status__provider--${
|
|
1496
|
+
const providers = model.providers.length ? `<div class="absolute-voice-provider-status__providers">${model.providers.map((provider) => `<article class="absolute-voice-provider-status__provider absolute-voice-provider-status__provider--${escapeHtml5(provider.status)}">
|
|
1111
1497
|
<header>
|
|
1112
|
-
<strong>${
|
|
1113
|
-
<span>${
|
|
1498
|
+
<strong>${escapeHtml5(provider.label)}</strong>
|
|
1499
|
+
<span>${escapeHtml5(formatStatus2(provider.status))}</span>
|
|
1114
1500
|
</header>
|
|
1115
|
-
<p>${
|
|
1501
|
+
<p>${escapeHtml5(provider.detail)}</p>
|
|
1116
1502
|
<dl>${provider.rows.map((row) => `<div>
|
|
1117
|
-
<dt>${
|
|
1118
|
-
<dd>${
|
|
1503
|
+
<dt>${escapeHtml5(row.label)}</dt>
|
|
1504
|
+
<dd>${escapeHtml5(row.value)}</dd>
|
|
1119
1505
|
</div>`).join("")}</dl>
|
|
1120
1506
|
</article>`).join("")}</div>` : '<p class="absolute-voice-provider-status__empty">Run voice traffic to see provider health.</p>';
|
|
1121
|
-
return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${
|
|
1507
|
+
return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml5(model.status)}">
|
|
1122
1508
|
<header class="absolute-voice-provider-status__header">
|
|
1123
|
-
<span class="absolute-voice-provider-status__eyebrow">${
|
|
1124
|
-
<strong class="absolute-voice-provider-status__label">${
|
|
1509
|
+
<span class="absolute-voice-provider-status__eyebrow">${escapeHtml5(model.title)}</span>
|
|
1510
|
+
<strong class="absolute-voice-provider-status__label">${escapeHtml5(model.label)}</strong>
|
|
1125
1511
|
</header>
|
|
1126
|
-
<p class="absolute-voice-provider-status__description">${
|
|
1512
|
+
<p class="absolute-voice-provider-status__description">${escapeHtml5(model.description)}</p>
|
|
1127
1513
|
${providers}
|
|
1128
|
-
${model.error ? `<p class="absolute-voice-provider-status__error">${
|
|
1514
|
+
${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml5(model.error)}</p>` : ""}
|
|
1129
1515
|
</section>`;
|
|
1130
1516
|
};
|
|
1131
1517
|
var getVoiceProviderStatusCSS = () => `.absolute-voice-provider-status{border:1px solid #d8d2c4;border-radius:20px;background:#fffaf0;color:#16130d;padding:18px;box-shadow:0 18px 40px rgba(47,37,18,.12);font-family:inherit}.absolute-voice-provider-status--error,.absolute-voice-provider-status--warning{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-provider-status__header,.absolute-voice-provider-status__provider header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-provider-status__eyebrow{color:#73664f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-provider-status__label{font-size:24px;line-height:1}.absolute-voice-provider-status__description,.absolute-voice-provider-status__provider p,.absolute-voice-provider-status__provider dt,.absolute-voice-provider-status__empty{color:#514733}.absolute-voice-provider-status__providers{display:grid;gap:12px;margin-top:14px}.absolute-voice-provider-status__provider{background:#fff;border:1px solid #eee4d2;border-radius:16px;padding:14px}.absolute-voice-provider-status__provider--degraded,.absolute-voice-provider-status__provider--rate-limited,.absolute-voice-provider-status__provider--suppressed{border-color:#f2a7a7}.absolute-voice-provider-status__provider--recoverable{border-color:#fbbf24}.absolute-voice-provider-status__provider p{margin:10px 0}.absolute-voice-provider-status__provider dl{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin:0}.absolute-voice-provider-status__provider div{background:#fffaf0;border:1px solid #eee4d2;border-radius:12px;padding:8px}.absolute-voice-provider-status__provider dt{font-size:12px}.absolute-voice-provider-status__provider dd{font-weight:800;margin:4px 0 0}.absolute-voice-provider-status__empty{margin:14px 0 0}.absolute-voice-provider-status__error{color:#9f1239;font-weight:700}`;
|
|
@@ -1167,13 +1553,13 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
|
|
|
1167
1553
|
};
|
|
1168
1554
|
|
|
1169
1555
|
// src/vue/useVoiceProviderStatus.ts
|
|
1170
|
-
import { onUnmounted as
|
|
1556
|
+
import { onUnmounted as onUnmounted5, ref as ref4, shallowRef as shallowRef4 } from "vue";
|
|
1171
1557
|
function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
|
|
1172
1558
|
const store = createVoiceProviderStatusStore(path, options);
|
|
1173
|
-
const error =
|
|
1174
|
-
const isLoading =
|
|
1175
|
-
const providers =
|
|
1176
|
-
const updatedAt =
|
|
1559
|
+
const error = ref4(null);
|
|
1560
|
+
const isLoading = ref4(false);
|
|
1561
|
+
const providers = shallowRef4([]);
|
|
1562
|
+
const updatedAt = ref4(undefined);
|
|
1177
1563
|
const sync = () => {
|
|
1178
1564
|
const snapshot = store.getSnapshot();
|
|
1179
1565
|
error.value = snapshot.error;
|
|
@@ -1184,7 +1570,7 @@ function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
|
|
|
1184
1570
|
const unsubscribe = store.subscribe(sync);
|
|
1185
1571
|
sync();
|
|
1186
1572
|
store.refresh().catch(() => {});
|
|
1187
|
-
|
|
1573
|
+
onUnmounted5(() => {
|
|
1188
1574
|
unsubscribe();
|
|
1189
1575
|
store.close();
|
|
1190
1576
|
});
|
|
@@ -1198,7 +1584,7 @@ function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
|
|
|
1198
1584
|
}
|
|
1199
1585
|
|
|
1200
1586
|
// src/vue/VoiceProviderStatus.ts
|
|
1201
|
-
var VoiceProviderStatus =
|
|
1587
|
+
var VoiceProviderStatus = defineComponent5({
|
|
1202
1588
|
name: "VoiceProviderStatus",
|
|
1203
1589
|
props: {
|
|
1204
1590
|
class: {
|
|
@@ -1235,41 +1621,41 @@ var VoiceProviderStatus = defineComponent4({
|
|
|
1235
1621
|
providers: status.providers.value,
|
|
1236
1622
|
updatedAt: status.updatedAt.value
|
|
1237
1623
|
}, options));
|
|
1238
|
-
return () =>
|
|
1624
|
+
return () => h5("section", {
|
|
1239
1625
|
class: [
|
|
1240
1626
|
"absolute-voice-provider-status",
|
|
1241
1627
|
`absolute-voice-provider-status--${model.value.status}`,
|
|
1242
1628
|
props.class
|
|
1243
1629
|
]
|
|
1244
1630
|
}, [
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1631
|
+
h5("header", { class: "absolute-voice-provider-status__header" }, [
|
|
1632
|
+
h5("span", { class: "absolute-voice-provider-status__eyebrow" }, model.value.title),
|
|
1633
|
+
h5("strong", { class: "absolute-voice-provider-status__label" }, model.value.label)
|
|
1248
1634
|
]),
|
|
1249
|
-
|
|
1250
|
-
model.value.providers.length ?
|
|
1635
|
+
h5("p", { class: "absolute-voice-provider-status__description" }, model.value.description),
|
|
1636
|
+
model.value.providers.length ? h5("div", { class: "absolute-voice-provider-status__providers" }, model.value.providers.map((provider) => h5("article", {
|
|
1251
1637
|
class: [
|
|
1252
1638
|
"absolute-voice-provider-status__provider",
|
|
1253
1639
|
`absolute-voice-provider-status__provider--${provider.status}`
|
|
1254
1640
|
],
|
|
1255
1641
|
key: provider.provider
|
|
1256
1642
|
}, [
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1643
|
+
h5("header", [
|
|
1644
|
+
h5("strong", provider.label),
|
|
1645
|
+
h5("span", provider.status)
|
|
1260
1646
|
]),
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1647
|
+
h5("p", provider.detail),
|
|
1648
|
+
h5("dl", provider.rows.map((row) => h5("div", { key: row.label }, [
|
|
1649
|
+
h5("dt", row.label),
|
|
1650
|
+
h5("dd", row.value)
|
|
1265
1651
|
])))
|
|
1266
|
-
]))) :
|
|
1267
|
-
model.value.error ?
|
|
1652
|
+
]))) : h5("p", { class: "absolute-voice-provider-status__empty" }, "Run voice traffic to see provider health."),
|
|
1653
|
+
model.value.error ? h5("p", { class: "absolute-voice-provider-status__error" }, model.value.error) : null
|
|
1268
1654
|
]);
|
|
1269
1655
|
}
|
|
1270
1656
|
});
|
|
1271
1657
|
// src/vue/VoiceRoutingStatus.ts
|
|
1272
|
-
import { computed as computed4, defineComponent as
|
|
1658
|
+
import { computed as computed4, defineComponent as defineComponent6, h as h6 } from "vue";
|
|
1273
1659
|
|
|
1274
1660
|
// src/client/routingStatus.ts
|
|
1275
1661
|
var fetchVoiceRoutingStatus = async (path = "/api/routing/latest", options = {}) => {
|
|
@@ -1352,9 +1738,9 @@ var createVoiceRoutingStatusStore = (path = "/api/routing/latest", options = {})
|
|
|
1352
1738
|
};
|
|
1353
1739
|
|
|
1354
1740
|
// src/client/routingStatusWidget.ts
|
|
1355
|
-
var
|
|
1356
|
-
var
|
|
1357
|
-
var
|
|
1741
|
+
var DEFAULT_TITLE5 = "Voice Routing";
|
|
1742
|
+
var DEFAULT_DESCRIPTION5 = "Latest provider routing decision from the self-hosted trace store.";
|
|
1743
|
+
var escapeHtml6 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
1358
1744
|
var formatValue = (value, fallback = "None") => typeof value === "string" && value.trim() ? value : typeof value === "number" && Number.isFinite(value) ? String(value) : fallback;
|
|
1359
1745
|
var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
|
|
1360
1746
|
const decision = snapshot.decision;
|
|
@@ -1378,30 +1764,30 @@ var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
|
|
|
1378
1764
|
] : [];
|
|
1379
1765
|
return {
|
|
1380
1766
|
decision,
|
|
1381
|
-
description: options.description ??
|
|
1767
|
+
description: options.description ?? DEFAULT_DESCRIPTION5,
|
|
1382
1768
|
error: snapshot.error,
|
|
1383
1769
|
isLoading: snapshot.isLoading,
|
|
1384
1770
|
label: snapshot.error ? "Unavailable" : decision ? `${formatValue(decision.kind).toUpperCase()} ${formatValue(decision.status, "unknown")}` : snapshot.isLoading ? "Checking" : "No routing yet",
|
|
1385
1771
|
rows,
|
|
1386
1772
|
status: snapshot.error ? "error" : decision ? "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
1387
|
-
title: options.title ??
|
|
1773
|
+
title: options.title ?? DEFAULT_TITLE5,
|
|
1388
1774
|
updatedAt: snapshot.updatedAt
|
|
1389
1775
|
};
|
|
1390
1776
|
};
|
|
1391
1777
|
var renderVoiceRoutingStatusHTML = (snapshot, options = {}) => {
|
|
1392
1778
|
const model = createVoiceRoutingStatusViewModel(snapshot, options);
|
|
1393
1779
|
const rows = model.rows.length ? `<div class="absolute-voice-routing-status__grid">${model.rows.map((row) => `<div>
|
|
1394
|
-
<span>${
|
|
1395
|
-
<strong>${
|
|
1780
|
+
<span>${escapeHtml6(row.label)}</span>
|
|
1781
|
+
<strong>${escapeHtml6(row.value)}</strong>
|
|
1396
1782
|
</div>`).join("")}</div>` : '<p class="absolute-voice-routing-status__empty">Start a voice session to see the selected provider.</p>';
|
|
1397
|
-
return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${
|
|
1783
|
+
return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml6(model.status)}">
|
|
1398
1784
|
<header class="absolute-voice-routing-status__header">
|
|
1399
|
-
<span class="absolute-voice-routing-status__eyebrow">${
|
|
1400
|
-
<strong class="absolute-voice-routing-status__label">${
|
|
1785
|
+
<span class="absolute-voice-routing-status__eyebrow">${escapeHtml6(model.title)}</span>
|
|
1786
|
+
<strong class="absolute-voice-routing-status__label">${escapeHtml6(model.label)}</strong>
|
|
1401
1787
|
</header>
|
|
1402
|
-
<p class="absolute-voice-routing-status__description">${
|
|
1788
|
+
<p class="absolute-voice-routing-status__description">${escapeHtml6(model.description)}</p>
|
|
1403
1789
|
${rows}
|
|
1404
|
-
${model.error ? `<p class="absolute-voice-routing-status__error">${
|
|
1790
|
+
${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml6(model.error)}</p>` : ""}
|
|
1405
1791
|
</section>`;
|
|
1406
1792
|
};
|
|
1407
1793
|
var getVoiceRoutingStatusCSS = () => `.absolute-voice-routing-status{border:1px solid #d8d2c4;border-radius:20px;background:#fffaf0;color:#16130d;padding:18px;box-shadow:0 18px 40px rgba(47,37,18,.12);font-family:inherit}.absolute-voice-routing-status--error{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-routing-status__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-routing-status__eyebrow{color:#73664f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-routing-status__label{font-size:24px;line-height:1}.absolute-voice-routing-status__description{color:#514733;margin:12px 0 0}.absolute-voice-routing-status__grid{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:14px}.absolute-voice-routing-status__grid div{background:#fff;border:1px solid #eee4d2;border-radius:14px;padding:10px 12px}.absolute-voice-routing-status__grid span{color:#655944;display:block;font-size:12px;margin-bottom:4px}.absolute-voice-routing-status__grid strong{overflow-wrap:anywhere}.absolute-voice-routing-status__empty{color:#655944;margin:14px 0 0}.absolute-voice-routing-status__error{color:#9f1239;font-weight:700}`;
|
|
@@ -1443,13 +1829,13 @@ var defineVoiceRoutingStatusElement = (tagName = "absolute-voice-routing-status"
|
|
|
1443
1829
|
};
|
|
1444
1830
|
|
|
1445
1831
|
// src/vue/useVoiceRoutingStatus.ts
|
|
1446
|
-
import { onUnmounted as
|
|
1832
|
+
import { onUnmounted as onUnmounted6, ref as ref5, shallowRef as shallowRef5 } from "vue";
|
|
1447
1833
|
function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
|
|
1448
1834
|
const store = createVoiceRoutingStatusStore(path, options);
|
|
1449
|
-
const decision =
|
|
1450
|
-
const error =
|
|
1451
|
-
const isLoading =
|
|
1452
|
-
const updatedAt =
|
|
1835
|
+
const decision = shallowRef5(null);
|
|
1836
|
+
const error = ref5(null);
|
|
1837
|
+
const isLoading = ref5(false);
|
|
1838
|
+
const updatedAt = ref5(undefined);
|
|
1453
1839
|
const sync = () => {
|
|
1454
1840
|
const snapshot = store.getSnapshot();
|
|
1455
1841
|
decision.value = snapshot.decision;
|
|
@@ -1460,7 +1846,7 @@ function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
|
|
|
1460
1846
|
const unsubscribe = store.subscribe(sync);
|
|
1461
1847
|
sync();
|
|
1462
1848
|
store.refresh().catch(() => {});
|
|
1463
|
-
|
|
1849
|
+
onUnmounted6(() => {
|
|
1464
1850
|
unsubscribe();
|
|
1465
1851
|
store.close();
|
|
1466
1852
|
});
|
|
@@ -1474,7 +1860,7 @@ function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
|
|
|
1474
1860
|
}
|
|
1475
1861
|
|
|
1476
1862
|
// src/vue/VoiceRoutingStatus.ts
|
|
1477
|
-
var VoiceRoutingStatus =
|
|
1863
|
+
var VoiceRoutingStatus = defineComponent6({
|
|
1478
1864
|
name: "VoiceRoutingStatus",
|
|
1479
1865
|
props: {
|
|
1480
1866
|
class: {
|
|
@@ -1511,28 +1897,28 @@ var VoiceRoutingStatus = defineComponent5({
|
|
|
1511
1897
|
isLoading: status.isLoading.value,
|
|
1512
1898
|
updatedAt: status.updatedAt.value
|
|
1513
1899
|
}, options));
|
|
1514
|
-
return () =>
|
|
1900
|
+
return () => h6("section", {
|
|
1515
1901
|
class: [
|
|
1516
1902
|
"absolute-voice-routing-status",
|
|
1517
1903
|
`absolute-voice-routing-status--${model.value.status}`,
|
|
1518
1904
|
props.class
|
|
1519
1905
|
]
|
|
1520
1906
|
}, [
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1907
|
+
h6("header", { class: "absolute-voice-routing-status__header" }, [
|
|
1908
|
+
h6("span", { class: "absolute-voice-routing-status__eyebrow" }, model.value.title),
|
|
1909
|
+
h6("strong", { class: "absolute-voice-routing-status__label" }, model.value.label)
|
|
1524
1910
|
]),
|
|
1525
|
-
|
|
1526
|
-
model.value.rows.length ?
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
]))) :
|
|
1530
|
-
model.value.error ?
|
|
1911
|
+
h6("p", { class: "absolute-voice-routing-status__description" }, model.value.description),
|
|
1912
|
+
model.value.rows.length ? h6("div", { class: "absolute-voice-routing-status__grid" }, model.value.rows.map((row) => h6("div", { key: row.label }, [
|
|
1913
|
+
h6("span", row.label),
|
|
1914
|
+
h6("strong", row.value)
|
|
1915
|
+
]))) : h6("p", { class: "absolute-voice-routing-status__empty" }, "Start a voice session to see the selected provider."),
|
|
1916
|
+
model.value.error ? h6("p", { class: "absolute-voice-routing-status__error" }, model.value.error) : null
|
|
1531
1917
|
]);
|
|
1532
1918
|
}
|
|
1533
1919
|
});
|
|
1534
1920
|
// src/vue/VoiceTurnLatency.ts
|
|
1535
|
-
import { computed as computed5, defineComponent as
|
|
1921
|
+
import { computed as computed5, defineComponent as defineComponent7, h as h7 } from "vue";
|
|
1536
1922
|
|
|
1537
1923
|
// src/client/turnLatency.ts
|
|
1538
1924
|
var fetchVoiceTurnLatency = async (path = "/api/turn-latency", options = {}) => {
|
|
@@ -1638,10 +2024,10 @@ var createVoiceTurnLatencyStore = (path = "/api/turn-latency", options = {}) =>
|
|
|
1638
2024
|
};
|
|
1639
2025
|
|
|
1640
2026
|
// src/client/turnLatencyWidget.ts
|
|
1641
|
-
var
|
|
1642
|
-
var
|
|
2027
|
+
var DEFAULT_TITLE6 = "Turn Latency";
|
|
2028
|
+
var DEFAULT_DESCRIPTION6 = "Per-turn timing from first transcript to commit and assistant response start.";
|
|
1643
2029
|
var DEFAULT_PROOF_LABEL = "Run latency proof";
|
|
1644
|
-
var
|
|
2030
|
+
var escapeHtml7 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
1645
2031
|
var formatMs = (value) => typeof value === "number" ? `${Math.round(value)}ms` : "n/a";
|
|
1646
2032
|
var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
|
|
1647
2033
|
const turns = (snapshot.report?.turns ?? []).map((turn) => ({
|
|
@@ -1655,39 +2041,39 @@ var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
|
|
|
1655
2041
|
const warningCount = snapshot.report?.warnings ?? turns.filter((turn) => turn.status === "warn").length;
|
|
1656
2042
|
const failedCount = snapshot.report?.failed ?? turns.filter((turn) => turn.status === "fail").length;
|
|
1657
2043
|
return {
|
|
1658
|
-
description: options.description ??
|
|
2044
|
+
description: options.description ?? DEFAULT_DESCRIPTION6,
|
|
1659
2045
|
error: snapshot.error,
|
|
1660
2046
|
isLoading: snapshot.isLoading,
|
|
1661
2047
|
label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} slow` : warningCount > 0 ? `${warningCount} warnings` : `avg ${formatMs(snapshot.report?.averageTotalMs)}` : snapshot.isLoading ? "Checking" : "No turns",
|
|
1662
2048
|
proofLabel: options.proofPath ? options.proofLabel ?? DEFAULT_PROOF_LABEL : undefined,
|
|
1663
2049
|
showProofAction: Boolean(options.proofPath),
|
|
1664
2050
|
status: snapshot.error ? "error" : turns.length ? failedCount > 0 || warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
1665
|
-
title: options.title ??
|
|
2051
|
+
title: options.title ?? DEFAULT_TITLE6,
|
|
1666
2052
|
turns,
|
|
1667
2053
|
updatedAt: snapshot.updatedAt
|
|
1668
2054
|
};
|
|
1669
2055
|
};
|
|
1670
2056
|
var renderVoiceTurnLatencyHTML = (snapshot, options = {}) => {
|
|
1671
2057
|
const model = createVoiceTurnLatencyViewModel(snapshot, options);
|
|
1672
|
-
const turns = model.turns.length ? `<div class="absolute-voice-turn-latency__turns">${model.turns.map((turn) => `<article class="absolute-voice-turn-latency__turn absolute-voice-turn-latency__turn--${
|
|
2058
|
+
const turns = model.turns.length ? `<div class="absolute-voice-turn-latency__turns">${model.turns.map((turn) => `<article class="absolute-voice-turn-latency__turn absolute-voice-turn-latency__turn--${escapeHtml7(turn.status)}">
|
|
1673
2059
|
<header>
|
|
1674
|
-
<strong>${
|
|
1675
|
-
<span>${
|
|
2060
|
+
<strong>${escapeHtml7(turn.label)}</strong>
|
|
2061
|
+
<span>${escapeHtml7(turn.status)}</span>
|
|
1676
2062
|
</header>
|
|
1677
2063
|
<dl>${turn.rows.map((row) => `<div>
|
|
1678
|
-
<dt>${
|
|
1679
|
-
<dd>${
|
|
2064
|
+
<dt>${escapeHtml7(row.label)}</dt>
|
|
2065
|
+
<dd>${escapeHtml7(row.value)}</dd>
|
|
1680
2066
|
</div>`).join("")}</dl>
|
|
1681
2067
|
</article>`).join("")}</div>` : '<p class="absolute-voice-turn-latency__empty">Complete a voice turn to see latency diagnostics.</p>';
|
|
1682
|
-
return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${
|
|
2068
|
+
return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${escapeHtml7(model.status)}">
|
|
1683
2069
|
<header class="absolute-voice-turn-latency__header">
|
|
1684
|
-
<span class="absolute-voice-turn-latency__eyebrow">${
|
|
1685
|
-
<strong class="absolute-voice-turn-latency__label">${
|
|
2070
|
+
<span class="absolute-voice-turn-latency__eyebrow">${escapeHtml7(model.title)}</span>
|
|
2071
|
+
<strong class="absolute-voice-turn-latency__label">${escapeHtml7(model.label)}</strong>
|
|
1686
2072
|
</header>
|
|
1687
|
-
<p class="absolute-voice-turn-latency__description">${
|
|
1688
|
-
${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${
|
|
2073
|
+
<p class="absolute-voice-turn-latency__description">${escapeHtml7(model.description)}</p>
|
|
2074
|
+
${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml7(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</button>` : ""}
|
|
1689
2075
|
${turns}
|
|
1690
|
-
${model.error ? `<p class="absolute-voice-turn-latency__error">${
|
|
2076
|
+
${model.error ? `<p class="absolute-voice-turn-latency__error">${escapeHtml7(model.error)}</p>` : ""}
|
|
1691
2077
|
</section>`;
|
|
1692
2078
|
};
|
|
1693
2079
|
var mountVoiceTurnLatency = (element, path = "/api/turn-latency", options = {}) => {
|
|
@@ -1738,13 +2124,13 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
|
|
|
1738
2124
|
};
|
|
1739
2125
|
|
|
1740
2126
|
// src/vue/useVoiceTurnLatency.ts
|
|
1741
|
-
import { onUnmounted as
|
|
2127
|
+
import { onUnmounted as onUnmounted7, shallowRef as shallowRef6 } from "vue";
|
|
1742
2128
|
function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
|
|
1743
2129
|
const store = createVoiceTurnLatencyStore(path, options);
|
|
1744
|
-
const error =
|
|
1745
|
-
const isLoading =
|
|
1746
|
-
const report =
|
|
1747
|
-
const updatedAt =
|
|
2130
|
+
const error = shallowRef6(null);
|
|
2131
|
+
const isLoading = shallowRef6(false);
|
|
2132
|
+
const report = shallowRef6();
|
|
2133
|
+
const updatedAt = shallowRef6(undefined);
|
|
1748
2134
|
const sync = () => {
|
|
1749
2135
|
const snapshot = store.getSnapshot();
|
|
1750
2136
|
error.value = snapshot.error;
|
|
@@ -1755,7 +2141,7 @@ function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
|
|
|
1755
2141
|
const unsubscribe = store.subscribe(sync);
|
|
1756
2142
|
sync();
|
|
1757
2143
|
store.refresh().catch(() => {});
|
|
1758
|
-
|
|
2144
|
+
onUnmounted7(() => {
|
|
1759
2145
|
unsubscribe();
|
|
1760
2146
|
store.close();
|
|
1761
2147
|
});
|
|
@@ -1770,7 +2156,7 @@ function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
|
|
|
1770
2156
|
}
|
|
1771
2157
|
|
|
1772
2158
|
// src/vue/VoiceTurnLatency.ts
|
|
1773
|
-
var VoiceTurnLatency =
|
|
2159
|
+
var VoiceTurnLatency = defineComponent7({
|
|
1774
2160
|
name: "VoiceTurnLatency",
|
|
1775
2161
|
props: {
|
|
1776
2162
|
class: { default: "", type: String },
|
|
@@ -1796,47 +2182,47 @@ var VoiceTurnLatency = defineComponent6({
|
|
|
1796
2182
|
report: latency.report.value,
|
|
1797
2183
|
updatedAt: latency.updatedAt.value
|
|
1798
2184
|
}, options));
|
|
1799
|
-
return () =>
|
|
2185
|
+
return () => h7("section", {
|
|
1800
2186
|
class: [
|
|
1801
2187
|
"absolute-voice-turn-latency",
|
|
1802
2188
|
`absolute-voice-turn-latency--${model.value.status}`,
|
|
1803
2189
|
props.class
|
|
1804
2190
|
]
|
|
1805
2191
|
}, [
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
2192
|
+
h7("header", { class: "absolute-voice-turn-latency__header" }, [
|
|
2193
|
+
h7("span", { class: "absolute-voice-turn-latency__eyebrow" }, model.value.title),
|
|
2194
|
+
h7("strong", { class: "absolute-voice-turn-latency__label" }, model.value.label)
|
|
1809
2195
|
]),
|
|
1810
|
-
|
|
1811
|
-
model.value.showProofAction ?
|
|
2196
|
+
h7("p", { class: "absolute-voice-turn-latency__description" }, model.value.description),
|
|
2197
|
+
model.value.showProofAction ? h7("button", {
|
|
1812
2198
|
class: "absolute-voice-turn-latency__proof",
|
|
1813
2199
|
onClick: () => {
|
|
1814
2200
|
latency.runProof().catch(() => {});
|
|
1815
2201
|
},
|
|
1816
2202
|
type: "button"
|
|
1817
2203
|
}, model.value.proofLabel) : null,
|
|
1818
|
-
model.value.turns.length ?
|
|
2204
|
+
model.value.turns.length ? h7("div", { class: "absolute-voice-turn-latency__turns" }, model.value.turns.map((turn) => h7("article", {
|
|
1819
2205
|
class: [
|
|
1820
2206
|
"absolute-voice-turn-latency__turn",
|
|
1821
2207
|
`absolute-voice-turn-latency__turn--${turn.status}`
|
|
1822
2208
|
],
|
|
1823
2209
|
key: `${turn.sessionId}:${turn.turnId}`
|
|
1824
2210
|
}, [
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
2211
|
+
h7("header", [
|
|
2212
|
+
h7("strong", turn.label),
|
|
2213
|
+
h7("span", turn.status)
|
|
1828
2214
|
]),
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
2215
|
+
h7("dl", turn.rows.map((row) => h7("div", { key: row.label }, [
|
|
2216
|
+
h7("dt", row.label),
|
|
2217
|
+
h7("dd", row.value)
|
|
1832
2218
|
])))
|
|
1833
|
-
]))) :
|
|
1834
|
-
model.value.error ?
|
|
2219
|
+
]))) : h7("p", { class: "absolute-voice-turn-latency__empty" }, "Complete a voice turn to see latency diagnostics."),
|
|
2220
|
+
model.value.error ? h7("p", { class: "absolute-voice-turn-latency__error" }, model.value.error) : null
|
|
1835
2221
|
]);
|
|
1836
2222
|
}
|
|
1837
2223
|
});
|
|
1838
2224
|
// src/vue/VoiceTurnQuality.ts
|
|
1839
|
-
import { computed as computed6, defineComponent as
|
|
2225
|
+
import { computed as computed6, defineComponent as defineComponent8, h as h8 } from "vue";
|
|
1840
2226
|
|
|
1841
2227
|
// src/client/turnQuality.ts
|
|
1842
2228
|
var fetchVoiceTurnQuality = async (path = "/api/turn-quality", options = {}) => {
|
|
@@ -1918,9 +2304,9 @@ var createVoiceTurnQualityStore = (path = "/api/turn-quality", options = {}) =>
|
|
|
1918
2304
|
};
|
|
1919
2305
|
|
|
1920
2306
|
// src/client/turnQualityWidget.ts
|
|
1921
|
-
var
|
|
1922
|
-
var
|
|
1923
|
-
var
|
|
2307
|
+
var DEFAULT_TITLE7 = "Turn Quality";
|
|
2308
|
+
var DEFAULT_DESCRIPTION7 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
|
|
2309
|
+
var escapeHtml8 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
1924
2310
|
var formatConfidence = (value) => typeof value === "number" ? `${Math.round(value * 100)}%` : "n/a";
|
|
1925
2311
|
var formatMaybe = (value) => value === undefined || value === "" ? "n/a" : String(value);
|
|
1926
2312
|
var getTurnDetail = (turn) => {
|
|
@@ -1958,37 +2344,37 @@ var createVoiceTurnQualityViewModel = (snapshot, options = {}) => {
|
|
|
1958
2344
|
const warningCount = snapshot.report?.warnings ?? turns.filter((turn) => turn.status === "warn").length;
|
|
1959
2345
|
const failedCount = snapshot.report?.failed ?? turns.filter((turn) => turn.status === "fail").length;
|
|
1960
2346
|
return {
|
|
1961
|
-
description: options.description ??
|
|
2347
|
+
description: options.description ?? DEFAULT_DESCRIPTION7,
|
|
1962
2348
|
error: snapshot.error,
|
|
1963
2349
|
isLoading: snapshot.isLoading,
|
|
1964
2350
|
label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} failed` : warningCount > 0 ? `${warningCount} warnings` : `${turns.length} healthy` : snapshot.isLoading ? "Checking" : "No turns",
|
|
1965
2351
|
status: snapshot.error ? "error" : turns.length ? failedCount > 0 || warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
1966
|
-
title: options.title ??
|
|
2352
|
+
title: options.title ?? DEFAULT_TITLE7,
|
|
1967
2353
|
turns,
|
|
1968
2354
|
updatedAt: snapshot.updatedAt
|
|
1969
2355
|
};
|
|
1970
2356
|
};
|
|
1971
2357
|
var renderVoiceTurnQualityHTML = (snapshot, options = {}) => {
|
|
1972
2358
|
const model = createVoiceTurnQualityViewModel(snapshot, options);
|
|
1973
|
-
const turns = model.turns.length ? `<div class="absolute-voice-turn-quality__turns">${model.turns.map((turn) => `<article class="absolute-voice-turn-quality__turn absolute-voice-turn-quality__turn--${
|
|
2359
|
+
const turns = model.turns.length ? `<div class="absolute-voice-turn-quality__turns">${model.turns.map((turn) => `<article class="absolute-voice-turn-quality__turn absolute-voice-turn-quality__turn--${escapeHtml8(turn.status)}">
|
|
1974
2360
|
<header>
|
|
1975
|
-
<strong>${
|
|
1976
|
-
<span>${
|
|
2361
|
+
<strong>${escapeHtml8(turn.label)}</strong>
|
|
2362
|
+
<span>${escapeHtml8(turn.status)}</span>
|
|
1977
2363
|
</header>
|
|
1978
|
-
<p>${
|
|
2364
|
+
<p>${escapeHtml8(turn.detail)}</p>
|
|
1979
2365
|
<dl>${turn.rows.map((row) => `<div>
|
|
1980
|
-
<dt>${
|
|
1981
|
-
<dd>${
|
|
2366
|
+
<dt>${escapeHtml8(row.label)}</dt>
|
|
2367
|
+
<dd>${escapeHtml8(row.value)}</dd>
|
|
1982
2368
|
</div>`).join("")}</dl>
|
|
1983
2369
|
</article>`).join("")}</div>` : '<p class="absolute-voice-turn-quality__empty">Complete a voice turn to see STT quality diagnostics.</p>';
|
|
1984
|
-
return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${
|
|
2370
|
+
return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${escapeHtml8(model.status)}">
|
|
1985
2371
|
<header class="absolute-voice-turn-quality__header">
|
|
1986
|
-
<span class="absolute-voice-turn-quality__eyebrow">${
|
|
1987
|
-
<strong class="absolute-voice-turn-quality__label">${
|
|
2372
|
+
<span class="absolute-voice-turn-quality__eyebrow">${escapeHtml8(model.title)}</span>
|
|
2373
|
+
<strong class="absolute-voice-turn-quality__label">${escapeHtml8(model.label)}</strong>
|
|
1988
2374
|
</header>
|
|
1989
|
-
<p class="absolute-voice-turn-quality__description">${
|
|
2375
|
+
<p class="absolute-voice-turn-quality__description">${escapeHtml8(model.description)}</p>
|
|
1990
2376
|
${turns}
|
|
1991
|
-
${model.error ? `<p class="absolute-voice-turn-quality__error">${
|
|
2377
|
+
${model.error ? `<p class="absolute-voice-turn-quality__error">${escapeHtml8(model.error)}</p>` : ""}
|
|
1992
2378
|
</section>`;
|
|
1993
2379
|
};
|
|
1994
2380
|
var getVoiceTurnQualityCSS = () => `.absolute-voice-turn-quality{border:1px solid #e4d1a3;border-radius:20px;background:#fff9eb;color:#17120a;padding:18px;box-shadow:0 18px 40px rgba(73,48,14,.12);font-family:inherit}.absolute-voice-turn-quality--error,.absolute-voice-turn-quality--warning{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-turn-quality__header,.absolute-voice-turn-quality__turn header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-turn-quality__eyebrow{color:#8a5a0a;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-turn-quality__label{font-size:24px;line-height:1}.absolute-voice-turn-quality__description,.absolute-voice-turn-quality__turn p,.absolute-voice-turn-quality__turn dt,.absolute-voice-turn-quality__empty{color:#5a4930}.absolute-voice-turn-quality__turns{display:grid;gap:12px;margin-top:14px}.absolute-voice-turn-quality__turn{background:#fff;border:1px solid #f0dfba;border-radius:16px;padding:14px}.absolute-voice-turn-quality__turn--pass{border-color:#86efac}.absolute-voice-turn-quality__turn--warn,.absolute-voice-turn-quality__turn--unknown{border-color:#fbbf24}.absolute-voice-turn-quality__turn--fail{border-color:#f2a7a7}.absolute-voice-turn-quality__turn p{margin:10px 0}.absolute-voice-turn-quality__turn dl{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin:0}.absolute-voice-turn-quality__turn div{background:#fff9eb;border:1px solid #f0dfba;border-radius:12px;padding:8px}.absolute-voice-turn-quality__turn dt{font-size:12px}.absolute-voice-turn-quality__turn dd{font-weight:800;margin:4px 0 0}.absolute-voice-turn-quality__empty{margin:14px 0 0}.absolute-voice-turn-quality__error{color:#9f1239;font-weight:700}`;
|
|
@@ -2030,13 +2416,13 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
|
|
|
2030
2416
|
};
|
|
2031
2417
|
|
|
2032
2418
|
// src/vue/useVoiceTurnQuality.ts
|
|
2033
|
-
import { onUnmounted as
|
|
2419
|
+
import { onUnmounted as onUnmounted8, shallowRef as shallowRef7 } from "vue";
|
|
2034
2420
|
function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
|
|
2035
2421
|
const store = createVoiceTurnQualityStore(path, options);
|
|
2036
|
-
const error =
|
|
2037
|
-
const isLoading =
|
|
2038
|
-
const report =
|
|
2039
|
-
const updatedAt =
|
|
2422
|
+
const error = shallowRef7(null);
|
|
2423
|
+
const isLoading = shallowRef7(false);
|
|
2424
|
+
const report = shallowRef7();
|
|
2425
|
+
const updatedAt = shallowRef7(undefined);
|
|
2040
2426
|
const sync = () => {
|
|
2041
2427
|
const snapshot = store.getSnapshot();
|
|
2042
2428
|
error.value = snapshot.error;
|
|
@@ -2047,7 +2433,7 @@ function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
|
|
|
2047
2433
|
const unsubscribe = store.subscribe(sync);
|
|
2048
2434
|
sync();
|
|
2049
2435
|
store.refresh().catch(() => {});
|
|
2050
|
-
|
|
2436
|
+
onUnmounted8(() => {
|
|
2051
2437
|
unsubscribe();
|
|
2052
2438
|
store.close();
|
|
2053
2439
|
});
|
|
@@ -2055,7 +2441,7 @@ function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
|
|
|
2055
2441
|
}
|
|
2056
2442
|
|
|
2057
2443
|
// src/vue/VoiceTurnQuality.ts
|
|
2058
|
-
var VoiceTurnQuality =
|
|
2444
|
+
var VoiceTurnQuality = defineComponent8({
|
|
2059
2445
|
name: "VoiceTurnQuality",
|
|
2060
2446
|
props: {
|
|
2061
2447
|
class: { default: "", type: String },
|
|
@@ -2077,41 +2463,41 @@ var VoiceTurnQuality = defineComponent7({
|
|
|
2077
2463
|
report: quality.report.value,
|
|
2078
2464
|
updatedAt: quality.updatedAt.value
|
|
2079
2465
|
}, options));
|
|
2080
|
-
return () =>
|
|
2466
|
+
return () => h8("section", {
|
|
2081
2467
|
class: [
|
|
2082
2468
|
"absolute-voice-turn-quality",
|
|
2083
2469
|
`absolute-voice-turn-quality--${model.value.status}`,
|
|
2084
2470
|
props.class
|
|
2085
2471
|
]
|
|
2086
2472
|
}, [
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2473
|
+
h8("header", { class: "absolute-voice-turn-quality__header" }, [
|
|
2474
|
+
h8("span", { class: "absolute-voice-turn-quality__eyebrow" }, model.value.title),
|
|
2475
|
+
h8("strong", { class: "absolute-voice-turn-quality__label" }, model.value.label)
|
|
2090
2476
|
]),
|
|
2091
|
-
|
|
2092
|
-
model.value.turns.length ?
|
|
2477
|
+
h8("p", { class: "absolute-voice-turn-quality__description" }, model.value.description),
|
|
2478
|
+
model.value.turns.length ? h8("div", { class: "absolute-voice-turn-quality__turns" }, model.value.turns.map((turn) => h8("article", {
|
|
2093
2479
|
class: [
|
|
2094
2480
|
"absolute-voice-turn-quality__turn",
|
|
2095
2481
|
`absolute-voice-turn-quality__turn--${turn.status}`
|
|
2096
2482
|
],
|
|
2097
2483
|
key: `${turn.sessionId}:${turn.turnId}`
|
|
2098
2484
|
}, [
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2485
|
+
h8("header", [
|
|
2486
|
+
h8("strong", turn.label),
|
|
2487
|
+
h8("span", turn.status)
|
|
2102
2488
|
]),
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2489
|
+
h8("p", turn.detail),
|
|
2490
|
+
h8("dl", turn.rows.map((row) => h8("div", { key: row.label }, [
|
|
2491
|
+
h8("dt", row.label),
|
|
2492
|
+
h8("dd", row.value)
|
|
2107
2493
|
])))
|
|
2108
|
-
]))) :
|
|
2109
|
-
model.value.error ?
|
|
2494
|
+
]))) : h8("p", { class: "absolute-voice-turn-quality__empty" }, "Complete a voice turn to see STT quality diagnostics."),
|
|
2495
|
+
model.value.error ? h8("p", { class: "absolute-voice-turn-quality__error" }, model.value.error) : null
|
|
2110
2496
|
]);
|
|
2111
2497
|
}
|
|
2112
2498
|
});
|
|
2113
2499
|
// src/vue/useVoiceCampaignDialerProof.ts
|
|
2114
|
-
import { onUnmounted as
|
|
2500
|
+
import { onUnmounted as onUnmounted9, shallowRef as shallowRef8 } from "vue";
|
|
2115
2501
|
|
|
2116
2502
|
// src/client/campaignDialerProof.ts
|
|
2117
2503
|
var fetchVoiceCampaignDialerProofStatus = async (path = "/api/voice/campaigns/dialer-proof", options = {}) => {
|
|
@@ -2234,11 +2620,11 @@ var createVoiceCampaignDialerProofStore = (path = "/api/voice/campaigns/dialer-p
|
|
|
2234
2620
|
// src/vue/useVoiceCampaignDialerProof.ts
|
|
2235
2621
|
function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof", options = {}) {
|
|
2236
2622
|
const store = createVoiceCampaignDialerProofStore(path, options);
|
|
2237
|
-
const error =
|
|
2238
|
-
const isLoading =
|
|
2239
|
-
const report =
|
|
2240
|
-
const status =
|
|
2241
|
-
const updatedAt =
|
|
2623
|
+
const error = shallowRef8(null);
|
|
2624
|
+
const isLoading = shallowRef8(false);
|
|
2625
|
+
const report = shallowRef8();
|
|
2626
|
+
const status = shallowRef8();
|
|
2627
|
+
const updatedAt = shallowRef8(undefined);
|
|
2242
2628
|
const sync = () => {
|
|
2243
2629
|
const snapshot = store.getSnapshot();
|
|
2244
2630
|
error.value = snapshot.error;
|
|
@@ -2252,7 +2638,7 @@ function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof",
|
|
|
2252
2638
|
if (typeof window !== "undefined") {
|
|
2253
2639
|
store.refresh().catch(() => {});
|
|
2254
2640
|
}
|
|
2255
|
-
|
|
2641
|
+
onUnmounted9(() => {
|
|
2256
2642
|
unsubscribe();
|
|
2257
2643
|
store.close();
|
|
2258
2644
|
});
|
|
@@ -2267,7 +2653,7 @@ function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof",
|
|
|
2267
2653
|
};
|
|
2268
2654
|
}
|
|
2269
2655
|
// src/vue/useVoiceStream.ts
|
|
2270
|
-
import { onUnmounted as
|
|
2656
|
+
import { onUnmounted as onUnmounted10, ref as ref6, shallowRef as shallowRef9 } from "vue";
|
|
2271
2657
|
|
|
2272
2658
|
// src/client/actions.ts
|
|
2273
2659
|
var normalizeErrorMessage = (value) => {
|
|
@@ -2912,16 +3298,16 @@ var createVoiceStream = (path, options = {}) => {
|
|
|
2912
3298
|
// src/vue/useVoiceStream.ts
|
|
2913
3299
|
function useVoiceStream(path, options = {}) {
|
|
2914
3300
|
const stream = createVoiceStream(path, options);
|
|
2915
|
-
const assistantAudio =
|
|
2916
|
-
const assistantTexts =
|
|
2917
|
-
const call =
|
|
2918
|
-
const error =
|
|
2919
|
-
const isConnected =
|
|
2920
|
-
const partial =
|
|
2921
|
-
const reconnect =
|
|
2922
|
-
const sessionId =
|
|
2923
|
-
const status =
|
|
2924
|
-
const turns =
|
|
3301
|
+
const assistantAudio = shallowRef9([]);
|
|
3302
|
+
const assistantTexts = shallowRef9([]);
|
|
3303
|
+
const call = shallowRef9(null);
|
|
3304
|
+
const error = ref6(null);
|
|
3305
|
+
const isConnected = ref6(false);
|
|
3306
|
+
const partial = ref6("");
|
|
3307
|
+
const reconnect = shallowRef9(stream.reconnect);
|
|
3308
|
+
const sessionId = ref6(stream.sessionId);
|
|
3309
|
+
const status = ref6(stream.status);
|
|
3310
|
+
const turns = shallowRef9([]);
|
|
2925
3311
|
const sync = () => {
|
|
2926
3312
|
assistantAudio.value = [...stream.assistantAudio];
|
|
2927
3313
|
assistantTexts.value = [...stream.assistantTexts];
|
|
@@ -2940,7 +3326,7 @@ function useVoiceStream(path, options = {}) {
|
|
|
2940
3326
|
unsubscribe();
|
|
2941
3327
|
stream.close();
|
|
2942
3328
|
};
|
|
2943
|
-
|
|
3329
|
+
onUnmounted10(destroy);
|
|
2944
3330
|
return {
|
|
2945
3331
|
assistantAudio,
|
|
2946
3332
|
assistantTexts,
|
|
@@ -2959,7 +3345,7 @@ function useVoiceStream(path, options = {}) {
|
|
|
2959
3345
|
};
|
|
2960
3346
|
}
|
|
2961
3347
|
// src/vue/useVoiceController.ts
|
|
2962
|
-
import { onUnmounted as
|
|
3348
|
+
import { onUnmounted as onUnmounted11, ref as ref7, shallowRef as shallowRef10 } from "vue";
|
|
2963
3349
|
|
|
2964
3350
|
// src/client/htmx.ts
|
|
2965
3351
|
var DEFAULT_EVENT_NAME = "voice-refresh";
|
|
@@ -3605,17 +3991,17 @@ var createVoiceController = (path, options = {}) => {
|
|
|
3605
3991
|
// src/vue/useVoiceController.ts
|
|
3606
3992
|
function useVoiceController(path, options = {}) {
|
|
3607
3993
|
const controller = createVoiceController(path, options);
|
|
3608
|
-
const assistantAudio =
|
|
3609
|
-
const assistantTexts =
|
|
3610
|
-
const error =
|
|
3611
|
-
const isConnected =
|
|
3612
|
-
const isRecording =
|
|
3613
|
-
const partial =
|
|
3614
|
-
const reconnect =
|
|
3615
|
-
const recordingError =
|
|
3616
|
-
const sessionId =
|
|
3617
|
-
const status =
|
|
3618
|
-
const turns =
|
|
3994
|
+
const assistantAudio = shallowRef10([]);
|
|
3995
|
+
const assistantTexts = shallowRef10([]);
|
|
3996
|
+
const error = ref7(null);
|
|
3997
|
+
const isConnected = ref7(false);
|
|
3998
|
+
const isRecording = ref7(false);
|
|
3999
|
+
const partial = ref7("");
|
|
4000
|
+
const reconnect = shallowRef10(controller.reconnect);
|
|
4001
|
+
const recordingError = ref7(null);
|
|
4002
|
+
const sessionId = ref7(controller.sessionId);
|
|
4003
|
+
const status = ref7(controller.status);
|
|
4004
|
+
const turns = shallowRef10([]);
|
|
3619
4005
|
const sync = () => {
|
|
3620
4006
|
assistantAudio.value = [...controller.assistantAudio];
|
|
3621
4007
|
assistantTexts.value = [...controller.assistantTexts];
|
|
@@ -3635,7 +4021,7 @@ function useVoiceController(path, options = {}) {
|
|
|
3635
4021
|
unsubscribe();
|
|
3636
4022
|
controller.close();
|
|
3637
4023
|
};
|
|
3638
|
-
|
|
4024
|
+
onUnmounted11(destroy);
|
|
3639
4025
|
return {
|
|
3640
4026
|
assistantAudio,
|
|
3641
4027
|
assistantTexts,
|
|
@@ -3658,7 +4044,7 @@ function useVoiceController(path, options = {}) {
|
|
|
3658
4044
|
};
|
|
3659
4045
|
}
|
|
3660
4046
|
// src/vue/useVoiceTraceTimeline.ts
|
|
3661
|
-
import { onUnmounted as
|
|
4047
|
+
import { onUnmounted as onUnmounted12, ref as ref8, shallowRef as shallowRef11 } from "vue";
|
|
3662
4048
|
|
|
3663
4049
|
// src/client/traceTimeline.ts
|
|
3664
4050
|
var fetchVoiceTraceTimeline = async (path = "/api/voice-traces", options = {}) => {
|
|
@@ -3743,10 +4129,10 @@ var createVoiceTraceTimelineStore = (path = "/api/voice-traces", options = {}) =
|
|
|
3743
4129
|
// src/vue/useVoiceTraceTimeline.ts
|
|
3744
4130
|
function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
|
|
3745
4131
|
const store = createVoiceTraceTimelineStore(path, options);
|
|
3746
|
-
const error =
|
|
3747
|
-
const isLoading =
|
|
3748
|
-
const report =
|
|
3749
|
-
const updatedAt =
|
|
4132
|
+
const error = ref8(null);
|
|
4133
|
+
const isLoading = ref8(false);
|
|
4134
|
+
const report = shallowRef11(null);
|
|
4135
|
+
const updatedAt = ref8(undefined);
|
|
3750
4136
|
const sync = () => {
|
|
3751
4137
|
const snapshot = store.getSnapshot();
|
|
3752
4138
|
error.value = snapshot.error;
|
|
@@ -3757,7 +4143,7 @@ function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
|
|
|
3757
4143
|
const unsubscribe = store.subscribe(sync);
|
|
3758
4144
|
sync();
|
|
3759
4145
|
store.refresh().catch(() => {});
|
|
3760
|
-
|
|
4146
|
+
onUnmounted12(() => {
|
|
3761
4147
|
unsubscribe();
|
|
3762
4148
|
store.close();
|
|
3763
4149
|
});
|
|
@@ -3770,7 +4156,7 @@ function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
|
|
|
3770
4156
|
};
|
|
3771
4157
|
}
|
|
3772
4158
|
// src/vue/useVoiceWorkflowStatus.ts
|
|
3773
|
-
import { onUnmounted as
|
|
4159
|
+
import { onUnmounted as onUnmounted13, ref as ref9, shallowRef as shallowRef12 } from "vue";
|
|
3774
4160
|
|
|
3775
4161
|
// src/client/workflowStatus.ts
|
|
3776
4162
|
var fetchVoiceWorkflowStatus = async (path = "/evals/scenarios/json", options = {}) => {
|
|
@@ -3854,10 +4240,10 @@ var createVoiceWorkflowStatusStore = (path = "/evals/scenarios/json", options =
|
|
|
3854
4240
|
// src/vue/useVoiceWorkflowStatus.ts
|
|
3855
4241
|
function useVoiceWorkflowStatus(path = "/evals/scenarios/json", options = {}) {
|
|
3856
4242
|
const store = createVoiceWorkflowStatusStore(path, options);
|
|
3857
|
-
const error =
|
|
3858
|
-
const isLoading =
|
|
3859
|
-
const report =
|
|
3860
|
-
const updatedAt =
|
|
4243
|
+
const error = ref9(null);
|
|
4244
|
+
const isLoading = ref9(false);
|
|
4245
|
+
const report = shallowRef12(undefined);
|
|
4246
|
+
const updatedAt = ref9(undefined);
|
|
3861
4247
|
const sync = () => {
|
|
3862
4248
|
const snapshot = store.getSnapshot();
|
|
3863
4249
|
error.value = snapshot.error;
|
|
@@ -3870,7 +4256,7 @@ function useVoiceWorkflowStatus(path = "/evals/scenarios/json", options = {}) {
|
|
|
3870
4256
|
if (typeof window !== "undefined") {
|
|
3871
4257
|
store.refresh().catch(() => {});
|
|
3872
4258
|
}
|
|
3873
|
-
|
|
4259
|
+
onUnmounted13(() => {
|
|
3874
4260
|
unsubscribe();
|
|
3875
4261
|
store.close();
|
|
3876
4262
|
});
|
|
@@ -3893,6 +4279,7 @@ export {
|
|
|
3893
4279
|
useVoiceProviderSimulationControls,
|
|
3894
4280
|
useVoiceProviderCapabilities,
|
|
3895
4281
|
useVoiceOpsStatus,
|
|
4282
|
+
useVoiceDeliveryRuntime,
|
|
3896
4283
|
useVoiceController,
|
|
3897
4284
|
useVoiceCampaignDialerProof,
|
|
3898
4285
|
VoiceTurnQuality,
|
|
@@ -3901,5 +4288,6 @@ export {
|
|
|
3901
4288
|
VoiceProviderStatus,
|
|
3902
4289
|
VoiceProviderSimulationControls,
|
|
3903
4290
|
VoiceProviderCapabilities,
|
|
3904
|
-
VoiceOpsStatus
|
|
4291
|
+
VoiceOpsStatus,
|
|
4292
|
+
VoiceDeliveryRuntime
|
|
3905
4293
|
};
|