@absolutejs/voice 0.0.22-beta.333 → 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.
@@ -3930,6 +3930,162 @@ var assertVoiceProofTrendEvidence = (report, input = {}) => {
3930
3930
  }
3931
3931
  return assertion;
3932
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
+ };
3933
4089
  var createVoiceProofTrendRoutes = (options) => {
3934
4090
  const path = options.path ?? "/api/voice/proof-trends";
3935
4091
  const routes = new Elysia({
@@ -3972,7 +4128,7 @@ var DEFAULT_LINKS2 = [
3972
4128
  { href: "/voice/proof-trends", label: "Trend page" },
3973
4129
  { href: "/api/voice/proof-trends", label: "Trend JSON" }
3974
4130
  ];
3975
- 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;");
3976
4132
  var formatMs = (value) => typeof value === "number" && Number.isFinite(value) ? `${Math.round(value)}ms` : "n/a";
3977
4133
  var statusLabel = (report) => {
3978
4134
  if (!report) {
@@ -4022,19 +4178,19 @@ var createVoiceProofTrendsViewModel = (snapshot, options = {}) => {
4022
4178
  var renderVoiceProofTrendsHTML = (snapshot, options = {}) => {
4023
4179
  const model = createVoiceProofTrendsViewModel(snapshot, options);
4024
4180
  const metrics = model.metrics.length ? `<div class="absolute-voice-proof-trends__metrics">${model.metrics.map((metric) => `<article>
4025
- <span>${escapeHtml3(metric.label)}</span>
4026
- <strong>${escapeHtml3(metric.value)}</strong>
4027
- </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>`;
4028
- 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>` : "";
4029
- 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)}">
4030
4186
  <header class="absolute-voice-proof-trends__header">
4031
- <span class="absolute-voice-proof-trends__eyebrow">${escapeHtml3(model.title)}</span>
4032
- <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>
4033
4189
  </header>
4034
- <p class="absolute-voice-proof-trends__description">${escapeHtml3(model.description)}</p>
4190
+ <p class="absolute-voice-proof-trends__description">${escapeHtml4(model.description)}</p>
4035
4191
  ${metrics}
4036
4192
  ${links}
4037
- ${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>` : ""}
4038
4194
  </section>`;
4039
4195
  };
4040
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}`;
@@ -4080,7 +4236,7 @@ var DEFAULT_LINKS3 = [
4080
4236
  { href: "/production-readiness", label: "Readiness page" },
4081
4237
  { href: "/voice/slo-readiness-thresholds", label: "Gate thresholds" }
4082
4238
  ];
4083
- 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;");
4084
4240
  var formatExplanationValue = (value, unit) => {
4085
4241
  if (value === undefined || value === null) {
4086
4242
  return "n/a";
@@ -4121,23 +4277,23 @@ var createVoiceReadinessFailuresViewModel = (snapshot, options = {}) => {
4121
4277
  };
4122
4278
  var renderVoiceReadinessFailuresHTML = (snapshot, options = {}) => {
4123
4279
  const model = createVoiceReadinessFailuresViewModel(snapshot, options);
4124
- 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)}">
4125
- <span>${escapeHtml4(failure.status.toUpperCase())}</span>
4126
- <strong>${escapeHtml4(failure.label)}</strong>
4127
- <p>Observed ${escapeHtml4(failure.observed)} against ${escapeHtml4(failure.thresholdLabel)} ${escapeHtml4(failure.threshold)}.</p>
4128
- <p>${escapeHtml4(failure.remediation)}</p>
4129
- <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>
4130
- </article>`).join("")}</div>` : `<p class="absolute-voice-readiness-failures__empty">${model.error ? escapeHtml4(model.error) : "No calibrated readiness gate explanations are open."}</p>`;
4131
- 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>` : "";
4132
- 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)}">
4133
4289
  <header class="absolute-voice-readiness-failures__header">
4134
- <span class="absolute-voice-readiness-failures__eyebrow">${escapeHtml4(model.title)}</span>
4135
- <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>
4136
4292
  </header>
4137
- <p class="absolute-voice-readiness-failures__description">${escapeHtml4(model.description)}</p>
4293
+ <p class="absolute-voice-readiness-failures__description">${escapeHtml5(model.description)}</p>
4138
4294
  ${failures}
4139
4295
  ${links}
4140
- ${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>` : ""}
4141
4297
  </section>`;
4142
4298
  };
