@absolutejs/voice 0.0.22-beta.239 → 0.0.22-beta.240

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.
@@ -2749,10 +2749,111 @@ var defineVoiceOpsStatusElement = (tagName = "absolute-voice-ops-status") => {
2749
2749
  }
2750
2750
  });
2751
2751
  };
2752
- // src/client/opsActionCenterWidget.ts
2753
- var DEFAULT_TITLE2 = "Voice Ops Action Center";
2754
- var DEFAULT_DESCRIPTION2 = "Run production voice proofs and operator actions from one primitive panel.";
2752
+ // src/client/platformCoverageWidget.ts
2753
+ var DEFAULT_TITLE2 = "Platform Replacement Coverage";
2754
+ var DEFAULT_DESCRIPTION2 = "Code-owned coverage for hosted voice-platform surfaces, backed by the same proof routes used by release evidence.";
2755
+ var DEFAULT_LINKS = [
2756
+ { href: "/switching-from-vapi", label: "Switching guide" },
2757
+ { href: "/api/voice/vapi-coverage", label: "Coverage JSON" }
2758
+ ];
2755
2759
  var escapeHtml2 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2760
+ var formatStatus = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
2761
+ var surfaceDetail2 = (surface) => {
2762
+ if (surface.status === "pass") {
2763
+ return surface.replacement;
2764
+ }
2765
+ if (surface.gap) {
2766
+ return surface.gap;
2767
+ }
2768
+ if (surface.missingEvidence?.length) {
2769
+ return `Missing evidence: ${surface.missingEvidence.join(", ")}`;
2770
+ }
2771
+ return surface.replacement;
2772
+ };
2773
+ var createVoicePlatformCoverageViewModel = (snapshot, options = {}) => {
2774
+ const allSurfaces = snapshot.report?.coverage ?? [];
2775
+ const failing = allSurfaces.filter((surface) => surface.status !== "pass");
2776
+ const limit = options.limit ?? 6;
2777
+ const surfaces = allSurfaces.slice(0, limit).map((surface) => ({
2778
+ ...surface,
2779
+ detail: surfaceDetail2(surface),
2780
+ label: surface.surface
2781
+ }));
2782
+ return {
2783
+ description: options.description ?? DEFAULT_DESCRIPTION2,
2784
+ error: snapshot.error,
2785
+ isLoading: snapshot.isLoading,
2786
+ label: snapshot.error ? "Unavailable" : snapshot.report ? failing.length ? `${failing.length} gaps` : `${snapshot.report.total} surfaces passing` : snapshot.isLoading ? "Checking" : "No coverage report",
2787
+ links: options.links ?? DEFAULT_LINKS,
2788
+ status: snapshot.error ? "error" : snapshot.report ? failing.length ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
2789
+ surfaces,
2790
+ title: options.title ?? DEFAULT_TITLE2,
2791
+ updatedAt: snapshot.updatedAt
2792
+ };
2793
+ };
2794
+ var renderVoicePlatformCoverageHTML = (snapshot, options = {}) => {
2795
+ const model = createVoicePlatformCoverageViewModel(snapshot, options);
2796
+ const surfaces = model.surfaces.length ? `<div class="absolute-voice-platform-coverage__surfaces">${model.surfaces.map((surface) => `<article class="absolute-voice-platform-coverage__surface absolute-voice-platform-coverage__surface--${escapeHtml2(surface.status)}">
2797
+ <header>
2798
+ <strong>${escapeHtml2(surface.label)}</strong>
2799
+ <span>${escapeHtml2(formatStatus(surface.status))}</span>
2800
+ </header>
2801
+ <p>${escapeHtml2(surface.detail)}</p>
2802
+ <small>${surface.evidence.filter((item) => item.ok).length}/${surface.evidence.length} evidence checks passing</small>
2803
+ </article>`).join("")}</div>` : `<p class="absolute-voice-platform-coverage__empty">${model.error ? escapeHtml2(model.error) : "Run the proof pack to populate platform coverage evidence."}</p>`;
2804
+ const links = model.links.length ? `<p class="absolute-voice-platform-coverage__links">${model.links.map((link) => `<a href="${escapeHtml2(link.href)}">${escapeHtml2(link.label)}</a>`).join("")}</p>` : "";
2805
+ return `<section class="absolute-voice-platform-coverage absolute-voice-platform-coverage--${escapeHtml2(model.status)}">
2806
+ <header class="absolute-voice-platform-coverage__header">
2807
+ <span class="absolute-voice-platform-coverage__eyebrow">${escapeHtml2(model.title)}</span>
2808
+ <strong class="absolute-voice-platform-coverage__label">${escapeHtml2(model.label)}</strong>
2809
+ </header>
2810
+ <p class="absolute-voice-platform-coverage__description">${escapeHtml2(model.description)}</p>
2811
+ ${surfaces}
2812
+ ${links}
2813
+ ${model.error ? `<p class="absolute-voice-platform-coverage__error">${escapeHtml2(model.error)}</p>` : ""}
2814
+ </section>`;
2815
+ };
2816
+ var getVoicePlatformCoverageCSS = () => `.absolute-voice-platform-coverage{border:1px solid #c7d2fe;border-radius:20px;background:#f8fbff;color:#111827;padding:18px;box-shadow:0 18px 40px rgba(30,64,175,.12);font-family:inherit}.absolute-voice-platform-coverage--warning,.absolute-voice-platform-coverage--error{border-color:#f2a7a7;background:#fff7f4}.absolute-voice-platform-coverage__header,.absolute-voice-platform-coverage__surface header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-platform-coverage__eyebrow{color:#1d4ed8;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-platform-coverage__label{font-size:24px;line-height:1}.absolute-voice-platform-coverage__description,.absolute-voice-platform-coverage__surface p,.absolute-voice-platform-coverage__surface small,.absolute-voice-platform-coverage__empty{color:#475569}.absolute-voice-platform-coverage__surfaces{display:grid;gap:10px;margin-top:14px}.absolute-voice-platform-coverage__surface{background:#fff;border:1px solid #dbeafe;border-radius:16px;padding:12px}.absolute-voice-platform-coverage__surface--pass{border-color:#86efac}.absolute-voice-platform-coverage__surface--fail,.absolute-voice-platform-coverage__surface--missing,.absolute-voice-platform-coverage__surface--stale{border-color:#f2a7a7}.absolute-voice-platform-coverage__surface p{margin:8px 0}.absolute-voice-platform-coverage__surface span{text-transform:capitalize}.absolute-voice-platform-coverage__links{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 0}.absolute-voice-platform-coverage__links a{border:1px solid #bfdbfe;border-radius:999px;color:#1d4ed8;font-weight:800;padding:6px 10px;text-decoration:none}.absolute-voice-platform-coverage__error{color:#9f1239;font-weight:700}`;
2817
+ var mountVoicePlatformCoverage = (element, path = "/api/voice/platform-coverage", options = {}) => {
2818
+ const store = createVoicePlatformCoverageStore(path, options);
2819
+ const render = () => {
2820
+ element.innerHTML = renderVoicePlatformCoverageHTML(store.getSnapshot(), options);
2821
+ };
2822
+ const unsubscribe = store.subscribe(render);
2823
+ render();
2824
+ store.refresh().catch(() => {});
2825
+ return {
2826
+ close: () => {
2827
+ unsubscribe();
2828
+ store.close();
2829
+ },
2830
+ refresh: store.refresh
2831
+ };
2832
+ };
2833
+ var defineVoicePlatformCoverageElement = (tagName = "absolute-voice-platform-coverage") => {
2834
+ if (typeof window === "undefined" || typeof customElements === "undefined" || customElements.get(tagName)) {
2835
+ return;
2836
+ }
2837
+ customElements.define(tagName, class AbsoluteVoicePlatformCoverageElement extends HTMLElement {
2838
+ mounted;
2839
+ connectedCallback() {
2840
+ this.mounted = mountVoicePlatformCoverage(this, this.getAttribute("path") ?? "/api/voice/platform-coverage", {
2841
+ description: this.getAttribute("description") ?? undefined,
2842
+ intervalMs: Number(this.getAttribute("interval-ms") ?? 0) || undefined,
2843
+ limit: Number(this.getAttribute("limit") ?? 0) || undefined,
2844
+ title: this.getAttribute("title") ?? undefined
2845
+ });
2846
+ }
2847
+ disconnectedCallback() {
2848
+ this.mounted?.close();
2849
+ this.mounted = undefined;
2850
+ }
2851
+ });
2852
+ };
2853
+ // src/client/opsActionCenterWidget.ts
2854
+ var DEFAULT_TITLE3 = "Voice Ops Action Center";
2855
+ var DEFAULT_DESCRIPTION3 = "Run production voice proofs and operator actions from one primitive panel.";
2856
+ var escapeHtml3 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2756
2857
  var createVoiceOpsActionCenterViewModel = (snapshot, options = {}) => {
2757
2858
  const status = snapshot.error ? "error" : snapshot.isRunning ? "running" : snapshot.lastResult ? "completed" : "ready";
2758
2859
  return {
@@ -2763,29 +2864,29 @@ var createVoiceOpsActionCenterViewModel = (snapshot, options = {}) => {
2763
2864
  isRunning: snapshot.runningActionId === action.id,
2764
2865
  label: action.label
2765
2866
  })),
2766
- description: options.description ?? DEFAULT_DESCRIPTION2,
2867
+ description: options.description ?? DEFAULT_DESCRIPTION3,
2767
2868
  error: snapshot.error,
2768
2869
  isRunning: snapshot.isRunning,
2769
2870
  label: status === "error" ? "Needs attention" : status === "running" ? "Running" : status === "completed" ? "Action completed" : "Ready",
2770
2871
  lastResultLabel: snapshot.lastResult ? `${snapshot.lastResult.actionId} returned HTTP ${snapshot.lastResult.status}` : "No action has run yet.",
2771
2872
  status,
2772
- title: options.title ?? DEFAULT_TITLE2
2873
+ title: options.title ?? DEFAULT_TITLE3
2773
2874
  };
2774
2875
  };
