@absolutejs/voice 0.0.22-beta.507 → 0.0.22-beta.508

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.
@@ -2164,6 +2164,115 @@ var createLiveCallViewer = (options) => {
2164
2164
  };
2165
2165
  };
2166
2166
 
2167
+ // src/client/liveAgentConsole.ts
2168
+ var createLiveAgentConsole = (options) => {
2169
+ const viewer = createLiveCallViewer(options);
2170
+ const recentLimit = Math.max(1, options.recentLimit ?? 12);
2171
+ let caller;
2172
+ let hasTakeover = false;
2173
+ let takeoverAt;
2174
+ let takeoverReason;
2175
+ const subscribers = new Set;
2176
+ const buildState = () => {
2177
+ const view = viewer.getState();
2178
+ return {
2179
+ caller,
2180
+ hasTakeover,
2181
+ recentTimeline: view.events.slice(-recentLimit),
2182
+ takeoverAt,
2183
+ takeoverReason,
2184
+ view
2185
+ };
2186
+ };
2187
+ const notify = () => {
2188
+ for (const subscriber of subscribers)
2189
+ subscriber();
2190
+ };
2191
+ const unsubscribeViewer = viewer.subscribe(() => {
2192
+ notify();
2193
+ });
2194
+ if (options.resolveCaller) {
2195
+ Promise.resolve(options.resolveCaller()).then((snapshot) => {
2196
+ caller = snapshot;
2197
+ notify();
2198
+ });
2199
+ }
2200
+ return {
2201
+ getState: buildState,
2202
+ noteAgentAudio: (at) => viewer.noteAgentAudio(at),
2203
+ notePartial: (text, at) => viewer.notePartial(text, at),
2204
+ noteTranscript: (text, at) => viewer.noteTranscript(text, at),
2205
+ releaseTakeover: () => {
2206
+ if (!hasTakeover)
2207
+ return;
2208
+ hasTakeover = false;
2209
+ takeoverAt = undefined;
2210
+ takeoverReason = undefined;
2211
+ viewer.applyControl({ reason: "released", type: "takeover.release" });
2212
+ notify();
2213
+ },
2214
+ setCaller: (snapshot) => {
2215
+ caller = snapshot;
2216
+ notify();
2217
+ },
2218
+ subscribe: (listener) => {
2219
+ subscribers.add(listener);
2220
+ return () => {
2221
+ subscribers.delete(listener);
2222
+ if (subscribers.size === 0)
2223
+ unsubscribeViewer();
2224
+ };
2225
+ },
2226
+ takeover: (reason) => {
2227
+ if (hasTakeover)
2228
+ return;
2229
+ hasTakeover = true;
2230
+ takeoverAt = Date.now();
2231
+ takeoverReason = reason;
2232
+ viewer.applyControl({ reason, type: "takeover.engaged" });
2233
+ notify();
2234
+ },
2235
+ viewer
2236
+ };
2237
+ };
2238
+
2239
+ // src/svelte/createVoiceLiveAgentConsole.ts
2240
+ var escapeHtml3 = (text) => text.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2241
+ var renderVoiceLiveAgentConsoleHTML = (state, options = {}) => {
2242
+ const title = options.title ?? "Live agent console";
2243
+ const buttonLabel = options.takeoverButtonLabel ?? "Take over";
2244
+ const callerBlock = state.caller ? `<div style="background:rgba(255,255,255,0.06);border-radius:12px;font-size:13px;margin:0 0 12px;padding:12px;">
2245
+ <div style="font-size:11px;opacity:0.7;text-transform:uppercase;">Caller</div>
2246
+ <div style="margin-top:4px;">${escapeHtml3(state.caller.summary)}</div>
2247
+ </div>` : "";
2248
+ const button = state.hasTakeover ? `<button type="button" data-action="release" style="background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.18);border-radius:12px;color:#f8fafc;cursor:pointer;font-size:13px;padding:8px 14px;">Release back to agent</button>` : `<button type="button" data-action="takeover" style="background:#ef4444;border:none;border-radius:12px;color:#f8fafc;cursor:pointer;font-size:13px;padding:8px 14px;">${escapeHtml3(buttonLabel)}</button>`;
2249
+ const items = state.recentTimeline.map((event) => `<li style="align-items:center;display:flex;font-size:13px;gap:12px;padding-left:8px;">
2250
+ <strong>${escapeHtml3(event.title)}</strong>
2251
+ ${event.detail ? `<span style="opacity:0.85;">${escapeHtml3(event.detail)}</span>` : ""}
2252
+ </li>`).join("");
2253
+ return `<section aria-label="voice-live-agent-console" class="absolute-voice-live-agent-console" data-takeover="${state.hasTakeover ? "true" : "false"}" style="background:#0f172a;border-radius:16px;color:#f8fafc;font-family:ui-sans-serif,system-ui,sans-serif;padding:20px;">
2254
+ <header style="align-items:center;display:flex;gap:12px;margin-bottom:12px;">
2255
+ <strong style="font-size:16px;">${escapeHtml3(title)}</strong>
2256
+ <span style="background:${state.hasTakeover ? "rgba(239,68,68,0.18)" : "rgba(59,130,246,0.18)"};border-radius:999px;font-size:11px;padding:3px 10px;text-transform:uppercase;">${state.hasTakeover ? "Human" : "Agent"}</span>
2257
+ <span style="font-size:13px;margin-left:auto;opacity:0.7;">${escapeHtml3(state.view.sessionId)}</span>
2258
+ </header>
2259
+ ${callerBlock}
2260
+ <div style="display:flex;gap:10px;margin-bottom:12px;">${button}</div>
2261
+ <ol style="display:flex;flex-direction:column;gap:6px;list-style:none;margin:0;max-height:260px;overflow-y:auto;padding:0;">${items}</ol>
2262
+ </section>`;
2263
+ };
2264
+ var createVoiceLiveAgentConsole = (options) => {
2265
+ const console = createLiveAgentConsole(options);
2266
+ return {
2267
+ ...console,
2268
+ getHTML: () => renderVoiceLiveAgentConsoleHTML(console.getState(), {
2269
+ takeoverButtonLabel: options.takeoverButtonLabel,
2270
+ title: options.title
2271
+ }),
2272
+ takeoverButtonLabel: options.takeoverButtonLabel ?? "Take over",
2273
+ title: options.title ?? "Live agent console"
2274
+ };
2275
+ };
2167
2276
  // src/svelte/createVoiceLiveCallViewer.ts
2168
2277
  var escape2 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2169
