@absolutejs/voice 0.0.22-beta.452 → 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) {
@@ -3654,6 +3681,7 @@ var buildVoiceRealCallProfileEvidenceFromReconnectProofReports = (input, options
3654
3681
  });
3655
3682
  };
3656
3683
  var loadVoiceRealCallProfileEvidenceFromTraceStore = async (options) => buildVoiceRealCallProfileEvidenceFromTraceEvents(await options.store.list({ limit: options.limit ?? 5000 }), options);
3684
+ var loadVoiceRealCallProfileEvidenceFromStore = async (options) => options.store.list(options);
3657
3685
  var realCallProfileTraceSignalTypes = new Set([
3658
3686
  "client.barge_in",
3659
3687
  "client.browser_media",
@@ -4496,6 +4524,74 @@ var createVoiceInMemoryRealCallProfileRecoveryJobStore = (options = {}) => {
4496
4524
  }
4497
4525
  };
4498
4526
  };
4527
+ var normalizeRealCallProfileEvidenceTableName = (value) => value.trim().replace(/[^a-zA-Z0-9_]+/g, "_").replace(/^_+|_+$/g, "") || "voice_real_call_profile_evidence";
4528
+ var parseRealCallProfileEvidenceBoundary = (value) => value === undefined ? undefined : value instanceof Date ? value.getTime() : typeof value === "number" ? value : Date.parse(value);
4529
+ var readRealCallProfileEvidenceSortTime = (evidence, fallback) => Date.parse(evidence.generatedAt ?? fallback) || Date.parse(fallback);
4530
+ var createVoiceSQLiteRealCallProfileEvidenceStore = (options = {}) => {
4531
+ const { Database: SQLiteDatabase } = __require("bun:sqlite");
4532
+ const database = options.database ?? new SQLiteDatabase(options.path ?? ":memory:", {
4533
+ create: true
4534
+ });
4535
+ const tableName = normalizeRealCallProfileEvidenceTableName(options.tableName ?? "voice_real_call_profile_evidence");
4536
+ const now = () => (options.now ?? (() => new Date))().toISOString();
4537
+ const createId = () => `${options.idPrefix ?? "voice-profile-evidence"}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
4538
+ database.exec("PRAGMA journal_mode = WAL;");
4539
+ database.exec("PRAGMA synchronous = NORMAL;");
4540
+ database.exec("PRAGMA busy_timeout = 5000;");
4541
+ database.exec(`CREATE TABLE IF NOT EXISTS "${tableName}" (
4542
+ id TEXT PRIMARY KEY,
4543
+ sort_at INTEGER NOT NULL,
4544
+ profile_id TEXT NOT NULL,
4545
+ session_id TEXT NOT NULL,
4546
+ created_at TEXT NOT NULL,
4547
+ payload TEXT NOT NULL
4548
+ )`);
4549
+ const selectStatement = database.query(`SELECT payload FROM "${tableName}" WHERE id = ?1 LIMIT 1`);
4550
+ const listStatement = database.query(`SELECT payload FROM "${tableName}" ORDER BY sort_at DESC, id DESC`);
4551
+ const upsertStatement = database.query(`INSERT INTO "${tableName}" (id, sort_at, profile_id, session_id, created_at, payload)
4552
+ VALUES (?1, ?2, ?3, ?4, ?5, ?6)
4553
+ ON CONFLICT(id) DO UPDATE SET
4554
+ sort_at = excluded.sort_at,
4555
+ profile_id = excluded.profile_id,
4556
+ session_id = excluded.session_id,
4557
+ created_at = excluded.created_at,
4558
+ payload = excluded.payload`);
4559
+ const deleteStatement = database.query(`DELETE FROM "${tableName}" WHERE id = ?1`);
4560
+ const writeEvidence = (record) => {
4561
+ upsertStatement.run(record.id, readRealCallProfileEvidenceSortTime(record, record.createdAt), record.profileId, record.sessionId, record.createdAt, JSON.stringify(record));
4562
+ return record;
4563
+ };
4564
+ const readEvidence = (id) => {
4565
+ const row = selectStatement.get(id);
4566
+ return row ? JSON.parse(row.payload) : undefined;
4567
+ };
4568
+ const matchesListOptions = (record, input) => {
4569
+ const evidenceTime = readRealCallProfileEvidenceSortTime(record, record.createdAt);
4570
+ const since = parseRealCallProfileEvidenceBoundary(input.since);
4571
+ const until = parseRealCallProfileEvidenceBoundary(input.until);
4572
+ return (!input.profileId || record.profileId === input.profileId) && (!input.sessionId || record.sessionId === input.sessionId) && (since === undefined || Number.isNaN(since) || evidenceTime >= since) && (until === undefined || Number.isNaN(until) || evidenceTime <= until);
4573
+ };
4574
+ return {
4575
+ append(input) {
4576
+ const createdAt = input.createdAt ?? now();
4577
+ return writeEvidence({
4578
+ ...input,
4579
+ createdAt,
4580
+ id: input.id ?? createId()
4581
+ });
4582
+ },
4583
+ get(id) {
4584
+ return readEvidence(id);
4585
+ },
4586
+ list(input = {}) {
4587
+ const limit = Number.isFinite(input.limit) && input.limit !== undefined && input.limit > 0 ? Math.floor(input.limit) : 500;
4588
+ return listStatement.all().map((row) => JSON.parse(row.payload)).filter((record) => matchesListOptions(record, input)).slice(0, limit);
4589
+ },
4590
+ remove(id) {
4591
+ deleteStatement.run(id);
4592
+ }
4593
+ };
4594
+ };
4499
4595
  var normalizeRealCallRecoveryJobTableName = (value) => value.trim().replace(/[^a-zA-Z0-9_]+/g, "_").replace(/^_+|_+$/g, "") || "voice_real_call_profile_recovery_jobs";
4500
4596
  var createVoiceSQLiteRealCallProfileRecoveryJobStore = (options = {}) => {
4501
4597
  const { Database: SQLiteDatabase } = __require("bun:sqlite");
@@ -4749,6 +4845,13 @@ var buildVoiceRealCallProfileHistoryReport = (options = {}) => {
4749
4845
  trend
4750
4846
  };
4751
4847
  };
4848
+ var buildVoiceRealCallProfileHistoryReportFromStore = async (options) => {
4849
+ const evidence = await options.store.list(options);
4850
+ return buildVoiceRealCallProfileHistoryReport({
4851
+ ...options,
4852
+ evidence
4853
+ });
4854
+ };
4752
4855
  var normalizeProviderStatus = (status) => status === "pass" ? "pass" : status === "fail" ? "fail" : "warn";
4753
4856
  var providerSortScore = (provider) => [
4754
4857
  recommendationStatusRank[provider.status],
@@ -5745,8 +5848,290 @@ var VoiceProofTrends = defineComponent5({
5745
5848
  };
5746
5849
  }
5747
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
+ });
5748
6133
  // src/vue/VoiceCallDebuggerLaunch.ts
5749
- 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";
5750
6135
 
5751
6136
  // src/client/callDebugger.ts
5752
6137
  var fetchVoiceCallDebugger = async (path, options = {}) => {
@@ -5824,10 +6209,10 @@ var createVoiceCallDebuggerStore = (path, options = {}) => {
5824
6209
  };
5825
6210
 
5826
6211
  // src/client/callDebuggerWidget.ts
5827
- var DEFAULT_TITLE6 = "Call Debugger";
5828
- 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.";
5829
6214
  var DEFAULT_LINK_LABEL = "Open debugger";
5830
- 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;");
5831
6216
  var defaultHref = (path, report) => {
5832
6217
  if (path.startsWith("/api/voice-call-debugger/")) {
5833
6218
  return path.replace("/api/voice-call-debugger/", "/voice-call-debugger/");
@@ -5844,7 +6229,7 @@ var createVoiceCallDebuggerLaunchViewModel = (path, state, options = {}) => {
5844
6229
  const report = state.report;
5845
6230
  const href = resolveHref(path, state, options);
5846
6231
  return {
5847
- description: options.description ?? DEFAULT_DESCRIPTION6,
6232
+ description: options.description ?? DEFAULT_DESCRIPTION7,
5848
6233
  error: state.error,
5849
6234
  href,
5850
6235
  isLoading: state.isLoading,
@@ -5873,25 +6258,25 @@ var createVoiceCallDebuggerLaunchViewModel = (path, state, options = {}) => {
5873
6258
  { label: "Snapshot", value: report.snapshot.status }
5874
6259
  ] : [],
5875
6260
  status: state.error ? "error" : report ? report.status === "healthy" ? "ready" : "warning" : state.isLoading ? "loading" : "empty",
5876
- title: options.title ?? DEFAULT_TITLE6,
6261
+ title: options.title ?? DEFAULT_TITLE7,
5877
6262
  updatedAt: state.updatedAt
5878
6263
  };
5879
6264
  };
5880
6265
  var renderVoiceCallDebuggerLaunchHTML = (path, state, options = {}) => {
5881
6266
  const model = createVoiceCallDebuggerLaunchViewModel(path, state, options);
5882
6267
  const rows = model.rows.length ? `<dl>${model.rows.map((row) => `<div>
5883
- <dt>${escapeHtml11(row.label)}</dt>
5884
- <dd>${escapeHtml11(row.value)}</dd>
6268
+ <dt>${escapeHtml12(row.label)}</dt>
6269
+ <dd>${escapeHtml12(row.value)}</dd>
5885
6270
  </div>`).join("")}</dl>` : '<p class="absolute-voice-call-debugger-launch__empty">Load a call debugger report to see the latest support artifact.</p>';
5886
- 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)}">
5887
6272
  <header class="absolute-voice-call-debugger-launch__header">
5888
- <span class="absolute-voice-call-debugger-launch__eyebrow">${escapeHtml11(model.title)}</span>
5889
- <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>
5890
6275
  </header>
5891
- <p class="absolute-voice-call-debugger-launch__description">${escapeHtml11(model.description)}</p>
5892
- <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>
5893
6278
  ${rows}
5894
- ${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>` : ""}
5895
6280
  </section>`;
5896
6281
  };
5897
6282
  var mountVoiceCallDebuggerLaunch = (element, path, options = {}) => {
@@ -5934,13 +6319,13 @@ var defineVoiceCallDebuggerLaunchElement = (tagName = "absolute-voice-call-debug
5934
6319
  };
5935
6320
 
5936
6321
  // src/vue/useVoiceCallDebugger.ts
5937
- import { computed, onUnmounted as onUnmounted6, shallowRef as shallowRef6 } from "vue";
6322
+ import { computed, onUnmounted as onUnmounted7, shallowRef as shallowRef7 } from "vue";
5938
6323
  function useVoiceCallDebugger(path, options = {}) {
5939
6324
  const store = createVoiceCallDebuggerStore(path, options);
5940
- const error = shallowRef6(null);
5941
- const isLoading = shallowRef6(false);
5942
- const report = shallowRef6();
5943
- const updatedAt = shallowRef6();
6325
+ const error = shallowRef7(null);
6326
+ const isLoading = shallowRef7(false);
6327
+ const report = shallowRef7();
6328
+ const updatedAt = shallowRef7();
5944
6329
  const sync = () => {
5945
6330
  const state = store.getSnapshot();
5946
6331
  error.value = state.error;
@@ -5951,7 +6336,7 @@ function useVoiceCallDebugger(path, options = {}) {
5951
6336
  const unsubscribe = store.subscribe(sync);
5952
6337
  sync();
5953
6338
  store.refresh().catch(() => {});
5954
- onUnmounted6(() => {
6339
+ onUnmounted7(() => {
5955
6340
  unsubscribe();
5956
6341
  store.close();
5957
6342
  });
@@ -5966,7 +6351,7 @@ function useVoiceCallDebugger(path, options = {}) {
5966
6351
  }
5967
6352
 
5968
6353
  // src/vue/VoiceCallDebuggerLaunch.ts
5969
- var VoiceCallDebuggerLaunch = defineComponent6({
6354
+ var VoiceCallDebuggerLaunch = defineComponent7({
5970
6355
  name: "VoiceCallDebuggerLaunch",
5971
6356
  props: {
5972
6357
  class: { default: "", type: String },
@@ -5992,32 +6377,32 @@ var VoiceCallDebuggerLaunch = defineComponent6({
5992
6377
  report: state.report.value,
5993
6378
  updatedAt: state.updatedAt.value
5994
6379
  }, options));
5995
- return () => h6("section", {
6380
+ return () => h7("section", {
5996
6381
  class: [
5997
6382
  "absolute-voice-call-debugger-launch",
5998
6383
  `absolute-voice-call-debugger-launch--${model.value.status}`,
5999
6384
  props.class
6000
6385
  ]
6001
6386
  }, [
6002
- h6("header", { class: "absolute-voice-call-debugger-launch__header" }, [
6003
- h6("span", { class: "absolute-voice-call-debugger-launch__eyebrow" }, model.value.title),
6004
- 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)
6005
6390
  ]),
6006
- h6("p", { class: "absolute-voice-call-debugger-launch__description" }, model.value.description),
6007
- h6("a", {
6391
+ h7("p", { class: "absolute-voice-call-debugger-launch__description" }, model.value.description),
6392
+ h7("a", {
6008
6393
  class: "absolute-voice-call-debugger-launch__link",
6009
6394
  href: model.value.href
6010
6395
  }, props.linkLabel ?? "Open debugger"),
6011
- model.value.rows.length ? h6("dl", model.value.rows.map((row) => h6("div", { key: row.label }, [
6012
- h6("dt", row.label),
6013
- h6("dd", row.value)
6014
- ]))) : h6("p", { class: "absolute-voice-call-debugger-launch__empty" }, "Load a call debugger report to see the latest support artifact."),
6015
- 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
6016
6401
  ]);
6017
6402
  }
6018
6403
  });
6019
6404
  // src/vue/VoiceSessionSnapshot.ts
6020
- 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";
6021
6406
 
6022
6407
  // src/client/sessionSnapshot.ts
6023
6408
  var withTurnId = (path, turnId) => {
@@ -6113,10 +6498,10 @@ var createVoiceSessionSnapshotStore = (path, options = {}) => {
6113
6498
  };
6114
6499
 
6115
6500
  // src/client/sessionSnapshotWidget.ts
6116
- var DEFAULT_TITLE7 = "Session Snapshot";
6117
- 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.";
6118
6503
  var DEFAULT_DOWNLOAD_LABEL = "Download snapshot";
6119
- 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;");
6120
6505
  var formatStatus2 = (status) => status ?? "n/a";
6121
6506
  var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
6122
6507
  const snapshot = state.snapshot;
@@ -6132,7 +6517,7 @@ var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
6132
6517
  label: artifact.label,
6133
6518
  status: formatStatus2(artifact.status)
6134
6519
  })) ?? [],
6135
- description: options.description ?? DEFAULT_DESCRIPTION7,
6520
+ description: options.description ?? DEFAULT_DESCRIPTION8,
6136
6521
  error: state.error,
6137
6522
  isLoading: state.isLoading,
6138
6523
  label: state.error ? "Unavailable" : snapshot ? `${snapshot.status} \xB7 ${snapshot.sessionId}` : state.isLoading ? "Loading" : "No snapshot",
@@ -6159,30 +6544,30 @@ var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
6159
6544
  ] : [],
6160
6545
  showDownload: snapshot !== undefined,
6161
6546
  status: state.error ? "error" : snapshot ? snapshot.status === "pass" ? "ready" : "warning" : state.isLoading ? "loading" : "empty",
6162
- title: options.title ?? DEFAULT_TITLE7,
6547
+ title: options.title ?? DEFAULT_TITLE8,
6163
6548
  updatedAt: state.updatedAt
6164
6549
  };
6165
6550
  };
6166
6551
  var renderVoiceSessionSnapshotHTML = (state, options = {}) => {
6167
6552
  const model = createVoiceSessionSnapshotViewModel(state, options);
6168
6553
  const rows = model.rows.length ? `<dl>${model.rows.map((row) => `<div>
6169
- <dt>${escapeHtml12(row.label)}</dt>
6170
- <dd>${escapeHtml12(row.value)}</dd>
6554
+ <dt>${escapeHtml13(row.label)}</dt>
6555
+ <dd>${escapeHtml13(row.value)}</dd>
6171
6556
  </div>`).join("")}</dl>` : '<p class="absolute-voice-session-snapshot__empty">Load a session snapshot to see support diagnostics.</p>';
6172
6557
  const artifacts = model.artifacts.length ? `<div class="absolute-voice-session-snapshot__artifacts">${model.artifacts.map((artifact) => {
6173
- const body = `<strong>${escapeHtml12(artifact.label)}</strong><span>${escapeHtml12(artifact.status)}</span>`;
6174
- 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>`;
6175
6560
  }).join("")}</div>` : "";
6176
- 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)}">
6177
6562
  <header class="absolute-voice-session-snapshot__header">
6178
- <span class="absolute-voice-session-snapshot__eyebrow">${escapeHtml12(model.title)}</span>
6179
- <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>
6180
6565
  </header>
6181
- <p class="absolute-voice-session-snapshot__description">${escapeHtml12(model.description)}</p>
6182
- ${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>` : ""}
6183
6568
  ${rows}
6184
6569
  ${artifacts}
6185
- ${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>` : ""}
6186
6571
  </section>`;
6187
6572
  };
6188
6573
  var downloadBlob = (blob, filename) => {
@@ -6246,13 +6631,13 @@ var defineVoiceSessionSnapshotElement = (tagName = "absolute-voice-session-snaps
6246
6631
  };
6247
6632
 
6248
6633
  // src/vue/useVoiceSessionSnapshot.ts
6249
- import { onUnmounted as onUnmounted7, shallowRef as shallowRef7 } from "vue";
6634
+ import { onUnmounted as onUnmounted8, shallowRef as shallowRef8 } from "vue";
6250
6635
  function useVoiceSessionSnapshot(path, options = {}) {
6251
6636
  const store = createVoiceSessionSnapshotStore(path, options);
6252
- const error = shallowRef7(null);
6253
- const isLoading = shallowRef7(false);
6254
- const snapshot = shallowRef7();
6255
- const updatedAt = shallowRef7(undefined);
6637
+ const error = shallowRef8(null);
6638
+ const isLoading = shallowRef8(false);
6639
+ const snapshot = shallowRef8();
6640
+ const updatedAt = shallowRef8(undefined);
6256
6641
  const sync = () => {
6257
6642
  const state = store.getSnapshot();
6258
6643
  error.value = state.error;
@@ -6263,7 +6648,7 @@ function useVoiceSessionSnapshot(path, options = {}) {
6263
6648
  const unsubscribe = store.subscribe(sync);
6264
6649
  sync();
6265
6650
  store.refresh().catch(() => {});
6266
- onUnmounted7(() => {
6651
+ onUnmounted8(() => {
6267
6652
  unsubscribe();
6268
6653
  store.close();
6269
6654
  });
@@ -6278,7 +6663,7 @@ function useVoiceSessionSnapshot(path, options = {}) {
6278
6663
  }
6279
6664
 
6280
6665
  // src/vue/VoiceSessionSnapshot.ts
6281
- var VoiceSessionSnapshot = defineComponent7({
6666
+ var VoiceSessionSnapshot = defineComponent8({
6282
6667
  name: "VoiceSessionSnapshot",
6283
6668
  props: {
6284
6669
  class: { default: "", type: String },
@@ -6304,33 +6689,33 @@ var VoiceSessionSnapshot = defineComponent7({
6304
6689
  snapshot: state.snapshot.value,
6305
6690
  updatedAt: state.updatedAt.value
6306
6691
  }, options));
6307
- return () => h7("section", {
6692
+ return () => h8("section", {
6308
6693
  class: [
6309
6694
  "absolute-voice-session-snapshot",
6310
6695
  `absolute-voice-session-snapshot--${model.value.status}`,
6311
6696
  props.class
6312
6697
  ]
6313
6698
  }, [
6314
- h7("header", { class: "absolute-voice-session-snapshot__header" }, [
6315
- h7("span", { class: "absolute-voice-session-snapshot__eyebrow" }, model.value.title),
6316
- 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)
6317
6702
  ]),
6318
- h7("p", { class: "absolute-voice-session-snapshot__description" }, model.value.description),
6319
- model.value.showDownload ? h7("button", {
6703
+ h8("p", { class: "absolute-voice-session-snapshot__description" }, model.value.description),
6704
+ model.value.showDownload ? h8("button", {
6320
6705
  class: "absolute-voice-session-snapshot__download",
6321
6706
  onClick: () => state.download(),
6322
6707
  type: "button"
6323
6708
  }, props.downloadLabel ?? "Download snapshot") : null,
6324
- model.value.rows.length ? h7("dl", model.value.rows.map((row) => h7("div", { key: row.label }, [
6325
- h7("dt", row.label),
6326
- h7("dd", row.value)
6327
- ]))) : h7("p", { class: "absolute-voice-session-snapshot__empty" }, "Load a session snapshot to see support diagnostics."),
6328
- 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
6329
6714
  ]);
6330
6715
  }
6331
6716
  });
6332
6717
  // src/vue/VoiceReadinessFailures.ts
6333
- import { defineComponent as defineComponent8, h as h8 } from "vue";
6718
+ import { defineComponent as defineComponent9, h as h9 } from "vue";
6334
6719
 
6335
6720
  // src/client/readinessFailures.ts
6336
6721
  var fetchVoiceReadinessFailures = async (path = "/api/production-readiness", options = {}) => {
@@ -6408,13 +6793,13 @@ var createVoiceReadinessFailuresStore = (path = "/api/production-readiness", opt
6408
6793
  };
6409
6794
 
6410
6795
  // src/client/readinessFailuresWidget.ts
6411
- var DEFAULT_TITLE8 = "Readiness Gate Explanations";
6412
- var DEFAULT_DESCRIPTION8 = "Structured reasons for calibrated production-readiness warnings and failures.";
6413
- 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 = [
6414
6799
  { href: "/production-readiness", label: "Readiness page" },
6415
6800
  { href: "/voice/slo-readiness-thresholds", label: "Gate thresholds" }
6416
6801
  ];
6417
- 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;");
6418
6803
  var formatExplanationValue = (value, unit) => {
6419
6804
  if (value === undefined || value === null) {
6420
6805
  return "n/a";
@@ -6442,36 +6827,36 @@ var createVoiceReadinessFailuresViewModel = (snapshot, options = {}) => {
6442
6827
  const failures = snapshot.report?.checks.map(toFailureView).filter((value) => !!value) ?? [];
6443
6828
  const hasOpenIssues = failures.length > 0;
6444
6829
  return {
6445
- description: options.description ?? DEFAULT_DESCRIPTION8,
6830
+ description: options.description ?? DEFAULT_DESCRIPTION9,
6446
6831
  error: snapshot.error,
6447
6832
  failures,
6448
6833
  isLoading: snapshot.isLoading,
6449
6834
  label: snapshot.error ? "Unavailable" : snapshot.report ? hasOpenIssues ? `${failures.length} calibrated gate issue(s)` : "No calibrated gate issues" : snapshot.isLoading ? "Checking" : "No readiness report",
6450
- links: options.links ?? DEFAULT_LINKS3,
6835
+ links: options.links ?? DEFAULT_LINKS4,
6451
6836
  status: snapshot.error ? "error" : snapshot.report ? hasOpenIssues ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
6452
- title: options.title ?? DEFAULT_TITLE8,
6837
+ title: options.title ?? DEFAULT_TITLE9,
6453
6838
  updatedAt: snapshot.updatedAt
6454
6839
  };
6455
6840
  };
6456
6841
  var renderVoiceReadinessFailuresHTML = (snapshot, options = {}) => {
6457
6842
  const model = createVoiceReadinessFailuresViewModel(snapshot, options);
6458
- 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)}">
6459
- <span>${escapeHtml13(failure.status.toUpperCase())}</span>
6460
- <strong>${escapeHtml13(failure.label)}</strong>
6461
- <p>Observed ${escapeHtml13(failure.observed)} against ${escapeHtml13(failure.thresholdLabel)} ${escapeHtml13(failure.threshold)}.</p>
6462
- <p>${escapeHtml13(failure.remediation)}</p>
6463
- <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>
6464
- </article>`).join("")}</div>` : `<p class="absolute-voice-readiness-failures__empty">${model.error ? escapeHtml13(model.error) : "No calibrated readiness gate explanations are open."}</p>`;
6465
- 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>` : "";
6466
- 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)}">
6467
6852
  <header class="absolute-voice-readiness-failures__header">
