@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.
@@ -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("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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 escapeHtml3 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4131
+ var escapeHtml4 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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>${escapeHtml3(metric.label)}</span>
3990
- <strong>${escapeHtml3(metric.value)}</strong>
3991
- </article>`).join("")}</div>` : `<p class="absolute-voice-proof-trends__empty">${model.error ? escapeHtml3(model.error) : "Run the sustained proof trends script to populate evidence."}</p>`;
3992
- const links = model.links.length ? `<p class="absolute-voice-proof-trends__links">${model.links.map((link) => `<a href="${escapeHtml3(link.href)}">${escapeHtml3(link.label)}</a>`).join("")}</p>` : "";
3993
- return `<section class="absolute-voice-proof-trends absolute-voice-proof-trends--${escapeHtml3(model.status)}">
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">${escapeHtml3(model.title)}</span>
3996
- <strong class="absolute-voice-proof-trends__label">${escapeHtml3(model.label)}</strong>
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">${escapeHtml3(model.description)}</p>
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">${escapeHtml3(model.error)}</p>` : ""}
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 escapeHtml4 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4239
+ var escapeHtml5 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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--${escapeHtml4(failure.status)}">
4089
- <span>${escapeHtml4(failure.status.toUpperCase())}</span>
4090
- <strong>${escapeHtml4(failure.label)}</strong>
4091
- <p>Observed ${escapeHtml4(failure.observed)} against ${escapeHtml4(failure.thresholdLabel)} ${escapeHtml4(failure.threshold)}.</p>
4092
- <p>${escapeHtml4(failure.remediation)}</p>
4093
- <p class="absolute-voice-readiness-failures__links">${failure.evidenceHref ? `<a href="${escapeHtml4(failure.evidenceHref)}">Evidence</a>` : ""}${failure.sourceHref ? `<a href="${escapeHtml4(failure.sourceHref)}">Threshold source</a>` : ""}</p>
4094
- </article>`).join("")}</div>` : `<p class="absolute-voice-readiness-failures__empty">${model.error ? escapeHtml4(model.error) : "No calibrated readiness gate explanations are open."}</p>`;
4095
- const links = model.links.length ? `<p class="absolute-voice-readiness-failures__links">${model.links.map((link) => `<a href="${escapeHtml4(link.href)}">${escapeHtml4(link.label)}</a>`).join("")}</p>` : "";
4096
- return `<section class="absolute-voice-readiness-failures absolute-voice-readiness-failures--${escapeHtml4(model.status)}">
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">${escapeHtml4(model.title)}</span>
4099
- <strong class="absolute-voice-readiness-failures__label">${escapeHtml4(model.label)}</strong>
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">${escapeHtml4(model.description)}</p>
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">${escapeHtml4(model.error)}</p>` : ""}
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 escapeHtml5 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4338
+ var escapeHtml6 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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="${escapeHtml5(action.id)}"${action.disabled ? " disabled" : ""}>
4169
- ${escapeHtml5(action.isRunning ? "Working..." : action.label)}
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--${escapeHtml5(model.status)}">
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">${escapeHtml5(model.title)}</span>
4174
- <strong class="absolute-voice-ops-action-center__label">${escapeHtml5(model.label)}</strong>
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">${escapeHtml5(model.description)}</p>
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">${escapeHtml5(model.lastResultLabel)}</p>
4179
- ${model.error ? `<p class="absolute-voice-ops-action-center__error">${escapeHtml5(model.error)}</p>` : ""}
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 escapeHtml6 = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
4972
+ var escapeHtml7 = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
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>${escapeHtml6(String(offset))}</td>`,
5061
- `<td>${escapeHtml6(event.type)}</td>`,
5062
- `<td>${escapeHtml6(event.turnId ?? "")}</td>`,
5063
- `<td><code>${escapeHtml6(JSON.stringify(event.payload))}</code></td>`,
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>${escapeHtml6(options.title ?? "Voice Trace")}</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>${escapeHtml6(options.title ?? `Voice Trace ${summary.sessionId ?? ""}`.trim())}</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>${escapeHtml6(markdown)}</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 escapeHtml7 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5650
+ var escapeHtml8 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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="${escapeHtml7(action)}"${disabled ? " disabled" : ""}>${escapeHtml7(snapshot.runningAction === action ? "Running..." : ACTION_LABELS[action])}</button>`).join("");
5470
- const result = snapshot.error ? `<p class="absolute-voice-live-ops__error">${escapeHtml7(snapshot.error)}</p>` : snapshot.lastResult ? `<p class="absolute-voice-live-ops__result">Recorded ${escapeHtml7(snapshot.lastResult.action)}. Control: ${escapeHtml7(snapshot.lastResult.control.status)}.</p>` : '<p class="absolute-voice-live-ops__result">No live ops action has run yet.</p>';
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>${escapeHtml7(options.title ?? "Live Ops")}</span>
5474
- <strong>${escapeHtml7(sessionId || "No active session")}</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">${escapeHtml7(options.description ?? "Pause, resume, take over, force handoff, or inject operator instructions during a live voice session.")}</p>
5477
- <label><span>Operator</span><input data-absolute-voice-live-ops-assignee value="${escapeHtml7(options.defaultAssignee ?? "operator")}" /></label>
5478
- <label><span>Tag / handoff target</span><input data-absolute-voice-live-ops-tag value="${escapeHtml7(options.defaultTag ?? "live-ops")}" /></label>
5479
- <label><span>Detail / instruction</span><input data-absolute-voice-live-ops-detail value="${escapeHtml7(options.defaultDetail ?? "Operator marked this live session.")}" /></label>
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 escapeHtml8 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5758
+ var escapeHtml9 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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>${escapeHtml8(entry.actionId)}</span><strong>${escapeHtml8(entry.ok ? "Success" : "Failed")}</strong><small>${escapeHtml8(new Date(entry.at).toLocaleString())}${entry.status ? ` \xB7 HTTP ${String(entry.status)}` : ""}</small></li>`).join("");
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>${escapeHtml8(options.title ?? "Action History")}</strong></header>
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">${escapeHtml8(snapshot.error)}</p>` : ""}
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 escapeHtml9 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5790
+ var escapeHtml10 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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--${escapeHtml9(surface.status)}">
5648
- <span>${escapeHtml9(surface.label)}</span>
5649
- <strong>${escapeHtml9(surface.detail)}</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 &middot; ${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">${escapeHtml9(model.actionError)}</p>` : "";
5657
- return `<section class="absolute-voice-delivery-runtime absolute-voice-delivery-runtime--${escapeHtml9(model.status)}">
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">${escapeHtml9(model.title)}</span>
5660
- <strong class="absolute-voice-delivery-runtime__label">${escapeHtml9(model.label)}</strong>
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">${escapeHtml9(model.description)}</p>
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">${escapeHtml9(model.error)}</p>` : ""}
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 escapeHtml10 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5996
+ var escapeHtml11 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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>${escapeHtml10(row.label)}</span>
5842
- <strong>${escapeHtml10(row.value)}</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--${escapeHtml10(model.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">${escapeHtml10(model.title)}</span>
5847
- <strong class="absolute-voice-routing-status__label">${escapeHtml10(model.label)}</strong>
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">${escapeHtml10(model.description)}</p>
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">${escapeHtml10(model.error)}</p>` : ""}
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 escapeHtml11 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6842
+ var escapeHtml12 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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="${escapeHtml11(provider.provider)}"${!model.canSimulateFailure || snapshot.isRunning ? " disabled" : ""}>Simulate ${escapeHtml11(provider.provider)} ${escapeHtml11(formatKind(options.kind))} failure</button>`).join("");
6671
- const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${escapeHtml11(provider.provider)}"${snapshot.isRunning ? " disabled" : ""}>Mark ${escapeHtml11(provider.provider)} recovered</button>`).join("");
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">${escapeHtml11(model.title)}</span>
6675
- <strong class="absolute-voice-provider-simulation__label">${escapeHtml11(model.label)}</strong>
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">${escapeHtml11(model.description)}</p>
6678
- ${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml11(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
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">${escapeHtml11(snapshot.error)}</p>` : ""}
6681
- ${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml11(model.resultText)}</pre>` : ""}
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 escapeHtml12 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6940
+ var escapeHtml13 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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--${escapeHtml12(provider.status)}">
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>${escapeHtml12(provider.label)}</strong>
6807
- <span>${escapeHtml12(formatStatus2(provider.status))}</span>
6998
+ <strong>${escapeHtml13(provider.label)}</strong>
6999
+ <span>${escapeHtml13(formatStatus2(provider.status))}</span>
6808
7000
  </header>
6809
- <p>${escapeHtml12(provider.detail)}</p>
7001
+ <p>${escapeHtml13(provider.detail)}</p>
6810
7002
  <dl>${provider.rows.map((row) => `<div>
6811
- <dt>${escapeHtml12(row.label)}</dt>
6812
- <dd>${escapeHtml12(row.value)}</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--${escapeHtml12(model.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">${escapeHtml12(model.title)}</span>
6818
- <strong class="absolute-voice-provider-status__label">${escapeHtml12(model.label)}</strong>
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">${escapeHtml12(model.description)}</p>
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">${escapeHtml12(model.error)}</p>` : ""}
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 escapeHtml13 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7057
+ var escapeHtml14 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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--${escapeHtml13(capability.status)}">
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>${escapeHtml13(capability.label)}</strong>
6923
- <span>${escapeHtml13(formatStatus3(capability.status))}</span>
7114
+ <strong>${escapeHtml14(capability.label)}</strong>
7115
+ <span>${escapeHtml14(formatStatus3(capability.status))}</span>
6924
7116
  </header>
6925
- <p>${escapeHtml13(capability.detail)}</p>
7117
+ <p>${escapeHtml14(capability.detail)}</p>
6926
7118
  <dl>${capability.rows.map((row) => `<div>
6927
- <dt>${escapeHtml13(row.label)}</dt>
6928
- <dd>${escapeHtml13(row.value)}</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--${escapeHtml13(model.status)}">
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">${escapeHtml13(model.title)}</span>
6934
- <strong class="absolute-voice-provider-capabilities__label">${escapeHtml13(model.label)}</strong>
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">${escapeHtml13(model.description)}</p>
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">${escapeHtml13(model.error)}</p>` : ""}
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 escapeHtml14 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7173
+ var escapeHtml15 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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--${escapeHtml14(row.status)}">
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>${escapeHtml14(row.label)}</strong>
7028
- <span>${escapeHtml14(formatStatus4(row.status))}</span>
7219
+ <strong>${escapeHtml15(row.label)}</strong>
7220
+ <span>${escapeHtml15(formatStatus4(row.status))}</span>
7029
7221
  </header>
7030
- <p>${escapeHtml14(row.detail)}</p>
7031
- ${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${escapeHtml14(remediation.href)}">${escapeHtml14(remediation.label)}</a>` : `<strong>${escapeHtml14(remediation.label)}</strong>`}<span>${escapeHtml14(remediation.detail)}</span></li>`).join("")}</ul>` : ""}
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>${escapeHtml14(item.label)}</dt>
7034
- <dd>${escapeHtml14(item.value)}</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--${escapeHtml14(model.status)}">
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">${escapeHtml14(model.title)}</span>
7040
- <strong class="absolute-voice-provider-contracts__label">${escapeHtml14(model.label)}</strong>
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">${escapeHtml14(model.description)}</p>
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">${escapeHtml14(model.error)}</p>` : ""}
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 escapeHtml15 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7279
+ var escapeHtml16 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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--${escapeHtml15(turn.status)}">
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>${escapeHtml15(turn.label)}</strong>
7140
- <span>${escapeHtml15(turn.status)}</span>
7331
+ <strong>${escapeHtml16(turn.label)}</strong>
7332
+ <span>${escapeHtml16(turn.status)}</span>
7141
7333
  </header>
7142
- <p>${escapeHtml15(turn.detail)}</p>
7334
+ <p>${escapeHtml16(turn.detail)}</p>
7143
7335
  <dl>${turn.rows.map((row) => `<div>
7144
- <dt>${escapeHtml15(row.label)}</dt>
7145
- <dd>${escapeHtml15(row.value)}</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--${escapeHtml15(model.status)}">
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">${escapeHtml15(model.title)}</span>
7151
- <strong class="absolute-voice-turn-quality__label">${escapeHtml15(model.label)}</strong>
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">${escapeHtml15(model.description)}</p>
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">${escapeHtml15(model.error)}</p>` : ""}
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 escapeHtml16 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7391
+ var escapeHtml17 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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--${escapeHtml16(turn.status)}">
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>${escapeHtml16(turn.label)}</strong>
7230
- <span>${escapeHtml16(turn.status)}</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>${escapeHtml16(row.label)}</dt>
7234
- <dd>${escapeHtml16(row.value)}</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--${escapeHtml16(model.status)}">
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">${escapeHtml16(model.title)}</span>
7240
- <strong class="absolute-voice-turn-latency__label">${escapeHtml16(model.label)}</strong>
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">${escapeHtml16(model.description)}</p>
7243
- ${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml16(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</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">${escapeHtml16(model.error)}</p>` : ""}
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 escapeHtml17 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7489
+ var escapeHtml18 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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="${escapeHtml17(session.detailHref)}">Open timeline</a>`,
7328
- session.operationsRecordHref ? `<a href="${escapeHtml17(session.operationsRecordHref)}">Open operations record</a>` : undefined,
7329
- session.incidentBundleHref ? `<a href="${escapeHtml17(session.incidentBundleHref)}">Export incident bundle</a>` : undefined
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--${escapeHtml17(session.status)}">
7523
+ return `<article class="absolute-voice-trace-timeline__session absolute-voice-trace-timeline__session--${escapeHtml18(session.status)}">
7332
7524
  <header>
7333
- <strong>${escapeHtml17(session.sessionId)}</strong>
7334
- <span>${escapeHtml17(session.status)}</span>
7525
+ <strong>${escapeHtml18(session.sessionId)}</strong>
7526
+ <span>${escapeHtml18(session.status)}</span>
7335
7527
  </header>
7336
- <p>${escapeHtml17(session.label)} \xB7 ${escapeHtml17(session.durationLabel)} \xB7 ${escapeHtml17(session.providerLabel)}</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--${escapeHtml17(model.status)}">
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">${escapeHtml17(model.title)}</span>
7343
- <strong class="absolute-voice-trace-timeline__label">${escapeHtml17(model.label)}</strong>
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">${escapeHtml17(model.description)}</p>
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">${escapeHtml17(model.error)}</p>` : ""}
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 escapeHtml18 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7587
+ var escapeHtml19 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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>${escapeHtml18(session.sessionId)}</span>
7423
- <strong>${escapeHtml18(session.targetAgentId ?? "none")}</strong>
7424
- <em>${escapeHtml18(session.status)}</em>
7425
- ${session.summary || session.reason ? `<p>${escapeHtml18(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>${escapeHtml18(model.title)}</span>
7430
- <strong>${escapeHtml18(model.label)}</strong>
7621
+ <span>${escapeHtml19(model.title)}</span>
7622
+ <strong>${escapeHtml19(model.label)}</strong>
7431
7623
  </header>
7432
- <p>${escapeHtml18(model.description)}</p>
7624
+ <p>${escapeHtml19(model.description)}</p>
7433
7625
  <div>
7434
- <span>Session</span><strong>${escapeHtml18(current?.sessionId ?? "n/a")}</strong>
7435
- <span>From</span><strong>${escapeHtml18(current?.fromAgentId ?? "n/a")}</strong>
7436
- <span>Status</span><strong>${escapeHtml18(current?.status ?? "idle")}</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">${escapeHtml18(model.error)}</p>` : ""}
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}`;