@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.
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +295 -189
- package/dist/client/platformCoverageWidget.d.ts +37 -0
- package/dist/react/VoicePlatformCoverage.d.ts +6 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +615 -429
- package/dist/vue/VoicePlatformCoverage.d.ts +23 -0
- package/dist/vue/index.d.ts +1 -0
- package/dist/vue/index.js +556 -386
- package/package.json +1 -1
package/dist/client/index.js
CHANGED
|
@@ -2749,10 +2749,111 @@ var defineVoiceOpsStatusElement = (tagName = "absolute-voice-ops-status") => {
|
|
|
2749
2749
|
}
|
|
2750
2750
|
});
|
|
2751
2751
|
};
|
|
2752
|
-
// src/client/
|
|
2753
|
-
var DEFAULT_TITLE2 = "
|
|
2754
|
-
var DEFAULT_DESCRIPTION2 = "
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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 ??
|
|
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 ??
|
|
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="${
|
|
2778
|
-
${
|
|
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--${
|
|
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">${
|
|
2783
|
-
<strong class="absolute-voice-ops-action-center__label">${
|
|
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">${
|
|
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">${
|
|
2788
|
-
${model.error ? `<p class="absolute-voice-ops-action-center__error">${
|
|
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
|
|
3490
|
+
var escapeHtml4 = (value) => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
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>${
|
|
3670
|
-
`<td>${
|
|
3671
|
-
`<td>${
|
|
3672
|
-
`<td><code>${
|
|
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>${
|
|
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>${
|
|
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>${
|
|
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
|
|
4023
|
+
var escapeHtml5 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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="${
|
|
3934
|
-
const result = snapshot.error ? `<p class="absolute-voice-live-ops__error">${
|
|
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>${
|
|
3938
|
-
<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">${
|
|
3941
|
-
<label><span>Operator</span><input data-absolute-voice-live-ops-assignee value="${
|
|
3942
|
-
<label><span>Tag / handoff target</span><input data-absolute-voice-live-ops-tag value="${
|
|
3943
|
-
<label><span>Detail / instruction</span><input data-absolute-voice-live-ops-detail value="${
|
|
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
|
|
4131
|
+
var escapeHtml6 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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>${
|
|
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>${
|
|
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">${
|
|
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
|
|
4061
|
-
var
|
|
4062
|
-
var
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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 ??
|
|
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 ??
|
|
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--${
|
|
4112
|
-
<span>${
|
|
4113
|
-
<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 · ${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">${
|
|
4121
|
-
return `<section class="absolute-voice-delivery-runtime absolute-voice-delivery-runtime--${
|
|
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">${
|
|
4124
|
-
<strong class="absolute-voice-delivery-runtime__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
4267
|
-
var
|
|
4268
|
-
var
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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 ??
|
|
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 ??
|
|
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>${
|
|
4306
|
-
<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--${
|
|
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">${
|
|
4311
|
-
<strong class="absolute-voice-routing-status__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
5215
|
+
var escapeHtml9 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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="${
|
|
5135
|
-
const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${
|
|
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">${
|
|
5139
|
-
<strong class="absolute-voice-provider-simulation__label">${
|
|
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">${
|
|
5142
|
-
${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${
|
|
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">${
|
|
5145
|
-
${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${
|
|
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
|
|
5211
|
-
var
|
|
5212
|
-
var
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
5213
5314
|
var formatProvider = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
|
|
5214
|
-
var
|
|
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 ??
|
|
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 ??
|
|
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--${
|
|
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>${
|
|
5271
|
-
<span>${
|
|
5371
|
+
<strong>${escapeHtml10(provider.label)}</strong>
|
|
5372
|
+
<span>${escapeHtml10(formatStatus2(provider.status))}</span>
|
|
5272
5373
|
</header>
|
|
5273
|
-
<p>${
|
|
5374
|
+
<p>${escapeHtml10(provider.detail)}</p>
|
|
5274
5375
|
<dl>${provider.rows.map((row) => `<div>
|
|
5275
|
-
<dt>${
|
|
5276
|
-
<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--${
|
|
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">${
|
|
5282
|
-
<strong class="absolute-voice-provider-status__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
5328
|
-
var
|
|
5329
|
-
var
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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
|
|
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:
|
|
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 ??
|
|
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 ??
|
|
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--${
|
|
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>${
|
|
5387
|
-
<span>${
|
|
5487
|
+
<strong>${escapeHtml11(capability.label)}</strong>
|
|
5488
|
+
<span>${escapeHtml11(formatStatus3(capability.status))}</span>
|
|
5388
5489
|
</header>
|
|
5389
|
-
<p>${
|
|
5490
|
+
<p>${escapeHtml11(capability.detail)}</p>
|
|
5390
5491
|
<dl>${capability.rows.map((row) => `<div>
|
|
5391
|
-
<dt>${
|
|
5392
|
-
<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--${
|
|
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">${
|
|
5398
|
-
<strong class="absolute-voice-provider-capabilities__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
5444
|
-
var
|
|
5445
|
-
var
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
5446
5547
|
var formatProvider3 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
|
|
5447
|
-
var
|
|
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:
|
|
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}: ${
|
|
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 ??
|
|
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 ??
|
|
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--${
|
|
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>${
|
|
5492
|
-
<span>${
|
|
5592
|
+
<strong>${escapeHtml12(row.label)}</strong>
|
|
5593
|
+
<span>${escapeHtml12(formatStatus4(row.status))}</span>
|
|
5493
5594
|
</header>
|
|
5494
|
-
<p>${
|
|
5495
|
-
${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${
|
|
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>${
|
|
5498
|
-
<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--${
|
|
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">${
|
|
5504
|
-
<strong class="absolute-voice-provider-contracts__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
5550
|
-
var
|
|
5551
|
-
var
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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 ??
|
|
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 ??
|
|
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--${
|
|
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>${
|
|
5604
|
-
<span>${
|
|
5704
|
+
<strong>${escapeHtml13(turn.label)}</strong>
|
|
5705
|
+
<span>${escapeHtml13(turn.status)}</span>
|
|
5605
5706
|
</header>
|
|
5606
|
-
<p>${
|
|
5707
|
+
<p>${escapeHtml13(turn.detail)}</p>
|
|
5607
5708
|
<dl>${turn.rows.map((row) => `<div>
|
|
5608
|
-
<dt>${
|
|
5609
|
-
<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--${
|
|
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">${
|
|
5615
|
-
<strong class="absolute-voice-turn-quality__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
5661
|
-
var
|
|
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
|
|
5764
|
+
var escapeHtml14 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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 ??
|
|
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 ??
|
|
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--${
|
|
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>${
|
|
5694
|
-
<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>${
|
|
5698
|
-
<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--${
|
|
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">${
|
|
5704
|
-
<strong class="absolute-voice-turn-latency__label">${
|
|
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">${
|
|
5707
|
-
${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="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">${
|
|
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
|
|
5760
|
-
var
|
|
5761
|
-
var
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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 ??
|
|
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 ??
|
|
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="${
|
|
5792
|
-
session.operationsRecordHref ? `<a href="${
|
|
5793
|
-
session.incidentBundleHref ? `<a href="${
|
|
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--${
|
|
5896
|
+
return `<article class="absolute-voice-trace-timeline__session absolute-voice-trace-timeline__session--${escapeHtml15(session.status)}">
|
|
5796
5897
|
<header>
|
|
5797
|
-
<strong>${
|
|
5798
|
-
<span>${
|
|
5898
|
+
<strong>${escapeHtml15(session.sessionId)}</strong>
|
|
5899
|
+
<span>${escapeHtml15(session.status)}</span>
|
|
5799
5900
|
</header>
|
|
5800
|
-
<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--${
|
|
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">${
|
|
5807
|
-
<strong class="absolute-voice-trace-timeline__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
5858
|
-
var
|
|
5859
|
-
var
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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 ??
|
|
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 ??
|
|
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>${
|
|
5887
|
-
<strong>${
|
|
5888
|
-
<em>${
|
|
5889
|
-
${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>${
|
|
5894
|
-
<strong>${
|
|
5994
|
+
<span>${escapeHtml16(model.title)}</span>
|
|
5995
|
+
<strong>${escapeHtml16(model.label)}</strong>
|
|
5895
5996
|
</header>
|
|
5896
|
-
<p>${
|
|
5997
|
+
<p>${escapeHtml16(model.description)}</p>
|
|
5897
5998
|
<div>
|
|
5898
|
-
<span>Session</span><strong>${
|
|
5899
|
-
<span>From</span><strong>${
|
|
5900
|
-
<span>Status</span><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">${
|
|
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,
|