4143
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}`;
@@ -4179,7 +4335,7 @@ var defineVoiceReadinessFailuresElement = (tagName = "absolute-voice-readiness-f
4179
4335
  // src/client/opsActionCenterWidget.ts
4180
4336
  var DEFAULT_TITLE5 = "Voice Ops Action Center";
4181
4337
  var DEFAULT_DESCRIPTION5 = "Run production voice proofs and operator actions from one primitive panel.";
4182
- 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;");
4183
4339
  var createVoiceOpsActionCenterViewModel = (snapshot, options = {}) => {
4184
4340
  const status = snapshot.error ? "error" : snapshot.isRunning ? "running" : snapshot.lastResult ? "completed" : "ready";
4185
4341
  return {
@@ -4201,18 +4357,18 @@ var createVoiceOpsActionCenterViewModel = (snapshot, options = {}) => {
4201
4357
  };
4202
4358
  var renderVoiceOpsActionCenterHTML = (snapshot, options = {}) => {
4203
4359
  const model = createVoiceOpsActionCenterViewModel(snapshot, options);
4204
- const actions = model.actions.map((action) => `<button type="button" data-absolute-voice-ops-action="${escapeHtml5(action.id)}"${action.disabled ? " disabled" : ""}>
4205
- ${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)}
4206
4362
  </button>`).join("");
4207
- 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)}">
4208
4364
  <header class="absolute-voice-ops-action-center__header">
4209
- <span class="absolute-voice-ops-action-center__eyebrow">${escapeHtml5(model.title)}</span>
4210
- <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>
4211
4367
  </header>
4212
- <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>
4213
4369
  <div class="absolute-voice-ops-action-center__actions">${actions}</div>
4214
- <p class="absolute-voice-ops-action-center__result">${escapeHtml5(model.lastResultLabel)}</p>
4215
- ${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>` : ""}
4216
4372
  </section>`;
4217
4373
  };
4218
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}`;
@@ -4813,7 +4969,7 @@ var exportVoiceTrace = async (input) => {
4813
4969
  };
4814
4970
  };
4815
4971
  var toNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : 0;