6468
- <span class="absolute-voice-readiness-failures__eyebrow">${escapeHtml13(model.title)}</span>
6469
- <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>
6470
6855
  </header>
6471
- <p class="absolute-voice-readiness-failures__description">${escapeHtml13(model.description)}</p>
6856
+ <p class="absolute-voice-readiness-failures__description">${escapeHtml14(model.description)}</p>
6472
6857
  ${failures}
6473
6858
  ${links}
6474
- ${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>` : ""}
6475
6860
  </section>`;
6476
6861
  };
6477
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}`;
@@ -6512,13 +6897,13 @@ var defineVoiceReadinessFailuresElement = (tagName = "absolute-voice-readiness-f
6512
6897
  };
6513
6898
 
6514
6899
  // src/vue/useVoiceReadinessFailures.ts
6515
- import { onBeforeUnmount, readonly, ref as ref6 } from "vue";
6900
+ import { onBeforeUnmount, readonly, ref as ref7 } from "vue";
6516
6901
  var useVoiceReadinessFailures = (path = "/api/production-readiness", options = {}) => {
6517
6902
  const store = createVoiceReadinessFailuresStore(path, options);
6518
- const error = ref6(null);
6519
- const isLoading = ref6(false);
6520
- const report = ref6(undefined);
6521
- const updatedAt = ref6(undefined);
6903
+ const error = ref7(null);
6904
+ const isLoading = ref7(false);
6905
+ const report = ref7(undefined);
6906
+ const updatedAt = ref7(undefined);
6522
6907
  const sync = () => {
6523
6908
  const snapshot = store.getSnapshot();
6524
6909
  error.value = snapshot.error;
@@ -6545,7 +6930,7 @@ var useVoiceReadinessFailures = (path = "/api/production-readiness", options = {
6545
6930
  };
6546
6931
 
6547
6932
  // src/vue/VoiceReadinessFailures.ts
6548
- var VoiceReadinessFailures = defineComponent8({
6933
+ var VoiceReadinessFailures = defineComponent9({
6549
6934
  name: "VoiceReadinessFailures",
6550
6935
  props: {
6551
6936
  description: String,
@@ -6573,40 +6958,40 @@ var VoiceReadinessFailures = defineComponent8({
6573
6958
  intervalMs: props.intervalMs,
6574
6959
  title: props.title
6575
6960
  });
6576
- return h8("section", {
6961
+ return h9("section", {
6577
6962
  class: [
6578
6963
  "absolute-voice-readiness-failures",
6579
6964
  `absolute-voice-readiness-failures--${model.status}`
6580
6965
  ]
6581
6966
  }, [
6582
- h8("header", { class: "absolute-voice-readiness-failures__header" }, [
6583
- h8("span", { class: "absolute-voice-readiness-failures__eyebrow" }, model.title),
6584
- 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)
6585
6970
  ]),
6586
- h8("p", { class: "absolute-voice-readiness-failures__description" }, model.description),
6587
- 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", {
6588
6973
  class: [
6589
6974
  "absolute-voice-readiness-failures__item",
6590
6975
  `absolute-voice-readiness-failures__item--${failure.status}`
6591
6976
  ],
6592
6977
  key: failure.label
6593
6978
  }, [
6594
- h8("span", failure.status.toUpperCase()),
6595
- h8("strong", failure.label),
6596
- h8("p", `Observed ${failure.observed} against ${failure.thresholdLabel} ${failure.threshold}.`),
6597
- h8("p", failure.remediation),
6598
- h8("p", { class: "absolute-voice-readiness-failures__links" }, [
6599
- failure.evidenceHref ? h8("a", { href: failure.evidenceHref }, "Evidence") : null,
6600
- 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
6601
6986
  ])
6602
- ]))) : h8("p", { class: "absolute-voice-readiness-failures__empty" }, model.error ?? "No calibrated readiness gate explanations are open."),
6603
- 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
6604
6989
  ]);
6605
6990
  };
6606
6991
  }
6607
6992
  });
6608
6993
  // src/vue/VoiceProviderSimulationControls.ts
6609
- 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";
6610
6995
 
6611
6996
  // src/client/providerSimulationControls.ts
6612
6997
  var postSimulation = async (pathPrefix, mode, provider, fetchImpl) => {
@@ -6688,7 +7073,7 @@ var createVoiceProviderSimulationControlsStore = (options) => {
6688
7073
  };
6689
7074
 
6690
7075
  // src/client/providerSimulationControlsWidget.ts
6691
- 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;");
6692
7077
  var formatKind = (kind) => (kind ?? "stt").toUpperCase();
6693
7078
  var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
6694
7079
  const configuredProviders = options.providers.filter((provider) => provider.configured !== false);
@@ -6708,18 +7093,18 @@ var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
6708
7093
  };
6709
7094
  var renderVoiceProviderSimulationControlsHTML = (snapshot, options) => {
6710
7095
  const model = createVoiceProviderSimulationControlsViewModel(snapshot, options);
6711
- 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("");
6712
- 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("");
6713
7098
  return `<section class="absolute-voice-provider-simulation absolute-voice-provider-simulation--${snapshot.error ? "error" : snapshot.isRunning ? "running" : "ready"}">