2775
2876
  var renderVoiceOpsActionCenterHTML = (snapshot, options = {}) => {
2776
2877
  const model = createVoiceOpsActionCenterViewModel(snapshot, options);
2777
- const actions = model.actions.map((action) => `<button type="button" data-absolute-voice-ops-action="${escapeHtml2(action.id)}"${action.disabled ? " disabled" : ""}>
2778
- ${escapeHtml2(action.isRunning ? "Working..." : action.label)}
2878
+ const actions = model.actions.map((action) => `<button type="button" data-absolute-voice-ops-action="${escapeHtml3(action.id)}"${action.disabled ? " disabled" : ""}>
2879
+ ${escapeHtml3(action.isRunning ? "Working..." : action.label)}
2779
2880
  </button>`).join("");
2780
- return `<section class="absolute-voice-ops-action-center absolute-voice-ops-action-center--${escapeHtml2(model.status)}">
2881
+ return `<section class="absolute-voice-ops-action-center absolute-voice-ops-action-center--${escapeHtml3(model.status)}">
2781
2882
  <header class="absolute-voice-ops-action-center__header">
2782
- <span class="absolute-voice-ops-action-center__eyebrow">${escapeHtml2(model.title)}</span>
2783
- <strong class="absolute-voice-ops-action-center__label">${escapeHtml2(model.label)}</strong>
2883
+ <span class="absolute-voice-ops-action-center__eyebrow">${escapeHtml3(model.title)}</span>
2884
+ <strong class="absolute-voice-ops-action-center__label">${escapeHtml3(model.label)}</strong>
2784
2885
  </header>
2785
- <p class="absolute-voice-ops-action-center__description">${escapeHtml2(model.description)}</p>
2886
+ <p class="absolute-voice-ops-action-center__description">${escapeHtml3(model.description)}</p>
2786
2887
  <div class="absolute-voice-ops-action-center__actions">${actions}</div>
2787
- <p class="absolute-voice-ops-action-center__result">${escapeHtml2(model.lastResultLabel)}</p>
2788
- ${model.error ? `<p class="absolute-voice-ops-action-center__error">${escapeHtml2(model.error)}</p>` : ""}
2888
+ <p class="absolute-voice-ops-action-center__result">${escapeHtml3(model.lastResultLabel)}</p>
2889
+ ${model.error ? `<p class="absolute-voice-ops-action-center__error">${escapeHtml3(model.error)}</p>` : ""}
2789
2890
  </section>`;
2790
2891
  };
2791
2892
  var getVoiceOpsActionCenterCSS = () => `.absolute-voice-ops-action-center{border:1px solid #d5cbb8;border-radius:20px;background:#fffaf1;color:#17130b;padding:18px;box-shadow:0 18px 40px rgba(58,42,16,.12);font-family:inherit}.absolute-voice-ops-action-center--error{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-ops-action-center__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-ops-action-center__eyebrow{color:#725d37;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-ops-action-center__label{font-size:28px;line-height:1}.absolute-voice-ops-action-center__description,.absolute-voice-ops-action-center__result{color:#5b4b2f;margin:12px 0 0}.absolute-voice-ops-action-center__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}.absolute-voice-ops-action-center__actions button{background:#7c4a03;border:0;border-radius:999px;color:#fff8e8;cursor:pointer;font:inherit;font-weight:800;padding:8px 12px}.absolute-voice-ops-action-center__actions button:disabled{cursor:not-allowed;opacity:.5}.absolute-voice-ops-action-center__error{color:#9f1239;font-weight:700}`;
@@ -3386,7 +3487,7 @@ var exportVoiceTrace = async (input) => {
3386
3487
  };
3387
3488
  };
3388
3489
  var toNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : 0;