4816
- 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;");
4817
4973
  var formatTraceValue = (value) => {
4818
4974
  if (value === undefined || value === null) {
4819
4975
  return "";
@@ -5093,10 +5249,10 @@ var renderVoiceTraceHTML = (events, options = {}) => {
5093
5249
  const offset = summary.startedAt === undefined ? event.at : Math.max(0, event.at - summary.startedAt);
5094
5250
  return [
5095
5251
  "<tr>",
5096
- `<td>${escapeHtml6(String(offset))}</td>`,
5097
- `<td>${escapeHtml6(event.type)}</td>`,
5098
- `<td>${escapeHtml6(event.turnId ?? "")}</td>`,
5099
- `<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>`,
5100
5256
  "</tr>"
5101
5257
  ].join("");
5102
5258
  }).join(`
@@ -5107,7 +5263,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
5107
5263
  "<head>",
5108
5264
  '<meta charset="utf-8" />',
5109
5265
  '<meta name="viewport" content="width=device-width, initial-scale=1" />',
5110
- `<title>${escapeHtml6(options.title ?? "Voice Trace")}</title>`,
5266
+ `<title>${escapeHtml7(options.title ?? "Voice Trace")}</title>`,
5111
5267
  "<style>",
5112
5268
  "body{font-family:ui-sans-serif,system-ui,sans-serif;margin:2rem;line-height:1.45;background:#f8f7f2;color:#181713}",
5113
5269
  "main{max-width:1100px;margin:auto}",
@@ -5121,7 +5277,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
5121
5277
  "</style>",
5122
5278
  "</head>",
5123
5279
  "<body><main>",
5124
- `<h1>${escapeHtml6(options.title ?? `Voice Trace ${summary.sessionId ?? ""}`.trim())}</h1>`,
5280
+ `<h1>${escapeHtml7(options.title ?? `Voice Trace ${summary.sessionId ?? ""}`.trim())}</h1>`,
5125
5281
  `<p class="${evaluation.pass ? "pass" : "fail"}">QA: ${evaluation.pass ? "pass" : "fail"}</p>`,
5126
5282
  '<section class="summary">',
5127
5283
  `<div class="card"><strong>Events</strong><br>${summary.eventCount}</div>`,
@@ -5135,7 +5291,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
5135
5291
  eventRows,
5136
5292
  "</tbody></table>",
5137
5293
  "<h2>Markdown Export</h2>",
5138
- `<pre>${escapeHtml6(markdown)}</pre>`,
5294
+ `<pre>${escapeHtml7(markdown)}</pre>`,
5139
5295
  "</main></body></html>"
5140
5296
  ].join(`
5141
5297
  `);
@@ -5491,7 +5647,7 @@ var ACTION_LABELS = {
5491
5647
  "resume-assistant": "Resume assistant",
5492
5648
  tag: "Tag"
5493
5649
  };
5494
- 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;");
5495
5651
  var createVoiceLiveOpsInput = (action, input) => ({
5496
5652
  action,
5497
5653
  assignee: input.assignee,
@@ -5502,17 +5658,17 @@ var createVoiceLiveOpsInput = (action, input) => ({
5502
5658
  var renderVoiceLiveOpsHTML = (snapshot, options = {}) => {
5503
5659
  const sessionId = options.getSessionId?.() ?? "";
5504
5660
  const disabled = snapshot.isRunning || !sessionId;
5505
- 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("");
5506
- 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>';
5507
5663
  return `<section class="absolute-voice-live-ops">
5508
5664
  <header class="absolute-voice-live-ops__header">
5509
- <span>${escapeHtml7(options.title ?? "Live Ops")}</span>
5510
- <strong>${escapeHtml7(sessionId || "No active session")}</strong>
5665
+ <span>${escapeHtml8(options.title ?? "Live Ops")}</span>
5666
+ <strong>${escapeHtml8(sessionId || "No active session")}</strong>
5511
5667
  </header>
5512
- <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>
5513
- <label><span>Operator</span><input data-absolute-voice-live-ops-assignee value="${escapeHtml7(options.defaultAssignee ?? "operator")}" /></label>
5514
- <label><span>Tag / handoff target</span><input data-absolute-voice-live-ops-tag value="${escapeHtml7(options.defaultTag ?? "live-ops")}" /></label>
5515
- <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>
5516
5672
  <div class="absolute-voice-live-ops__actions">${actions}</div>
5517
5673
  ${result}
5518
5674
  </section>`;
@@ -5599,16 +5755,16 @@ var defineVoiceLiveOpsElement = (tagName = "absolute-voice-live-ops", options =
5599
5755
  });
5600
5756
  };
5601
5757
  // src/client/opsActionHistoryWidget.ts
5602
- 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;");
5603
5759
  var renderVoiceOpsActionHistoryWidgetHTML = (snapshot, options = {}) => {
5604
5760
  const report = snapshot.report;
5605
5761
  const entries = (report?.entries ?? []).slice(0, options.limit ?? 5);
5606
- 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("");
5607
5763
  return `<section class="absolute-voice-ops-action-history">
5608
- <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>
5609
5765
  <p>${String(report?.total ?? 0)} action(s), ${String(report?.failed ?? 0)} failed.</p>
5610
5766
  <ul>${rows || "<li>No operator actions recorded yet.</li>"}</ul>
5611
- ${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>` : ""}
5612
5768
  </section>`;
5613
5769
  };
5614
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}`;
@@ -5631,7 +5787,7 @@ var mountVoiceOpsActionHistory = (element, path = "/api/voice/ops-actions/histor
5631
5787
  // src/client/deliveryRuntimeWidget.ts
5632
5788
  var DEFAULT_TITLE6 = "Voice Delivery Runtime";
5633
5789
  var DEFAULT_DESCRIPTION6 = "Audit and trace delivery worker health from your AbsoluteJS voice app.";
5634
- 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;");
5635
5791
  var createSurface = (id, summary) => {
5636
5792
  if (!summary) {
5637
5793
  return {
@@ -5680,26 +5836,26 @@ var createVoiceDeliveryRuntimeViewModel = (snapshot, options = {}) => {
5680
5836
  };
5681
5837
  var renderVoiceDeliveryRuntimeHTML = (snapshot, options = {}) => {
5682
5838
  const model = createVoiceDeliveryRuntimeViewModel(snapshot, options);
5683
- const surfaces = model.surfaces.map((surface) => `<li class="absolute-voice-delivery-runtime__surface absolute-voice-delivery-runtime__surface--${escapeHtml9(surface.status)}">
5684
- <span>${escapeHtml9(surface.label)}</span>
5685
- <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>
5686
5842
  <small>${String(surface.failed)} failed &middot; ${String(surface.deadLettered)} dead-lettered</small>
5687
5843
  </li>`).join("");
5688
5844
  const actions = options.includeActions === false ? "" : `<div class="absolute-voice-delivery-runtime__actions">
5689
5845
  <button type="button" data-absolute-voice-delivery-runtime-action="tick">${model.actionStatus === "running" ? "Working..." : "Tick workers"}</button>
5690
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>
5691
5847
  </div>`;
5692
- const actionError = model.actionError ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml9(model.actionError)}</p>` : "";
5693
- 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)}">
5694
5850
  <header class="absolute-voice-delivery-runtime__header">
