@absolutejs/voice 0.0.22-beta.453 → 0.0.22-beta.454

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
@@ -3335,6 +3335,33 @@ var maxNumber = (values) => {
3335
3335
  const finite = values.filter((value) => typeof value === "number" && Number.isFinite(value));
3336
3336
  return finite.length > 0 ? Math.max(...finite) : undefined;
3337
3337
  };
3338
+ var buildVoiceReconnectProfileEvidenceSummary = (evidence, options = {}) => {
3339
+ const profileId = options.profileId ?? "reconnect-resume";
3340
+ const filtered = evidence.filter((record) => record.profileId === profileId).sort((left, right) => {
3341
+ const leftAt = Date.parse(left.generatedAt ?? left.createdAt);
3342
+ const rightAt = Date.parse(right.generatedAt ?? right.createdAt);
3343
+ return (Number.isFinite(rightAt) ? rightAt : 0) - (Number.isFinite(leftAt) ? leftAt : 0);
3344
+ });
3345
+ const latest = filtered[0];
3346
+ const sampleCount = filtered.reduce((total, record) => total + (record.reconnect?.samples ?? 1), 0);
3347
+ const snapshotCount = filtered.reduce((total, record) => total + (record.reconnect?.snapshotCount ?? 0), 0);
3348
+ const resumeLatencyP95Ms = maxNumber(filtered.map((record) => record.reconnect?.resumeLatencyP95Ms));
3349
+ const failed = filtered.some((record) => record.ok === false || record.reconnect?.status === "fail");
3350
+ const passed = filtered.some((record) => record.ok === true && record.reconnect?.resumed === true && record.reconnect?.reconnected === true);
3351
+ const status = filtered.length === 0 ? "empty" : failed ? "fail" : passed ? "pass" : "warn";
3352
+ return {
3353
+ evidence: filtered,
3354
+ generatedAt: options.generatedAt ?? new Date().toISOString(),
3355
+ latest,
3356
+ ok: status === "pass",
3357
+ profileId,
3358
+ resumeLatencyP95Ms,
3359
+ sampleCount,
3360
+ snapshotCount,
3361
+ sourceHref: options.sourceHref,
3362
+ status
3363
+ };
3364
+ };
3338
3365
  var percentile = (values, rank) => {
3339
3366
  const finite = values.filter((value) => Number.isFinite(value)).sort((left, right) => left - right);
3340
3367
  if (finite.length === 0) {
@@ -5821,8 +5848,290 @@ var VoiceProofTrends = defineComponent5({
5821
5848
  };
5822
5849
  }
5823
5850
  });
5851
+ // src/vue/VoiceReconnectProfileEvidence.ts
5852
+ import { defineComponent as defineComponent6, h as h6 } from "vue";
5853
+
5854
+ // src/client/reconnectProfileEvidence.ts
5855
+ var fetchVoiceReconnectProfileEvidence = async (path = "/api/voice/reconnect-profile-evidence", options = {}) => {
5856
+ const fetchImpl = options.fetch ?? globalThis.fetch;
5857
+ const response = await fetchImpl(path);
5858
+ if (!response.ok) {
5859
+ throw new Error(`Voice reconnect profile evidence failed: HTTP ${response.status}`);
5860
+ }
5861
+ return await response.json();
5862
+ };
5863
+ var createVoiceReconnectProfileEvidenceStore = (path = "/api/voice/reconnect-profile-evidence", options = {}) => {
5864
+ const listeners = new Set;
5865
+ let closed = false;
5866
+ let timer;
5867
+ let snapshot = {
5868
+ error: null,
5869
+ isLoading: false
5870
+ };
5871
+ const emit = () => {
5872
+ for (const listener of listeners) {
5873
+ listener();
5874
+ }
5875
+ };
5876
+ const refresh = async () => {
5877
+ if (closed) {
5878
+ return snapshot.report;
5879
+ }
5880
+ snapshot = { ...snapshot, error: null, isLoading: true };
5881
+ emit();
5882
+ try {
5883
+ const report = await fetchVoiceReconnectProfileEvidence(path, options);
5884
+ snapshot = {
5885
+ error: null,
5886
+ isLoading: false,
5887
+ report,
5888
+ updatedAt: Date.now()
5889
+ };
5890
+ emit();
5891
+ return report;
5892
+ } catch (error) {
5893
+ snapshot = {
5894
+ ...snapshot,
5895
+ error: error instanceof Error ? error.message : String(error),
5896
+ isLoading: false
5897
+ };
5898
+ emit();
5899
+ throw error;
5900
+ }
5901
+ };
5902
+ const close = () => {
5903
+ closed = true;
5904
+ if (timer) {
5905
+ clearInterval(timer);
5906
+ timer = undefined;
5907
+ }
5908
+ listeners.clear();
5909
+ };
5910
+ if (typeof window !== "undefined" && options.intervalMs && options.intervalMs > 0) {
5911
+ timer = setInterval(() => {
5912
+ refresh().catch(() => {});
5913
+ }, options.intervalMs);
5914
+ }
5915
+ return {
5916
+ close,
5917
+ getServerSnapshot: () => snapshot,
5918
+ getSnapshot: () => snapshot,
5919
+ refresh,
5920
+ subscribe: (listener) => {
5921
+ listeners.add(listener);
5922
+ return () => {
5923
+ listeners.delete(listener);
5924
+ };
5925
+ }
5926
+ };
5927
+ };
5928
+
5929
+ // src/client/reconnectProfileEvidenceWidget.ts
5930
+ var DEFAULT_TITLE6 = "Persisted Reconnect Evidence";
5931
+ var DEFAULT_DESCRIPTION6 = "Real browser reconnect/resume evidence persisted into profile history so recovery claims are backed by durable traces.";
5932
+ var DEFAULT_LINKS3 = [
5933
+ { href: "/voice/reconnect-contract", label: "Reconnect contract" },
5934
+ {
5935
+ href: "/api/voice/real-call-profile-history",
5936
+ label: "Profile history JSON"
5937
+ }
5938
+ ];
5939
+ var escapeHtml11 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5940
+ var formatMs2 = (value) => typeof value === "number" && Number.isFinite(value) ? `${Math.round(value)}ms` : "n/a";
5941
+ var formatCount = (value) => new Intl.NumberFormat("en-US").format(value);
5942
+ var formatAge = (value) => {
5943
+ if (!value) {
5944
+ return "No evidence";
5945
+ }
5946
+ const elapsedMs = Date.now() - Date.parse(value);
5947
+ if (!Number.isFinite(elapsedMs) || elapsedMs < 0) {
5948
+ return "Just now";
5949
+ }
5950
+ const minutes = Math.floor(elapsedMs / 60000);
5951
+ if (minutes < 1) {
5952
+ return "Just now";
5953
+ }
5954
+ if (minutes < 60) {
5955
+ return `${minutes}m ago`;
5956
+ }
5957
+ const hours = Math.floor(minutes / 60);
5958
+ if (hours < 24) {
5959
+ return `${hours}h ago`;
5960
+ }
5961
+ return `${Math.floor(hours / 24)}d ago`;
5962
+ };
5963
+ var createVoiceReconnectProfileEvidenceViewModel = (snapshot, options = {}) => {
5964
+ const report = snapshot.report;
5965
+ const latest = report?.latest;
5966
+ const latestAt = latest?.generatedAt ?? latest?.createdAt;
5967
+ return {
5968
+ description: options.description ?? latest?.profileDescription ?? DEFAULT_DESCRIPTION6,
5969
+ error: snapshot.error,
5970
+ isLoading: snapshot.isLoading,
5971
+ label: snapshot.error ? "Unavailable" : report ? report.status === "pass" ? "Reconnect evidence passing" : report.status === "warn" ? "Reconnect evidence incomplete" : report.status === "fail" ? "Reconnect evidence failing" : "Waiting for reconnect evidence" : snapshot.isLoading ? "Checking" : "No reconnect evidence",
5972
+ latest: latest ? {
5973
+ profileLabel: latest.profileLabel ?? latest.profileId,
5974
+ sessionId: latest.sessionId,
5975
+ surfaces: (latest.surfaces ?? []).join(", ") || "browser"
5976
+ } : undefined,
5977
+ links: options.links ?? DEFAULT_LINKS3,
5978
+ metrics: [
5979
+ { label: "Samples", value: formatCount(report?.sampleCount ?? 0) },
5980
+ { label: "Snapshots", value: formatCount(report?.snapshotCount ?? 0) },
5981
+ {
5982
+ label: "Resume p95",
5983
+ value: formatMs2(report?.resumeLatencyP95Ms ?? latest?.reconnect?.resumeLatencyP95Ms)
5984
+ },
5985
+ { label: "Last proof", value: formatAge(latestAt) }
5986
+ ],
5987
+ status: snapshot.error ? "error" : report ? report.status === "pass" ? "ready" : report.status === "empty" ? "empty" : "warning" : snapshot.isLoading ? "loading" : "empty",
5988
+ title: options.title ?? DEFAULT_TITLE6
5989
+ };
5990
+ };
5991
+ var renderVoiceReconnectProfileEvidenceHTML = (snapshot, options = {}) => {
5992
+ const model = createVoiceReconnectProfileEvidenceViewModel(snapshot, options);
5993
+ const metrics = `<div class="absolute-voice-reconnect-evidence__metrics">${model.metrics.map((metric) => `<article>
5994
+ <span>${escapeHtml11(metric.label)}</span>
5995
+ <strong>${escapeHtml11(metric.value)}</strong>
5996
+ </article>`).join("")}</div>`;
5997
+ const latest = model.latest ? `<p class="absolute-voice-reconnect-evidence__latest">Latest ${escapeHtml11(model.latest.profileLabel)} \xB7 ${escapeHtml11(model.latest.sessionId)} \xB7 ${escapeHtml11(model.latest.surfaces)}</p>` : `<p class="absolute-voice-reconnect-evidence__empty">No persisted reconnect profile evidence yet.</p>`;
5998
+ const links = model.links.length ? `<p class="absolute-voice-reconnect-evidence__links">${model.links.map((link) => `<a href="${escapeHtml11(link.href)}">${escapeHtml11(link.label)}</a>`).join("")}</p>` : "";
5999
+ return `<section class="absolute-voice-reconnect-evidence absolute-voice-reconnect-evidence--${escapeHtml11(model.status)}">
6000
+ <header class="absolute-voice-reconnect-evidence__header">
6001
+ <span class="absolute-voice-reconnect-evidence__eyebrow">${escapeHtml11(model.title)}</span>
6002
+ <strong class="absolute-voice-reconnect-evidence__label">${escapeHtml11(model.label)}</strong>
6003
+ </header>
6004
+ <p class="absolute-voice-reconnect-evidence__description">${escapeHtml11(model.description)}</p>
6005
+ ${metrics}
6006
+ ${latest}
6007
+ ${links}
6008
+ ${model.error ? `<p class="absolute-voice-reconnect-evidence__error">${escapeHtml11(model.error)}</p>` : ""}
6009
+ </section>`;
6010
+ };
6011
+ var getVoiceReconnectProfileEvidenceCSS = () => `.absolute-voice-reconnect-evidence{border:1px solid #bae6fd;border-radius:20px;background:#f0f9ff;color:#0f172a;padding:18px;box-shadow:0 18px 40px rgba(14,165,233,.12);font-family:inherit}.absolute-voice-reconnect-evidence--warning,.absolute-voice-reconnect-evidence--error{border-color:#fbbf24;background:#fffbeb}.absolute-voice-reconnect-evidence__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-reconnect-evidence__eyebrow{color:#0369a1;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-reconnect-evidence__label{font-size:24px;line-height:1}.absolute-voice-reconnect-evidence__description,.absolute-voice-reconnect-evidence__empty,.absolute-voice-reconnect-evidence__latest{color:#475569}.absolute-voice-reconnect-evidence__metrics{display:grid;gap:10px;grid-template-columns:repeat(4,minmax(0,1fr));margin-top:14px}.absolute-voice-reconnect-evidence__metrics article{background:#fff;border:1px solid #bae6fd;border-radius:16px;padding:12px}.absolute-voice-reconnect-evidence__metrics span{color:#64748b;display:block;font-size:11px;font-weight:800;text-transform:uppercase}.absolute-voice-reconnect-evidence__metrics strong{display:block;font-size:20px;margin-top:4px}.absolute-voice-reconnect-evidence__links{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 0}.absolute-voice-reconnect-evidence__links a{border:1px solid #7dd3fc;border-radius:999px;color:#0369a1;font-weight:800;padding:6px 10px;text-decoration:none}.absolute-voice-reconnect-evidence__error{color:#9f1239;font-weight:700}@media (max-width:720px){.absolute-voice-reconnect-evidence__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}`;
6012
+ var mountVoiceReconnectProfileEvidence = (element, path = "/api/voice/reconnect-profile-evidence", options = {}) => {
6013
+ const store = createVoiceReconnectProfileEvidenceStore(path, options);
6014
+ const render = () => {
6015
+ element.innerHTML = renderVoiceReconnectProfileEvidenceHTML(store.getSnapshot(), options);
6016
+ };
6017
+ const unsubscribe = store.subscribe(render);
6018
+ render();
6019
+ store.refresh().catch(() => {});
6020
+ return {
6021
+ close: () => {
6022
+ unsubscribe();
6023
+ store.close();
6024
+ },
6025
+ refresh: store.refresh
6026
+ };
6027
+ };
6028
+ var defineVoiceReconnectProfileEvidenceElement = (tagName = "absolute-voice-reconnect-profile-evidence") => {
6029
+ if (typeof window === "undefined" || typeof customElements === "undefined" || customElements.get(tagName)) {
6030
+ return;
6031
+ }
6032
+ customElements.define(tagName, class AbsoluteVoiceReconnectProfileEvidenceElement extends HTMLElement {
6033
+ mounted;
6034
+ connectedCallback() {
6035
+ const intervalMs = Number(this.getAttribute("interval-ms") ?? 5000);
6036
+ this.mounted = mountVoiceReconnectProfileEvidence(this, this.getAttribute("path") ?? "/api/voice/reconnect-profile-evidence", {
6037
+ description: this.getAttribute("description") ?? undefined,
6038
+ intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000,
6039
+ title: this.getAttribute("title") ?? undefined
6040
+ });
6041
+ }
6042
+ disconnectedCallback() {
6043
+ this.mounted?.close();
6044
+ this.mounted = undefined;
6045
+ }
6046
+ });
6047
+ };
6048
+
6049
+ // src/vue/useVoiceReconnectProfileEvidence.ts
6050
+ import { onUnmounted as onUnmounted6, ref as ref6, shallowRef as shallowRef6 } from "vue";
6051
+ function useVoiceReconnectProfileEvidence(path = "/api/voice/reconnect-profile-evidence", options = {}) {
6052
+ const store = createVoiceReconnectProfileEvidenceStore(path, options);
6053
+ const error = ref6(null);
6054
+ const isLoading = ref6(false);
6055
+ const report = shallowRef6(undefined);
6056
+ const updatedAt = ref6(undefined);
6057
+ const sync = () => {
6058
+ const snapshot = store.getSnapshot();
6059
+ error.value = snapshot.error;
6060
+ isLoading.value = snapshot.isLoading;
6061
+ report.value = snapshot.report;
6062
+ updatedAt.value = snapshot.updatedAt;
6063
+ };
6064
+ const unsubscribe = store.subscribe(sync);
6065
+ sync();
6066
+ if (typeof window !== "undefined") {
6067
+ store.refresh().catch(() => {});
6068
+ }
6069
+ onUnmounted6(() => {
6070
+ unsubscribe();
6071
+ store.close();
6072
+ });
6073
+ return {
6074
+ error,
6075
+ isLoading,
6076
+ refresh: store.refresh,
6077
+ report,
6078
+ updatedAt
6079
+ };
6080
+ }
6081
+
6082
+ // src/vue/VoiceReconnectProfileEvidence.ts
6083
+ var VoiceReconnectProfileEvidence = defineComponent6({
6084
+ name: "VoiceReconnectProfileEvidence",
6085
+ props: {
6086
+ description: String,
6087
+ intervalMs: Number,
6088
+ path: {
6089
+ default: "/api/voice/reconnect-profile-evidence",
6090
+ type: String
6091
+ },
6092
+ title: String
6093
+ },
6094
+ setup(props) {
6095
+ const state = useVoiceReconnectProfileEvidence(props.path, {
6096
+ description: props.description,
6097
+ intervalMs: props.intervalMs,
6098
+ title: props.title
6099
+ });
6100
+ return () => {
6101
+ const model = createVoiceReconnectProfileEvidenceViewModel({
6102
+ error: state.error.value,
6103
+ isLoading: state.isLoading.value,
6104
+ report: state.report.value,
6105
+ updatedAt: state.updatedAt.value
6106
+ }, {
6107
+ description: props.description,
6108
+ intervalMs: props.intervalMs,
6109
+ title: props.title
6110
+ });
6111
+ return h6("section", {
6112
+ class: [
6113
+ "absolute-voice-reconnect-evidence",
6114
+ `absolute-voice-reconnect-evidence--${model.status}`
6115
+ ]
6116
+ }, [
6117
+ h6("header", { class: "absolute-voice-reconnect-evidence__header" }, [
6118
+ h6("span", { class: "absolute-voice-reconnect-evidence__eyebrow" }, model.title),
6119
+ h6("strong", { class: "absolute-voice-reconnect-evidence__label" }, model.label)
6120
+ ]),
6121
+ h6("p", { class: "absolute-voice-reconnect-evidence__description" }, model.description),
6122
+ h6("div", { class: "absolute-voice-reconnect-evidence__metrics" }, model.metrics.map((metric) => h6("article", { key: metric.label }, [
6123
+ h6("span", metric.label),
6124
+ h6("strong", metric.value)
6125
+ ]))),
6126
+ model.latest ? h6("p", { class: "absolute-voice-reconnect-evidence__latest" }, `Latest ${model.latest.profileLabel} \xB7 ${model.latest.sessionId} \xB7 ${model.latest.surfaces}`) : h6("p", { class: "absolute-voice-reconnect-evidence__empty" }, "No persisted reconnect profile evidence yet."),
6127
+ model.links.length ? h6("p", { class: "absolute-voice-reconnect-evidence__links" }, model.links.map((link) => h6("a", { href: link.href, key: link.href }, link.label))) : null,
6128
+ model.error ? h6("p", { class: "absolute-voice-reconnect-evidence__error" }, model.error) : null
6129
+ ]);
6130
+ };
6131
+ }
6132
+ });
5824
6133
  // src/vue/VoiceCallDebuggerLaunch.ts
