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