6714
7099
  <header class="absolute-voice-provider-simulation__header">
6715
- <span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml14(model.title)}</span>
6716
- <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>
6717
7102
  </header>
6718
- <p class="absolute-voice-provider-simulation__description">${escapeHtml14(model.description)}</p>
6719
- ${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>`}
6720
7105
  <div class="absolute-voice-provider-simulation__actions">${failureButtons}${recoveryButtons}</div>
6721
- ${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml14(snapshot.error)}</p>` : ""}
6722
- ${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>` : ""}
6723
7108
  </section>`;
6724
7109
  };
6725
7110
  var bindVoiceProviderSimulationControls = (element, store) => {
@@ -6785,15 +7170,15 @@ var defineVoiceProviderSimulationControlsElement = (tagName = "absolute-voice-pr
6785
7170
  };
6786
7171
 
6787
7172
  // src/vue/useVoiceProviderSimulationControls.ts
6788
- import { onUnmounted as onUnmounted8, ref as ref7 } from "vue";
7173
+ import { onUnmounted as onUnmounted9, ref as ref8 } from "vue";
6789
7174
  function useVoiceProviderSimulationControls(options) {
6790
7175
  const store = createVoiceProviderSimulationControlsStore(options);
6791
- const error = ref7(null);
6792
- const isRunning = ref7(false);
6793
- const lastResult = ref7(null);
6794
- const mode = ref7(null);
6795
- const provider = ref7(null);
6796
- 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);
6797
7182
  const sync = () => {
6798
7183
  const snapshot = store.getSnapshot();
6799
7184
  error.value = snapshot.error;
@@ -6805,7 +7190,7 @@ function useVoiceProviderSimulationControls(options) {
6805
7190
  };
6806
7191
  const unsubscribe = store.subscribe(sync);
6807
7192
  sync();
6808
- onUnmounted8(() => {
7193
+ onUnmounted9(() => {
6809
7194
  unsubscribe();
6810
7195
  store.close();
6811
7196
  });
@@ -6821,7 +7206,7 @@ function useVoiceProviderSimulationControls(options) {
6821
7206
  }
6822
7207
 
6823
7208
  // src/vue/VoiceProviderSimulationControls.ts
6824
- var VoiceProviderSimulationControls = defineComponent9({
7209
+ var VoiceProviderSimulationControls = defineComponent10({
6825
7210
  name: "VoiceProviderSimulationControls",
6826
7211
  props: {
6827
7212
  class: { default: "", type: String },
@@ -6863,40 +7248,40 @@ var VoiceProviderSimulationControls = defineComponent9({
6863
7248
  const run = (provider, mode) => {
6864
7249
  controls.run(provider, mode).catch(() => {});
6865
7250
  };
6866
- return () => h9("section", {
7251
+ return () => h10("section", {
6867
7252
  class: [
6868
7253
  "absolute-voice-provider-simulation",
6869
7254
  `absolute-voice-provider-simulation--${controls.error.value ? "error" : controls.isRunning.value ? "running" : "ready"}`,
6870
7255
  props.class
6871
7256
  ]
6872
7257
  }, [
6873
- h9("header", { class: "absolute-voice-provider-simulation__header" }, [
6874
- h9("span", { class: "absolute-voice-provider-simulation__eyebrow" }, model.value.title),
6875
- 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)
6876
7261
  ]),
6877
- h9("p", { class: "absolute-voice-provider-simulation__description" }, model.value.description),
6878
- model.value.canSimulateFailure ? null : h9("p", { class: "absolute-voice-provider-simulation__empty" }, props.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure."),
6879
- h9("div", { class: "absolute-voice-provider-simulation__actions" }, [
6880
- ...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", {
6881
7266
  disabled: !model.value.canSimulateFailure || controls.isRunning.value,
6882
7267
  key: `fail-${provider.provider}`,
6883
7268
  onClick: () => run(provider.provider, "failure"),
6884
7269
  type: "button"
6885
7270
  }, `Simulate ${provider.provider} ${props.kind.toUpperCase()} failure`)),
6886
- ...model.value.providers.map((provider) => h9("button", {
7271
+ ...model.value.providers.map((provider) => h10("button", {
6887
7272
  disabled: controls.isRunning.value,
6888
7273
  key: `recover-${provider.provider}`,
6889
7274
  onClick: () => run(provider.provider, "recovery"),
6890
7275
  type: "button"
6891
7276
  }, `Mark ${provider.provider} recovered`))
6892
7277
  ]),
6893
- controls.error.value ? h9("p", { class: "absolute-voice-provider-simulation__error" }, controls.error.value) : null,
6894
- 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
6895
7280
  ]);
6896
7281
  }
6897
7282
  });
6898
7283
  // src/vue/VoiceProviderCapabilities.ts
6899
- 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";
6900
7285
 
6901
7286
  // src/client/providerCapabilities.ts
6902
7287
  var fetchVoiceProviderCapabilities = async (path = "/api/provider-capabilities", options = {}) => {
@@ -6978,9 +7363,9 @@ var createVoiceProviderCapabilitiesStore = (path = "/api/provider-capabilities",
6978
7363
  };
6979
7364
 
6980
7365
  // src/client/providerCapabilitiesWidget.ts
6981
- var DEFAULT_TITLE9 = "Provider Capabilities";
6982
- var DEFAULT_DESCRIPTION9 = "Configured, selected, and healthy voice providers for this deployment.";
6983
- 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;");
6984
7369
  var formatProvider = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
6985
7370
  var formatKind2 = (kind) => kind.toUpperCase();
6986
7371
  var formatStatus3 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
@@ -7024,36 +7409,36 @@ var createVoiceProviderCapabilitiesViewModel = (snapshot, options = {}) => {
7024
7409
  const selectedCount = snapshot.report?.selected ?? capabilities.filter((capability) => capability.selected).length;
7025
7410
  return {
7026
7411
  capabilities,
7027
- description: options.description ?? DEFAULT_DESCRIPTION9,
7412
+ description: options.description ?? DEFAULT_DESCRIPTION10,
7028
7413
  error: snapshot.error,
7029
7414
  isLoading: snapshot.isLoading,
7030
7415
  label: snapshot.error ? "Unavailable" : capabilities.length ? warningCount > 0 ? `${warningCount} needs attention` : `${selectedCount} selected` : snapshot.isLoading ? "Checking" : "No capabilities",
7031
7416
  status: snapshot.error ? "error" : capabilities.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
7032
- title: options.title ?? DEFAULT_TITLE9,
7417
+ title: options.title ?? DEFAULT_TITLE10,
7033
7418
  updatedAt: snapshot.updatedAt
7034
7419
  };
7035
7420
  };
7036
7421
  var renderVoiceProviderCapabilitiesHTML = (snapshot, options = {}) => {
7037
7422
  const model = createVoiceProviderCapabilitiesViewModel(snapshot, options);
7038
- 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)}">
7039
7424
  <header>
7040
- <strong>${escapeHtml15(capability.label)}</strong>
7041
- <span>${escapeHtml15(formatStatus3(capability.status))}</span>
7425
+ <strong>${escapeHtml16(capability.label)}</strong>
7426
+ <span>${escapeHtml16(formatStatus3(capability.status))}</span>
7042
7427
  </header>
7043
- <p>${escapeHtml15(capability.detail)}</p>
7428
+ <p>${escapeHtml16(capability.detail)}</p>
7044
7429
  <dl>${capability.rows.map((row) => `<div>
7045
- <dt>${escapeHtml15(row.label)}</dt>
7046
- <dd>${escapeHtml15(row.value)}</dd>
7430
+ <dt>${escapeHtml16(row.label)}</dt>
7431
+ <dd>${escapeHtml16(row.value)}</dd>
7047
7432
  </div>`).join("")}</dl>
7048
7433
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-capabilities__empty">Configure provider capabilities to see deployment coverage.</p>';
7049
- 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)}">
7050
7435
  <header class="absolute-voice-provider-capabilities__header">
7051
- <span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml15(model.title)}</span>
7052
- <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>
7053
7438
  </header>
7054
- <p class="absolute-voice-provider-capabilities__description">${escapeHtml15(model.description)}</p>
7439
+ <p class="absolute-voice-provider-capabilities__description">${escapeHtml16(model.description)}</p>
7055
7440
  ${capabilities}
7056
- ${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>` : ""}
7057
7442
  </section>`;
7058
7443
  };
7059
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}`;
@@ -7095,13 +7480,13 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
7095
7480
  };
7096
7481
 
7097
7482
  // src/vue/useVoiceProviderCapabilities.ts
7098
- import { onUnmounted as onUnmounted9, shallowRef as shallowRef8 } from "vue";
7483
+ import { onUnmounted as onUnmounted10, shallowRef as shallowRef9 } from "vue";
7099
7484
  function useVoiceProviderCapabilities(path = "/api/provider-capabilities", options = {}) {
7100
7485
  const store = createVoiceProviderCapabilitiesStore(path, options);
7101
- const error = shallowRef8(null);
7102
- const isLoading = shallowRef8(false);
7103
- const report = shallowRef8();
7104
- const updatedAt = shallowRef8(undefined);
7486
+ const error = shallowRef9(null);
7487
+ const isLoading = shallowRef9(false);
7488
+ const report = shallowRef9();
7489
+ const updatedAt = shallowRef9(undefined);
7105
7490
  const sync = () => {
7106
7491
  const snapshot = store.getSnapshot();
7107
7492
  error.value = snapshot.error;
@@ -7112,7 +7497,7 @@ function useVoiceProviderCapabilities(path = "/api/provider-capabilities", optio
7112
7497
  const unsubscribe = store.subscribe(sync);
7113
7498
  sync();
7114
7499
  store.refresh().catch(() => {});
7115
- onUnmounted9(() => {
7500
+ onUnmounted10(() => {
7116
7501
  unsubscribe();
7117
7502
  store.close();
7118
7503
  });
@@ -7126,7 +7511,7 @@ function useVoiceProviderCapabilities(path = "/api/provider-capabilities", optio
7126
7511
  }
7127
7512
 
7128
7513
  // src/vue/VoiceProviderCapabilities.ts
7129
- var VoiceProviderCapabilities = defineComponent10({
7514
+ var VoiceProviderCapabilities = defineComponent11({
7130
7515
  name: "VoiceProviderCapabilities",
7131
7516
  props: {
7132
7517
  class: {
@@ -7163,44 +7548,44 @@ var VoiceProviderCapabilities = defineComponent10({
7163
7548
  report: capabilities.report.value,
7164
7549
  updatedAt: capabilities.updatedAt.value
7165
7550
  }, options));
7166
- return () => h10("section", {
7551
+ return () => h11("section", {
7167
7552
  class: [
7168
7553
  "absolute-voice-provider-capabilities",
7169
7554
  `absolute-voice-provider-capabilities--${model.value.status}`,
7170
7555
  props.class
7171
7556
  ]
7172
7557
  }, [
7173
- h10("header", { class: "absolute-voice-provider-capabilities__header" }, [
7174
- h10("span", { class: "absolute-voice-provider-capabilities__eyebrow" }, model.value.title),
7175
- 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)
7176
7561
  ]),
7177
- h10("p", { class: "absolute-voice-provider-capabilities__description" }, model.value.description),
7178
- 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", {
7179
7564
  class: [
7180
7565
  "absolute-voice-provider-capabilities__provider",
7181
7566
  `absolute-voice-provider-capabilities__provider--${capability.status}`
7182
7567
  ],
7183
7568
  key: `${capability.kind}:${capability.provider}`
7184
7569
  }, [
7185
- h10("header", [
7186
- h10("strong", capability.label),
7187
- h10("span", capability.status)
7570
+ h11("header", [
7571
+ h11("strong", capability.label),
7572
+ h11("span", capability.status)
7188
7573
  ]),
7189
- h10("p", capability.detail),
7190
- h10("dl", capability.rows.map((row) => h10("div", { key: row.label }, [
7191
- h10("dt", row.label),
7192
- 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)
7193
7578
  ])))
7194
- ]))) : h10("p", { class: "absolute-voice-provider-capabilities__empty" }, "Configure provider capabilities to see deployment coverage."),
7195
- 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
7196
7581
  ]);
7197
7582
  }
7198
7583
  });
7199
7584
  // src/vue/VoiceProviderContracts.ts
7200
- import { defineComponent as defineComponent11, h as h11 } from "vue";
7585
+ import { defineComponent as defineComponent12, h as h12 } from "vue";
7201
7586
 
7202
7587
  // src/vue/useVoiceProviderContracts.ts
7203
- import { onUnmounted as onUnmounted10, shallowRef as shallowRef9 } from "vue";
7588
+ import { onUnmounted as onUnmounted11, shallowRef as shallowRef10 } from "vue";
7204
7589
 
7205
7590
  // src/client/providerContracts.ts
7206
7591
  var fetchVoiceProviderContracts = async (path = "/api/provider-contracts", options = {}) => {
@@ -7280,10 +7665,10 @@ var createVoiceProviderContractsStore = (path = "/api/provider-contracts", optio
7280
7665
  // src/vue/useVoiceProviderContracts.ts
7281
7666
  function useVoiceProviderContracts(path = "/api/provider-contracts", options = {}) {
7282
7667
  const store = createVoiceProviderContractsStore(path, options);
7283
- const error = shallowRef9(null);
7284
- const isLoading = shallowRef9(false);
7285
- const report = shallowRef9();
7286
- const updatedAt = shallowRef9(undefined);
7668
+ const error = shallowRef10(null);
7669
+ const isLoading = shallowRef10(false);
7670
+ const report = shallowRef10();
7671
+ const updatedAt = shallowRef10(undefined);
7287
7672
  const sync = () => {
7288
7673
  const snapshot = store.getSnapshot();
7289
7674
  error.value = snapshot.error;
@@ -7294,7 +7679,7 @@ function useVoiceProviderContracts(path = "/api/provider-contracts", options = {
7294
7679
  const unsubscribe = store.subscribe(sync);
7295
7680
  sync();
7296
7681
  store.refresh().catch(() => {});
7297
- onUnmounted10(() => {
7682
+ onUnmounted11(() => {
7298
7683
  unsubscribe();
7299
7684
  store.close();
7300
7685
  });
@@ -7308,9 +7693,9 @@ function useVoiceProviderContracts(path = "/api/provider-contracts", options = {
7308
7693
  }
7309
7694
 
7310
7695
  // src/client/providerContractsWidget.ts
7311
- var DEFAULT_TITLE10 = "Provider Contracts";
7312
- var DEFAULT_DESCRIPTION10 = "Production contract coverage for provider env, latency, fallback, streaming, and capabilities.";
7313
- 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;");
7314
7699
  var formatProvider2 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
7315
7700
  var formatStatus4 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
7316
7701
  var contractDetail = (row) => {
@@ -7342,38 +7727,38 @@ var createVoiceProviderContractsViewModel = (snapshot, options = {}) => {
7342
7727
  }));
7343
7728
  const warningCount = snapshot.report ? snapshot.report.failed + snapshot.report.warned : rows.filter((row) => row.status !== "pass").length;
7344
7729
  return {
7345
- description: options.description ?? DEFAULT_DESCRIPTION10,
7730
+ description: options.description ?? DEFAULT_DESCRIPTION11,
7346
7731
  error: snapshot.error,
7347
7732
  isLoading: snapshot.isLoading,
7348
7733
  label: snapshot.error ? "Unavailable" : rows.length ? warningCount > 0 ? `${warningCount} needs attention` : `${rows.length} passing` : snapshot.isLoading ? "Checking" : "No contracts",
7349
7734
  rows,
7350
7735
  status: snapshot.error ? "error" : rows.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
7351
- title: options.title ?? DEFAULT_TITLE10,
7736
+ title: options.title ?? DEFAULT_TITLE11,
7352
7737
  updatedAt: snapshot.updatedAt
7353
7738
  };
7354
7739
  };
7355
7740
  var renderVoiceProviderContractsHTML = (snapshot, options = {}) => {
7356
7741
  const model = createVoiceProviderContractsViewModel(snapshot, options);
7357
- 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)}">
7358
7743
  <header>
7359
- <strong>${escapeHtml16(row.label)}</strong>
7360
- <span>${escapeHtml16(formatStatus4(row.status))}</span>
7744
+ <strong>${escapeHtml17(row.label)}</strong>
7745
+ <span>${escapeHtml17(formatStatus4(row.status))}</span>
7361
7746
  </header>
7362
- <p>${escapeHtml16(row.detail)}</p>
7363
- ${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>` : ""}
7364
7749
  <dl>${row.rows.map((item) => `<div>
7365
- <dt>${escapeHtml16(item.label)}</dt>
7366
- <dd>${escapeHtml16(item.value)}</dd>
7750
+ <dt>${escapeHtml17(item.label)}</dt>
7751
+ <dd>${escapeHtml17(item.value)}</dd>
7367
7752
  </div>`).join("")}</dl>
7368
7753
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-contracts__empty">Configure provider contracts to see production coverage.</p>';
7369
- 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)}">
7370
7755
  <header class="absolute-voice-provider-contracts__header">
7371
- <span class="absolute-voice-provider-contracts__eyebrow">${escapeHtml16(model.title)}</span>
7372
- <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>
7373
7758
  </header>
7374
- <p class="absolute-voice-provider-contracts__description">${escapeHtml16(model.description)}</p>
7759
+ <p class="absolute-voice-provider-contracts__description">${escapeHtml17(model.description)}</p>
7375
7760
  ${rows}
7376
- ${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>` : ""}
7377
7762
  </section>`;
7378
7763
  };
7379
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}`;
@@ -7415,7 +7800,7 @@ var defineVoiceProviderContractsElement = (tagName = "absolute-voice-provider-co
7415
7800
  };
7416
7801
 
7417
7802
  // src/vue/VoiceProviderContracts.ts
7418
- var VoiceProviderContracts = defineComponent11({
7803
+ var VoiceProviderContracts = defineComponent12({
7419
7804
  name: "VoiceProviderContracts",
7420
7805
  props: {
7421
7806
  description: String,
@@ -7443,49 +7828,49 @@ var VoiceProviderContracts = defineComponent11({
7443
7828
  intervalMs: props.intervalMs,
7444
7829
  title: props.title
7445
7830
  });
7446
- return h11("section", {
7831
+ return h12("section", {
7447
7832
  class: [
7448
7833
  "absolute-voice-provider-contracts",
7449
7834
  `absolute-voice-provider-contracts--${model.status}`
7450
7835
  ]
7451
7836
  }, [
7452
- h11("header", { class: "absolute-voice-provider-contracts__header" }, [
7453
- h11("span", { class: "absolute-voice-provider-contracts__eyebrow" }, model.title),
7454
- 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)
7455
7840
  ]),
7456
- h11("p", { class: "absolute-voice-provider-contracts__description" }, model.description),
7457
- 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", {
7458
7843
  class: [
7459
7844
  "absolute-voice-provider-contracts__row",
7460
7845
  `absolute-voice-provider-contracts__row--${row.status}`
7461
7846
  ],
7462
7847
  key: `${row.kind}:${row.provider}`
7463
7848
  }, [
7464
- h11("header", [
7465
- h11("strong", row.label),
7466
- h11("span", row.status)
7849
+ h12("header", [
7850
+ h12("strong", row.label),
7851
+ h12("span", row.status)
7467
7852
  ]),
7468
- h11("p", row.detail),
7469
- row.remediations.length ? h11("ul", {
7853
+ h12("p", row.detail),
7854
+ row.remediations.length ? h12("ul", {
7470
7855
  class: "absolute-voice-provider-contracts__remediations"
7471
- }, row.remediations.map((remediation) => h11("li", {
7856
+ }, row.remediations.map((remediation) => h12("li", {
7472
7857
  key: `${row.kind}:${row.provider}:${remediation.label}`
7473
7858
  }, [
7474
- remediation.href ? h11("a", { href: remediation.href }, remediation.label) : h11("strong", remediation.label),
7475
- h11("span", remediation.detail)
7859
+ remediation.href ? h12("a", { href: remediation.href }, remediation.label) : h12("strong", remediation.label),
7860
+ h12("span", remediation.detail)
7476
7861
  ]))) : null,
7477
- h11("dl", row.rows.map((item) => h11("div", { key: item.label }, [
7478
- h11("dt", item.label),
7479
- 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)
7480
7865
  ])))
7481
- ]))) : h11("p", { class: "absolute-voice-provider-contracts__empty" }, "Configure provider contracts to see production coverage."),
7482
- 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
7483
7868
  ]);
7484
7869
  };
7485
7870
  }
7486
7871
  });
7487
7872
  // src/vue/VoiceProviderStatus.ts
7488
- 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";
7489
7874
 
7490
7875
  // src/client/providerStatus.ts
7491
7876
  var fetchVoiceProviderStatus = async (path = "/api/provider-status", options = {}) => {
@@ -7568,9 +7953,9 @@ var createVoiceProviderStatusStore = (path = "/api/provider-status", options = {
7568
7953
  };
7569
7954
 
7570
7955
  // src/client/providerStatusWidget.ts
7571
- var DEFAULT_TITLE11 = "Voice Providers";
7572
- var DEFAULT_DESCRIPTION11 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
7573
- 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;");
7574
7959
  var formatProvider3 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
7575
7960
  var formatStatus5 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
7576
7961
  var formatLatency = (value) => typeof value === "number" ? `${value}ms` : "No samples";
@@ -7614,37 +7999,37 @@ var createVoiceProviderStatusViewModel = (snapshot, options = {}) => {
7614
7999
  const warningCount = providers.filter((provider) => isWarningStatus2(provider.status)).length;
7615
8000
  const healthyCount = providers.filter((provider) => provider.status === "healthy").length;
7616
8001
  return {
7617
- description: options.description ?? DEFAULT_DESCRIPTION11,
8002
+ description: options.description ?? DEFAULT_DESCRIPTION12,
7618
8003
  error: snapshot.error,
7619
8004
  isLoading: snapshot.isLoading,
7620
8005
  label: snapshot.error ? "Unavailable" : providers.length ? warningCount > 0 ? `${warningCount} needs attention` : `${healthyCount} healthy` : snapshot.isLoading ? "Checking" : "No provider traffic",
7621
8006
  providers,
7622
8007
  status: snapshot.error ? "error" : providers.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
7623
- title: options.title ?? DEFAULT_TITLE11,
8008
+ title: options.title ?? DEFAULT_TITLE12,
7624
8009
  updatedAt: snapshot.updatedAt
7625
8010
  };
7626
8011
  };
7627
8012
  var renderVoiceProviderStatusHTML = (snapshot, options = {}) => {
7628
8013
  const model = createVoiceProviderStatusViewModel(snapshot, options);
7629
- 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)}">
7630
8015
  <header>
7631
- <strong>${escapeHtml17(provider.label)}</strong>
7632
- <span>${escapeHtml17(formatStatus5(provider.status))}</span>
8016
+ <strong>${escapeHtml18(provider.label)}</strong>
8017
+ <span>${escapeHtml18(formatStatus5(provider.status))}</span>
7633
8018
  </header>
7634
- <p>${escapeHtml17(provider.detail)}</p>
8019
+ <p>${escapeHtml18(provider.detail)}</p>
7635
8020
  <dl>${provider.rows.map((row) => `<div>
7636
- <dt>${escapeHtml17(row.label)}</dt>
7637
- <dd>${escapeHtml17(row.value)}</dd>
8021
+ <dt>${escapeHtml18(row.label)}</dt>
8022
+ <dd>${escapeHtml18(row.value)}</dd>
7638
8023
  </div>`).join("")}</dl>
7639
8024
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-status__empty">Run voice traffic to see provider health.</p>';
7640
- 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)}">
7641
8026
  <header class="absolute-voice-provider-status__header">
7642
- <span class="absolute-voice-provider-status__eyebrow">${escapeHtml17(model.title)}</span>
7643
- <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>
7644
8029
  </header>
7645
- <p class="absolute-voice-provider-status__description">${escapeHtml17(model.description)}</p>
8030
+ <p class="absolute-voice-provider-status__description">${escapeHtml18(model.description)}</p>
7646
8031
  ${providers}
7647
- ${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>` : ""}
7648
8033
  </section>`;
7649
8034
  };
7650
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}`;
@@ -7686,13 +8071,13 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
7686
8071
  };
