@absolutejs/voice 0.0.22-beta.332 → 0.0.22-beta.334
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.js +359 -167
- package/dist/index.d.ts +2 -2
- package/dist/index.js +482 -285
- package/dist/proofTrends.d.ts +92 -0
- package/dist/react/index.js +319 -127
- package/dist/vue/index.js +294 -102
- package/package.json +1 -1
package/dist/client/index.js
CHANGED
|
@@ -3823,6 +3823,22 @@ var maxNumber = (values) => {
|
|
|
3823
3823
|
var readProofTrendMaxLiveP95 = (report) => report.summary.maxLiveP95Ms ?? maxNumber(report.cycles.map((cycle) => cycle.liveLatency?.p95Ms));
|
|
3824
3824
|
var readProofTrendMaxProviderP95 = (report) => report.summary.maxProviderP95Ms;
|
|
3825
3825
|
var readProofTrendMaxTurnP95 = (report) => report.summary.maxTurnP95Ms ?? maxNumber(report.cycles.map((cycle) => cycle.turnLatency?.p95Ms));
|
|
3826
|
+
var readRuntimeChannelMetric = (report, key) => {
|
|
3827
|
+
const summaryValue = report.summary.runtimeChannel?.[key];
|
|
3828
|
+
return typeof summaryValue === "number" ? summaryValue : maxNumber(report.cycles.map((cycle) => {
|
|
3829
|
+
const value = cycle.runtimeChannel?.[key];
|
|
3830
|
+
return typeof value === "number" ? value : undefined;
|
|
3831
|
+
}));
|
|
3832
|
+
};
|
|
3833
|
+
var readProofTrendRuntimeChannel = (report) => ({
|
|
3834
|
+
maxBackpressureEvents: readRuntimeChannelMetric(report, "maxBackpressureEvents"),
|
|
3835
|
+
maxFirstAudioLatencyMs: readRuntimeChannelMetric(report, "maxFirstAudioLatencyMs"),
|
|
3836
|
+
maxInterruptionP95Ms: readRuntimeChannelMetric(report, "maxInterruptionP95Ms"),
|
|
3837
|
+
maxJitterMs: readRuntimeChannelMetric(report, "maxJitterMs"),
|
|
3838
|
+
maxTimestampDriftMs: readRuntimeChannelMetric(report, "maxTimestampDriftMs"),
|
|
3839
|
+
samples: report.summary.runtimeChannel?.samples ?? maxNumber(report.cycles.map((cycle) => cycle.runtimeChannel?.samples)),
|
|
3840
|
+
status: report.summary.runtimeChannel?.status
|
|
3841
|
+
});
|
|
3826
3842
|
var evaluateVoiceProofTrendEvidence = (report, input = {}) => {
|
|
3827
3843
|
const issues = [];
|
|
3828
3844
|
const requiredStatus = input.requireStatus ?? "pass";
|
|
@@ -3832,6 +3848,7 @@ var evaluateVoiceProofTrendEvidence = (report, input = {}) => {
|
|
|
3832
3848
|
const failedCycles = report.cycles.filter((cycle) => cycle.ok !== true).length;
|
|
3833
3849
|
const maxLiveP95Ms = readProofTrendMaxLiveP95(report);
|
|
3834
3850
|
const maxProviderP95Ms = readProofTrendMaxProviderP95(report);
|
|
3851
|
+
const runtimeChannel = readProofTrendRuntimeChannel(report);
|
|
3835
3852
|
const maxTurnP95Ms = readProofTrendMaxTurnP95(report);
|
|
3836
3853
|
if (report.status !== requiredStatus) {
|
|
3837
3854
|
issues.push(`Expected proof trends status ${requiredStatus}, found ${report.status}.`);
|
|
@@ -3857,6 +3874,21 @@ var evaluateVoiceProofTrendEvidence = (report, input = {}) => {
|
|
|
3857
3874
|
if (input.maxTurnP95Ms !== undefined && (maxTurnP95Ms === undefined || maxTurnP95Ms > input.maxTurnP95Ms)) {
|
|
3858
3875
|
issues.push(maxTurnP95Ms === undefined ? "Missing proof trends turn latency p95." : `Expected proof trends turn latency p95 at most ${String(input.maxTurnP95Ms)}ms, found ${String(maxTurnP95Ms)}ms.`);
|
|
3859
3876
|
}
|
|
3877
|
+
if (input.maxRuntimeFirstAudioLatencyMs !== undefined && (runtimeChannel.maxFirstAudioLatencyMs === undefined || runtimeChannel.maxFirstAudioLatencyMs > input.maxRuntimeFirstAudioLatencyMs)) {
|
|
3878
|
+
issues.push(runtimeChannel.maxFirstAudioLatencyMs === undefined ? "Missing proof trends runtime-channel first audio latency." : `Expected proof trends runtime-channel first audio latency at most ${String(input.maxRuntimeFirstAudioLatencyMs)}ms, found ${String(runtimeChannel.maxFirstAudioLatencyMs)}ms.`);
|
|
3879
|
+
}
|
|
3880
|
+
if (input.maxRuntimeInterruptionP95Ms !== undefined && (runtimeChannel.maxInterruptionP95Ms === undefined || runtimeChannel.maxInterruptionP95Ms > input.maxRuntimeInterruptionP95Ms)) {
|
|
3881
|
+
issues.push(runtimeChannel.maxInterruptionP95Ms === undefined ? "Missing proof trends runtime-channel interruption p95." : `Expected proof trends runtime-channel interruption p95 at most ${String(input.maxRuntimeInterruptionP95Ms)}ms, found ${String(runtimeChannel.maxInterruptionP95Ms)}ms.`);
|
|
3882
|
+
}
|
|
3883
|
+
if (input.maxRuntimeJitterMs !== undefined && (runtimeChannel.maxJitterMs === undefined || runtimeChannel.maxJitterMs > input.maxRuntimeJitterMs)) {
|
|
3884
|
+
issues.push(runtimeChannel.maxJitterMs === undefined ? "Missing proof trends runtime-channel jitter." : `Expected proof trends runtime-channel jitter at most ${String(input.maxRuntimeJitterMs)}ms, found ${String(runtimeChannel.maxJitterMs)}ms.`);
|
|
3885
|
+
}
|
|
3886
|
+
if (input.maxRuntimeTimestampDriftMs !== undefined && (runtimeChannel.maxTimestampDriftMs === undefined || runtimeChannel.maxTimestampDriftMs > input.maxRuntimeTimestampDriftMs)) {
|
|
3887
|
+
issues.push(runtimeChannel.maxTimestampDriftMs === undefined ? "Missing proof trends runtime-channel timestamp drift." : `Expected proof trends runtime-channel timestamp drift at most ${String(input.maxRuntimeTimestampDriftMs)}ms, found ${String(runtimeChannel.maxTimestampDriftMs)}ms.`);
|
|
3888
|
+
}
|
|
3889
|
+
if (input.maxRuntimeBackpressureEvents !== undefined && (runtimeChannel.maxBackpressureEvents === undefined || runtimeChannel.maxBackpressureEvents > input.maxRuntimeBackpressureEvents)) {
|
|
3890
|
+
issues.push(runtimeChannel.maxBackpressureEvents === undefined ? "Missing proof trends runtime-channel backpressure events." : `Expected proof trends runtime-channel backpressure events at most ${String(input.maxRuntimeBackpressureEvents)}, found ${String(runtimeChannel.maxBackpressureEvents)}.`);
|
|
3891
|
+
}
|
|
3860
3892
|
if (input.minLiveLatencySamples !== undefined) {
|
|
3861
3893
|
const lowSamples = report.cycles.filter((cycle) => (cycle.liveLatency?.samples ?? 0) < input.minLiveLatencySamples).length;
|
|
3862
3894
|
if (lowSamples > 0) {
|
|
@@ -3875,6 +3907,9 @@ var evaluateVoiceProofTrendEvidence = (report, input = {}) => {
|
|
|
3875
3907
|
issues.push(`Expected every proof trend cycle to have at least ${String(input.minTurnLatencySamples)} turn latency sample(s), found ${String(lowSamples)} low-sample cycle(s).`);
|
|
3876
3908
|
}
|
|
3877
3909
|
}
|
|
3910
|
+
if (input.minRuntimeChannelSamples !== undefined && (runtimeChannel.samples === undefined || runtimeChannel.samples < input.minRuntimeChannelSamples)) {
|
|
3911
|
+
issues.push(runtimeChannel.samples === undefined ? "Missing proof trends runtime-channel samples." : `Expected proof trends runtime-channel samples at least ${String(input.minRuntimeChannelSamples)}, found ${String(runtimeChannel.samples)}.`);
|
|
3912
|
+
}
|
|
3878
3913
|
return {
|
|
3879
3914
|
ageMs: report.ageMs,
|
|
3880
3915
|
cycles,
|
|
@@ -3882,6 +3917,7 @@ var evaluateVoiceProofTrendEvidence = (report, input = {}) => {
|
|
|
3882
3917
|
issues,
|
|
3883
3918
|
maxLiveP95Ms,
|
|
3884
3919
|
maxProviderP95Ms,
|
|
3920
|
+
runtimeChannel,
|
|
3885
3921
|
maxTurnP95Ms,
|
|
3886
3922
|
ok: issues.length === 0,
|
|
3887
3923
|
status: report.status
|
|
@@ -3894,6 +3930,162 @@ var assertVoiceProofTrendEvidence = (report, input = {}) => {
|
|
|
3894
3930
|
}
|
|
3895
3931
|
return assertion;
|
|
3896
3932
|
};
|
|
3933
|
+
var DEFAULT_RECOMMENDATION_BUDGETS = {
|
|
3934
|
+
maxLiveP95Ms: 800,
|
|
3935
|
+
maxProviderP95Ms: 1000,
|
|
3936
|
+
maxRuntimeBackpressureEvents: 0,
|
|
3937
|
+
maxRuntimeFirstAudioLatencyMs: 600,
|
|
3938
|
+
maxRuntimeInterruptionP95Ms: 300,
|
|
3939
|
+
maxRuntimeJitterMs: 30,
|
|
3940
|
+
maxRuntimeTimestampDriftMs: 800,
|
|
3941
|
+
maxTurnP95Ms: 700
|
|
3942
|
+
};
|
|
3943
|
+
var withinBudget = (value, budget) => typeof value === "number" && Number.isFinite(value) && value <= budget;
|
|
3944
|
+
var recommendationStatusRank = {
|
|
3945
|
+
pass: 0,
|
|
3946
|
+
warn: 1,
|
|
3947
|
+
fail: 2
|
|
3948
|
+
};
|
|
3949
|
+
var worstRecommendationStatus = (recommendations) => recommendations.reduce((status, recommendation) => recommendationStatusRank[recommendation.status] > recommendationStatusRank[status] ? recommendation.status : status, "pass");
|
|
3950
|
+
var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
|
|
3951
|
+
const budgets = { ...DEFAULT_RECOMMENDATION_BUDGETS, ...options };
|
|
3952
|
+
const maxLiveP95Ms = readProofTrendMaxLiveP95(report);
|
|
3953
|
+
const maxProviderP95Ms = readProofTrendMaxProviderP95(report);
|
|
3954
|
+
const maxTurnP95Ms = readProofTrendMaxTurnP95(report);
|
|
3955
|
+
const runtimeChannel = readProofTrendRuntimeChannel(report);
|
|
3956
|
+
const recommendations = [];
|
|
3957
|
+
const issues = [];
|
|
3958
|
+
if (report.ok !== true) {
|
|
3959
|
+
issues.push(`Proof trend report is ${report.status}; recommendations need a fresh passing trend artifact.`);
|
|
3960
|
+
}
|
|
3961
|
+
recommendations.push({
|
|
3962
|
+
evidence: {
|
|
3963
|
+
budgetMs: budgets.maxProviderP95Ms,
|
|
3964
|
+
providerP95Ms: maxProviderP95Ms
|
|
3965
|
+
},
|
|
3966
|
+
nextMove: withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "Keep the current provider route for latency-sensitive turns and keep collecting sustained proof." : "Route latency-sensitive turns to a faster provider profile or tighten fallback/circuit-breaker budgets before promotion.",
|
|
3967
|
+
recommendation: withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "Keep current provider path" : "Change provider routing for latency-sensitive traffic",
|
|
3968
|
+
status: withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "pass" : maxProviderP95Ms === undefined ? "fail" : "warn",
|
|
3969
|
+
surface: "provider-path"
|
|
3970
|
+
});
|
|
3971
|
+
const runtimePass = withinBudget(runtimeChannel.maxFirstAudioLatencyMs, budgets.maxRuntimeFirstAudioLatencyMs) && withinBudget(runtimeChannel.maxInterruptionP95Ms, budgets.maxRuntimeInterruptionP95Ms) && withinBudget(runtimeChannel.maxJitterMs, budgets.maxRuntimeJitterMs) && withinBudget(runtimeChannel.maxTimestampDriftMs, budgets.maxRuntimeTimestampDriftMs) && withinBudget(runtimeChannel.maxBackpressureEvents, budgets.maxRuntimeBackpressureEvents);
|
|
3972
|
+
recommendations.push({
|
|
3973
|
+
evidence: {
|
|
3974
|
+
backpressureEvents: runtimeChannel.maxBackpressureEvents,
|
|
3975
|
+
firstAudioBudgetMs: budgets.maxRuntimeFirstAudioLatencyMs,
|
|
3976
|
+
firstAudioMs: runtimeChannel.maxFirstAudioLatencyMs,
|
|
3977
|
+
interruptionBudgetMs: budgets.maxRuntimeInterruptionP95Ms,
|
|
3978
|
+
interruptionP95Ms: runtimeChannel.maxInterruptionP95Ms,
|
|
3979
|
+
jitterBudgetMs: budgets.maxRuntimeJitterMs,
|
|
3980
|
+
jitterMs: runtimeChannel.maxJitterMs,
|
|
3981
|
+
samples: runtimeChannel.samples,
|
|
3982
|
+
timestampDriftMs: runtimeChannel.maxTimestampDriftMs
|
|
3983
|
+
},
|
|
3984
|
+
nextMove: runtimePass ? "Keep the current runtime-channel settings and use this artifact as the deploy gate baseline." : "Tune capture/output format, buffering, interruption threshold, or transport backpressure before promoting this runtime path.",
|
|
3985
|
+
recommendation: runtimePass ? "Keep current runtime channel" : "Tune runtime channel before promotion",
|
|
3986
|
+
status: runtimePass ? "pass" : runtimeChannel.samples === undefined ? "fail" : "warn",
|
|
3987
|
+
surface: "runtime-channel"
|
|
3988
|
+
});
|
|
3989
|
+
recommendations.push({
|
|
3990
|
+
evidence: {
|
|
3991
|
+
budgetMs: budgets.maxLiveP95Ms,
|
|
3992
|
+
liveP95Ms: maxLiveP95Ms
|
|
3993
|
+
},
|
|
3994
|
+
nextMove: withinBudget(maxLiveP95Ms, budgets.maxLiveP95Ms) ? "Keep browser live-latency defaults and continue watching long-window drift." : "Tune browser streaming, chunking, or readiness thresholds before release.",
|
|
3995
|
+
recommendation: withinBudget(maxLiveP95Ms, budgets.maxLiveP95Ms) ? "Keep live-latency settings" : "Tune live-latency path",
|
|
3996
|
+
status: withinBudget(maxLiveP95Ms, budgets.maxLiveP95Ms) ? "pass" : maxLiveP95Ms === undefined ? "fail" : "warn",
|
|
3997
|
+
surface: "live-latency"
|
|
3998
|
+
});
|
|
3999
|
+
recommendations.push({
|
|
4000
|
+
evidence: {
|
|
4001
|
+
budgetMs: budgets.maxTurnP95Ms,
|
|
4002
|
+
turnP95Ms: maxTurnP95Ms
|
|
4003
|
+
},
|
|
4004
|
+
nextMove: withinBudget(maxTurnP95Ms, budgets.maxTurnP95Ms) ? "Keep current turn pipeline defaults." : "Reduce tool/provider latency or split the turn pipeline before promotion.",
|
|
4005
|
+
recommendation: withinBudget(maxTurnP95Ms, budgets.maxTurnP95Ms) ? "Keep turn pipeline" : "Tune turn pipeline",
|
|
4006
|
+
status: withinBudget(maxTurnP95Ms, budgets.maxTurnP95Ms) ? "pass" : maxTurnP95Ms === undefined ? "fail" : "warn",
|
|
4007
|
+
surface: "turn-latency"
|
|
4008
|
+
});
|
|
4009
|
+
const status = issues.length > 0 ? "fail" : worstRecommendationStatus(recommendations);
|
|
4010
|
+
return {
|
|
4011
|
+
generatedAt: new Date().toISOString(),
|
|
4012
|
+
issues,
|
|
4013
|
+
ok: status !== "fail",
|
|
4014
|
+
recommendations,
|
|
4015
|
+
source: report.source || report.outputDir || report.runId || "proof-trends",
|
|
4016
|
+
status,
|
|
4017
|
+
summary: {
|
|
4018
|
+
keepCurrentProviderPath: recommendations.find((item) => item.surface === "provider-path")?.status === "pass",
|
|
4019
|
+
keepCurrentRuntimeChannel: recommendations.find((item) => item.surface === "runtime-channel")?.status === "pass",
|
|
4020
|
+
recommendedActions: recommendations.filter((item) => item.status !== "pass").length
|
|
4021
|
+
}
|
|
4022
|
+
};
|
|
4023
|
+
};
|
|
4024
|
+
var escapeHtml3 = (value) => String(value).replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
4025
|
+
var escapeMarkdown = (value) => value.replaceAll("|", "\\|");
|
|
4026
|
+
var renderVoiceProofTrendRecommendationMarkdown = (report, title = "Voice Provider Runtime Recommendations") => [
|
|
4027
|
+
`# ${title}`,
|
|
4028
|
+
"",
|
|
4029
|
+
`- Status: ${report.status}`,
|
|
4030
|
+
`- Source: ${report.source}`,
|
|
4031
|
+
`- Recommended actions: ${String(report.summary.recommendedActions)}`,
|
|
4032
|
+
"",
|
|
4033
|
+
"| Surface | Status | Recommendation | Next move |",
|
|
4034
|
+
"| --- | --- | --- | --- |",
|
|
4035
|
+
...report.recommendations.map((recommendation) => `| ${escapeMarkdown(recommendation.surface)} | ${recommendation.status} | ${escapeMarkdown(recommendation.recommendation)} | ${escapeMarkdown(recommendation.nextMove)} |`),
|
|
4036
|
+
"",
|
|
4037
|
+
"## Issues",
|
|
4038
|
+
"",
|
|
4039
|
+
...report.issues.length ? report.issues.map((issue) => `- ${issue}`) : ["- None"]
|
|
4040
|
+
].join(`
|
|
4041
|
+
`);
|
|
4042
|
+
var renderVoiceProofTrendRecommendationHTML = (report, title = "Voice Provider Runtime Recommendations") => {
|
|
4043
|
+
const cards = report.recommendations.map((recommendation) => `<article class="${escapeHtml3(recommendation.status)}"><p class="eyebrow">${escapeHtml3(recommendation.surface)} \xB7 ${escapeHtml3(recommendation.status)}</p><h2>${escapeHtml3(recommendation.recommendation)}</h2><p>${escapeHtml3(recommendation.nextMove)}</p><pre>${escapeHtml3(JSON.stringify(recommendation.evidence, null, 2))}</pre></article>`).join("");
|
|
4044
|
+
const issues = report.issues.length === 0 ? "<li>None</li>" : report.issues.map((issue) => `<li>${escapeHtml3(issue)}</li>`).join("");
|
|
4045
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml3(title)}</title><style>body{background:#101418;color:#f7f3e8;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero,article{background:#17201d;border:1px solid #2e3d36;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(20,184,166,.18),rgba(245,158,11,.12))}.eyebrow{color:#5eead4;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.2rem,6vw,4.7rem);letter-spacing:-.06em;line-height:.92;margin:.2rem 0 1rem}.summary{display:flex;flex-wrap:wrap;gap:10px}.pill{border:1px solid #42534a;border-radius:999px;padding:8px 12px}.pass{border-color:rgba(34,197,94,.55)}.warn{border-color:rgba(245,158,11,.7)}.fail{border-color:rgba(239,68,68,.75)}pre{background:#0b1110;border-radius:14px;overflow:auto;padding:12px}a{color:#5eead4}</style></head><body><main><section class="hero"><p class="eyebrow">Sustained proof recommendations</p><h1>${escapeHtml3(title)}</h1><p>Generated ${escapeHtml3(report.generatedAt)} from ${escapeHtml3(report.source)}.</p><div class="summary"><span class="pill">Status ${escapeHtml3(report.status)}</span><span class="pill">Provider ${report.summary.keepCurrentProviderPath ? "keep" : "change"}</span><span class="pill">Runtime ${report.summary.keepCurrentRuntimeChannel ? "keep" : "tune"}</span><span class="pill">${String(report.summary.recommendedActions)} action(s)</span></div></section>${cards}<section class="hero"><h2>Issues</h2><ul>${issues}</ul></section></main></body></html>`;
|
|
4046
|
+
};
|
|
4047
|
+
var createVoiceProofTrendRecommendationRoutes = (options) => {
|
|
4048
|
+
const path = options.path ?? "/api/voice/proof-trend-recommendations";
|
|
4049
|
+
const htmlPath = options.htmlPath === undefined ? "/voice/proof-trend-recommendations" : options.htmlPath;
|
|
4050
|
+
const markdownPath = options.markdownPath === undefined ? "/voice/proof-trend-recommendations.md" : options.markdownPath;
|
|
4051
|
+
const title = options.title ?? "Voice Provider Runtime Recommendations";
|
|
4052
|
+
const routes = new Elysia({
|
|
4053
|
+
name: options.name ?? "absolutejs-voice-proof-trend-recommendations"
|
|
4054
|
+
});
|
|
4055
|
+
const loadReport = async () => {
|
|
4056
|
+
const value = options.source !== undefined ? typeof options.source === "function" ? await options.source() : options.source : options.jsonPath ? await readVoiceProofTrendReportFile(options.jsonPath, {
|
|
4057
|
+
maxAgeMs: options.maxAgeMs
|
|
4058
|
+
}) : buildEmptyVoiceProofTrendReport("", options.maxAgeMs);
|
|
4059
|
+
return buildVoiceProofTrendRecommendationReport(normalizeVoiceProofTrendReport(value, {
|
|
4060
|
+
maxAgeMs: options.maxAgeMs,
|
|
4061
|
+
source: options.jsonPath
|
|
4062
|
+
}), options);
|
|
4063
|
+
};
|
|
4064
|
+
routes.get(path, async () => Response.json(await loadReport(), { headers: options.headers }));
|
|
4065
|
+
if (htmlPath !== false) {
|
|
4066
|
+
routes.get(htmlPath, async () => {
|
|
4067
|
+
const report = await loadReport();
|
|
4068
|
+
return new Response(renderVoiceProofTrendRecommendationHTML(report, title), {
|
|
4069
|
+
headers: {
|
|
4070
|
+
"content-type": "text/html; charset=utf-8",
|
|
4071
|
+
...Object.fromEntries(new Headers(options.headers))
|
|
4072
|
+
}
|
|
4073
|
+
});
|
|
4074
|
+
});
|
|
4075
|
+
}
|
|
4076
|
+
if (markdownPath !== false) {
|
|
4077
|
+
routes.get(markdownPath, async () => {
|
|
4078
|
+
const report = await loadReport();
|
|
4079
|
+
return new Response(renderVoiceProofTrendRecommendationMarkdown(report, title), {
|
|
4080
|
+
headers: {
|
|
4081
|
+
"content-type": "text/markdown; charset=utf-8",
|
|
4082
|
+
...Object.fromEntries(new Headers(options.headers))
|
|
4083
|
+
}
|
|
4084
|
+
});
|
|
4085
|
+
});
|
|
4086
|
+
}
|
|
4087
|
+
return routes;
|
|
4088
|
+
};
|
|
3897
4089
|
var createVoiceProofTrendRoutes = (options) => {
|
|
3898
4090
|
const path = options.path ?? "/api/voice/proof-trends";
|
|
3899
4091
|
const routes = new Elysia({
|
|
@@ -3936,7 +4128,7 @@ var DEFAULT_LINKS2 = [
|
|
|
3936
4128
|
{ href: "/voice/proof-trends", label: "Trend page" },
|
|
3937
4129
|
{ href: "/api/voice/proof-trends", label: "Trend JSON" }
|
|
3938
4130
|
];
|
|
3939
|
-
var
|
|
4131
|
+
var escapeHtml4 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
3940
4132
|
var formatMs = (value) => typeof value === "number" && Number.isFinite(value) ? `${Math.round(value)}ms` : "n/a";
|
|
3941
4133
|
var statusLabel = (report) => {
|
|
3942
4134
|
if (!report) {
|
|
@@ -3986,19 +4178,19 @@ var createVoiceProofTrendsViewModel = (snapshot, options = {}) => {
|
|
|
3986
4178
|
var renderVoiceProofTrendsHTML = (snapshot, options = {}) => {
|
|
3987
4179
|
const model = createVoiceProofTrendsViewModel(snapshot, options);
|
|
3988
4180
|
const metrics = model.metrics.length ? `<div class="absolute-voice-proof-trends__metrics">${model.metrics.map((metric) => `<article>
|
|
3989
|
-
<span>${
|
|
3990
|
-
<strong>${
|
|
3991
|
-
</article>`).join("")}</div>` : `<p class="absolute-voice-proof-trends__empty">${model.error ?
|
|
3992
|
-
const links = model.links.length ? `<p class="absolute-voice-proof-trends__links">${model.links.map((link) => `<a href="${
|
|
3993
|
-
return `<section class="absolute-voice-proof-trends absolute-voice-proof-trends--${
|
|
4181
|
+
<span>${escapeHtml4(metric.label)}</span>
|
|
4182
|
+
<strong>${escapeHtml4(metric.value)}</strong>
|
|
4183
|
+
</article>`).join("")}</div>` : `<p class="absolute-voice-proof-trends__empty">${model.error ? escapeHtml4(model.error) : "Run the sustained proof trends script to populate evidence."}</p>`;
|
|
4184
|
+
const links = model.links.length ? `<p class="absolute-voice-proof-trends__links">${model.links.map((link) => `<a href="${escapeHtml4(link.href)}">${escapeHtml4(link.label)}</a>`).join("")}</p>` : "";
|
|
4185
|
+
return `<section class="absolute-voice-proof-trends absolute-voice-proof-trends--${escapeHtml4(model.status)}">
|
|
3994
4186
|
<header class="absolute-voice-proof-trends__header">
|
|
3995
|
-
<span class="absolute-voice-proof-trends__eyebrow">${
|
|
3996
|
-
<strong class="absolute-voice-proof-trends__label">${
|
|
4187
|
+
<span class="absolute-voice-proof-trends__eyebrow">${escapeHtml4(model.title)}</span>
|
|
4188
|
+
<strong class="absolute-voice-proof-trends__label">${escapeHtml4(model.label)}</strong>
|
|
3997
4189
|
</header>
|
|
3998
|
-
<p class="absolute-voice-proof-trends__description">${
|
|
4190
|
+
<p class="absolute-voice-proof-trends__description">${escapeHtml4(model.description)}</p>
|
|
3999
4191
|
${metrics}
|
|
4000
4192
|
${links}
|
|
4001
|
-
${model.error ? `<p class="absolute-voice-proof-trends__error">${
|
|
4193
|
+
${model.error ? `<p class="absolute-voice-proof-trends__error">${escapeHtml4(model.error)}</p>` : ""}
|
|
4002
4194
|
</section>`;
|
|
4003
4195
|
};
|
|
4004
4196
|
var getVoiceProofTrendsCSS = () => `.absolute-voice-proof-trends{border:1px solid #99f6e4;border-radius:20px;background:#f0fdfa;color:#0f172a;padding:18px;box-shadow:0 18px 40px rgba(13,148,136,.12);font-family:inherit}.absolute-voice-proof-trends--warning,.absolute-voice-proof-trends--error{border-color:#f2a7a7;background:#fff7f4}.absolute-voice-proof-trends__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-proof-trends__eyebrow{color:#0f766e;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-proof-trends__label{font-size:24px;line-height:1}.absolute-voice-proof-trends__description,.absolute-voice-proof-trends__empty{color:#475569}.absolute-voice-proof-trends__metrics{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));margin-top:14px}.absolute-voice-proof-trends__metrics article{background:#fff;border:1px solid #ccfbf1;border-radius:16px;padding:12px}.absolute-voice-proof-trends__metrics span{color:#64748b;display:block;font-size:12px;font-weight:800;text-transform:uppercase}.absolute-voice-proof-trends__metrics strong{display:block;font-size:20px;margin-top:4px}.absolute-voice-proof-trends__links{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 0}.absolute-voice-proof-trends__links a{border:1px solid #99f6e4;border-radius:999px;color:#0f766e;font-weight:800;padding:6px 10px;text-decoration:none}.absolute-voice-proof-trends__error{color:#9f1239;font-weight:700}`;
|
|
@@ -4044,7 +4236,7 @@ var DEFAULT_LINKS3 = [
|
|
|
4044
4236
|
{ href: "/production-readiness", label: "Readiness page" },
|
|
4045
4237
|
{ href: "/voice/slo-readiness-thresholds", label: "Gate thresholds" }
|
|
4046
4238
|
];
|
|
4047
|
-
var
|
|
4239
|
+
var escapeHtml5 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
4048
4240
|
var formatExplanationValue = (value, unit) => {
|
|
4049
4241
|
if (value === undefined || value === null) {
|
|
4050
4242
|
return "n/a";
|
|
@@ -4085,23 +4277,23 @@ var createVoiceReadinessFailuresViewModel = (snapshot, options = {}) => {
|
|
|
4085
4277
|
};
|
|
4086
4278
|
var renderVoiceReadinessFailuresHTML = (snapshot, options = {}) => {
|
|
4087
4279
|
const model = createVoiceReadinessFailuresViewModel(snapshot, options);
|
|
4088
|
-
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--${
|
|
4089
|
-
<span>${
|
|
4090
|
-
<strong>${
|
|
4091
|
-
<p>Observed ${
|
|
4092
|
-
<p>${
|
|
4093
|
-
<p class="absolute-voice-readiness-failures__links">${failure.evidenceHref ? `<a href="${
|
|
4094
|
-
</article>`).join("")}</div>` : `<p class="absolute-voice-readiness-failures__empty">${model.error ?
|
|
4095
|
-
const links = model.links.length ? `<p class="absolute-voice-readiness-failures__links">${model.links.map((link) => `<a href="${
|
|
4096
|
-
return `<section class="absolute-voice-readiness-failures absolute-voice-readiness-failures--${
|
|
4280
|
+
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--${escapeHtml5(failure.status)}">
|
|
4281
|
+
<span>${escapeHtml5(failure.status.toUpperCase())}</span>
|
|
4282
|
+
<strong>${escapeHtml5(failure.label)}</strong>
|
|
4283
|
+
<p>Observed ${escapeHtml5(failure.observed)} against ${escapeHtml5(failure.thresholdLabel)} ${escapeHtml5(failure.threshold)}.</p>
|
|
4284
|
+
<p>${escapeHtml5(failure.remediation)}</p>
|
|
4285
|
+
<p class="absolute-voice-readiness-failures__links">${failure.evidenceHref ? `<a href="${escapeHtml5(failure.evidenceHref)}">Evidence</a>` : ""}${failure.sourceHref ? `<a href="${escapeHtml5(failure.sourceHref)}">Threshold source</a>` : ""}</p>
|
|
4286
|
+
</article>`).join("")}</div>` : `<p class="absolute-voice-readiness-failures__empty">${model.error ? escapeHtml5(model.error) : "No calibrated readiness gate explanations are open."}</p>`;
|
|
4287
|
+
const links = model.links.length ? `<p class="absolute-voice-readiness-failures__links">${model.links.map((link) => `<a href="${escapeHtml5(link.href)}">${escapeHtml5(link.label)}</a>`).join("")}</p>` : "";
|
|
4288
|
+
return `<section class="absolute-voice-readiness-failures absolute-voice-readiness-failures--${escapeHtml5(model.status)}">
|
|
4097
4289
|
<header class="absolute-voice-readiness-failures__header">
|
|
4098
|
-
<span class="absolute-voice-readiness-failures__eyebrow">${
|
|
4099
|
-
<strong class="absolute-voice-readiness-failures__label">${
|
|
4290
|
+
<span class="absolute-voice-readiness-failures__eyebrow">${escapeHtml5(model.title)}</span>
|
|
4291
|
+
<strong class="absolute-voice-readiness-failures__label">${escapeHtml5(model.label)}</strong>
|
|
4100
4292
|
</header>
|
|
4101
|
-
<p class="absolute-voice-readiness-failures__description">${
|
|
4293
|
+
<p class="absolute-voice-readiness-failures__description">${escapeHtml5(model.description)}</p>
|
|
4102
4294
|
${failures}
|
|
4103
4295
|
${links}
|
|
4104
|
-
${model.error ? `<p class="absolute-voice-readiness-failures__error">${
|
|
4296
|
+
${model.error ? `<p class="absolute-voice-readiness-failures__error">${escapeHtml5(model.error)}</p>` : ""}
|
|
4105
4297
|
</section>`;
|
|
4106
4298
|
};
|
|
4107
4299
|
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}`;
|
|
@@ -4143,7 +4335,7 @@ var defineVoiceReadinessFailuresElement = (tagName = "absolute-voice-readiness-f
|
|
|
4143
4335
|
// src/client/opsActionCenterWidget.ts
|
|
4144
4336
|
var DEFAULT_TITLE5 = "Voice Ops Action Center";
|
|
4145
4337
|
var DEFAULT_DESCRIPTION5 = "Run production voice proofs and operator actions from one primitive panel.";
|
|
4146
|
-
var
|
|
4338
|
+
var escapeHtml6 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
4147
4339
|
var createVoiceOpsActionCenterViewModel = (snapshot, options = {}) => {
|
|
4148
4340
|
const status = snapshot.error ? "error" : snapshot.isRunning ? "running" : snapshot.lastResult ? "completed" : "ready";
|
|
4149
4341
|
return {
|
|
@@ -4165,18 +4357,18 @@ var createVoiceOpsActionCenterViewModel = (snapshot, options = {}) => {
|
|
|
4165
4357
|
};
|
|
4166
4358
|
var renderVoiceOpsActionCenterHTML = (snapshot, options = {}) => {
|
|
4167
4359
|
const model = createVoiceOpsActionCenterViewModel(snapshot, options);
|
|
4168
|
-
const actions = model.actions.map((action) => `<button type="button" data-absolute-voice-ops-action="${
|
|
4169
|
-
${
|
|
4360
|
+
const actions = model.actions.map((action) => `<button type="button" data-absolute-voice-ops-action="${escapeHtml6(action.id)}"${action.disabled ? " disabled" : ""}>
|
|
4361
|
+
${escapeHtml6(action.isRunning ? "Working..." : action.label)}
|
|
4170
4362
|
</button>`).join("");
|
|
4171
|
-
return `<section class="absolute-voice-ops-action-center absolute-voice-ops-action-center--${
|
|
4363
|
+
return `<section class="absolute-voice-ops-action-center absolute-voice-ops-action-center--${escapeHtml6(model.status)}">
|
|
4172
4364
|
<header class="absolute-voice-ops-action-center__header">
|
|
4173
|
-
<span class="absolute-voice-ops-action-center__eyebrow">${
|
|
4174
|
-
<strong class="absolute-voice-ops-action-center__label">${
|
|
4365
|
+
<span class="absolute-voice-ops-action-center__eyebrow">${escapeHtml6(model.title)}</span>
|
|
4366
|
+
<strong class="absolute-voice-ops-action-center__label">${escapeHtml6(model.label)}</strong>
|
|
4175
4367
|
</header>
|
|
4176
|
-
<p class="absolute-voice-ops-action-center__description">${
|
|
4368
|
+
<p class="absolute-voice-ops-action-center__description">${escapeHtml6(model.description)}</p>
|
|
4177
4369
|
<div class="absolute-voice-ops-action-center__actions">${actions}</div>
|
|
4178
|
-
<p class="absolute-voice-ops-action-center__result">${
|
|
4179
|
-
${model.error ? `<p class="absolute-voice-ops-action-center__error">${
|
|
4370
|
+
<p class="absolute-voice-ops-action-center__result">${escapeHtml6(model.lastResultLabel)}</p>
|
|
4371
|
+
${model.error ? `<p class="absolute-voice-ops-action-center__error">${escapeHtml6(model.error)}</p>` : ""}
|
|
4180
4372
|
</section>`;
|
|
4181
4373
|
};
|
|
4182
4374
|
var getVoiceOpsActionCenterCSS = () => `.absolute-voice-ops-action-center{border:1px solid #d5cbb8;border-radius:20px;background:#fffaf1;color:#17130b;padding:18px;box-shadow:0 18px 40px rgba(58,42,16,.12);font-family:inherit}.absolute-voice-ops-action-center--error{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-ops-action-center__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-ops-action-center__eyebrow{color:#725d37;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-ops-action-center__label{font-size:28px;line-height:1}.absolute-voice-ops-action-center__description,.absolute-voice-ops-action-center__result{color:#5b4b2f;margin:12px 0 0}.absolute-voice-ops-action-center__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}.absolute-voice-ops-action-center__actions button{background:#7c4a03;border:0;border-radius:999px;color:#fff8e8;cursor:pointer;font:inherit;font-weight:800;padding:8px 12px}.absolute-voice-ops-action-center__actions button:disabled{cursor:not-allowed;opacity:.5}.absolute-voice-ops-action-center__error{color:#9f1239;font-weight:700}`;
|
|
@@ -4777,7 +4969,7 @@ var exportVoiceTrace = async (input) => {
|
|
|
4777
4969
|
};
|
|
4778
4970
|
};
|
|
4779
4971
|
var toNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
4780
|
-
var
|
|
4972
|
+
var escapeHtml7 = (value) => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
4781
4973
|
var formatTraceValue = (value) => {
|
|
4782
4974
|
if (value === undefined || value === null) {
|
|
4783
4975
|
return "";
|
|
@@ -5057,10 +5249,10 @@ var renderVoiceTraceHTML = (events, options = {}) => {
|
|
|
5057
5249
|
const offset = summary.startedAt === undefined ? event.at : Math.max(0, event.at - summary.startedAt);
|
|
5058
5250
|
return [
|
|
5059
5251
|
"<tr>",
|
|
5060
|
-
`<td>${
|
|
5061
|
-
`<td>${
|
|
5062
|
-
`<td>${
|
|
5063
|
-
`<td><code>${
|
|
5252
|
+
`<td>${escapeHtml7(String(offset))}</td>`,
|
|
5253
|
+
`<td>${escapeHtml7(event.type)}</td>`,
|
|
5254
|
+
`<td>${escapeHtml7(event.turnId ?? "")}</td>`,
|
|
5255
|
+
`<td><code>${escapeHtml7(JSON.stringify(event.payload))}</code></td>`,
|
|
5064
5256
|
"</tr>"
|
|
5065
5257
|
].join("");
|
|
5066
5258
|
}).join(`
|
|
@@ -5071,7 +5263,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
|
|
|
5071
5263
|
"<head>",
|
|
5072
5264
|
'<meta charset="utf-8" />',
|
|
5073
5265
|
'<meta name="viewport" content="width=device-width, initial-scale=1" />',
|
|
5074
|
-
`<title>${
|
|
5266
|
+
`<title>${escapeHtml7(options.title ?? "Voice Trace")}</title>`,
|
|
5075
5267
|
"<style>",
|
|
5076
5268
|
"body{font-family:ui-sans-serif,system-ui,sans-serif;margin:2rem;line-height:1.45;background:#f8f7f2;color:#181713}",
|
|
5077
5269
|
"main{max-width:1100px;margin:auto}",
|
|
@@ -5085,7 +5277,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
|
|
|
5085
5277
|
"</style>",
|
|
5086
5278
|
"</head>",
|
|
5087
5279
|
"<body><main>",
|
|
5088
|
-
`<h1>${
|
|
5280
|
+
`<h1>${escapeHtml7(options.title ?? `Voice Trace ${summary.sessionId ?? ""}`.trim())}</h1>`,
|
|
5089
5281
|
`<p class="${evaluation.pass ? "pass" : "fail"}">QA: ${evaluation.pass ? "pass" : "fail"}</p>`,
|
|
5090
5282
|
'<section class="summary">',
|
|
5091
5283
|
`<div class="card"><strong>Events</strong><br>${summary.eventCount}</div>`,
|
|
@@ -5099,7 +5291,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
|
|
|
5099
5291
|
eventRows,
|
|
5100
5292
|
"</tbody></table>",
|
|
5101
5293
|
"<h2>Markdown Export</h2>",
|
|
5102
|
-
`<pre>${
|
|
5294
|
+
`<pre>${escapeHtml7(markdown)}</pre>`,
|
|
5103
5295
|
"</main></body></html>"
|
|
5104
5296
|
].join(`
|
|
5105
5297
|
`);
|
|
@@ -5455,7 +5647,7 @@ var ACTION_LABELS = {
|
|
|
5455
5647
|
"resume-assistant": "Resume assistant",
|
|
5456
5648
|
tag: "Tag"
|
|
5457
5649
|
};
|
|
5458
|
-
var
|
|
5650
|
+
var escapeHtml8 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
5459
5651
|
var createVoiceLiveOpsInput = (action, input) => ({
|
|
5460
5652
|
action,
|
|
5461
5653
|
assignee: input.assignee,
|
|
@@ -5466,17 +5658,17 @@ var createVoiceLiveOpsInput = (action, input) => ({
|
|
|
5466
5658
|
var renderVoiceLiveOpsHTML = (snapshot, options = {}) => {
|
|
5467
5659
|
const sessionId = options.getSessionId?.() ?? "";
|
|
5468
5660
|
const disabled = snapshot.isRunning || !sessionId;
|
|
5469
|
-
const actions = VOICE_LIVE_OPS_ACTIONS.map((action) => `<button type="button" data-absolute-voice-live-ops-action="${
|
|
5470
|
-
const result = snapshot.error ? `<p class="absolute-voice-live-ops__error">${
|
|
5661
|
+
const actions = VOICE_LIVE_OPS_ACTIONS.map((action) => `<button type="button" data-absolute-voice-live-ops-action="${escapeHtml8(action)}"${disabled ? " disabled" : ""}>${escapeHtml8(snapshot.runningAction === action ? "Running..." : ACTION_LABELS[action])}</button>`).join("");
|
|
5662
|
+
const result = snapshot.error ? `<p class="absolute-voice-live-ops__error">${escapeHtml8(snapshot.error)}</p>` : snapshot.lastResult ? `<p class="absolute-voice-live-ops__result">Recorded ${escapeHtml8(snapshot.lastResult.action)}. Control: ${escapeHtml8(snapshot.lastResult.control.status)}.</p>` : '<p class="absolute-voice-live-ops__result">No live ops action has run yet.</p>';
|
|
5471
5663
|
return `<section class="absolute-voice-live-ops">
|
|
5472
5664
|
<header class="absolute-voice-live-ops__header">
|
|
5473
|
-
<span>${
|
|
5474
|
-
<strong>${
|
|
5665
|
+
<span>${escapeHtml8(options.title ?? "Live Ops")}</span>
|
|
5666
|
+
<strong>${escapeHtml8(sessionId || "No active session")}</strong>
|
|
5475
5667
|
</header>
|
|
5476
|
-
<p class="absolute-voice-live-ops__description">${
|
|
5477
|
-
<label><span>Operator</span><input data-absolute-voice-live-ops-assignee value="${
|
|
5478
|
-
<label><span>Tag / handoff target</span><input data-absolute-voice-live-ops-tag value="${
|
|
5479
|
-
<label><span>Detail / instruction</span><input data-absolute-voice-live-ops-detail value="${
|
|
5668
|
+
<p class="absolute-voice-live-ops__description">${escapeHtml8(options.description ?? "Pause, resume, take over, force handoff, or inject operator instructions during a live voice session.")}</p>
|
|
5669
|
+
<label><span>Operator</span><input data-absolute-voice-live-ops-assignee value="${escapeHtml8(options.defaultAssignee ?? "operator")}" /></label>
|
|
5670
|
+
<label><span>Tag / handoff target</span><input data-absolute-voice-live-ops-tag value="${escapeHtml8(options.defaultTag ?? "live-ops")}" /></label>
|
|
5671
|
+
<label><span>Detail / instruction</span><input data-absolute-voice-live-ops-detail value="${escapeHtml8(options.defaultDetail ?? "Operator marked this live session.")}" /></label>
|
|
5480
5672
|
<div class="absolute-voice-live-ops__actions">${actions}</div>
|
|
5481
5673
|
${result}
|
|
5482
5674
|
</section>`;
|
|
@@ -5563,16 +5755,16 @@ var defineVoiceLiveOpsElement = (tagName = "absolute-voice-live-ops", options =
|
|
|
5563
5755
|
});
|
|
5564
5756
|
};
|
|
5565
5757
|
// src/client/opsActionHistoryWidget.ts
|
|
5566
|
-
var
|
|
5758
|
+
var escapeHtml9 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
5567
5759
|
var renderVoiceOpsActionHistoryWidgetHTML = (snapshot, options = {}) => {
|
|
5568
5760
|
const report = snapshot.report;
|
|
5569
5761
|
const entries = (report?.entries ?? []).slice(0, options.limit ?? 5);
|
|
5570
|
-
const rows = entries.map((entry) => `<li class="absolute-voice-ops-action-history__entry absolute-voice-ops-action-history__entry--${entry.ok ? "success" : "error"}"><span>${
|
|
5762
|
+
const rows = entries.map((entry) => `<li class="absolute-voice-ops-action-history__entry absolute-voice-ops-action-history__entry--${entry.ok ? "success" : "error"}"><span>${escapeHtml9(entry.actionId)}</span><strong>${escapeHtml9(entry.ok ? "Success" : "Failed")}</strong><small>${escapeHtml9(new Date(entry.at).toLocaleString())}${entry.status ? ` \xB7 HTTP ${String(entry.status)}` : ""}</small></li>`).join("");
|
|
5571
5763
|
return `<section class="absolute-voice-ops-action-history">
|
|
5572
|
-
<header><span>Operator proof</span><strong>${
|
|
5764
|
+
<header><span>Operator proof</span><strong>${escapeHtml9(options.title ?? "Action History")}</strong></header>
|
|
5573
5765
|
<p>${String(report?.total ?? 0)} action(s), ${String(report?.failed ?? 0)} failed.</p>
|
|
5574
5766
|
<ul>${rows || "<li>No operator actions recorded yet.</li>"}</ul>
|
|
5575
|
-
${snapshot.error ? `<p class="absolute-voice-ops-action-history__error">${
|
|
5767
|
+
${snapshot.error ? `<p class="absolute-voice-ops-action-history__error">${escapeHtml9(snapshot.error)}</p>` : ""}
|
|
5576
5768
|
</section>`;
|
|
5577
5769
|
};
|
|
5578
5770
|
var getVoiceOpsActionHistoryCSS = () => `.absolute-voice-ops-action-history{border:1px solid #d8d2c4;border-radius:20px;background:#fffaf0;color:#16130d;padding:18px;font-family:inherit}.absolute-voice-ops-action-history header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-ops-action-history header span{color:#73664f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-ops-action-history header strong{font-size:24px}.absolute-voice-ops-action-history p{color:#514733}.absolute-voice-ops-action-history ul{display:grid;gap:8px;list-style:none;margin:12px 0 0;padding:0}.absolute-voice-ops-action-history__entry{background:#fff;border:1px solid #eee4d2;border-radius:14px;display:grid;gap:3px;padding:10px 12px}.absolute-voice-ops-action-history__entry--error{border-color:#f2a7a7}.absolute-voice-ops-action-history__entry span{font-weight:800}.absolute-voice-ops-action-history__entry small{color:#655944}.absolute-voice-ops-action-history__error{color:#9f1239;font-weight:700}`;
|
|
@@ -5595,7 +5787,7 @@ var mountVoiceOpsActionHistory = (element, path = "/api/voice/ops-actions/histor
|
|
|
5595
5787
|
// src/client/deliveryRuntimeWidget.ts
|
|
5596
5788
|
var DEFAULT_TITLE6 = "Voice Delivery Runtime";
|
|
5597
5789
|
var DEFAULT_DESCRIPTION6 = "Audit and trace delivery worker health from your AbsoluteJS voice app.";
|
|
5598
|
-
var
|
|
5790
|
+
var escapeHtml10 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
5599
5791
|
var createSurface = (id, summary) => {
|
|
5600
5792
|
if (!summary) {
|
|
5601
5793
|
return {
|
|
@@ -5644,26 +5836,26 @@ var createVoiceDeliveryRuntimeViewModel = (snapshot, options = {}) => {
|
|
|
5644
5836
|
};
|
|
5645
5837
|
var renderVoiceDeliveryRuntimeHTML = (snapshot, options = {}) => {
|
|
5646
5838
|
const model = createVoiceDeliveryRuntimeViewModel(snapshot, options);
|
|
5647
|
-
const surfaces = model.surfaces.map((surface) => `<li class="absolute-voice-delivery-runtime__surface absolute-voice-delivery-runtime__surface--${
|
|
5648
|
-
<span>${
|
|
5649
|
-
<strong>${
|
|
5839
|
+
const surfaces = model.surfaces.map((surface) => `<li class="absolute-voice-delivery-runtime__surface absolute-voice-delivery-runtime__surface--${escapeHtml10(surface.status)}">
|
|
5840
|
+
<span>${escapeHtml10(surface.label)}</span>
|
|
5841
|
+
<strong>${escapeHtml10(surface.detail)}</strong>
|
|
5650
5842
|
<small>${String(surface.failed)} failed · ${String(surface.deadLettered)} dead-lettered</small>
|
|
5651
5843
|
</li>`).join("");
|
|
5652
5844
|
const actions = options.includeActions === false ? "" : `<div class="absolute-voice-delivery-runtime__actions">
|
|
5653
5845
|
<button type="button" data-absolute-voice-delivery-runtime-action="tick">${model.actionStatus === "running" ? "Working..." : "Tick workers"}</button>
|
|
5654
5846
|
<button type="button" data-absolute-voice-delivery-runtime-action="requeue-dead-letters"${model.surfaces.some((surface) => surface.deadLettered > 0) ? "" : " disabled"}>Requeue dead letters</button>
|
|
5655
5847
|
</div>`;
|
|
5656
|
-
const actionError = model.actionError ? `<p class="absolute-voice-delivery-runtime__error">${
|
|
5657
|
-
return `<section class="absolute-voice-delivery-runtime absolute-voice-delivery-runtime--${
|
|
5848
|
+
const actionError = model.actionError ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml10(model.actionError)}</p>` : "";
|
|
5849
|
+
return `<section class="absolute-voice-delivery-runtime absolute-voice-delivery-runtime--${escapeHtml10(model.status)}">
|
|
5658
5850
|
<header class="absolute-voice-delivery-runtime__header">
|
|
5659
|
-
<span class="absolute-voice-delivery-runtime__eyebrow">${
|
|
5660
|
-
<strong class="absolute-voice-delivery-runtime__label">${
|
|
5851
|
+
<span class="absolute-voice-delivery-runtime__eyebrow">${escapeHtml10(model.title)}</span>
|
|
5852
|
+
<strong class="absolute-voice-delivery-runtime__label">${escapeHtml10(model.label)}</strong>
|
|
5661
5853
|
</header>
|
|
5662
|
-
<p class="absolute-voice-delivery-runtime__description">${
|
|
5854
|
+
<p class="absolute-voice-delivery-runtime__description">${escapeHtml10(model.description)}</p>
|
|
5663
5855
|
<ul class="absolute-voice-delivery-runtime__surfaces">${surfaces}</ul>
|
|
5664
5856
|
${actions}
|
|
5665
5857
|
${actionError}
|
|
5666
|
-
${model.error ? `<p class="absolute-voice-delivery-runtime__error">${
|
|
5858
|
+
${model.error ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml10(model.error)}</p>` : ""}
|
|
5667
5859
|
</section>`;
|
|
5668
5860
|
};
|
|
5669
5861
|
var getVoiceDeliveryRuntimeCSS = () => `.absolute-voice-delivery-runtime{border:1px solid #c9d8cf;border-radius:20px;background:#f6fff9;color:#0d1b12;padding:18px;box-shadow:0 18px 40px rgba(19,55,35,.12);font-family:inherit}.absolute-voice-delivery-runtime--warn,.absolute-voice-delivery-runtime--error{border-color:#f2b56b;background:#fff9ed}.absolute-voice-delivery-runtime__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-delivery-runtime__eyebrow{color:#4e6b59;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-delivery-runtime__label{font-size:28px;line-height:1}.absolute-voice-delivery-runtime__description{color:#33483b;margin:12px 0 0}.absolute-voice-delivery-runtime__surfaces{display:grid;gap:8px;list-style:none;margin:16px 0 0;padding:0}.absolute-voice-delivery-runtime__surface{background:#fff;border:1px solid #d9eadf;border-radius:14px;display:grid;gap:4px;padding:10px 12px}.absolute-voice-delivery-runtime__surface--warn{border-color:#f2b56b}.absolute-voice-delivery-runtime__surface--disabled{opacity:.72}.absolute-voice-delivery-runtime__surface span,.absolute-voice-delivery-runtime__surface small{color:#587063}.absolute-voice-delivery-runtime__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}.absolute-voice-delivery-runtime__actions button{background:#134e2d;border:0;border-radius:999px;color:#f6fff9;cursor:pointer;font:inherit;font-weight:800;padding:8px 12px}.absolute-voice-delivery-runtime__actions button:disabled{cursor:not-allowed;opacity:.48}.absolute-voice-delivery-runtime__error{color:#9f1239;font-weight:700}`;
|
|
@@ -5801,7 +5993,7 @@ var createVoiceRoutingStatusStore = (path = "/api/routing/latest", options = {})
|
|
|
5801
5993
|
// src/client/routingStatusWidget.ts
|
|
5802
5994
|
var DEFAULT_TITLE7 = "Voice Routing";
|
|
5803
5995
|
var DEFAULT_DESCRIPTION7 = "Latest provider routing decision from the self-hosted trace store.";
|
|
5804
|
-
var
|
|
5996
|
+
var escapeHtml11 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
5805
5997
|
var formatValue = (value, fallback = "None") => typeof value === "string" && value.trim() ? value : typeof value === "number" && Number.isFinite(value) ? String(value) : fallback;
|
|
5806
5998
|
var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
|
|
5807
5999
|
const decision = snapshot.decision;
|
|
@@ -5838,17 +6030,17 @@ var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
|
|
|
5838
6030
|
var renderVoiceRoutingStatusHTML = (snapshot, options = {}) => {
|
|
5839
6031
|
const model = createVoiceRoutingStatusViewModel(snapshot, options);
|
|
5840
6032
|
const rows = model.rows.length ? `<div class="absolute-voice-routing-status__grid">${model.rows.map((row) => `<div>
|
|
5841
|
-
<span>${
|
|
5842
|
-
<strong>${
|
|
6033
|
+
<span>${escapeHtml11(row.label)}</span>
|
|
6034
|
+
<strong>${escapeHtml11(row.value)}</strong>
|
|
5843
6035
|
</div>`).join("")}</div>` : '<p class="absolute-voice-routing-status__empty">Start a voice session to see the selected provider.</p>';
|
|
5844
|
-
return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${
|
|
6036
|
+
return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml11(model.status)}">
|
|
5845
6037
|
<header class="absolute-voice-routing-status__header">
|
|
5846
|
-
<span class="absolute-voice-routing-status__eyebrow">${
|
|
5847
|
-
<strong class="absolute-voice-routing-status__label">${
|
|
6038
|
+
<span class="absolute-voice-routing-status__eyebrow">${escapeHtml11(model.title)}</span>
|
|
6039
|
+
<strong class="absolute-voice-routing-status__label">${escapeHtml11(model.label)}</strong>
|
|
5848
6040
|
</header>
|
|
5849
|
-
<p class="absolute-voice-routing-status__description">${
|
|
6041
|
+
<p class="absolute-voice-routing-status__description">${escapeHtml11(model.description)}</p>
|
|
5850
6042
|
${rows}
|
|
5851
|
-
${model.error ? `<p class="absolute-voice-routing-status__error">${
|
|
6043
|
+
${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml11(model.error)}</p>` : ""}
|
|
5852
6044
|
</section>`;
|
|
5853
6045
|
};
|
|
5854
6046
|
var getVoiceRoutingStatusCSS = () => `.absolute-voice-routing-status{border:1px solid #d8d2c4;border-radius:20px;background:#fffaf0;color:#16130d;padding:18px;box-shadow:0 18px 40px rgba(47,37,18,.12);font-family:inherit}.absolute-voice-routing-status--error{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-routing-status__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-routing-status__eyebrow{color:#73664f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-routing-status__label{font-size:24px;line-height:1}.absolute-voice-routing-status__description{color:#514733;margin:12px 0 0}.absolute-voice-routing-status__grid{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:14px}.absolute-voice-routing-status__grid div{background:#fff;border:1px solid #eee4d2;border-radius:14px;padding:10px 12px}.absolute-voice-routing-status__grid span{color:#655944;display:block;font-size:12px;margin-bottom:4px}.absolute-voice-routing-status__grid strong{overflow-wrap:anywhere}.absolute-voice-routing-status__empty{color:#655944;margin:14px 0 0}.absolute-voice-routing-status__error{color:#9f1239;font-weight:700}`;
|
|
@@ -6647,7 +6839,7 @@ var createVoiceProviderSimulationControlsStore = (options) => {
|
|
|
6647
6839
|
};
|
|
6648
6840
|
};
|
|
6649
6841
|
// src/client/providerSimulationControlsWidget.ts
|
|
6650
|
-
var
|
|
6842
|
+
var escapeHtml12 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
6651
6843
|
var formatKind = (kind) => (kind ?? "stt").toUpperCase();
|
|
6652
6844
|
var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
|
|
6653
6845
|
const configuredProviders = options.providers.filter((provider) => provider.configured !== false);
|
|
@@ -6667,18 +6859,18 @@ var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
|
|
|
6667
6859
|
};
|
|
6668
6860
|
var renderVoiceProviderSimulationControlsHTML = (snapshot, options) => {
|
|
6669
6861
|
const model = createVoiceProviderSimulationControlsViewModel(snapshot, options);
|
|
6670
|
-
const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${
|
|
6671
|
-
const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${
|
|
6862
|
+
const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${escapeHtml12(provider.provider)}"${!model.canSimulateFailure || snapshot.isRunning ? " disabled" : ""}>Simulate ${escapeHtml12(provider.provider)} ${escapeHtml12(formatKind(options.kind))} failure</button>`).join("");
|
|
6863
|
+
const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${escapeHtml12(provider.provider)}"${snapshot.isRunning ? " disabled" : ""}>Mark ${escapeHtml12(provider.provider)} recovered</button>`).join("");
|
|
6672
6864
|
return `<section class="absolute-voice-provider-simulation absolute-voice-provider-simulation--${snapshot.error ? "error" : snapshot.isRunning ? "running" : "ready"}">
|
|
6673
6865
|
<header class="absolute-voice-provider-simulation__header">
|
|
6674
|
-
<span class="absolute-voice-provider-simulation__eyebrow">${
|
|
6675
|
-
<strong class="absolute-voice-provider-simulation__label">${
|
|
6866
|
+
<span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml12(model.title)}</span>
|
|
6867
|
+
<strong class="absolute-voice-provider-simulation__label">${escapeHtml12(model.label)}</strong>
|
|
6676
6868
|
</header>
|
|
6677
|
-
<p class="absolute-voice-provider-simulation__description">${
|
|
6678
|
-
${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${
|
|
6869
|
+
<p class="absolute-voice-provider-simulation__description">${escapeHtml12(model.description)}</p>
|
|
6870
|
+
${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml12(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
|
|
6679
6871
|
<div class="absolute-voice-provider-simulation__actions">${failureButtons}${recoveryButtons}</div>
|
|
6680
|
-
${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${
|
|
6681
|
-
${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${
|
|
6872
|
+
${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml12(snapshot.error)}</p>` : ""}
|
|
6873
|
+
${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml12(model.resultText)}</pre>` : ""}
|
|
6682
6874
|
</section>`;
|
|
6683
6875
|
};
|
|
6684
6876
|
var bindVoiceProviderSimulationControls = (element, store) => {
|
|
@@ -6745,7 +6937,7 @@ var defineVoiceProviderSimulationControlsElement = (tagName = "absolute-voice-pr
|
|
|
6745
6937
|
// src/client/providerStatusWidget.ts
|
|
6746
6938
|
var DEFAULT_TITLE8 = "Voice Providers";
|
|
6747
6939
|
var DEFAULT_DESCRIPTION8 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
|
|
6748
|
-
var
|
|
6940
|
+
var escapeHtml13 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
6749
6941
|
var formatProvider = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
|
|
6750
6942
|
var formatStatus2 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
|
|
6751
6943
|
var formatLatency = (value) => typeof value === "number" ? `${value}ms` : "No samples";
|
|
@@ -6801,25 +6993,25 @@ var createVoiceProviderStatusViewModel = (snapshot, options = {}) => {
|
|
|
6801
6993
|
};
|
|
6802
6994
|
var renderVoiceProviderStatusHTML = (snapshot, options = {}) => {
|
|
6803
6995
|
const model = createVoiceProviderStatusViewModel(snapshot, options);
|
|
6804
|
-
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--${
|
|
6996
|
+
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--${escapeHtml13(provider.status)}">
|
|
6805
6997
|
<header>
|
|
6806
|
-
<strong>${
|
|
6807
|
-
<span>${
|
|
6998
|
+
<strong>${escapeHtml13(provider.label)}</strong>
|
|
6999
|
+
<span>${escapeHtml13(formatStatus2(provider.status))}</span>
|
|
6808
7000
|
</header>
|
|
6809
|
-
<p>${
|
|
7001
|
+
<p>${escapeHtml13(provider.detail)}</p>
|
|
6810
7002
|
<dl>${provider.rows.map((row) => `<div>
|
|
6811
|
-
<dt>${
|
|
6812
|
-
<dd>${
|
|
7003
|
+
<dt>${escapeHtml13(row.label)}</dt>
|
|
7004
|
+
<dd>${escapeHtml13(row.value)}</dd>
|
|
6813
7005
|
</div>`).join("")}</dl>
|
|
6814
7006
|
</article>`).join("")}</div>` : '<p class="absolute-voice-provider-status__empty">Run voice traffic to see provider health.</p>';
|
|
6815
|
-
return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${
|
|
7007
|
+
return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml13(model.status)}">
|
|
6816
7008
|
<header class="absolute-voice-provider-status__header">
|
|
6817
|
-
<span class="absolute-voice-provider-status__eyebrow">${
|
|
6818
|
-
<strong class="absolute-voice-provider-status__label">${
|
|
7009
|
+
<span class="absolute-voice-provider-status__eyebrow">${escapeHtml13(model.title)}</span>
|
|
7010
|
+
<strong class="absolute-voice-provider-status__label">${escapeHtml13(model.label)}</strong>
|
|
6819
7011
|
</header>
|
|
6820
|
-
<p class="absolute-voice-provider-status__description">${
|
|
7012
|
+
<p class="absolute-voice-provider-status__description">${escapeHtml13(model.description)}</p>
|
|
6821
7013
|
${providers}
|
|
6822
|
-
${model.error ? `<p class="absolute-voice-provider-status__error">${
|
|
7014
|
+
${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml13(model.error)}</p>` : ""}
|
|
6823
7015
|
</section>`;
|
|
6824
7016
|
};
|
|
6825
7017
|
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}`;
|
|
@@ -6862,7 +7054,7 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
|
|
|
6862
7054
|
// src/client/providerCapabilitiesWidget.ts
|
|
6863
7055
|
var DEFAULT_TITLE9 = "Provider Capabilities";
|
|
6864
7056
|
var DEFAULT_DESCRIPTION9 = "Configured, selected, and healthy voice providers for this deployment.";
|
|
6865
|
-
var
|
|
7057
|
+
var escapeHtml14 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
6866
7058
|
var formatProvider2 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
|
|
6867
7059
|
var formatKind2 = (kind) => kind.toUpperCase();
|
|
6868
7060
|
var formatStatus3 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
|
|
@@ -6917,25 +7109,25 @@ var createVoiceProviderCapabilitiesViewModel = (snapshot, options = {}) => {
|
|
|
6917
7109
|
};
|
|
6918
7110
|
var renderVoiceProviderCapabilitiesHTML = (snapshot, options = {}) => {
|
|
6919
7111
|
const model = createVoiceProviderCapabilitiesViewModel(snapshot, options);
|
|
6920
|
-
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--${
|
|
7112
|
+
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--${escapeHtml14(capability.status)}">
|
|
6921
7113
|
<header>
|
|
6922
|
-
<strong>${
|
|
6923
|
-
<span>${
|
|
7114
|
+
<strong>${escapeHtml14(capability.label)}</strong>
|
|
7115
|
+
<span>${escapeHtml14(formatStatus3(capability.status))}</span>
|
|
6924
7116
|
</header>
|
|
6925
|
-
<p>${
|
|
7117
|
+
<p>${escapeHtml14(capability.detail)}</p>
|
|
6926
7118
|
<dl>${capability.rows.map((row) => `<div>
|
|
6927
|
-
<dt>${
|
|
6928
|
-
<dd>${
|
|
7119
|
+
<dt>${escapeHtml14(row.label)}</dt>
|
|
7120
|
+
<dd>${escapeHtml14(row.value)}</dd>
|
|
6929
7121
|
</div>`).join("")}</dl>
|
|
6930
7122
|
</article>`).join("")}</div>` : '<p class="absolute-voice-provider-capabilities__empty">Configure provider capabilities to see deployment coverage.</p>';
|
|
6931
|
-
return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${
|
|
7123
|
+
return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${escapeHtml14(model.status)}">
|
|
6932
7124
|
<header class="absolute-voice-provider-capabilities__header">
|
|
6933
|
-
<span class="absolute-voice-provider-capabilities__eyebrow">${
|
|
6934
|
-
<strong class="absolute-voice-provider-capabilities__label">${
|
|
7125
|
+
<span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml14(model.title)}</span>
|
|
7126
|
+
<strong class="absolute-voice-provider-capabilities__label">${escapeHtml14(model.label)}</strong>
|
|
6935
7127
|
</header>
|
|
6936
|
-
<p class="absolute-voice-provider-capabilities__description">${
|
|
7128
|
+
<p class="absolute-voice-provider-capabilities__description">${escapeHtml14(model.description)}</p>
|
|
6937
7129
|
${capabilities}
|
|
6938
|
-
${model.error ? `<p class="absolute-voice-provider-capabilities__error">${
|
|
7130
|
+
${model.error ? `<p class="absolute-voice-provider-capabilities__error">${escapeHtml14(model.error)}</p>` : ""}
|
|
6939
7131
|
</section>`;
|
|
6940
7132
|
};
|
|
6941
7133
|
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}`;
|
|
@@ -6978,7 +7170,7 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
|
|
|
6978
7170
|
// src/client/providerContractsWidget.ts
|
|
6979
7171
|
var DEFAULT_TITLE10 = "Provider Contracts";
|
|
6980
7172
|
var DEFAULT_DESCRIPTION10 = "Production contract coverage for provider env, latency, fallback, streaming, and capabilities.";
|
|
6981
|
-
var
|
|
7173
|
+
var escapeHtml15 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
6982
7174
|
var formatProvider3 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
|
|
6983
7175
|
var formatStatus4 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
|
|
6984
7176
|
var contractDetail = (row) => {
|
|
@@ -7022,26 +7214,26 @@ var createVoiceProviderContractsViewModel = (snapshot, options = {}) => {
|
|
|
7022
7214
|
};
|
|
7023
7215
|
var renderVoiceProviderContractsHTML = (snapshot, options = {}) => {
|
|
7024
7216
|
const model = createVoiceProviderContractsViewModel(snapshot, options);
|
|
7025
|
-
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--${
|
|
7217
|
+
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--${escapeHtml15(row.status)}">
|
|
7026
7218
|
<header>
|
|
7027
|
-
<strong>${
|
|
7028
|
-
<span>${
|
|
7219
|
+
<strong>${escapeHtml15(row.label)}</strong>
|
|
7220
|
+
<span>${escapeHtml15(formatStatus4(row.status))}</span>
|
|
7029
7221
|
</header>
|
|
7030
|
-
<p>${
|
|
7031
|
-
${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${
|
|
7222
|
+
<p>${escapeHtml15(row.detail)}</p>
|
|
7223
|
+
${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${escapeHtml15(remediation.href)}">${escapeHtml15(remediation.label)}</a>` : `<strong>${escapeHtml15(remediation.label)}</strong>`}<span>${escapeHtml15(remediation.detail)}</span></li>`).join("")}</ul>` : ""}
|
|
7032
7224
|
<dl>${row.rows.map((item) => `<div>
|
|
7033
|
-
<dt>${
|
|
7034
|
-
<dd>${
|
|
7225
|
+
<dt>${escapeHtml15(item.label)}</dt>
|
|
7226
|
+
<dd>${escapeHtml15(item.value)}</dd>
|
|
7035
7227
|
</div>`).join("")}</dl>
|
|
7036
7228
|
</article>`).join("")}</div>` : '<p class="absolute-voice-provider-contracts__empty">Configure provider contracts to see production coverage.</p>';
|
|
7037
|
-
return `<section class="absolute-voice-provider-contracts absolute-voice-provider-contracts--${
|
|
7229
|
+
return `<section class="absolute-voice-provider-contracts absolute-voice-provider-contracts--${escapeHtml15(model.status)}">
|
|
7038
7230
|
<header class="absolute-voice-provider-contracts__header">
|
|
7039
|
-
<span class="absolute-voice-provider-contracts__eyebrow">${
|
|
7040
|
-
<strong class="absolute-voice-provider-contracts__label">${
|
|
7231
|
+
<span class="absolute-voice-provider-contracts__eyebrow">${escapeHtml15(model.title)}</span>
|
|
7232
|
+
<strong class="absolute-voice-provider-contracts__label">${escapeHtml15(model.label)}</strong>
|
|
7041
7233
|
</header>
|
|
7042
|
-
<p class="absolute-voice-provider-contracts__description">${
|
|
7234
|
+
<p class="absolute-voice-provider-contracts__description">${escapeHtml15(model.description)}</p>
|
|
7043
7235
|
${rows}
|
|
7044
|
-
${model.error ? `<p class="absolute-voice-provider-contracts__error">${
|
|
7236
|
+
${model.error ? `<p class="absolute-voice-provider-contracts__error">${escapeHtml15(model.error)}</p>` : ""}
|
|
7045
7237
|
</section>`;
|
|
7046
7238
|
};
|
|
7047
7239
|
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}`;
|
|
@@ -7084,7 +7276,7 @@ var defineVoiceProviderContractsElement = (tagName = "absolute-voice-provider-co
|
|
|
7084
7276
|
// src/client/turnQualityWidget.ts
|
|
7085
7277
|
var DEFAULT_TITLE11 = "Turn Quality";
|
|
7086
7278
|
var DEFAULT_DESCRIPTION11 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
|
|
7087
|
-
var
|
|
7279
|
+
var escapeHtml16 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
7088
7280
|
var formatConfidence = (value) => typeof value === "number" ? `${Math.round(value * 100)}%` : "n/a";
|
|
7089
7281
|
var formatMaybe = (value) => value === undefined || value === "" ? "n/a" : String(value);
|
|
7090
7282
|
var getTurnDetail = (turn) => {
|
|
@@ -7134,25 +7326,25 @@ var createVoiceTurnQualityViewModel = (snapshot, options = {}) => {
|
|
|
7134
7326
|
};
|
|
7135
7327
|
var renderVoiceTurnQualityHTML = (snapshot, options = {}) => {
|
|
7136
7328
|
const model = createVoiceTurnQualityViewModel(snapshot, options);
|
|
7137
|
-
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--${
|
|
7329
|
+
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--${escapeHtml16(turn.status)}">
|
|
7138
7330
|
<header>
|
|
7139
|
-
<strong>${
|
|
7140
|
-
<span>${
|
|
7331
|
+
<strong>${escapeHtml16(turn.label)}</strong>
|
|
7332
|
+
<span>${escapeHtml16(turn.status)}</span>
|
|
7141
7333
|
</header>
|
|
7142
|
-
<p>${
|
|
7334
|
+
<p>${escapeHtml16(turn.detail)}</p>
|
|
7143
7335
|
<dl>${turn.rows.map((row) => `<div>
|
|
7144
|
-
<dt>${
|
|
7145
|
-
<dd>${
|
|
7336
|
+
<dt>${escapeHtml16(row.label)}</dt>
|
|
7337
|
+
<dd>${escapeHtml16(row.value)}</dd>
|
|
7146
7338
|
</div>`).join("")}</dl>
|
|
7147
7339
|
</article>`).join("")}</div>` : '<p class="absolute-voice-turn-quality__empty">Complete a voice turn to see STT quality diagnostics.</p>';
|
|
7148
|
-
return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${
|
|
7340
|
+
return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${escapeHtml16(model.status)}">
|
|
7149
7341
|
<header class="absolute-voice-turn-quality__header">
|
|
7150
|
-
<span class="absolute-voice-turn-quality__eyebrow">${
|
|
7151
|
-
<strong class="absolute-voice-turn-quality__label">${
|
|
7342
|
+
<span class="absolute-voice-turn-quality__eyebrow">${escapeHtml16(model.title)}</span>
|
|
7343
|
+
<strong class="absolute-voice-turn-quality__label">${escapeHtml16(model.label)}</strong>
|
|
7152
7344
|
</header>
|
|
7153
|
-
<p class="absolute-voice-turn-quality__description">${
|
|
7345
|
+
<p class="absolute-voice-turn-quality__description">${escapeHtml16(model.description)}</p>
|
|
7154
7346
|
${turns}
|
|
7155
|
-
${model.error ? `<p class="absolute-voice-turn-quality__error">${
|
|
7347
|
+
${model.error ? `<p class="absolute-voice-turn-quality__error">${escapeHtml16(model.error)}</p>` : ""}
|
|
7156
7348
|
</section>`;
|
|
7157
7349
|
};
|
|
7158
7350
|
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}`;
|
|
@@ -7196,7 +7388,7 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
|
|
|
7196
7388
|
var DEFAULT_TITLE12 = "Turn Latency";
|
|
7197
7389
|
var DEFAULT_DESCRIPTION12 = "Per-turn timing from first transcript to commit and assistant response start.";
|
|
7198
7390
|
var DEFAULT_PROOF_LABEL = "Run latency proof";
|
|
7199
|
-
var
|
|
7391
|
+
var escapeHtml17 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
7200
7392
|
var formatMs2 = (value) => typeof value === "number" ? `${Math.round(value)}ms` : "n/a";
|
|
7201
7393
|
var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
|
|
7202
7394
|
const turns = (snapshot.report?.turns ?? []).map((turn) => ({
|
|
@@ -7224,25 +7416,25 @@ var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
|
|
|
7224
7416
|
};
|
|
7225
7417
|
var renderVoiceTurnLatencyHTML = (snapshot, options = {}) => {
|
|
7226
7418
|
const model = createVoiceTurnLatencyViewModel(snapshot, options);
|
|
7227
|
-
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--${
|
|
7419
|
+
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--${escapeHtml17(turn.status)}">
|
|
7228
7420
|
<header>
|
|
7229
|
-
<strong>${
|
|
7230
|
-
<span>${
|
|
7421
|
+
<strong>${escapeHtml17(turn.label)}</strong>
|
|
7422
|
+
<span>${escapeHtml17(turn.status)}</span>
|
|
7231
7423
|
</header>
|
|
7232
7424
|
<dl>${turn.rows.map((row) => `<div>
|
|
7233
|
-
<dt>${
|
|
7234
|
-
<dd>${
|
|
7425
|
+
<dt>${escapeHtml17(row.label)}</dt>
|
|
7426
|
+
<dd>${escapeHtml17(row.value)}</dd>
|
|
7235
7427
|
</div>`).join("")}</dl>
|
|
7236
7428
|
</article>`).join("")}</div>` : '<p class="absolute-voice-turn-latency__empty">Complete a voice turn to see latency diagnostics.</p>';
|
|
7237
|
-
return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${
|
|
7429
|
+
return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${escapeHtml17(model.status)}">
|
|
7238
7430
|
<header class="absolute-voice-turn-latency__header">
|
|
7239
|
-
<span class="absolute-voice-turn-latency__eyebrow">${
|
|
7240
|
-
<strong class="absolute-voice-turn-latency__label">${
|
|
7431
|
+
<span class="absolute-voice-turn-latency__eyebrow">${escapeHtml17(model.title)}</span>
|
|
7432
|
+
<strong class="absolute-voice-turn-latency__label">${escapeHtml17(model.label)}</strong>
|
|
7241
7433
|
</header>
|
|
7242
|
-
<p class="absolute-voice-turn-latency__description">${
|
|
7243
|
-
${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${
|
|
7434
|
+
<p class="absolute-voice-turn-latency__description">${escapeHtml17(model.description)}</p>
|
|
7435
|
+
${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml17(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</button>` : ""}
|
|
7244
7436
|
${turns}
|
|
7245
|
-
${model.error ? `<p class="absolute-voice-turn-latency__error">${
|
|
7437
|
+
${model.error ? `<p class="absolute-voice-turn-latency__error">${escapeHtml17(model.error)}</p>` : ""}
|
|
7246
7438
|
</section>`;
|
|
7247
7439
|
};
|
|
7248
7440
|
var mountVoiceTurnLatency = (element, path = "/api/turn-latency", options = {}) => {
|
|
@@ -7294,7 +7486,7 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
|
|
|
7294
7486
|
// src/client/traceTimelineWidget.ts
|
|
7295
7487
|
var DEFAULT_TITLE13 = "Voice Traces";
|
|
7296
7488
|
var DEFAULT_DESCRIPTION13 = "Latest call timelines with provider latency, fallbacks, handoffs, and errors from your self-hosted trace store.";
|
|
7297
|
-
var
|
|
7489
|
+
var escapeHtml18 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
7298
7490
|
var formatMs3 = (value) => typeof value === "number" ? `${value}ms` : "n/a";
|
|
7299
7491
|
var formatProviders = (session) => session.providers.length ? session.providers.map((provider) => provider.provider).join(", ") : "No providers";
|
|
7300
7492
|
var createVoiceTraceTimelineViewModel = (snapshot, options = {}) => {
|
|
@@ -7324,27 +7516,27 @@ var renderVoiceTraceTimelineWidgetHTML = (snapshot, options = {}) => {
|
|
|
7324
7516
|
const model = createVoiceTraceTimelineViewModel(snapshot, options);
|
|
7325
7517
|
const sessions = model.sessions.length ? `<div class="absolute-voice-trace-timeline__sessions">${model.sessions.map((session) => {
|
|
7326
7518
|
const supportLinks = [
|
|
7327
|
-
`<a href="${
|
|
7328
|
-
session.operationsRecordHref ? `<a href="${
|
|
7329
|
-
session.incidentBundleHref ? `<a href="${
|
|
7519
|
+
`<a href="${escapeHtml18(session.detailHref)}">Open timeline</a>`,
|
|
7520
|
+
session.operationsRecordHref ? `<a href="${escapeHtml18(session.operationsRecordHref)}">Open operations record</a>` : undefined,
|
|
7521
|
+
session.incidentBundleHref ? `<a href="${escapeHtml18(session.incidentBundleHref)}">Export incident bundle</a>` : undefined
|
|
7330
7522
|
].filter(Boolean).join("");
|
|
7331
|
-
return `<article class="absolute-voice-trace-timeline__session absolute-voice-trace-timeline__session--${
|
|
7523
|
+
return `<article class="absolute-voice-trace-timeline__session absolute-voice-trace-timeline__session--${escapeHtml18(session.status)}">
|
|
7332
7524
|
<header>
|
|
7333
|
-
<strong>${
|
|
7334
|
-
<span>${
|
|
7525
|
+
<strong>${escapeHtml18(session.sessionId)}</strong>
|
|
7526
|
+
<span>${escapeHtml18(session.status)}</span>
|
|
7335
7527
|
</header>
|
|
7336
|
-
<p>${
|
|
7528
|
+
<p>${escapeHtml18(session.label)} \xB7 ${escapeHtml18(session.durationLabel)} \xB7 ${escapeHtml18(session.providerLabel)}</p>
|
|
7337
7529
|
<p class="absolute-voice-trace-timeline__actions">${supportLinks}</p>
|
|
7338
7530
|
</article>`;
|
|
7339
7531
|
}).join("")}</div>` : '<p class="absolute-voice-trace-timeline__empty">Run a voice session to see call timelines.</p>';
|
|
7340
|
-
return `<section class="absolute-voice-trace-timeline absolute-voice-trace-timeline--${
|
|
7532
|
+
return `<section class="absolute-voice-trace-timeline absolute-voice-trace-timeline--${escapeHtml18(model.status)}">
|
|
7341
7533
|
<header class="absolute-voice-trace-timeline__header">
|
|
7342
|
-
<span class="absolute-voice-trace-timeline__eyebrow">${
|
|
7343
|
-
<strong class="absolute-voice-trace-timeline__label">${
|
|
7534
|
+
<span class="absolute-voice-trace-timeline__eyebrow">${escapeHtml18(model.title)}</span>
|
|
7535
|
+
<strong class="absolute-voice-trace-timeline__label">${escapeHtml18(model.label)}</strong>
|
|
7344
7536
|
</header>
|
|
7345
|
-
<p class="absolute-voice-trace-timeline__description">${
|
|
7537
|
+
<p class="absolute-voice-trace-timeline__description">${escapeHtml18(model.description)}</p>
|
|
7346
7538
|
${sessions}
|
|
7347
|
-
${model.error ? `<p class="absolute-voice-trace-timeline__error">${
|
|
7539
|
+
${model.error ? `<p class="absolute-voice-trace-timeline__error">${escapeHtml18(model.error)}</p>` : ""}
|
|
7348
7540
|
</section>`;
|
|
7349
7541
|
};
|
|
7350
7542
|
var getVoiceTraceTimelineCSS = () => `.absolute-voice-trace-timeline{border:1px solid #bad7d3;border-radius:20px;background:#f3fffb;color:#09201c;padding:18px;box-shadow:0 18px 40px rgba(9,32,28,.12);font-family:inherit}.absolute-voice-trace-timeline--error,.absolute-voice-trace-timeline--failed{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-trace-timeline--warning{border-color:#fbbf24;background:#fffaf0}.absolute-voice-trace-timeline__header,.absolute-voice-trace-timeline__session header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-trace-timeline__eyebrow{color:#17665b;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-trace-timeline__label{font-size:24px;line-height:1}.absolute-voice-trace-timeline__description,.absolute-voice-trace-timeline__session p,.absolute-voice-trace-timeline__empty{color:#35544f}.absolute-voice-trace-timeline__sessions{display:grid;gap:12px;margin-top:14px}.absolute-voice-trace-timeline__session{background:#fff;border:1px solid #cfe7e2;border-radius:16px;padding:14px}.absolute-voice-trace-timeline__session--failed{border-color:#f2a7a7}.absolute-voice-trace-timeline__session--warning{border-color:#fbbf24}.absolute-voice-trace-timeline__session p{margin:10px 0}.absolute-voice-trace-timeline__actions{display:flex;flex-wrap:wrap;gap:10px}.absolute-voice-trace-timeline__session a{color:#0f766e;font-weight:800}.absolute-voice-trace-timeline__empty{margin:14px 0 0}.absolute-voice-trace-timeline__error{color:#9f1239;font-weight:700}`;
|
|
@@ -7392,7 +7584,7 @@ var defineVoiceTraceTimelineElement = (tagName = "absolute-voice-trace-timeline"
|
|
|
7392
7584
|
// src/client/agentSquadStatusWidget.ts
|
|
7393
7585
|
var DEFAULT_TITLE14 = "Voice Agent Squad";
|
|
7394
7586
|
var DEFAULT_DESCRIPTION14 = "Current specialist and recent handoffs from your self-hosted voice traces.";
|
|
7395
|
-
var
|
|
7587
|
+
var escapeHtml19 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
7396
7588
|
var labelFor = (current) => {
|
|
7397
7589
|
if (!current)
|
|
7398
7590
|
return "Waiting for specialist activity";
|
|
@@ -7419,24 +7611,24 @@ var renderVoiceAgentSquadStatusHTML = (snapshot, options = {}) => {
|
|
|
7419
7611
|
const model = createVoiceAgentSquadStatusViewModel(snapshot, options);
|
|
7420
7612
|
const current = model.current;
|
|
7421
7613
|
const rows = model.sessions.length ? model.sessions.slice(0, 5).map((session) => `<li>
|
|
7422
|
-
<span>${
|
|
7423
|
-
<strong>${
|
|
7424
|
-
<em>${
|
|
7425
|
-
${session.summary || session.reason ? `<p>${
|
|
7614
|
+
<span>${escapeHtml19(session.sessionId)}</span>
|
|
7615
|
+
<strong>${escapeHtml19(session.targetAgentId ?? "none")}</strong>
|
|
7616
|
+
<em>${escapeHtml19(session.status)}</em>
|
|
7617
|
+
${session.summary || session.reason ? `<p>${escapeHtml19(session.summary ?? session.reason ?? "")}</p>` : ""}
|
|
7426
7618
|
</li>`).join("") : "<li><span>No squad traces yet.</span><strong>Waiting</strong></li>";
|
|
7427
7619
|
return `<section class="absolute-voice-agent-squad-status">
|
|
7428
7620
|
<header>
|
|
7429
|
-
<span>${
|
|
7430
|
-
<strong>${
|
|
7621
|
+
<span>${escapeHtml19(model.title)}</span>
|
|
7622
|
+
<strong>${escapeHtml19(model.label)}</strong>
|
|
7431
7623
|
</header>
|
|
7432
|
-
<p>${
|
|
7624
|
+
<p>${escapeHtml19(model.description)}</p>
|
|
7433
7625
|
<div>
|
|
7434
|
-
<span>Session</span><strong>${
|
|
7435
|
-
<span>From</span><strong>${
|
|
7436
|
-
<span>Status</span><strong>${
|
|
7626
|
+
<span>Session</span><strong>${escapeHtml19(current?.sessionId ?? "n/a")}</strong>
|
|
7627
|
+
<span>From</span><strong>${escapeHtml19(current?.fromAgentId ?? "n/a")}</strong>
|
|
7628
|
+
<span>Status</span><strong>${escapeHtml19(current?.status ?? "idle")}</strong>
|
|
7437
7629
|
</div>
|
|
7438
7630
|
<ul>${rows}</ul>
|
|
7439
|
-
${model.error ? `<p class="absolute-voice-agent-squad-status__error">${
|
|
7631
|
+
${model.error ? `<p class="absolute-voice-agent-squad-status__error">${escapeHtml19(model.error)}</p>` : ""}
|
|
7440
7632
|
</section>`;
|
|
7441
7633
|
};
|
|
7442
7634
|
var getVoiceAgentSquadStatusCSS = () => `.absolute-voice-agent-squad-status{border:1px solid #38bdf866;border-radius:20px;background:#0f172a;color:#f8fafc;padding:18px;font-family:inherit}.absolute-voice-agent-squad-status header{display:grid;gap:4px}.absolute-voice-agent-squad-status header span{color:#7dd3fc;font-size:12px;font-weight:900;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-agent-squad-status header strong{font-size:20px}.absolute-voice-agent-squad-status p{color:#cbd5e1}.absolute-voice-agent-squad-status div{display:grid;gap:6px;grid-template-columns:max-content 1fr;margin:14px 0}.absolute-voice-agent-squad-status div span{color:#94a3b8}.absolute-voice-agent-squad-status ul{display:grid;gap:8px;list-style:none;margin:0;padding:0}.absolute-voice-agent-squad-status li{background:#020617;border:1px solid #1e293b;border-radius:14px;padding:10px}.absolute-voice-agent-squad-status li span{color:#94a3b8;display:block;font-size:12px}.absolute-voice-agent-squad-status li strong{display:block}.absolute-voice-agent-squad-status li em{color:#7dd3fc;font-style:normal}.absolute-voice-agent-squad-status__error{color:#fecaca;font-weight:800}`;
|