3389
- var escapeHtml3 = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
3490
+ var escapeHtml4 = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
3390
3491
  var formatTraceValue = (value) => {
3391
3492
  if (value === undefined || value === null) {
3392
3493
  return "";
@@ -3666,10 +3767,10 @@ var renderVoiceTraceHTML = (events, options = {}) => {
3666
3767
  const offset = summary.startedAt === undefined ? event.at : Math.max(0, event.at - summary.startedAt);
3667
3768
  return [
3668
3769
  "<tr>",
3669
- `<td>${escapeHtml3(String(offset))}</td>`,
3670
- `<td>${escapeHtml3(event.type)}</td>`,
3671
- `<td>${escapeHtml3(event.turnId ?? "")}</td>`,
3672
- `<td><code>${escapeHtml3(JSON.stringify(event.payload))}</code></td>`,
3770
+ `<td>${escapeHtml4(String(offset))}</td>`,
3771
+ `<td>${escapeHtml4(event.type)}</td>`,
3772
+ `<td>${escapeHtml4(event.turnId ?? "")}</td>`,
3773
+ `<td><code>${escapeHtml4(JSON.stringify(event.payload))}</code></td>`,
3673
3774
  "</tr>"
3674
3775
  ].join("");
3675
3776
  }).join(`
@@ -3680,7 +3781,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
3680
3781
  "<head>",
3681
3782
  '<meta charset="utf-8" />',
3682
3783
  '<meta name="viewport" content="width=device-width, initial-scale=1" />',
3683
- `<title>${escapeHtml3(options.title ?? "Voice Trace")}</title>`,
3784
+ `<title>${escapeHtml4(options.title ?? "Voice Trace")}</title>`,
3684
3785
  "<style>",
3685
3786
  "body{font-family:ui-sans-serif,system-ui,sans-serif;margin:2rem;line-height:1.45;background:#f8f7f2;color:#181713}",
3686
3787
  "main{max-width:1100px;margin:auto}",
@@ -3694,7 +3795,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
3694
3795
  "</style>",
3695
3796
  "</head>",
3696
3797
  "<body><main>",
3697
- `<h1>${escapeHtml3(options.title ?? `Voice Trace ${summary.sessionId ?? ""}`.trim())}</h1>`,
3798
+ `<h1>${escapeHtml4(options.title ?? `Voice Trace ${summary.sessionId ?? ""}`.trim())}</h1>`,
3698
3799
  `<p class="${evaluation.pass ? "pass" : "fail"}">QA: ${evaluation.pass ? "pass" : "fail"}</p>`,
3699
3800
  '<section class="summary">',
3700
3801
  `<div class="card"><strong>Events</strong><br>${summary.eventCount}</div>`,
@@ -3708,7 +3809,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
3708
3809
  eventRows,
3709
3810
  "</tbody></table>",
3710
3811
  "<h2>Markdown Export</h2>",
3711
- `<pre>${escapeHtml3(markdown)}</pre>`,
3812
+ `<pre>${escapeHtml4(markdown)}</pre>`,
3712
3813
  "</main></body></html>"
3713
3814
  ].join(`
3714
3815
  `);
@@ -3919,7 +4020,7 @@ var ACTION_LABELS = {
3919
4020
  "resume-assistant": "Resume assistant",
3920
4021
  tag: "Tag"
3921
4022
  };
3922
- var escapeHtml4 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4023
+ var escapeHtml5 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
3923
4024
  var createVoiceLiveOpsInput = (action, input) => ({
3924
4025
  action,
3925
4026
  assignee: input.assignee,
@@ -3930,17 +4031,17 @@ var createVoiceLiveOpsInput = (action, input) => ({
3930
4031
  var renderVoiceLiveOpsHTML = (snapshot, options = {}) => {
3931
4032
  const sessionId = options.getSessionId?.() ?? "";
3932
4033
  const disabled = snapshot.isRunning || !sessionId;
3933
- const actions = VOICE_LIVE_OPS_ACTIONS.map((action) => `<button type="button" data-absolute-voice-live-ops-action="${escapeHtml4(action)}"${disabled ? " disabled" : ""}>${escapeHtml4(snapshot.runningAction === action ? "Running..." : ACTION_LABELS[action])}</button>`).join("");
3934
- const result = snapshot.error ? `<p class="absolute-voice-live-ops__error">${escapeHtml4(snapshot.error)}</p>` : snapshot.lastResult ? `<p class="absolute-voice-live-ops__result">Recorded ${escapeHtml4(snapshot.lastResult.action)}. Control: ${escapeHtml4(snapshot.lastResult.control.status)}.</p>` : '<p class="absolute-voice-live-ops__result">No live ops action has run yet.</p>';
4034
+ const actions = VOICE_LIVE_OPS_ACTIONS.map((action) => `<button type="button" data-absolute-voice-live-ops-action="${escapeHtml5(action)}"${disabled ? " disabled" : ""}>${escapeHtml5(snapshot.runningAction === action ? "Running..." : ACTION_LABELS[action])}</button>`).join("");
4035
+ const result = snapshot.error ? `<p class="absolute-voice-live-ops__error">${escapeHtml5(snapshot.error)}</p>` : snapshot.lastResult ? `<p class="absolute-voice-live-ops__result">Recorded ${escapeHtml5(snapshot.lastResult.action)}. Control: ${escapeHtml5(snapshot.lastResult.control.status)}.</p>` : '<p class="absolute-voice-live-ops__result">No live ops action has run yet.</p>';
3935
4036
  return `<section class="absolute-voice-live-ops">
3936
4037
  <header class="absolute-voice-live-ops__header">
3937
- <span>${escapeHtml4(options.title ?? "Live Ops")}</span>
3938
- <strong>${escapeHtml4(sessionId || "No active session")}</strong>
4038
+ <span>${escapeHtml5(options.title ?? "Live Ops")}</span>
4039
+ <strong>${escapeHtml5(sessionId || "No active session")}</strong>
3939
4040
  </header>
3940
- <p class="absolute-voice-live-ops__description">${escapeHtml4(options.description ?? "Pause, resume, take over, force handoff, or inject operator instructions during a live voice session.")}</p>
3941
- <label><span>Operator</span><input data-absolute-voice-live-ops-assignee value="${escapeHtml4(options.defaultAssignee ?? "operator")}" /></label>
3942
- <label><span>Tag / handoff target</span><input data-absolute-voice-live-ops-tag value="${escapeHtml4(options.defaultTag ?? "live-ops")}" /></label>
3943
- <label><span>Detail / instruction</span><input data-absolute-voice-live-ops-detail value="${escapeHtml4(options.defaultDetail ?? "Operator marked this live session.")}" /></label>
4041
+ <p class="absolute-voice-live-ops__description">${escapeHtml5(options.description ?? "Pause, resume, take over, force handoff, or inject operator instructions during a live voice session.")}</p>
4042
+ <label><span>Operator</span><input data-absolute-voice-live-ops-assignee value="${escapeHtml5(options.defaultAssignee ?? "operator")}" /></label>
4043
+ <label><span>Tag / handoff target</span><input data-absolute-voice-live-ops-tag value="${escapeHtml5(options.defaultTag ?? "live-ops")}" /></label>
4044
+ <label><span>Detail / instruction</span><input data-absolute-voice-live-ops-detail value="${escapeHtml5(options.defaultDetail ?? "Operator marked this live session.")}" /></label>
3944
4045
  <div class="absolute-voice-live-ops__actions">${actions}</div>
3945
4046
  ${result}
3946
4047
  </section>`;
@@ -4027,16 +4128,16 @@ var defineVoiceLiveOpsElement = (tagName = "absolute-voice-live-ops", options =
4027
4128
  });
4028
4129
  };
4029
4130
  // src/client/opsActionHistoryWidget.ts
4030
- var escapeHtml5 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4131
+ var escapeHtml6 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4031
4132
  var renderVoiceOpsActionHistoryWidgetHTML = (snapshot, options = {}) => {
4032
4133
  const report = snapshot.report;
4033
4134
  const entries = (report?.entries ?? []).slice(0, options.limit ?? 5);
4034
- const rows = entries.map((entry) => `<li class="absolute-voice-ops-action-history__entry absolute-voice-ops-action-history__entry--${entry.ok ? "success" : "error"}"><span>${escapeHtml5(entry.actionId)}</span><strong>${escapeHtml5(entry.ok ? "Success" : "Failed")}</strong><small>${escapeHtml5(new Date(entry.at).toLocaleString())}${entry.status ? ` \xB7 HTTP ${String(entry.status)}` : ""}</small></li>`).join("");
4135
+ const rows = entries.map((entry) => `<li class="absolute-voice-ops-action-history__entry absolute-voice-ops-action-history__entry--${entry.ok ? "success" : "error"}"><span>${escapeHtml6(entry.actionId)}</span><strong>${escapeHtml6(entry.ok ? "Success" : "Failed")}</strong><small>${escapeHtml6(new Date(entry.at).toLocaleString())}${entry.status ? ` \xB7 HTTP ${String(entry.status)}` : ""}</small></li>`).join("");
4035
4136
  return `<section class="absolute-voice-ops-action-history">
4036
- <header><span>Operator proof</span><strong>${escapeHtml5(options.title ?? "Action History")}</strong></header>
4137
+ <header><span>Operator proof</span><strong>${escapeHtml6(options.title ?? "Action History")}</strong></header>
4037
4138
  <p>${String(report?.total ?? 0)} action(s), ${String(report?.failed ?? 0)} failed.</p>
4038
4139
  <ul>${rows || "<li>No operator actions recorded yet.</li>"}</ul>
4039
- ${snapshot.error ? `<p class="absolute-voice-ops-action-history__error">${escapeHtml5(snapshot.error)}</p>` : ""}
4140
+ ${snapshot.error ? `<p class="absolute-voice-ops-action-history__error">${escapeHtml6(snapshot.error)}</p>` : ""}
4040
4141
  </section>`;
4041
4142
  };
4042
4143
  var getVoiceOpsActionHistoryCSS = () => `.absolute-voice-ops-action-history{border:1px solid #d8d2c4;border-radius:20px;background:#fffaf0;color:#16130d;padding:18px;font-family:inherit}.absolute-voice-ops-action-history header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-ops-action-history header span{color:#73664f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-ops-action-history header strong{font-size:24px}.absolute-voice-ops-action-history p{color:#514733}.absolute-voice-ops-action-history ul{display:grid;gap:8px;list-style:none;margin:12px 0 0;padding:0}.absolute-voice-ops-action-history__entry{background:#fff;border:1px solid #eee4d2;border-radius:14px;display:grid;gap:3px;padding:10px 12px}.absolute-voice-ops-action-history__entry--error{border-color:#f2a7a7}.absolute-voice-ops-action-history__entry span{font-weight:800}.absolute-voice-ops-action-history__entry small{color:#655944}.absolute-voice-ops-action-history__error{color:#9f1239;font-weight:700}`;
@@ -4057,9 +4158,9 @@ var mountVoiceOpsActionHistory = (element, path = "/api/voice/ops-actions/histor
4057
4158
  };
4058
4159
  };
4059
4160
  // src/client/deliveryRuntimeWidget.ts
4060
- var DEFAULT_TITLE3 = "Voice Delivery Runtime";
4061
- var DEFAULT_DESCRIPTION3 = "Audit and trace delivery worker health from your AbsoluteJS voice app.";
4062
- var escapeHtml6 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4161
+ var DEFAULT_TITLE4 = "Voice Delivery Runtime";
4162
+ var DEFAULT_DESCRIPTION4 = "Audit and trace delivery worker health from your AbsoluteJS voice app.";
4163
+ var escapeHtml7 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4063
4164
  var createSurface = (id, summary) => {
4064
4165
  if (!summary) {
4065
4166
  return {
@@ -4093,7 +4194,7 @@ var createVoiceDeliveryRuntimeViewModel = (snapshot, options = {}) => {
4093
4194
  ];
4094
4195
  const hasWarnings = surfaces.some((surface) => surface.status === "warn");
4095
4196
  return {
4096
- description: options.description ?? DEFAULT_DESCRIPTION3,
4197
+ description: options.description ?? DEFAULT_DESCRIPTION4,
4097
4198
  error: snapshot.error,
4098
4199
  actionError: snapshot.actionError,
4099
4200
  actionStatus: snapshot.actionStatus,
@@ -4102,32 +4203,32 @@ var createVoiceDeliveryRuntimeViewModel = (snapshot, options = {}) => {
4102
4203
  label: snapshot.error ? "Unavailable" : report ? report.isRunning ? "Running" : "Stopped" : "Checking",
4103
4204
  status: snapshot.error ? "error" : report ? hasWarnings ? "warn" : "pass" : "loading",
4104
4205
  surfaces,
4105
- title: options.title ?? DEFAULT_TITLE3,
4206
+ title: options.title ?? DEFAULT_TITLE4,
4106
4207
  updatedAt: snapshot.updatedAt
4107
4208
  };
4108
4209
  };
4109
4210
  var renderVoiceDeliveryRuntimeHTML = (snapshot, options = {}) => {
4110
4211
  const model = createVoiceDeliveryRuntimeViewModel(snapshot, options);
4111
- const surfaces = model.surfaces.map((surface) => `<li class="absolute-voice-delivery-runtime__surface absolute-voice-delivery-runtime__surface--${escapeHtml6(surface.status)}">
4112
- <span>${escapeHtml6(surface.label)}</span>
4113
- <strong>${escapeHtml6(surface.detail)}</strong>
4212
+ const surfaces = model.surfaces.map((surface) => `<li class="absolute-voice-delivery-runtime__surface absolute-voice-delivery-runtime__surface--${escapeHtml7(surface.status)}">
4213
+ <span>${escapeHtml7(surface.label)}</span>
4214
+ <strong>${escapeHtml7(surface.detail)}</strong>
4114
4215
  <small>${String(surface.failed)} failed &middot; ${String(surface.deadLettered)} dead-lettered</small>
4115
4216
  </li>`).join("");
4116
4217
  const actions = options.includeActions === false ? "" : `<div class="absolute-voice-delivery-runtime__actions">
4117
4218
  <button type="button" data-absolute-voice-delivery-runtime-action="tick">${model.actionStatus === "running" ? "Working..." : "Tick workers"}</button>
4118
4219
  <button type="button" data-absolute-voice-delivery-runtime-action="requeue-dead-letters"${model.surfaces.some((surface) => surface.deadLettered > 0) ? "" : " disabled"}>Requeue dead letters</button>
4119
4220
  </div>`;
4120
- const actionError = model.actionError ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml6(model.actionError)}</p>` : "";
4121
- return `<section class="absolute-voice-delivery-runtime absolute-voice-delivery-runtime--${escapeHtml6(model.status)}">
4221
+ const actionError = model.actionError ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml7(model.actionError)}</p>` : "";
4222
+ return `<section class="absolute-voice-delivery-runtime absolute-voice-delivery-runtime--${escapeHtml7(model.status)}">
4122
4223
  <header class="absolute-voice-delivery-runtime__header">
4123
- <span class="absolute-voice-delivery-runtime__eyebrow">${escapeHtml6(model.title)}</span>
4124
- <strong class="absolute-voice-delivery-runtime__label">${escapeHtml6(model.label)}</strong>
4224
+ <span class="absolute-voice-delivery-runtime__eyebrow">${escapeHtml7(model.title)}</span>
4225
+ <strong class="absolute-voice-delivery-runtime__label">${escapeHtml7(model.label)}</strong>
4125
4226
  </header>
4126
- <p class="absolute-voice-delivery-runtime__description">${escapeHtml6(model.description)}</p>
4227
+ <p class="absolute-voice-delivery-runtime__description">${escapeHtml7(model.description)}</p>
4127
4228
  <ul class="absolute-voice-delivery-runtime__surfaces">${surfaces}</ul>
4128
4229
  ${actions}
4129
4230
  ${actionError}
4130
- ${model.error ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml6(model.error)}</p>` : ""}
4231
+ ${model.error ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml7(model.error)}</p>` : ""}
4131
4232
  </section>`;
4132
4233
  };
4133
4234
  var getVoiceDeliveryRuntimeCSS = () => `.absolute-voice-delivery-runtime{border:1px solid #c9d8cf;border-radius:20px;background:#f6fff9;color:#0d1b12;padding:18px;box-shadow:0 18px 40px rgba(19,55,35,.12);font-family:inherit}.absolute-voice-delivery-runtime--warn,.absolute-voice-delivery-runtime--error{border-color:#f2b56b;background:#fff9ed}.absolute-voice-delivery-runtime__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-delivery-runtime__eyebrow{color:#4e6b59;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-delivery-runtime__label{font-size:28px;line-height:1}.absolute-voice-delivery-runtime__description{color:#33483b;margin:12px 0 0}.absolute-voice-delivery-runtime__surfaces{display:grid;gap:8px;list-style:none;margin:16px 0 0;padding:0}.absolute-voice-delivery-runtime__surface{background:#fff;border:1px solid #d9eadf;border-radius:14px;display:grid;gap:4px;padding:10px 12px}.absolute-voice-delivery-runtime__surface--warn{border-color:#f2b56b}.absolute-voice-delivery-runtime__surface--disabled{opacity:.72}.absolute-voice-delivery-runtime__surface span,.absolute-voice-delivery-runtime__surface small{color:#587063}.absolute-voice-delivery-runtime__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}.absolute-voice-delivery-runtime__actions button{background:#134e2d;border:0;border-radius:999px;color:#f6fff9;cursor:pointer;font:inherit;font-weight:800;padding:8px 12px}.absolute-voice-delivery-runtime__actions button:disabled{cursor:not-allowed;opacity:.48}.absolute-voice-delivery-runtime__error{color:#9f1239;font-weight:700}`;
@@ -4263,9 +4364,9 @@ var createVoiceRoutingStatusStore = (path = "/api/routing/latest", options = {})
4263
4364
  };
4264
4365
  };
4265
4366
  // src/client/routingStatusWidget.ts
4266
- var DEFAULT_TITLE4 = "Voice Routing";
4267
- var DEFAULT_DESCRIPTION4 = "Latest provider routing decision from the self-hosted trace store.";
4268
- var escapeHtml7 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4367
+ var DEFAULT_TITLE5 = "Voice Routing";
4368
+ var DEFAULT_DESCRIPTION5 = "Latest provider routing decision from the self-hosted trace store.";
4369
+ var escapeHtml8 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4269
4370
  var formatValue = (value, fallback = "None") => typeof value === "string" && value.trim() ? value : typeof value === "number" && Number.isFinite(value) ? String(value) : fallback;
4270
4371
  var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
4271
4372
  const decision = snapshot.decision;
@@ -4289,30 +4390,30 @@ var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
4289
4390
  ] : [];
4290
4391
  return {
4291
4392
  decision,
4292
- description: options.description ?? DEFAULT_DESCRIPTION4,
4393
+ description: options.description ?? DEFAULT_DESCRIPTION5,
4293
4394
  error: snapshot.error,
4294
4395
  isLoading: snapshot.isLoading,
4295
4396
  label: snapshot.error ? "Unavailable" : decision ? `${formatValue(decision.kind).toUpperCase()} ${formatValue(decision.status, "unknown")}` : snapshot.isLoading ? "Checking" : "No routing yet",
4296
4397
  rows,
4297
4398
  status: snapshot.error ? "error" : decision ? "ready" : snapshot.isLoading ? "loading" : "empty",
4298
- title: options.title ?? DEFAULT_TITLE4,
4399
+ title: options.title ?? DEFAULT_TITLE5,
4299
4400
  updatedAt: snapshot.updatedAt
4300
4401
  };
4301
4402
  };
4302
4403
  var renderVoiceRoutingStatusHTML = (snapshot, options = {}) => {
4303
4404
  const model = createVoiceRoutingStatusViewModel(snapshot, options);
4304
4405
  const rows = model.rows.length ? `<div class="absolute-voice-routing-status__grid">${model.rows.map((row) => `<div>
4305
- <span>${escapeHtml7(row.label)}</span>
4306
- <strong>${escapeHtml7(row.value)}</strong>
4406
+ <span>${escapeHtml8(row.label)}</span>
4407
+ <strong>${escapeHtml8(row.value)}</strong>
4307
4408
  </div>`).join("")}</div>` : '<p class="absolute-voice-routing-status__empty">Start a voice session to see the selected provider.</p>';
4308
- return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml7(model.status)}">
4409
+ return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml8(model.status)}">
4309
4410
  <header class="absolute-voice-routing-status__header">