5695
- <span class="absolute-voice-delivery-runtime__eyebrow">${escapeHtml9(model.title)}</span>
5696
- <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>
5697
5853
  </header>
5698
- <p class="absolute-voice-delivery-runtime__description">${escapeHtml9(model.description)}</p>
5854
+ <p class="absolute-voice-delivery-runtime__description">${escapeHtml10(model.description)}</p>
5699
5855
  <ul class="absolute-voice-delivery-runtime__surfaces">${surfaces}</ul>
5700
5856
  ${actions}
5701
5857
  ${actionError}
5702
- ${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>` : ""}
5703
5859
  </section>`;
5704
5860
  };
5705
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}`;
@@ -5837,7 +5993,7 @@ var createVoiceRoutingStatusStore = (path = "/api/routing/latest", options = {})
5837
5993
  // src/client/routingStatusWidget.ts
5838
5994
  var DEFAULT_TITLE7 = "Voice Routing";
5839
5995
  var DEFAULT_DESCRIPTION7 = "Latest provider routing decision from the self-hosted trace store.";
5840
- 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;");
5841
5997
  var formatValue = (value, fallback = "None") => typeof value === "string" && value.trim() ? value : typeof value === "number" && Number.isFinite(value) ? String(value) : fallback;
5842
5998
  var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
5843
5999
  const decision = snapshot.decision;
@@ -5874,17 +6030,17 @@ var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
5874
6030
  var renderVoiceRoutingStatusHTML = (snapshot, options = {}) => {
5875
6031
  const model = createVoiceRoutingStatusViewModel(snapshot, options);
5876
6032
  const rows = model.rows.length ? `<div class="absolute-voice-routing-status__grid">${model.rows.map((row) => `<div>
5877
- <span>${escapeHtml10(row.label)}</span>
5878
- <strong>${escapeHtml10(row.value)}</strong>
6033
+ <span>${escapeHtml11(row.label)}</span>
6034
+ <strong>${escapeHtml11(row.value)}</strong>
5879
6035
  </div>`).join("")}</div>` : '<p class="absolute-voice-routing-status__empty">Start a voice session to see the selected provider.</p>';
5880
- 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)}">
5881
6037
  <header class="absolute-voice-routing-status__header">
5882
- <span class="absolute-voice-routing-status__eyebrow">${escapeHtml10(model.title)}</span>
5883
- <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>
5884
6040
  </header>
5885
- <p class="absolute-voice-routing-status__description">${escapeHtml10(model.description)}</p>
6041
+ <p class="absolute-voice-routing-status__description">${escapeHtml11(model.description)}</p>
5886
6042
  ${rows}
5887
- ${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>` : ""}
5888
6044
  </section>`;
5889
6045
  };
5890
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}`;
@@ -6683,7 +6839,7 @@ var createVoiceProviderSimulationControlsStore = (options) => {
6683
6839
  };
6684
6840
  };
6685
6841
  // src/client/providerSimulationControlsWidget.ts
6686
- 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;");
6687
6843
  var formatKind = (kind) => (kind ?? "stt").toUpperCase();
6688
6844
  var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
6689
6845
  const configuredProviders = options.providers.filter((provider) => provider.configured !== false);
@@ -6703,18 +6859,18 @@ var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
6703
6859
  };
6704
6860
  var renderVoiceProviderSimulationControlsHTML = (snapshot, options) => {
6705
6861
  const model = createVoiceProviderSimulationControlsViewModel(snapshot, options);
6706
- 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("");
6707
- 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("");
6708
6864
  return `<section class="absolute-voice-provider-simulation absolute-voice-provider-simulation--${snapshot.error ? "error" : snapshot.isRunning ? "running" : "ready"}">
6709
6865
  <header class="absolute-voice-provider-simulation__header">
6710
- <span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml11(model.title)}</span>
6711
- <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>
6712
6868
  </header>
6713
- <p class="absolute-voice-provider-simulation__description">${escapeHtml11(model.description)}</p>
6714
- ${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>`}
6715
6871
  <div class="absolute-voice-provider-simulation__actions">${failureButtons}${recoveryButtons}</div>