7687
8072
 
7688
8073
  // src/vue/useVoiceProviderStatus.ts
7689
- 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";
7690
8075
  function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
7691
8076
  const store = createVoiceProviderStatusStore(path, options);
7692
- const error = ref8(null);
7693
- const isLoading = ref8(false);
7694
- const providers = shallowRef10([]);
7695
- const updatedAt = ref8(undefined);
8077
+ const error = ref9(null);
8078
+ const isLoading = ref9(false);
8079
+ const providers = shallowRef11([]);
8080
+ const updatedAt = ref9(undefined);
7696
8081
  const sync = () => {
7697
8082
  const snapshot = store.getSnapshot();
7698
8083
  error.value = snapshot.error;
@@ -7703,7 +8088,7 @@ function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
7703
8088
  const unsubscribe = store.subscribe(sync);
7704
8089
  sync();
7705
8090
  store.refresh().catch(() => {});
7706
- onUnmounted11(() => {
8091
+ onUnmounted12(() => {
7707
8092
  unsubscribe();
7708
8093
  store.close();
7709
8094
  });
@@ -7717,7 +8102,7 @@ function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
7717
8102
  }
7718
8103
 
7719
8104
  // src/vue/VoiceProviderStatus.ts
7720
- var VoiceProviderStatus = defineComponent12({
8105
+ var VoiceProviderStatus = defineComponent13({
7721
8106
  name: "VoiceProviderStatus",
7722
8107
  props: {
7723
8108
  class: {
@@ -7754,41 +8139,41 @@ var VoiceProviderStatus = defineComponent12({
7754
8139
  providers: status.providers.value,
7755
8140
  updatedAt: status.updatedAt.value
7756
8141
  }, options));
7757
- return () => h12("section", {
8142
+ return () => h13("section", {
7758
8143
  class: [
7759
8144
  "absolute-voice-provider-status",
7760
8145
  `absolute-voice-provider-status--${model.value.status}`,
7761
8146
  props.class
7762
8147
  ]
7763
8148
  }, [
7764
- h12("header", { class: "absolute-voice-provider-status__header" }, [
7765
- h12("span", { class: "absolute-voice-provider-status__eyebrow" }, model.value.title),
7766
- 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)
7767
8152
  ]),
7768
- h12("p", { class: "absolute-voice-provider-status__description" }, model.value.description),
7769
- 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", {
7770
8155
  class: [
7771
8156
  "absolute-voice-provider-status__provider",
7772
8157
  `absolute-voice-provider-status__provider--${provider.status}`
7773
8158
  ],
7774
8159
  key: provider.provider
7775
8160
  }, [
7776
- h12("header", [
7777
- h12("strong", provider.label),
7778
- h12("span", provider.status)
8161
+ h13("header", [
8162
+ h13("strong", provider.label),
8163
+ h13("span", provider.status)
7779
8164
  ]),
7780
- h12("p", provider.detail),
7781
- h12("dl", provider.rows.map((row) => h12("div", { key: row.label }, [
7782
- h12("dt", row.label),
7783
- 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)
7784
8169
  ])))
7785
- ]))) : h12("p", { class: "absolute-voice-provider-status__empty" }, "Run voice traffic to see provider health."),
7786
- 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
7787
8172
  ]);
7788
8173
  }
7789
8174
  });
7790
8175
  // src/vue/VoiceRoutingStatus.ts
7791
- 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";
7792
8177
 
7793
8178
  // src/client/routingStatus.ts
7794
8179
  var fetchVoiceRoutingStatus = async (path = "/api/routing/latest", options = {}) => {
@@ -7871,9 +8256,9 @@ var createVoiceRoutingStatusStore = (path = "/api/routing/latest", options = {})
7871
8256
  };
7872
8257
 
7873
8258
  // src/client/routingStatusWidget.ts
7874
- var DEFAULT_TITLE12 = "Voice Routing";
7875
- var DEFAULT_DESCRIPTION12 = "Latest provider routing decision from the self-hosted trace store.";
7876
- 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;");
7877
8262
  var formatValue = (value, fallback = "None") => typeof value === "string" && value.trim() ? value : typeof value === "number" && Number.isFinite(value) ? String(value) : fallback;
7878
8263
  var formatProviderRoutes = (routes) => routes && typeof routes === "object" ? Object.entries(routes).map(([role, provider]) => `${role}: ${formatValue(provider)}`).join(", ") || "None" : "None";
7879
8264
  var getProviderRoute = (routes, role) => routes && typeof routes === "object" ? formatValue(routes[role], "Not configured") : "Not configured";
@@ -7942,35 +8327,35 @@ var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
7942
8327
  return {
7943
8328
  activeStack,
7944
8329
  decision,
7945
- description: options.description ?? DEFAULT_DESCRIPTION12,
8330
+ description: options.description ?? DEFAULT_DESCRIPTION13,
7946
8331
  error: snapshot.error,
7947
8332
  isLoading: snapshot.isLoading,
7948
8333
  label: snapshot.error ? "Unavailable" : decision ? `${formatValue(decision.kind).toUpperCase()} ${formatValue(decision.status, "unknown")}` : snapshot.isLoading ? "Checking" : "No routing yet",
7949
8334
  rows,
7950
8335
  status: snapshot.error ? "error" : decision ? "ready" : snapshot.isLoading ? "loading" : "empty",
7951
- title: options.title ?? DEFAULT_TITLE12,
8336
+ title: options.title ?? DEFAULT_TITLE13,
7952
8337
  updatedAt: snapshot.updatedAt
7953
8338
  };
7954
8339
  };
7955
8340
  var renderVoiceRoutingStatusHTML = (snapshot, options = {}) => {
7956
8341
  const model = createVoiceRoutingStatusViewModel(snapshot, options);
7957
8342
  const activeStack = model.activeStack.length ? `<div class="absolute-voice-routing-status__stack" aria-label="Active voice stack">${model.activeStack.map((item) => `<div>
7958
- <span>${escapeHtml18(item.label)}</span>
7959
- <strong>${escapeHtml18(item.value)}</strong>
8343
+ <span>${escapeHtml19(item.label)}</span>
8344
+ <strong>${escapeHtml19(item.value)}</strong>
7960
8345
  </div>`).join("")}</div>` : "";
7961
8346
  const rows = model.rows.length ? `<div class="absolute-voice-routing-status__grid">${model.rows.map((row) => `<div>
7962
- <span>${escapeHtml18(row.label)}</span>
7963
- <strong>${escapeHtml18(row.value)}</strong>
8347
+ <span>${escapeHtml19(row.label)}</span>
8348
+ <strong>${escapeHtml19(row.value)}</strong>
7964
8349
  </div>`).join("")}</div>` : '<p class="absolute-voice-routing-status__empty">Start a voice session to see the selected provider.</p>';
7965
- 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)}">
7966
8351
  <header class="absolute-voice-routing-status__header">