4310
- <span class="absolute-voice-routing-status__eyebrow">${escapeHtml7(model.title)}</span>
4311
- <strong class="absolute-voice-routing-status__label">${escapeHtml7(model.label)}</strong>
4411
+ <span class="absolute-voice-routing-status__eyebrow">${escapeHtml8(model.title)}</span>
4412
+ <strong class="absolute-voice-routing-status__label">${escapeHtml8(model.label)}</strong>
4312
4413
  </header>
4313
- <p class="absolute-voice-routing-status__description">${escapeHtml7(model.description)}</p>
4414
+ <p class="absolute-voice-routing-status__description">${escapeHtml8(model.description)}</p>
4314
4415
  ${rows}
4315
- ${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml7(model.error)}</p>` : ""}
4416
+ ${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml8(model.error)}</p>` : ""}
4316
4417
  </section>`;
4317
4418
  };
4318
4419
  var getVoiceRoutingStatusCSS = () => `.absolute-voice-routing-status{border:1px solid #d8d2c4;border-radius:20px;background:#fffaf0;color:#16130d;padding:18px;box-shadow:0 18px 40px rgba(47,37,18,.12);font-family:inherit}.absolute-voice-routing-status--error{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-routing-status__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-routing-status__eyebrow{color:#73664f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-routing-status__label{font-size:24px;line-height:1}.absolute-voice-routing-status__description{color:#514733;margin:12px 0 0}.absolute-voice-routing-status__grid{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:14px}.absolute-voice-routing-status__grid div{background:#fff;border:1px solid #eee4d2;border-radius:14px;padding:10px 12px}.absolute-voice-routing-status__grid span{color:#655944;display:block;font-size:12px;margin-bottom:4px}.absolute-voice-routing-status__grid strong{overflow-wrap:anywhere}.absolute-voice-routing-status__empty{color:#655944;margin:14px 0 0}.absolute-voice-routing-status__error{color:#9f1239;font-weight:700}`;
@@ -5111,7 +5212,7 @@ var createVoiceProviderSimulationControlsStore = (options) => {
5111
5212
  };
5112
5213
  };
5113
5214
  // src/client/providerSimulationControlsWidget.ts
5114
- var escapeHtml8 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5215
+ var escapeHtml9 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5115
5216
  var formatKind = (kind) => (kind ?? "stt").toUpperCase();
5116
5217
  var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
5117
5218
  const configuredProviders = options.providers.filter((provider) => provider.configured !== false);
@@ -5131,18 +5232,18 @@ var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
5131
5232
  };
5132
5233
  var renderVoiceProviderSimulationControlsHTML = (snapshot, options) => {
5133
5234
  const model = createVoiceProviderSimulationControlsViewModel(snapshot, options);
5134
- const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${escapeHtml8(provider.provider)}"${!model.canSimulateFailure || snapshot.isRunning ? " disabled" : ""}>Simulate ${escapeHtml8(provider.provider)} ${escapeHtml8(formatKind(options.kind))} failure</button>`).join("");
5135
- const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${escapeHtml8(provider.provider)}"${snapshot.isRunning ? " disabled" : ""}>Mark ${escapeHtml8(provider.provider)} recovered</button>`).join("");
5235
+ const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${escapeHtml9(provider.provider)}"${!model.canSimulateFailure || snapshot.isRunning ? " disabled" : ""}>Simulate ${escapeHtml9(provider.provider)} ${escapeHtml9(formatKind(options.kind))} failure</button>`).join("");
5236
+ const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${escapeHtml9(provider.provider)}"${snapshot.isRunning ? " disabled" : ""}>Mark ${escapeHtml9(provider.provider)} recovered</button>`).join("");
5136
5237
  return `<section class="absolute-voice-provider-simulation absolute-voice-provider-simulation--${snapshot.error ? "error" : snapshot.isRunning ? "running" : "ready"}">
5137
5238
  <header class="absolute-voice-provider-simulation__header">
5138
- <span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml8(model.title)}</span>
5139
- <strong class="absolute-voice-provider-simulation__label">${escapeHtml8(model.label)}</strong>
5239
+ <span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml9(model.title)}</span>
5240
+ <strong class="absolute-voice-provider-simulation__label">${escapeHtml9(model.label)}</strong>
5140
5241
  </header>
5141
- <p class="absolute-voice-provider-simulation__description">${escapeHtml8(model.description)}</p>
5142
- ${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml8(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
5242
+ <p class="absolute-voice-provider-simulation__description">${escapeHtml9(model.description)}</p>
5243
+ ${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml9(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
5143
5244
  <div class="absolute-voice-provider-simulation__actions">${failureButtons}${recoveryButtons}</div>
5144
- ${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml8(snapshot.error)}</p>` : ""}
5145
- ${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml8(model.resultText)}</pre>` : ""}
5245
+ ${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml9(snapshot.error)}</p>` : ""}
5246
+ ${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml9(model.resultText)}</pre>` : ""}
5146
5247
  </section>`;
5147
5248
  };
5148
5249
  var bindVoiceProviderSimulationControls = (element, store) => {
@@ -5207,11 +5308,11 @@ var defineVoiceProviderSimulationControlsElement = (tagName = "absolute-voice-pr
5207
5308
  });
5208
5309
  };
5209
5310
  // src/client/providerStatusWidget.ts
5210
- var DEFAULT_TITLE5 = "Voice Providers";
5211
- var DEFAULT_DESCRIPTION5 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
5212
- var escapeHtml9 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5311
+ var DEFAULT_TITLE6 = "Voice Providers";
5312
+ var DEFAULT_DESCRIPTION6 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
5313
+ var escapeHtml10 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5213
5314
  var formatProvider = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
5214
- var formatStatus = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
5315
+ var formatStatus2 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
5215
5316
  var formatLatency = (value) => typeof value === "number" ? `${value}ms` : "No samples";
