@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/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("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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 &middot; ${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 defineComponent2, h as h2 } from "vue";
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 escapeHtml2 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
846
+ var escapeHtml3 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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="${escapeHtml2(provider.provider)}"${!model.canSimulateFailure || snapshot.isRunning ? " disabled" : ""}>Simulate ${escapeHtml2(provider.provider)} ${escapeHtml2(formatKind(options.kind))} failure</button>`).join("");
481
- const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${escapeHtml2(provider.provider)}"${snapshot.isRunning ? " disabled" : ""}>Mark ${escapeHtml2(provider.provider)} recovered</button>`).join("");
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">${escapeHtml2(model.title)}</span>
485
- <strong class="absolute-voice-provider-simulation__label">${escapeHtml2(model.label)}</strong>
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">${escapeHtml2(model.description)}</p>
488
- ${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml2(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
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">${escapeHtml2(snapshot.error)}</p>` : ""}
491
- ${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml2(model.resultText)}</pre>` : ""}
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 onUnmounted2, ref as ref2 } from "vue";
943
+ import { onUnmounted as onUnmounted3, ref as ref3 } from "vue";
558
944
  function useVoiceProviderSimulationControls(options) {
559
945
  const store = createVoiceProviderSimulationControlsStore(options);
560
- const error = ref2(null);
561
- const isRunning = ref2(false);
562
- const lastResult = ref2(null);
563
- const mode = ref2(null);
564
- const provider = ref2(null);
565
- const updatedAt = ref2(undefined);
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
- onUnmounted2(() => {
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 = defineComponent2({
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 () => h2("section", {
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
- h2("header", { class: "absolute-voice-provider-simulation__header" }, [
643
- h2("span", { class: "absolute-voice-provider-simulation__eyebrow" }, model.value.title),
644
- h2("strong", { class: "absolute-voice-provider-simulation__label" }, model.value.label)
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
- h2("p", { class: "absolute-voice-provider-simulation__description" }, model.value.description),
647
- model.value.canSimulateFailure ? null : h2("p", { class: "absolute-voice-provider-simulation__empty" }, props.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure."),
648
- h2("div", { class: "absolute-voice-provider-simulation__actions" }, [
649
- ...model.value.failureProviders.map((provider) => h2("button", {
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) => h2("button", {
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 ? h2("p", { class: "absolute-voice-provider-simulation__error" }, controls.error.value) : null,
663
- model.value.resultText ? h2("pre", { class: "absolute-voice-provider-simulation__result" }, model.value.resultText) : null
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 defineComponent3, h as h3 } from "vue";
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 DEFAULT_TITLE2 = "Provider Capabilities";
751
- var DEFAULT_DESCRIPTION2 = "Configured, selected, and healthy voice providers for this deployment.";
752
- var escapeHtml3 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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 ?? DEFAULT_DESCRIPTION2,
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 ?? DEFAULT_TITLE2,
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--${escapeHtml3(capability.status)}">
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>${escapeHtml3(capability.label)}</strong>
810
- <span>${escapeHtml3(formatStatus(capability.status))}</span>
1195
+ <strong>${escapeHtml4(capability.label)}</strong>
1196
+ <span>${escapeHtml4(formatStatus(capability.status))}</span>
811
1197
  </header>
812
- <p>${escapeHtml3(capability.detail)}</p>
1198
+ <p>${escapeHtml4(capability.detail)}</p>
813
1199
  <dl>${capability.rows.map((row) => `<div>
814
- <dt>${escapeHtml3(row.label)}</dt>
815
- <dd>${escapeHtml3(row.value)}</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--${escapeHtml3(model.status)}">
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">${escapeHtml3(model.title)}</span>
821
- <strong class="absolute-voice-provider-capabilities__label">${escapeHtml3(model.label)}</strong>
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">${escapeHtml3(model.description)}</p>
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">${escapeHtml3(model.error)}</p>` : ""}
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 onUnmounted3, shallowRef as shallowRef2 } from "vue";
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 = shallowRef2(null);
871
- const isLoading = shallowRef2(false);
872
- const report = shallowRef2();
873
- const updatedAt = shallowRef2(undefined);
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
- onUnmounted3(() => {
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 = defineComponent3({
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 () => h3("section", {
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
- h3("header", { class: "absolute-voice-provider-capabilities__header" }, [
943
- h3("span", { class: "absolute-voice-provider-capabilities__eyebrow" }, model.value.title),
944
- h3("strong", { class: "absolute-voice-provider-capabilities__label" }, model.value.label)
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
- h3("p", { class: "absolute-voice-provider-capabilities__description" }, model.value.description),
947
- model.value.capabilities.length ? h3("div", { class: "absolute-voice-provider-capabilities__providers" }, model.value.capabilities.map((capability) => h3("article", {
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
- h3("header", [
955
- h3("strong", capability.label),
956
- h3("span", capability.status)
1340
+ h4("header", [
1341
+ h4("strong", capability.label),
1342
+ h4("span", capability.status)
957
1343
  ]),
958
- h3("p", capability.detail),
959
- h3("dl", capability.rows.map((row) => h3("div", { key: row.label }, [
960
- h3("dt", row.label),
961
- h3("dd", row.value)
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
- ]))) : h3("p", { class: "absolute-voice-provider-capabilities__empty" }, "Configure provider capabilities to see deployment coverage."),
964
- model.value.error ? h3("p", { class: "absolute-voice-provider-capabilities__error" }, model.value.error) : null
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 defineComponent4, h as h4 } from "vue";
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 DEFAULT_TITLE3 = "Voice Providers";
1053
- var DEFAULT_DESCRIPTION3 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
1054
- var escapeHtml4 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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 ?? DEFAULT_DESCRIPTION3,
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 ?? DEFAULT_TITLE3,
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--${escapeHtml4(provider.status)}">
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>${escapeHtml4(provider.label)}</strong>
1113
- <span>${escapeHtml4(formatStatus2(provider.status))}</span>
1498
+ <strong>${escapeHtml5(provider.label)}</strong>
1499
+ <span>${escapeHtml5(formatStatus2(provider.status))}</span>
1114
1500
  </header>
1115
- <p>${escapeHtml4(provider.detail)}</p>
1501
+ <p>${escapeHtml5(provider.detail)}</p>
1116
1502
  <dl>${provider.rows.map((row) => `<div>
1117
- <dt>${escapeHtml4(row.label)}</dt>
1118
- <dd>${escapeHtml4(row.value)}</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--${escapeHtml4(model.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">${escapeHtml4(model.title)}</span>
1124
- <strong class="absolute-voice-provider-status__label">${escapeHtml4(model.label)}</strong>
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">${escapeHtml4(model.description)}</p>
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">${escapeHtml4(model.error)}</p>` : ""}
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 onUnmounted4, ref as ref3, shallowRef as shallowRef3 } from "vue";
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 = ref3(null);
1174
- const isLoading = ref3(false);
1175
- const providers = shallowRef3([]);
1176
- const updatedAt = ref3(undefined);
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
- onUnmounted4(() => {
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 = defineComponent4({
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 () => h4("section", {
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
- h4("header", { class: "absolute-voice-provider-status__header" }, [
1246
- h4("span", { class: "absolute-voice-provider-status__eyebrow" }, model.value.title),
1247
- h4("strong", { class: "absolute-voice-provider-status__label" }, model.value.label)
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
- h4("p", { class: "absolute-voice-provider-status__description" }, model.value.description),
1250
- model.value.providers.length ? h4("div", { class: "absolute-voice-provider-status__providers" }, model.value.providers.map((provider) => h4("article", {
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
- h4("header", [
1258
- h4("strong", provider.label),
1259
- h4("span", provider.status)
1643
+ h5("header", [
1644
+ h5("strong", provider.label),
1645
+ h5("span", provider.status)
1260
1646
  ]),
1261
- h4("p", provider.detail),
1262
- h4("dl", provider.rows.map((row) => h4("div", { key: row.label }, [
1263
- h4("dt", row.label),
1264
- h4("dd", row.value)
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
- ]))) : h4("p", { class: "absolute-voice-provider-status__empty" }, "Run voice traffic to see provider health."),
1267
- model.value.error ? h4("p", { class: "absolute-voice-provider-status__error" }, model.value.error) : null
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 defineComponent5, h as h5 } from "vue";
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 DEFAULT_TITLE4 = "Voice Routing";
1356
- var DEFAULT_DESCRIPTION4 = "Latest provider routing decision from the self-hosted trace store.";
1357
- var escapeHtml5 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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 ?? DEFAULT_DESCRIPTION4,
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 ?? DEFAULT_TITLE4,
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>${escapeHtml5(row.label)}</span>
1395
- <strong>${escapeHtml5(row.value)}</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--${escapeHtml5(model.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">${escapeHtml5(model.title)}</span>
1400
- <strong class="absolute-voice-routing-status__label">${escapeHtml5(model.label)}</strong>
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">${escapeHtml5(model.description)}</p>
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">${escapeHtml5(model.error)}</p>` : ""}
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 onUnmounted5, ref as ref4, shallowRef as shallowRef4 } from "vue";
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 = shallowRef4(null);
1450
- const error = ref4(null);
1451
- const isLoading = ref4(false);
1452
- const updatedAt = ref4(undefined);
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
- onUnmounted5(() => {
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 = defineComponent5({
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 () => h5("section", {
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
- h5("header", { class: "absolute-voice-routing-status__header" }, [
1522
- h5("span", { class: "absolute-voice-routing-status__eyebrow" }, model.value.title),
1523
- h5("strong", { class: "absolute-voice-routing-status__label" }, model.value.label)
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
- h5("p", { class: "absolute-voice-routing-status__description" }, model.value.description),
1526
- model.value.rows.length ? h5("div", { class: "absolute-voice-routing-status__grid" }, model.value.rows.map((row) => h5("div", { key: row.label }, [
1527
- h5("span", row.label),
1528
- h5("strong", row.value)
1529
- ]))) : h5("p", { class: "absolute-voice-routing-status__empty" }, "Start a voice session to see the selected provider."),
1530
- model.value.error ? h5("p", { class: "absolute-voice-routing-status__error" }, model.value.error) : null
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 defineComponent6, h as h6 } from "vue";
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 DEFAULT_TITLE5 = "Turn Latency";
1642
- var DEFAULT_DESCRIPTION5 = "Per-turn timing from first transcript to commit and assistant response start.";
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 escapeHtml6 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2030
+ var escapeHtml7 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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 ?? DEFAULT_DESCRIPTION5,
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 ?? DEFAULT_TITLE5,
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--${escapeHtml6(turn.status)}">
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>${escapeHtml6(turn.label)}</strong>
1675
- <span>${escapeHtml6(turn.status)}</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>${escapeHtml6(row.label)}</dt>
1679
- <dd>${escapeHtml6(row.value)}</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--${escapeHtml6(model.status)}">
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">${escapeHtml6(model.title)}</span>
1685
- <strong class="absolute-voice-turn-latency__label">${escapeHtml6(model.label)}</strong>
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">${escapeHtml6(model.description)}</p>
1688
- ${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml6(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</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">${escapeHtml6(model.error)}</p>` : ""}
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 onUnmounted6, shallowRef as shallowRef5 } from "vue";
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 = shallowRef5(null);
1745
- const isLoading = shallowRef5(false);
1746
- const report = shallowRef5();
1747
- const updatedAt = shallowRef5(undefined);
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
- onUnmounted6(() => {
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 = defineComponent6({
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 () => h6("section", {
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
- h6("header", { class: "absolute-voice-turn-latency__header" }, [
1807
- h6("span", { class: "absolute-voice-turn-latency__eyebrow" }, model.value.title),
1808
- h6("strong", { class: "absolute-voice-turn-latency__label" }, model.value.label)
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
- h6("p", { class: "absolute-voice-turn-latency__description" }, model.value.description),
1811
- model.value.showProofAction ? h6("button", {
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 ? h6("div", { class: "absolute-voice-turn-latency__turns" }, model.value.turns.map((turn) => h6("article", {
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
- h6("header", [
1826
- h6("strong", turn.label),
1827
- h6("span", turn.status)
2211
+ h7("header", [
2212
+ h7("strong", turn.label),
2213
+ h7("span", turn.status)
1828
2214
  ]),
1829
- h6("dl", turn.rows.map((row) => h6("div", { key: row.label }, [
1830
- h6("dt", row.label),
1831
- h6("dd", row.value)
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
- ]))) : h6("p", { class: "absolute-voice-turn-latency__empty" }, "Complete a voice turn to see latency diagnostics."),
1834
- model.value.error ? h6("p", { class: "absolute-voice-turn-latency__error" }, model.value.error) : null
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 defineComponent7, h as h7 } from "vue";
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 DEFAULT_TITLE6 = "Turn Quality";
1922
- var DEFAULT_DESCRIPTION6 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
1923
- var escapeHtml7 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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 ?? DEFAULT_DESCRIPTION6,
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 ?? DEFAULT_TITLE6,
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--${escapeHtml7(turn.status)}">
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>${escapeHtml7(turn.label)}</strong>
1976
- <span>${escapeHtml7(turn.status)}</span>
2361
+ <strong>${escapeHtml8(turn.label)}</strong>
2362
+ <span>${escapeHtml8(turn.status)}</span>
1977
2363
  </header>
1978
- <p>${escapeHtml7(turn.detail)}</p>
2364
+ <p>${escapeHtml8(turn.detail)}</p>
1979
2365
  <dl>${turn.rows.map((row) => `<div>
1980
- <dt>${escapeHtml7(row.label)}</dt>
1981
- <dd>${escapeHtml7(row.value)}</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--${escapeHtml7(model.status)}">
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">${escapeHtml7(model.title)}</span>
1987
- <strong class="absolute-voice-turn-quality__label">${escapeHtml7(model.label)}</strong>
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">${escapeHtml7(model.description)}</p>
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">${escapeHtml7(model.error)}</p>` : ""}
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 onUnmounted7, shallowRef as shallowRef6 } from "vue";
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 = shallowRef6(null);
2037
- const isLoading = shallowRef6(false);
2038
- const report = shallowRef6();
2039
- const updatedAt = shallowRef6(undefined);
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
- onUnmounted7(() => {
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 = defineComponent7({
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 () => h7("section", {
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
- h7("header", { class: "absolute-voice-turn-quality__header" }, [
2088
- h7("span", { class: "absolute-voice-turn-quality__eyebrow" }, model.value.title),
2089
- h7("strong", { class: "absolute-voice-turn-quality__label" }, model.value.label)
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
- h7("p", { class: "absolute-voice-turn-quality__description" }, model.value.description),
2092
- model.value.turns.length ? h7("div", { class: "absolute-voice-turn-quality__turns" }, model.value.turns.map((turn) => h7("article", {
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
- h7("header", [
2100
- h7("strong", turn.label),
2101
- h7("span", turn.status)
2485
+ h8("header", [
2486
+ h8("strong", turn.label),
2487
+ h8("span", turn.status)
2102
2488
  ]),
2103
- h7("p", turn.detail),
2104
- h7("dl", turn.rows.map((row) => h7("div", { key: row.label }, [
2105
- h7("dt", row.label),
2106
- h7("dd", row.value)
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
- ]))) : h7("p", { class: "absolute-voice-turn-quality__empty" }, "Complete a voice turn to see STT quality diagnostics."),
2109
- model.value.error ? h7("p", { class: "absolute-voice-turn-quality__error" }, model.value.error) : null
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 onUnmounted8, shallowRef as shallowRef7 } from "vue";
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 = shallowRef7(null);
2238
- const isLoading = shallowRef7(false);
2239
- const report = shallowRef7();
2240
- const status = shallowRef7();
2241
- const updatedAt = shallowRef7(undefined);
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
- onUnmounted8(() => {
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 onUnmounted9, ref as ref5, shallowRef as shallowRef8 } from "vue";
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 = shallowRef8([]);
2916
- const assistantTexts = shallowRef8([]);
2917
- const call = shallowRef8(null);
2918
- const error = ref5(null);
2919
- const isConnected = ref5(false);
2920
- const partial = ref5("");
2921
- const reconnect = shallowRef8(stream.reconnect);
2922
- const sessionId = ref5(stream.sessionId);
2923
- const status = ref5(stream.status);
2924
- const turns = shallowRef8([]);
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
- onUnmounted9(destroy);
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 onUnmounted10, ref as ref6, shallowRef as shallowRef9 } from "vue";
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 = shallowRef9([]);
3609
- const assistantTexts = shallowRef9([]);
3610
- const error = ref6(null);
3611
- const isConnected = ref6(false);
3612
- const isRecording = ref6(false);
3613
- const partial = ref6("");
3614
- const reconnect = shallowRef9(controller.reconnect);
3615
- const recordingError = ref6(null);
3616
- const sessionId = ref6(controller.sessionId);
3617
- const status = ref6(controller.status);
3618
- const turns = shallowRef9([]);
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
- onUnmounted10(destroy);
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 onUnmounted11, ref as ref7, shallowRef as shallowRef10 } from "vue";
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 = ref7(null);
3747
- const isLoading = ref7(false);
3748
- const report = shallowRef10(null);
3749
- const updatedAt = ref7(undefined);
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
- onUnmounted11(() => {
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 onUnmounted12, ref as ref8, shallowRef as shallowRef11 } from "vue";
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 = ref8(null);
3858
- const isLoading = ref8(false);
3859
- const report = shallowRef11(undefined);
3860
- const updatedAt = ref8(undefined);
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
- onUnmounted12(() => {
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
  };