2278
  var CATEGORY_COLOR = {
@@ -2434,7 +2543,7 @@ var createVoiceDeliveryRuntimeStore = (path = "/api/voice-delivery-runtime", opt
2434
2543
  // src/client/deliveryRuntimeWidget.ts
2435
2544
  var DEFAULT_TITLE = "Voice Delivery Runtime";
2436
2545
  var DEFAULT_DESCRIPTION = "Audit and trace delivery worker health from your AbsoluteJS voice app.";
2437
- var escapeHtml3 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2546
+ var escapeHtml4 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2438
2547
  var createSurface = (id, summary) => {
2439
2548
  if (!summary) {
2440
2549
  return {
@@ -2483,26 +2592,26 @@ var createVoiceDeliveryRuntimeViewModel = (snapshot, options = {}) => {
2483
2592
  };
2484
2593
  var renderVoiceDeliveryRuntimeHTML = (snapshot, options = {}) => {
2485
2594
  const model = createVoiceDeliveryRuntimeViewModel(snapshot, options);
2486
- const surfaces = model.surfaces.map((surface) => `<li class="absolute-voice-delivery-runtime__surface absolute-voice-delivery-runtime__surface--${escapeHtml3(surface.status)}">
2487
- <span>${escapeHtml3(surface.label)}</span>
2488
- <strong>${escapeHtml3(surface.detail)}</strong>
2595
+ const surfaces = model.surfaces.map((surface) => `<li class="absolute-voice-delivery-runtime__surface absolute-voice-delivery-runtime__surface--${escapeHtml4(surface.status)}">
2596
+ <span>${escapeHtml4(surface.label)}</span>
2597
+ <strong>${escapeHtml4(surface.detail)}</strong>
2489
2598
  <small>${String(surface.failed)} failed &middot; ${String(surface.deadLettered)} dead-lettered</small>
2490
2599
  </li>`).join("");
2491
2600
  const actions = options.includeActions === false ? "" : `<div class="absolute-voice-delivery-runtime__actions">
2492
2601
  <button type="button" data-absolute-voice-delivery-runtime-action="tick">${model.actionStatus === "running" ? "Working..." : "Tick workers"}</button>
2493
2602
  <button type="button" data-absolute-voice-delivery-runtime-action="requeue-dead-letters"${model.surfaces.some((surface) => surface.deadLettered > 0) ? "" : " disabled"}>Requeue dead letters</button>
2494
2603
  </div>`;
2495
- const actionError = model.actionError ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml3(model.actionError)}</p>` : "";
2496
- return `<section class="absolute-voice-delivery-runtime absolute-voice-delivery-runtime--${escapeHtml3(model.status)}">
2604
+ const actionError = model.actionError ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml4(model.actionError)}</p>` : "";
2605
+ return `<section class="absolute-voice-delivery-runtime absolute-voice-delivery-runtime--${escapeHtml4(model.status)}">
2497
2606
  <header class="absolute-voice-delivery-runtime__header">
2498
- <span class="absolute-voice-delivery-runtime__eyebrow">${escapeHtml3(model.title)}</span>
2499
- <strong class="absolute-voice-delivery-runtime__label">${escapeHtml3(model.label)}</strong>
2607
+ <span class="absolute-voice-delivery-runtime__eyebrow">${escapeHtml4(model.title)}</span>
2608
+ <strong class="absolute-voice-delivery-runtime__label">${escapeHtml4(model.label)}</strong>
2500
2609
  </header>
2501
- <p class="absolute-voice-delivery-runtime__description">${escapeHtml3(model.description)}</p>
2610
+ <p class="absolute-voice-delivery-runtime__description">${escapeHtml4(model.description)}</p>
2502
2611
  <ul class="absolute-voice-delivery-runtime__surfaces">${surfaces}</ul>
2503
2612
  ${actions}
2504
2613
  ${actionError}
2505
- ${model.error ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml3(model.error)}</p>` : ""}
2614
+ ${model.error ? `<p class="absolute-voice-delivery-runtime__error">${escapeHtml4(model.error)}</p>` : ""}
2506
2615
  </section>`;
2507
2616
  };
2508
2617
  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}`;
@@ -2767,7 +2876,7 @@ var createVoiceOpsActionCenterStore = (options = {}) => {
2767
2876
  // src/client/opsActionCenterWidget.ts
2768
2877
  var DEFAULT_TITLE2 = "Voice Ops Action Center";
2769
2878
  var DEFAULT_DESCRIPTION2 = "Run production voice proofs and operator actions from one primitive panel.";
2770
- var escapeHtml4 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2879
+ var escapeHtml5 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2771
2880
  var createVoiceOpsActionCenterViewModel = (snapshot, options = {}) => {
2772
2881
  const status = snapshot.error ? "error" : snapshot.isRunning ? "running" : snapshot.lastResult ? "completed" : "ready";
2773
2882
  return {
@@ -2789,18 +2898,18 @@ var createVoiceOpsActionCenterViewModel = (snapshot, options = {}) => {
2789
2898
  };
2790
2899
  var renderVoiceOpsActionCenterHTML = (snapshot, options = {}) => {
2791
2900
  const model = createVoiceOpsActionCenterViewModel(snapshot, options);
2792
- const actions = model.actions.map((action) => `<button type="button" data-absolute-voice-ops-action="${escapeHtml4(action.id)}"${action.disabled ? " disabled" : ""}>
2793
- ${escapeHtml4(action.isRunning ? "Working..." : action.label)}
2901
+ const actions = model.actions.map((action) => `<button type="button" data-absolute-voice-ops-action="${escapeHtml5(action.id)}"${action.disabled ? " disabled" : ""}>
2902
+ ${escapeHtml5(action.isRunning ? "Working..." : action.label)}
2794
2903
  </button>`).join("");
2795
- return `<section class="absolute-voice-ops-action-center absolute-voice-ops-action-center--${escapeHtml4(model.status)}">
2904
+ return `<section class="absolute-voice-ops-action-center absolute-voice-ops-action-center--${escapeHtml5(model.status)}">
2796
2905
  <header class="absolute-voice-ops-action-center__header">
2797
- <span class="absolute-voice-ops-action-center__eyebrow">${escapeHtml4(model.title)}</span>
2798
- <strong class="absolute-voice-ops-action-center__label">${escapeHtml4(model.label)}</strong>
2906
+ <span class="absolute-voice-ops-action-center__eyebrow">${escapeHtml5(model.title)}</span>
2907
+ <strong class="absolute-voice-ops-action-center__label">${escapeHtml5(model.label)}</strong>
2799
2908
  </header>
2800
- <p class="absolute-voice-ops-action-center__description">${escapeHtml4(model.description)}</p>
2909
+ <p class="absolute-voice-ops-action-center__description">${escapeHtml5(model.description)}</p>
2801
2910
  <div class="absolute-voice-ops-action-center__actions">${actions}</div>
2802
- <p class="absolute-voice-ops-action-center__result">${escapeHtml4(model.lastResultLabel)}</p>
2803
- ${model.error ? `<p class="absolute-voice-ops-action-center__error">${escapeHtml4(model.error)}</p>` : ""}
2911
+ <p class="absolute-voice-ops-action-center__result">${escapeHtml5(model.lastResultLabel)}</p>
2912
+ ${model.error ? `<p class="absolute-voice-ops-action-center__error">${escapeHtml5(model.error)}</p>` : ""}
2804
2913
  </section>`;
2805
2914
  };
2806
2915
  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}`;
@@ -3629,7 +3738,7 @@ var exportVoiceTrace = async (input) => {
3629
3738
  };
3630
3739
  };
3631
3740
  var toNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : 0;
3632
- var escapeHtml5 = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
3741
+ var escapeHtml6 = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
3633
3742
  var formatTraceValue = (value) => {
3634
3743
  if (value === undefined || value === null) {
3635
3744
  return "";
@@ -3913,10 +4022,10 @@ var renderVoiceTraceHTML = (events, options = {}) => {
3913
4022
  const offset = summary.startedAt === undefined ? event.at : Math.max(0, event.at - summary.startedAt);
3914
4023
  return [
3915
4024
  "<tr>",
3916
- `<td>${escapeHtml5(String(offset))}</td>`,
3917
- `<td>${escapeHtml5(event.type)}</td>`,
3918
- `<td>${escapeHtml5(event.turnId ?? "")}</td>`,
3919
- `<td><code>${escapeHtml5(JSON.stringify(event.payload))}</code></td>`,
4025
+ `<td>${escapeHtml6(String(offset))}</td>`,
4026
+ `<td>${escapeHtml6(event.type)}</td>`,
4027
+ `<td>${escapeHtml6(event.turnId ?? "")}</td>`,
4028
+ `<td><code>${escapeHtml6(JSON.stringify(event.payload))}</code></td>`,
3920
4029
  "</tr>"
3921
4030
  ].join("");
3922
4031
  }).join(`
@@ -3927,7 +4036,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
3927
4036
  "<head>",
3928
4037
  '<meta charset="utf-8" />',
3929
4038
  '<meta name="viewport" content="width=device-width, initial-scale=1" />',
3930
- `<title>${escapeHtml5(options.title ?? "Voice Trace")}</title>`,
4039
+ `<title>${escapeHtml6(options.title ?? "Voice Trace")}</title>`,
3931
4040
  "<style>",
3932
4041
  "body{font-family:ui-sans-serif,system-ui,sans-serif;margin:2rem;line-height:1.45;background:#f8f7f2;color:#181713}",
3933
4042
  "main{max-width:1100px;margin:auto}",
@@ -3941,7 +4050,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
3941
4050
  "</style>",
3942
4051
  "</head>",
3943
4052
  "<body><main>",
3944
- `<h1>${escapeHtml5(options.title ?? `Voice Trace ${summary.sessionId ?? ""}`.trim())}</h1>`,
4053
+ `<h1>${escapeHtml6(options.title ?? `Voice Trace ${summary.sessionId ?? ""}`.trim())}</h1>`,
3945
4054
  `<p class="${evaluation.pass ? "pass" : "fail"}">QA: ${evaluation.pass ? "pass" : "fail"}</p>`,
3946
4055
  '<section class="summary">',
3947
4056
  `<div class="card"><strong>Events</strong><br>${summary.eventCount}</div>`,
@@ -3955,7 +4064,7 @@ var renderVoiceTraceHTML = (events, options = {}) => {
3955
4064
  eventRows,
3956
4065
  "</tbody></table>",
3957
4066
  "<h2>Markdown Export</h2>",
3958
- `<pre>${escapeHtml5(markdown)}</pre>`,
4067
+ `<pre>${escapeHtml6(markdown)}</pre>`,
3959
4068
  "</main></body></html>"
3960
4069
  ].join(`
3961
4070
  `);
@@ -4311,7 +4420,7 @@ var ACTION_LABELS = {
4311
4420
  "resume-assistant": "Resume assistant",
4312
4421
  tag: "Tag"
4313
4422
  };
4314
- var escapeHtml6 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4423
+ var escapeHtml7 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4315
4424
  var createVoiceLiveOpsInput = (action, input) => ({
4316
4425
  action,
4317
4426
  assignee: input.assignee,
@@ -4322,17 +4431,17 @@ var createVoiceLiveOpsInput = (action, input) => ({
4322
4431
  var renderVoiceLiveOpsHTML = (snapshot, options = {}) => {
4323
4432
  const sessionId = options.getSessionId?.() ?? "";
4324
4433
  const disabled = snapshot.isRunning || !sessionId;
4325
- const actions = VOICE_LIVE_OPS_ACTIONS.map((action) => `<button type="button" data-absolute-voice-live-ops-action="${escapeHtml6(action)}"${disabled ? " disabled" : ""}>${escapeHtml6(snapshot.runningAction === action ? "Running..." : ACTION_LABELS[action])}</button>`).join("");
4326
- const result = snapshot.error ? `<p class="absolute-voice-live-ops__error">${escapeHtml6(snapshot.error)}</p>` : snapshot.lastResult ? `<p class="absolute-voice-live-ops__result">Recorded ${escapeHtml6(snapshot.lastResult.action)}. Control: ${escapeHtml6(snapshot.lastResult.control.status)}.</p>` : '<p class="absolute-voice-live-ops__result">No live ops action has run yet.</p>';
4434
+ 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("");
4435
+ 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>';
4327
4436
  return `<section class="absolute-voice-live-ops">
4328
4437
  <header class="absolute-voice-live-ops__header">
4329
- <span>${escapeHtml6(options.title ?? "Live Ops")}</span>
4330
- <strong>${escapeHtml6(sessionId || "No active session")}</strong>
4438
+ <span>${escapeHtml7(options.title ?? "Live Ops")}</span>
4439
+ <strong>${escapeHtml7(sessionId || "No active session")}</strong>
4331
4440
  </header>
4332
- <p class="absolute-voice-live-ops__description">${escapeHtml6(options.description ?? "Pause, resume, take over, force handoff, or inject operator instructions during a live voice session.")}</p>
4333
- <label><span>Operator</span><input data-absolute-voice-live-ops-assignee value="${escapeHtml6(options.defaultAssignee ?? "operator")}" /></label>
4334
- <label><span>Tag / handoff target</span><input data-absolute-voice-live-ops-tag value="${escapeHtml6(options.defaultTag ?? "live-ops")}" /></label>
4335
- <label><span>Detail / instruction</span><input data-absolute-voice-live-ops-detail value="${escapeHtml6(options.defaultDetail ?? "Operator marked this live session.")}" /></label>
4441
+ <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>
4442
+ <label><span>Operator</span><input data-absolute-voice-live-ops-assignee value="${escapeHtml7(options.defaultAssignee ?? "operator")}" /></label>
4443
+ <label><span>Tag / handoff target</span><input data-absolute-voice-live-ops-tag value="${escapeHtml7(options.defaultTag ?? "live-ops")}" /></label>
4444
+ <label><span>Detail / instruction</span><input data-absolute-voice-live-ops-detail value="${escapeHtml7(options.defaultDetail ?? "Operator marked this live session.")}" /></label>
4336
4445
  <div class="absolute-voice-live-ops__actions">${actions}</div>
4337
4446
  ${result}
4338
4447
  </section>`;
@@ -4520,7 +4629,7 @@ var SURFACE_LABELS = {
4520
4629
  sessions: "Sessions",
4521
4630
  workflows: "Workflows"
4522
4631
  };
4523
- var escapeHtml7 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4632
+ var escapeHtml8 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4524
4633
  var readNumber = (value, key) => value && typeof value === "object" && (key in value) ? Number(value[key] ?? 0) : 0;
4525
4634
  var surfaceDetail = (surface) => {
4526
4635
  const total = readNumber(surface, "total");
@@ -4575,24 +4684,24 @@ var createVoiceOpsStatusViewModel = (snapshot, options = {}) => {
4575
4684
  };
4576
4685
  var renderVoiceOpsStatusHTML = (snapshot, options = {}) => {
4577
4686
  const model = createVoiceOpsStatusViewModel(snapshot, options);
4578
- const surfaces = model.surfaces.length ? model.surfaces.map((surface) => `<li class="absolute-voice-ops-status__surface absolute-voice-ops-status__surface--${escapeHtml7(surface.status)}">
4579
- <span>${escapeHtml7(surface.label)}</span>
4580
- <strong>${escapeHtml7(surface.detail)}</strong>
4687
+ const surfaces = model.surfaces.length ? model.surfaces.map((surface) => `<li class="absolute-voice-ops-status__surface absolute-voice-ops-status__surface--${escapeHtml8(surface.status)}">
4688
+ <span>${escapeHtml8(surface.label)}</span>
4689
+ <strong>${escapeHtml8(surface.detail)}</strong>
4581
4690
  </li>`).join("") : '<li class="absolute-voice-ops-status__surface"><span>Status</span><strong>Waiting for first check</strong></li>';
4582
- const links = model.links.length ? `<nav class="absolute-voice-ops-status__links">${model.links.slice(0, 4).map((link) => `<a href="${escapeHtml7(link.href)}">${escapeHtml7(link.label)}</a>`).join("")}</nav>` : "";
4583
- return `<section class="absolute-voice-ops-status absolute-voice-ops-status--${escapeHtml7(model.status)}">
4691
+ const links = model.links.length ? `<nav class="absolute-voice-ops-status__links">${model.links.slice(0, 4).map((link) => `<a href="${escapeHtml8(link.href)}">${escapeHtml8(link.label)}</a>`).join("")}</nav>` : "";
4692
+ return `<section class="absolute-voice-ops-status absolute-voice-ops-status--${escapeHtml8(model.status)}">
4584
4693
  <header class="absolute-voice-ops-status__header">
4585
- <span class="absolute-voice-ops-status__eyebrow">${escapeHtml7(model.title)}</span>
4586
- <strong class="absolute-voice-ops-status__label">${escapeHtml7(model.label)}</strong>
4694
+ <span class="absolute-voice-ops-status__eyebrow">${escapeHtml8(model.title)}</span>
4695
+ <strong class="absolute-voice-ops-status__label">${escapeHtml8(model.label)}</strong>
4587
4696
  </header>
4588
- <p class="absolute-voice-ops-status__description">${escapeHtml7(model.description)}</p>
4697
+ <p class="absolute-voice-ops-status__description">${escapeHtml8(model.description)}</p>
4589
4698
  <div class="absolute-voice-ops-status__summary">
4590
4699
  <span>${model.passed} passing</span>
4591
4700
  <span>${Math.max(model.total - model.passed, 0)} failing</span>
4592
4701
  <span>${model.total} checks</span>
4593
4702
  </div>
4594
4703
  <ul class="absolute-voice-ops-status__surfaces">${surfaces}</ul>
4595
- ${model.error ? `<p class="absolute-voice-ops-status__error">${escapeHtml7(model.error)}</p>` : ""}
4704
+ ${model.error ? `<p class="absolute-voice-ops-status__error">${escapeHtml8(model.error)}</p>` : ""}
4596
4705
  ${links}
4597
4706
  </section>`;
4598
4707
  };
@@ -4989,7 +5098,7 @@ var createVoiceCallDebuggerStore = (path, options = {}) => {
4989
5098
  var DEFAULT_TITLE4 = "Call Debugger";
4990
5099
  var DEFAULT_DESCRIPTION4 = "Open the latest call artifact with snapshot, operations record, failure replay, provider path, transcript, and incident markdown.";
4991
5100
  var DEFAULT_LINK_LABEL = "Open debugger";
4992
- var escapeHtml8 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5101
+ var escapeHtml9 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
4993
5102
  var defaultHref = (path, report) => {
4994
5103
  if (path.startsWith("/api/voice-call-debugger/")) {
4995
5104
  return path.replace("/api/voice-call-debugger/", "/voice-call-debugger/");
@@ -5042,18 +5151,18 @@ var createVoiceCallDebuggerLaunchViewModel = (path, state, options = {}) => {
5042
5151
  var renderVoiceCallDebuggerLaunchHTML = (path, state, options = {}) => {
5043
5152
  const model = createVoiceCallDebuggerLaunchViewModel(path, state, options);
5044
5153
  const rows = model.rows.length ? `<dl>${model.rows.map((row) => `<div>
5045
- <dt>${escapeHtml8(row.label)}</dt>
5046
- <dd>${escapeHtml8(row.value)}</dd>
5154
+ <dt>${escapeHtml9(row.label)}</dt>
5155
+ <dd>${escapeHtml9(row.value)}</dd>
5047
5156
  </div>`).join("")}</dl>` : '<p class="absolute-voice-call-debugger-launch__empty">Load a call debugger report to see the latest support artifact.</p>';
5048
- return `<section class="absolute-voice-call-debugger-launch absolute-voice-call-debugger-launch--${escapeHtml8(model.status)}">
5157
+ return `<section class="absolute-voice-call-debugger-launch absolute-voice-call-debugger-launch--${escapeHtml9(model.status)}">
5049
5158
  <header class="absolute-voice-call-debugger-launch__header">
5050
- <span class="absolute-voice-call-debugger-launch__eyebrow">${escapeHtml8(model.title)}</span>
5051
- <strong class="absolute-voice-call-debugger-launch__label">${escapeHtml8(model.label)}</strong>
5159
+ <span class="absolute-voice-call-debugger-launch__eyebrow">${escapeHtml9(model.title)}</span>
5160
+ <strong class="absolute-voice-call-debugger-launch__label">${escapeHtml9(model.label)}</strong>
5052
5161
  </header>
5053
- <p class="absolute-voice-call-debugger-launch__description">${escapeHtml8(model.description)}</p>
5054
- <a class="absolute-voice-call-debugger-launch__link" href="${escapeHtml8(model.href)}">${escapeHtml8(options.linkLabel ?? DEFAULT_LINK_LABEL)}</a>
5162
+ <p class="absolute-voice-call-debugger-launch__description">${escapeHtml9(model.description)}</p>
5163
+ <a class="absolute-voice-call-debugger-launch__link" href="${escapeHtml9(model.href)}">${escapeHtml9(options.linkLabel ?? DEFAULT_LINK_LABEL)}</a>
5055
5164
  ${rows}
5056
- ${model.error ? `<p class="absolute-voice-call-debugger-launch__error">${escapeHtml8(model.error)}</p>` : ""}
5165
+ ${model.error ? `<p class="absolute-voice-call-debugger-launch__error">${escapeHtml9(model.error)}</p>` : ""}
5057
5166
  </section>`;
5058
5167
  };
5059
5168
  var mountVoiceCallDebuggerLaunch = (element, path, options = {}) => {
@@ -5201,7 +5310,7 @@ var createVoiceSessionSnapshotStore = (path, options = {}) => {
5201
5310
  var DEFAULT_TITLE5 = "Session Snapshot";
5202
5311
  var DEFAULT_DESCRIPTION5 = "Portable call artifact with media graph, provider routing, proof, quality, and telephony evidence.";
5203
5312
  var DEFAULT_DOWNLOAD_LABEL = "Download snapshot";
5204
- var escapeHtml9 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5313
+ var escapeHtml10 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5205
5314
  var formatStatus = (status) => status ?? "n/a";
5206
5315
  var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
5207
5316
  const snapshot = state.snapshot;
@@ -5251,23 +5360,23 @@ var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
5251
5360
  var renderVoiceSessionSnapshotHTML = (state, options = {}) => {
5252
5361
  const model = createVoiceSessionSnapshotViewModel(state, options);
5253
5362
  const rows = model.rows.length ? `<dl>${model.rows.map((row) => `<div>
5254
- <dt>${escapeHtml9(row.label)}</dt>
5255
- <dd>${escapeHtml9(row.value)}</dd>
5363
+ <dt>${escapeHtml10(row.label)}</dt>
5364
+ <dd>${escapeHtml10(row.value)}</dd>
5256
5365
  </div>`).join("")}</dl>` : '<p class="absolute-voice-session-snapshot__empty">Load a session snapshot to see support diagnostics.</p>';
5257
5366
  const artifacts = model.artifacts.length ? `<div class="absolute-voice-session-snapshot__artifacts">${model.artifacts.map((artifact) => {
5258
- const body = `<strong>${escapeHtml9(artifact.label)}</strong><span>${escapeHtml9(artifact.status)}</span>`;
5259
- return artifact.href ? `<a href="${escapeHtml9(artifact.href)}">${body}</a>` : `<div>${body}</div>`;
5367
+ const body = `<strong>${escapeHtml10(artifact.label)}</strong><span>${escapeHtml10(artifact.status)}</span>`;
5368
+ return artifact.href ? `<a href="${escapeHtml10(artifact.href)}">${body}</a>` : `<div>${body}</div>`;
5260
5369
  }).join("")}</div>` : "";
5261
- return `<section class="absolute-voice-session-snapshot absolute-voice-session-snapshot--${escapeHtml9(model.status)}">
5370
+ return `<section class="absolute-voice-session-snapshot absolute-voice-session-snapshot--${escapeHtml10(model.status)}">
5262
5371
  <header class="absolute-voice-session-snapshot__header">
5263
- <span class="absolute-voice-session-snapshot__eyebrow">${escapeHtml9(model.title)}</span>
5264
- <strong class="absolute-voice-session-snapshot__label">${escapeHtml9(model.label)}</strong>
5372
+ <span class="absolute-voice-session-snapshot__eyebrow">${escapeHtml10(model.title)}</span>
5373
+ <strong class="absolute-voice-session-snapshot__label">${escapeHtml10(model.label)}</strong>
5265
5374
  </header>
5266
- <p class="absolute-voice-session-snapshot__description">${escapeHtml9(model.description)}</p>
5267
- ${model.showDownload ? `<button class="absolute-voice-session-snapshot__download" data-absolute-voice-session-snapshot-download type="button">${escapeHtml9(options.downloadLabel ?? DEFAULT_DOWNLOAD_LABEL)}</button>` : ""}
5375
+ <p class="absolute-voice-session-snapshot__description">${escapeHtml10(model.description)}</p>
5376
+ ${model.showDownload ? `<button class="absolute-voice-session-snapshot__download" data-absolute-voice-session-snapshot-download type="button">${escapeHtml10(options.downloadLabel ?? DEFAULT_DOWNLOAD_LABEL)}</button>` : ""}
5268
5377
  ${rows}
5269
5378
  ${artifacts}
5270
- ${model.error ? `<p class="absolute-voice-session-snapshot__error">${escapeHtml9(model.error)}</p>` : ""}
5379
+ ${model.error ? `<p class="absolute-voice-session-snapshot__error">${escapeHtml10(model.error)}</p>` : ""}
5271
5380
  </section>`;
5272
5381
  };
5273
5382
  var downloadBlob = (blob, filename) => {
@@ -5422,7 +5531,7 @@ var createVoiceSessionObservabilityStore = (path, options = {}) => {
5422
5531
  // src/client/sessionObservabilityWidget.ts
5423
5532
  var DEFAULT_TITLE6 = "Session Observability";
5424
5533
  var DEFAULT_DESCRIPTION6 = "One support/debug report for a voice call across traces, provider recovery, tools, handoffs, guardrails, turn waterfalls, and incident handoff.";
5425
- var escapeHtml10 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5534
+ var escapeHtml11 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5426
5535
  var formatMs = (value) => typeof value === "number" ? `${value}ms` : "n/a";
5427
5536
  var createVoiceSessionObservabilityViewModel = (snapshot, options = {}) => {
5428
5537
  const report = snapshot.report;
@@ -5444,20 +5553,20 @@ var createVoiceSessionObservabilityViewModel = (snapshot, options = {}) => {
5444
5553
  updatedAt: snapshot.updatedAt
5445
5554
  };
5446
5555
  };
5447
- var renderLinks = (links) => links.length ? `<p class="absolute-voice-session-observability__actions">${links.map((link) => `<a href="${escapeHtml10(link.href)}">${escapeHtml10(link.label)}</a>`).join("")}</p>` : "";
5556
+ var renderLinks = (links) => links.length ? `<p class="absolute-voice-session-observability__actions">${links.map((link) => `<a href="${escapeHtml11(link.href)}">${escapeHtml11(link.label)}</a>`).join("")}</p>` : "";
5448
5557
  var renderVoiceSessionObservabilityHTML = (snapshot, options = {}) => {
5449
5558
  const model = createVoiceSessionObservabilityViewModel(snapshot, options);
5450
- const turns = model.turns.length ? `<div class="absolute-voice-session-observability__turns">${model.turns.map((turn) => `<article class="absolute-voice-session-observability__turn"><header><strong>${escapeHtml10(turn.turnId)}</strong><span>${escapeHtml10(turn.durationLabel)}</span></header><p>${escapeHtml10(turn.label)}</p></article>`).join("")}</div>` : '<p class="absolute-voice-session-observability__empty">Open a voice session to see turn waterfalls.</p>';
5451
- return `<section class="absolute-voice-session-observability absolute-voice-session-observability--${escapeHtml10(model.status)}">
5559
+ const turns = model.turns.length ? `<div class="absolute-voice-session-observability__turns">${model.turns.map((turn) => `<article class="absolute-voice-session-observability__turn"><header><strong>${escapeHtml11(turn.turnId)}</strong><span>${escapeHtml11(turn.durationLabel)}</span></header><p>${escapeHtml11(turn.label)}</p></article>`).join("")}</div>` : '<p class="absolute-voice-session-observability__empty">Open a voice session to see turn waterfalls.</p>';
5560
+ return `<section class="absolute-voice-session-observability absolute-voice-session-observability--${escapeHtml11(model.status)}">
5452
5561
  <header class="absolute-voice-session-observability__header">
5453
- <span class="absolute-voice-session-observability__eyebrow">${escapeHtml10(model.title)}</span>
5454
- <strong class="absolute-voice-session-observability__label">${escapeHtml10(model.label)}</strong>
5562
+ <span class="absolute-voice-session-observability__eyebrow">${escapeHtml11(model.title)}</span>
5563
+ <strong class="absolute-voice-session-observability__label">${escapeHtml11(model.label)}</strong>
5455
5564
  </header>
5456
- <p class="absolute-voice-session-observability__description">${escapeHtml10(model.description)}</p>
5457
- ${model.sessionId ? `<p class="absolute-voice-session-observability__session">${escapeHtml10(model.sessionId)}</p>` : ""}
5565
+ <p class="absolute-voice-session-observability__description">${escapeHtml11(model.description)}</p>
5566
+ ${model.sessionId ? `<p class="absolute-voice-session-observability__session">${escapeHtml11(model.sessionId)}</p>` : ""}
5458
5567
  ${renderLinks(model.links)}
5459
5568
  ${turns}
5460
- ${model.error ? `<p class="absolute-voice-session-observability__error">${escapeHtml10(model.error)}</p>` : ""}
5569
+ ${model.error ? `<p class="absolute-voice-session-observability__error">${escapeHtml11(model.error)}</p>` : ""}
5461
5570
  </section>`;
5462
5571
  };
5463
5572
  var getVoiceSessionObservabilityCSS = () => `.absolute-voice-session-observability{border:1px solid #c8d9bf;border-radius:20px;background:#fbfff3;color:#18220d;padding:18px;box-shadow:0 18px 40px rgba(24,34,13,.12);font-family:inherit}.absolute-voice-session-observability--error,.absolute-voice-session-observability--failed{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-session-observability--warning{border-color:#fbbf24;background:#fffaf0}.absolute-voice-session-observability__header,.absolute-voice-session-observability__turn header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-session-observability__eyebrow{color:#4d7c0f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-session-observability__label{font-size:24px;line-height:1}.absolute-voice-session-observability__description,.absolute-voice-session-observability__turn p,.absolute-voice-session-observability__empty,.absolute-voice-session-observability__session{color:#4b5f3e}.absolute-voice-session-observability__actions{display:flex;flex-wrap:wrap;gap:10px;margin:14px 0}.absolute-voice-session-observability__actions a{color:#3f6212;font-weight:800}.absolute-voice-session-observability__turns{display:grid;gap:12px;margin-top:14px}.absolute-voice-session-observability__turn{background:#fff;border:1px solid #dcebcf;border-radius:16px;padding:14px}.absolute-voice-session-observability__turn p{margin:10px 0 0}.absolute-voice-session-observability__empty{margin:14px 0 0}.absolute-voice-session-observability__error{color:#9f1239;font-weight:700}`;
@@ -5759,7 +5868,7 @@ var createVoiceProviderSimulationControlsStore = (options) => {
5759
5868
  };
5760
5869
 
5761
5870
  // src/client/providerSimulationControlsWidget.ts
5762
- var escapeHtml11 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5871
+ var escapeHtml12 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5763
5872
  var formatKind = (kind) => (kind ?? "stt").toUpperCase();
5764
5873
  var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
5765
5874
  const configuredProviders = options.providers.filter((provider) => provider.configured !== false);
@@ -5779,18 +5888,18 @@ var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
5779
5888
  };
5780
5889
  var renderVoiceProviderSimulationControlsHTML = (snapshot, options) => {
5781
5890
  const model = createVoiceProviderSimulationControlsViewModel(snapshot, options);
5782
- 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("");
5783
- 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("");
5891
+ 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("");
5892
+ 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("");
5784
5893
  return `<section class="absolute-voice-provider-simulation absolute-voice-provider-simulation--${snapshot.error ? "error" : snapshot.isRunning ? "running" : "ready"}">
5785
5894
  <header class="absolute-voice-provider-simulation__header">
5786
- <span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml11(model.title)}</span>
5787
- <strong class="absolute-voice-provider-simulation__label">${escapeHtml11(model.label)}</strong>
5895
+ <span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml12(model.title)}</span>
5896
+ <strong class="absolute-voice-provider-simulation__label">${escapeHtml12(model.label)}</strong>
5788
5897
  </header>
5789
- <p class="absolute-voice-provider-simulation__description">${escapeHtml11(model.description)}</p>
5790
- ${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml11(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
5898
+ <p class="absolute-voice-provider-simulation__description">${escapeHtml12(model.description)}</p>
5899
+ ${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml12(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
5791
5900
  <div class="absolute-voice-provider-simulation__actions">${failureButtons}${recoveryButtons}</div>
5792
- ${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml11(snapshot.error)}</p>` : ""}
5793
- ${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml11(model.resultText)}</pre>` : ""}
5901
+ ${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml12(snapshot.error)}</p>` : ""}
5902
+ ${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml12(model.resultText)}</pre>` : ""}
5794
5903
  </section>`;
5795
5904
  };
5796
5905
  var bindVoiceProviderSimulationControls = (element, store) => {
@@ -5947,7 +6056,7 @@ var createVoiceProviderCapabilitiesStore = (path = "/api/provider-capabilities",
5947
6056
  // src/client/providerCapabilitiesWidget.ts
5948
6057
  var DEFAULT_TITLE7 = "Provider Capabilities";
5949
6058
  var DEFAULT_DESCRIPTION7 = "Configured, selected, and healthy voice providers for this deployment.";
5950
- var escapeHtml12 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6059
+ var escapeHtml13 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
5951
6060
  var formatProvider = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
5952
6061
  var formatKind2 = (kind) => kind.toUpperCase();
5953
6062
  var formatStatus2 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
@@ -6002,25 +6111,25 @@ var createVoiceProviderCapabilitiesViewModel = (snapshot, options = {}) => {
6002
6111
  };
6003
6112
  var renderVoiceProviderCapabilitiesHTML = (snapshot, options = {}) => {
6004
6113
  const model = createVoiceProviderCapabilitiesViewModel(snapshot, options);
6005
- 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--${escapeHtml12(capability.status)}">
6114
+ 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)}">
6006
6115
  <header>
6007
- <strong>${escapeHtml12(capability.label)}</strong>
6008
- <span>${escapeHtml12(formatStatus2(capability.status))}</span>
6116
+ <strong>${escapeHtml13(capability.label)}</strong>
6117
+ <span>${escapeHtml13(formatStatus2(capability.status))}</span>
6009
6118
  </header>
6010
- <p>${escapeHtml12(capability.detail)}</p>
6119
+ <p>${escapeHtml13(capability.detail)}</p>
6011
6120
  <dl>${capability.rows.map((row) => `<div>
6012
- <dt>${escapeHtml12(row.label)}</dt>
6013
- <dd>${escapeHtml12(row.value)}</dd>
6121
+ <dt>${escapeHtml13(row.label)}</dt>
6122
+ <dd>${escapeHtml13(row.value)}</dd>
6014
6123
  </div>`).join("")}</dl>
6015
6124
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-capabilities__empty">Configure provider capabilities to see deployment coverage.</p>';
6016
- return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${escapeHtml12(model.status)}">
6125
+ return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${escapeHtml13(model.status)}">
6017
6126
  <header class="absolute-voice-provider-capabilities__header">
6018
- <span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml12(model.title)}</span>
6019
- <strong class="absolute-voice-provider-capabilities__label">${escapeHtml12(model.label)}</strong>
6127
+ <span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml13(model.title)}</span>
6128
+ <strong class="absolute-voice-provider-capabilities__label">${escapeHtml13(model.label)}</strong>
6020
6129
  </header>
6021
- <p class="absolute-voice-provider-capabilities__description">${escapeHtml12(model.description)}</p>
6130
+ <p class="absolute-voice-provider-capabilities__description">${escapeHtml13(model.description)}</p>
6022
6131
  ${capabilities}
6023
- ${model.error ? `<p class="absolute-voice-provider-capabilities__error">${escapeHtml12(model.error)}</p>` : ""}
6132
+ ${model.error ? `<p class="absolute-voice-provider-capabilities__error">${escapeHtml13(model.error)}</p>` : ""}
6024
6133
  </section>`;
6025
6134
  };
6026
6135
  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}`;
@@ -6148,7 +6257,7 @@ var createVoiceProviderContractsStore = (path = "/api/provider-contracts", optio
6148
6257
  // src/client/providerContractsWidget.ts
6149
6258
  var DEFAULT_TITLE8 = "Provider Contracts";
6150
6259
  var DEFAULT_DESCRIPTION8 = "Production contract coverage for provider env, latency, fallback, streaming, and capabilities.";
6151
- var escapeHtml13 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6260
+ var escapeHtml14 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6152
6261
  var formatProvider2 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
6153
6262
  var formatStatus3 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
6154
6263
  var contractDetail = (row) => {
@@ -6192,26 +6301,26 @@ var createVoiceProviderContractsViewModel = (snapshot, options = {}) => {
6192
6301
  };
6193
6302
  var renderVoiceProviderContractsHTML = (snapshot, options = {}) => {
6194
6303
  const model = createVoiceProviderContractsViewModel(snapshot, options);
6195
- 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--${escapeHtml13(row.status)}">
6304
+ 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)}">
6196
6305
  <header>
6197
- <strong>${escapeHtml13(row.label)}</strong>
6198
- <span>${escapeHtml13(formatStatus3(row.status))}</span>
6306
+ <strong>${escapeHtml14(row.label)}</strong>
6307
+ <span>${escapeHtml14(formatStatus3(row.status))}</span>
6199
6308
  </header>
6200
- <p>${escapeHtml13(row.detail)}</p>
6201
- ${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${escapeHtml13(remediation.href)}">${escapeHtml13(remediation.label)}</a>` : `<strong>${escapeHtml13(remediation.label)}</strong>`}<span>${escapeHtml13(remediation.detail)}</span></li>`).join("")}</ul>` : ""}
6309
+ <p>${escapeHtml14(row.detail)}</p>
6310
+ ${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>` : ""}
6202
6311
  <dl>${row.rows.map((item) => `<div>
6203
- <dt>${escapeHtml13(item.label)}</dt>
6204
- <dd>${escapeHtml13(item.value)}</dd>
6312
+ <dt>${escapeHtml14(item.label)}</dt>
6313
+ <dd>${escapeHtml14(item.value)}</dd>
6205
6314
  </div>`).join("")}</dl>
6206
6315
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-contracts__empty">Configure provider contracts to see production coverage.</p>';
6207
- return `<section class="absolute-voice-provider-contracts absolute-voice-provider-contracts--${escapeHtml13(model.status)}">
6316
+ return `<section class="absolute-voice-provider-contracts absolute-voice-provider-contracts--${escapeHtml14(model.status)}">
6208
6317
  <header class="absolute-voice-provider-contracts__header">
6209
- <span class="absolute-voice-provider-contracts__eyebrow">${escapeHtml13(model.title)}</span>
6210
- <strong class="absolute-voice-provider-contracts__label">${escapeHtml13(model.label)}</strong>
6318
+ <span class="absolute-voice-provider-contracts__eyebrow">${escapeHtml14(model.title)}</span>
6319
+ <strong class="absolute-voice-provider-contracts__label">${escapeHtml14(model.label)}</strong>
6211
6320
  </header>
6212
- <p class="absolute-voice-provider-contracts__description">${escapeHtml13(model.description)}</p>
6321
+ <p class="absolute-voice-provider-contracts__description">${escapeHtml14(model.description)}</p>
6213
6322
  ${rows}
6214
- ${model.error ? `<p class="absolute-voice-provider-contracts__error">${escapeHtml13(model.error)}</p>` : ""}
6323
+ ${model.error ? `<p class="absolute-voice-provider-contracts__error">${escapeHtml14(model.error)}</p>` : ""}
6215
6324
  </section>`;
6216
6325
  };
6217
6326
  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}`;
@@ -6346,7 +6455,7 @@ var createVoiceProviderStatusStore = (path = "/api/provider-status", options = {
6346
6455
  // src/client/providerStatusWidget.ts
6347
6456
  var DEFAULT_TITLE9 = "Voice Providers";
6348
6457
  var DEFAULT_DESCRIPTION9 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
6349
- var escapeHtml14 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6458
+ var escapeHtml15 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6350
6459
  var formatProvider3 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
6351
6460
  var formatStatus4 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
6352
6461
  var formatLatency = (value) => typeof value === "number" ? `${value}ms` : "No samples";
@@ -6402,25 +6511,25 @@ var createVoiceProviderStatusViewModel = (snapshot, options = {}) => {
6402
6511
  };
6403
6512
  var renderVoiceProviderStatusHTML = (snapshot, options = {}) => {
6404
6513
  const model = createVoiceProviderStatusViewModel(snapshot, options);
6405
- 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--${escapeHtml14(provider.status)}">
6514
+ 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--${escapeHtml15(provider.status)}">
6406
6515
  <header>
6407
- <strong>${escapeHtml14(provider.label)}</strong>
6408
- <span>${escapeHtml14(formatStatus4(provider.status))}</span>
6516
+ <strong>${escapeHtml15(provider.label)}</strong>
6517
+ <span>${escapeHtml15(formatStatus4(provider.status))}</span>
6409
6518
  </header>
6410
- <p>${escapeHtml14(provider.detail)}</p>
6519
+ <p>${escapeHtml15(provider.detail)}</p>
6411
6520
  <dl>${provider.rows.map((row) => `<div>
6412
- <dt>${escapeHtml14(row.label)}</dt>
6413
- <dd>${escapeHtml14(row.value)}</dd>
6521
+ <dt>${escapeHtml15(row.label)}</dt>
6522
+ <dd>${escapeHtml15(row.value)}</dd>
6414
6523
  </div>`).join("")}</dl>
6415
6524
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-status__empty">Run voice traffic to see provider health.</p>';
6416
- return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml14(model.status)}">
6525
+ return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml15(model.status)}">
6417
6526
  <header class="absolute-voice-provider-status__header">
6418
- <span class="absolute-voice-provider-status__eyebrow">${escapeHtml14(model.title)}</span>
6419
- <strong class="absolute-voice-provider-status__label">${escapeHtml14(model.label)}</strong>
6527
+ <span class="absolute-voice-provider-status__eyebrow">${escapeHtml15(model.title)}</span>
6528
+ <strong class="absolute-voice-provider-status__label">${escapeHtml15(model.label)}</strong>
6420
6529
  </header>
6421
- <p class="absolute-voice-provider-status__description">${escapeHtml14(model.description)}</p>
6530
+ <p class="absolute-voice-provider-status__description">${escapeHtml15(model.description)}</p>
6422
6531
  ${providers}
6423
- ${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml14(model.error)}</p>` : ""}
6532
+ ${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml15(model.error)}</p>` : ""}
6424
6533
  </section>`;
6425
6534
  };
6426
6535
  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}`;
@@ -6553,7 +6662,7 @@ var createVoiceRoutingStatusStore = (path = "/api/routing/latest", options = {})
6553
6662
  // src/client/routingStatusWidget.ts
6554
6663
  var DEFAULT_TITLE10 = "Voice Routing";
6555
6664
  var DEFAULT_DESCRIPTION10 = "Latest provider routing decision from the self-hosted trace store.";
6556
- var escapeHtml15 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6665
+ var escapeHtml16 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6557
6666
  var formatValue = (value, fallback = "None") => typeof value === "string" && value.trim() ? value : typeof value === "number" && Number.isFinite(value) ? String(value) : fallback;
6558
6667
  var formatProviderRoutes = (routes) => routes && typeof routes === "object" ? Object.entries(routes).map(([role, provider]) => `${role}: ${formatValue(provider)}`).join(", ") || "None" : "None";
6559
6668
  var getProviderRoute = (routes, role) => routes && typeof routes === "object" ? formatValue(routes[role], "Not configured") : "Not configured";
@@ -6635,22 +6744,22 @@ var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
6635
6744
  var renderVoiceRoutingStatusHTML = (snapshot, options = {}) => {
6636
6745
  const model = createVoiceRoutingStatusViewModel(snapshot, options);
6637
6746
  const activeStack = model.activeStack.length ? `<div class="absolute-voice-routing-status__stack" aria-label="Active voice stack">${model.activeStack.map((item) => `<div>
6638
- <span>${escapeHtml15(item.label)}</span>
6639
- <strong>${escapeHtml15(item.value)}</strong>
6747
+ <span>${escapeHtml16(item.label)}</span>
6748
+ <strong>${escapeHtml16(item.value)}</strong>
6640
6749
  </div>`).join("")}</div>` : "";
6641
6750
  const rows = model.rows.length ? `<div class="absolute-voice-routing-status__grid">${model.rows.map((row) => `<div>
6642
- <span>${escapeHtml15(row.label)}</span>
6643
- <strong>${escapeHtml15(row.value)}</strong>
6751
+ <span>${escapeHtml16(row.label)}</span>
6752
+ <strong>${escapeHtml16(row.value)}</strong>
6644
6753
  </div>`).join("")}</div>` : '<p class="absolute-voice-routing-status__empty">Start a voice session to see the selected provider.</p>';
6645
- return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml15(model.status)}">
6754
+ return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml16(model.status)}">
6646
6755
  <header class="absolute-voice-routing-status__header">
6647
- <span class="absolute-voice-routing-status__eyebrow">${escapeHtml15(model.title)}</span>
6648
- <strong class="absolute-voice-routing-status__label">${escapeHtml15(model.label)}</strong>
6756
+ <span class="absolute-voice-routing-status__eyebrow">${escapeHtml16(model.title)}</span>
6757
+ <strong class="absolute-voice-routing-status__label">${escapeHtml16(model.label)}</strong>
6649
6758
  </header>
6650
- <p class="absolute-voice-routing-status__description">${escapeHtml15(model.description)}</p>
6759
+ <p class="absolute-voice-routing-status__description">${escapeHtml16(model.description)}</p>
6651
6760
  ${activeStack}
6652
6761
  ${rows}
6653
- ${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml15(model.error)}</p>` : ""}
6762
+ ${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml16(model.error)}</p>` : ""}
6654
6763
  </section>`;
6655
6764
  };
6656
6765
  var getVoiceRoutingStatusCSS = () => `.absolute-voice-routing-status{border:1px solid #d8d2c4;border-radius:20px;background:#fffaf0;color:#16130d;padding:18px;box-shadow:0 18px 40px rgba(47,37,18,.12);font-family:inherit}.absolute-voice-routing-status--error{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-routing-status__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-routing-status__eyebrow{color:#73664f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-routing-status__label{font-size:24px;line-height:1}.absolute-voice-routing-status__description{color:#514733;margin:12px 0 0}.absolute-voice-routing-status__stack{background:linear-gradient(135deg,#16130d,#49391f);border-radius:18px;color:#fff;display:grid;gap:8px;grid-template-columns:repeat(5,minmax(0,1fr));margin-top:14px;padding:12px}.absolute-voice-routing-status__stack div{border-left:1px solid rgba(255,255,255,.18);padding-left:10px}.absolute-voice-routing-status__stack div:first-child{border-left:0;padding-left:0}.absolute-voice-routing-status__stack span{color:#e9d9b8;display:block;font-size:11px;font-weight:800;letter-spacing:.08em;margin-bottom:5px;text-transform:uppercase}.absolute-voice-routing-status__stack strong{display:block;font-size:13px;line-height:1.25;overflow-wrap:anywhere}.absolute-voice-routing-status__grid{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:14px}.absolute-voice-routing-status__grid div{background:#fff;border:1px solid #eee4d2;border-radius:14px;padding:10px 12px}.absolute-voice-routing-status__grid span{color:#655944;display:block;font-size:12px;margin-bottom:4px}.absolute-voice-routing-status__grid strong{overflow-wrap:anywhere}.absolute-voice-routing-status__empty{color:#655944;margin:14px 0 0}.absolute-voice-routing-status__error{color:#9f1239;font-weight:700}@media (max-width:760px){.absolute-voice-routing-status__stack{grid-template-columns:repeat(2,minmax(0,1fr))}.absolute-voice-routing-status__stack div{border-left:0;border-top:1px solid rgba(255,255,255,.18);padding-left:0;padding-top:8px}.absolute-voice-routing-status__stack div:first-child{border-top:0;padding-top:0}}`;
@@ -6783,7 +6892,7 @@ var createVoiceTraceTimelineStore = (path = "/api/voice-traces", options = {}) =
6783
6892
  // src/client/traceTimelineWidget.ts
6784
6893
  var DEFAULT_TITLE11 = "Voice Traces";
6785
6894
  var DEFAULT_DESCRIPTION11 = "Latest call timelines with provider latency, fallbacks, handoffs, and errors from your self-hosted trace store.";
6786
- var escapeHtml16 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6895
+ var escapeHtml17 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6787
6896
  var formatMs2 = (value) => typeof value === "number" ? `${value}ms` : "n/a";
6788
6897
  var formatProviders = (session) => session.providers.length ? session.providers.map((provider) => provider.provider).join(", ") : "No providers";
6789
6898
  var createVoiceTraceTimelineViewModel = (snapshot, options = {}) => {
@@ -6813,27 +6922,27 @@ var renderVoiceTraceTimelineWidgetHTML = (snapshot, options = {}) => {
6813
6922
  const model = createVoiceTraceTimelineViewModel(snapshot, options);
6814
6923
  const sessions = model.sessions.length ? `<div class="absolute-voice-trace-timeline__sessions">${model.sessions.map((session) => {
6815
6924
  const supportLinks = [
6816
- `<a href="${escapeHtml16(session.detailHref)}">Open timeline</a>`,
6817
- session.operationsRecordHref ? `<a href="${escapeHtml16(session.operationsRecordHref)}">Open operations record</a>` : undefined,
6818
- session.incidentBundleHref ? `<a href="${escapeHtml16(session.incidentBundleHref)}">Export incident bundle</a>` : undefined
6925
+ `<a href="${escapeHtml17(session.detailHref)}">Open timeline</a>`,
6926
+ session.operationsRecordHref ? `<a href="${escapeHtml17(session.operationsRecordHref)}">Open operations record</a>` : undefined,
6927
+ session.incidentBundleHref ? `<a href="${escapeHtml17(session.incidentBundleHref)}">Export incident bundle</a>` : undefined
6819
6928
  ].filter(Boolean).join("");
6820
- return `<article class="absolute-voice-trace-timeline__session absolute-voice-trace-timeline__session--${escapeHtml16(session.status)}">
6929
+ return `<article class="absolute-voice-trace-timeline__session absolute-voice-trace-timeline__session--${escapeHtml17(session.status)}">
6821
6930
  <header>
6822
- <strong>${escapeHtml16(session.sessionId)}</strong>
6823
- <span>${escapeHtml16(session.status)}</span>
6931
+ <strong>${escapeHtml17(session.sessionId)}</strong>
6932
+ <span>${escapeHtml17(session.status)}</span>
6824
6933
  </header>
6825
- <p>${escapeHtml16(session.label)} \xB7 ${escapeHtml16(session.durationLabel)} \xB7 ${escapeHtml16(session.providerLabel)}</p>
6934
+ <p>${escapeHtml17(session.label)} \xB7 ${escapeHtml17(session.durationLabel)} \xB7 ${escapeHtml17(session.providerLabel)}</p>
6826
6935
  <p class="absolute-voice-trace-timeline__actions">${supportLinks}</p>
6827
6936
  </article>`;
6828
6937
  }).join("")}</div>` : '<p class="absolute-voice-trace-timeline__empty">Run a voice session to see call timelines.</p>';
6829
- return `<section class="absolute-voice-trace-timeline absolute-voice-trace-timeline--${escapeHtml16(model.status)}">
6938
+ return `<section class="absolute-voice-trace-timeline absolute-voice-trace-timeline--${escapeHtml17(model.status)}">
6830
6939
  <header class="absolute-voice-trace-timeline__header">
6831
- <span class="absolute-voice-trace-timeline__eyebrow">${escapeHtml16(model.title)}</span>
6832
- <strong class="absolute-voice-trace-timeline__label">${escapeHtml16(model.label)}</strong>
6940
+ <span class="absolute-voice-trace-timeline__eyebrow">${escapeHtml17(model.title)}</span>
6941
+ <strong class="absolute-voice-trace-timeline__label">${escapeHtml17(model.label)}</strong>
6833
6942
  </header>
6834
- <p class="absolute-voice-trace-timeline__description">${escapeHtml16(model.description)}</p>
6943
+ <p class="absolute-voice-trace-timeline__description">${escapeHtml17(model.description)}</p>
6835
6944
  ${sessions}
6836
- ${model.error ? `<p class="absolute-voice-trace-timeline__error">${escapeHtml16(model.error)}</p>` : ""}
6945
+ ${model.error ? `<p class="absolute-voice-trace-timeline__error">${escapeHtml17(model.error)}</p>` : ""}
6837
6946
  </section>`;
6838
6947
  };
6839
6948
  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}`;
@@ -6965,7 +7074,7 @@ var createVoiceAgentSquadStatusStore = (path = "/api/voice-traces", options = {}
6965
7074
  // src/client/agentSquadStatusWidget.ts
6966
7075
  var DEFAULT_TITLE12 = "Voice Agent Squad";
6967
7076
  var DEFAULT_DESCRIPTION12 = "Current specialist and recent handoffs from your self-hosted voice traces.";
6968
- var escapeHtml17 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7077
+ var escapeHtml18 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6969
7078
  var labelFor = (current) => {
6970
7079
  if (!current)
6971
7080
  return "Waiting for specialist activity";
@@ -6992,24 +7101,24 @@ var renderVoiceAgentSquadStatusHTML = (snapshot, options = {}) => {
6992
7101
  const model = createVoiceAgentSquadStatusViewModel(snapshot, options);
6993
7102
  const current = model.current;
6994
7103
  const rows = model.sessions.length ? model.sessions.slice(0, 5).map((session) => `<li>
6995
- <span>${escapeHtml17(session.sessionId)}</span>
6996
- <strong>${escapeHtml17(session.targetAgentId ?? "none")}</strong>
6997
- <em>${escapeHtml17(session.status)}</em>
6998
- ${session.summary || session.reason ? `<p>${escapeHtml17(session.summary ?? session.reason ?? "")}</p>` : ""}
7104
+ <span>${escapeHtml18(session.sessionId)}</span>
7105
+ <strong>${escapeHtml18(session.targetAgentId ?? "none")}</strong>
7106
+ <em>${escapeHtml18(session.status)}</em>
7107
+ ${session.summary || session.reason ? `<p>${escapeHtml18(session.summary ?? session.reason ?? "")}</p>` : ""}
6999
7108
  </li>`).join("") : "<li><span>No squad traces yet.</span><strong>Waiting</strong></li>";
7000
7109
  return `<section class="absolute-voice-agent-squad-status">
7001
7110
  <header>
7002
- <span>${escapeHtml17(model.title)}</span>
7003
- <strong>${escapeHtml17(model.label)}</strong>
7111
+ <span>${escapeHtml18(model.title)}</span>
7112
+ <strong>${escapeHtml18(model.label)}</strong>
7004
7113
  </header>
7005
- <p>${escapeHtml17(model.description)}</p>
7114
+ <p>${escapeHtml18(model.description)}</p>
7006
7115
  <div>
7007
- <span>Session</span><strong>${escapeHtml17(current?.sessionId ?? "n/a")}</strong>
7008
- <span>From</span><strong>${escapeHtml17(current?.fromAgentId ?? "n/a")}</strong>
7009
- <span>Status</span><strong>${escapeHtml17(current?.status ?? "idle")}</strong>
7116
+ <span>Session</span><strong>${escapeHtml18(current?.sessionId ?? "n/a")}</strong>
7117
+ <span>From</span><strong>${escapeHtml18(current?.fromAgentId ?? "n/a")}</strong>
7118
+ <span>Status</span><strong>${escapeHtml18(current?.status ?? "idle")}</strong>
7010
7119
  </div>
7011
7120
  <ul>${rows}</ul>
7012
- ${model.error ? `<p class="absolute-voice-agent-squad-status__error">${escapeHtml17(model.error)}</p>` : ""}
7121
+ ${model.error ? `<p class="absolute-voice-agent-squad-status__error">${escapeHtml18(model.error)}</p>` : ""}
7013
7122
  </section>`;
7014
7123
  };
7015
7124
  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}`;
@@ -7172,7 +7281,7 @@ var createVoiceTurnLatencyStore = (path = "/api/turn-latency", options = {}) =>
7172
7281
  var DEFAULT_TITLE13 = "Turn Latency";
7173
7282
  var DEFAULT_DESCRIPTION13 = "Per-turn timing from first transcript to commit and assistant response start.";
7174
7283
  var DEFAULT_PROOF_LABEL = "Run latency proof";
7175
- var escapeHtml18 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7284
+ var escapeHtml19 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7176
7285
  var formatMs3 = (value) => typeof value === "number" ? `${Math.round(value)}ms` : "n/a";
7177
7286
  var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
7178
7287
  const turns = (snapshot.report?.turns ?? []).map((turn) => ({
@@ -7200,25 +7309,25 @@ var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
7200
7309
  };
7201
7310
  var renderVoiceTurnLatencyHTML = (snapshot, options = {}) => {
7202
7311
  const model = createVoiceTurnLatencyViewModel(snapshot, options);
7203
- 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--${escapeHtml18(turn.status)}">
7312
+ 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--${escapeHtml19(turn.status)}">
7204
7313
  <header>
7205
- <strong>${escapeHtml18(turn.label)}</strong>
7206
- <span>${escapeHtml18(turn.status)}</span>
7314
+ <strong>${escapeHtml19(turn.label)}</strong>
7315
+ <span>${escapeHtml19(turn.status)}</span>
7207
7316
  </header>
7208
7317
  <dl>${turn.rows.map((row) => `<div>
7209
- <dt>${escapeHtml18(row.label)}</dt>
7210
- <dd>${escapeHtml18(row.value)}</dd>
7318
+ <dt>${escapeHtml19(row.label)}</dt>
7319
+ <dd>${escapeHtml19(row.value)}</dd>
7211
7320
  </div>`).join("")}</dl>
7212
7321
  </article>`).join("")}</div>` : '<p class="absolute-voice-turn-latency__empty">Complete a voice turn to see latency diagnostics.</p>';
7213
- return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${escapeHtml18(model.status)}">
7322
+ return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${escapeHtml19(model.status)}">
7214
7323
  <header class="absolute-voice-turn-latency__header">
7215
- <span class="absolute-voice-turn-latency__eyebrow">${escapeHtml18(model.title)}</span>
7216
- <strong class="absolute-voice-turn-latency__label">${escapeHtml18(model.label)}</strong>
7324
+ <span class="absolute-voice-turn-latency__eyebrow">${escapeHtml19(model.title)}</span>
7325
+ <strong class="absolute-voice-turn-latency__label">${escapeHtml19(model.label)}</strong>
7217
7326
  </header>
7218
- <p class="absolute-voice-turn-latency__description">${escapeHtml18(model.description)}</p>
7219
- ${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml18(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</button>` : ""}
7327
+ <p class="absolute-voice-turn-latency__description">${escapeHtml19(model.description)}</p>
7328
+ ${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml19(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</button>` : ""}
7220
7329
  ${turns}
7221
- ${model.error ? `<p class="absolute-voice-turn-latency__error">${escapeHtml18(model.error)}</p>` : ""}
7330
+ ${model.error ? `<p class="absolute-voice-turn-latency__error">${escapeHtml19(model.error)}</p>` : ""}
7222
7331
  </section>`;
7223
7332
  };
7224
7333
  var mountVoiceTurnLatency = (element, path = "/api/turn-latency", options = {}) => {
@@ -7359,7 +7468,7 @@ var createVoiceTurnQualityStore = (path = "/api/turn-quality", options = {}) =>
7359
7468
  // src/client/turnQualityWidget.ts
7360
7469
  var DEFAULT_TITLE14 = "Turn Quality";
7361
7470
  var DEFAULT_DESCRIPTION14 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
7362
- var escapeHtml19 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7471
+ var escapeHtml20 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
7363
7472
  var formatConfidence = (value) => typeof value === "number" ? `${Math.round(value * 100)}%` : "n/a";
7364
7473
  var formatMaybe = (value) => value === undefined || value === "" ? "n/a" : String(value);
7365
7474
  var getTurnDetail = (turn) => {
@@ -7415,25 +7524,25 @@ var createVoiceTurnQualityViewModel = (snapshot, options = {}) => {
7415
7524
  };
7416
7525
  var renderVoiceTurnQualityHTML = (snapshot, options = {}) => {
7417
7526
  const model = createVoiceTurnQualityViewModel(snapshot, options);
7418
- 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--${escapeHtml19(turn.status)}">
7527
+ 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--${escapeHtml20(turn.status)}">
7419
7528
  <header>
7420
- <strong>${escapeHtml19(turn.label)}</strong>
7421
- <span>${escapeHtml19(turn.status)}</span>
7529
+ <strong>${escapeHtml20(turn.label)}</strong>
7530
+ <span>${escapeHtml20(turn.status)}</span>
7422
7531
  </header>
7423
- <p>${escapeHtml19(turn.detail)}</p>
7532
+ <p>${escapeHtml20(turn.detail)}</p>
7424
7533
  <dl>${turn.rows.map((row) => `<div>
7425
- <dt>${escapeHtml19(row.label)}</dt>
7426
- <dd>${escapeHtml19(row.value)}</dd>
7534
+ <dt>${escapeHtml20(row.label)}</dt>
7535
+ <dd>${escapeHtml20(row.value)}</dd>
7427
7536
  </div>`).join("")}</dl>
7428
7537
  </article>`).join("")}</div>` : '<p class="absolute-voice-turn-quality__empty">Complete a voice turn to see STT quality diagnostics.</p>';
7429
- return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${escapeHtml19(model.status)}">
7538
+ return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${escapeHtml20(model.status)}">
7430
7539
  <header class="absolute-voice-turn-quality__header">
7431
- <span class="absolute-voice-turn-quality__eyebrow">${escapeHtml19(model.title)}</span>
7432
- <strong class="absolute-voice-turn-quality__label">${escapeHtml19(model.label)}</strong>
7540
+ <span class="absolute-voice-turn-quality__eyebrow">${escapeHtml20(model.title)}</span>
7541
+ <strong class="absolute-voice-turn-quality__label">${escapeHtml20(model.label)}</strong>
7433
7542
  </header>
7434
- <p class="absolute-voice-turn-quality__description">${escapeHtml19(model.description)}</p>
7543
+ <p class="absolute-voice-turn-quality__description">${escapeHtml20(model.description)}</p>
7435
7544
  ${turns}
7436
- ${model.error ? `<p class="absolute-voice-turn-quality__error">${escapeHtml19(model.error)}</p>` : ""}
7545
+ ${model.error ? `<p class="absolute-voice-turn-quality__error">${escapeHtml20(model.error)}</p>` : ""}
7437
7546
  </section>`;
7438
7547
  };
7439
7548
  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}`;
@@ -7567,6 +7676,7 @@ var createVoiceWorkflowStatus = (path = "/evals/scenarios/json", options = {}) =
7567
7676
  export {
7568
7677
  renderVoiceReplayTimelineHTML,
7569
7678
  renderVoiceLiveCallViewerHTML,
7679
+ renderVoiceLiveAgentConsoleHTML,
7570
7680
  renderVoiceCostDashboardHTML,
7571
7681
  renderVoiceCallPlayerHTML,
7572
7682
  createVoiceWorkflowStatus,
@@ -7592,6 +7702,7 @@ export {
7592
7702
  createVoiceOpsActionCenter,
7593
7703
  createVoiceLiveOps,
7594
7704
  createVoiceLiveCallViewer,
7705
+ createVoiceLiveAgentConsole,
7595
7706
  createVoiceDeliveryRuntime,
7596
7707
  createVoiceCostDashboard,
7597
7708
  createVoiceController,