5216
5317
  var formatSuppression = (value) => typeof value === "number" ? `${Math.ceil(value / 1000)}s` : "None";
5217
5318
  var getProviderDetail = (provider) => {
@@ -5253,37 +5354,37 @@ var createVoiceProviderStatusViewModel = (snapshot, options = {}) => {
5253
5354
  const warningCount = providers.filter((provider) => isWarningStatus(provider.status)).length;
5254
5355
  const healthyCount = providers.filter((provider) => provider.status === "healthy").length;
5255
5356
  return {
5256
- description: options.description ?? DEFAULT_DESCRIPTION5,
5357
+ description: options.description ?? DEFAULT_DESCRIPTION6,
5257
5358
  error: snapshot.error,
5258
5359
  isLoading: snapshot.isLoading,
5259
5360
  label: snapshot.error ? "Unavailable" : providers.length ? warningCount > 0 ? `${warningCount} needs attention` : `${healthyCount} healthy` : snapshot.isLoading ? "Checking" : "No provider traffic",
5260
5361
  providers,
5261
5362
  status: snapshot.error ? "error" : providers.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
5262
- title: options.title ?? DEFAULT_TITLE5,
5363
+ title: options.title ?? DEFAULT_TITLE6,
5263
5364
  updatedAt: snapshot.updatedAt
5264
5365
  };
5265
5366
  };
5266
5367
  var renderVoiceProviderStatusHTML = (snapshot, options = {}) => {
5267
5368
  const model = createVoiceProviderStatusViewModel(snapshot, options);
5268
- 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--${escapeHtml9(provider.status)}">
5369
+ 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--${escapeHtml10(provider.status)}">
5269
5370
  <header>
5270
- <strong>${escapeHtml9(provider.label)}</strong>
5271
- <span>${escapeHtml9(formatStatus(provider.status))}</span>
5371
+ <strong>${escapeHtml10(provider.label)}</strong>
5372
+ <span>${escapeHtml10(formatStatus2(provider.status))}</span>
5272
5373
  </header>
5273
- <p>${escapeHtml9(provider.detail)}</p>
5374
+ <p>${escapeHtml10(provider.detail)}</p>
5274
5375
  <dl>${provider.rows.map((row) => `<div>
5275
- <dt>${escapeHtml9(row.label)}</dt>
5276
- <dd>${escapeHtml9(row.value)}</dd>
5376
+ <dt>${escapeHtml10(row.label)}</dt>
5377
+ <dd>${escapeHtml10(row.value)}</dd>
5277
5378
  </div>`).join("")}</dl>
5278
5379
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-status__empty">Run voice traffic to see provider health.</p>';
5279
- return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml9(model.status)}">
5380
+ return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml10(model.status)}">
5280
5381
  <header class="absolute-voice-provider-status__header">
5281
- <span class="absolute-voice-provider-status__eyebrow">${escapeHtml9(model.title)}</span>
5282
- <strong class="absolute-voice-provider-status__label">${escapeHtml9(model.label)}</strong>
5382
+ <span class="absolute-voice-provider-status__eyebrow">${escapeHtml10(model.title)}</span>
5383
+ <strong class="absolute-voice-provider-status__label">${escapeHtml10(model.label)}</strong>
5283
5384
  </header>
5284
- <p class="absolute-voice-provider-status__description">${escapeHtml9(model.description)}</p>
5385
+ <p class="absolute-voice-provider-status__description">${escapeHtml10(model.description)}</p>
5285
5386
  ${providers}
5286
- ${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml9(model.error)}</p>` : ""}
5387
+ ${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml10(model.error)}</p>` : ""}
5287
5388
  </section>`;
5288
5389
  };
5289
5390
  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}`;
@@ -5324,12 +5425,12 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
5324
5425
  });
5325
5426
  };
5326
5427
  // src/client/providerCapabilitiesWidget.ts
5327
- var DEFAULT_TITLE6 = "Provider Capabilities";
5328
- var DEFAULT_DESCRIPTION6 = "Configured, selected, and healthy voice providers for this deployment.";
5329
- var escapeHtml10 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5428
+ var DEFAULT_TITLE7 = "Provider Capabilities";
5429
+ var DEFAULT_DESCRIPTION7 = "Configured, selected, and healthy voice providers for this deployment.";
5430
+ var escapeHtml11 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5330
5431
  var formatProvider2 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
5331
5432
  var formatKind2 = (kind) => kind.toUpperCase();
5332
- var formatStatus2 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
5433
+ var formatStatus3 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
5333
5434
  var getCapabilityDetail = (capability) => {
5334
5435
  if (!capability.configured) {
5335
5436
  return "Not configured in this deployment.";
@@ -5355,7 +5456,7 @@ var createVoiceProviderCapabilitiesViewModel = (snapshot, options = {}) => {
5355
5456
  detail: getCapabilityDetail(capability),
5356
5457
  label: `${formatProvider2(capability.provider)} ${formatKind2(capability.kind)}`,
5357
5458
  rows: [
5358
- { label: "Status", value: formatStatus2(capability.status) },
5459
+ { label: "Status", value: formatStatus3(capability.status) },
5359
5460
  { label: "Selected", value: capability.selected ? "Yes" : "No" },
5360
5461
  { label: "Model", value: capability.model ?? "Default" },
5361
5462
  {
@@ -5370,36 +5471,36 @@ var createVoiceProviderCapabilitiesViewModel = (snapshot, options = {}) => {
5370
5471
  const selectedCount = snapshot.report?.selected ?? capabilities.filter((capability) => capability.selected).length;
5371
5472
  return {
5372
5473
  capabilities,
5373
- description: options.description ?? DEFAULT_DESCRIPTION6,
5474
+ description: options.description ?? DEFAULT_DESCRIPTION7,
5374
5475
  error: snapshot.error,
5375
5476
  isLoading: snapshot.isLoading,
5376
5477
  label: snapshot.error ? "Unavailable" : capabilities.length ? warningCount > 0 ? `${warningCount} needs attention` : `${selectedCount} selected` : snapshot.isLoading ? "Checking" : "No capabilities",
5377
5478
  status: snapshot.error ? "error" : capabilities.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
5378
- title: options.title ?? DEFAULT_TITLE6,
5479
+ title: options.title ?? DEFAULT_TITLE7,
5379
5480
  updatedAt: snapshot.updatedAt
5380
5481
  };
5381
5482
  };
5382
5483
  var renderVoiceProviderCapabilitiesHTML = (snapshot, options = {}) => {
5383
5484
  const model = createVoiceProviderCapabilitiesViewModel(snapshot, options);
5384
- 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--${escapeHtml10(capability.status)}">
5485
+ 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--${escapeHtml11(capability.status)}">
5385
5486
  <header>
5386
- <strong>${escapeHtml10(capability.label)}</strong>
5387
- <span>${escapeHtml10(formatStatus2(capability.status))}</span>
5487
+ <strong>${escapeHtml11(capability.label)}</strong>
5488
+ <span>${escapeHtml11(formatStatus3(capability.status))}</span>
5388
5489
  </header>
5389
- <p>${escapeHtml10(capability.detail)}</p>
5490
+ <p>${escapeHtml11(capability.detail)}</p>
5390
5491
  <dl>${capability.rows.map((row) => `<div>
5391
- <dt>${escapeHtml10(row.label)}</dt>
5392
- <dd>${escapeHtml10(row.value)}</dd>
5492
+ <dt>${escapeHtml11(row.label)}</dt>
5493
+ <dd>${escapeHtml11(row.value)}</dd>
5393
5494
  </div>`).join("")}</dl>
5394
5495
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-capabilities__empty">Configure provider capabilities to see deployment coverage.</p>';
5395
- return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${escapeHtml10(model.status)}">
5496
+ return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${escapeHtml11(model.status)}">
5396
5497
  <header class="absolute-voice-provider-capabilities__header">
5397
- <span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml10(model.title)}</span>
5398
- <strong class="absolute-voice-provider-capabilities__label">${escapeHtml10(model.label)}</strong>
5498
+ <span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml11(model.title)}</span>
5499
+ <strong class="absolute-voice-provider-capabilities__label">${escapeHtml11(model.label)}</strong>
5399
5500
  </header>
5400
- <p class="absolute-voice-provider-capabilities__description">${escapeHtml10(model.description)}</p>
5501
+ <p class="absolute-voice-provider-capabilities__description">${escapeHtml11(model.description)}</p>
5401
5502
  ${capabilities}
5402
- ${model.error ? `<p class="absolute-voice-provider-capabilities__error">${escapeHtml10(model.error)}</p>` : ""}
5503
+ ${model.error ? `<p class="absolute-voice-provider-capabilities__error">${escapeHtml11(model.error)}</p>` : ""}
5403
5504
  </section>`;
5404
5505
  };
5405
5506
  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}`;
@@ -5440,11 +5541,11 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
5440
5541
  });
5441
5542
  };
5442
5543
  // src/client/providerContractsWidget.ts
5443
- var DEFAULT_TITLE7 = "Provider Contracts";
5444
- var DEFAULT_DESCRIPTION7 = "Production contract coverage for provider env, latency, fallback, streaming, and capabilities.";
5445
- var escapeHtml11 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5544
+ var DEFAULT_TITLE8 = "Provider Contracts";
5545
+ var DEFAULT_DESCRIPTION8 = "Production contract coverage for provider env, latency, fallback, streaming, and capabilities.";
5546
+ var escapeHtml12 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5446
5547
  var formatProvider3 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
5447
- var formatStatus3 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
5548
+ var formatStatus4 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
5448
5549
  var contractDetail = (row) => {
5449
5550
  const failing = row.checks.filter((check) => check.status !== "pass");
5450
5551
  if (failing.length === 0) {
@@ -5463,49 +5564,49 @@ var createVoiceProviderContractsViewModel = (snapshot, options = {}) => {
5463
5564
  label: check.remediation?.label ?? check.label
5464
5565
  })),
5465
5566
  rows: [
5466
- { label: "Status", value: formatStatus3(row.status) },
5567
+ { label: "Status", value: formatStatus4(row.status) },
5467
5568
  { label: "Selected", value: row.selected ? "Yes" : "No" },
5468
5569
  { label: "Configured", value: row.configured ? "Yes" : "No" },
5469
5570
  {
5470
5571
  label: "Checks",
5471
- value: row.checks.map((check) => `${check.label}: ${formatStatus3(check.status)}`).join(", ")
5572
+ value: row.checks.map((check) => `${check.label}: ${formatStatus4(check.status)}`).join(", ")
5472
5573
  }
5473
5574
  ]
5474
5575
  }));