6716
- ${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml11(snapshot.error)}</p>` : ""}
6717
- ${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>` : ""}
6718
6874
  </section>`;
6719
6875
  };
6720
6876
  var bindVoiceProviderSimulationControls = (element, store) => {
@@ -6781,7 +6937,7 @@ var defineVoiceProviderSimulationControlsElement = (tagName = "absolute-voice-pr
6781
6937
  // src/client/providerStatusWidget.ts
6782
6938
  var DEFAULT_TITLE8 = "Voice Providers";
6783
6939
  var DEFAULT_DESCRIPTION8 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
6784
- 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;");
6785
6941
  var formatProvider = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
6786
6942
  var formatStatus2 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
6787
6943
  var formatLatency = (value) => typeof value === "number" ? `${value}ms` : "No samples";
@@ -6837,25 +6993,25 @@ var createVoiceProviderStatusViewModel = (snapshot, options = {}) => {
6837
6993
  };
6838
6994
  var renderVoiceProviderStatusHTML = (snapshot, options = {}) => {
6839
6995
  const model = createVoiceProviderStatusViewModel(snapshot, options);
6840
- 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)}">
6841
6997
  <header>
6842
- <strong>${escapeHtml12(provider.label)}</strong>
6843
- <span>${escapeHtml12(formatStatus2(provider.status))}</span>
6998
+ <strong>${escapeHtml13(provider.label)}</strong>
6999
+ <span>${escapeHtml13(formatStatus2(provider.status))}</span>
6844
7000
  </header>
6845
- <p>${escapeHtml12(provider.detail)}</p>
7001
+ <p>${escapeHtml13(provider.detail)}</p>
6846
7002
  <dl>${provider.rows.map((row) => `<div>
6847
- <dt>${escapeHtml12(row.label)}</dt>
6848
- <dd>${escapeHtml12(row.value)}</dd>
7003
+ <dt>${escapeHtml13(row.label)}</dt>
7004
+ <dd>${escapeHtml13(row.value)}</dd>
6849
7005
  </div>`).join("")}</dl>
6850
7006
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-status__empty">Run voice traffic to see provider health.</p>';
6851
- 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)}">
6852
7008
  <header class="absolute-voice-provider-status__header">
6853
- <span class="absolute-voice-provider-status__eyebrow">${escapeHtml12(model.title)}</span>
6854
- <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>
6855
7011
  </header>
6856
- <p class="absolute-voice-provider-status__description">${escapeHtml12(model.description)}</p>
7012
+ <p class="absolute-voice-provider-status__description">${escapeHtml13(model.description)}</p>
6857
7013
  ${providers}
6858
- ${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>` : ""}
6859
7015
  </section>`;
6860
7016
  };
6861
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}`;
@@ -6898,7 +7054,7 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
6898
7054
  // src/client/providerCapabilitiesWidget.ts
6899
7055
  var DEFAULT_TITLE9 = "Provider Capabilities";
6900
7056
  var DEFAULT_DESCRIPTION9 = "Configured, selected, and healthy voice providers for this deployment.";
6901
- 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;");
6902
7058
  var formatProvider2 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
6903
7059
  var formatKind2 = (kind) => kind.toUpperCase();
6904
7060
  var formatStatus3 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
@@ -6953,25 +7109,25 @@ var createVoiceProviderCapabilitiesViewModel = (snapshot, options = {}) => {
6953
7109
  };
6954
7110
  var renderVoiceProviderCapabilitiesHTML = (snapshot, options = {}) => {
6955
7111
  const model = createVoiceProviderCapabilitiesViewModel(snapshot, options);
6956
- 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)}">
6957
7113
  <header>
6958
- <strong>${escapeHtml13(capability.label)}</strong>
6959
- <span>${escapeHtml13(formatStatus3(capability.status))}</span>
7114
+ <strong>${escapeHtml14(capability.label)}</strong>
7115
+ <span>${escapeHtml14(formatStatus3(capability.status))}</span>
6960
7116
  </header>
6961
- <p>${escapeHtml13(capability.detail)}</p>
7117
+ <p>${escapeHtml14(capability.detail)}</p>
6962
7118
  <dl>${capability.rows.map((row) => `<div>
6963
- <dt>${escapeHtml13(row.label)}</dt>
6964
- <dd>${escapeHtml13(row.value)}</dd>
7119
+ <dt>${escapeHtml14(row.label)}</dt>
7120
+ <dd>${escapeHtml14(row.value)}</dd>
6965
7121
  </div>`).join("")}</dl>