7967
- <span class="absolute-voice-routing-status__eyebrow">${escapeHtml18(model.title)}</span>
7968
- <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>
7969
8354
  </header>
7970
- <p class="absolute-voice-routing-status__description">${escapeHtml18(model.description)}</p>
8355
+ <p class="absolute-voice-routing-status__description">${escapeHtml19(model.description)}</p>
7971
8356
  ${activeStack}
7972
8357
  ${rows}
7973
- ${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>` : ""}
7974
8359
  </section>`;
7975
8360
  };
7976
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}}`;
@@ -8012,13 +8397,13 @@ var defineVoiceRoutingStatusElement = (tagName = "absolute-voice-routing-status"
8012
8397
  };
8013
8398
 
8014
8399
  // src/vue/useVoiceRoutingStatus.ts
8015
- 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";
8016
8401
  function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
8017
8402
  const store = createVoiceRoutingStatusStore(path, options);
8018
- const decision = shallowRef11(null);
8019
- const error = ref9(null);
8020
- const isLoading = ref9(false);
8021
- const updatedAt = ref9(undefined);
8403
+ const decision = shallowRef12(null);
8404
+ const error = ref10(null);
8405
+ const isLoading = ref10(false);
8406
+ const updatedAt = ref10(undefined);
8022
8407
  const sync = () => {
8023
8408
  const snapshot = store.getSnapshot();
8024
8409
  decision.value = snapshot.decision;
@@ -8029,7 +8414,7 @@ function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
8029
8414
  const unsubscribe = store.subscribe(sync);
8030
8415
  sync();
8031
8416
  store.refresh().catch(() => {});
8032
- onUnmounted12(() => {
8417
+ onUnmounted13(() => {
8033
8418
  unsubscribe();
8034
8419
  store.close();
8035
8420
  });
@@ -8043,7 +8428,7 @@ function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
8043
8428
  }
8044
8429
 
8045
8430
  // src/vue/VoiceRoutingStatus.ts
8046
- var VoiceRoutingStatus = defineComponent13({
8431
+ var VoiceRoutingStatus = defineComponent14({
8047
8432
  name: "VoiceRoutingStatus",
8048
8433
  props: {
8049
8434
  class: {
@@ -8080,28 +8465,28 @@ var VoiceRoutingStatus = defineComponent13({
8080
8465
  isLoading: status.isLoading.value,
8081
8466
  updatedAt: status.updatedAt.value
8082
8467
  }, options));
8083
- return () => h13("section", {
8468
+ return () => h14("section", {
8084
8469
  class: [
8085
8470
  "absolute-voice-routing-status",
8086
8471
  `absolute-voice-routing-status--${model.value.status}`,
8087
8472
  props.class
8088
8473
  ]
8089
8474
  }, [
8090
- h13("header", { class: "absolute-voice-routing-status__header" }, [
8091
- h13("span", { class: "absolute-voice-routing-status__eyebrow" }, model.value.title),
8092
- 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)
8093
8478
  ]),
8094
- h13("p", { class: "absolute-voice-routing-status__description" }, model.value.description),
8095
- model.value.rows.length ? h13("div", { class: "absolute-voice-routing-status__grid" }, model.value.rows.map((row) => h13("div", { key: row.label }, [
8096
- h13("span", row.label),
8097
- h13("strong", row.value)
8098
- ]))) : h13("p", { class: "absolute-voice-routing-status__empty" }, "Start a voice session to see the selected provider."),
8099
- 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
8100
8485
  ]);
8101
8486
  }
8102
8487
  });
8103
8488
  // src/vue/useVoiceAgentSquadStatus.ts
8104
- 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";
8105
8490
 
8106
8491
  // src/client/traceTimeline.ts
8107
8492
  var fetchVoiceTraceTimeline = async (path = "/api/voice-traces", options = {}) => {
@@ -8260,11 +8645,11 @@ var createVoiceAgentSquadStatusStore = (path = "/api/voice-traces", options = {}
8260
8645
  // src/vue/useVoiceAgentSquadStatus.ts
8261
8646
  function useVoiceAgentSquadStatus(path = "/api/voice-traces", options = {}) {
8262
8647
  const store = createVoiceAgentSquadStatusStore(path, options);
8263
- const current = shallowRef12(undefined);
8264
- const error = ref10(null);
8265
- const isLoading = ref10(false);
8266
- const report = shallowRef12(undefined);
8267
- 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);
8268
8653
  const sync = () => {
8269
8654
  const snapshot = store.getSnapshot();
8270
8655
  current.value = snapshot.report.current;
@@ -8278,7 +8663,7 @@ function useVoiceAgentSquadStatus(path = "/api/voice-traces", options = {}) {
8278
8663
  if (typeof window !== "undefined") {
8279
8664
  store.refresh().catch(() => {});
8280
8665
  }
8281
- onUnmounted13(() => {
8666
+ onUnmounted14(() => {
8282
8667
  unsubscribe();
8283
8668
  store.close();
8284
8669
  });
@@ -8292,7 +8677,7 @@ function useVoiceAgentSquadStatus(path = "/api/voice-traces", options = {}) {
8292
8677
  };
8293
8678
  }
8294
8679
  // src/vue/VoiceTurnLatency.ts
8295
- 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";
8296
8681
 
8297
8682
  // src/client/turnLatency.ts
8298
8683
  var fetchVoiceTurnLatency = async (path = "/api/turn-latency", options = {}) => {
@@ -8398,56 +8783,56 @@ var createVoiceTurnLatencyStore = (path = "/api/turn-latency", options = {}) =>
8398
8783
  };
8399
8784
 
8400
8785
  // src/client/turnLatencyWidget.ts
8401
- var DEFAULT_TITLE13 = "Turn Latency";
8402
- 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.";
8403
8788
  var DEFAULT_PROOF_LABEL = "Run latency proof";
8404
- var escapeHtml19 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
8405
- 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";
8406
8791
  var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
8407
8792
  const turns = (snapshot.report?.turns ?? []).map((turn) => ({
8408
8793
  ...turn,
8409
8794
  label: turn.text || "Empty turn",
8410
8795
  rows: turn.stages.map((stage) => ({
8411
8796
  label: stage.label,
8412
- value: formatMs2(stage.valueMs)
8797
+ value: formatMs3(stage.valueMs)
8413
8798
  }))
8414
8799
  }));
8415
8800
  const warningCount = snapshot.report?.warnings ?? turns.filter((turn) => turn.status === "warn").length;
8416
8801
  const failedCount = snapshot.report?.failed ?? turns.filter((turn) => turn.status === "fail").length;
8417
8802
  return {
8418
- description: options.description ?? DEFAULT_DESCRIPTION13,
8803
+ description: options.description ?? DEFAULT_DESCRIPTION14,
8419
8804
  error: snapshot.error,
8420
8805
  isLoading: snapshot.isLoading,
8421
- 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",
8422
8807
  proofLabel: options.proofPath ? options.proofLabel ?? DEFAULT_PROOF_LABEL : undefined,
8423
8808
  showProofAction: Boolean(options.proofPath),
8424
8809
  status: snapshot.error ? "error" : turns.length ? failedCount > 0 || warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
8425
- title: options.title ?? DEFAULT_TITLE13,
8810
+ title: options.title ?? DEFAULT_TITLE14,
8426
8811
  turns,
8427
8812
  updatedAt: snapshot.updatedAt
8428
8813
  };
8429
8814
  };
8430
8815
  var renderVoiceTurnLatencyHTML = (snapshot, options = {}) => {
8431
8816
  const model = createVoiceTurnLatencyViewModel(snapshot, options);
8432
- 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)}">
8433
8818
  <header>
8434
- <strong>${escapeHtml19(turn.label)}</strong>
8435
- <span>${escapeHtml19(turn.status)}</span>
8819
+ <strong>${escapeHtml20(turn.label)}</strong>
8820
+ <span>${escapeHtml20(turn.status)}</span>
8436
8821
  </header>
8437
8822
  <dl>${turn.rows.map((row) => `<div>