5475
5576
  const warningCount = snapshot.report ? snapshot.report.failed + snapshot.report.warned : rows.filter((row) => row.status !== "pass").length;
5476
5577
  return {
5477
- description: options.description ?? DEFAULT_DESCRIPTION7,
5578
+ description: options.description ?? DEFAULT_DESCRIPTION8,
5478
5579
  error: snapshot.error,
5479
5580
  isLoading: snapshot.isLoading,
5480
5581
  label: snapshot.error ? "Unavailable" : rows.length ? warningCount > 0 ? `${warningCount} needs attention` : `${rows.length} passing` : snapshot.isLoading ? "Checking" : "No contracts",
5481
5582
  rows,
5482
5583
  status: snapshot.error ? "error" : rows.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
5483
- title: options.title ?? DEFAULT_TITLE7,
5584
+ title: options.title ?? DEFAULT_TITLE8,
5484
5585
  updatedAt: snapshot.updatedAt
5485
5586
  };
5486
5587
  };
5487
5588
  var renderVoiceProviderContractsHTML = (snapshot, options = {}) => {
5488
5589
  const model = createVoiceProviderContractsViewModel(snapshot, options);
5489
- 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--${escapeHtml11(row.status)}">
5590
+ 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--${escapeHtml12(row.status)}">
5490
5591
  <header>
5491
- <strong>${escapeHtml11(row.label)}</strong>
5492
- <span>${escapeHtml11(formatStatus3(row.status))}</span>
5592
+ <strong>${escapeHtml12(row.label)}</strong>
5593
+ <span>${escapeHtml12(formatStatus4(row.status))}</span>
5493
5594
  </header>
5494
- <p>${escapeHtml11(row.detail)}</p>
5495
- ${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${escapeHtml11(remediation.href)}">${escapeHtml11(remediation.label)}</a>` : `<strong>${escapeHtml11(remediation.label)}</strong>`}<span>${escapeHtml11(remediation.detail)}</span></li>`).join("")}</ul>` : ""}
5595
+ <p>${escapeHtml12(row.detail)}</p>
5596
+ ${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${escapeHtml12(remediation.href)}">${escapeHtml12(remediation.label)}</a>` : `<strong>${escapeHtml12(remediation.label)}</strong>`}<span>${escapeHtml12(remediation.detail)}</span></li>`).join("")}</ul>` : ""}
5496
5597
  <dl>${row.rows.map((item) => `<div>
5497
- <dt>${escapeHtml11(item.label)}</dt>
5498
- <dd>${escapeHtml11(item.value)}</dd>
5598
+ <dt>${escapeHtml12(item.label)}</dt>
5599
+ <dd>${escapeHtml12(item.value)}</dd>
5499
5600
  </div>`).join("")}</dl>
5500
5601
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-contracts__empty">Configure provider contracts to see production coverage.</p>';
5501
- return `<section class="absolute-voice-provider-contracts absolute-voice-provider-contracts--${escapeHtml11(model.status)}">
5602
+ return `<section class="absolute-voice-provider-contracts absolute-voice-provider-contracts--${escapeHtml12(model.status)}">
5502
5603
  <header class="absolute-voice-provider-contracts__header">
5503
- <span class="absolute-voice-provider-contracts__eyebrow">${escapeHtml11(model.title)}</span>
5504
- <strong class="absolute-voice-provider-contracts__label">${escapeHtml11(model.label)}</strong>
5604
+ <span class="absolute-voice-provider-contracts__eyebrow">${escapeHtml12(model.title)}</span>
5605
+ <strong class="absolute-voice-provider-contracts__label">${escapeHtml12(model.label)}</strong>
5505
5606
  </header>
5506
- <p class="absolute-voice-provider-contracts__description">${escapeHtml11(model.description)}</p>
5607
+ <p class="absolute-voice-provider-contracts__description">${escapeHtml12(model.description)}</p>
5507
5608
  ${rows}
5508
- ${model.error ? `<p class="absolute-voice-provider-contracts__error">${escapeHtml11(model.error)}</p>` : ""}
5609
+ ${model.error ? `<p class="absolute-voice-provider-contracts__error">${escapeHtml12(model.error)}</p>` : ""}
5509
5610
  </section>`;
5510
5611
  };
5511
5612
  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}`;
@@ -5546,9 +5647,9 @@ var defineVoiceProviderContractsElement = (tagName = "absolute-voice-provider-co
5546
5647
  });
5547
5648
  };
5548
5649
  // src/client/turnQualityWidget.ts
5549
- var DEFAULT_TITLE8 = "Turn Quality";
5550
- var DEFAULT_DESCRIPTION8 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
5551
- var escapeHtml12 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5650
+ var DEFAULT_TITLE9 = "Turn Quality";
5651
+ var DEFAULT_DESCRIPTION9 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
5652
+ var escapeHtml13 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5552
5653
  var formatConfidence = (value) => typeof value === "number" ? `${Math.round(value * 100)}%` : "n/a";
5553
5654
  var formatMaybe = (value) => value === undefined || value === "" ? "n/a" : String(value);
5554
5655
  var getTurnDetail = (turn) => {
@@ -5586,37 +5687,37 @@ var createVoiceTurnQualityViewModel = (snapshot, options = {}) => {
5586
5687
  const warningCount = snapshot.report?.warnings ?? turns.filter((turn) => turn.status === "warn").length;
5587
5688
  const failedCount = snapshot.report?.failed ?? turns.filter((turn) => turn.status === "fail").length;
5588
5689
  return {
5589
- description: options.description ?? DEFAULT_DESCRIPTION8,
5690
+ description: options.description ?? DEFAULT_DESCRIPTION9,
5590
5691
  error: snapshot.error,
5591
5692
  isLoading: snapshot.isLoading,
5592
5693
  label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} failed` : warningCount > 0 ? `${warningCount} warnings` : `${turns.length} healthy` : snapshot.isLoading ? "Checking" : "No turns",
5593
5694
  status: snapshot.error ? "error" : turns.length ? failedCount > 0 || warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
5594
- title: options.title ?? DEFAULT_TITLE8,
5695
+ title: options.title ?? DEFAULT_TITLE9,
5595
5696
  turns,
5596
5697
  updatedAt: snapshot.updatedAt
5597
5698
  };
5598
5699
  };
5599
5700
  var renderVoiceTurnQualityHTML = (snapshot, options = {}) => {
5600
5701
  const model = createVoiceTurnQualityViewModel(snapshot, options);
5601
- 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--${escapeHtml12(turn.status)}">
5702
+ 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--${escapeHtml13(turn.status)}">
5602
5703
  <header>
5603
- <strong>${escapeHtml12(turn.label)}</strong>
5604
- <span>${escapeHtml12(turn.status)}</span>
5704
+ <strong>${escapeHtml13(turn.label)}</strong>
5705
+ <span>${escapeHtml13(turn.status)}</span>
5605
5706
  </header>
5606
- <p>${escapeHtml12(turn.detail)}</p>
5707
+ <p>${escapeHtml13(turn.detail)}</p>
5607
5708
  <dl>${turn.rows.map((row) => `<div>
5608
- <dt>${escapeHtml12(row.label)}</dt>
5609
- <dd>${escapeHtml12(row.value)}</dd>
5709
+ <dt>${escapeHtml13(row.label)}</dt>
5710
+ <dd>${escapeHtml13(row.value)}</dd>
5610
5711
  </div>`).join("")}</dl>
5611
5712
  </article>`).join("")}</div>` : '<p class="absolute-voice-turn-quality__empty">Complete a voice turn to see STT quality diagnostics.</p>';
5612
- return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${escapeHtml12(model.status)}">
5713
+ return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${escapeHtml13(model.status)}">
5613
5714
  <header class="absolute-voice-turn-quality__header">
5614
- <span class="absolute-voice-turn-quality__eyebrow">${escapeHtml12(model.title)}</span>
5615
- <strong class="absolute-voice-turn-quality__label">${escapeHtml12(model.label)}</strong>
5715
+ <span class="absolute-voice-turn-quality__eyebrow">${escapeHtml13(model.title)}</span>
5716
+ <strong class="absolute-voice-turn-quality__label">${escapeHtml13(model.label)}</strong>
5616
5717
  </header>
5617
- <p class="absolute-voice-turn-quality__description">${escapeHtml12(model.description)}</p>
5718
+ <p class="absolute-voice-turn-quality__description">${escapeHtml13(model.description)}</p>
5618
5719
  ${turns}
5619
- ${model.error ? `<p class="absolute-voice-turn-quality__error">${escapeHtml12(model.error)}</p>` : ""}
5720
+ ${model.error ? `<p class="absolute-voice-turn-quality__error">${escapeHtml13(model.error)}</p>` : ""}
5620
5721
  </section>`;
5621
5722
  };
