@absolutejs/voice 0.0.22-beta.506 → 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.
- package/dist/angular/index.d.ts +2 -0
- package/dist/angular/index.js +374 -272
- package/dist/angular/voice-live-agent-console.service.d.ts +16 -0
- package/dist/client/browserVoiceSupport.d.ts +22 -0
- package/dist/client/conversationAnalytics.d.ts +29 -0
- package/dist/client/liveAgentConsole.d.ts +28 -0
- package/dist/costPredictor.d.ts +74 -0
- package/dist/dtmfCollector.d.ts +37 -0
- package/dist/holdAudio.d.ts +23 -0
- package/dist/iceServers.d.ts +34 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +563 -0
- package/dist/postCallSurvey.d.ts +41 -0
- package/dist/promptInjectionGuard.d.ts +30 -0
- package/dist/react/VoiceLiveAgentConsole.d.ts +11 -0
- package/dist/svelte/createVoiceLiveAgentConsole.d.ts +23 -0
- package/dist/svelte/index.d.ts +2 -0
- package/dist/svelte/index.js +291 -180
- package/dist/vue/VoiceLiveAgentConsole.d.ts +50 -0
- package/dist/vue/index.d.ts +1 -0
- package/dist/vue/index.js +250 -32
- package/package.json +1 -1
package/dist/svelte/index.js
CHANGED
|
@@ -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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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
|
|
2546
|
+
var escapeHtml4 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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--${
|
|
2487
|
-
<span>${
|
|
2488
|
-
<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 · ${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">${
|
|
2496
|
-
return `<section class="absolute-voice-delivery-runtime absolute-voice-delivery-runtime--${
|
|
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">${
|
|
2499
|
-
<strong class="absolute-voice-delivery-runtime__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
2879
|
+
var escapeHtml5 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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="${
|
|
2793
|
-
${
|
|
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--${
|
|
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">${
|
|
2798
|
-
<strong class="absolute-voice-ops-action-center__label">${
|
|
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">${
|
|
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">${
|
|
2803
|
-
${model.error ? `<p class="absolute-voice-ops-action-center__error">${
|
|
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
|
|
3741
|
+
var escapeHtml6 = (value) => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
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>${
|
|
3917
|
-
`<td>${
|
|
3918
|
-
`<td>${
|
|
3919
|
-
`<td><code>${
|
|
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>${
|
|
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>${
|
|
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>${
|
|
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
|
|
4423
|
+
var escapeHtml7 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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="${
|
|
4326
|
-
const result = snapshot.error ? `<p class="absolute-voice-live-ops__error">${
|
|
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>${
|
|
4330
|
-
<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">${
|
|
4333
|
-
<label><span>Operator</span><input data-absolute-voice-live-ops-assignee value="${
|
|
4334
|
-
<label><span>Tag / handoff target</span><input data-absolute-voice-live-ops-tag value="${
|
|
4335
|
-
<label><span>Detail / instruction</span><input data-absolute-voice-live-ops-detail value="${
|
|
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
|
|
4632
|
+
var escapeHtml8 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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--${
|
|
4579
|
-
<span>${
|
|
4580
|
-
<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="${
|
|
4583
|
-
return `<section class="absolute-voice-ops-status absolute-voice-ops-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">${
|
|
4586
|
-
<strong class="absolute-voice-ops-status__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
5101
|
+
var escapeHtml9 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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>${
|
|
5046
|
-
<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--${
|
|
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">${
|
|
5051
|
-
<strong class="absolute-voice-call-debugger-launch__label">${
|
|
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">${
|
|
5054
|
-
<a class="absolute-voice-call-debugger-launch__link" href="${
|
|
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">${
|
|
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
|
|
5313
|
+
var escapeHtml10 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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>${
|
|
5255
|
-
<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>${
|
|
5259
|
-
return artifact.href ? `<a href="${
|
|
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--${
|
|
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">${
|
|
5264
|
-
<strong class="absolute-voice-session-snapshot__label">${
|
|
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">${
|
|
5267
|
-
${model.showDownload ? `<button class="absolute-voice-session-snapshot__download" data-absolute-voice-session-snapshot-download type="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">${
|
|
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
|
|
5534
|
+
var escapeHtml11 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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="${
|
|
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>${
|
|
5451
|
-
return `<section class="absolute-voice-session-observability absolute-voice-session-observability--${
|
|
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">${
|
|
5454
|
-
<strong class="absolute-voice-session-observability__label">${
|
|
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">${
|
|
5457
|
-
${model.sessionId ? `<p class="absolute-voice-session-observability__session">${
|
|
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">${
|
|
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
|
|
5871
|
+
var escapeHtml12 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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="${
|
|
5783
|
-
const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${
|
|
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">${
|
|
5787
|
-
<strong class="absolute-voice-provider-simulation__label">${
|
|
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">${
|
|
5790
|
-
${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${
|
|
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">${
|
|
5793
|
-
${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${
|
|
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
|
|
6059
|
+
var escapeHtml13 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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--${
|
|
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>${
|
|
6008
|
-
<span>${
|
|
6116
|
+
<strong>${escapeHtml13(capability.label)}</strong>
|
|
6117
|
+
<span>${escapeHtml13(formatStatus2(capability.status))}</span>
|
|
6009
6118
|
</header>
|
|
6010
|
-
<p>${
|
|
6119
|
+
<p>${escapeHtml13(capability.detail)}</p>
|
|
6011
6120
|
<dl>${capability.rows.map((row) => `<div>
|
|
6012
|
-
<dt>${
|
|
6013
|
-
<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--${
|
|
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">${
|
|
6019
|
-
<strong class="absolute-voice-provider-capabilities__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
6260
|
+
var escapeHtml14 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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--${
|
|
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>${
|
|
6198
|
-
<span>${
|
|
6306
|
+
<strong>${escapeHtml14(row.label)}</strong>
|
|
6307
|
+
<span>${escapeHtml14(formatStatus3(row.status))}</span>
|
|
6199
6308
|
</header>
|
|
6200
|
-
<p>${
|
|
6201
|
-
${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${
|
|
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>${
|
|
6204
|
-
<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--${
|
|
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">${
|
|
6210
|
-
<strong class="absolute-voice-provider-contracts__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
6458
|
+
var escapeHtml15 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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--${
|
|
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>${
|
|
6408
|
-
<span>${
|
|
6516
|
+
<strong>${escapeHtml15(provider.label)}</strong>
|
|
6517
|
+
<span>${escapeHtml15(formatStatus4(provider.status))}</span>
|
|
6409
6518
|
</header>
|
|
6410
|
-
<p>${
|
|
6519
|
+
<p>${escapeHtml15(provider.detail)}</p>
|
|
6411
6520
|
<dl>${provider.rows.map((row) => `<div>
|
|
6412
|
-
<dt>${
|
|
6413
|
-
<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--${
|
|
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">${
|
|
6419
|
-
<strong class="absolute-voice-provider-status__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
6665
|
+
var escapeHtml16 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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>${
|
|
6639
|
-
<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>${
|
|
6643
|
-
<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--${
|
|
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">${
|
|
6648
|
-
<strong class="absolute-voice-routing-status__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
6895
|
+
var escapeHtml17 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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="${
|
|
6817
|
-
session.operationsRecordHref ? `<a href="${
|
|
6818
|
-
session.incidentBundleHref ? `<a href="${
|
|
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--${
|
|
6929
|
+
return `<article class="absolute-voice-trace-timeline__session absolute-voice-trace-timeline__session--${escapeHtml17(session.status)}">
|
|
6821
6930
|
<header>
|
|
6822
|
-
<strong>${
|
|
6823
|
-
<span>${
|
|
6931
|
+
<strong>${escapeHtml17(session.sessionId)}</strong>
|
|
6932
|
+
<span>${escapeHtml17(session.status)}</span>
|
|
6824
6933
|
</header>
|
|
6825
|
-
<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--${
|
|
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">${
|
|
6832
|
-
<strong class="absolute-voice-trace-timeline__label">${
|
|
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">${
|
|
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">${
|
|
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
|
|
7077
|
+
var escapeHtml18 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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>${
|
|
6996
|
-
<strong>${
|
|
6997
|
-
<em>${
|
|
6998
|
-
${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>${
|
|
7003
|
-
<strong>${
|
|
7111
|
+
<span>${escapeHtml18(model.title)}</span>
|
|
7112
|
+
<strong>${escapeHtml18(model.label)}</strong>
|
|
7004
7113
|
</header>
|
|
7005
|
-
<p>${
|
|
7114
|
+
<p>${escapeHtml18(model.description)}</p>
|
|
7006
7115
|
<div>
|
|
7007
|
-
<span>Session</span><strong>${
|
|
7008
|
-
<span>From</span><strong>${
|
|
7009
|
-
<span>Status</span><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">${
|
|
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
|
|
7284
|
+
var escapeHtml19 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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--${
|
|
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>${
|
|
7206
|
-
<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>${
|
|
7210
|
-
<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--${
|
|
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">${
|
|
7216
|
-
<strong class="absolute-voice-turn-latency__label">${
|
|
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">${
|
|
7219
|
-
${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="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">${
|
|
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
|
|
7471
|
+
var escapeHtml20 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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--${
|
|
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>${
|
|
7421
|
-
<span>${
|
|
7529
|
+
<strong>${escapeHtml20(turn.label)}</strong>
|
|
7530
|
+
<span>${escapeHtml20(turn.status)}</span>
|
|
7422
7531
|
</header>
|
|
7423
|
-
<p>${
|
|
7532
|
+
<p>${escapeHtml20(turn.detail)}</p>
|
|
7424
7533
|
<dl>${turn.rows.map((row) => `<div>
|
|
7425
|
-
<dt>${
|
|
7426
|
-
<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--${
|
|
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">${
|
|
7432
|
-
<strong class="absolute-voice-turn-quality__label">${
|
|
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">${
|
|
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">${
|
|
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,
|