6966
7122
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-capabilities__empty">Configure provider capabilities to see deployment coverage.</p>';
6967
- 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)}">
6968
7124
  <header class="absolute-voice-provider-capabilities__header">
6969
- <span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml13(model.title)}</span>
6970
- <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>
6971
7127
  </header>
6972
- <p class="absolute-voice-provider-capabilities__description">${escapeHtml13(model.description)}</p>
7128
+ <p class="absolute-voice-provider-capabilities__description">${escapeHtml14(model.description)}</p>
6973
7129
  ${capabilities}
6974
- ${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>` : ""}
6975
7131
  </section>`;
6976
7132
  };
6977
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}`;
@@ -7014,7 +7170,7 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
7014
7170
  // src/client/providerContractsWidget.ts
7015
7171
  var DEFAULT_TITLE10 = "Provider Contracts";
7016
7172
  var DEFAULT_DESCRIPTION10 = "Production contract coverage for provider env, latency, fallback, streaming, and capabilities.";
7017
- 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;");
7018
7174
  var formatProvider3 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
7019
7175
  var formatStatus4 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
7020
7176
  var contractDetail = (row) => {
@@ -7058,26 +7214,26 @@ var createVoiceProviderContractsViewModel = (snapshot, options = {}) => {
7058
7214
  };
7059
7215
  var renderVoiceProviderContractsHTML = (snapshot, options = {}) => {
7060
7216
  const model = createVoiceProviderContractsViewModel(snapshot, options);
7061
- 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)}">
7062
7218
  <header>
7063
- <strong>${escapeHtml14(row.label)}</strong>
7064
- <span>${escapeHtml14(formatStatus4(row.status))}</span>
7219
+ <strong>${escapeHtml15(row.label)}</strong>
7220
+ <span>${escapeHtml15(formatStatus4(row.status))}</span>
7065
7221
  </header>
7066
- <p>${escapeHtml14(row.detail)}</p>
7067
- ${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>` : ""}
7068
7224
  <dl>${row.rows.map((item) => `<div>
7069
- <dt>${escapeHtml14(item.label)}</dt>
7070
- <dd>${escapeHtml14(item.value)}</dd>
7225
+ <dt>${escapeHtml15(item.label)}</dt>
7226
+ <dd>${escapeHtml15(item.value)}</dd>
7071
7227
  </div>`).join("")}</dl>
7072
7228
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-contracts__empty">Configure provider contracts to see production coverage.</p>';
7073
- 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)}">
7074
7230
  <header class="absolute-voice-provider-contracts__header">
7075
- <span class="absolute-voice-provider-contracts__eyebrow">${escapeHtml14(model.title)}</span>
7076
- <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>
7077
7233
  </header>
7078
- <p class="absolute-voice-provider-contracts__description">${escapeHtml14(model.description)}</p>
7234
+ <p class="absolute-voice-provider-contracts__description">${escapeHtml15(model.description)}</p>
7079
7235
  ${rows}
7080
- ${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>` : ""}
7081
7237
  </section>`;
7082
7238
  };
7083
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}`;
@@ -7120,7 +7276,7 @@ var defineVoiceProviderContractsElement = (tagName = "absolute-voice-provider-co
7120
7276
  // src/client/turnQualityWidget.ts
7121
7277
  var DEFAULT_TITLE11 = "Turn Quality";
7122
7278
  var DEFAULT_DESCRIPTION11 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
7123
- 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;");
7124
7280
  var formatConfidence = (value) => typeof value === "number" ? `${Math.round(value * 100)}%` : "n/a";
7125
7281
  var formatMaybe = (value) => value === undefined || value === "" ? "n/a" : String(value);
7126
7282
  var getTurnDetail = (turn) => {
@@ -7170,25 +7326,25 @@ var createVoiceTurnQualityViewModel = (snapshot, options = {}) => {
7170
7326
  };
7171
7327
  var renderVoiceTurnQualityHTML = (snapshot, options = {}) => {
7172
7328
  const model = createVoiceTurnQualityViewModel(snapshot, options);
7173
- 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)}">
7174
7330
  <header>
7175
- <strong>${escapeHtml15(turn.label)}</strong>
7176
- <span>${escapeHtml15(turn.status)}</span>
7331
+ <strong>${escapeHtml16(turn.label)}</strong>
7332
+ <span>${escapeHtml16(turn.status)}</span>
7177
7333
  </header>
7178
- <p>${escapeHtml15(turn.detail)}</p>
7334
+ <p>${escapeHtml16(turn.detail)}</p>
7179
7335
  <dl>${turn.rows.map((row) => `<div>