5825
- import { computed as computed2, defineComponent as defineComponent6, h as h6 } from "vue";
6134
+ import { computed as computed2, defineComponent as defineComponent7, h as h7 } from "vue";
5826
6135
 
5827
6136
  // src/client/callDebugger.ts
5828
6137
  var fetchVoiceCallDebugger = async (path, options = {}) => {
@@ -5900,10 +6209,10 @@ var createVoiceCallDebuggerStore = (path, options = {}) => {
5900
6209
  };
5901
6210
 
5902
6211
  // src/client/callDebuggerWidget.ts
5903
- var DEFAULT_TITLE6 = "Call Debugger";
5904
- var DEFAULT_DESCRIPTION6 = "Open the latest call artifact with snapshot, operations record, failure replay, provider path, transcript, and incident markdown.";
6212
+ var DEFAULT_TITLE7 = "Call Debugger";
6213
+ var DEFAULT_DESCRIPTION7 = "Open the latest call artifact with snapshot, operations record, failure replay, provider path, transcript, and incident markdown.";
5905
6214
  var DEFAULT_LINK_LABEL = "Open debugger";
5906
- var escapeHtml11 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6215
+ var escapeHtml12 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5907
6216
  var defaultHref = (path, report) => {
5908
6217
  if (path.startsWith("/api/voice-call-debugger/")) {
5909
6218
  return path.replace("/api/voice-call-debugger/", "/voice-call-debugger/");
@@ -5920,7 +6229,7 @@ var createVoiceCallDebuggerLaunchViewModel = (path, state, options = {}) => {
5920
6229
  const report = state.report;
5921
6230
  const href = resolveHref(path, state, options);
5922
6231
  return {
5923
- description: options.description ?? DEFAULT_DESCRIPTION6,
6232
+ description: options.description ?? DEFAULT_DESCRIPTION7,
5924
6233
  error: state.error,
5925
6234
  href,
5926
6235
  isLoading: state.isLoading,
@@ -5949,25 +6258,25 @@ var createVoiceCallDebuggerLaunchViewModel = (path, state, options = {}) => {
5949
6258
  { label: "Snapshot", value: report.snapshot.status }
5950
6259
  ] : [],
5951
6260
  status: state.error ? "error" : report ? report.status === "healthy" ? "ready" : "warning" : state.isLoading ? "loading" : "empty",
5952
- title: options.title ?? DEFAULT_TITLE6,
6261
+ title: options.title ?? DEFAULT_TITLE7,
5953
6262
  updatedAt: state.updatedAt
5954
6263
  };
5955
6264
  };
5956
6265
  var renderVoiceCallDebuggerLaunchHTML = (path, state, options = {}) => {
5957
6266
  const model = createVoiceCallDebuggerLaunchViewModel(path, state, options);
5958
6267
  const rows = model.rows.length ? `<dl>${model.rows.map((row) => `<div>
5959
- <dt>${escapeHtml11(row.label)}</dt>
5960
- <dd>${escapeHtml11(row.value)}</dd>
6268
+ <dt>${escapeHtml12(row.label)}</dt>
6269
+ <dd>${escapeHtml12(row.value)}</dd>
5961
6270
  </div>`).join("")}</dl>` : '<p class="absolute-voice-call-debugger-launch__empty">Load a call debugger report to see the latest support artifact.</p>';
5962
- return `<section class="absolute-voice-call-debugger-launch absolute-voice-call-debugger-launch--${escapeHtml11(model.status)}">
6271
+ return `<section class="absolute-voice-call-debugger-launch absolute-voice-call-debugger-launch--${escapeHtml12(model.status)}">
5963
6272
  <header class="absolute-voice-call-debugger-launch__header">
5964
- <span class="absolute-voice-call-debugger-launch__eyebrow">${escapeHtml11(model.title)}</span>
5965
- <strong class="absolute-voice-call-debugger-launch__label">${escapeHtml11(model.label)}</strong>
6273
+ <span class="absolute-voice-call-debugger-launch__eyebrow">${escapeHtml12(model.title)}</span>
6274
+ <strong class="absolute-voice-call-debugger-launch__label">${escapeHtml12(model.label)}</strong>
5966
6275
  </header>
5967
- <p class="absolute-voice-call-debugger-launch__description">${escapeHtml11(model.description)}</p>
5968
- <a class="absolute-voice-call-debugger-launch__link" href="${escapeHtml11(model.href)}">${escapeHtml11(options.linkLabel ?? DEFAULT_LINK_LABEL)}</a>
6276
+ <p class="absolute-voice-call-debugger-launch__description">${escapeHtml12(model.description)}</p>
6277
+ <a class="absolute-voice-call-debugger-launch__link" href="${escapeHtml12(model.href)}">${escapeHtml12(options.linkLabel ?? DEFAULT_LINK_LABEL)}</a>
5969
6278
  ${rows}
5970
- ${model.error ? `<p class="absolute-voice-call-debugger-launch__error">${escapeHtml11(model.error)}</p>` : ""}
6279
+ ${model.error ? `<p class="absolute-voice-call-debugger-launch__error">${escapeHtml12(model.error)}</p>` : ""}
5971
6280
  </section>`;
5972
6281
  };
5973
6282
  var mountVoiceCallDebuggerLaunch = (element, path, options = {}) => {
@@ -6010,13 +6319,13 @@ var defineVoiceCallDebuggerLaunchElement = (tagName = "absolute-voice-call-debug
6010
6319
  };
6011
6320
 
6012
6321
  // src/vue/useVoiceCallDebugger.ts
6013
- import { computed, onUnmounted as onUnmounted6, shallowRef as shallowRef6 } from "vue";
6322
+ import { computed, onUnmounted as onUnmounted7, shallowRef as shallowRef7 } from "vue";
6014
6323
  function useVoiceCallDebugger(path, options = {}) {
6015
6324
  const store = createVoiceCallDebuggerStore(path, options);
6016
- const error = shallowRef6(null);
6017
- const isLoading = shallowRef6(false);
6018
- const report = shallowRef6();
6019
- const updatedAt = shallowRef6();
6325
+ const error = shallowRef7(null);
6326
+ const isLoading = shallowRef7(false);
6327
+ const report = shallowRef7();
6328
+ const updatedAt = shallowRef7();
6020
6329
  const sync = () => {
6021
6330
  const state = store.getSnapshot();
6022
6331
  error.value = state.error;
@@ -6027,7 +6336,7 @@ function useVoiceCallDebugger(path, options = {}) {
6027
6336
  const unsubscribe = store.subscribe(sync);
6028
6337
  sync();
6029
6338
  store.refresh().catch(() => {});
6030
- onUnmounted6(() => {
6339
+ onUnmounted7(() => {
6031
6340
  unsubscribe();
6032
6341
  store.close();
6033
6342
  });
@@ -6042,7 +6351,7 @@ function useVoiceCallDebugger(path, options = {}) {
6042
6351
  }
6043
6352
 
6044
6353
  // src/vue/VoiceCallDebuggerLaunch.ts
6045
- var VoiceCallDebuggerLaunch = defineComponent6({
6354
+ var VoiceCallDebuggerLaunch = defineComponent7({
6046
6355
  name: "VoiceCallDebuggerLaunch",
6047
6356
  props: {
6048
6357
  class: { default: "", type: String },
@@ -6068,32 +6377,32 @@ var VoiceCallDebuggerLaunch = defineComponent6({
6068
6377
  report: state.report.value,
6069
6378
  updatedAt: state.updatedAt.value
6070
6379
  }, options));
6071
- return () => h6("section", {
6380
+ return () => h7("section", {
6072
6381
  class: [
6073
6382
  "absolute-voice-call-debugger-launch",
6074
6383
  `absolute-voice-call-debugger-launch--${model.value.status}`,
6075
6384
  props.class
6076
6385
  ]
6077
6386
  }, [
6078
- h6("header", { class: "absolute-voice-call-debugger-launch__header" }, [
6079
- h6("span", { class: "absolute-voice-call-debugger-launch__eyebrow" }, model.value.title),
6080
- h6("strong", { class: "absolute-voice-call-debugger-launch__label" }, model.value.label)
6387
+ h7("header", { class: "absolute-voice-call-debugger-launch__header" }, [
6388
+ h7("span", { class: "absolute-voice-call-debugger-launch__eyebrow" }, model.value.title),
6389
+ h7("strong", { class: "absolute-voice-call-debugger-launch__label" }, model.value.label)
6081
6390
  ]),
6082
- h6("p", { class: "absolute-voice-call-debugger-launch__description" }, model.value.description),
6083
- h6("a", {
6391
+ h7("p", { class: "absolute-voice-call-debugger-launch__description" }, model.value.description),
6392
+ h7("a", {
6084
6393
  class: "absolute-voice-call-debugger-launch__link",
6085
6394
  href: model.value.href
6086
6395
  }, props.linkLabel ?? "Open debugger"),
6087
- model.value.rows.length ? h6("dl", model.value.rows.map((row) => h6("div", { key: row.label }, [
6088
- h6("dt", row.label),
6089
- h6("dd", row.value)
6090
- ]))) : h6("p", { class: "absolute-voice-call-debugger-launch__empty" }, "Load a call debugger report to see the latest support artifact."),
6091
- model.value.error ? h6("p", { class: "absolute-voice-call-debugger-launch__error" }, model.value.error) : null
6396
+ model.value.rows.length ? h7("dl", model.value.rows.map((row) => h7("div", { key: row.label }, [
6397
+ h7("dt", row.label),
6398
+ h7("dd", row.value)
6399
+ ]))) : h7("p", { class: "absolute-voice-call-debugger-launch__empty" }, "Load a call debugger report to see the latest support artifact."),
6400
+ model.value.error ? h7("p", { class: "absolute-voice-call-debugger-launch__error" }, model.value.error) : null
6092
6401
  ]);
6093
6402
  }
6094
6403
  });
6095
6404
  // src/vue/VoiceSessionSnapshot.ts
6096
- import { computed as computed3, defineComponent as defineComponent7, h as h7 } from "vue";
6405
+ import { computed as computed3, defineComponent as defineComponent8, h as h8 } from "vue";
6097
6406
 
6098
6407
  // src/client/sessionSnapshot.ts
6099
6408
  var withTurnId = (path, turnId) => {
@@ -6189,10 +6498,10 @@ var createVoiceSessionSnapshotStore = (path, options = {}) => {
6189
6498
  };
6190
6499
 
6191
6500
  // src/client/sessionSnapshotWidget.ts
6192
- var DEFAULT_TITLE7 = "Session Snapshot";
6193
- var DEFAULT_DESCRIPTION7 = "Portable call artifact with media graph, provider routing, proof, quality, and telephony evidence.";
6501
+ var DEFAULT_TITLE8 = "Session Snapshot";
6502
+ var DEFAULT_DESCRIPTION8 = "Portable call artifact with media graph, provider routing, proof, quality, and telephony evidence.";
6194
6503
  var DEFAULT_DOWNLOAD_LABEL = "Download snapshot";
6195
- var escapeHtml12 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6504
+ var escapeHtml13 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6196
6505
  var formatStatus2 = (status) => status ?? "n/a";
6197
6506
  var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
6198
6507
  const snapshot = state.snapshot;
@@ -6208,7 +6517,7 @@ var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
6208
6517
  label: artifact.label,
6209
6518
  status: formatStatus2(artifact.status)
6210
6519
  })) ?? [],
6211
- description: options.description ?? DEFAULT_DESCRIPTION7,
6520
+ description: options.description ?? DEFAULT_DESCRIPTION8,
6212
6521
  error: state.error,
6213
6522
  isLoading: state.isLoading,
6214
6523
  label: state.error ? "Unavailable" : snapshot ? `${snapshot.status} \xB7 ${snapshot.sessionId}` : state.isLoading ? "Loading" : "No snapshot",
@@ -6235,30 +6544,30 @@ var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
6235
6544
  ] : [],
6236
6545
  showDownload: snapshot !== undefined,
6237
6546
  status: state.error ? "error" : snapshot ? snapshot.status === "pass" ? "ready" : "warning" : state.isLoading ? "loading" : "empty",
6238
- title: options.title ?? DEFAULT_TITLE7,
6547
+ title: options.title ?? DEFAULT_TITLE8,
6239
6548
  updatedAt: state.updatedAt
6240
6549
  };
6241
6550
  };
6242
6551
  var renderVoiceSessionSnapshotHTML = (state, options = {}) => {
6243
6552
  const model = createVoiceSessionSnapshotViewModel(state, options);
6244
6553
  const rows = model.rows.length ? `<dl>${model.rows.map((row) => `<div>
6245
- <dt>${escapeHtml12(row.label)}</dt>
6246
- <dd>${escapeHtml12(row.value)}</dd>
6554
+ <dt>${escapeHtml13(row.label)}</dt>
6555
+ <dd>${escapeHtml13(row.value)}</dd>
6247
6556
  </div>`).join("")}</dl>` : '<p class="absolute-voice-session-snapshot__empty">Load a session snapshot to see support diagnostics.</p>';
6248
6557
  const artifacts = model.artifacts.length ? `<div class="absolute-voice-session-snapshot__artifacts">${model.artifacts.map((artifact) => {
6249
- const body = `<strong>${escapeHtml12(artifact.label)}</strong><span>${escapeHtml12(artifact.status)}</span>`;
6250
- return artifact.href ? `<a href="${escapeHtml12(artifact.href)}">${body}</a>` : `<div>${body}</div>`;
6558
+ const body = `<strong>${escapeHtml13(artifact.label)}</strong><span>${escapeHtml13(artifact.status)}</span>`;
6559
+ return artifact.href ? `<a href="${escapeHtml13(artifact.href)}">${body}</a>` : `<div>${body}</div>`;
6251
6560
  }).join("")}</div>` : "";
6252
- return `<section class="absolute-voice-session-snapshot absolute-voice-session-snapshot--${escapeHtml12(model.status)}">
6561
+ return `<section class="absolute-voice-session-snapshot absolute-voice-session-snapshot--${escapeHtml13(model.status)}">
6253
6562
  <header class="absolute-voice-session-snapshot__header">
6254
- <span class="absolute-voice-session-snapshot__eyebrow">${escapeHtml12(model.title)}</span>
6255
- <strong class="absolute-voice-session-snapshot__label">${escapeHtml12(model.label)}</strong>
6563
+ <span class="absolute-voice-session-snapshot__eyebrow">${escapeHtml13(model.title)}</span>
6564
+ <strong class="absolute-voice-session-snapshot__label">${escapeHtml13(model.label)}</strong>
6256
6565
  </header>
6257
- <p class="absolute-voice-session-snapshot__description">${escapeHtml12(model.description)}</p>
6258
- ${model.showDownload ? `<button class="absolute-voice-session-snapshot__download" data-absolute-voice-session-snapshot-download type="button">${escapeHtml12(options.downloadLabel ?? DEFAULT_DOWNLOAD_LABEL)}</button>` : ""}
6566
+ <p class="absolute-voice-session-snapshot__description">${escapeHtml13(model.description)}</p>
6567
+ ${model.showDownload ? `<button class="absolute-voice-session-snapshot__download" data-absolute-voice-session-snapshot-download type="button">${escapeHtml13(options.downloadLabel ?? DEFAULT_DOWNLOAD_LABEL)}</button>` : ""}
6259
6568
  ${rows}
6260
6569
  ${artifacts}
6261
- ${model.error ? `<p class="absolute-voice-session-snapshot__error">${escapeHtml12(model.error)}</p>` : ""}
6570
+ ${model.error ? `<p class="absolute-voice-session-snapshot__error">${escapeHtml13(model.error)}</p>` : ""}
6262
6571
  </section>`;
6263
6572
  };
6264
6573
  var downloadBlob = (blob, filename) => {
@@ -6322,13 +6631,13 @@ var defineVoiceSessionSnapshotElement = (tagName = "absolute-voice-session-snaps
6322
6631
  };
6323
6632
 
6324
6633
  // src/vue/useVoiceSessionSnapshot.ts
6325
- import { onUnmounted as onUnmounted7, shallowRef as shallowRef7 } from "vue";
6634
+ import { onUnmounted as onUnmounted8, shallowRef as shallowRef8 } from "vue";
6326
6635
  function useVoiceSessionSnapshot(path, options = {}) {
6327
6636
  const store = createVoiceSessionSnapshotStore(path, options);
6328
- const error = shallowRef7(null);
6329
- const isLoading = shallowRef7(false);
6330
- const snapshot = shallowRef7();
6331
- const updatedAt = shallowRef7(undefined);
6637
+ const error = shallowRef8(null);
6638
+ const isLoading = shallowRef8(false);
6639
+ const snapshot = shallowRef8();
6640
+ const updatedAt = shallowRef8(undefined);
6332
6641
  const sync = () => {
6333
6642
  const state = store.getSnapshot();
6334
6643
  error.value = state.error;
@@ -6339,7 +6648,7 @@ function useVoiceSessionSnapshot(path, options = {}) {
6339
6648
  const unsubscribe = store.subscribe(sync);
6340
6649
  sync();
6341
6650
  store.refresh().catch(() => {});
6342
- onUnmounted7(() => {
6651
+ onUnmounted8(() => {
6343
6652
  unsubscribe();
6344
6653
  store.close();
6345
6654
  });
@@ -6354,7 +6663,7 @@ function useVoiceSessionSnapshot(path, options = {}) {
6354
6663
  }
6355
6664
 
6356
6665
  // src/vue/VoiceSessionSnapshot.ts
6357
- var VoiceSessionSnapshot = defineComponent7({
6666
+ var VoiceSessionSnapshot = defineComponent8({
6358
6667
  name: "VoiceSessionSnapshot",
6359
6668
  props: {
6360
6669
  class: { default: "", type: String },
@@ -6380,33 +6689,33 @@ var VoiceSessionSnapshot = defineComponent7({
6380
6689
  snapshot: state.snapshot.value,
6381
6690
  updatedAt: state.updatedAt.value
6382
6691
  }, options));
6383
- return () => h7("section", {
6692
+ return () => h8("section", {
6384
6693
  class: [
6385
6694
  "absolute-voice-session-snapshot",
6386
6695
  `absolute-voice-session-snapshot--${model.value.status}`,
6387
6696
  props.class
6388
6697
  ]
6389
6698
  }, [
6390
- h7("header", { class: "absolute-voice-session-snapshot__header" }, [
6391
- h7("span", { class: "absolute-voice-session-snapshot__eyebrow" }, model.value.title),
6392
- h7("strong", { class: "absolute-voice-session-snapshot__label" }, model.value.label)
6699
+ h8("header", { class: "absolute-voice-session-snapshot__header" }, [
6700
+ h8("span", { class: "absolute-voice-session-snapshot__eyebrow" }, model.value.title),
6701
+ h8("strong", { class: "absolute-voice-session-snapshot__label" }, model.value.label)
6393
6702
  ]),
6394
- h7("p", { class: "absolute-voice-session-snapshot__description" }, model.value.description),
6395
- model.value.showDownload ? h7("button", {
6703
+ h8("p", { class: "absolute-voice-session-snapshot__description" }, model.value.description),
6704
+ model.value.showDownload ? h8("button", {
6396
6705
  class: "absolute-voice-session-snapshot__download",
6397
6706
  onClick: () => state.download(),
6398
6707
  type: "button"
6399
6708
  }, props.downloadLabel ?? "Download snapshot") : null,
6400
- model.value.rows.length ? h7("dl", model.value.rows.map((row) => h7("div", { key: row.label }, [
6401
- h7("dt", row.label),
6402
- h7("dd", row.value)
6403
- ]))) : h7("p", { class: "absolute-voice-session-snapshot__empty" }, "Load a session snapshot to see support diagnostics."),
6404
- model.value.error ? h7("p", { class: "absolute-voice-session-snapshot__error" }, model.value.error) : null
6709
+ model.value.rows.length ? h8("dl", model.value.rows.map((row) => h8("div", { key: row.label }, [
6710
+ h8("dt", row.label),
6711
+ h8("dd", row.value)
6712
+ ]))) : h8("p", { class: "absolute-voice-session-snapshot__empty" }, "Load a session snapshot to see support diagnostics."),
6713
+ model.value.error ? h8("p", { class: "absolute-voice-session-snapshot__error" }, model.value.error) : null
6405
6714
  ]);
6406
6715
  }
6407
6716
  });
6408
6717
  // src/vue/VoiceReadinessFailures.ts
6409
- import { defineComponent as defineComponent8, h as h8 } from "vue";
6718
+ import { defineComponent as defineComponent9, h as h9 } from "vue";
6410
6719
 
6411
6720
  // src/client/readinessFailures.ts
6412
6721
  var fetchVoiceReadinessFailures = async (path = "/api/production-readiness", options = {}) => {
@@ -6484,13 +6793,13 @@ var createVoiceReadinessFailuresStore = (path = "/api/production-readiness", opt
6484
6793
  };
6485
6794
 
6486
6795
  // src/client/readinessFailuresWidget.ts
6487
- var DEFAULT_TITLE8 = "Readiness Gate Explanations";
6488
- var DEFAULT_DESCRIPTION8 = "Structured reasons for calibrated production-readiness warnings and failures.";
6489
- var DEFAULT_LINKS3 = [
6796
+ var DEFAULT_TITLE9 = "Readiness Gate Explanations";
6797
+ var DEFAULT_DESCRIPTION9 = "Structured reasons for calibrated production-readiness warnings and failures.";
6798
+ var DEFAULT_LINKS4 = [
6490
6799
  { href: "/production-readiness", label: "Readiness page" },
6491
6800
  { href: "/voice/slo-readiness-thresholds", label: "Gate thresholds" }
6492
6801
  ];
6493
- var escapeHtml13 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6802
+ var escapeHtml14 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6494
6803
  var formatExplanationValue = (value, unit) => {
6495
6804
  if (value === undefined || value === null) {
6496
6805
  return "n/a";
@@ -6518,36 +6827,36 @@ var createVoiceReadinessFailuresViewModel = (snapshot, options = {}) => {
6518
6827
  const failures = snapshot.report?.checks.map(toFailureView).filter((value) => !!value) ?? [];
6519
6828
  const hasOpenIssues = failures.length > 0;
6520
6829
  return {
6521
- description: options.description ?? DEFAULT_DESCRIPTION8,
6830
+ description: options.description ?? DEFAULT_DESCRIPTION9,
6522
6831
  error: snapshot.error,
6523
6832
  failures,
6524
6833
  isLoading: snapshot.isLoading,
6525
6834
  label: snapshot.error ? "Unavailable" : snapshot.report ? hasOpenIssues ? `${failures.length} calibrated gate issue(s)` : "No calibrated gate issues" : snapshot.isLoading ? "Checking" : "No readiness report",
6526
- links: options.links ?? DEFAULT_LINKS3,
6835
+ links: options.links ?? DEFAULT_LINKS4,
6527
6836
  status: snapshot.error ? "error" : snapshot.report ? hasOpenIssues ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
6528
- title: options.title ?? DEFAULT_TITLE8,
6837
+ title: options.title ?? DEFAULT_TITLE9,
6529
6838
  updatedAt: snapshot.updatedAt
6530
6839
  };
6531
6840
  };
6532
6841
  var renderVoiceReadinessFailuresHTML = (snapshot, options = {}) => {
6533
6842
  const model = createVoiceReadinessFailuresViewModel(snapshot, options);
6534
- const failures = model.failures.length ? `<div class="absolute-voice-readiness-failures__items">${model.failures.map((failure) => `<article class="absolute-voice-readiness-failures__item absolute-voice-readiness-failures__item--${escapeHtml13(failure.status)}">
6535
- <span>${escapeHtml13(failure.status.toUpperCase())}</span>
6536
- <strong>${escapeHtml13(failure.label)}</strong>
6537
- <p>Observed ${escapeHtml13(failure.observed)} against ${escapeHtml13(failure.thresholdLabel)} ${escapeHtml13(failure.threshold)}.</p>
6538
- <p>${escapeHtml13(failure.remediation)}</p>
6539
- <p class="absolute-voice-readiness-failures__links">${failure.evidenceHref ? `<a href="${escapeHtml13(failure.evidenceHref)}">Evidence</a>` : ""}${failure.sourceHref ? `<a href="${escapeHtml13(failure.sourceHref)}">Threshold source</a>` : ""}</p>
6540
- </article>`).join("")}</div>` : `<p class="absolute-voice-readiness-failures__empty">${model.error ? escapeHtml13(model.error) : "No calibrated readiness gate explanations are open."}</p>`;
6541
- const links = model.links.length ? `<p class="absolute-voice-readiness-failures__links">${model.links.map((link) => `<a href="${escapeHtml13(link.href)}">${escapeHtml13(link.label)}</a>`).join("")}</p>` : "";
6542
- return `<section class="absolute-voice-readiness-failures absolute-voice-readiness-failures--${escapeHtml13(model.status)}">
6843
+ const failures = model.failures.length ? `<div class="absolute-voice-readiness-failures__items">${model.failures.map((failure) => `<article class="absolute-voice-readiness-failures__item absolute-voice-readiness-failures__item--${escapeHtml14(failure.status)}">
6844
+ <span>${escapeHtml14(failure.status.toUpperCase())}</span>
6845
+ <strong>${escapeHtml14(failure.label)}</strong>
6846
+ <p>Observed ${escapeHtml14(failure.observed)} against ${escapeHtml14(failure.thresholdLabel)} ${escapeHtml14(failure.threshold)}.</p>
6847
+ <p>${escapeHtml14(failure.remediation)}</p>
6848
+ <p class="absolute-voice-readiness-failures__links">${failure.evidenceHref ? `<a href="${escapeHtml14(failure.evidenceHref)}">Evidence</a>` : ""}${failure.sourceHref ? `<a href="${escapeHtml14(failure.sourceHref)}">Threshold source</a>` : ""}</p>
6849
+ </article>`).join("")}</div>` : `<p class="absolute-voice-readiness-failures__empty">${model.error ? escapeHtml14(model.error) : "No calibrated readiness gate explanations are open."}</p>`;
6850
+ const links = model.links.length ? `<p class="absolute-voice-readiness-failures__links">${model.links.map((link) => `<a href="${escapeHtml14(link.href)}">${escapeHtml14(link.label)}</a>`).join("")}</p>` : "";
6851
+ return `<section class="absolute-voice-readiness-failures absolute-voice-readiness-failures--${escapeHtml14(model.status)}">
6543
6852
  <header class="absolute-voice-readiness-failures__header">
6544
- <span class="absolute-voice-readiness-failures__eyebrow">${escapeHtml13(model.title)}</span>
6545
- <strong class="absolute-voice-readiness-failures__label">${escapeHtml13(model.label)}</strong>
6853
+ <span class="absolute-voice-readiness-failures__eyebrow">${escapeHtml14(model.title)}</span>
6854
+ <strong class="absolute-voice-readiness-failures__label">${escapeHtml14(model.label)}</strong>
6546
6855
  </header>
6547
- <p class="absolute-voice-readiness-failures__description">${escapeHtml13(model.description)}</p>
6856
+ <p class="absolute-voice-readiness-failures__description">${escapeHtml14(model.description)}</p>
6548
6857
  ${failures}
6549
6858
  ${links}
6550
- ${model.error ? `<p class="absolute-voice-readiness-failures__error">${escapeHtml13(model.error)}</p>` : ""}
6859
+ ${model.error ? `<p class="absolute-voice-readiness-failures__error">${escapeHtml14(model.error)}</p>` : ""}
6551
6860
  </section>`;
6552
6861
  };
6553
6862
  var getVoiceReadinessFailuresCSS = () => `.absolute-voice-readiness-failures{border:1px solid #fed7aa;border-radius:20px;background:#fff7ed;color:#1c1917;padding:18px;box-shadow:0 18px 40px rgba(234,88,12,.12);font-family:inherit}.absolute-voice-readiness-failures--ready{border-color:#86efac;background:#f0fdf4}.absolute-voice-readiness-failures--error{border-color:#fda4af;background:#fff1f2}.absolute-voice-readiness-failures__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-readiness-failures__eyebrow{color:#9a3412;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-readiness-failures__label{font-size:24px;line-height:1}.absolute-voice-readiness-failures__description,.absolute-voice-readiness-failures__empty{color:#57534e}.absolute-voice-readiness-failures__items{display:grid;gap:10px;margin-top:14px}.absolute-voice-readiness-failures__item{background:white;border:1px solid #fed7aa;border-radius:16px;padding:12px}.absolute-voice-readiness-failures__item--fail{border-color:#fb7185}.absolute-voice-readiness-failures__item span{color:#9a3412;display:block;font-size:12px;font-weight:900;text-transform:uppercase}.absolute-voice-readiness-failures__item strong{display:block;font-size:18px;margin-top:4px}.absolute-voice-readiness-failures__item p{margin:.45rem 0 0}.absolute-voice-readiness-failures__links{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 0}.absolute-voice-readiness-failures__links a{border:1px solid #fdba74;border-radius:999px;color:#9a3412;font-weight:800;padding:6px 10px;text-decoration:none}.absolute-voice-readiness-failures__error{color:#9f1239;font-weight:700}`;
@@ -6588,13 +6897,13 @@ var defineVoiceReadinessFailuresElement = (tagName = "absolute-voice-readiness-f
6588
6897
  };
6589
6898
 
6590
6899
  // src/vue/useVoiceReadinessFailures.ts
6591
- import { onBeforeUnmount, readonly, ref as ref6 } from "vue";
6900
+ import { onBeforeUnmount, readonly, ref as ref7 } from "vue";
6592
6901
  var useVoiceReadinessFailures = (path = "/api/production-readiness", options = {}) => {
6593
6902
  const store = createVoiceReadinessFailuresStore(path, options);
6594
- const error = ref6(null);
6595
- const isLoading = ref6(false);
6596
- const report = ref6(undefined);
6597
- const updatedAt = ref6(undefined);
6903
+ const error = ref7(null);
6904
+ const isLoading = ref7(false);
6905
+ const report = ref7(undefined);
6906
+ const updatedAt = ref7(undefined);
6598
6907
  const sync = () => {
6599
6908
  const snapshot = store.getSnapshot();
6600
6909
  error.value = snapshot.error;
@@ -6621,7 +6930,7 @@ var useVoiceReadinessFailures = (path = "/api/production-readiness", options = {
6621
6930
  };
6622
6931
 
6623
6932
  // src/vue/VoiceReadinessFailures.ts
6624
- var VoiceReadinessFailures = defineComponent8({
6933
+ var VoiceReadinessFailures = defineComponent9({
6625
6934
  name: "VoiceReadinessFailures",
6626
6935
  props: {
6627
6936
  description: String,
@@ -6649,40 +6958,40 @@ var VoiceReadinessFailures = defineComponent8({
6649
6958
  intervalMs: props.intervalMs,
6650
6959
  title: props.title
6651
6960
  });
6652
- return h8("section", {
6961
+ return h9("section", {
6653
6962
  class: [
6654
6963
  "absolute-voice-readiness-failures",
6655
6964
  `absolute-voice-readiness-failures--${model.status}`
6656
6965
  ]
6657
6966
  }, [
6658
- h8("header", { class: "absolute-voice-readiness-failures__header" }, [
6659
- h8("span", { class: "absolute-voice-readiness-failures__eyebrow" }, model.title),
6660
- h8("strong", { class: "absolute-voice-readiness-failures__label" }, model.label)
6967
+ h9("header", { class: "absolute-voice-readiness-failures__header" }, [
6968
+ h9("span", { class: "absolute-voice-readiness-failures__eyebrow" }, model.title),
6969
+ h9("strong", { class: "absolute-voice-readiness-failures__label" }, model.label)
6661
6970
  ]),
6662
- h8("p", { class: "absolute-voice-readiness-failures__description" }, model.description),
6663
- model.failures.length ? h8("div", { class: "absolute-voice-readiness-failures__items" }, model.failures.map((failure) => h8("article", {
6971
+ h9("p", { class: "absolute-voice-readiness-failures__description" }, model.description),
6972
+ model.failures.length ? h9("div", { class: "absolute-voice-readiness-failures__items" }, model.failures.map((failure) => h9("article", {
6664
6973
  class: [
6665
6974
  "absolute-voice-readiness-failures__item",
6666
6975
  `absolute-voice-readiness-failures__item--${failure.status}`
6667
6976
  ],
6668
6977
  key: failure.label
6669
6978
  }, [
6670
- h8("span", failure.status.toUpperCase()),
6671
- h8("strong", failure.label),
6672
- h8("p", `Observed ${failure.observed} against ${failure.thresholdLabel} ${failure.threshold}.`),
6673
- h8("p", failure.remediation),
6674
- h8("p", { class: "absolute-voice-readiness-failures__links" }, [
6675
- failure.evidenceHref ? h8("a", { href: failure.evidenceHref }, "Evidence") : null,
6676
- failure.sourceHref ? h8("a", { href: failure.sourceHref }, "Threshold source") : null
6979
+ h9("span", failure.status.toUpperCase()),
6980
+ h9("strong", failure.label),
6981
+ h9("p", `Observed ${failure.observed} against ${failure.thresholdLabel} ${failure.threshold}.`),
6982
+ h9("p", failure.remediation),
6983
+ h9("p", { class: "absolute-voice-readiness-failures__links" }, [
6984
+ failure.evidenceHref ? h9("a", { href: failure.evidenceHref }, "Evidence") : null,
6985
+ failure.sourceHref ? h9("a", { href: failure.sourceHref }, "Threshold source") : null
6677
6986
  ])
6678
- ]))) : h8("p", { class: "absolute-voice-readiness-failures__empty" }, model.error ?? "No calibrated readiness gate explanations are open."),
6679
- model.links.length ? h8("p", { class: "absolute-voice-readiness-failures__links" }, model.links.map((link) => h8("a", { href: link.href, key: link.href }, link.label))) : null
6987
+ ]))) : h9("p", { class: "absolute-voice-readiness-failures__empty" }, model.error ?? "No calibrated readiness gate explanations are open."),
6988
+ model.links.length ? h9("p", { class: "absolute-voice-readiness-failures__links" }, model.links.map((link) => h9("a", { href: link.href, key: link.href }, link.label))) : null
6680
6989
  ]);
6681
6990
  };
6682
6991
  }
6683
6992
  });
6684
6993
  // src/vue/VoiceProviderSimulationControls.ts
6685
- import { computed as computed4, defineComponent as defineComponent9, h as h9 } from "vue";
6994
+ import { computed as computed4, defineComponent as defineComponent10, h as h10 } from "vue";
6686
6995
 
6687
6996
  // src/client/providerSimulationControls.ts
6688
6997
  var postSimulation = async (pathPrefix, mode, provider, fetchImpl) => {
@@ -6764,7 +7073,7 @@ var createVoiceProviderSimulationControlsStore = (options) => {
6764
7073
  };
6765
7074
 
6766
7075
  // src/client/providerSimulationControlsWidget.ts
6767
- var escapeHtml14 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7076
+ var escapeHtml15 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6768
7077
  var formatKind = (kind) => (kind ?? "stt").toUpperCase();
6769
7078
  var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
6770
7079
  const configuredProviders = options.providers.filter((provider) => provider.configured !== false);
@@ -6784,18 +7093,18 @@ var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
6784
7093
  };
6785
7094
  var renderVoiceProviderSimulationControlsHTML = (snapshot, options) => {
6786
7095
  const model = createVoiceProviderSimulationControlsViewModel(snapshot, options);
6787
- const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${escapeHtml14(provider.provider)}"${!model.canSimulateFailure || snapshot.isRunning ? " disabled" : ""}>Simulate ${escapeHtml14(provider.provider)} ${escapeHtml14(formatKind(options.kind))} failure</button>`).join("");
6788
- const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${escapeHtml14(provider.provider)}"${snapshot.isRunning ? " disabled" : ""}>Mark ${escapeHtml14(provider.provider)} recovered</button>`).join("");
7096
+ const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${escapeHtml15(provider.provider)}"${!model.canSimulateFailure || snapshot.isRunning ? " disabled" : ""}>Simulate ${escapeHtml15(provider.provider)} ${escapeHtml15(formatKind(options.kind))} failure</button>`).join("");
7097
+ const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${escapeHtml15(provider.provider)}"${snapshot.isRunning ? " disabled" : ""}>Mark ${escapeHtml15(provider.provider)} recovered</button>`).join("");
6789
7098
  return `<section class="absolute-voice-provider-simulation absolute-voice-provider-simulation--${snapshot.error ? "error" : snapshot.isRunning ? "running" : "ready"}">
6790
7099
  <header class="absolute-voice-provider-simulation__header">
6791
- <span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml14(model.title)}</span>
6792
- <strong class="absolute-voice-provider-simulation__label">${escapeHtml14(model.label)}</strong>
7100
+ <span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml15(model.title)}</span>
7101
+ <strong class="absolute-voice-provider-simulation__label">${escapeHtml15(model.label)}</strong>
6793
7102
  </header>
6794
- <p class="absolute-voice-provider-simulation__description">${escapeHtml14(model.description)}</p>
6795
- ${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml14(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
7103
+ <p class="absolute-voice-provider-simulation__description">${escapeHtml15(model.description)}</p>
7104
+ ${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml15(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
6796
7105
  <div class="absolute-voice-provider-simulation__actions">${failureButtons}${recoveryButtons}</div>
6797
- ${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml14(snapshot.error)}</p>` : ""}
6798
- ${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml14(model.resultText)}</pre>` : ""}
7106
+ ${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml15(snapshot.error)}</p>` : ""}
7107
+ ${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml15(model.resultText)}</pre>` : ""}
6799
7108
  </section>`;
6800
7109
  };
6801
7110
  var bindVoiceProviderSimulationControls = (element, store) => {
@@ -6861,15 +7170,15 @@ var defineVoiceProviderSimulationControlsElement = (tagName = "absolute-voice-pr
6861
7170
  };
6862
7171
 
6863
7172
  // src/vue/useVoiceProviderSimulationControls.ts
6864
- import { onUnmounted as onUnmounted8, ref as ref7 } from "vue";
7173
+ import { onUnmounted as onUnmounted9, ref as ref8 } from "vue";
6865
7174
  function useVoiceProviderSimulationControls(options) {
6866
7175
  const store = createVoiceProviderSimulationControlsStore(options);
6867
- const error = ref7(null);
6868
- const isRunning = ref7(false);
6869
- const lastResult = ref7(null);
6870
- const mode = ref7(null);
6871
- const provider = ref7(null);
6872
- const updatedAt = ref7(undefined);
7176
+ const error = ref8(null);
7177
+ const isRunning = ref8(false);
7178
+ const lastResult = ref8(null);
7179
+ const mode = ref8(null);
7180
+ const provider = ref8(null);
7181
+ const updatedAt = ref8(undefined);
6873
7182
  const sync = () => {
6874
7183
  const snapshot = store.getSnapshot();
6875
7184
  error.value = snapshot.error;
@@ -6881,7 +7190,7 @@ function useVoiceProviderSimulationControls(options) {
6881
7190
  };
6882
7191
  const unsubscribe = store.subscribe(sync);
6883
7192
  sync();
6884
- onUnmounted8(() => {
7193
+ onUnmounted9(() => {
6885
7194
  unsubscribe();
6886
7195
  store.close();
6887
7196
  });
@@ -6897,7 +7206,7 @@ function useVoiceProviderSimulationControls(options) {
6897
7206
  }
6898
7207
 
6899
7208
  // src/vue/VoiceProviderSimulationControls.ts
6900
- var VoiceProviderSimulationControls = defineComponent9({
7209
+ var VoiceProviderSimulationControls = defineComponent10({
6901
7210
  name: "VoiceProviderSimulationControls",
6902
7211
  props: {
6903
7212
  class: { default: "", type: String },
@@ -6939,40 +7248,40 @@ var VoiceProviderSimulationControls = defineComponent9({
6939
7248
  const run = (provider, mode) => {
6940
7249
  controls.run(provider, mode).catch(() => {});
6941
7250
  };
6942
- return () => h9("section", {
7251
+ return () => h10("section", {
6943
7252
  class: [
6944
7253
  "absolute-voice-provider-simulation",
6945
7254
  `absolute-voice-provider-simulation--${controls.error.value ? "error" : controls.isRunning.value ? "running" : "ready"}`,
6946
7255
  props.class
6947
7256
  ]
6948
7257
  }, [
6949
- h9("header", { class: "absolute-voice-provider-simulation__header" }, [
6950
- h9("span", { class: "absolute-voice-provider-simulation__eyebrow" }, model.value.title),
6951
- h9("strong", { class: "absolute-voice-provider-simulation__label" }, model.value.label)
7258
+ h10("header", { class: "absolute-voice-provider-simulation__header" }, [
7259
+ h10("span", { class: "absolute-voice-provider-simulation__eyebrow" }, model.value.title),
7260
+ h10("strong", { class: "absolute-voice-provider-simulation__label" }, model.value.label)
6952
7261
  ]),
6953
- h9("p", { class: "absolute-voice-provider-simulation__description" }, model.value.description),
6954
- model.value.canSimulateFailure ? null : h9("p", { class: "absolute-voice-provider-simulation__empty" }, props.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure."),
6955
- h9("div", { class: "absolute-voice-provider-simulation__actions" }, [
6956
- ...model.value.failureProviders.map((provider) => h9("button", {
7262
+ h10("p", { class: "absolute-voice-provider-simulation__description" }, model.value.description),
7263
+ model.value.canSimulateFailure ? null : h10("p", { class: "absolute-voice-provider-simulation__empty" }, props.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure."),
7264
+ h10("div", { class: "absolute-voice-provider-simulation__actions" }, [
7265
+ ...model.value.failureProviders.map((provider) => h10("button", {
6957
7266
  disabled: !model.value.canSimulateFailure || controls.isRunning.value,
6958
7267
  key: `fail-${provider.provider}`,
6959
7268
  onClick: () => run(provider.provider, "failure"),
6960
7269
  type: "button"
6961
7270
  }, `Simulate ${provider.provider} ${props.kind.toUpperCase()} failure`)),
6962
- ...model.value.providers.map((provider) => h9("button", {
7271
+ ...model.value.providers.map((provider) => h10("button", {
6963
7272
  disabled: controls.isRunning.value,
6964
7273
  key: `recover-${provider.provider}`,
6965
7274
  onClick: () => run(provider.provider, "recovery"),
6966
7275
  type: "button"
6967
7276
  }, `Mark ${provider.provider} recovered`))
6968
7277
  ]),
6969
- controls.error.value ? h9("p", { class: "absolute-voice-provider-simulation__error" }, controls.error.value) : null,
6970
- model.value.resultText ? h9("pre", { class: "absolute-voice-provider-simulation__result" }, model.value.resultText) : null
7278
+ controls.error.value ? h10("p", { class: "absolute-voice-provider-simulation__error" }, controls.error.value) : null,
7279
+ model.value.resultText ? h10("pre", { class: "absolute-voice-provider-simulation__result" }, model.value.resultText) : null
6971
7280
  ]);
6972
7281
  }
6973
7282
  });
6974
7283
  // src/vue/VoiceProviderCapabilities.ts
6975
- import { computed as computed5, defineComponent as defineComponent10, h as h10 } from "vue";
7284
+ import { computed as computed5, defineComponent as defineComponent11, h as h11 } from "vue";
6976
7285
 
6977
7286
  // src/client/providerCapabilities.ts
6978
7287
  var fetchVoiceProviderCapabilities = async (path = "/api/provider-capabilities", options = {}) => {
@@ -7054,9 +7363,9 @@ var createVoiceProviderCapabilitiesStore = (path = "/api/provider-capabilities",
7054
7363
  };
7055
7364
 
7056
7365
  // src/client/providerCapabilitiesWidget.ts
7057
- var DEFAULT_TITLE9 = "Provider Capabilities";
7058
- var DEFAULT_DESCRIPTION9 = "Configured, selected, and healthy voice providers for this deployment.";
7059
- var escapeHtml15 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7366
+ var DEFAULT_TITLE10 = "Provider Capabilities";
7367
+ var DEFAULT_DESCRIPTION10 = "Configured, selected, and healthy voice providers for this deployment.";
7368
+ var escapeHtml16 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7060
7369
  var formatProvider = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
7061
7370
  var formatKind2 = (kind) => kind.toUpperCase();
7062
7371
  var formatStatus3 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
@@ -7100,36 +7409,36 @@ var createVoiceProviderCapabilitiesViewModel = (snapshot, options = {}) => {
7100
7409
  const selectedCount = snapshot.report?.selected ?? capabilities.filter((capability) => capability.selected).length;
7101
7410
  return {
7102
7411
  capabilities,
7103
- description: options.description ?? DEFAULT_DESCRIPTION9,
7412
+ description: options.description ?? DEFAULT_DESCRIPTION10,
7104
7413
  error: snapshot.error,
7105
7414
  isLoading: snapshot.isLoading,
7106
7415
  label: snapshot.error ? "Unavailable" : capabilities.length ? warningCount > 0 ? `${warningCount} needs attention` : `${selectedCount} selected` : snapshot.isLoading ? "Checking" : "No capabilities",
7107
7416
  status: snapshot.error ? "error" : capabilities.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
7108
- title: options.title ?? DEFAULT_TITLE9,
7417
+ title: options.title ?? DEFAULT_TITLE10,
7109
7418
  updatedAt: snapshot.updatedAt
7110
7419
  };
7111
7420
  };
7112
7421
  var renderVoiceProviderCapabilitiesHTML = (snapshot, options = {}) => {
7113
7422
  const model = createVoiceProviderCapabilitiesViewModel(snapshot, options);
7114
- 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--${escapeHtml15(capability.status)}">
7423
+ 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--${escapeHtml16(capability.status)}">
7115
7424
  <header>
7116
- <strong>${escapeHtml15(capability.label)}</strong>
7117
- <span>${escapeHtml15(formatStatus3(capability.status))}</span>
7425
+ <strong>${escapeHtml16(capability.label)}</strong>
7426
+ <span>${escapeHtml16(formatStatus3(capability.status))}</span>
7118
7427
  </header>
7119
- <p>${escapeHtml15(capability.detail)}</p>
7428
+ <p>${escapeHtml16(capability.detail)}</p>
7120
7429
  <dl>${capability.rows.map((row) => `<div>
7121
- <dt>${escapeHtml15(row.label)}</dt>
7122
- <dd>${escapeHtml15(row.value)}</dd>
7430
+ <dt>${escapeHtml16(row.label)}</dt>
7431
+ <dd>${escapeHtml16(row.value)}</dd>
7123
7432
  </div>`).join("")}</dl>
7124
7433
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-capabilities__empty">Configure provider capabilities to see deployment coverage.</p>';
7125
- return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${escapeHtml15(model.status)}">
7434
+ return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${escapeHtml16(model.status)}">
7126
7435
  <header class="absolute-voice-provider-capabilities__header">
7127
- <span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml15(model.title)}</span>
7128
- <strong class="absolute-voice-provider-capabilities__label">${escapeHtml15(model.label)}</strong>
7436
+ <span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml16(model.title)}</span>
7437
+ <strong class="absolute-voice-provider-capabilities__label">${escapeHtml16(model.label)}</strong>
7129
7438
  </header>
7130
- <p class="absolute-voice-provider-capabilities__description">${escapeHtml15(model.description)}</p>
7439
+ <p class="absolute-voice-provider-capabilities__description">${escapeHtml16(model.description)}</p>
7131
7440
  ${capabilities}
7132
- ${model.error ? `<p class="absolute-voice-provider-capabilities__error">${escapeHtml15(model.error)}</p>` : ""}
7441
+ ${model.error ? `<p class="absolute-voice-provider-capabilities__error">${escapeHtml16(model.error)}</p>` : ""}
7133
7442
  </section>`;
7134
7443
  };
7135
7444
  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}`;
@@ -7171,13 +7480,13 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
7171
7480
  };
7172
7481
 
7173
7482
  // src/vue/useVoiceProviderCapabilities.ts
7174
- import { onUnmounted as onUnmounted9, shallowRef as shallowRef8 } from "vue";
7483
+ import { onUnmounted as onUnmounted10, shallowRef as shallowRef9 } from "vue";
7175
7484
  function useVoiceProviderCapabilities(path = "/api/provider-capabilities", options = {}) {
7176
7485
  const store = createVoiceProviderCapabilitiesStore(path, options);
7177
- const error = shallowRef8(null);
7178
- const isLoading = shallowRef8(false);
7179
- const report = shallowRef8();
7180
- const updatedAt = shallowRef8(undefined);
7486
+ const error = shallowRef9(null);
7487
+ const isLoading = shallowRef9(false);
7488
+ const report = shallowRef9();
7489
+ const updatedAt = shallowRef9(undefined);
7181
7490
  const sync = () => {
7182
7491
  const snapshot = store.getSnapshot();
7183
7492
  error.value = snapshot.error;
@@ -7188,7 +7497,7 @@ function useVoiceProviderCapabilities(path = "/api/provider-capabilities", optio
7188
7497
  const unsubscribe = store.subscribe(sync);
7189
7498
  sync();
7190
7499
  store.refresh().catch(() => {});
7191
- onUnmounted9(() => {
7500
+ onUnmounted10(() => {
7192
7501
  unsubscribe();
7193
7502
  store.close();
7194
7503
  });
@@ -7202,7 +7511,7 @@ function useVoiceProviderCapabilities(path = "/api/provider-capabilities", optio
7202
7511
  }
7203
7512
 
7204
7513
  // src/vue/VoiceProviderCapabilities.ts
7205
- var VoiceProviderCapabilities = defineComponent10({
7514
+ var VoiceProviderCapabilities = defineComponent11({
7206
7515
  name: "VoiceProviderCapabilities",
7207
7516
  props: {
7208
7517
  class: {
@@ -7239,44 +7548,44 @@ var VoiceProviderCapabilities = defineComponent10({
7239
7548
  report: capabilities.report.value,
7240
7549
  updatedAt: capabilities.updatedAt.value
7241
7550
  }, options));
7242
- return () => h10("section", {
7551
+ return () => h11("section", {
7243
7552
  class: [
7244
7553
  "absolute-voice-provider-capabilities",
7245
7554
  `absolute-voice-provider-capabilities--${model.value.status}`,
7246
7555
  props.class
7247
7556
  ]
7248
7557
  }, [
7249
- h10("header", { class: "absolute-voice-provider-capabilities__header" }, [
7250
- h10("span", { class: "absolute-voice-provider-capabilities__eyebrow" }, model.value.title),
7251
- h10("strong", { class: "absolute-voice-provider-capabilities__label" }, model.value.label)
7558
+ h11("header", { class: "absolute-voice-provider-capabilities__header" }, [
7559
+ h11("span", { class: "absolute-voice-provider-capabilities__eyebrow" }, model.value.title),
7560
+ h11("strong", { class: "absolute-voice-provider-capabilities__label" }, model.value.label)
7252
7561
  ]),
7253
- h10("p", { class: "absolute-voice-provider-capabilities__description" }, model.value.description),
7254
- model.value.capabilities.length ? h10("div", { class: "absolute-voice-provider-capabilities__providers" }, model.value.capabilities.map((capability) => h10("article", {
7562
+ h11("p", { class: "absolute-voice-provider-capabilities__description" }, model.value.description),
7563
+ model.value.capabilities.length ? h11("div", { class: "absolute-voice-provider-capabilities__providers" }, model.value.capabilities.map((capability) => h11("article", {
7255
7564
  class: [
7256
7565
  "absolute-voice-provider-capabilities__provider",
7257
7566
  `absolute-voice-provider-capabilities__provider--${capability.status}`
7258
7567
  ],
7259
7568
  key: `${capability.kind}:${capability.provider}`
7260
7569
  }, [
7261
- h10("header", [
7262
- h10("strong", capability.label),
7263
- h10("span", capability.status)
7570
+ h11("header", [
7571
+ h11("strong", capability.label),
7572
+ h11("span", capability.status)
7264
7573
  ]),
7265
- h10("p", capability.detail),
7266
- h10("dl", capability.rows.map((row) => h10("div", { key: row.label }, [
7267
- h10("dt", row.label),
7268
- h10("dd", row.value)
7574
+ h11("p", capability.detail),
7575
+ h11("dl", capability.rows.map((row) => h11("div", { key: row.label }, [
7576
+ h11("dt", row.label),
7577
+ h11("dd", row.value)
7269
7578
  ])))
7270
- ]))) : h10("p", { class: "absolute-voice-provider-capabilities__empty" }, "Configure provider capabilities to see deployment coverage."),
7271
- model.value.error ? h10("p", { class: "absolute-voice-provider-capabilities__error" }, model.value.error) : null
7579
+ ]))) : h11("p", { class: "absolute-voice-provider-capabilities__empty" }, "Configure provider capabilities to see deployment coverage."),
7580
+ model.value.error ? h11("p", { class: "absolute-voice-provider-capabilities__error" }, model.value.error) : null
7272
7581
  ]);
7273
7582
  }
7274
7583
  });
7275
7584
  // src/vue/VoiceProviderContracts.ts
7276
- import { defineComponent as defineComponent11, h as h11 } from "vue";
7585
+ import { defineComponent as defineComponent12, h as h12 } from "vue";
7277
7586
 
7278
7587
  // src/vue/useVoiceProviderContracts.ts
7279
- import { onUnmounted as onUnmounted10, shallowRef as shallowRef9 } from "vue";
7588
+ import { onUnmounted as onUnmounted11, shallowRef as shallowRef10 } from "vue";
7280
7589
 
7281
7590
  // src/client/providerContracts.ts
7282
7591
  var fetchVoiceProviderContracts = async (path = "/api/provider-contracts", options = {}) => {
@@ -7356,10 +7665,10 @@ var createVoiceProviderContractsStore = (path = "/api/provider-contracts", optio
7356
7665
  // src/vue/useVoiceProviderContracts.ts
7357
7666
  function useVoiceProviderContracts(path = "/api/provider-contracts", options = {}) {
7358
7667
  const store = createVoiceProviderContractsStore(path, options);
7359
- const error = shallowRef9(null);
7360
- const isLoading = shallowRef9(false);
7361
- const report = shallowRef9();
7362
- const updatedAt = shallowRef9(undefined);
7668
+ const error = shallowRef10(null);
7669
+ const isLoading = shallowRef10(false);
7670
+ const report = shallowRef10();
7671
+ const updatedAt = shallowRef10(undefined);
7363
7672
  const sync = () => {
7364
7673
  const snapshot = store.getSnapshot();
7365
7674
  error.value = snapshot.error;
@@ -7370,7 +7679,7 @@ function useVoiceProviderContracts(path = "/api/provider-contracts", options = {
7370
7679
  const unsubscribe = store.subscribe(sync);
7371
7680
  sync();
7372
7681
  store.refresh().catch(() => {});
7373
- onUnmounted10(() => {
7682
+ onUnmounted11(() => {
7374
7683
  unsubscribe();
7375
7684
  store.close();
7376
7685
  });
@@ -7384,9 +7693,9 @@ function useVoiceProviderContracts(path = "/api/provider-contracts", options = {
7384
7693
  }
7385
7694
 
7386
7695
  // src/client/providerContractsWidget.ts
7387
- var DEFAULT_TITLE10 = "Provider Contracts";
7388
- var DEFAULT_DESCRIPTION10 = "Production contract coverage for provider env, latency, fallback, streaming, and capabilities.";
7389
- var escapeHtml16 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7696
+ var DEFAULT_TITLE11 = "Provider Contracts";
7697
+ var DEFAULT_DESCRIPTION11 = "Production contract coverage for provider env, latency, fallback, streaming, and capabilities.";
7698
+ var escapeHtml17 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7390
7699
  var formatProvider2 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
7391
7700
  var formatStatus4 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
7392
7701
  var contractDetail = (row) => {
@@ -7418,38 +7727,38 @@ var createVoiceProviderContractsViewModel = (snapshot, options = {}) => {
7418
7727
  }));
7419
7728
  const warningCount = snapshot.report ? snapshot.report.failed + snapshot.report.warned : rows.filter((row) => row.status !== "pass").length;
7420
7729
  return {
7421
- description: options.description ?? DEFAULT_DESCRIPTION10,
7730
+ description: options.description ?? DEFAULT_DESCRIPTION11,
7422
7731
  error: snapshot.error,
7423
7732
  isLoading: snapshot.isLoading,
7424
7733
  label: snapshot.error ? "Unavailable" : rows.length ? warningCount > 0 ? `${warningCount} needs attention` : `${rows.length} passing` : snapshot.isLoading ? "Checking" : "No contracts",
7425
7734
  rows,
7426
7735
  status: snapshot.error ? "error" : rows.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
7427
- title: options.title ?? DEFAULT_TITLE10,
7736
+ title: options.title ?? DEFAULT_TITLE11,
7428
7737
  updatedAt: snapshot.updatedAt
7429
7738
  };
7430
7739
  };
7431
7740
  var renderVoiceProviderContractsHTML = (snapshot, options = {}) => {
7432
7741
  const model = createVoiceProviderContractsViewModel(snapshot, options);
7433
- const rows = model.rows.length ? `<div class="absolute-voice-provider-contracts__rows">${model.rows.map((row) => `<article class="absolute-voice-provider-contracts__row absolute-voice-provider-contracts__row--${escapeHtml16(row.status)}">
7742
+ const rows = model.rows.length ? `<div class="absolute-voice-provider-contracts__rows">${model.rows.map((row) => `<article class="absolute-voice-provider-contracts__row absolute-voice-provider-contracts__row--${escapeHtml17(row.status)}">
7434
7743
  <header>
7435
- <strong>${escapeHtml16(row.label)}</strong>
7436
- <span>${escapeHtml16(formatStatus4(row.status))}</span>
7744
+ <strong>${escapeHtml17(row.label)}</strong>
7745
+ <span>${escapeHtml17(formatStatus4(row.status))}</span>
7437
7746
  </header>
7438
- <p>${escapeHtml16(row.detail)}</p>
7439
- ${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${escapeHtml16(remediation.href)}">${escapeHtml16(remediation.label)}</a>` : `<strong>${escapeHtml16(remediation.label)}</strong>`}<span>${escapeHtml16(remediation.detail)}</span></li>`).join("")}</ul>` : ""}
7747
+ <p>${escapeHtml17(row.detail)}</p>
7748
+ ${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${escapeHtml17(remediation.href)}">${escapeHtml17(remediation.label)}</a>` : `<strong>${escapeHtml17(remediation.label)}</strong>`}<span>${escapeHtml17(remediation.detail)}</span></li>`).join("")}</ul>` : ""}
7440
7749
  <dl>${row.rows.map((item) => `<div>
7441
- <dt>${escapeHtml16(item.label)}</dt>
7442
- <dd>${escapeHtml16(item.value)}</dd>
7750
+ <dt>${escapeHtml17(item.label)}</dt>
7751
+ <dd>${escapeHtml17(item.value)}</dd>
7443
7752
  </div>`).join("")}</dl>
7444
7753
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-contracts__empty">Configure provider contracts to see production coverage.</p>';
7445
- return `<section class="absolute-voice-provider-contracts absolute-voice-provider-contracts--${escapeHtml16(model.status)}">
7754
+ return `<section class="absolute-voice-provider-contracts absolute-voice-provider-contracts--${escapeHtml17(model.status)}">
7446
7755
  <header class="absolute-voice-provider-contracts__header">
7447
- <span class="absolute-voice-provider-contracts__eyebrow">${escapeHtml16(model.title)}</span>
7448
- <strong class="absolute-voice-provider-contracts__label">${escapeHtml16(model.label)}</strong>
7756
+ <span class="absolute-voice-provider-contracts__eyebrow">${escapeHtml17(model.title)}</span>
7757
+ <strong class="absolute-voice-provider-contracts__label">${escapeHtml17(model.label)}</strong>
7449
7758
  </header>
7450
- <p class="absolute-voice-provider-contracts__description">${escapeHtml16(model.description)}</p>
7759
+ <p class="absolute-voice-provider-contracts__description">${escapeHtml17(model.description)}</p>
7451
7760
  ${rows}
7452
- ${model.error ? `<p class="absolute-voice-provider-contracts__error">${escapeHtml16(model.error)}</p>` : ""}
7761
+ ${model.error ? `<p class="absolute-voice-provider-contracts__error">${escapeHtml17(model.error)}</p>` : ""}
7453
7762
  </section>`;
7454
7763
  };
7455
7764
  var getVoiceProviderContractsCSS = () => `.absolute-voice-provider-contracts{border:1px solid #b8dcc7;border-radius:20px;background:#f7fff9;color:#09140d;padding:18px;box-shadow:0 18px 40px rgba(21,83,45,.12);font-family:inherit}.absolute-voice-provider-contracts--error,.absolute-voice-provider-contracts--warning{border-color:#f2a7a7;background:#fff7f4}.absolute-voice-provider-contracts__header,.absolute-voice-provider-contracts__row header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-provider-contracts__eyebrow{color:#166534;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-provider-contracts__label{font-size:24px;line-height:1}.absolute-voice-provider-contracts__description,.absolute-voice-provider-contracts__row p,.absolute-voice-provider-contracts__row dt,.absolute-voice-provider-contracts__empty{color:#405448}.absolute-voice-provider-contracts__rows{display:grid;gap:12px;margin-top:14px}.absolute-voice-provider-contracts__row{background:#fff;border:1px solid #d6eadb;border-radius:16px;padding:14px}.absolute-voice-provider-contracts__row--pass{border-color:#86efac}.absolute-voice-provider-contracts__row--warn,.absolute-voice-provider-contracts__row--fail{border-color:#f2a7a7}.absolute-voice-provider-contracts__row p{margin:10px 0}.absolute-voice-provider-contracts__remediations{display:grid;gap:8px;list-style:none;margin:0 0 10px;padding:0}.absolute-voice-provider-contracts__remediations li{background:#fff7ed;border:1px solid #fed7aa;border-radius:12px;display:grid;gap:3px;padding:8px}.absolute-voice-provider-contracts__remediations a,.absolute-voice-provider-contracts__remediations strong{color:#9a3412}.absolute-voice-provider-contracts__remediations span{color:#7c2d12}.absolute-voice-provider-contracts__row dl{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin:0}.absolute-voice-provider-contracts__row div{background:#f7fff9;border:1px solid #d6eadb;border-radius:12px;padding:8px}.absolute-voice-provider-contracts__row dt{font-size:12px}.absolute-voice-provider-contracts__row dd{font-weight:800;margin:4px 0 0}.absolute-voice-provider-contracts__error{color:#9f1239;font-weight:700}`;
@@ -7491,7 +7800,7 @@ var defineVoiceProviderContractsElement = (tagName = "absolute-voice-provider-co
7491
7800
  };
7492
7801
 
7493
7802
  // src/vue/VoiceProviderContracts.ts
7494
- var VoiceProviderContracts = defineComponent11({
7803
+ var VoiceProviderContracts = defineComponent12({
7495
7804
  name: "VoiceProviderContracts",
7496
7805
  props: {
7497
7806
  description: String,
@@ -7519,49 +7828,49 @@ var VoiceProviderContracts = defineComponent11({
7519
7828
  intervalMs: props.intervalMs,
7520
7829
  title: props.title
7521
7830
  });
7522
- return h11("section", {
7831
+ return h12("section", {
7523
7832
  class: [
7524
7833
  "absolute-voice-provider-contracts",
7525
7834
  `absolute-voice-provider-contracts--${model.status}`
7526
7835
  ]
7527
7836
  }, [
7528
- h11("header", { class: "absolute-voice-provider-contracts__header" }, [
7529
- h11("span", { class: "absolute-voice-provider-contracts__eyebrow" }, model.title),
7530
- h11("strong", { class: "absolute-voice-provider-contracts__label" }, model.label)
7837
+ h12("header", { class: "absolute-voice-provider-contracts__header" }, [
7838
+ h12("span", { class: "absolute-voice-provider-contracts__eyebrow" }, model.title),
7839
+ h12("strong", { class: "absolute-voice-provider-contracts__label" }, model.label)
7531
7840
  ]),
7532
- h11("p", { class: "absolute-voice-provider-contracts__description" }, model.description),
7533
- model.rows.length ? h11("div", { class: "absolute-voice-provider-contracts__rows" }, model.rows.map((row) => h11("article", {
7841
+ h12("p", { class: "absolute-voice-provider-contracts__description" }, model.description),
7842
+ model.rows.length ? h12("div", { class: "absolute-voice-provider-contracts__rows" }, model.rows.map((row) => h12("article", {
7534
7843
  class: [
7535
7844
  "absolute-voice-provider-contracts__row",
7536
7845
  `absolute-voice-provider-contracts__row--${row.status}`
7537
7846
  ],
7538
7847
  key: `${row.kind}:${row.provider}`
7539
7848
  }, [
7540
- h11("header", [
7541
- h11("strong", row.label),
7542
- h11("span", row.status)
7849
+ h12("header", [
7850
+ h12("strong", row.label),
7851
+ h12("span", row.status)
7543
7852
  ]),
7544
- h11("p", row.detail),
7545
- row.remediations.length ? h11("ul", {
7853
+ h12("p", row.detail),
7854
+ row.remediations.length ? h12("ul", {
7546
7855
  class: "absolute-voice-provider-contracts__remediations"
7547
- }, row.remediations.map((remediation) => h11("li", {
7856
+ }, row.remediations.map((remediation) => h12("li", {
7548
7857
  key: `${row.kind}:${row.provider}:${remediation.label}`
7549
7858
  }, [
7550
- remediation.href ? h11("a", { href: remediation.href }, remediation.label) : h11("strong", remediation.label),
7551
- h11("span", remediation.detail)
7859
+ remediation.href ? h12("a", { href: remediation.href }, remediation.label) : h12("strong", remediation.label),
7860
+ h12("span", remediation.detail)
7552
7861
  ]))) : null,
7553
- h11("dl", row.rows.map((item) => h11("div", { key: item.label }, [
7554
- h11("dt", item.label),
7555
- h11("dd", item.value)
7862
+ h12("dl", row.rows.map((item) => h12("div", { key: item.label }, [
7863
+ h12("dt", item.label),
7864
+ h12("dd", item.value)
7556
7865
  ])))
7557
- ]))) : h11("p", { class: "absolute-voice-provider-contracts__empty" }, "Configure provider contracts to see production coverage."),
7558
- model.error ? h11("p", { class: "absolute-voice-provider-contracts__error" }, model.error) : null
7866
+ ]))) : h12("p", { class: "absolute-voice-provider-contracts__empty" }, "Configure provider contracts to see production coverage."),
7867
+ model.error ? h12("p", { class: "absolute-voice-provider-contracts__error" }, model.error) : null
7559
7868
  ]);
7560
7869
  };
7561
7870
  }
7562
7871
  });
7563
7872
  // src/vue/VoiceProviderStatus.ts
7564
- import { computed as computed6, defineComponent as defineComponent12, h as h12 } from "vue";
7873
+ import { computed as computed6, defineComponent as defineComponent13, h as h13 } from "vue";
7565
7874
 
7566
7875
  // src/client/providerStatus.ts
7567
7876
  var fetchVoiceProviderStatus = async (path = "/api/provider-status", options = {}) => {
@@ -7644,9 +7953,9 @@ var createVoiceProviderStatusStore = (path = "/api/provider-status", options = {
7644
7953
  };
7645
7954
 
7646
7955
  // src/client/providerStatusWidget.ts
7647
- var DEFAULT_TITLE11 = "Voice Providers";
7648
- var DEFAULT_DESCRIPTION11 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
7649
- var escapeHtml17 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7956
+ var DEFAULT_TITLE12 = "Voice Providers";
7957
+ var DEFAULT_DESCRIPTION12 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
7958
+ var escapeHtml18 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7650
7959
  var formatProvider3 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
7651
7960
  var formatStatus5 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
7652
7961
  var formatLatency = (value) => typeof value === "number" ? `${value}ms` : "No samples";
@@ -7690,37 +7999,37 @@ var createVoiceProviderStatusViewModel = (snapshot, options = {}) => {
7690
7999
  const warningCount = providers.filter((provider) => isWarningStatus2(provider.status)).length;
7691
8000
  const healthyCount = providers.filter((provider) => provider.status === "healthy").length;
7692
8001
  return {
7693
- description: options.description ?? DEFAULT_DESCRIPTION11,
8002
+ description: options.description ?? DEFAULT_DESCRIPTION12,
7694
8003
  error: snapshot.error,
7695
8004
  isLoading: snapshot.isLoading,
7696
8005
  label: snapshot.error ? "Unavailable" : providers.length ? warningCount > 0 ? `${warningCount} needs attention` : `${healthyCount} healthy` : snapshot.isLoading ? "Checking" : "No provider traffic",
7697
8006
  providers,
7698
8007
  status: snapshot.error ? "error" : providers.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
7699
- title: options.title ?? DEFAULT_TITLE11,
8008
+ title: options.title ?? DEFAULT_TITLE12,
7700
8009
  updatedAt: snapshot.updatedAt
7701
8010
  };
7702
8011
  };
7703
8012
  var renderVoiceProviderStatusHTML = (snapshot, options = {}) => {
7704
8013
  const model = createVoiceProviderStatusViewModel(snapshot, options);
7705
- 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--${escapeHtml17(provider.status)}">
8014
+ 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--${escapeHtml18(provider.status)}">
7706
8015
  <header>
7707
- <strong>${escapeHtml17(provider.label)}</strong>
7708
- <span>${escapeHtml17(formatStatus5(provider.status))}</span>
8016
+ <strong>${escapeHtml18(provider.label)}</strong>
8017
+ <span>${escapeHtml18(formatStatus5(provider.status))}</span>
7709
8018
  </header>
7710
- <p>${escapeHtml17(provider.detail)}</p>
8019
+ <p>${escapeHtml18(provider.detail)}</p>
7711
8020
  <dl>${provider.rows.map((row) => `<div>
7712
- <dt>${escapeHtml17(row.label)}</dt>
7713
- <dd>${escapeHtml17(row.value)}</dd>
8021
+ <dt>${escapeHtml18(row.label)}</dt>
8022
+ <dd>${escapeHtml18(row.value)}</dd>
7714
8023
  </div>`).join("")}</dl>
7715
8024
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-status__empty">Run voice traffic to see provider health.</p>';
7716
- return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml17(model.status)}">
8025
+ return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml18(model.status)}">
7717
8026
  <header class="absolute-voice-provider-status__header">
7718
- <span class="absolute-voice-provider-status__eyebrow">${escapeHtml17(model.title)}</span>
7719
- <strong class="absolute-voice-provider-status__label">${escapeHtml17(model.label)}</strong>
8027
+ <span class="absolute-voice-provider-status__eyebrow">${escapeHtml18(model.title)}</span>
8028
+ <strong class="absolute-voice-provider-status__label">${escapeHtml18(model.label)}</strong>
7720
8029
  </header>
7721
- <p class="absolute-voice-provider-status__description">${escapeHtml17(model.description)}</p>
8030
+ <p class="absolute-voice-provider-status__description">${escapeHtml18(model.description)}</p>
7722
8031
  ${providers}
7723
- ${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml17(model.error)}</p>` : ""}
8032
+ ${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml18(model.error)}</p>` : ""}
7724
8033
  </section>`;
7725
8034
  };
7726
8035
  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}`;
@@ -7762,13 +8071,13 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
7762
8071
  };
7763
8072
 
7764
8073
  // src/vue/useVoiceProviderStatus.ts
7765
- import { onUnmounted as onUnmounted11, ref as ref8, shallowRef as shallowRef10 } from "vue";
8074
+ import { onUnmounted as onUnmounted12, ref as ref9, shallowRef as shallowRef11 } from "vue";
7766
8075
  function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
7767
8076
  const store = createVoiceProviderStatusStore(path, options);
7768
- const error = ref8(null);
7769
- const isLoading = ref8(false);
7770
- const providers = shallowRef10([]);
7771
- const updatedAt = ref8(undefined);
8077
+ const error = ref9(null);
8078
+ const isLoading = ref9(false);
8079
+ const providers = shallowRef11([]);
8080
+ const updatedAt = ref9(undefined);
7772
8081
  const sync = () => {
7773
8082
  const snapshot = store.getSnapshot();
7774
8083
  error.value = snapshot.error;
@@ -7779,7 +8088,7 @@ function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
7779
8088
  const unsubscribe = store.subscribe(sync);
7780
8089
  sync();
7781
8090
  store.refresh().catch(() => {});
7782
- onUnmounted11(() => {
8091
+ onUnmounted12(() => {
7783
8092
  unsubscribe();
7784
8093
  store.close();
7785
8094
  });
@@ -7793,7 +8102,7 @@ function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
7793
8102
  }
7794
8103
 
7795
8104
  // src/vue/VoiceProviderStatus.ts
7796
- var VoiceProviderStatus = defineComponent12({
8105
+ var VoiceProviderStatus = defineComponent13({
7797
8106
  name: "VoiceProviderStatus",
7798
8107
  props: {
7799
8108
  class: {
@@ -7830,41 +8139,41 @@ var VoiceProviderStatus = defineComponent12({
7830
8139
  providers: status.providers.value,
7831
8140
  updatedAt: status.updatedAt.value
7832
8141
  }, options));
7833
- return () => h12("section", {
8142
+ return () => h13("section", {
7834
8143
  class: [
7835
8144
  "absolute-voice-provider-status",
7836
8145
  `absolute-voice-provider-status--${model.value.status}`,
7837
8146
  props.class
7838
8147
  ]
7839
8148
  }, [
7840
- h12("header", { class: "absolute-voice-provider-status__header" }, [
7841
- h12("span", { class: "absolute-voice-provider-status__eyebrow" }, model.value.title),
7842
- h12("strong", { class: "absolute-voice-provider-status__label" }, model.value.label)
8149
+ h13("header", { class: "absolute-voice-provider-status__header" }, [
8150
+ h13("span", { class: "absolute-voice-provider-status__eyebrow" }, model.value.title),
8151
+ h13("strong", { class: "absolute-voice-provider-status__label" }, model.value.label)
7843
8152
  ]),
7844
- h12("p", { class: "absolute-voice-provider-status__description" }, model.value.description),
7845
- model.value.providers.length ? h12("div", { class: "absolute-voice-provider-status__providers" }, model.value.providers.map((provider) => h12("article", {
8153
+ h13("p", { class: "absolute-voice-provider-status__description" }, model.value.description),
8154
+ model.value.providers.length ? h13("div", { class: "absolute-voice-provider-status__providers" }, model.value.providers.map((provider) => h13("article", {
7846
8155
  class: [
7847
8156
  "absolute-voice-provider-status__provider",
7848
8157
  `absolute-voice-provider-status__provider--${provider.status}`
7849
8158
  ],
7850
8159
  key: provider.provider
7851
8160
  }, [
7852
- h12("header", [
7853
- h12("strong", provider.label),
7854
- h12("span", provider.status)
8161
+ h13("header", [
8162
+ h13("strong", provider.label),
8163
+ h13("span", provider.status)
7855
8164
  ]),
7856
- h12("p", provider.detail),
7857
- h12("dl", provider.rows.map((row) => h12("div", { key: row.label }, [
7858
- h12("dt", row.label),
7859
- h12("dd", row.value)
8165
+ h13("p", provider.detail),
8166
+ h13("dl", provider.rows.map((row) => h13("div", { key: row.label }, [
8167
+ h13("dt", row.label),
8168
+ h13("dd", row.value)
7860
8169
  ])))
7861
- ]))) : h12("p", { class: "absolute-voice-provider-status__empty" }, "Run voice traffic to see provider health."),
7862
- model.value.error ? h12("p", { class: "absolute-voice-provider-status__error" }, model.value.error) : null
8170
+ ]))) : h13("p", { class: "absolute-voice-provider-status__empty" }, "Run voice traffic to see provider health."),
8171
+ model.value.error ? h13("p", { class: "absolute-voice-provider-status__error" }, model.value.error) : null
7863
8172
  ]);
7864
8173
  }
7865
8174
  });
7866
8175
  // src/vue/VoiceRoutingStatus.ts
7867
- import { computed as computed7, defineComponent as defineComponent13, h as h13 } from "vue";
8176
+ import { computed as computed7, defineComponent as defineComponent14, h as h14 } from "vue";
7868
8177
 
7869
8178
  // src/client/routingStatus.ts
7870
8179
  var fetchVoiceRoutingStatus = async (path = "/api/routing/latest", options = {}) => {
@@ -7947,9 +8256,9 @@ var createVoiceRoutingStatusStore = (path = "/api/routing/latest", options = {})
7947
8256
  };
7948
8257
 
7949
8258
  // src/client/routingStatusWidget.ts
7950
- var DEFAULT_TITLE12 = "Voice Routing";
7951
- var DEFAULT_DESCRIPTION12 = "Latest provider routing decision from the self-hosted trace store.";
7952
- var escapeHtml18 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
8259
+ var DEFAULT_TITLE13 = "Voice Routing";
8260
+ var DEFAULT_DESCRIPTION13 = "Latest provider routing decision from the self-hosted trace store.";
8261
+ var escapeHtml19 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7953
8262
  var formatValue = (value, fallback = "None") => typeof value === "string" && value.trim() ? value : typeof value === "number" && Number.isFinite(value) ? String(value) : fallback;
7954
8263
  var formatProviderRoutes = (routes) => routes && typeof routes === "object" ? Object.entries(routes).map(([role, provider]) => `${role}: ${formatValue(provider)}`).join(", ") || "None" : "None";
7955
8264
  var getProviderRoute = (routes, role) => routes && typeof routes === "object" ? formatValue(routes[role], "Not configured") : "Not configured";
@@ -8018,35 +8327,35 @@ var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
8018
8327
  return {
8019
8328
  activeStack,
8020
8329
  decision,
8021
- description: options.description ?? DEFAULT_DESCRIPTION12,
8330
+ description: options.description ?? DEFAULT_DESCRIPTION13,
8022
8331
  error: snapshot.error,
8023
8332
  isLoading: snapshot.isLoading,
8024
8333
  label: snapshot.error ? "Unavailable" : decision ? `${formatValue(decision.kind).toUpperCase()} ${formatValue(decision.status, "unknown")}` : snapshot.isLoading ? "Checking" : "No routing yet",
8025
8334
  rows,
8026
8335
  status: snapshot.error ? "error" : decision ? "ready" : snapshot.isLoading ? "loading" : "empty",
8027
- title: options.title ?? DEFAULT_TITLE12,
8336
+ title: options.title ?? DEFAULT_TITLE13,
8028
8337
  updatedAt: snapshot.updatedAt
8029
8338
  };
8030
8339
  };
8031
8340
  var renderVoiceRoutingStatusHTML = (snapshot, options = {}) => {
8032
8341
  const model = createVoiceRoutingStatusViewModel(snapshot, options);
8033
8342
  const activeStack = model.activeStack.length ? `<div class="absolute-voice-routing-status__stack" aria-label="Active voice stack">${model.activeStack.map((item) => `<div>
8034
- <span>${escapeHtml18(item.label)}</span>
8035
- <strong>${escapeHtml18(item.value)}</strong>
8343
+ <span>${escapeHtml19(item.label)}</span>
8344
+ <strong>${escapeHtml19(item.value)}</strong>
8036
8345
  </div>`).join("")}</div>` : "";
8037
8346
  const rows = model.rows.length ? `<div class="absolute-voice-routing-status__grid">${model.rows.map((row) => `<div>
8038
- <span>${escapeHtml18(row.label)}</span>
8039
- <strong>${escapeHtml18(row.value)}</strong>
8347
+ <span>${escapeHtml19(row.label)}</span>
8348
+ <strong>${escapeHtml19(row.value)}</strong>
8040
8349
  </div>`).join("")}</div>` : '<p class="absolute-voice-routing-status__empty">Start a voice session to see the selected provider.</p>';
8041
- return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml18(model.status)}">
8350
+ return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml19(model.status)}">
8042
8351
  <header class="absolute-voice-routing-status__header">
8043
- <span class="absolute-voice-routing-status__eyebrow">${escapeHtml18(model.title)}</span>
8044
- <strong class="absolute-voice-routing-status__label">${escapeHtml18(model.label)}</strong>
8352
+ <span class="absolute-voice-routing-status__eyebrow">${escapeHtml19(model.title)}</span>
8353
+ <strong class="absolute-voice-routing-status__label">${escapeHtml19(model.label)}</strong>
8045
8354
  </header>
8046
- <p class="absolute-voice-routing-status__description">${escapeHtml18(model.description)}</p>
8355
+ <p class="absolute-voice-routing-status__description">${escapeHtml19(model.description)}</p>
8047
8356
  ${activeStack}
8048
8357
  ${rows}
8049
- ${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml18(model.error)}</p>` : ""}
8358
+ ${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml19(model.error)}</p>` : ""}
8050
8359
  </section>`;
8051
8360
  };
8052
8361
  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__stack{background:linear-gradient(135deg,#16130d,#49391f);border-radius:18px;color:#fff;display:grid;gap:8px;grid-template-columns:repeat(5,minmax(0,1fr));margin-top:14px;padding:12px}.absolute-voice-routing-status__stack div{border-left:1px solid rgba(255,255,255,.18);padding-left:10px}.absolute-voice-routing-status__stack div:first-child{border-left:0;padding-left:0}.absolute-voice-routing-status__stack span{color:#e9d9b8;display:block;font-size:11px;font-weight:800;letter-spacing:.08em;margin-bottom:5px;text-transform:uppercase}.absolute-voice-routing-status__stack strong{display:block;font-size:13px;line-height:1.25;overflow-wrap:anywhere}.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}@media (max-width:760px){.absolute-voice-routing-status__stack{grid-template-columns:repeat(2,minmax(0,1fr))}.absolute-voice-routing-status__stack div{border-left:0;border-top:1px solid rgba(255,255,255,.18);padding-left:0;padding-top:8px}.absolute-voice-routing-status__stack div:first-child{border-top:0;padding-top:0}}`;
@@ -8088,13 +8397,13 @@ var defineVoiceRoutingStatusElement = (tagName = "absolute-voice-routing-status"
8088
8397
  };
8089
8398
 
8090
8399
  // src/vue/useVoiceRoutingStatus.ts
8091
- import { onUnmounted as onUnmounted12, ref as ref9, shallowRef as shallowRef11 } from "vue";
8400
+ import { onUnmounted as onUnmounted13, ref as ref10, shallowRef as shallowRef12 } from "vue";
8092
8401
  function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
8093
8402
  const store = createVoiceRoutingStatusStore(path, options);
8094
- const decision = shallowRef11(null);
8095
- const error = ref9(null);
8096
- const isLoading = ref9(false);
8097
- const updatedAt = ref9(undefined);
8403
+ const decision = shallowRef12(null);
8404
+ const error = ref10(null);
8405
+ const isLoading = ref10(false);
8406
+ const updatedAt = ref10(undefined);
8098
8407
  const sync = () => {
8099
8408
  const snapshot = store.getSnapshot();
8100
8409
  decision.value = snapshot.decision;
@@ -8105,7 +8414,7 @@ function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
8105
8414
  const unsubscribe = store.subscribe(sync);
8106
8415
  sync();
8107
8416
  store.refresh().catch(() => {});
8108
- onUnmounted12(() => {
8417
+ onUnmounted13(() => {
8109
8418
  unsubscribe();
8110
8419
  store.close();
8111
8420
  });
@@ -8119,7 +8428,7 @@ function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
8119
8428
  }
8120
8429
 
8121
8430
  // src/vue/VoiceRoutingStatus.ts
8122
- var VoiceRoutingStatus = defineComponent13({
8431
+ var VoiceRoutingStatus = defineComponent14({
8123
8432
  name: "VoiceRoutingStatus",
8124
8433
  props: {
8125
8434
  class: {
@@ -8156,28 +8465,28 @@ var VoiceRoutingStatus = defineComponent13({
8156
8465
  isLoading: status.isLoading.value,
8157
8466
  updatedAt: status.updatedAt.value
8158
8467
  }, options));
8159
- return () => h13("section", {
8468
+ return () => h14("section", {
8160
8469
  class: [
8161
8470
  "absolute-voice-routing-status",
8162
8471
  `absolute-voice-routing-status--${model.value.status}`,
8163
8472
  props.class
8164
8473
  ]
8165
8474
  }, [
8166
- h13("header", { class: "absolute-voice-routing-status__header" }, [
8167
- h13("span", { class: "absolute-voice-routing-status__eyebrow" }, model.value.title),
8168
- h13("strong", { class: "absolute-voice-routing-status__label" }, model.value.label)
8475
+ h14("header", { class: "absolute-voice-routing-status__header" }, [
8476
+ h14("span", { class: "absolute-voice-routing-status__eyebrow" }, model.value.title),
8477
+ h14("strong", { class: "absolute-voice-routing-status__label" }, model.value.label)
8169
8478
  ]),
8170
- h13("p", { class: "absolute-voice-routing-status__description" }, model.value.description),
8171
- model.value.rows.length ? h13("div", { class: "absolute-voice-routing-status__grid" }, model.value.rows.map((row) => h13("div", { key: row.label }, [
8172
- h13("span", row.label),
8173
- h13("strong", row.value)
8174
- ]))) : h13("p", { class: "absolute-voice-routing-status__empty" }, "Start a voice session to see the selected provider."),
8175
- model.value.error ? h13("p", { class: "absolute-voice-routing-status__error" }, model.value.error) : null
8479
+ h14("p", { class: "absolute-voice-routing-status__description" }, model.value.description),
8480
+ model.value.rows.length ? h14("div", { class: "absolute-voice-routing-status__grid" }, model.value.rows.map((row) => h14("div", { key: row.label }, [
8481
+ h14("span", row.label),
8482
+ h14("strong", row.value)
8483
+ ]))) : h14("p", { class: "absolute-voice-routing-status__empty" }, "Start a voice session to see the selected provider."),
8484
+ model.value.error ? h14("p", { class: "absolute-voice-routing-status__error" }, model.value.error) : null
8176
8485
  ]);
8177
8486
  }
8178
8487
  });
8179
8488
  // src/vue/useVoiceAgentSquadStatus.ts
8180
- import { onUnmounted as onUnmounted13, ref as ref10, shallowRef as shallowRef12 } from "vue";
8489
+ import { onUnmounted as onUnmounted14, ref as ref11, shallowRef as shallowRef13 } from "vue";
8181
8490
 
8182
8491
  // src/client/traceTimeline.ts
8183
8492
  var fetchVoiceTraceTimeline = async (path = "/api/voice-traces", options = {}) => {
@@ -8336,11 +8645,11 @@ var createVoiceAgentSquadStatusStore = (path = "/api/voice-traces", options = {}
8336
8645
  // src/vue/useVoiceAgentSquadStatus.ts
8337
8646
  function useVoiceAgentSquadStatus(path = "/api/voice-traces", options = {}) {
8338
8647
  const store = createVoiceAgentSquadStatusStore(path, options);
8339
- const current = shallowRef12(undefined);
8340
- const error = ref10(null);
8341
- const isLoading = ref10(false);
8342
- const report = shallowRef12(undefined);
8343
- const updatedAt = ref10(undefined);
8648
+ const current = shallowRef13(undefined);
8649
+ const error = ref11(null);
8650
+ const isLoading = ref11(false);
8651
+ const report = shallowRef13(undefined);
8652
+ const updatedAt = ref11(undefined);
8344
8653
  const sync = () => {
8345
8654
  const snapshot = store.getSnapshot();
8346
8655
  current.value = snapshot.report.current;
@@ -8354,7 +8663,7 @@ function useVoiceAgentSquadStatus(path = "/api/voice-traces", options = {}) {
8354
8663
  if (typeof window !== "undefined") {
8355
8664
  store.refresh().catch(() => {});
8356
8665
  }
8357
- onUnmounted13(() => {
8666
+ onUnmounted14(() => {
8358
8667
  unsubscribe();
8359
8668
  store.close();
8360
8669
  });
@@ -8368,7 +8677,7 @@ function useVoiceAgentSquadStatus(path = "/api/voice-traces", options = {}) {
8368
8677
  };
8369
8678
  }
8370
8679
  // src/vue/VoiceTurnLatency.ts
8371
- import { computed as computed8, defineComponent as defineComponent14, h as h14 } from "vue";
8680
+ import { computed as computed8, defineComponent as defineComponent15, h as h15 } from "vue";
8372
8681
 
8373
8682
  // src/client/turnLatency.ts
8374
8683
  var fetchVoiceTurnLatency = async (path = "/api/turn-latency", options = {}) => {
@@ -8474,56 +8783,56 @@ var createVoiceTurnLatencyStore = (path = "/api/turn-latency", options = {}) =>
8474
8783
  };
8475
8784
 
8476
8785
  // src/client/turnLatencyWidget.ts
8477
- var DEFAULT_TITLE13 = "Turn Latency";
8478
- var DEFAULT_DESCRIPTION13 = "Per-turn timing from first transcript to commit and assistant response start.";
8786
+ var DEFAULT_TITLE14 = "Turn Latency";
8787
+ var DEFAULT_DESCRIPTION14 = "Per-turn timing from first transcript to commit and assistant response start.";
8479
8788
  var DEFAULT_PROOF_LABEL = "Run latency proof";
8480
- var escapeHtml19 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
8481
- var formatMs2 = (value) => typeof value === "number" ? `${Math.round(value)}ms` : "n/a";
8789
+ var escapeHtml20 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
8790
+ var formatMs3 = (value) => typeof value === "number" ? `${Math.round(value)}ms` : "n/a";
8482
8791
  var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
8483
8792
  const turns = (snapshot.report?.turns ?? []).map((turn) => ({
8484
8793
  ...turn,
8485
8794
  label: turn.text || "Empty turn",
8486
8795
  rows: turn.stages.map((stage) => ({
8487
8796
  label: stage.label,
8488
- value: formatMs2(stage.valueMs)
8797
+ value: formatMs3(stage.valueMs)
8489
8798
  }))
8490
8799
  }));
8491
8800
  const warningCount = snapshot.report?.warnings ?? turns.filter((turn) => turn.status === "warn").length;
8492
8801
  const failedCount = snapshot.report?.failed ?? turns.filter((turn) => turn.status === "fail").length;
8493
8802
  return {
8494
- description: options.description ?? DEFAULT_DESCRIPTION13,
8803
+ description: options.description ?? DEFAULT_DESCRIPTION14,
8495
8804
  error: snapshot.error,
8496
8805
  isLoading: snapshot.isLoading,
8497
- label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} slow` : warningCount > 0 ? `${warningCount} warnings` : `avg ${formatMs2(snapshot.report?.averageTotalMs)}` : snapshot.isLoading ? "Checking" : "No turns",
8806
+ label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} slow` : warningCount > 0 ? `${warningCount} warnings` : `avg ${formatMs3(snapshot.report?.averageTotalMs)}` : snapshot.isLoading ? "Checking" : "No turns",
8498
8807
  proofLabel: options.proofPath ? options.proofLabel ?? DEFAULT_PROOF_LABEL : undefined,
8499
8808
  showProofAction: Boolean(options.proofPath),
8500
8809
  status: snapshot.error ? "error" : turns.length ? failedCount > 0 || warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
8501
- title: options.title ?? DEFAULT_TITLE13,
8810
+ title: options.title ?? DEFAULT_TITLE14,
8502
8811
  turns,
8503
8812
  updatedAt: snapshot.updatedAt
8504
8813
  };
8505
8814
  };
8506
8815
  var renderVoiceTurnLatencyHTML = (snapshot, options = {}) => {
8507
8816
  const model = createVoiceTurnLatencyViewModel(snapshot, options);
8508
- 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--${escapeHtml19(turn.status)}">
8817
+ 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--${escapeHtml20(turn.status)}">
8509
8818
  <header>
8510
- <strong>${escapeHtml19(turn.label)}</strong>
8511
- <span>${escapeHtml19(turn.status)}</span>
8819
+ <strong>${escapeHtml20(turn.label)}</strong>
8820
+ <span>${escapeHtml20(turn.status)}</span>
8512
8821
  </header>
8513
8822
  <dl>${turn.rows.map((row) => `<div>
8514
- <dt>${escapeHtml19(row.label)}</dt>
8515
- <dd>${escapeHtml19(row.value)}</dd>
8823
+ <dt>${escapeHtml20(row.label)}</dt>
8824
+ <dd>${escapeHtml20(row.value)}</dd>
8516
8825
  </div>`).join("")}</dl>
8517
8826
  </article>`).join("")}</div>` : '<p class="absolute-voice-turn-latency__empty">Complete a voice turn to see latency diagnostics.</p>';
8518
- return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${escapeHtml19(model.status)}">
8827
+ return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${escapeHtml20(model.status)}">
8519
8828
  <header class="absolute-voice-turn-latency__header">
8520
- <span class="absolute-voice-turn-latency__eyebrow">${escapeHtml19(model.title)}</span>
8521
- <strong class="absolute-voice-turn-latency__label">${escapeHtml19(model.label)}</strong>
8829
+ <span class="absolute-voice-turn-latency__eyebrow">${escapeHtml20(model.title)}</span>
8830
+ <strong class="absolute-voice-turn-latency__label">${escapeHtml20(model.label)}</strong>
8522
8831
  </header>
8523
- <p class="absolute-voice-turn-latency__description">${escapeHtml19(model.description)}</p>
8524
- ${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml19(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</button>` : ""}
8832
+ <p class="absolute-voice-turn-latency__description">${escapeHtml20(model.description)}</p>
8833
+ ${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml20(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</button>` : ""}
8525
8834
  ${turns}
8526
- ${model.error ? `<p class="absolute-voice-turn-latency__error">${escapeHtml19(model.error)}</p>` : ""}
8835
+ ${model.error ? `<p class="absolute-voice-turn-latency__error">${escapeHtml20(model.error)}</p>` : ""}
8527
8836
  </section>`;
8528
8837
  };
8529
8838
  var mountVoiceTurnLatency = (element, path = "/api/turn-latency", options = {}) => {
@@ -8574,13 +8883,13 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
8574
8883
  };
8575
8884
 
8576
8885
  // src/vue/useVoiceTurnLatency.ts
8577
- import { onUnmounted as onUnmounted14, shallowRef as shallowRef13 } from "vue";
8886
+ import { onUnmounted as onUnmounted15, shallowRef as shallowRef14 } from "vue";
8578
8887
  function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
8579
8888
  const store = createVoiceTurnLatencyStore(path, options);
8580
- const error = shallowRef13(null);
8581
- const isLoading = shallowRef13(false);
8582
- const report = shallowRef13();
8583
- const updatedAt = shallowRef13(undefined);
8889
+ const error = shallowRef14(null);
8890
+ const isLoading = shallowRef14(false);
8891
+ const report = shallowRef14();
8892
+ const updatedAt = shallowRef14(undefined);
8584
8893
  const sync = () => {
8585
8894
  const snapshot = store.getSnapshot();
8586
8895
  error.value = snapshot.error;
@@ -8591,7 +8900,7 @@ function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
8591
8900
  const unsubscribe = store.subscribe(sync);
8592
8901
  sync();
8593
8902
  store.refresh().catch(() => {});
8594
- onUnmounted14(() => {
8903
+ onUnmounted15(() => {
8595
8904
  unsubscribe();
8596
8905
  store.close();
8597
8906
  });
@@ -8606,7 +8915,7 @@ function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
8606
8915
  }
8607
8916
 
8608
8917
  // src/vue/VoiceTurnLatency.ts
8609
- var VoiceTurnLatency = defineComponent14({
8918
+ var VoiceTurnLatency = defineComponent15({
8610
8919
  name: "VoiceTurnLatency",
8611
8920
  props: {
8612
8921
  class: { default: "", type: String },
@@ -8632,47 +8941,47 @@ var VoiceTurnLatency = defineComponent14({
8632
8941
  report: latency.report.value,
8633
8942
  updatedAt: latency.updatedAt.value
8634
8943
  }, options));
8635
- return () => h14("section", {
8944
+ return () => h15("section", {
8636
8945
  class: [
8637
8946
  "absolute-voice-turn-latency",
8638
8947
  `absolute-voice-turn-latency--${model.value.status}`,
8639
8948
  props.class
8640
8949
  ]
8641
8950
  }, [
8642
- h14("header", { class: "absolute-voice-turn-latency__header" }, [
8643
- h14("span", { class: "absolute-voice-turn-latency__eyebrow" }, model.value.title),
8644
- h14("strong", { class: "absolute-voice-turn-latency__label" }, model.value.label)
8951
+ h15("header", { class: "absolute-voice-turn-latency__header" }, [
8952
+ h15("span", { class: "absolute-voice-turn-latency__eyebrow" }, model.value.title),
8953
+ h15("strong", { class: "absolute-voice-turn-latency__label" }, model.value.label)
8645
8954
  ]),
8646
- h14("p", { class: "absolute-voice-turn-latency__description" }, model.value.description),
8647
- model.value.showProofAction ? h14("button", {
8955
+ h15("p", { class: "absolute-voice-turn-latency__description" }, model.value.description),
8956
+ model.value.showProofAction ? h15("button", {
8648
8957
  class: "absolute-voice-turn-latency__proof",
8649
8958
  onClick: () => {
8650
8959
  latency.runProof().catch(() => {});
8651
8960
  },
8652
8961
  type: "button"
8653
8962
  }, model.value.proofLabel) : null,
8654
- model.value.turns.length ? h14("div", { class: "absolute-voice-turn-latency__turns" }, model.value.turns.map((turn) => h14("article", {
8963
+ model.value.turns.length ? h15("div", { class: "absolute-voice-turn-latency__turns" }, model.value.turns.map((turn) => h15("article", {
8655
8964
  class: [
8656
8965
  "absolute-voice-turn-latency__turn",
8657
8966
  `absolute-voice-turn-latency__turn--${turn.status}`
8658
8967
  ],
8659
8968
  key: `${turn.sessionId}:${turn.turnId}`
8660
8969
  }, [
8661
- h14("header", [
8662
- h14("strong", turn.label),
8663
- h14("span", turn.status)
8970
+ h15("header", [
8971
+ h15("strong", turn.label),
8972
+ h15("span", turn.status)
8664
8973
  ]),
8665
- h14("dl", turn.rows.map((row) => h14("div", { key: row.label }, [
8666
- h14("dt", row.label),
8667
- h14("dd", row.value)
8974
+ h15("dl", turn.rows.map((row) => h15("div", { key: row.label }, [
8975
+ h15("dt", row.label),
8976
+ h15("dd", row.value)
8668
8977
  ])))
8669
- ]))) : h14("p", { class: "absolute-voice-turn-latency__empty" }, "Complete a voice turn to see latency diagnostics."),
8670
- model.value.error ? h14("p", { class: "absolute-voice-turn-latency__error" }, model.value.error) : null
8978
+ ]))) : h15("p", { class: "absolute-voice-turn-latency__empty" }, "Complete a voice turn to see latency diagnostics."),
8979
+ model.value.error ? h15("p", { class: "absolute-voice-turn-latency__error" }, model.value.error) : null
8671
8980
  ]);
8672
8981
  }
8673
8982
  });
8674
8983
  // src/vue/VoiceTurnQuality.ts
8675
- import { computed as computed9, defineComponent as defineComponent15, h as h15 } from "vue";
8984
+ import { computed as computed9, defineComponent as defineComponent16, h as h16 } from "vue";
8676
8985
 
8677
8986
  // src/client/turnQuality.ts
8678
8987
  var fetchVoiceTurnQuality = async (path = "/api/turn-quality", options = {}) => {
@@ -8754,9 +9063,9 @@ var createVoiceTurnQualityStore = (path = "/api/turn-quality", options = {}) =>
8754
9063
  };
8755
9064
 
8756
9065
  // src/client/turnQualityWidget.ts
8757
- var DEFAULT_TITLE14 = "Turn Quality";
8758
- var DEFAULT_DESCRIPTION14 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
8759
- var escapeHtml20 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
9066
+ var DEFAULT_TITLE15 = "Turn Quality";
9067
+ var DEFAULT_DESCRIPTION15 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
9068
+ var escapeHtml21 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
8760
9069
  var formatConfidence = (value) => typeof value === "number" ? `${Math.round(value * 100)}%` : "n/a";
8761
9070
  var formatMaybe = (value) => value === undefined || value === "" ? "n/a" : String(value);
8762
9071
  var getTurnDetail = (turn) => {
@@ -8800,37 +9109,37 @@ var createVoiceTurnQualityViewModel = (snapshot, options = {}) => {
8800
9109
  const warningCount = snapshot.report?.warnings ?? turns.filter((turn) => turn.status === "warn").length;
8801
9110
  const failedCount = snapshot.report?.failed ?? turns.filter((turn) => turn.status === "fail").length;
8802
9111
  return {
8803
- description: options.description ?? DEFAULT_DESCRIPTION14,
9112
+ description: options.description ?? DEFAULT_DESCRIPTION15,
8804
9113
  error: snapshot.error,
8805
9114
  isLoading: snapshot.isLoading,
8806
9115
  label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} failed` : warningCount > 0 ? `${warningCount} warnings` : `${turns.length} healthy` : snapshot.isLoading ? "Checking" : "No turns",
8807
9116
  status: snapshot.error ? "error" : turns.length ? failedCount > 0 || warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
8808
- title: options.title ?? DEFAULT_TITLE14,
9117
+ title: options.title ?? DEFAULT_TITLE15,
8809
9118
  turns,
8810
9119
  updatedAt: snapshot.updatedAt
8811
9120
  };
8812
9121
  };
8813
9122
  var renderVoiceTurnQualityHTML = (snapshot, options = {}) => {
8814
9123
  const model = createVoiceTurnQualityViewModel(snapshot, options);
8815
- 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--${escapeHtml20(turn.status)}">
9124
+ 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--${escapeHtml21(turn.status)}">
8816
9125
  <header>
8817
- <strong>${escapeHtml20(turn.label)}</strong>
8818
- <span>${escapeHtml20(turn.status)}</span>
9126
+ <strong>${escapeHtml21(turn.label)}</strong>
9127
+ <span>${escapeHtml21(turn.status)}</span>
8819
9128
  </header>
8820
- <p>${escapeHtml20(turn.detail)}</p>
9129
+ <p>${escapeHtml21(turn.detail)}</p>
8821
9130
  <dl>${turn.rows.map((row) => `<div>
8822
- <dt>${escapeHtml20(row.label)}</dt>
8823
- <dd>${escapeHtml20(row.value)}</dd>
9131
+ <dt>${escapeHtml21(row.label)}</dt>
9132
+ <dd>${escapeHtml21(row.value)}</dd>
8824
9133
  </div>`).join("")}</dl>
8825
9134
  </article>`).join("")}</div>` : '<p class="absolute-voice-turn-quality__empty">Complete a voice turn to see STT quality diagnostics.</p>';
8826
- return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${escapeHtml20(model.status)}">
9135
+ return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${escapeHtml21(model.status)}">
8827
9136
  <header class="absolute-voice-turn-quality__header">
8828
- <span class="absolute-voice-turn-quality__eyebrow">${escapeHtml20(model.title)}</span>
8829
- <strong class="absolute-voice-turn-quality__label">${escapeHtml20(model.label)}</strong>
9137
+ <span class="absolute-voice-turn-quality__eyebrow">${escapeHtml21(model.title)}</span>
9138
+ <strong class="absolute-voice-turn-quality__label">${escapeHtml21(model.label)}</strong>
8830
9139
  </header>
8831
- <p class="absolute-voice-turn-quality__description">${escapeHtml20(model.description)}</p>
9140
+ <p class="absolute-voice-turn-quality__description">${escapeHtml21(model.description)}</p>
8832
9141
  ${turns}
8833
- ${model.error ? `<p class="absolute-voice-turn-quality__error">${escapeHtml20(model.error)}</p>` : ""}
9142
+ ${model.error ? `<p class="absolute-voice-turn-quality__error">${escapeHtml21(model.error)}</p>` : ""}
8834
9143
  </section>`;
8835
9144
  };
8836
9145
  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}`;
@@ -8872,13 +9181,13 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
8872
9181
  };
8873
9182
 
8874
9183
  // src/vue/useVoiceTurnQuality.ts
8875
- import { onUnmounted as onUnmounted15, shallowRef as shallowRef14 } from "vue";
9184
+ import { onUnmounted as onUnmounted16, shallowRef as shallowRef15 } from "vue";
8876
9185
  function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
8877
9186
  const store = createVoiceTurnQualityStore(path, options);
8878
- const error = shallowRef14(null);
8879
- const isLoading = shallowRef14(false);
8880
- const report = shallowRef14();
8881
- const updatedAt = shallowRef14(undefined);
9187
+ const error = shallowRef15(null);
9188
+ const isLoading = shallowRef15(false);
9189
+ const report = shallowRef15();
9190
+ const updatedAt = shallowRef15(undefined);
8882
9191
  const sync = () => {
8883
9192
  const snapshot = store.getSnapshot();
8884
9193
  error.value = snapshot.error;
@@ -8889,7 +9198,7 @@ function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
8889
9198
  const unsubscribe = store.subscribe(sync);
8890
9199
  sync();
8891
9200
  store.refresh().catch(() => {});
8892
- onUnmounted15(() => {
9201
+ onUnmounted16(() => {
8893
9202
  unsubscribe();
8894
9203
  store.close();
8895
9204
  });
@@ -8897,7 +9206,7 @@ function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
8897
9206
  }
8898
9207
 
8899
9208
  // src/vue/VoiceTurnQuality.ts
8900
- var VoiceTurnQuality = defineComponent15({
9209
+ var VoiceTurnQuality = defineComponent16({
8901
9210
  name: "VoiceTurnQuality",
8902
9211
  props: {
8903
9212
  class: { default: "", type: String },
@@ -8919,41 +9228,41 @@ var VoiceTurnQuality = defineComponent15({
8919
9228
  report: quality.report.value,
8920
9229
  updatedAt: quality.updatedAt.value
8921
9230
  }, options));
8922
- return () => h15("section", {
9231
+ return () => h16("section", {
8923
9232
  class: [
8924
9233
  "absolute-voice-turn-quality",
8925
9234
  `absolute-voice-turn-quality--${model.value.status}`,
8926
9235
  props.class
8927
9236
  ]
8928
9237
  }, [
8929
- h15("header", { class: "absolute-voice-turn-quality__header" }, [
8930
- h15("span", { class: "absolute-voice-turn-quality__eyebrow" }, model.value.title),
8931
- h15("strong", { class: "absolute-voice-turn-quality__label" }, model.value.label)
9238
+ h16("header", { class: "absolute-voice-turn-quality__header" }, [
9239
+ h16("span", { class: "absolute-voice-turn-quality__eyebrow" }, model.value.title),
9240
+ h16("strong", { class: "absolute-voice-turn-quality__label" }, model.value.label)
8932
9241
  ]),
8933
- h15("p", { class: "absolute-voice-turn-quality__description" }, model.value.description),
8934
- model.value.turns.length ? h15("div", { class: "absolute-voice-turn-quality__turns" }, model.value.turns.map((turn) => h15("article", {
9242
+ h16("p", { class: "absolute-voice-turn-quality__description" }, model.value.description),
9243
+ model.value.turns.length ? h16("div", { class: "absolute-voice-turn-quality__turns" }, model.value.turns.map((turn) => h16("article", {
8935
9244
  class: [
8936
9245
  "absolute-voice-turn-quality__turn",
8937
9246
  `absolute-voice-turn-quality__turn--${turn.status}`
8938
9247
  ],
8939
9248
  key: `${turn.sessionId}:${turn.turnId}`
8940
9249
  }, [
8941
- h15("header", [
8942
- h15("strong", turn.label),
8943
- h15("span", turn.status)
9250
+ h16("header", [
9251
+ h16("strong", turn.label),
9252
+ h16("span", turn.status)
8944
9253
  ]),
8945
- h15("p", turn.detail),
8946
- h15("dl", turn.rows.map((row) => h15("div", { key: row.label }, [
8947
- h15("dt", row.label),
8948
- h15("dd", row.value)
9254
+ h16("p", turn.detail),
9255
+ h16("dl", turn.rows.map((row) => h16("div", { key: row.label }, [
9256
+ h16("dt", row.label),
9257
+ h16("dd", row.value)
8949
9258
  ])))
8950
- ]))) : h15("p", { class: "absolute-voice-turn-quality__empty" }, "Complete a voice turn to see STT quality diagnostics."),
8951
- model.value.error ? h15("p", { class: "absolute-voice-turn-quality__error" }, model.value.error) : null
9259
+ ]))) : h16("p", { class: "absolute-voice-turn-quality__empty" }, "Complete a voice turn to see STT quality diagnostics."),
9260
+ model.value.error ? h16("p", { class: "absolute-voice-turn-quality__error" }, model.value.error) : null
8952
9261
  ]);
8953
9262
  }
8954
9263
  });
8955
9264
  // src/vue/useVoiceProfileComparison.ts
8956
- import { onUnmounted as onUnmounted16, ref as ref11, shallowRef as shallowRef15 } from "vue";
9265
+ import { onUnmounted as onUnmounted17, ref as ref12, shallowRef as shallowRef16 } from "vue";
8957
9266
 
8958
9267
  // src/client/profileComparison.ts
8959
9268
  var fetchVoiceProfileComparison = async (path = "/api/voice/real-call-profile-history", options = {}) => {
@@ -9033,10 +9342,10 @@ var createVoiceProfileComparisonStore = (path = "/api/voice/real-call-profile-hi
9033
9342
  // src/vue/useVoiceProfileComparison.ts
9034
9343
  function useVoiceProfileComparison(path = "/api/voice/real-call-profile-history", options = {}) {
9035
9344
  const store = createVoiceProfileComparisonStore(path, options);
9036
- const error = ref11(null);
9037
- const isLoading = ref11(false);
9038
- const report = shallowRef15(undefined);
9039
- const updatedAt = ref11(undefined);
9345
+ const error = ref12(null);
9346
+ const isLoading = ref12(false);
9347
+ const report = shallowRef16(undefined);
9348
+ const updatedAt = ref12(undefined);
9040
9349
  const sync = () => {
9041
9350
  const snapshot = store.getSnapshot();
9042
9351
  error.value = snapshot.error;
@@ -9049,7 +9358,7 @@ function useVoiceProfileComparison(path = "/api/voice/real-call-profile-history"
9049
9358
  if (typeof window !== "undefined") {
9050
9359
  store.refresh().catch(() => {});
9051
9360
  }
9052
- onUnmounted16(() => {
9361
+ onUnmounted17(() => {
9053
9362
  unsubscribe();
9054
9363
  store.close();
9055
9364
  });
@@ -9062,7 +9371,7 @@ function useVoiceProfileComparison(path = "/api/voice/real-call-profile-history"
9062
9371
  };
9063
9372
  }
9064
9373
  // src/vue/useVoiceLiveOps.ts
9065
- import { onUnmounted as onUnmounted17, ref as ref12, shallowRef as shallowRef16 } from "vue";
9374
+ import { onUnmounted as onUnmounted18, ref as ref13, shallowRef as shallowRef17 } from "vue";
9066
9375
 
9067
9376
  // src/client/liveOps.ts
9068
9377
  var postVoiceLiveOpsAction = async (input, options = {}) => {
@@ -9153,11 +9462,11 @@ var createVoiceLiveOpsStore = (options = {}) => {
9153
9462
  // src/vue/useVoiceLiveOps.ts
9154
9463
  function useVoiceLiveOps(options = {}) {
9155
9464
  const store = createVoiceLiveOpsStore(options);
9156
- const error = ref12(null);
9157
- const isRunning = ref12(false);
9158
- const lastResult = shallowRef16(undefined);
9159
- const runningAction = ref12(undefined);
9160
- const updatedAt = ref12(undefined);
9465
+ const error = ref13(null);
9466
+ const isRunning = ref13(false);
9467
+ const lastResult = shallowRef17(undefined);
9468
+ const runningAction = ref13(undefined);
9469
+ const updatedAt = ref13(undefined);
9161
9470
  const sync = () => {
9162
9471
  const snapshot = store.getSnapshot();
9163
9472
  error.value = snapshot.error;
@@ -9168,7 +9477,7 @@ function useVoiceLiveOps(options = {}) {
9168
9477
  };
9169
9478
  const unsubscribe = store.subscribe(sync);
9170
9479
  sync();
9171
- onUnmounted17(() => {
9480
+ onUnmounted18(() => {
9172
9481
  unsubscribe();
9173
9482
  store.close();
9174
9483
  });
@@ -9182,7 +9491,7 @@ function useVoiceLiveOps(options = {}) {
9182
9491
  };
9183
9492
  }
9184
9493
  // src/vue/useVoiceCampaignDialerProof.ts
9185
- import { onUnmounted as onUnmounted18, shallowRef as shallowRef17 } from "vue";
9494
+ import { onUnmounted as onUnmounted19, shallowRef as shallowRef18 } from "vue";
9186
9495
 
9187
9496
  // src/client/campaignDialerProof.ts
9188
9497
  var fetchVoiceCampaignDialerProofStatus = async (path = "/api/voice/campaigns/dialer-proof", options = {}) => {
@@ -9305,11 +9614,11 @@ var createVoiceCampaignDialerProofStore = (path = "/api/voice/campaigns/dialer-p
9305
9614
  // src/vue/useVoiceCampaignDialerProof.ts
9306
9615
  function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof", options = {}) {
9307
9616
  const store = createVoiceCampaignDialerProofStore(path, options);
9308
- const error = shallowRef17(null);
9309
- const isLoading = shallowRef17(false);
9310
- const report = shallowRef17();
9311
- const status = shallowRef17();
9312
- const updatedAt = shallowRef17(undefined);
9617
+ const error = shallowRef18(null);
9618
+ const isLoading = shallowRef18(false);
9619
+ const report = shallowRef18();
9620
+ const status = shallowRef18();
9621
+ const updatedAt = shallowRef18(undefined);
9313
9622
  const sync = () => {
9314
9623
  const snapshot = store.getSnapshot();
9315
9624
  error.value = snapshot.error;
@@ -9323,7 +9632,7 @@ function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof",
9323
9632
  if (typeof window !== "undefined") {
9324
9633
  store.refresh().catch(() => {});
9325
9634
  }
9326
- onUnmounted18(() => {
9635
+ onUnmounted19(() => {
9327
9636
  unsubscribe();
9328
9637
  store.close();
9329
9638
  });
@@ -9338,7 +9647,7 @@ function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof",
9338
9647
  };
9339
9648
  }
9340
9649
  // src/vue/useVoiceStream.ts
9341
- import { onUnmounted as onUnmounted19, ref as ref13, shallowRef as shallowRef18 } from "vue";
9650
+ import { onUnmounted as onUnmounted20, ref as ref14, shallowRef as shallowRef19 } from "vue";
9342
9651
 
9343
9652
  // src/client/actions.ts
9344
9653
  var normalizeErrorMessage = (value) => {
@@ -10743,17 +11052,17 @@ var createVoiceStream = (path, options = {}) => {
10743
11052
  // src/vue/useVoiceStream.ts
10744
11053
  function useVoiceStream(path, options = {}) {
10745
11054
  const stream = createVoiceStream(path, options);
10746
- const assistantAudio = shallowRef18([]);
10747
- const assistantTexts = shallowRef18([]);
10748
- const call = shallowRef18(null);
10749
- const error = ref13(null);
10750
- const isConnected = ref13(false);
10751
- const partial = ref13("");
10752
- const reconnect = shallowRef18(stream.reconnect);
10753
- const sessionId = ref13(stream.sessionId);
10754
- const sessionMetadata = shallowRef18(stream.sessionMetadata);
10755
- const status = ref13(stream.status);
10756
- const turns = shallowRef18([]);
11055
+ const assistantAudio = shallowRef19([]);
11056
+ const assistantTexts = shallowRef19([]);
11057
+ const call = shallowRef19(null);
11058
+ const error = ref14(null);
11059
+ const isConnected = ref14(false);
11060
+ const partial = ref14("");
11061
+ const reconnect = shallowRef19(stream.reconnect);
11062
+ const sessionId = ref14(stream.sessionId);
11063
+ const sessionMetadata = shallowRef19(stream.sessionMetadata);
11064
+ const status = ref14(stream.status);
11065
+ const turns = shallowRef19([]);
10757
11066
  const sync = () => {
10758
11067
  assistantAudio.value = [...stream.assistantAudio];
10759
11068
  assistantTexts.value = [...stream.assistantTexts];
@@ -10773,7 +11082,7 @@ function useVoiceStream(path, options = {}) {
10773
11082
  unsubscribe();
10774
11083
  stream.close();
10775
11084
  };
10776
- onUnmounted19(destroy);
11085
+ onUnmounted20(destroy);
10777
11086
  return {
10778
11087
  assistantAudio,
10779
11088
  assistantTexts,
@@ -10794,7 +11103,7 @@ function useVoiceStream(path, options = {}) {
10794
11103
  };
10795
11104
  }
10796
11105
  // src/vue/useVoiceController.ts
10797
- import { onUnmounted as onUnmounted20, ref as ref14, shallowRef as shallowRef19 } from "vue";
11106
+ import { onUnmounted as onUnmounted21, ref as ref15, shallowRef as shallowRef20 } from "vue";
10798
11107
 
10799
11108
  // src/client/htmx.ts
10800
11109
  var DEFAULT_EVENT_NAME = "voice-refresh";
@@ -11446,17 +11755,17 @@ var createVoiceController = (path, options = {}) => {
11446
11755
  // src/vue/useVoiceController.ts
11447
11756
  function useVoiceController(path, options = {}) {
11448
11757
  const controller = createVoiceController(path, options);
11449
- const assistantAudio = shallowRef19([]);
11450
- const assistantTexts = shallowRef19([]);
11451
- const error = ref14(null);
11452
- const isConnected = ref14(false);
11453
- const isRecording = ref14(false);
11454
- const partial = ref14("");
11455
- const reconnect = shallowRef19(controller.reconnect);
11456
- const recordingError = ref14(null);
11457
- const sessionId = ref14(controller.sessionId);
11458
- const status = ref14(controller.status);
11459
- const turns = shallowRef19([]);
11758
+ const assistantAudio = shallowRef20([]);
11759
+ const assistantTexts = shallowRef20([]);
11760
+ const error = ref15(null);
11761
+ const isConnected = ref15(false);
11762
+ const isRecording = ref15(false);
11763
+ const partial = ref15("");
11764
+ const reconnect = shallowRef20(controller.reconnect);
11765
+ const recordingError = ref15(null);
11766
+ const sessionId = ref15(controller.sessionId);
11767
+ const status = ref15(controller.status);
11768
+ const turns = shallowRef20([]);
11460
11769
  const sync = () => {
11461
11770
  assistantAudio.value = [...controller.assistantAudio];
11462
11771
  assistantTexts.value = [...controller.assistantTexts];
@@ -11476,7 +11785,7 @@ function useVoiceController(path, options = {}) {
11476
11785
  unsubscribe();
11477
11786
  controller.close();
11478
11787
  };
11479
- onUnmounted20(destroy);
11788
+ onUnmounted21(destroy);
11480
11789
  return {
11481
11790
  assistantAudio,
11482
11791
  assistantTexts,
@@ -11500,13 +11809,13 @@ function useVoiceController(path, options = {}) {
11500
11809
  };
11501
11810
  }
11502
11811
  // src/vue/useVoiceTraceTimeline.ts
11503
- import { onUnmounted as onUnmounted21, ref as ref15, shallowRef as shallowRef20 } from "vue";
11812
+ import { onUnmounted as onUnmounted22, ref as ref16, shallowRef as shallowRef21 } from "vue";
11504
11813
  function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
11505
11814
  const store = createVoiceTraceTimelineStore(path, options);
11506
- const error = ref15(null);
11507
- const isLoading = ref15(false);
11508
- const report = shallowRef20(null);
11509
- const updatedAt = ref15(undefined);
11815
+ const error = ref16(null);
11816
+ const isLoading = ref16(false);
11817
+ const report = shallowRef21(null);
11818
+ const updatedAt = ref16(undefined);
11510
11819
  const sync = () => {
11511
11820
  const snapshot = store.getSnapshot();
11512
11821
  error.value = snapshot.error;
@@ -11517,7 +11826,7 @@ function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
11517
11826
  const unsubscribe = store.subscribe(sync);
11518
11827
  sync();
11519
11828
  store.refresh().catch(() => {});
11520
- onUnmounted21(() => {
11829
+ onUnmounted22(() => {
11521
11830
  unsubscribe();
11522
11831
  store.close();
11523
11832
  });
@@ -11530,7 +11839,7 @@ function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
11530
11839
  };
11531
11840
  }
11532
11841
  // src/vue/useVoiceWorkflowStatus.ts
11533
- import { onUnmounted as onUnmounted22, ref as ref16, shallowRef as shallowRef21 } from "vue";
11842
+ import { onUnmounted as onUnmounted23, ref as ref17, shallowRef as shallowRef22 } from "vue";
11534
11843
 
11535
11844
  // src/client/workflowStatus.ts
11536
11845
  var fetchVoiceWorkflowStatus = async (path = "/evals/scenarios/json", options = {}) => {
@@ -11614,10 +11923,10 @@ var createVoiceWorkflowStatusStore = (path = "/evals/scenarios/json", options =
11614
11923
  // src/vue/useVoiceWorkflowStatus.ts
11615
11924
  function useVoiceWorkflowStatus(path = "/evals/scenarios/json", options = {}) {
11616
11925
  const store = createVoiceWorkflowStatusStore(path, options);
11617
- const error = ref16(null);
11618
- const isLoading = ref16(false);
11619
- const report = shallowRef21(undefined);
11620
- const updatedAt = ref16(undefined);
11926
+ const error = ref17(null);
11927
+ const isLoading = ref17(false);
11928
+ const report = shallowRef22(undefined);
11929
+ const updatedAt = ref17(undefined);
11621
11930
  const sync = () => {
11622
11931
  const snapshot = store.getSnapshot();
11623
11932
  error.value = snapshot.error;
@@ -11630,7 +11939,7 @@ function useVoiceWorkflowStatus(path = "/evals/scenarios/json", options = {}) {
11630
11939
  if (typeof window !== "undefined") {
11631
11940
  store.refresh().catch(() => {});
11632
11941
  }
11633
- onUnmounted22(() => {
11942
+ onUnmounted23(() => {
11634
11943
  unsubscribe();
11635
11944
  store.close();
11636
11945
  });
@@ -11650,6 +11959,7 @@ export {
11650
11959
  useVoiceStream,
11651
11960
  useVoiceSessionSnapshot,
11652
11961
  useVoiceRoutingStatus,
11962
+ useVoiceReconnectProfileEvidence,
11653
11963
  useVoiceReadinessFailures,
11654
11964
  useVoiceProviderStatus,
11655
11965
  useVoiceProviderSimulationControls,
@@ -11670,6 +11980,7 @@ export {
11670
11980
  VoiceTurnLatency,
11671
11981
  VoiceSessionSnapshot,
11672
11982
  VoiceRoutingStatus,
11983
+ VoiceReconnectProfileEvidence,
11673
11984
  VoiceReadinessFailures,
11674
11985
  VoiceProviderStatus,
11675
11986
  VoiceProviderSimulationControls,