5622
5723
  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}`;
@@ -5657,10 +5758,10 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
5657
5758
  });
5658
5759
  };
5659
5760
  // src/client/turnLatencyWidget.ts
5660
- var DEFAULT_TITLE9 = "Turn Latency";
5661
- var DEFAULT_DESCRIPTION9 = "Per-turn timing from first transcript to commit and assistant response start.";
5761
+ var DEFAULT_TITLE10 = "Turn Latency";
5762
+ var DEFAULT_DESCRIPTION10 = "Per-turn timing from first transcript to commit and assistant response start.";
5662
5763
  var DEFAULT_PROOF_LABEL = "Run latency proof";
5663
- var escapeHtml13 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5764
+ var escapeHtml14 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5664
5765
  var formatMs = (value) => typeof value === "number" ? `${Math.round(value)}ms` : "n/a";
5665
5766
  var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
5666
5767
  const turns = (snapshot.report?.turns ?? []).map((turn) => ({
@@ -5674,39 +5775,39 @@ var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
5674
5775
  const warningCount = snapshot.report?.warnings ?? turns.filter((turn) => turn.status === "warn").length;
5675
5776
  const failedCount = snapshot.report?.failed ?? turns.filter((turn) => turn.status === "fail").length;
5676
5777
  return {
5677
- description: options.description ?? DEFAULT_DESCRIPTION9,
5778
+ description: options.description ?? DEFAULT_DESCRIPTION10,
5678
5779
  error: snapshot.error,
5679
5780
  isLoading: snapshot.isLoading,
5680
5781
  label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} slow` : warningCount > 0 ? `${warningCount} warnings` : `avg ${formatMs(snapshot.report?.averageTotalMs)}` : snapshot.isLoading ? "Checking" : "No turns",
5681
5782
  proofLabel: options.proofPath ? options.proofLabel ?? DEFAULT_PROOF_LABEL : undefined,
5682
5783
  showProofAction: Boolean(options.proofPath),
5683
5784
  status: snapshot.error ? "error" : turns.length ? failedCount > 0 || warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
5684
- title: options.title ?? DEFAULT_TITLE9,
5785
+ title: options.title ?? DEFAULT_TITLE10,
5685
5786
  turns,
5686
5787
  updatedAt: snapshot.updatedAt
5687
5788
  };
5688
5789
  };