7180
- <dt>${escapeHtml15(row.label)}</dt>
7181
- <dd>${escapeHtml15(row.value)}</dd>
7336
+ <dt>${escapeHtml16(row.label)}</dt>
7337
+ <dd>${escapeHtml16(row.value)}</dd>
7182
7338
  </div>`).join("")}</dl>
7183
7339
  </article>`).join("")}</div>` : '<p class="absolute-voice-turn-quality__empty">Complete a voice turn to see STT quality diagnostics.</p>';
7184
- 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)}">
7185
7341
  <header class="absolute-voice-turn-quality__header">
7186
- <span class="absolute-voice-turn-quality__eyebrow">${escapeHtml15(model.title)}</span>
7187
- <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>
7188
7344
  </header>
7189
- <p class="absolute-voice-turn-quality__description">${escapeHtml15(model.description)}</p>
7345
+ <p class="absolute-voice-turn-quality__description">${escapeHtml16(model.description)}</p>
7190
7346
  ${turns}
7191
- ${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>` : ""}
7192
7348
  </section>`;
7193
7349
  };
7194
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}`;
@@ -7232,7 +7388,7 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
7232
7388
  var DEFAULT_TITLE12 = "Turn Latency";
7233
7389
  var DEFAULT_DESCRIPTION12 = "Per-turn timing from first transcript to commit and assistant response start.";
7234
7390
  var DEFAULT_PROOF_LABEL = "Run latency proof";
7235
- 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;");
7236
7392
  var formatMs2 = (value) => typeof value === "number" ? `${Math.round(value)}ms` : "n/a";
7237
7393
  var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
7238
7394
  const turns = (snapshot.report?.turns ?? []).map((turn) => ({
@@ -7260,25 +7416,25 @@ var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
7260
7416
  };
7261
7417
  var renderVoiceTurnLatencyHTML = (snapshot, options = {}) => {
7262
7418
  const model = createVoiceTurnLatencyViewModel(snapshot, options);
7263
- 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)}">
7264
7420
  <header>
7265
- <strong>${escapeHtml16(turn.label)}</strong>
7266
- <span>${escapeHtml16(turn.status)}</span>
7421
+ <strong>${escapeHtml17(turn.label)}</strong>
7422
+ <span>${escapeHtml17(turn.status)}</span>
7267
7423
  </header>
7268
7424
  <dl>${turn.rows.map((row) => `<div>
7269
- <dt>${escapeHtml16(row.label)}</dt>
7270
- <dd>${escapeHtml16(row.value)}</dd>
7425
+ <dt>${escapeHtml17(row.label)}</dt>
7426
+ <dd>${escapeHtml17(row.value)}</dd>
7271
7427
  </div>`).join("")}</dl>
7272
7428
  </article>`).join("")}</div>` : '<p class="absolute-voice-turn-latency__empty">Complete a voice turn to see latency diagnostics.</p>';
7273
- 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)}">
7274
7430
  <header class="absolute-voice-turn-latency__header">
7275
- <span class="absolute-voice-turn-latency__eyebrow">${escapeHtml16(model.title)}</span>
7276
- <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>
7277
7433
  </header>