8438
- <dt>${escapeHtml19(row.label)}</dt>
8439
- <dd>${escapeHtml19(row.value)}</dd>
8823
+ <dt>${escapeHtml20(row.label)}</dt>
8824
+ <dd>${escapeHtml20(row.value)}</dd>
8440
8825
  </div>`).join("")}</dl>
8441
8826
  </article>`).join("")}</div>` : '<p class="absolute-voice-turn-latency__empty">Complete a voice turn to see latency diagnostics.</p>';
8442
- 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)}">
8443
8828
  <header class="absolute-voice-turn-latency__header">
8444
- <span class="absolute-voice-turn-latency__eyebrow">${escapeHtml19(model.title)}</span>
8445
- <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>
8446
8831
  </header>
8447
- <p class="absolute-voice-turn-latency__description">${escapeHtml19(model.description)}</p>
8448
- ${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>` : ""}
8449
8834
  ${turns}
8450
- ${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>` : ""}
8451
8836
  </section>`;
8452
8837
  };
8453
8838
  var mountVoiceTurnLatency = (element, path = "/api/turn-latency", options = {}) => {
@@ -8498,13 +8883,13 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
8498
8883
  };
8499
8884
 
8500
8885
  // src/vue/useVoiceTurnLatency.ts
8501
- import { onUnmounted as onUnmounted14, shallowRef as shallowRef13 } from "vue";
8886
+ import { onUnmounted as onUnmounted15, shallowRef as shallowRef14 } from "vue";
8502
8887
  function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