5689
5790
  var renderVoiceTurnLatencyHTML = (snapshot, options = {}) => {
5690
5791
  const model = createVoiceTurnLatencyViewModel(snapshot, options);
5691
- 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--${escapeHtml13(turn.status)}">
5792
+ 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--${escapeHtml14(turn.status)}">
5692
5793
  <header>
5693
- <strong>${escapeHtml13(turn.label)}</strong>
5694
- <span>${escapeHtml13(turn.status)}</span>
5794
+ <strong>${escapeHtml14(turn.label)}</strong>
5795
+ <span>${escapeHtml14(turn.status)}</span>
5695
5796
  </header>
5696
5797
  <dl>${turn.rows.map((row) => `<div>
5697
- <dt>${escapeHtml13(row.label)}</dt>
5698
- <dd>${escapeHtml13(row.value)}</dd>
5798
+ <dt>${escapeHtml14(row.label)}</dt>
5799
+ <dd>${escapeHtml14(row.value)}</dd>
5699
5800
  </div>`).join("")}</dl>
5700
5801
  </article>`).join("")}</div>` : '<p class="absolute-voice-turn-latency__empty">Complete a voice turn to see latency diagnostics.</p>';
5701
- return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${escapeHtml13(model.status)}">
5802
+ return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${escapeHtml14(model.status)}">
5702
5803
  <header class="absolute-voice-turn-latency__header">
5703
- <span class="absolute-voice-turn-latency__eyebrow">${escapeHtml13(model.title)}</span>
5704
- <strong class="absolute-voice-turn-latency__label">${escapeHtml13(model.label)}</strong>
5804
+ <span class="absolute-voice-turn-latency__eyebrow">${escapeHtml14(model.title)}</span>
5805
+ <strong class="absolute-voice-turn-latency__label">${escapeHtml14(model.label)}</strong>
5705
5806
  </header>
5706
- <p class="absolute-voice-turn-latency__description">${escapeHtml13(model.description)}</p>
5707
- ${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml13(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</button>` : ""}
5807
+ <p class="absolute-voice-turn-latency__description">${escapeHtml14(model.description)}</p>
5808
+ ${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml14(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</button>` : ""}
5708
5809
  ${turns}
5709
- ${model.error ? `<p class="absolute-voice-turn-latency__error">${escapeHtml13(model.error)}</p>` : ""}
5810
+ ${model.error ? `<p class="absolute-voice-turn-latency__error">${escapeHtml14(model.error)}</p>` : ""}
5710
5811
  </section>`;
5711
5812
  };
5712
5813
  var mountVoiceTurnLatency = (element, path = "/api/turn-latency", options = {}) => {
@@ -5756,9 +5857,9 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
5756
5857
  });
5757
5858
  };
5758
5859
  // src/client/traceTimelineWidget.ts
5759
- var DEFAULT_TITLE10 = "Voice Traces";
5760
- var DEFAULT_DESCRIPTION10 = "Latest call timelines with provider latency, fallbacks, handoffs, and errors from your self-hosted trace store.";
5761
- var escapeHtml14 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5860
+ var DEFAULT_TITLE11 = "Voice Traces";
5861
+ var DEFAULT_DESCRIPTION11 = "Latest call timelines with provider latency, fallbacks, handoffs, and errors from your self-hosted trace store.";
5862
+ var escapeHtml15 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5762
5863
  var formatMs2 = (value) => typeof value === "number" ? `${value}ms` : "n/a";
5763
5864
  var formatProviders = (session) => session.providers.length ? session.providers.map((provider) => provider.provider).join(", ") : "No providers";
5764
5865
  var createVoiceTraceTimelineViewModel = (snapshot, options = {}) => {
@@ -5774,13 +5875,13 @@ var createVoiceTraceTimelineViewModel = (snapshot, options = {}) => {
5774
5875
  const failed = sessions.filter((session) => session.status === "failed").length;
5775
5876
  const warnings = sessions.filter((session) => session.status === "warning").length;
5776
5877
  return {
5777
- description: options.description ?? DEFAULT_DESCRIPTION10,
5878
+ description: options.description ?? DEFAULT_DESCRIPTION11,
5778
5879
  error: snapshot.error,
5779
5880
  isLoading: snapshot.isLoading,
5780
5881
  label: snapshot.error ? "Unavailable" : failed > 0 ? `${failed} failed` : warnings > 0 ? `${warnings} warning` : sessions.length ? `${sessions.length} recent` : snapshot.isLoading ? "Checking" : "No traces yet",
5781
5882
  sessions,
5782
5883
  status: snapshot.error ? "error" : failed > 0 ? "failed" : warnings > 0 ? "warning" : sessions.length ? "ready" : snapshot.isLoading ? "loading" : "empty",
5783
- title: options.title ?? DEFAULT_TITLE10,
5884
+ title: options.title ?? DEFAULT_TITLE11,
5784
5885
  updatedAt: snapshot.updatedAt
5785
5886
  };
5786
5887
  };
@@ -5788,27 +5889,27 @@ var renderVoiceTraceTimelineWidgetHTML = (snapshot, options = {}) => {
5788
5889
  const model = createVoiceTraceTimelineViewModel(snapshot, options);
5789
5890
  const sessions = model.sessions.length ? `<div class="absolute-voice-trace-timeline__sessions">${model.sessions.map((session) => {
5790
5891
  const supportLinks = [
5791
- `<a href="${escapeHtml14(session.detailHref)}">Open timeline</a>`,
5792
- session.operationsRecordHref ? `<a href="${escapeHtml14(session.operationsRecordHref)}">Open operations record</a>` : undefined,
5793
- session.incidentBundleHref ? `<a href="${escapeHtml14(session.incidentBundleHref)}">Export incident bundle</a>` : undefined
5892
+ `<a href="${escapeHtml15(session.detailHref)}">Open timeline</a>`,
5893
+ session.operationsRecordHref ? `<a href="${escapeHtml15(session.operationsRecordHref)}">Open operations record</a>` : undefined,
5894
+ session.incidentBundleHref ? `<a href="${escapeHtml15(session.incidentBundleHref)}">Export incident bundle</a>` : undefined
5794
5895
  ].filter(Boolean).join("");
5795
- return `<article class="absolute-voice-trace-timeline__session absolute-voice-trace-timeline__session--${escapeHtml14(session.status)}">
5896
+ return `<article class="absolute-voice-trace-timeline__session absolute-voice-trace-timeline__session--${escapeHtml15(session.status)}">
5796
5897
  <header>
5797
- <strong>${escapeHtml14(session.sessionId)}</strong>
5798
- <span>${escapeHtml14(session.status)}</span>
5898
+ <strong>${escapeHtml15(session.sessionId)}</strong>
5899
+ <span>${escapeHtml15(session.status)}</span>
5799
5900
  </header>
5800
- <p>${escapeHtml14(session.label)} \xB7 ${escapeHtml14(session.durationLabel)} \xB7 ${escapeHtml14(session.providerLabel)}</p>
5901
+ <p>${escapeHtml15(session.label)} \xB7 ${escapeHtml15(session.durationLabel)} \xB7 ${escapeHtml15(session.providerLabel)}</p>
5801
5902
  <p class="absolute-voice-trace-timeline__actions">${supportLinks}</p>
5802
5903
  </article>`;
5803
5904
  }).join("")}</div>` : '<p class="absolute-voice-trace-timeline__empty">Run a voice session to see call timelines.</p>';
5804
- return `<section class="absolute-voice-trace-timeline absolute-voice-trace-timeline--${escapeHtml14(model.status)}">
5905
+ return `<section class="absolute-voice-trace-timeline absolute-voice-trace-timeline--${escapeHtml15(model.status)}">
5805
5906
  <header class="absolute-voice-trace-timeline__header">
5806
- <span class="absolute-voice-trace-timeline__eyebrow">${escapeHtml14(model.title)}</span>
5807
- <strong class="absolute-voice-trace-timeline__label">${escapeHtml14(model.label)}</strong>
5907
+ <span class="absolute-voice-trace-timeline__eyebrow">${escapeHtml15(model.title)}</span>
5908
+ <strong class="absolute-voice-trace-timeline__label">${escapeHtml15(model.label)}</strong>
5808
5909
  </header>
5809
- <p class="absolute-voice-trace-timeline__description">${escapeHtml14(model.description)}</p>
5910
+ <p class="absolute-voice-trace-timeline__description">${escapeHtml15(model.description)}</p>
5810
5911
  ${sessions}
5811
- ${model.error ? `<p class="absolute-voice-trace-timeline__error">${escapeHtml14(model.error)}</p>` : ""}
5912
+ ${model.error ? `<p class="absolute-voice-trace-timeline__error">${escapeHtml15(model.error)}</p>` : ""}
5812
5913
  </section>`;
5813
5914
  };
5814
5915
  var getVoiceTraceTimelineCSS = () => `.absolute-voice-trace-timeline{border:1px solid #bad7d3;border-radius:20px;background:#f3fffb;color:#09201c;padding:18px;box-shadow:0 18px 40px rgba(9,32,28,.12);font-family:inherit}.absolute-voice-trace-timeline--error,.absolute-voice-trace-timeline--failed{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-trace-timeline--warning{border-color:#fbbf24;background:#fffaf0}.absolute-voice-trace-timeline__header,.absolute-voice-trace-timeline__session header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-trace-timeline__eyebrow{color:#17665b;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-trace-timeline__label{font-size:24px;line-height:1}.absolute-voice-trace-timeline__description,.absolute-voice-trace-timeline__session p,.absolute-voice-trace-timeline__empty{color:#35544f}.absolute-voice-trace-timeline__sessions{display:grid;gap:12px;margin-top:14px}.absolute-voice-trace-timeline__session{background:#fff;border:1px solid #cfe7e2;border-radius:16px;padding:14px}.absolute-voice-trace-timeline__session--failed{border-color:#f2a7a7}.absolute-voice-trace-timeline__session--warning{border-color:#fbbf24}.absolute-voice-trace-timeline__session p{margin:10px 0}.absolute-voice-trace-timeline__actions{display:flex;flex-wrap:wrap;gap:10px}.absolute-voice-trace-timeline__session a{color:#0f766e;font-weight:800}.absolute-voice-trace-timeline__empty{margin:14px 0 0}.absolute-voice-trace-timeline__error{color:#9f1239;font-weight:700}`;
@@ -5854,9 +5955,9 @@ var defineVoiceTraceTimelineElement = (tagName = "absolute-voice-trace-timeline"
5854
5955
  });
5855
5956
  };
5856
5957
  // src/client/agentSquadStatusWidget.ts
5857
- var DEFAULT_TITLE11 = "Voice Agent Squad";
5858
- var DEFAULT_DESCRIPTION11 = "Current specialist and recent handoffs from your self-hosted voice traces.";
5859
- var escapeHtml15 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5958
+ var DEFAULT_TITLE12 = "Voice Agent Squad";
5959
+ var DEFAULT_DESCRIPTION12 = "Current specialist and recent handoffs from your self-hosted voice traces.";
5960
+ var escapeHtml16 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5860
5961
  var labelFor = (current) => {
5861
5962
  if (!current)
5862
5963
  return "Waiting for specialist activity";
@@ -5870,37 +5971,37 @@ var labelFor = (current) => {
5870
5971
  };
5871
5972
  var createVoiceAgentSquadStatusViewModel = (snapshot, options = {}) => ({
5872
5973
  current: snapshot.report.current,
5873
- description: options.description ?? DEFAULT_DESCRIPTION11,
5974
+ description: options.description ?? DEFAULT_DESCRIPTION12,
5874
5975
  error: snapshot.error,
5875
5976
  isLoading: snapshot.isLoading,
5876
5977
  label: snapshot.error ? "Unavailable" : labelFor(snapshot.report.current),
5877
5978
  sessionCount: snapshot.report.sessionCount,
5878
5979
  sessions: snapshot.report.sessions,
5879
- title: options.title ?? DEFAULT_TITLE11,
5980
+ title: options.title ?? DEFAULT_TITLE12,
5880
5981
  updatedAt: snapshot.updatedAt
5881
5982
  });
5882
5983
  var renderVoiceAgentSquadStatusHTML = (snapshot, options = {}) => {
5883
5984
  const model = createVoiceAgentSquadStatusViewModel(snapshot, options);
5884
5985
  const current = model.current;
5885
5986
  const rows = model.sessions.length ? model.sessions.slice(0, 5).map((session) => `<li>
5886
- <span>${escapeHtml15(session.sessionId)}</span>
5887
- <strong>${escapeHtml15(session.targetAgentId ?? "none")}</strong>
5888
- <em>${escapeHtml15(session.status)}</em>
5889
- ${session.summary || session.reason ? `<p>${escapeHtml15(session.summary ?? session.reason ?? "")}</p>` : ""}
5987
+ <span>${escapeHtml16(session.sessionId)}</span>
5988
+ <strong>${escapeHtml16(session.targetAgentId ?? "none")}</strong>
5989
+ <em>${escapeHtml16(session.status)}</em>
5990
+ ${session.summary || session.reason ? `<p>${escapeHtml16(session.summary ?? session.reason ?? "")}</p>` : ""}
5890
5991
  </li>`).join("") : "<li><span>No squad traces yet.</span><strong>Waiting</strong></li>";
5891
5992
  return `<section class="absolute-voice-agent-squad-status">
5892
5993
  <header>
5893
- <span>${escapeHtml15(model.title)}</span>
5894
- <strong>${escapeHtml15(model.label)}</strong>
5994
+ <span>${escapeHtml16(model.title)}</span>
5995
+ <strong>${escapeHtml16(model.label)}</strong>
5895
5996
  </header>
5896
- <p>${escapeHtml15(model.description)}</p>
5997
+ <p>${escapeHtml16(model.description)}</p>
5897
5998
  <div>
5898
- <span>Session</span><strong>${escapeHtml15(current?.sessionId ?? "n/a")}</strong>
5899
- <span>From</span><strong>${escapeHtml15(current?.fromAgentId ?? "n/a")}</strong>
5900
- <span>Status</span><strong>${escapeHtml15(current?.status ?? "idle")}</strong>
5999
+ <span>Session</span><strong>${escapeHtml16(current?.sessionId ?? "n/a")}</strong>
6000
+ <span>From</span><strong>${escapeHtml16(current?.fromAgentId ?? "n/a")}</strong>
6001
+ <span>Status</span><strong>${escapeHtml16(current?.status ?? "idle")}</strong>
5901
6002
  </div>
5902
6003
  <ul>${rows}</ul>
5903
- ${model.error ? `<p class="absolute-voice-agent-squad-status__error">${escapeHtml15(model.error)}</p>` : ""}
6004
+ ${model.error ? `<p class="absolute-voice-agent-squad-status__error">${escapeHtml16(model.error)}</p>` : ""}
5904
6005
  </section>`;
5905
6006
  };
5906
6007
  var getVoiceAgentSquadStatusCSS = () => `.absolute-voice-agent-squad-status{border:1px solid #38bdf866;border-radius:20px;background:#0f172a;color:#f8fafc;padding:18px;font-family:inherit}.absolute-voice-agent-squad-status header{display:grid;gap:4px}.absolute-voice-agent-squad-status header span{color:#7dd3fc;font-size:12px;font-weight:900;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-agent-squad-status header strong{font-size:20px}.absolute-voice-agent-squad-status p{color:#cbd5e1}.absolute-voice-agent-squad-status div{display:grid;gap:6px;grid-template-columns:max-content 1fr;margin:14px 0}.absolute-voice-agent-squad-status div span{color:#94a3b8}.absolute-voice-agent-squad-status ul{display:grid;gap:8px;list-style:none;margin:0;padding:0}.absolute-voice-agent-squad-status li{background:#020617;border:1px solid #1e293b;border-radius:14px;padding:10px}.absolute-voice-agent-squad-status li span{color:#94a3b8;display:block;font-size:12px}.absolute-voice-agent-squad-status li strong{display:block}.absolute-voice-agent-squad-status li em{color:#7dd3fc;font-style:normal}.absolute-voice-agent-squad-status__error{color:#fecaca;font-weight:800}`;
@@ -6034,6 +6135,7 @@ export {
6034
6135
  renderVoiceProviderSimulationControlsHTML,
6035
6136
  renderVoiceProviderContractsHTML,
6036
6137
  renderVoiceProviderCapabilitiesHTML,
6138
+ renderVoicePlatformCoverageHTML,
6037
6139
  renderVoiceOpsStatusHTML,
6038
6140
  renderVoiceOpsActionHistoryWidgetHTML,
6039
6141
  renderVoiceOpsActionCenterHTML,
@@ -6050,6 +6152,7 @@ export {
6050
6152
  mountVoiceProviderSimulationControls,
6051
6153
  mountVoiceProviderContracts,
6052
6154
  mountVoiceProviderCapabilities,
6155
+ mountVoicePlatformCoverage,
6053
6156
  mountVoiceOpsStatus,
6054
6157
  mountVoiceOpsActionHistory,
6055
6158
  mountVoiceOpsActionCenter,
@@ -6062,6 +6165,7 @@ export {
6062
6165
  getVoiceProviderStatusCSS,
6063
6166
  getVoiceProviderContractsCSS,
6064
6167
  getVoiceProviderCapabilitiesCSS,
6168
+ getVoicePlatformCoverageCSS,
6065
6169
  getVoiceOpsStatusLabel,
6066
6170
  getVoiceOpsStatusCSS,
6067
6171
  getVoiceOpsActionHistoryCSS,
@@ -6090,6 +6194,7 @@ export {
6090
6194
  defineVoiceProviderSimulationControlsElement,
6091
6195
  defineVoiceProviderContractsElement,
6092
6196
  defineVoiceProviderCapabilitiesElement,
6197
+ defineVoicePlatformCoverageElement,
6093
6198
  defineVoiceOpsStatusElement,
6094
6199
  defineVoiceOpsActionCenterElement,
6095
6200
  defineVoiceLiveOpsElement,
@@ -6114,6 +6219,7 @@ export {
6114
6219
  createVoiceProviderContractsStore,
6115
6220
  createVoiceProviderCapabilitiesViewModel,
6116
6221
  createVoiceProviderCapabilitiesStore,
6222
+ createVoicePlatformCoverageViewModel,
6117
6223
  createVoicePlatformCoverageStore,
6118
6224
  createVoiceOpsStatusViewModel,
6119
6225
  createVoiceOpsStatusStore,