7278
- <p class="absolute-voice-turn-latency__description">${escapeHtml16(model.description)}</p>
7279
- ${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>` : ""}
7280
7436
  ${turns}
7281
- ${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>` : ""}
7282
7438
  </section>`;
7283
7439
  };
7284
7440
  var mountVoiceTurnLatency = (element, path = "/api/turn-latency", options = {}) => {
@@ -7330,7 +7486,7 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
7330
7486
  // src/client/traceTimelineWidget.ts
7331
7487
  var DEFAULT_TITLE13 = "Voice Traces";
7332
7488
  var DEFAULT_DESCRIPTION13 = "Latest call timelines with provider latency, fallbacks, handoffs, and errors from your self-hosted trace store.";
7333
- 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;");
7334
7490
  var formatMs3 = (value) => typeof value === "number" ? `${value}ms` : "n/a";
7335
7491
  var formatProviders = (session) => session.providers.length ? session.providers.map((provider) => provider.provider).join(", ") : "No providers";
7336
7492
  var createVoiceTraceTimelineViewModel = (snapshot, options = {}) => {
@@ -7360,27 +7516,27 @@ var renderVoiceTraceTimelineWidgetHTML = (snapshot, options = {}) => {
7360
7516
  const model = createVoiceTraceTimelineViewModel(snapshot, options);
7361
7517
  const sessions = model.sessions.length ? `<div class="absolute-voice-trace-timeline__sessions">${model.sessions.map((session) => {
7362
7518
  const supportLinks = [
7363
- `<a href="${escapeHtml17(session.detailHref)}">Open timeline</a>`,
7364
- session.operationsRecordHref ? `<a href="${escapeHtml17(session.operationsRecordHref)}">Open operations record</a>` : undefined,
7365
- 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
7366
7522
  ].filter(Boolean).join("");
7367
- 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)}">
7368
7524
  <header>
7369
- <strong>${escapeHtml17(session.sessionId)}</strong>
7370
- <span>${escapeHtml17(session.status)}</span>
7525
+ <strong>${escapeHtml18(session.sessionId)}</strong>
7526
+ <span>${escapeHtml18(session.status)}</span>
7371
7527
  </header>
7372
- <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>
7373
7529
  <p class="absolute-voice-trace-timeline__actions">${supportLinks}</p>
7374
7530
  </article>`;
7375
7531
  }).join("")}</div>` : '<p class="absolute-voice-trace-timeline__empty">Run a voice session to see call timelines.</p>';
7376
- 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)}">
7377
7533
  <header class="absolute-voice-trace-timeline__header">
7378
- <span class="absolute-voice-trace-timeline__eyebrow">${escapeHtml17(model.title)}</span>
7379
- <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>
7380
7536
  </header>
7381
- <p class="absolute-voice-trace-timeline__description">${escapeHtml17(model.description)}</p>
7537
+ <p class="absolute-voice-trace-timeline__description">${escapeHtml18(model.description)}</p>
7382
7538
  ${sessions}
7383
- ${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>` : ""}
7384
7540
  </section>`;
7385
7541
  };
7386
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}`;
@@ -7428,7 +7584,7 @@ var defineVoiceTraceTimelineElement = (tagName = "absolute-voice-trace-timeline"
7428
7584
  // src/client/agentSquadStatusWidget.ts
7429
7585
  var DEFAULT_TITLE14 = "Voice Agent Squad";
7430
7586
  var DEFAULT_DESCRIPTION14 = "Current specialist and recent handoffs from your self-hosted voice traces.";
7431
- 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;");
7432
7588
  var labelFor = (current) => {
7433
7589
  if (!current)
7434
7590
  return "Waiting for specialist activity";
@@ -7455,24 +7611,24 @@ var renderVoiceAgentSquadStatusHTML = (snapshot, options = {}) => {
7455
7611
  const model = createVoiceAgentSquadStatusViewModel(snapshot, options);
7456
7612
  const current = model.current;
7457
7613
  const rows = model.sessions.length ? model.sessions.slice(0, 5).map((session) => `<li>
7458
- <span>${escapeHtml18(session.sessionId)}</span>
7459
- <strong>${escapeHtml18(session.targetAgentId ?? "none")}</strong>
7460
- <em>${escapeHtml18(session.status)}</em>
7461
- ${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>` : ""}
7462
7618
  </li>`).join("") : "<li><span>No squad traces yet.</span><strong>Waiting</strong></li>";
7463
7619
  return `<section class="absolute-voice-agent-squad-status">
7464
7620
  <header>
7465
- <span>${escapeHtml18(model.title)}</span>
7466
- <strong>${escapeHtml18(model.label)}</strong>
7621
+ <span>${escapeHtml19(model.title)}</span>
7622
+ <strong>${escapeHtml19(model.label)}</strong>
7467
7623
  </header>
7468
- <p>${escapeHtml18(model.description)}</p>
7624
+ <p>${escapeHtml19(model.description)}</p>
7469
7625
  <div>
7470
- <span>Session</span><strong>${escapeHtml18(current?.sessionId ?? "n/a")}</strong>
7471
- <span>From</span><strong>${escapeHtml18(current?.fromAgentId ?? "n/a")}</strong>
7472
- <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>
7473
7629
  </div>
7474
7630
  <ul>${rows}</ul>
7475
- ${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>` : ""}
7476
7632
  </section>`;
7477
7633
  };
7478
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}`;