8503
8888
  const store = createVoiceTurnLatencyStore(path, options);
8504
- const error = shallowRef13(null);
8505
- const isLoading = shallowRef13(false);
8506
- const report = shallowRef13();
8507
- const updatedAt = shallowRef13(undefined);
8889
+ const error = shallowRef14(null);
8890
+ const isLoading = shallowRef14(false);
8891
+ const report = shallowRef14();
8892
+ const updatedAt = shallowRef14(undefined);
8508
8893
  const sync = () => {
8509
8894
  const snapshot = store.getSnapshot();
8510
8895
  error.value = snapshot.error;
@@ -8515,7 +8900,7 @@ function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
8515
8900
  const unsubscribe = store.subscribe(sync);
8516
8901
  sync();
8517
8902
  store.refresh().catch(() => {});
8518
- onUnmounted14(() => {
8903
+ onUnmounted15(() => {
8519
8904
  unsubscribe();
8520
8905
  store.close();
8521
8906
  });
@@ -8530,7 +8915,7 @@ function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
8530
8915
  }
8531
8916
 
8532
8917
  // src/vue/VoiceTurnLatency.ts
8533
- var VoiceTurnLatency = defineComponent14({
8918
+ var VoiceTurnLatency = defineComponent15({
8534
8919
  name: "VoiceTurnLatency",
8535
8920
  props: {
8536
8921
  class: { default: "", type: String },
@@ -8556,47 +8941,47 @@ var VoiceTurnLatency = defineComponent14({
8556
8941
  report: latency.report.value,
8557
8942
  updatedAt: latency.updatedAt.value
8558
8943
  }, options));
8559
- return () => h14("section", {
8944
+ return () => h15("section", {
8560
8945
  class: [
8561
8946
  "absolute-voice-turn-latency",
8562
8947
  `absolute-voice-turn-latency--${model.value.status}`,
8563
8948
  props.class
8564
8949
  ]
8565
8950
  }, [
8566
- h14("header", { class: "absolute-voice-turn-latency__header" }, [
8567
- h14("span", { class: "absolute-voice-turn-latency__eyebrow" }, model.value.title),
8568
- 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)
8569
8954
  ]),
8570
- h14("p", { class: "absolute-voice-turn-latency__description" }, model.value.description),
8571
- model.value.showProofAction ? h14("button", {
8955
+ h15("p", { class: "absolute-voice-turn-latency__description" }, model.value.description),
8956
+ model.value.showProofAction ? h15("button", {
8572
8957
  class: "absolute-voice-turn-latency__proof",
8573
8958
  onClick: () => {
8574
8959
  latency.runProof().catch(() => {});
8575
8960
  },
8576
8961
  type: "button"
8577
8962
  }, model.value.proofLabel) : null,
8578
- 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", {
8579
8964
  class: [
8580
8965
  "absolute-voice-turn-latency__turn",
8581
8966
  `absolute-voice-turn-latency__turn--${turn.status}`
8582
8967
  ],
8583
8968
  key: `${turn.sessionId}:${turn.turnId}`
8584
8969
  }, [
8585
- h14("header", [
8586
- h14("strong", turn.label),
8587
- h14("span", turn.status)
8970
+ h15("header", [
8971
+ h15("strong", turn.label),
8972
+ h15("span", turn.status)
8588
8973
  ]),
8589
- h14("dl", turn.rows.map((row) => h14("div", { key: row.label }, [
8590
- h14("dt", row.label),
8591
- 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)
8592
8977
  ])))
8593
- ]))) : h14("p", { class: "absolute-voice-turn-latency__empty" }, "Complete a voice turn to see latency diagnostics."),
8594
- 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
8595
8980
  ]);
8596
8981
  }
8597
8982
  });
8598
8983
  // src/vue/VoiceTurnQuality.ts
8599
- 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";
8600
8985
 
8601
8986
  // src/client/turnQuality.ts
8602
8987
  var fetchVoiceTurnQuality = async (path = "/api/turn-quality", options = {}) => {
@@ -8678,9 +9063,9 @@ var createVoiceTurnQualityStore = (path = "/api/turn-quality", options = {}) =>
8678
9063
  };
8679
9064
 
8680
9065
  // src/client/turnQualityWidget.ts
8681
- var DEFAULT_TITLE14 = "Turn Quality";
8682
- var DEFAULT_DESCRIPTION14 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
8683
- 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;");
8684
9069
  var formatConfidence = (value) => typeof value === "number" ? `${Math.round(value * 100)}%` : "n/a";
8685
9070
  var formatMaybe = (value) => value === undefined || value === "" ? "n/a" : String(value);
8686
9071
  var getTurnDetail = (turn) => {
@@ -8724,37 +9109,37 @@ var createVoiceTurnQualityViewModel = (snapshot, options = {}) => {
8724
9109
  const warningCount = snapshot.report?.warnings ?? turns.filter((turn) => turn.status === "warn").length;
8725
9110
  const failedCount = snapshot.report?.failed ?? turns.filter((turn) => turn.status === "fail").length;
8726
9111
  return {
8727
- description: options.description ?? DEFAULT_DESCRIPTION14,
9112
+ description: options.description ?? DEFAULT_DESCRIPTION15,
8728
9113
  error: snapshot.error,
8729
9114
  isLoading: snapshot.isLoading,
8730
9115
  label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} failed` : warningCount > 0 ? `${warningCount} warnings` : `${turns.length} healthy` : snapshot.isLoading ? "Checking" : "No turns",
8731
9116
  status: snapshot.error ? "error" : turns.length ? failedCount > 0 || warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
8732
- title: options.title ?? DEFAULT_TITLE14,
9117
+ title: options.title ?? DEFAULT_TITLE15,
8733
9118
  turns,
8734
9119
  updatedAt: snapshot.updatedAt
8735
9120
  };
8736
9121
  };
8737
9122
  var renderVoiceTurnQualityHTML = (snapshot, options = {}) => {
8738
9123
  const model = createVoiceTurnQualityViewModel(snapshot, options);
8739
- 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)}">
8740
9125
  <header>
8741
- <strong>${escapeHtml20(turn.label)}</strong>
8742
- <span>${escapeHtml20(turn.status)}</span>
9126
+ <strong>${escapeHtml21(turn.label)}</strong>
9127
+ <span>${escapeHtml21(turn.status)}</span>
8743
9128
  </header>
8744
- <p>${escapeHtml20(turn.detail)}</p>
9129
+ <p>${escapeHtml21(turn.detail)}</p>
8745
9130
  <dl>${turn.rows.map((row) => `<div>
8746
- <dt>${escapeHtml20(row.label)}</dt>
8747
- <dd>${escapeHtml20(row.value)}</dd>
9131
+ <dt>${escapeHtml21(row.label)}</dt>
9132
+ <dd>${escapeHtml21(row.value)}</dd>
8748
9133
  </div>`).join("")}</dl>
8749
9134
  </article>`).join("")}</div>` : '<p class="absolute-voice-turn-quality__empty">Complete a voice turn to see STT quality diagnostics.</p>';
8750
- 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)}">
8751
9136
  <header class="absolute-voice-turn-quality__header">
8752
- <span class="absolute-voice-turn-quality__eyebrow">${escapeHtml20(model.title)}</span>
8753
- <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>
8754
9139
  </header>
8755
- <p class="absolute-voice-turn-quality__description">${escapeHtml20(model.description)}</p>
9140
+ <p class="absolute-voice-turn-quality__description">${escapeHtml21(model.description)}</p>
8756
9141
  ${turns}
8757
- ${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>` : ""}
8758
9143
  </section>`;
8759
9144
  };
8760
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}`;
@@ -8796,13 +9181,13 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
8796
9181
  };
8797
9182
 
8798
9183
  // src/vue/useVoiceTurnQuality.ts
8799
- import { onUnmounted as onUnmounted15, shallowRef as shallowRef14 } from "vue";
9184
+ import { onUnmounted as onUnmounted16, shallowRef as shallowRef15 } from "vue";
8800
9185
  function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
8801
9186
  const store = createVoiceTurnQualityStore(path, options);
8802
- const error = shallowRef14(null);
8803
- const isLoading = shallowRef14(false);
8804
- const report = shallowRef14();
8805
- const updatedAt = shallowRef14(undefined);
9187
+ const error = shallowRef15(null);
9188
+ const isLoading = shallowRef15(false);
9189
+ const report = shallowRef15();
9190
+ const updatedAt = shallowRef15(undefined);
8806
9191
  const sync = () => {
8807
9192
  const snapshot = store.getSnapshot();
8808
9193
  error.value = snapshot.error;
@@ -8813,7 +9198,7 @@ function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
8813
9198
  const unsubscribe = store.subscribe(sync);
8814
9199
  sync();
8815
9200
  store.refresh().catch(() => {});
8816
- onUnmounted15(() => {
9201
+ onUnmounted16(() => {
8817
9202
  unsubscribe();
8818
9203
  store.close();
8819
9204
  });
@@ -8821,7 +9206,7 @@ function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
8821
9206
  }
8822
9207
 
8823
9208
  // src/vue/VoiceTurnQuality.ts
8824
- var VoiceTurnQuality = defineComponent15({
9209
+ var VoiceTurnQuality = defineComponent16({
8825
9210
  name: "VoiceTurnQuality",
8826
9211
  props: {
8827
9212
  class: { default: "", type: String },
@@ -8843,41 +9228,41 @@ var VoiceTurnQuality = defineComponent15({
8843
9228
  report: quality.report.value,
8844
9229
  updatedAt: quality.updatedAt.value
8845
9230
  }, options));
8846
- return () => h15("section", {
9231
+ return () => h16("section", {
8847
9232
  class: [
8848
9233
  "absolute-voice-turn-quality",
8849
9234
  `absolute-voice-turn-quality--${model.value.status}`,
8850
9235
  props.class
8851
9236
  ]
8852
9237
  }, [
8853
- h15("header", { class: "absolute-voice-turn-quality__header" }, [
8854
- h15("span", { class: "absolute-voice-turn-quality__eyebrow" }, model.value.title),
8855
- 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)
8856
9241
  ]),
8857
- h15("p", { class: "absolute-voice-turn-quality__description" }, model.value.description),
8858
- 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", {
8859
9244
  class: [
8860
9245
  "absolute-voice-turn-quality__turn",
8861
9246
  `absolute-voice-turn-quality__turn--${turn.status}`
8862
9247
  ],
8863
9248
  key: `${turn.sessionId}:${turn.turnId}`
8864
9249
  }, [
8865
- h15("header", [
8866
- h15("strong", turn.label),
8867
- h15("span", turn.status)
9250
+ h16("header", [
9251
+ h16("strong", turn.label),
9252
+ h16("span", turn.status)
8868
9253
  ]),
8869
- h15("p", turn.detail),
8870
- h15("dl", turn.rows.map((row) => h15("div", { key: row.label }, [
8871
- h15("dt", row.label),
8872
- 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)
8873
9258
  ])))
8874
- ]))) : h15("p", { class: "absolute-voice-turn-quality__empty" }, "Complete a voice turn to see STT quality diagnostics."),
8875
- 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
8876
9261
  ]);
8877
9262
  }
8878
9263
  });
8879
9264
  // src/vue/useVoiceProfileComparison.ts
8880
- 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";
8881
9266
 
8882
9267
  // src/client/profileComparison.ts
8883
9268
  var fetchVoiceProfileComparison = async (path = "/api/voice/real-call-profile-history", options = {}) => {
@@ -8957,10 +9342,10 @@ var createVoiceProfileComparisonStore = (path = "/api/voice/real-call-profile-hi
8957
9342
  // src/vue/useVoiceProfileComparison.ts
8958
9343
  function useVoiceProfileComparison(path = "/api/voice/real-call-profile-history", options = {}) {
8959
9344
  const store = createVoiceProfileComparisonStore(path, options);
8960
- const error = ref11(null);
8961
- const isLoading = ref11(false);
8962
- const report = shallowRef15(undefined);
8963
- const updatedAt = ref11(undefined);
9345
+ const error = ref12(null);
9346
+ const isLoading = ref12(false);
9347
+ const report = shallowRef16(undefined);
9348
+ const updatedAt = ref12(undefined);
8964
9349
  const sync = () => {
8965
9350
  const snapshot = store.getSnapshot();
8966
9351
  error.value = snapshot.error;
@@ -8973,7 +9358,7 @@ function useVoiceProfileComparison(path = "/api/voice/real-call-profile-history"
8973
9358
  if (typeof window !== "undefined") {
8974
9359
  store.refresh().catch(() => {});
8975
9360
  }
8976
- onUnmounted16(() => {
9361
+ onUnmounted17(() => {
8977
9362
  unsubscribe();
8978
9363
  store.close();
8979
9364
  });
@@ -8986,7 +9371,7 @@ function useVoiceProfileComparison(path = "/api/voice/real-call-profile-history"
8986
9371
  };
8987
9372
  }
8988
9373
  // src/vue/useVoiceLiveOps.ts
8989
- 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";
8990
9375
 
8991
9376
  // src/client/liveOps.ts
8992
9377
  var postVoiceLiveOpsAction = async (input, options = {}) => {
@@ -9077,11 +9462,11 @@ var createVoiceLiveOpsStore = (options = {}) => {
9077
9462
  // src/vue/useVoiceLiveOps.ts
9078
9463
  function useVoiceLiveOps(options = {}) {
9079
9464
  const store = createVoiceLiveOpsStore(options);
9080
- const error = ref12(null);
9081
- const isRunning = ref12(false);
9082
- const lastResult = shallowRef16(undefined);
9083
- const runningAction = ref12(undefined);
9084
- 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);
9085
9470
  const sync = () => {
9086
9471
  const snapshot = store.getSnapshot();
9087
9472
  error.value = snapshot.error;
@@ -9092,7 +9477,7 @@ function useVoiceLiveOps(options = {}) {
9092
9477
  };
9093
9478
  const unsubscribe = store.subscribe(sync);
9094
9479
  sync();
9095
- onUnmounted17(() => {
9480
+ onUnmounted18(() => {
9096
9481
  unsubscribe();
9097
9482
  store.close();
9098
9483
  });
@@ -9106,7 +9491,7 @@ function useVoiceLiveOps(options = {}) {
9106
9491
  };
9107
9492
  }
9108
9493
  // src/vue/useVoiceCampaignDialerProof.ts
9109
- import { onUnmounted as onUnmounted18, shallowRef as shallowRef17 } from "vue";
9494
+ import { onUnmounted as onUnmounted19, shallowRef as shallowRef18 } from "vue";
9110
9495
 
9111
9496
  // src/client/campaignDialerProof.ts
9112
9497
  var fetchVoiceCampaignDialerProofStatus = async (path = "/api/voice/campaigns/dialer-proof", options = {}) => {
@@ -9229,11 +9614,11 @@ var createVoiceCampaignDialerProofStore = (path = "/api/voice/campaigns/dialer-p
9229
9614
  // src/vue/useVoiceCampaignDialerProof.ts
9230
9615
  function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof", options = {}) {
9231
9616
  const store = createVoiceCampaignDialerProofStore(path, options);
9232
- const error = shallowRef17(null);
9233
- const isLoading = shallowRef17(false);
9234
- const report = shallowRef17();
9235
- const status = shallowRef17();
9236
- 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);
9237
9622
  const sync = () => {
9238
9623
  const snapshot = store.getSnapshot();
9239
9624
  error.value = snapshot.error;
@@ -9247,7 +9632,7 @@ function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof",
9247
9632
  if (typeof window !== "undefined") {
9248
9633
  store.refresh().catch(() => {});
9249
9634
  }
9250
- onUnmounted18(() => {
9635
+ onUnmounted19(() => {
9251
9636
  unsubscribe();
9252
9637
  store.close();
9253
9638
  });
@@ -9262,7 +9647,7 @@ function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof",
9262
9647
  };
9263
9648
  }
9264
9649
  // src/vue/useVoiceStream.ts
9265
- 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";
9266
9651
 
9267
9652
  // src/client/actions.ts
9268
9653
  var normalizeErrorMessage = (value) => {
@@ -10667,17 +11052,17 @@ var createVoiceStream = (path, options = {}) => {
10667
11052
  // src/vue/useVoiceStream.ts
10668
11053
  function useVoiceStream(path, options = {}) {
10669
11054
  const stream = createVoiceStream(path, options);
10670
- const assistantAudio = shallowRef18([]);
10671
- const assistantTexts = shallowRef18([]);
10672
- const call = shallowRef18(null);
10673
- const error = ref13(null);
10674
- const isConnected = ref13(false);
10675
- const partial = ref13("");
10676
- const reconnect = shallowRef18(stream.reconnect);
10677
- const sessionId = ref13(stream.sessionId);
10678
- const sessionMetadata = shallowRef18(stream.sessionMetadata);
10679
- const status = ref13(stream.status);
10680
- 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([]);
10681
11066
  const sync = () => {
10682
11067
  assistantAudio.value = [...stream.assistantAudio];
10683
11068
  assistantTexts.value = [...stream.assistantTexts];
@@ -10697,7 +11082,7 @@ function useVoiceStream(path, options = {}) {
10697
11082
  unsubscribe();
10698
11083
  stream.close();
10699
11084
  };
10700
- onUnmounted19(destroy);
11085
+ onUnmounted20(destroy);
10701
11086
  return {
10702
11087
  assistantAudio,
10703
11088
  assistantTexts,
@@ -10718,7 +11103,7 @@ function useVoiceStream(path, options = {}) {
10718
11103
  };
10719
11104
  }
10720
11105
  // src/vue/useVoiceController.ts
10721
- 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";
10722
11107
 
10723
11108
  // src/client/htmx.ts
10724
11109
  var DEFAULT_EVENT_NAME = "voice-refresh";
@@ -11370,17 +11755,17 @@ var createVoiceController = (path, options = {}) => {
11370
11755
  // src/vue/useVoiceController.ts
11371
11756
  function useVoiceController(path, options = {}) {
11372
11757
  const controller = createVoiceController(path, options);
11373
- const assistantAudio = shallowRef19([]);
11374
- const assistantTexts = shallowRef19([]);
11375
- const error = ref14(null);
11376
- const isConnected = ref14(false);
11377
- const isRecording = ref14(false);
11378
- const partial = ref14("");
11379
- const reconnect = shallowRef19(controller.reconnect);
11380
- const recordingError = ref14(null);
11381
- const sessionId = ref14(controller.sessionId);
11382
- const status = ref14(controller.status);
11383
- 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([]);
11384
11769
  const sync = () => {
11385
11770
  assistantAudio.value = [...controller.assistantAudio];
11386
11771
  assistantTexts.value = [...controller.assistantTexts];
@@ -11400,7 +11785,7 @@ function useVoiceController(path, options = {}) {
11400
11785
  unsubscribe();
11401
11786
  controller.close();
11402
11787
  };
11403
- onUnmounted20(destroy);
11788
+ onUnmounted21(destroy);
11404
11789
  return {
11405
11790
  assistantAudio,
11406
11791
  assistantTexts,
@@ -11424,13 +11809,13 @@ function useVoiceController(path, options = {}) {
11424
11809
  };
11425
11810
  }
11426
11811
  // src/vue/useVoiceTraceTimeline.ts
11427
- 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";
11428
11813
  function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
11429
11814
  const store = createVoiceTraceTimelineStore(path, options);
11430
- const error = ref15(null);
11431
- const isLoading = ref15(false);
11432
- const report = shallowRef20(null);
11433
- const updatedAt = ref15(undefined);
11815
+ const error = ref16(null);
11816
+ const isLoading = ref16(false);
11817
+ const report = shallowRef21(null);
11818
+ const updatedAt = ref16(undefined);
11434
11819
  const sync = () => {
11435
11820
  const snapshot = store.getSnapshot();
11436
11821
  error.value = snapshot.error;
@@ -11441,7 +11826,7 @@ function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
11441
11826
  const unsubscribe = store.subscribe(sync);
11442
11827
  sync();
11443
11828
  store.refresh().catch(() => {});
11444
- onUnmounted21(() => {
11829
+ onUnmounted22(() => {
11445
11830
  unsubscribe();
11446
11831
  store.close();
11447
11832
  });
@@ -11454,7 +11839,7 @@ function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
11454
11839
  };
11455
11840
  }
11456
11841
  // src/vue/useVoiceWorkflowStatus.ts
11457
- 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";
11458
11843
 
11459
11844
  // src/client/workflowStatus.ts
11460
11845
  var fetchVoiceWorkflowStatus = async (path = "/evals/scenarios/json", options = {}) => {
@@ -11538,10 +11923,10 @@ var createVoiceWorkflowStatusStore = (path = "/evals/scenarios/json", options =
11538
11923
  // src/vue/useVoiceWorkflowStatus.ts
11539
11924
  function useVoiceWorkflowStatus(path = "/evals/scenarios/json", options = {}) {
11540
11925
  const store = createVoiceWorkflowStatusStore(path, options);
11541
- const error = ref16(null);
11542
- const isLoading = ref16(false);
11543
- const report = shallowRef21(undefined);
11544
- const updatedAt = ref16(undefined);
11926
+ const error = ref17(null);
11927
+ const isLoading = ref17(false);
11928
+ const report = shallowRef22(undefined);
11929
+ const updatedAt = ref17(undefined);
11545
11930
  const sync = () => {
11546
11931
  const snapshot = store.getSnapshot();
11547
11932
  error.value = snapshot.error;
@@ -11554,7 +11939,7 @@ function useVoiceWorkflowStatus(path = "/evals/scenarios/json", options = {}) {
11554
11939
  if (typeof window !== "undefined") {
11555
11940
  store.refresh().catch(() => {});
11556
11941
  }
11557
- onUnmounted22(() => {
11942
+ onUnmounted23(() => {
11558
11943
  unsubscribe();
11559
11944
  store.close();
11560
11945
  });
@@ -11574,6 +11959,7 @@ export {
11574
11959
  useVoiceStream,
11575
11960
  useVoiceSessionSnapshot,
11576
11961
  useVoiceRoutingStatus,
11962
+ useVoiceReconnectProfileEvidence,
11577
11963
  useVoiceReadinessFailures,
11578
11964
  useVoiceProviderStatus,
11579
11965
  useVoiceProviderSimulationControls,
@@ -11594,6 +11980,7 @@ export {
11594
11980
  VoiceTurnLatency,
11595
11981
  VoiceSessionSnapshot,
11596
11982
  VoiceRoutingStatus,
11983
+ VoiceReconnectProfileEvidence,
11597
11984
  VoiceReadinessFailures,
11598
11985
  VoiceProviderStatus,
11599
11986
  VoiceProviderSimulationControls,