@absolutejs/voice 0.0.22-beta.452 → 0.0.22-beta.454
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 +1 -0
- package/dist/angular/index.js +345 -224
- package/dist/angular/voice-reconnect-profile-evidence.service.d.ts +12 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.js +543 -240
- package/dist/client/reconnectProfileEvidence.d.ts +19 -0
- package/dist/client/reconnectProfileEvidenceWidget.d.ts +39 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +107 -0
- package/dist/proofTrends.d.ts +53 -0
- package/dist/react/VoiceReconnectProfileEvidence.d.ts +6 -0
- package/dist/react/index.d.ts +2 -0
- package/dist/react/index.js +919 -526
- package/dist/react/useVoiceReconnectProfileEvidence.d.ts +8 -0
- package/dist/svelte/createVoiceReconnectProfileEvidence.d.ts +7 -0
- package/dist/svelte/index.d.ts +1 -0
- package/dist/svelte/index.js +86 -0
- package/dist/vue/VoiceReconnectProfileEvidence.d.ts +21 -0
- package/dist/vue/index.d.ts +2 -0
- package/dist/vue/index.js +825 -438
- package/dist/vue/useVoiceReconnectProfileEvidence.d.ts +9 -0
- package/package.json +1 -1
package/dist/vue/index.js
CHANGED
|
@@ -3335,6 +3335,33 @@ var maxNumber = (values) => {
|
|
|
3335
3335
|
const finite = values.filter((value) => typeof value === "number" && Number.isFinite(value));
|
|
3336
3336
|
return finite.length > 0 ? Math.max(...finite) : undefined;
|
|
3337
3337
|
};
|
|
3338
|
+
var buildVoiceReconnectProfileEvidenceSummary = (evidence, options = {}) => {
|
|
3339
|
+
const profileId = options.profileId ?? "reconnect-resume";
|
|
3340
|
+
const filtered = evidence.filter((record) => record.profileId === profileId).sort((left, right) => {
|
|
3341
|
+
const leftAt = Date.parse(left.generatedAt ?? left.createdAt);
|
|
3342
|
+
const rightAt = Date.parse(right.generatedAt ?? right.createdAt);
|
|
3343
|
+
return (Number.isFinite(rightAt) ? rightAt : 0) - (Number.isFinite(leftAt) ? leftAt : 0);
|
|
3344
|
+
});
|
|
3345
|
+
const latest = filtered[0];
|
|
3346
|
+
const sampleCount = filtered.reduce((total, record) => total + (record.reconnect?.samples ?? 1), 0);
|
|
3347
|
+
const snapshotCount = filtered.reduce((total, record) => total + (record.reconnect?.snapshotCount ?? 0), 0);
|
|
3348
|
+
const resumeLatencyP95Ms = maxNumber(filtered.map((record) => record.reconnect?.resumeLatencyP95Ms));
|
|
3349
|
+
const failed = filtered.some((record) => record.ok === false || record.reconnect?.status === "fail");
|
|
3350
|
+
const passed = filtered.some((record) => record.ok === true && record.reconnect?.resumed === true && record.reconnect?.reconnected === true);
|
|
3351
|
+
const status = filtered.length === 0 ? "empty" : failed ? "fail" : passed ? "pass" : "warn";
|
|
3352
|
+
return {
|
|
3353
|
+
evidence: filtered,
|
|
3354
|
+
generatedAt: options.generatedAt ?? new Date().toISOString(),
|
|
3355
|
+
latest,
|
|
3356
|
+
ok: status === "pass",
|
|
3357
|
+
profileId,
|
|
3358
|
+
resumeLatencyP95Ms,
|
|
3359
|
+
sampleCount,
|
|
3360
|
+
snapshotCount,
|
|
3361
|
+
sourceHref: options.sourceHref,
|
|
3362
|
+
status
|
|
3363
|
+
};
|
|
3364
|
+
};
|
|
3338
3365
|
var percentile = (values, rank) => {
|
|
3339
3366
|
const finite = values.filter((value) => Number.isFinite(value)).sort((left, right) => left - right);
|
|
3340
3367
|
if (finite.length === 0) {
|
|
@@ -3654,6 +3681,7 @@ var buildVoiceRealCallProfileEvidenceFromReconnectProofReports = (input, options
|
|
|
3654
3681
|
});
|
|
3655
3682
|
};
|
|
3656
3683
|
var loadVoiceRealCallProfileEvidenceFromTraceStore = async (options) => buildVoiceRealCallProfileEvidenceFromTraceEvents(await options.store.list({ limit: options.limit ?? 5000 }), options);
|
|
3684
|
+
var loadVoiceRealCallProfileEvidenceFromStore = async (options) => options.store.list(options);
|
|
3657
3685
|
var realCallProfileTraceSignalTypes = new Set([
|
|
3658
3686
|
"client.barge_in",
|
|
3659
3687
|
"client.browser_media",
|
|
@@ -4496,6 +4524,74 @@ var createVoiceInMemoryRealCallProfileRecoveryJobStore = (options = {}) => {
|
|
|
4496
4524
|
}
|
|
4497
4525
|
};
|
|
4498
4526
|
};
|
|
4527
|
+
var normalizeRealCallProfileEvidenceTableName = (value) => value.trim().replace(/[^a-zA-Z0-9_]+/g, "_").replace(/^_+|_+$/g, "") || "voice_real_call_profile_evidence";
|
|
4528
|
+
var parseRealCallProfileEvidenceBoundary = (value) => value === undefined ? undefined : value instanceof Date ? value.getTime() : typeof value === "number" ? value : Date.parse(value);
|
|
4529
|
+
var readRealCallProfileEvidenceSortTime = (evidence, fallback) => Date.parse(evidence.generatedAt ?? fallback) || Date.parse(fallback);
|
|
4530
|
+
var createVoiceSQLiteRealCallProfileEvidenceStore = (options = {}) => {
|
|
4531
|
+
const { Database: SQLiteDatabase } = __require("bun:sqlite");
|
|
4532
|
+
const database = options.database ?? new SQLiteDatabase(options.path ?? ":memory:", {
|
|
4533
|
+
create: true
|
|
4534
|
+
});
|
|
4535
|
+
const tableName = normalizeRealCallProfileEvidenceTableName(options.tableName ?? "voice_real_call_profile_evidence");
|
|
4536
|
+
const now = () => (options.now ?? (() => new Date))().toISOString();
|
|
4537
|
+
const createId = () => `${options.idPrefix ?? "voice-profile-evidence"}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
4538
|
+
database.exec("PRAGMA journal_mode = WAL;");
|
|
4539
|
+
database.exec("PRAGMA synchronous = NORMAL;");
|
|
4540
|
+
database.exec("PRAGMA busy_timeout = 5000;");
|
|
4541
|
+
database.exec(`CREATE TABLE IF NOT EXISTS "${tableName}" (
|
|
4542
|
+
id TEXT PRIMARY KEY,
|
|
4543
|
+
sort_at INTEGER NOT NULL,
|
|
4544
|
+
profile_id TEXT NOT NULL,
|
|
4545
|
+
session_id TEXT NOT NULL,
|
|
4546
|
+
created_at TEXT NOT NULL,
|
|
4547
|
+
payload TEXT NOT NULL
|
|
4548
|
+
)`);
|
|
4549
|
+
const selectStatement = database.query(`SELECT payload FROM "${tableName}" WHERE id = ?1 LIMIT 1`);
|
|
4550
|
+
const listStatement = database.query(`SELECT payload FROM "${tableName}" ORDER BY sort_at DESC, id DESC`);
|
|
4551
|
+
const upsertStatement = database.query(`INSERT INTO "${tableName}" (id, sort_at, profile_id, session_id, created_at, payload)
|
|
4552
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6)
|
|
4553
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
4554
|
+
sort_at = excluded.sort_at,
|
|
4555
|
+
profile_id = excluded.profile_id,
|
|
4556
|
+
session_id = excluded.session_id,
|
|
4557
|
+
created_at = excluded.created_at,
|
|
4558
|
+
payload = excluded.payload`);
|
|
4559
|
+
const deleteStatement = database.query(`DELETE FROM "${tableName}" WHERE id = ?1`);
|
|
4560
|
+
const writeEvidence = (record) => {
|
|
4561
|
+
upsertStatement.run(record.id, readRealCallProfileEvidenceSortTime(record, record.createdAt), record.profileId, record.sessionId, record.createdAt, JSON.stringify(record));
|
|
4562
|
+
return record;
|
|
4563
|
+
};
|
|
4564
|
+
const readEvidence = (id) => {
|
|
4565
|
+
const row = selectStatement.get(id);
|
|
4566
|
+
return row ? JSON.parse(row.payload) : undefined;
|
|
4567
|
+
};
|
|
4568
|
+
const matchesListOptions = (record, input) => {
|
|
4569
|
+
const evidenceTime = readRealCallProfileEvidenceSortTime(record, record.createdAt);
|
|
4570
|
+
const since = parseRealCallProfileEvidenceBoundary(input.since);
|
|
4571
|
+
const until = parseRealCallProfileEvidenceBoundary(input.until);
|
|
4572
|
+
return (!input.profileId || record.profileId === input.profileId) && (!input.sessionId || record.sessionId === input.sessionId) && (since === undefined || Number.isNaN(since) || evidenceTime >= since) && (until === undefined || Number.isNaN(until) || evidenceTime <= until);
|
|
4573
|
+
};
|
|
4574
|
+
return {
|
|
4575
|
+
append(input) {
|
|
4576
|
+
const createdAt = input.createdAt ?? now();
|
|
4577
|
+
return writeEvidence({
|
|
4578
|
+
...input,
|
|
4579
|
+
createdAt,
|
|
4580
|
+
id: input.id ?? createId()
|
|
4581
|
+
});
|
|
4582
|
+
},
|
|
4583
|
+
get(id) {
|
|
4584
|
+
return readEvidence(id);
|
|
4585
|
+
},
|
|
4586
|
+
list(input = {}) {
|
|
4587
|
+
const limit = Number.isFinite(input.limit) && input.limit !== undefined && input.limit > 0 ? Math.floor(input.limit) : 500;
|
|
4588
|
+
return listStatement.all().map((row) => JSON.parse(row.payload)).filter((record) => matchesListOptions(record, input)).slice(0, limit);
|
|
4589
|
+
},
|
|
4590
|
+
remove(id) {
|
|
4591
|
+
deleteStatement.run(id);
|
|
4592
|
+
}
|
|
4593
|
+
};
|
|
4594
|
+
};
|
|
4499
4595
|
var normalizeRealCallRecoveryJobTableName = (value) => value.trim().replace(/[^a-zA-Z0-9_]+/g, "_").replace(/^_+|_+$/g, "") || "voice_real_call_profile_recovery_jobs";
|
|
4500
4596
|
var createVoiceSQLiteRealCallProfileRecoveryJobStore = (options = {}) => {
|
|
4501
4597
|
const { Database: SQLiteDatabase } = __require("bun:sqlite");
|
|
@@ -4749,6 +4845,13 @@ var buildVoiceRealCallProfileHistoryReport = (options = {}) => {
|
|
|
4749
4845
|
trend
|
|
4750
4846
|
};
|
|
4751
4847
|
};
|
|
4848
|
+
var buildVoiceRealCallProfileHistoryReportFromStore = async (options) => {
|
|
4849
|
+
const evidence = await options.store.list(options);
|
|
4850
|
+
return buildVoiceRealCallProfileHistoryReport({
|
|
4851
|
+
...options,
|
|
4852
|
+
evidence
|
|
4853
|
+
});
|
|
4854
|
+
};
|
|
4752
4855
|
var normalizeProviderStatus = (status) => status === "pass" ? "pass" : status === "fail" ? "fail" : "warn";
|
|
4753
4856
|
var providerSortScore = (provider) => [
|
|
4754
4857
|
recommendationStatusRank[provider.status],
|
|
@@ -5745,8 +5848,290 @@ var VoiceProofTrends = defineComponent5({
|
|
|
5745
5848
|
};
|
|
5746
5849
|
}
|
|
5747
5850
|
});
|
|
5851
|
+
// src/vue/VoiceReconnectProfileEvidence.ts
|
|
5852
|
+
import { defineComponent as defineComponent6, h as h6 } from "vue";
|
|
5853
|
+
|
|
5854
|
+
// src/client/reconnectProfileEvidence.ts
|
|
5855
|
+
var fetchVoiceReconnectProfileEvidence = async (path = "/api/voice/reconnect-profile-evidence", options = {}) => {
|
|
5856
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
5857
|
+
const response = await fetchImpl(path);
|
|
5858
|
+
if (!response.ok) {
|
|
5859
|
+
throw new Error(`Voice reconnect profile evidence failed: HTTP ${response.status}`);
|
|
5860
|
+
}
|
|
5861
|
+
return await response.json();
|
|
5862
|
+
};
|
|
5863
|
+
var createVoiceReconnectProfileEvidenceStore = (path = "/api/voice/reconnect-profile-evidence", options = {}) => {
|
|
5864
|
+
const listeners = new Set;
|
|
5865
|
+
let closed = false;
|
|
5866
|
+
let timer;
|
|
5867
|
+
let snapshot = {
|
|
5868
|
+
error: null,
|
|
5869
|
+
isLoading: false
|
|
5870
|
+
};
|
|
5871
|
+
const emit = () => {
|
|
5872
|
+
for (const listener of listeners) {
|
|
5873
|
+
listener();
|
|
5874
|
+
}
|
|
5875
|
+
};
|
|
5876
|
+
const refresh = async () => {
|
|
5877
|
+
if (closed) {
|
|
5878
|
+
return snapshot.report;
|
|
5879
|
+
}
|
|
5880
|
+
snapshot = { ...snapshot, error: null, isLoading: true };
|
|
5881
|
+
emit();
|
|
5882
|
+
try {
|
|
5883
|
+
const report = await fetchVoiceReconnectProfileEvidence(path, options);
|
|
5884
|
+
snapshot = {
|
|
5885
|
+
error: null,
|
|
5886
|
+
isLoading: false,
|
|
5887
|
+
report,
|
|
5888
|
+
updatedAt: Date.now()
|
|
5889
|
+
};
|
|
5890
|
+
emit();
|
|
5891
|
+
return report;
|
|
5892
|
+
} catch (error) {
|
|
5893
|
+
snapshot = {
|
|
5894
|
+
...snapshot,
|
|
5895
|
+
error: error instanceof Error ? error.message : String(error),
|
|
5896
|
+
isLoading: false
|
|
5897
|
+
};
|
|
5898
|
+
emit();
|
|
5899
|
+
throw error;
|
|
5900
|
+
}
|
|
5901
|
+
};
|
|
5902
|
+
const close = () => {
|
|
5903
|
+
closed = true;
|
|
5904
|
+
if (timer) {
|
|
5905
|
+
clearInterval(timer);
|
|
5906
|
+
timer = undefined;
|
|
5907
|
+
}
|
|
5908
|
+
listeners.clear();
|
|
5909
|
+
};
|
|
5910
|
+
if (typeof window !== "undefined" && options.intervalMs && options.intervalMs > 0) {
|
|
5911
|
+
timer = setInterval(() => {
|
|
5912
|
+
refresh().catch(() => {});
|
|
5913
|
+
}, options.intervalMs);
|
|
5914
|
+
}
|
|
5915
|
+
return {
|
|
5916
|
+
close,
|
|
5917
|
+
getServerSnapshot: () => snapshot,
|
|
5918
|
+
getSnapshot: () => snapshot,
|
|
5919
|
+
refresh,
|
|
5920
|
+
subscribe: (listener) => {
|
|
5921
|
+
listeners.add(listener);
|
|
5922
|
+
return () => {
|
|
5923
|
+
listeners.delete(listener);
|
|
5924
|
+
};
|
|
5925
|
+
}
|
|
5926
|
+
};
|
|
5927
|
+
};
|
|
5928
|
+
|
|
5929
|
+
// src/client/reconnectProfileEvidenceWidget.ts
|
|
5930
|
+
var DEFAULT_TITLE6 = "Persisted Reconnect Evidence";
|
|
5931
|
+
var DEFAULT_DESCRIPTION6 = "Real browser reconnect/resume evidence persisted into profile history so recovery claims are backed by durable traces.";
|
|
5932
|
+
var DEFAULT_LINKS3 = [
|
|
5933
|
+
{ href: "/voice/reconnect-contract", label: "Reconnect contract" },
|
|
5934
|
+
{
|
|
5935
|
+
href: "/api/voice/real-call-profile-history",
|
|
5936
|
+
label: "Profile history JSON"
|
|
5937
|
+
}
|
|
5938
|
+
];
|
|
5939
|
+
var escapeHtml11 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
5940
|
+
var formatMs2 = (value) => typeof value === "number" && Number.isFinite(value) ? `${Math.round(value)}ms` : "n/a";
|
|
5941
|
+
var formatCount = (value) => new Intl.NumberFormat("en-US").format(value);
|
|
5942
|
+
var formatAge = (value) => {
|
|
5943
|
+
if (!value) {
|
|
5944
|
+
return "No evidence";
|
|
5945
|
+
}
|
|
5946
|
+
const elapsedMs = Date.now() - Date.parse(value);
|
|
5947
|
+
if (!Number.isFinite(elapsedMs) || elapsedMs < 0) {
|
|
5948
|
+
return "Just now";
|
|
5949
|
+
}
|
|
5950
|
+
const minutes = Math.floor(elapsedMs / 60000);
|
|
5951
|
+
if (minutes < 1) {
|
|
5952
|
+
return "Just now";
|
|
5953
|
+
}
|
|
5954
|
+
if (minutes < 60) {
|
|
5955
|
+
return `${minutes}m ago`;
|
|
5956
|
+
}
|
|
5957
|
+
const hours = Math.floor(minutes / 60);
|
|
5958
|
+
if (hours < 24) {
|
|
5959
|
+
return `${hours}h ago`;
|
|
5960
|
+
}
|
|
5961
|
+
return `${Math.floor(hours / 24)}d ago`;
|
|
5962
|
+
};
|
|
5963
|
+
var createVoiceReconnectProfileEvidenceViewModel = (snapshot, options = {}) => {
|
|
5964
|
+
const report = snapshot.report;
|
|
5965
|
+
const latest = report?.latest;
|
|
5966
|
+
const latestAt = latest?.generatedAt ?? latest?.createdAt;
|
|
5967
|
+
return {
|
|
5968
|
+
description: options.description ?? latest?.profileDescription ?? DEFAULT_DESCRIPTION6,
|
|
5969
|
+
error: snapshot.error,
|
|
5970
|
+
isLoading: snapshot.isLoading,
|
|
5971
|
+
label: snapshot.error ? "Unavailable" : report ? report.status === "pass" ? "Reconnect evidence passing" : report.status === "warn" ? "Reconnect evidence incomplete" : report.status === "fail" ? "Reconnect evidence failing" : "Waiting for reconnect evidence" : snapshot.isLoading ? "Checking" : "No reconnect evidence",
|
|
5972
|
+
latest: latest ? {
|
|
5973
|
+
profileLabel: latest.profileLabel ?? latest.profileId,
|
|
5974
|
+
sessionId: latest.sessionId,
|
|
5975
|
+
surfaces: (latest.surfaces ?? []).join(", ") || "browser"
|
|
5976
|
+
} : undefined,
|
|
5977
|
+
links: options.links ?? DEFAULT_LINKS3,
|
|
5978
|
+
metrics: [
|
|
5979
|
+
{ label: "Samples", value: formatCount(report?.sampleCount ?? 0) },
|
|
5980
|
+
{ label: "Snapshots", value: formatCount(report?.snapshotCount ?? 0) },
|
|
5981
|
+
{
|
|
5982
|
+
label: "Resume p95",
|
|
5983
|
+
value: formatMs2(report?.resumeLatencyP95Ms ?? latest?.reconnect?.resumeLatencyP95Ms)
|
|
5984
|
+
},
|
|
5985
|
+
{ label: "Last proof", value: formatAge(latestAt) }
|
|
5986
|
+
],
|
|
5987
|
+
status: snapshot.error ? "error" : report ? report.status === "pass" ? "ready" : report.status === "empty" ? "empty" : "warning" : snapshot.isLoading ? "loading" : "empty",
|
|
5988
|
+
title: options.title ?? DEFAULT_TITLE6
|
|
5989
|
+
};
|
|
5990
|
+
};
|
|
5991
|
+
var renderVoiceReconnectProfileEvidenceHTML = (snapshot, options = {}) => {
|
|
5992
|
+
const model = createVoiceReconnectProfileEvidenceViewModel(snapshot, options);
|
|
5993
|
+
const metrics = `<div class="absolute-voice-reconnect-evidence__metrics">${model.metrics.map((metric) => `<article>
|
|
5994
|
+
<span>${escapeHtml11(metric.label)}</span>
|
|
5995
|
+
<strong>${escapeHtml11(metric.value)}</strong>
|
|
5996
|
+
</article>`).join("")}</div>`;
|
|
5997
|
+
const latest = model.latest ? `<p class="absolute-voice-reconnect-evidence__latest">Latest ${escapeHtml11(model.latest.profileLabel)} \xB7 ${escapeHtml11(model.latest.sessionId)} \xB7 ${escapeHtml11(model.latest.surfaces)}</p>` : `<p class="absolute-voice-reconnect-evidence__empty">No persisted reconnect profile evidence yet.</p>`;
|
|
5998
|
+
const links = model.links.length ? `<p class="absolute-voice-reconnect-evidence__links">${model.links.map((link) => `<a href="${escapeHtml11(link.href)}">${escapeHtml11(link.label)}</a>`).join("")}</p>` : "";
|
|
5999
|
+
return `<section class="absolute-voice-reconnect-evidence absolute-voice-reconnect-evidence--${escapeHtml11(model.status)}">
|
|
6000
|
+
<header class="absolute-voice-reconnect-evidence__header">
|
|
6001
|
+
<span class="absolute-voice-reconnect-evidence__eyebrow">${escapeHtml11(model.title)}</span>
|
|
6002
|
+
<strong class="absolute-voice-reconnect-evidence__label">${escapeHtml11(model.label)}</strong>
|
|
6003
|
+
</header>
|
|
6004
|
+
<p class="absolute-voice-reconnect-evidence__description">${escapeHtml11(model.description)}</p>
|
|
6005
|
+
${metrics}
|
|
6006
|
+
${latest}
|
|
6007
|
+
${links}
|
|
6008
|
+
${model.error ? `<p class="absolute-voice-reconnect-evidence__error">${escapeHtml11(model.error)}</p>` : ""}
|
|
6009
|
+
</section>`;
|
|
6010
|
+
};
|
|
6011
|
+
var getVoiceReconnectProfileEvidenceCSS = () => `.absolute-voice-reconnect-evidence{border:1px solid #bae6fd;border-radius:20px;background:#f0f9ff;color:#0f172a;padding:18px;box-shadow:0 18px 40px rgba(14,165,233,.12);font-family:inherit}.absolute-voice-reconnect-evidence--warning,.absolute-voice-reconnect-evidence--error{border-color:#fbbf24;background:#fffbeb}.absolute-voice-reconnect-evidence__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-reconnect-evidence__eyebrow{color:#0369a1;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-reconnect-evidence__label{font-size:24px;line-height:1}.absolute-voice-reconnect-evidence__description,.absolute-voice-reconnect-evidence__empty,.absolute-voice-reconnect-evidence__latest{color:#475569}.absolute-voice-reconnect-evidence__metrics{display:grid;gap:10px;grid-template-columns:repeat(4,minmax(0,1fr));margin-top:14px}.absolute-voice-reconnect-evidence__metrics article{background:#fff;border:1px solid #bae6fd;border-radius:16px;padding:12px}.absolute-voice-reconnect-evidence__metrics span{color:#64748b;display:block;font-size:11px;font-weight:800;text-transform:uppercase}.absolute-voice-reconnect-evidence__metrics strong{display:block;font-size:20px;margin-top:4px}.absolute-voice-reconnect-evidence__links{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 0}.absolute-voice-reconnect-evidence__links a{border:1px solid #7dd3fc;border-radius:999px;color:#0369a1;font-weight:800;padding:6px 10px;text-decoration:none}.absolute-voice-reconnect-evidence__error{color:#9f1239;font-weight:700}@media (max-width:720px){.absolute-voice-reconnect-evidence__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}`;
|
|
6012
|
+
var mountVoiceReconnectProfileEvidence = (element, path = "/api/voice/reconnect-profile-evidence", options = {}) => {
|
|
6013
|
+
const store = createVoiceReconnectProfileEvidenceStore(path, options);
|
|
6014
|
+
const render = () => {
|
|
6015
|
+
element.innerHTML = renderVoiceReconnectProfileEvidenceHTML(store.getSnapshot(), options);
|
|
6016
|
+
};
|
|
6017
|
+
const unsubscribe = store.subscribe(render);
|
|
6018
|
+
render();
|
|
6019
|
+
store.refresh().catch(() => {});
|
|
6020
|
+
return {
|
|
6021
|
+
close: () => {
|
|
6022
|
+
unsubscribe();
|
|
6023
|
+
store.close();
|
|
6024
|
+
},
|
|
6025
|
+
refresh: store.refresh
|
|
6026
|
+
};
|
|
6027
|
+
};
|
|
6028
|
+
var defineVoiceReconnectProfileEvidenceElement = (tagName = "absolute-voice-reconnect-profile-evidence") => {
|
|
6029
|
+
if (typeof window === "undefined" || typeof customElements === "undefined" || customElements.get(tagName)) {
|
|
6030
|
+
return;
|
|
6031
|
+
}
|
|
6032
|
+
customElements.define(tagName, class AbsoluteVoiceReconnectProfileEvidenceElement extends HTMLElement {
|
|
6033
|
+
mounted;
|
|
6034
|
+
connectedCallback() {
|
|
6035
|
+
const intervalMs = Number(this.getAttribute("interval-ms") ?? 5000);
|
|
6036
|
+
this.mounted = mountVoiceReconnectProfileEvidence(this, this.getAttribute("path") ?? "/api/voice/reconnect-profile-evidence", {
|
|
6037
|
+
description: this.getAttribute("description") ?? undefined,
|
|
6038
|
+
intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000,
|
|
6039
|
+
title: this.getAttribute("title") ?? undefined
|
|
6040
|
+
});
|
|
6041
|
+
}
|
|
6042
|
+
disconnectedCallback() {
|
|
6043
|
+
this.mounted?.close();
|
|
6044
|
+
this.mounted = undefined;
|
|
6045
|
+
}
|
|
6046
|
+
});
|
|
6047
|
+
};
|
|
6048
|
+
|
|
6049
|
+
// src/vue/useVoiceReconnectProfileEvidence.ts
|
|
6050
|
+
import { onUnmounted as onUnmounted6, ref as ref6, shallowRef as shallowRef6 } from "vue";
|
|
6051
|
+
function useVoiceReconnectProfileEvidence(path = "/api/voice/reconnect-profile-evidence", options = {}) {
|
|
6052
|
+
const store = createVoiceReconnectProfileEvidenceStore(path, options);
|
|
6053
|
+
const error = ref6(null);
|
|
6054
|
+
const isLoading = ref6(false);
|
|
6055
|
+
const report = shallowRef6(undefined);
|
|
6056
|
+
const updatedAt = ref6(undefined);
|
|
6057
|
+
const sync = () => {
|
|
6058
|
+
const snapshot = store.getSnapshot();
|
|
6059
|
+
error.value = snapshot.error;
|
|
6060
|
+
isLoading.value = snapshot.isLoading;
|
|
6061
|
+
report.value = snapshot.report;
|
|
6062
|
+
updatedAt.value = snapshot.updatedAt;
|
|
6063
|
+
};
|
|
6064
|
+
const unsubscribe = store.subscribe(sync);
|
|
6065
|
+
sync();
|
|
6066
|
+
if (typeof window !== "undefined") {
|
|
6067
|
+
store.refresh().catch(() => {});
|
|
6068
|
+
}
|
|
6069
|
+
onUnmounted6(() => {
|
|
6070
|
+
unsubscribe();
|
|
6071
|
+
store.close();
|
|
6072
|
+
});
|
|
6073
|
+
return {
|
|
6074
|
+
error,
|
|
6075
|
+
isLoading,
|
|
6076
|
+
refresh: store.refresh,
|
|
6077
|
+
report,
|
|
6078
|
+
updatedAt
|
|
6079
|
+
};
|
|
6080
|
+
}
|
|
6081
|
+
|
|
6082
|
+
// src/vue/VoiceReconnectProfileEvidence.ts
|
|
6083
|
+
var VoiceReconnectProfileEvidence = defineComponent6({
|
|
6084
|
+
name: "VoiceReconnectProfileEvidence",
|
|
6085
|
+
props: {
|
|
6086
|
+
description: String,
|
|
6087
|
+
intervalMs: Number,
|
|
6088
|
+
path: {
|
|
6089
|
+
default: "/api/voice/reconnect-profile-evidence",
|
|
6090
|
+
type: String
|
|
6091
|
+
},
|
|
6092
|
+
title: String
|
|
6093
|
+
},
|
|
6094
|
+
setup(props) {
|
|
6095
|
+
const state = useVoiceReconnectProfileEvidence(props.path, {
|
|
6096
|
+
description: props.description,
|
|
6097
|
+
intervalMs: props.intervalMs,
|
|
6098
|
+
title: props.title
|
|
6099
|
+
});
|
|
6100
|
+
return () => {
|
|
6101
|
+
const model = createVoiceReconnectProfileEvidenceViewModel({
|
|
6102
|
+
error: state.error.value,
|
|
6103
|
+
isLoading: state.isLoading.value,
|
|
6104
|
+
report: state.report.value,
|
|
6105
|
+
updatedAt: state.updatedAt.value
|
|
6106
|
+
}, {
|
|
6107
|
+
description: props.description,
|
|
6108
|
+
intervalMs: props.intervalMs,
|
|
6109
|
+
title: props.title
|
|
6110
|
+
});
|
|
6111
|
+
return h6("section", {
|
|
6112
|
+
class: [
|
|
6113
|
+
"absolute-voice-reconnect-evidence",
|
|
6114
|
+
`absolute-voice-reconnect-evidence--${model.status}`
|
|
6115
|
+
]
|
|
6116
|
+
}, [
|
|
6117
|
+
h6("header", { class: "absolute-voice-reconnect-evidence__header" }, [
|
|
6118
|
+
h6("span", { class: "absolute-voice-reconnect-evidence__eyebrow" }, model.title),
|
|
6119
|
+
h6("strong", { class: "absolute-voice-reconnect-evidence__label" }, model.label)
|
|
6120
|
+
]),
|
|
6121
|
+
h6("p", { class: "absolute-voice-reconnect-evidence__description" }, model.description),
|
|
6122
|
+
h6("div", { class: "absolute-voice-reconnect-evidence__metrics" }, model.metrics.map((metric) => h6("article", { key: metric.label }, [
|
|
6123
|
+
h6("span", metric.label),
|
|
6124
|
+
h6("strong", metric.value)
|
|
6125
|
+
]))),
|
|
6126
|
+
model.latest ? h6("p", { class: "absolute-voice-reconnect-evidence__latest" }, `Latest ${model.latest.profileLabel} \xB7 ${model.latest.sessionId} \xB7 ${model.latest.surfaces}`) : h6("p", { class: "absolute-voice-reconnect-evidence__empty" }, "No persisted reconnect profile evidence yet."),
|
|
6127
|
+
model.links.length ? h6("p", { class: "absolute-voice-reconnect-evidence__links" }, model.links.map((link) => h6("a", { href: link.href, key: link.href }, link.label))) : null,
|
|
6128
|
+
model.error ? h6("p", { class: "absolute-voice-reconnect-evidence__error" }, model.error) : null
|
|
6129
|
+
]);
|
|
6130
|
+
};
|
|
6131
|
+
}
|
|
6132
|
+
});
|
|
5748
6133
|
// src/vue/VoiceCallDebuggerLaunch.ts
|
|
5749
|
-
import { computed as computed2, defineComponent as
|
|
6134
|
+
import { computed as computed2, defineComponent as defineComponent7, h as h7 } from "vue";
|
|
5750
6135
|
|
|
5751
6136
|
// src/client/callDebugger.ts
|
|
5752
6137
|
var fetchVoiceCallDebugger = async (path, options = {}) => {
|
|
@@ -5824,10 +6209,10 @@ var createVoiceCallDebuggerStore = (path, options = {}) => {
|
|
|
5824
6209
|
};
|
|
5825
6210
|
|
|
5826
6211
|
// src/client/callDebuggerWidget.ts
|
|
5827
|
-
var
|
|
5828
|
-
var
|
|
6212
|
+
var DEFAULT_TITLE7 = "Call Debugger";
|
|
6213
|
+
var DEFAULT_DESCRIPTION7 = "Open the latest call artifact with snapshot, operations record, failure replay, provider path, transcript, and incident markdown.";
|
|
5829
6214
|
var DEFAULT_LINK_LABEL = "Open debugger";
|
|
5830
|
-
var
|
|
6215
|
+
var escapeHtml12 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
5831
6216
|
var defaultHref = (path, report) => {
|
|
5832
6217
|
if (path.startsWith("/api/voice-call-debugger/")) {
|
|
5833
6218
|
return path.replace("/api/voice-call-debugger/", "/voice-call-debugger/");
|
|
@@ -5844,7 +6229,7 @@ var createVoiceCallDebuggerLaunchViewModel = (path, state, options = {}) => {
|
|
|
5844
6229
|
const report = state.report;
|
|
5845
6230
|
const href = resolveHref(path, state, options);
|
|
5846
6231
|
return {
|
|
5847
|
-
description: options.description ??
|
|
6232
|
+
description: options.description ?? DEFAULT_DESCRIPTION7,
|
|
5848
6233
|
error: state.error,
|
|
5849
6234
|
href,
|
|
5850
6235
|
isLoading: state.isLoading,
|
|
@@ -5873,25 +6258,25 @@ var createVoiceCallDebuggerLaunchViewModel = (path, state, options = {}) => {
|
|
|
5873
6258
|
{ label: "Snapshot", value: report.snapshot.status }
|
|
5874
6259
|
] : [],
|
|
5875
6260
|
status: state.error ? "error" : report ? report.status === "healthy" ? "ready" : "warning" : state.isLoading ? "loading" : "empty",
|
|
5876
|
-
title: options.title ??
|
|
6261
|
+
title: options.title ?? DEFAULT_TITLE7,
|
|
5877
6262
|
updatedAt: state.updatedAt
|
|
5878
6263
|
};
|
|
5879
6264
|
};
|
|
5880
6265
|
var renderVoiceCallDebuggerLaunchHTML = (path, state, options = {}) => {
|
|
5881
6266
|
const model = createVoiceCallDebuggerLaunchViewModel(path, state, options);
|
|
5882
6267
|
const rows = model.rows.length ? `<dl>${model.rows.map((row) => `<div>
|
|
5883
|
-
<dt>${
|
|
5884
|
-
<dd>${
|
|
6268
|
+
<dt>${escapeHtml12(row.label)}</dt>
|
|
6269
|
+
<dd>${escapeHtml12(row.value)}</dd>
|
|
5885
6270
|
</div>`).join("")}</dl>` : '<p class="absolute-voice-call-debugger-launch__empty">Load a call debugger report to see the latest support artifact.</p>';
|
|
5886
|
-
return `<section class="absolute-voice-call-debugger-launch absolute-voice-call-debugger-launch--${
|
|
6271
|
+
return `<section class="absolute-voice-call-debugger-launch absolute-voice-call-debugger-launch--${escapeHtml12(model.status)}">
|
|
5887
6272
|
<header class="absolute-voice-call-debugger-launch__header">
|
|
5888
|
-
<span class="absolute-voice-call-debugger-launch__eyebrow">${
|
|
5889
|
-
<strong class="absolute-voice-call-debugger-launch__label">${
|
|
6273
|
+
<span class="absolute-voice-call-debugger-launch__eyebrow">${escapeHtml12(model.title)}</span>
|
|
6274
|
+
<strong class="absolute-voice-call-debugger-launch__label">${escapeHtml12(model.label)}</strong>
|
|
5890
6275
|
</header>
|
|
5891
|
-
<p class="absolute-voice-call-debugger-launch__description">${
|
|
5892
|
-
<a class="absolute-voice-call-debugger-launch__link" href="${
|
|
6276
|
+
<p class="absolute-voice-call-debugger-launch__description">${escapeHtml12(model.description)}</p>
|
|
6277
|
+
<a class="absolute-voice-call-debugger-launch__link" href="${escapeHtml12(model.href)}">${escapeHtml12(options.linkLabel ?? DEFAULT_LINK_LABEL)}</a>
|
|
5893
6278
|
${rows}
|
|
5894
|
-
${model.error ? `<p class="absolute-voice-call-debugger-launch__error">${
|
|
6279
|
+
${model.error ? `<p class="absolute-voice-call-debugger-launch__error">${escapeHtml12(model.error)}</p>` : ""}
|
|
5895
6280
|
</section>`;
|
|
5896
6281
|
};
|
|
5897
6282
|
var mountVoiceCallDebuggerLaunch = (element, path, options = {}) => {
|
|
@@ -5934,13 +6319,13 @@ var defineVoiceCallDebuggerLaunchElement = (tagName = "absolute-voice-call-debug
|
|
|
5934
6319
|
};
|
|
5935
6320
|
|
|
5936
6321
|
// src/vue/useVoiceCallDebugger.ts
|
|
5937
|
-
import { computed, onUnmounted as
|
|
6322
|
+
import { computed, onUnmounted as onUnmounted7, shallowRef as shallowRef7 } from "vue";
|
|
5938
6323
|
function useVoiceCallDebugger(path, options = {}) {
|
|
5939
6324
|
const store = createVoiceCallDebuggerStore(path, options);
|
|
5940
|
-
const error =
|
|
5941
|
-
const isLoading =
|
|
5942
|
-
const report =
|
|
5943
|
-
const updatedAt =
|
|
6325
|
+
const error = shallowRef7(null);
|
|
6326
|
+
const isLoading = shallowRef7(false);
|
|
6327
|
+
const report = shallowRef7();
|
|
6328
|
+
const updatedAt = shallowRef7();
|
|
5944
6329
|
const sync = () => {
|
|
5945
6330
|
const state = store.getSnapshot();
|
|
5946
6331
|
error.value = state.error;
|
|
@@ -5951,7 +6336,7 @@ function useVoiceCallDebugger(path, options = {}) {
|
|
|
5951
6336
|
const unsubscribe = store.subscribe(sync);
|
|
5952
6337
|
sync();
|
|
5953
6338
|
store.refresh().catch(() => {});
|
|
5954
|
-
|
|
6339
|
+
onUnmounted7(() => {
|
|
5955
6340
|
unsubscribe();
|
|
5956
6341
|
store.close();
|
|
5957
6342
|
});
|
|
@@ -5966,7 +6351,7 @@ function useVoiceCallDebugger(path, options = {}) {
|
|
|
5966
6351
|
}
|
|
5967
6352
|
|
|
5968
6353
|
// src/vue/VoiceCallDebuggerLaunch.ts
|
|
5969
|
-
var VoiceCallDebuggerLaunch =
|
|
6354
|
+
var VoiceCallDebuggerLaunch = defineComponent7({
|
|
5970
6355
|
name: "VoiceCallDebuggerLaunch",
|
|
5971
6356
|
props: {
|
|
5972
6357
|
class: { default: "", type: String },
|
|
@@ -5992,32 +6377,32 @@ var VoiceCallDebuggerLaunch = defineComponent6({
|
|
|
5992
6377
|
report: state.report.value,
|
|
5993
6378
|
updatedAt: state.updatedAt.value
|
|
5994
6379
|
}, options));
|
|
5995
|
-
return () =>
|
|
6380
|
+
return () => h7("section", {
|
|
5996
6381
|
class: [
|
|
5997
6382
|
"absolute-voice-call-debugger-launch",
|
|
5998
6383
|
`absolute-voice-call-debugger-launch--${model.value.status}`,
|
|
5999
6384
|
props.class
|
|
6000
6385
|
]
|
|
6001
6386
|
}, [
|
|
6002
|
-
|
|
6003
|
-
|
|
6004
|
-
|
|
6387
|
+
h7("header", { class: "absolute-voice-call-debugger-launch__header" }, [
|
|
6388
|
+
h7("span", { class: "absolute-voice-call-debugger-launch__eyebrow" }, model.value.title),
|
|
6389
|
+
h7("strong", { class: "absolute-voice-call-debugger-launch__label" }, model.value.label)
|
|
6005
6390
|
]),
|
|
6006
|
-
|
|
6007
|
-
|
|
6391
|
+
h7("p", { class: "absolute-voice-call-debugger-launch__description" }, model.value.description),
|
|
6392
|
+
h7("a", {
|
|
6008
6393
|
class: "absolute-voice-call-debugger-launch__link",
|
|
6009
6394
|
href: model.value.href
|
|
6010
6395
|
}, props.linkLabel ?? "Open debugger"),
|
|
6011
|
-
model.value.rows.length ?
|
|
6012
|
-
|
|
6013
|
-
|
|
6014
|
-
]))) :
|
|
6015
|
-
model.value.error ?
|
|
6396
|
+
model.value.rows.length ? h7("dl", model.value.rows.map((row) => h7("div", { key: row.label }, [
|
|
6397
|
+
h7("dt", row.label),
|
|
6398
|
+
h7("dd", row.value)
|
|
6399
|
+
]))) : h7("p", { class: "absolute-voice-call-debugger-launch__empty" }, "Load a call debugger report to see the latest support artifact."),
|
|
6400
|
+
model.value.error ? h7("p", { class: "absolute-voice-call-debugger-launch__error" }, model.value.error) : null
|
|
6016
6401
|
]);
|
|
6017
6402
|
}
|
|
6018
6403
|
});
|
|
6019
6404
|
// src/vue/VoiceSessionSnapshot.ts
|
|
6020
|
-
import { computed as computed3, defineComponent as
|
|
6405
|
+
import { computed as computed3, defineComponent as defineComponent8, h as h8 } from "vue";
|
|
6021
6406
|
|
|
6022
6407
|
// src/client/sessionSnapshot.ts
|
|
6023
6408
|
var withTurnId = (path, turnId) => {
|
|
@@ -6113,10 +6498,10 @@ var createVoiceSessionSnapshotStore = (path, options = {}) => {
|
|
|
6113
6498
|
};
|
|
6114
6499
|
|
|
6115
6500
|
// src/client/sessionSnapshotWidget.ts
|
|
6116
|
-
var
|
|
6117
|
-
var
|
|
6501
|
+
var DEFAULT_TITLE8 = "Session Snapshot";
|
|
6502
|
+
var DEFAULT_DESCRIPTION8 = "Portable call artifact with media graph, provider routing, proof, quality, and telephony evidence.";
|
|
6118
6503
|
var DEFAULT_DOWNLOAD_LABEL = "Download snapshot";
|
|
6119
|
-
var
|
|
6504
|
+
var escapeHtml13 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
6120
6505
|
var formatStatus2 = (status) => status ?? "n/a";
|
|
6121
6506
|
var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
|
|
6122
6507
|
const snapshot = state.snapshot;
|
|
@@ -6132,7 +6517,7 @@ var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
|
|
|
6132
6517
|
label: artifact.label,
|
|
6133
6518
|
status: formatStatus2(artifact.status)
|
|
6134
6519
|
})) ?? [],
|
|
6135
|
-
description: options.description ??
|
|
6520
|
+
description: options.description ?? DEFAULT_DESCRIPTION8,
|
|
6136
6521
|
error: state.error,
|
|
6137
6522
|
isLoading: state.isLoading,
|
|
6138
6523
|
label: state.error ? "Unavailable" : snapshot ? `${snapshot.status} \xB7 ${snapshot.sessionId}` : state.isLoading ? "Loading" : "No snapshot",
|
|
@@ -6159,30 +6544,30 @@ var createVoiceSessionSnapshotViewModel = (state, options = {}) => {
|
|
|
6159
6544
|
] : [],
|
|
6160
6545
|
showDownload: snapshot !== undefined,
|
|
6161
6546
|
status: state.error ? "error" : snapshot ? snapshot.status === "pass" ? "ready" : "warning" : state.isLoading ? "loading" : "empty",
|
|
6162
|
-
title: options.title ??
|
|
6547
|
+
title: options.title ?? DEFAULT_TITLE8,
|
|
6163
6548
|
updatedAt: state.updatedAt
|
|
6164
6549
|
};
|
|
6165
6550
|
};
|
|
6166
6551
|
var renderVoiceSessionSnapshotHTML = (state, options = {}) => {
|
|
6167
6552
|
const model = createVoiceSessionSnapshotViewModel(state, options);
|
|
6168
6553
|
const rows = model.rows.length ? `<dl>${model.rows.map((row) => `<div>
|
|
6169
|
-
<dt>${
|
|
6170
|
-
<dd>${
|
|
6554
|
+
<dt>${escapeHtml13(row.label)}</dt>
|
|
6555
|
+
<dd>${escapeHtml13(row.value)}</dd>
|
|
6171
6556
|
</div>`).join("")}</dl>` : '<p class="absolute-voice-session-snapshot__empty">Load a session snapshot to see support diagnostics.</p>';
|
|
6172
6557
|
const artifacts = model.artifacts.length ? `<div class="absolute-voice-session-snapshot__artifacts">${model.artifacts.map((artifact) => {
|
|
6173
|
-
const body = `<strong>${
|
|
6174
|
-
return artifact.href ? `<a href="${
|
|
6558
|
+
const body = `<strong>${escapeHtml13(artifact.label)}</strong><span>${escapeHtml13(artifact.status)}</span>`;
|
|
6559
|
+
return artifact.href ? `<a href="${escapeHtml13(artifact.href)}">${body}</a>` : `<div>${body}</div>`;
|
|
6175
6560
|
}).join("")}</div>` : "";
|
|
6176
|
-
return `<section class="absolute-voice-session-snapshot absolute-voice-session-snapshot--${
|
|
6561
|
+
return `<section class="absolute-voice-session-snapshot absolute-voice-session-snapshot--${escapeHtml13(model.status)}">
|
|
6177
6562
|
<header class="absolute-voice-session-snapshot__header">
|
|
6178
|
-
<span class="absolute-voice-session-snapshot__eyebrow">${
|
|
6179
|
-
<strong class="absolute-voice-session-snapshot__label">${
|
|
6563
|
+
<span class="absolute-voice-session-snapshot__eyebrow">${escapeHtml13(model.title)}</span>
|
|
6564
|
+
<strong class="absolute-voice-session-snapshot__label">${escapeHtml13(model.label)}</strong>
|
|
6180
6565
|
</header>
|
|
6181
|
-
<p class="absolute-voice-session-snapshot__description">${
|
|
6182
|
-
${model.showDownload ? `<button class="absolute-voice-session-snapshot__download" data-absolute-voice-session-snapshot-download type="button">${
|
|
6566
|
+
<p class="absolute-voice-session-snapshot__description">${escapeHtml13(model.description)}</p>
|
|
6567
|
+
${model.showDownload ? `<button class="absolute-voice-session-snapshot__download" data-absolute-voice-session-snapshot-download type="button">${escapeHtml13(options.downloadLabel ?? DEFAULT_DOWNLOAD_LABEL)}</button>` : ""}
|
|
6183
6568
|
${rows}
|
|
6184
6569
|
${artifacts}
|
|
6185
|
-
${model.error ? `<p class="absolute-voice-session-snapshot__error">${
|
|
6570
|
+
${model.error ? `<p class="absolute-voice-session-snapshot__error">${escapeHtml13(model.error)}</p>` : ""}
|
|
6186
6571
|
</section>`;
|
|
6187
6572
|
};
|
|
6188
6573
|
var downloadBlob = (blob, filename) => {
|
|
@@ -6246,13 +6631,13 @@ var defineVoiceSessionSnapshotElement = (tagName = "absolute-voice-session-snaps
|
|
|
6246
6631
|
};
|
|
6247
6632
|
|
|
6248
6633
|
// src/vue/useVoiceSessionSnapshot.ts
|
|
6249
|
-
import { onUnmounted as
|
|
6634
|
+
import { onUnmounted as onUnmounted8, shallowRef as shallowRef8 } from "vue";
|
|
6250
6635
|
function useVoiceSessionSnapshot(path, options = {}) {
|
|
6251
6636
|
const store = createVoiceSessionSnapshotStore(path, options);
|
|
6252
|
-
const error =
|
|
6253
|
-
const isLoading =
|
|
6254
|
-
const snapshot =
|
|
6255
|
-
const updatedAt =
|
|
6637
|
+
const error = shallowRef8(null);
|
|
6638
|
+
const isLoading = shallowRef8(false);
|
|
6639
|
+
const snapshot = shallowRef8();
|
|
6640
|
+
const updatedAt = shallowRef8(undefined);
|
|
6256
6641
|
const sync = () => {
|
|
6257
6642
|
const state = store.getSnapshot();
|
|
6258
6643
|
error.value = state.error;
|
|
@@ -6263,7 +6648,7 @@ function useVoiceSessionSnapshot(path, options = {}) {
|
|
|
6263
6648
|
const unsubscribe = store.subscribe(sync);
|
|
6264
6649
|
sync();
|
|
6265
6650
|
store.refresh().catch(() => {});
|
|
6266
|
-
|
|
6651
|
+
onUnmounted8(() => {
|
|
6267
6652
|
unsubscribe();
|
|
6268
6653
|
store.close();
|
|
6269
6654
|
});
|
|
@@ -6278,7 +6663,7 @@ function useVoiceSessionSnapshot(path, options = {}) {
|
|
|
6278
6663
|
}
|
|
6279
6664
|
|
|
6280
6665
|
// src/vue/VoiceSessionSnapshot.ts
|
|
6281
|
-
var VoiceSessionSnapshot =
|
|
6666
|
+
var VoiceSessionSnapshot = defineComponent8({
|
|
6282
6667
|
name: "VoiceSessionSnapshot",
|
|
6283
6668
|
props: {
|
|
6284
6669
|
class: { default: "", type: String },
|
|
@@ -6304,33 +6689,33 @@ var VoiceSessionSnapshot = defineComponent7({
|
|
|
6304
6689
|
snapshot: state.snapshot.value,
|
|
6305
6690
|
updatedAt: state.updatedAt.value
|
|
6306
6691
|
}, options));
|
|
6307
|
-
return () =>
|
|
6692
|
+
return () => h8("section", {
|
|
6308
6693
|
class: [
|
|
6309
6694
|
"absolute-voice-session-snapshot",
|
|
6310
6695
|
`absolute-voice-session-snapshot--${model.value.status}`,
|
|
6311
6696
|
props.class
|
|
6312
6697
|
]
|
|
6313
6698
|
}, [
|
|
6314
|
-
|
|
6315
|
-
|
|
6316
|
-
|
|
6699
|
+
h8("header", { class: "absolute-voice-session-snapshot__header" }, [
|
|
6700
|
+
h8("span", { class: "absolute-voice-session-snapshot__eyebrow" }, model.value.title),
|
|
6701
|
+
h8("strong", { class: "absolute-voice-session-snapshot__label" }, model.value.label)
|
|
6317
6702
|
]),
|
|
6318
|
-
|
|
6319
|
-
model.value.showDownload ?
|
|
6703
|
+
h8("p", { class: "absolute-voice-session-snapshot__description" }, model.value.description),
|
|
6704
|
+
model.value.showDownload ? h8("button", {
|
|
6320
6705
|
class: "absolute-voice-session-snapshot__download",
|
|
6321
6706
|
onClick: () => state.download(),
|
|
6322
6707
|
type: "button"
|
|
6323
6708
|
}, props.downloadLabel ?? "Download snapshot") : null,
|
|
6324
|
-
model.value.rows.length ?
|
|
6325
|
-
|
|
6326
|
-
|
|
6327
|
-
]))) :
|
|
6328
|
-
model.value.error ?
|
|
6709
|
+
model.value.rows.length ? h8("dl", model.value.rows.map((row) => h8("div", { key: row.label }, [
|
|
6710
|
+
h8("dt", row.label),
|
|
6711
|
+
h8("dd", row.value)
|
|
6712
|
+
]))) : h8("p", { class: "absolute-voice-session-snapshot__empty" }, "Load a session snapshot to see support diagnostics."),
|
|
6713
|
+
model.value.error ? h8("p", { class: "absolute-voice-session-snapshot__error" }, model.value.error) : null
|
|
6329
6714
|
]);
|
|
6330
6715
|
}
|
|
6331
6716
|
});
|
|
6332
6717
|
// src/vue/VoiceReadinessFailures.ts
|
|
6333
|
-
import { defineComponent as
|
|
6718
|
+
import { defineComponent as defineComponent9, h as h9 } from "vue";
|
|
6334
6719
|
|
|
6335
6720
|
// src/client/readinessFailures.ts
|
|
6336
6721
|
var fetchVoiceReadinessFailures = async (path = "/api/production-readiness", options = {}) => {
|
|
@@ -6408,13 +6793,13 @@ var createVoiceReadinessFailuresStore = (path = "/api/production-readiness", opt
|
|
|
6408
6793
|
};
|
|
6409
6794
|
|
|
6410
6795
|
// src/client/readinessFailuresWidget.ts
|
|
6411
|
-
var
|
|
6412
|
-
var
|
|
6413
|
-
var
|
|
6796
|
+
var DEFAULT_TITLE9 = "Readiness Gate Explanations";
|
|
6797
|
+
var DEFAULT_DESCRIPTION9 = "Structured reasons for calibrated production-readiness warnings and failures.";
|
|
6798
|
+
var DEFAULT_LINKS4 = [
|
|
6414
6799
|
{ href: "/production-readiness", label: "Readiness page" },
|
|
6415
6800
|
{ href: "/voice/slo-readiness-thresholds", label: "Gate thresholds" }
|
|
6416
6801
|
];
|
|
6417
|
-
var
|
|
6802
|
+
var escapeHtml14 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
6418
6803
|
var formatExplanationValue = (value, unit) => {
|
|
6419
6804
|
if (value === undefined || value === null) {
|
|
6420
6805
|
return "n/a";
|
|
@@ -6442,36 +6827,36 @@ var createVoiceReadinessFailuresViewModel = (snapshot, options = {}) => {
|
|
|
6442
6827
|
const failures = snapshot.report?.checks.map(toFailureView).filter((value) => !!value) ?? [];
|
|
6443
6828
|
const hasOpenIssues = failures.length > 0;
|
|
6444
6829
|
return {
|
|
6445
|
-
description: options.description ??
|
|
6830
|
+
description: options.description ?? DEFAULT_DESCRIPTION9,
|
|
6446
6831
|
error: snapshot.error,
|
|
6447
6832
|
failures,
|
|
6448
6833
|
isLoading: snapshot.isLoading,
|
|
6449
6834
|
label: snapshot.error ? "Unavailable" : snapshot.report ? hasOpenIssues ? `${failures.length} calibrated gate issue(s)` : "No calibrated gate issues" : snapshot.isLoading ? "Checking" : "No readiness report",
|
|
6450
|
-
links: options.links ??
|
|
6835
|
+
links: options.links ?? DEFAULT_LINKS4,
|
|
6451
6836
|
status: snapshot.error ? "error" : snapshot.report ? hasOpenIssues ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
6452
|
-
title: options.title ??
|
|
6837
|
+
title: options.title ?? DEFAULT_TITLE9,
|
|
6453
6838
|
updatedAt: snapshot.updatedAt
|
|
6454
6839
|
};
|
|
6455
6840
|
};
|
|
6456
6841
|
var renderVoiceReadinessFailuresHTML = (snapshot, options = {}) => {
|
|
6457
6842
|
const model = createVoiceReadinessFailuresViewModel(snapshot, options);
|
|
6458
|
-
const failures = model.failures.length ? `<div class="absolute-voice-readiness-failures__items">${model.failures.map((failure) => `<article class="absolute-voice-readiness-failures__item absolute-voice-readiness-failures__item--${
|
|
6459
|
-
<span>${
|
|
6460
|
-
<strong>${
|
|
6461
|
-
<p>Observed ${
|
|
6462
|
-
<p>${
|
|
6463
|
-
<p class="absolute-voice-readiness-failures__links">${failure.evidenceHref ? `<a href="${
|
|
6464
|
-
</article>`).join("")}</div>` : `<p class="absolute-voice-readiness-failures__empty">${model.error ?
|
|
6465
|
-
const links = model.links.length ? `<p class="absolute-voice-readiness-failures__links">${model.links.map((link) => `<a href="${
|
|
6466
|
-
return `<section class="absolute-voice-readiness-failures absolute-voice-readiness-failures--${
|
|
6843
|
+
const failures = model.failures.length ? `<div class="absolute-voice-readiness-failures__items">${model.failures.map((failure) => `<article class="absolute-voice-readiness-failures__item absolute-voice-readiness-failures__item--${escapeHtml14(failure.status)}">
|
|
6844
|
+
<span>${escapeHtml14(failure.status.toUpperCase())}</span>
|
|
6845
|
+
<strong>${escapeHtml14(failure.label)}</strong>
|
|
6846
|
+
<p>Observed ${escapeHtml14(failure.observed)} against ${escapeHtml14(failure.thresholdLabel)} ${escapeHtml14(failure.threshold)}.</p>
|
|
6847
|
+
<p>${escapeHtml14(failure.remediation)}</p>
|
|
6848
|
+
<p class="absolute-voice-readiness-failures__links">${failure.evidenceHref ? `<a href="${escapeHtml14(failure.evidenceHref)}">Evidence</a>` : ""}${failure.sourceHref ? `<a href="${escapeHtml14(failure.sourceHref)}">Threshold source</a>` : ""}</p>
|
|
6849
|
+
</article>`).join("")}</div>` : `<p class="absolute-voice-readiness-failures__empty">${model.error ? escapeHtml14(model.error) : "No calibrated readiness gate explanations are open."}</p>`;
|
|
6850
|
+
const links = model.links.length ? `<p class="absolute-voice-readiness-failures__links">${model.links.map((link) => `<a href="${escapeHtml14(link.href)}">${escapeHtml14(link.label)}</a>`).join("")}</p>` : "";
|
|
6851
|
+
return `<section class="absolute-voice-readiness-failures absolute-voice-readiness-failures--${escapeHtml14(model.status)}">
|
|
6467
6852
|
<header class="absolute-voice-readiness-failures__header">
|
|
6468
|
-
<span class="absolute-voice-readiness-failures__eyebrow">${
|
|
6469
|
-
<strong class="absolute-voice-readiness-failures__label">${
|
|
6853
|
+
<span class="absolute-voice-readiness-failures__eyebrow">${escapeHtml14(model.title)}</span>
|
|
6854
|
+
<strong class="absolute-voice-readiness-failures__label">${escapeHtml14(model.label)}</strong>
|
|
6470
6855
|
</header>
|
|
6471
|
-
<p class="absolute-voice-readiness-failures__description">${
|
|
6856
|
+
<p class="absolute-voice-readiness-failures__description">${escapeHtml14(model.description)}</p>
|
|
6472
6857
|
${failures}
|
|
6473
6858
|
${links}
|
|
6474
|
-
${model.error ? `<p class="absolute-voice-readiness-failures__error">${
|
|
6859
|
+
${model.error ? `<p class="absolute-voice-readiness-failures__error">${escapeHtml14(model.error)}</p>` : ""}
|
|
6475
6860
|
</section>`;
|
|
6476
6861
|
};
|
|
6477
6862
|
var getVoiceReadinessFailuresCSS = () => `.absolute-voice-readiness-failures{border:1px solid #fed7aa;border-radius:20px;background:#fff7ed;color:#1c1917;padding:18px;box-shadow:0 18px 40px rgba(234,88,12,.12);font-family:inherit}.absolute-voice-readiness-failures--ready{border-color:#86efac;background:#f0fdf4}.absolute-voice-readiness-failures--error{border-color:#fda4af;background:#fff1f2}.absolute-voice-readiness-failures__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-readiness-failures__eyebrow{color:#9a3412;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-readiness-failures__label{font-size:24px;line-height:1}.absolute-voice-readiness-failures__description,.absolute-voice-readiness-failures__empty{color:#57534e}.absolute-voice-readiness-failures__items{display:grid;gap:10px;margin-top:14px}.absolute-voice-readiness-failures__item{background:white;border:1px solid #fed7aa;border-radius:16px;padding:12px}.absolute-voice-readiness-failures__item--fail{border-color:#fb7185}.absolute-voice-readiness-failures__item span{color:#9a3412;display:block;font-size:12px;font-weight:900;text-transform:uppercase}.absolute-voice-readiness-failures__item strong{display:block;font-size:18px;margin-top:4px}.absolute-voice-readiness-failures__item p{margin:.45rem 0 0}.absolute-voice-readiness-failures__links{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 0}.absolute-voice-readiness-failures__links a{border:1px solid #fdba74;border-radius:999px;color:#9a3412;font-weight:800;padding:6px 10px;text-decoration:none}.absolute-voice-readiness-failures__error{color:#9f1239;font-weight:700}`;
|
|
@@ -6512,13 +6897,13 @@ var defineVoiceReadinessFailuresElement = (tagName = "absolute-voice-readiness-f
|
|
|
6512
6897
|
};
|
|
6513
6898
|
|
|
6514
6899
|
// src/vue/useVoiceReadinessFailures.ts
|
|
6515
|
-
import { onBeforeUnmount, readonly, ref as
|
|
6900
|
+
import { onBeforeUnmount, readonly, ref as ref7 } from "vue";
|
|
6516
6901
|
var useVoiceReadinessFailures = (path = "/api/production-readiness", options = {}) => {
|
|
6517
6902
|
const store = createVoiceReadinessFailuresStore(path, options);
|
|
6518
|
-
const error =
|
|
6519
|
-
const isLoading =
|
|
6520
|
-
const report =
|
|
6521
|
-
const updatedAt =
|
|
6903
|
+
const error = ref7(null);
|
|
6904
|
+
const isLoading = ref7(false);
|
|
6905
|
+
const report = ref7(undefined);
|
|
6906
|
+
const updatedAt = ref7(undefined);
|
|
6522
6907
|
const sync = () => {
|
|
6523
6908
|
const snapshot = store.getSnapshot();
|
|
6524
6909
|
error.value = snapshot.error;
|
|
@@ -6545,7 +6930,7 @@ var useVoiceReadinessFailures = (path = "/api/production-readiness", options = {
|
|
|
6545
6930
|
};
|
|
6546
6931
|
|
|
6547
6932
|
// src/vue/VoiceReadinessFailures.ts
|
|
6548
|
-
var VoiceReadinessFailures =
|
|
6933
|
+
var VoiceReadinessFailures = defineComponent9({
|
|
6549
6934
|
name: "VoiceReadinessFailures",
|
|
6550
6935
|
props: {
|
|
6551
6936
|
description: String,
|
|
@@ -6573,40 +6958,40 @@ var VoiceReadinessFailures = defineComponent8({
|
|
|
6573
6958
|
intervalMs: props.intervalMs,
|
|
6574
6959
|
title: props.title
|
|
6575
6960
|
});
|
|
6576
|
-
return
|
|
6961
|
+
return h9("section", {
|
|
6577
6962
|
class: [
|
|
6578
6963
|
"absolute-voice-readiness-failures",
|
|
6579
6964
|
`absolute-voice-readiness-failures--${model.status}`
|
|
6580
6965
|
]
|
|
6581
6966
|
}, [
|
|
6582
|
-
|
|
6583
|
-
|
|
6584
|
-
|
|
6967
|
+
h9("header", { class: "absolute-voice-readiness-failures__header" }, [
|
|
6968
|
+
h9("span", { class: "absolute-voice-readiness-failures__eyebrow" }, model.title),
|
|
6969
|
+
h9("strong", { class: "absolute-voice-readiness-failures__label" }, model.label)
|
|
6585
6970
|
]),
|
|
6586
|
-
|
|
6587
|
-
model.failures.length ?
|
|
6971
|
+
h9("p", { class: "absolute-voice-readiness-failures__description" }, model.description),
|
|
6972
|
+
model.failures.length ? h9("div", { class: "absolute-voice-readiness-failures__items" }, model.failures.map((failure) => h9("article", {
|
|
6588
6973
|
class: [
|
|
6589
6974
|
"absolute-voice-readiness-failures__item",
|
|
6590
6975
|
`absolute-voice-readiness-failures__item--${failure.status}`
|
|
6591
6976
|
],
|
|
6592
6977
|
key: failure.label
|
|
6593
6978
|
}, [
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
failure.evidenceHref ?
|
|
6600
|
-
failure.sourceHref ?
|
|
6979
|
+
h9("span", failure.status.toUpperCase()),
|
|
6980
|
+
h9("strong", failure.label),
|
|
6981
|
+
h9("p", `Observed ${failure.observed} against ${failure.thresholdLabel} ${failure.threshold}.`),
|
|
6982
|
+
h9("p", failure.remediation),
|
|
6983
|
+
h9("p", { class: "absolute-voice-readiness-failures__links" }, [
|
|
6984
|
+
failure.evidenceHref ? h9("a", { href: failure.evidenceHref }, "Evidence") : null,
|
|
6985
|
+
failure.sourceHref ? h9("a", { href: failure.sourceHref }, "Threshold source") : null
|
|
6601
6986
|
])
|
|
6602
|
-
]))) :
|
|
6603
|
-
model.links.length ?
|
|
6987
|
+
]))) : h9("p", { class: "absolute-voice-readiness-failures__empty" }, model.error ?? "No calibrated readiness gate explanations are open."),
|
|
6988
|
+
model.links.length ? h9("p", { class: "absolute-voice-readiness-failures__links" }, model.links.map((link) => h9("a", { href: link.href, key: link.href }, link.label))) : null
|
|
6604
6989
|
]);
|
|
6605
6990
|
};
|
|
6606
6991
|
}
|
|
6607
6992
|
});
|
|
6608
6993
|
// src/vue/VoiceProviderSimulationControls.ts
|
|
6609
|
-
import { computed as computed4, defineComponent as
|
|
6994
|
+
import { computed as computed4, defineComponent as defineComponent10, h as h10 } from "vue";
|
|
6610
6995
|
|
|
6611
6996
|
// src/client/providerSimulationControls.ts
|
|
6612
6997
|
var postSimulation = async (pathPrefix, mode, provider, fetchImpl) => {
|
|
@@ -6688,7 +7073,7 @@ var createVoiceProviderSimulationControlsStore = (options) => {
|
|
|
6688
7073
|
};
|
|
6689
7074
|
|
|
6690
7075
|
// src/client/providerSimulationControlsWidget.ts
|
|
6691
|
-
var
|
|
7076
|
+
var escapeHtml15 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
6692
7077
|
var formatKind = (kind) => (kind ?? "stt").toUpperCase();
|
|
6693
7078
|
var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
|
|
6694
7079
|
const configuredProviders = options.providers.filter((provider) => provider.configured !== false);
|
|
@@ -6708,18 +7093,18 @@ var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
|
|
|
6708
7093
|
};
|
|
6709
7094
|
var renderVoiceProviderSimulationControlsHTML = (snapshot, options) => {
|
|
6710
7095
|
const model = createVoiceProviderSimulationControlsViewModel(snapshot, options);
|
|
6711
|
-
const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${
|
|
6712
|
-
const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${
|
|
7096
|
+
const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${escapeHtml15(provider.provider)}"${!model.canSimulateFailure || snapshot.isRunning ? " disabled" : ""}>Simulate ${escapeHtml15(provider.provider)} ${escapeHtml15(formatKind(options.kind))} failure</button>`).join("");
|
|
7097
|
+
const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${escapeHtml15(provider.provider)}"${snapshot.isRunning ? " disabled" : ""}>Mark ${escapeHtml15(provider.provider)} recovered</button>`).join("");
|
|
6713
7098
|
return `<section class="absolute-voice-provider-simulation absolute-voice-provider-simulation--${snapshot.error ? "error" : snapshot.isRunning ? "running" : "ready"}">
|
|
6714
7099
|
<header class="absolute-voice-provider-simulation__header">
|
|
6715
|
-
<span class="absolute-voice-provider-simulation__eyebrow">${
|
|
6716
|
-
<strong class="absolute-voice-provider-simulation__label">${
|
|
7100
|
+
<span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml15(model.title)}</span>
|
|
7101
|
+
<strong class="absolute-voice-provider-simulation__label">${escapeHtml15(model.label)}</strong>
|
|
6717
7102
|
</header>
|
|
6718
|
-
<p class="absolute-voice-provider-simulation__description">${
|
|
6719
|
-
${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${
|
|
7103
|
+
<p class="absolute-voice-provider-simulation__description">${escapeHtml15(model.description)}</p>
|
|
7104
|
+
${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml15(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
|
|
6720
7105
|
<div class="absolute-voice-provider-simulation__actions">${failureButtons}${recoveryButtons}</div>
|
|
6721
|
-
${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${
|
|
6722
|
-
${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${
|
|
7106
|
+
${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml15(snapshot.error)}</p>` : ""}
|
|
7107
|
+
${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml15(model.resultText)}</pre>` : ""}
|
|
6723
7108
|
</section>`;
|
|
6724
7109
|
};
|
|
6725
7110
|
var bindVoiceProviderSimulationControls = (element, store) => {
|
|
@@ -6785,15 +7170,15 @@ var defineVoiceProviderSimulationControlsElement = (tagName = "absolute-voice-pr
|
|
|
6785
7170
|
};
|
|
6786
7171
|
|
|
6787
7172
|
// src/vue/useVoiceProviderSimulationControls.ts
|
|
6788
|
-
import { onUnmounted as
|
|
7173
|
+
import { onUnmounted as onUnmounted9, ref as ref8 } from "vue";
|
|
6789
7174
|
function useVoiceProviderSimulationControls(options) {
|
|
6790
7175
|
const store = createVoiceProviderSimulationControlsStore(options);
|
|
6791
|
-
const error =
|
|
6792
|
-
const isRunning =
|
|
6793
|
-
const lastResult =
|
|
6794
|
-
const mode =
|
|
6795
|
-
const provider =
|
|
6796
|
-
const updatedAt =
|
|
7176
|
+
const error = ref8(null);
|
|
7177
|
+
const isRunning = ref8(false);
|
|
7178
|
+
const lastResult = ref8(null);
|
|
7179
|
+
const mode = ref8(null);
|
|
7180
|
+
const provider = ref8(null);
|
|
7181
|
+
const updatedAt = ref8(undefined);
|
|
6797
7182
|
const sync = () => {
|
|
6798
7183
|
const snapshot = store.getSnapshot();
|
|
6799
7184
|
error.value = snapshot.error;
|
|
@@ -6805,7 +7190,7 @@ function useVoiceProviderSimulationControls(options) {
|
|
|
6805
7190
|
};
|
|
6806
7191
|
const unsubscribe = store.subscribe(sync);
|
|
6807
7192
|
sync();
|
|
6808
|
-
|
|
7193
|
+
onUnmounted9(() => {
|
|
6809
7194
|
unsubscribe();
|
|
6810
7195
|
store.close();
|
|
6811
7196
|
});
|
|
@@ -6821,7 +7206,7 @@ function useVoiceProviderSimulationControls(options) {
|
|
|
6821
7206
|
}
|
|
6822
7207
|
|
|
6823
7208
|
// src/vue/VoiceProviderSimulationControls.ts
|
|
6824
|
-
var VoiceProviderSimulationControls =
|
|
7209
|
+
var VoiceProviderSimulationControls = defineComponent10({
|
|
6825
7210
|
name: "VoiceProviderSimulationControls",
|
|
6826
7211
|
props: {
|
|
6827
7212
|
class: { default: "", type: String },
|
|
@@ -6863,40 +7248,40 @@ var VoiceProviderSimulationControls = defineComponent9({
|
|
|
6863
7248
|
const run = (provider, mode) => {
|
|
6864
7249
|
controls.run(provider, mode).catch(() => {});
|
|
6865
7250
|
};
|
|
6866
|
-
return () =>
|
|
7251
|
+
return () => h10("section", {
|
|
6867
7252
|
class: [
|
|
6868
7253
|
"absolute-voice-provider-simulation",
|
|
6869
7254
|
`absolute-voice-provider-simulation--${controls.error.value ? "error" : controls.isRunning.value ? "running" : "ready"}`,
|
|
6870
7255
|
props.class
|
|
6871
7256
|
]
|
|
6872
7257
|
}, [
|
|
6873
|
-
|
|
6874
|
-
|
|
6875
|
-
|
|
7258
|
+
h10("header", { class: "absolute-voice-provider-simulation__header" }, [
|
|
7259
|
+
h10("span", { class: "absolute-voice-provider-simulation__eyebrow" }, model.value.title),
|
|
7260
|
+
h10("strong", { class: "absolute-voice-provider-simulation__label" }, model.value.label)
|
|
6876
7261
|
]),
|
|
6877
|
-
|
|
6878
|
-
model.value.canSimulateFailure ? null :
|
|
6879
|
-
|
|
6880
|
-
...model.value.failureProviders.map((provider) =>
|
|
7262
|
+
h10("p", { class: "absolute-voice-provider-simulation__description" }, model.value.description),
|
|
7263
|
+
model.value.canSimulateFailure ? null : h10("p", { class: "absolute-voice-provider-simulation__empty" }, props.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure."),
|
|
7264
|
+
h10("div", { class: "absolute-voice-provider-simulation__actions" }, [
|
|
7265
|
+
...model.value.failureProviders.map((provider) => h10("button", {
|
|
6881
7266
|
disabled: !model.value.canSimulateFailure || controls.isRunning.value,
|
|
6882
7267
|
key: `fail-${provider.provider}`,
|
|
6883
7268
|
onClick: () => run(provider.provider, "failure"),
|
|
6884
7269
|
type: "button"
|
|
6885
7270
|
}, `Simulate ${provider.provider} ${props.kind.toUpperCase()} failure`)),
|
|
6886
|
-
...model.value.providers.map((provider) =>
|
|
7271
|
+
...model.value.providers.map((provider) => h10("button", {
|
|
6887
7272
|
disabled: controls.isRunning.value,
|
|
6888
7273
|
key: `recover-${provider.provider}`,
|
|
6889
7274
|
onClick: () => run(provider.provider, "recovery"),
|
|
6890
7275
|
type: "button"
|
|
6891
7276
|
}, `Mark ${provider.provider} recovered`))
|
|
6892
7277
|
]),
|
|
6893
|
-
controls.error.value ?
|
|
6894
|
-
model.value.resultText ?
|
|
7278
|
+
controls.error.value ? h10("p", { class: "absolute-voice-provider-simulation__error" }, controls.error.value) : null,
|
|
7279
|
+
model.value.resultText ? h10("pre", { class: "absolute-voice-provider-simulation__result" }, model.value.resultText) : null
|
|
6895
7280
|
]);
|
|
6896
7281
|
}
|
|
6897
7282
|
});
|
|
6898
7283
|
// src/vue/VoiceProviderCapabilities.ts
|
|
6899
|
-
import { computed as computed5, defineComponent as
|
|
7284
|
+
import { computed as computed5, defineComponent as defineComponent11, h as h11 } from "vue";
|
|
6900
7285
|
|
|
6901
7286
|
// src/client/providerCapabilities.ts
|
|
6902
7287
|
var fetchVoiceProviderCapabilities = async (path = "/api/provider-capabilities", options = {}) => {
|
|
@@ -6978,9 +7363,9 @@ var createVoiceProviderCapabilitiesStore = (path = "/api/provider-capabilities",
|
|
|
6978
7363
|
};
|
|
6979
7364
|
|
|
6980
7365
|
// src/client/providerCapabilitiesWidget.ts
|
|
6981
|
-
var
|
|
6982
|
-
var
|
|
6983
|
-
var
|
|
7366
|
+
var DEFAULT_TITLE10 = "Provider Capabilities";
|
|
7367
|
+
var DEFAULT_DESCRIPTION10 = "Configured, selected, and healthy voice providers for this deployment.";
|
|
7368
|
+
var escapeHtml16 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
6984
7369
|
var formatProvider = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
|
|
6985
7370
|
var formatKind2 = (kind) => kind.toUpperCase();
|
|
6986
7371
|
var formatStatus3 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
|
|
@@ -7024,36 +7409,36 @@ var createVoiceProviderCapabilitiesViewModel = (snapshot, options = {}) => {
|
|
|
7024
7409
|
const selectedCount = snapshot.report?.selected ?? capabilities.filter((capability) => capability.selected).length;
|
|
7025
7410
|
return {
|
|
7026
7411
|
capabilities,
|
|
7027
|
-
description: options.description ??
|
|
7412
|
+
description: options.description ?? DEFAULT_DESCRIPTION10,
|
|
7028
7413
|
error: snapshot.error,
|
|
7029
7414
|
isLoading: snapshot.isLoading,
|
|
7030
7415
|
label: snapshot.error ? "Unavailable" : capabilities.length ? warningCount > 0 ? `${warningCount} needs attention` : `${selectedCount} selected` : snapshot.isLoading ? "Checking" : "No capabilities",
|
|
7031
7416
|
status: snapshot.error ? "error" : capabilities.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
7032
|
-
title: options.title ??
|
|
7417
|
+
title: options.title ?? DEFAULT_TITLE10,
|
|
7033
7418
|
updatedAt: snapshot.updatedAt
|
|
7034
7419
|
};
|
|
7035
7420
|
};
|
|
7036
7421
|
var renderVoiceProviderCapabilitiesHTML = (snapshot, options = {}) => {
|
|
7037
7422
|
const model = createVoiceProviderCapabilitiesViewModel(snapshot, options);
|
|
7038
|
-
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--${
|
|
7423
|
+
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--${escapeHtml16(capability.status)}">
|
|
7039
7424
|
<header>
|
|
7040
|
-
<strong>${
|
|
7041
|
-
<span>${
|
|
7425
|
+
<strong>${escapeHtml16(capability.label)}</strong>
|
|
7426
|
+
<span>${escapeHtml16(formatStatus3(capability.status))}</span>
|
|
7042
7427
|
</header>
|
|
7043
|
-
<p>${
|
|
7428
|
+
<p>${escapeHtml16(capability.detail)}</p>
|
|
7044
7429
|
<dl>${capability.rows.map((row) => `<div>
|
|
7045
|
-
<dt>${
|
|
7046
|
-
<dd>${
|
|
7430
|
+
<dt>${escapeHtml16(row.label)}</dt>
|
|
7431
|
+
<dd>${escapeHtml16(row.value)}</dd>
|
|
7047
7432
|
</div>`).join("")}</dl>
|
|
7048
7433
|
</article>`).join("")}</div>` : '<p class="absolute-voice-provider-capabilities__empty">Configure provider capabilities to see deployment coverage.</p>';
|
|
7049
|
-
return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${
|
|
7434
|
+
return `<section class="absolute-voice-provider-capabilities absolute-voice-provider-capabilities--${escapeHtml16(model.status)}">
|
|
7050
7435
|
<header class="absolute-voice-provider-capabilities__header">
|
|
7051
|
-
<span class="absolute-voice-provider-capabilities__eyebrow">${
|
|
7052
|
-
<strong class="absolute-voice-provider-capabilities__label">${
|
|
7436
|
+
<span class="absolute-voice-provider-capabilities__eyebrow">${escapeHtml16(model.title)}</span>
|
|
7437
|
+
<strong class="absolute-voice-provider-capabilities__label">${escapeHtml16(model.label)}</strong>
|
|
7053
7438
|
</header>
|
|
7054
|
-
<p class="absolute-voice-provider-capabilities__description">${
|
|
7439
|
+
<p class="absolute-voice-provider-capabilities__description">${escapeHtml16(model.description)}</p>
|
|
7055
7440
|
${capabilities}
|
|
7056
|
-
${model.error ? `<p class="absolute-voice-provider-capabilities__error">${
|
|
7441
|
+
${model.error ? `<p class="absolute-voice-provider-capabilities__error">${escapeHtml16(model.error)}</p>` : ""}
|
|
7057
7442
|
</section>`;
|
|
7058
7443
|
};
|
|
7059
7444
|
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}`;
|
|
@@ -7095,13 +7480,13 @@ var defineVoiceProviderCapabilitiesElement = (tagName = "absolute-voice-provider
|
|
|
7095
7480
|
};
|
|
7096
7481
|
|
|
7097
7482
|
// src/vue/useVoiceProviderCapabilities.ts
|
|
7098
|
-
import { onUnmounted as
|
|
7483
|
+
import { onUnmounted as onUnmounted10, shallowRef as shallowRef9 } from "vue";
|
|
7099
7484
|
function useVoiceProviderCapabilities(path = "/api/provider-capabilities", options = {}) {
|
|
7100
7485
|
const store = createVoiceProviderCapabilitiesStore(path, options);
|
|
7101
|
-
const error =
|
|
7102
|
-
const isLoading =
|
|
7103
|
-
const report =
|
|
7104
|
-
const updatedAt =
|
|
7486
|
+
const error = shallowRef9(null);
|
|
7487
|
+
const isLoading = shallowRef9(false);
|
|
7488
|
+
const report = shallowRef9();
|
|
7489
|
+
const updatedAt = shallowRef9(undefined);
|
|
7105
7490
|
const sync = () => {
|
|
7106
7491
|
const snapshot = store.getSnapshot();
|
|
7107
7492
|
error.value = snapshot.error;
|
|
@@ -7112,7 +7497,7 @@ function useVoiceProviderCapabilities(path = "/api/provider-capabilities", optio
|
|
|
7112
7497
|
const unsubscribe = store.subscribe(sync);
|
|
7113
7498
|
sync();
|
|
7114
7499
|
store.refresh().catch(() => {});
|
|
7115
|
-
|
|
7500
|
+
onUnmounted10(() => {
|
|
7116
7501
|
unsubscribe();
|
|
7117
7502
|
store.close();
|
|
7118
7503
|
});
|
|
@@ -7126,7 +7511,7 @@ function useVoiceProviderCapabilities(path = "/api/provider-capabilities", optio
|
|
|
7126
7511
|
}
|
|
7127
7512
|
|
|
7128
7513
|
// src/vue/VoiceProviderCapabilities.ts
|
|
7129
|
-
var VoiceProviderCapabilities =
|
|
7514
|
+
var VoiceProviderCapabilities = defineComponent11({
|
|
7130
7515
|
name: "VoiceProviderCapabilities",
|
|
7131
7516
|
props: {
|
|
7132
7517
|
class: {
|
|
@@ -7163,44 +7548,44 @@ var VoiceProviderCapabilities = defineComponent10({
|
|
|
7163
7548
|
report: capabilities.report.value,
|
|
7164
7549
|
updatedAt: capabilities.updatedAt.value
|
|
7165
7550
|
}, options));
|
|
7166
|
-
return () =>
|
|
7551
|
+
return () => h11("section", {
|
|
7167
7552
|
class: [
|
|
7168
7553
|
"absolute-voice-provider-capabilities",
|
|
7169
7554
|
`absolute-voice-provider-capabilities--${model.value.status}`,
|
|
7170
7555
|
props.class
|
|
7171
7556
|
]
|
|
7172
7557
|
}, [
|
|
7173
|
-
|
|
7174
|
-
|
|
7175
|
-
|
|
7558
|
+
h11("header", { class: "absolute-voice-provider-capabilities__header" }, [
|
|
7559
|
+
h11("span", { class: "absolute-voice-provider-capabilities__eyebrow" }, model.value.title),
|
|
7560
|
+
h11("strong", { class: "absolute-voice-provider-capabilities__label" }, model.value.label)
|
|
7176
7561
|
]),
|
|
7177
|
-
|
|
7178
|
-
model.value.capabilities.length ?
|
|
7562
|
+
h11("p", { class: "absolute-voice-provider-capabilities__description" }, model.value.description),
|
|
7563
|
+
model.value.capabilities.length ? h11("div", { class: "absolute-voice-provider-capabilities__providers" }, model.value.capabilities.map((capability) => h11("article", {
|
|
7179
7564
|
class: [
|
|
7180
7565
|
"absolute-voice-provider-capabilities__provider",
|
|
7181
7566
|
`absolute-voice-provider-capabilities__provider--${capability.status}`
|
|
7182
7567
|
],
|
|
7183
7568
|
key: `${capability.kind}:${capability.provider}`
|
|
7184
7569
|
}, [
|
|
7185
|
-
|
|
7186
|
-
|
|
7187
|
-
|
|
7570
|
+
h11("header", [
|
|
7571
|
+
h11("strong", capability.label),
|
|
7572
|
+
h11("span", capability.status)
|
|
7188
7573
|
]),
|
|
7189
|
-
|
|
7190
|
-
|
|
7191
|
-
|
|
7192
|
-
|
|
7574
|
+
h11("p", capability.detail),
|
|
7575
|
+
h11("dl", capability.rows.map((row) => h11("div", { key: row.label }, [
|
|
7576
|
+
h11("dt", row.label),
|
|
7577
|
+
h11("dd", row.value)
|
|
7193
7578
|
])))
|
|
7194
|
-
]))) :
|
|
7195
|
-
model.value.error ?
|
|
7579
|
+
]))) : h11("p", { class: "absolute-voice-provider-capabilities__empty" }, "Configure provider capabilities to see deployment coverage."),
|
|
7580
|
+
model.value.error ? h11("p", { class: "absolute-voice-provider-capabilities__error" }, model.value.error) : null
|
|
7196
7581
|
]);
|
|
7197
7582
|
}
|
|
7198
7583
|
});
|
|
7199
7584
|
// src/vue/VoiceProviderContracts.ts
|
|
7200
|
-
import { defineComponent as
|
|
7585
|
+
import { defineComponent as defineComponent12, h as h12 } from "vue";
|
|
7201
7586
|
|
|
7202
7587
|
// src/vue/useVoiceProviderContracts.ts
|
|
7203
|
-
import { onUnmounted as
|
|
7588
|
+
import { onUnmounted as onUnmounted11, shallowRef as shallowRef10 } from "vue";
|
|
7204
7589
|
|
|
7205
7590
|
// src/client/providerContracts.ts
|
|
7206
7591
|
var fetchVoiceProviderContracts = async (path = "/api/provider-contracts", options = {}) => {
|
|
@@ -7280,10 +7665,10 @@ var createVoiceProviderContractsStore = (path = "/api/provider-contracts", optio
|
|
|
7280
7665
|
// src/vue/useVoiceProviderContracts.ts
|
|
7281
7666
|
function useVoiceProviderContracts(path = "/api/provider-contracts", options = {}) {
|
|
7282
7667
|
const store = createVoiceProviderContractsStore(path, options);
|
|
7283
|
-
const error =
|
|
7284
|
-
const isLoading =
|
|
7285
|
-
const report =
|
|
7286
|
-
const updatedAt =
|
|
7668
|
+
const error = shallowRef10(null);
|
|
7669
|
+
const isLoading = shallowRef10(false);
|
|
7670
|
+
const report = shallowRef10();
|
|
7671
|
+
const updatedAt = shallowRef10(undefined);
|
|
7287
7672
|
const sync = () => {
|
|
7288
7673
|
const snapshot = store.getSnapshot();
|
|
7289
7674
|
error.value = snapshot.error;
|
|
@@ -7294,7 +7679,7 @@ function useVoiceProviderContracts(path = "/api/provider-contracts", options = {
|
|
|
7294
7679
|
const unsubscribe = store.subscribe(sync);
|
|
7295
7680
|
sync();
|
|
7296
7681
|
store.refresh().catch(() => {});
|
|
7297
|
-
|
|
7682
|
+
onUnmounted11(() => {
|
|
7298
7683
|
unsubscribe();
|
|
7299
7684
|
store.close();
|
|
7300
7685
|
});
|
|
@@ -7308,9 +7693,9 @@ function useVoiceProviderContracts(path = "/api/provider-contracts", options = {
|
|
|
7308
7693
|
}
|
|
7309
7694
|
|
|
7310
7695
|
// src/client/providerContractsWidget.ts
|
|
7311
|
-
var
|
|
7312
|
-
var
|
|
7313
|
-
var
|
|
7696
|
+
var DEFAULT_TITLE11 = "Provider Contracts";
|
|
7697
|
+
var DEFAULT_DESCRIPTION11 = "Production contract coverage for provider env, latency, fallback, streaming, and capabilities.";
|
|
7698
|
+
var escapeHtml17 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
7314
7699
|
var formatProvider2 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
|
|
7315
7700
|
var formatStatus4 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
|
|
7316
7701
|
var contractDetail = (row) => {
|
|
@@ -7342,38 +7727,38 @@ var createVoiceProviderContractsViewModel = (snapshot, options = {}) => {
|
|
|
7342
7727
|
}));
|
|
7343
7728
|
const warningCount = snapshot.report ? snapshot.report.failed + snapshot.report.warned : rows.filter((row) => row.status !== "pass").length;
|
|
7344
7729
|
return {
|
|
7345
|
-
description: options.description ??
|
|
7730
|
+
description: options.description ?? DEFAULT_DESCRIPTION11,
|
|
7346
7731
|
error: snapshot.error,
|
|
7347
7732
|
isLoading: snapshot.isLoading,
|
|
7348
7733
|
label: snapshot.error ? "Unavailable" : rows.length ? warningCount > 0 ? `${warningCount} needs attention` : `${rows.length} passing` : snapshot.isLoading ? "Checking" : "No contracts",
|
|
7349
7734
|
rows,
|
|
7350
7735
|
status: snapshot.error ? "error" : rows.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
7351
|
-
title: options.title ??
|
|
7736
|
+
title: options.title ?? DEFAULT_TITLE11,
|
|
7352
7737
|
updatedAt: snapshot.updatedAt
|
|
7353
7738
|
};
|
|
7354
7739
|
};
|
|
7355
7740
|
var renderVoiceProviderContractsHTML = (snapshot, options = {}) => {
|
|
7356
7741
|
const model = createVoiceProviderContractsViewModel(snapshot, options);
|
|
7357
|
-
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--${
|
|
7742
|
+
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--${escapeHtml17(row.status)}">
|
|
7358
7743
|
<header>
|
|
7359
|
-
<strong>${
|
|
7360
|
-
<span>${
|
|
7744
|
+
<strong>${escapeHtml17(row.label)}</strong>
|
|
7745
|
+
<span>${escapeHtml17(formatStatus4(row.status))}</span>
|
|
7361
7746
|
</header>
|
|
7362
|
-
<p>${
|
|
7363
|
-
${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${
|
|
7747
|
+
<p>${escapeHtml17(row.detail)}</p>
|
|
7748
|
+
${row.remediations.length ? `<ul class="absolute-voice-provider-contracts__remediations">${row.remediations.map((remediation) => `<li>${remediation.href ? `<a href="${escapeHtml17(remediation.href)}">${escapeHtml17(remediation.label)}</a>` : `<strong>${escapeHtml17(remediation.label)}</strong>`}<span>${escapeHtml17(remediation.detail)}</span></li>`).join("")}</ul>` : ""}
|
|
7364
7749
|
<dl>${row.rows.map((item) => `<div>
|
|
7365
|
-
<dt>${
|
|
7366
|
-
<dd>${
|
|
7750
|
+
<dt>${escapeHtml17(item.label)}</dt>
|
|
7751
|
+
<dd>${escapeHtml17(item.value)}</dd>
|
|
7367
7752
|
</div>`).join("")}</dl>
|
|
7368
7753
|
</article>`).join("")}</div>` : '<p class="absolute-voice-provider-contracts__empty">Configure provider contracts to see production coverage.</p>';
|
|
7369
|
-
return `<section class="absolute-voice-provider-contracts absolute-voice-provider-contracts--${
|
|
7754
|
+
return `<section class="absolute-voice-provider-contracts absolute-voice-provider-contracts--${escapeHtml17(model.status)}">
|
|
7370
7755
|
<header class="absolute-voice-provider-contracts__header">
|
|
7371
|
-
<span class="absolute-voice-provider-contracts__eyebrow">${
|
|
7372
|
-
<strong class="absolute-voice-provider-contracts__label">${
|
|
7756
|
+
<span class="absolute-voice-provider-contracts__eyebrow">${escapeHtml17(model.title)}</span>
|
|
7757
|
+
<strong class="absolute-voice-provider-contracts__label">${escapeHtml17(model.label)}</strong>
|
|
7373
7758
|
</header>
|
|
7374
|
-
<p class="absolute-voice-provider-contracts__description">${
|
|
7759
|
+
<p class="absolute-voice-provider-contracts__description">${escapeHtml17(model.description)}</p>
|
|
7375
7760
|
${rows}
|
|
7376
|
-
${model.error ? `<p class="absolute-voice-provider-contracts__error">${
|
|
7761
|
+
${model.error ? `<p class="absolute-voice-provider-contracts__error">${escapeHtml17(model.error)}</p>` : ""}
|
|
7377
7762
|
</section>`;
|
|
7378
7763
|
};
|
|
7379
7764
|
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}`;
|
|
@@ -7415,7 +7800,7 @@ var defineVoiceProviderContractsElement = (tagName = "absolute-voice-provider-co
|
|
|
7415
7800
|
};
|
|
7416
7801
|
|
|
7417
7802
|
// src/vue/VoiceProviderContracts.ts
|
|
7418
|
-
var VoiceProviderContracts =
|
|
7803
|
+
var VoiceProviderContracts = defineComponent12({
|
|
7419
7804
|
name: "VoiceProviderContracts",
|
|
7420
7805
|
props: {
|
|
7421
7806
|
description: String,
|
|
@@ -7443,49 +7828,49 @@ var VoiceProviderContracts = defineComponent11({
|
|
|
7443
7828
|
intervalMs: props.intervalMs,
|
|
7444
7829
|
title: props.title
|
|
7445
7830
|
});
|
|
7446
|
-
return
|
|
7831
|
+
return h12("section", {
|
|
7447
7832
|
class: [
|
|
7448
7833
|
"absolute-voice-provider-contracts",
|
|
7449
7834
|
`absolute-voice-provider-contracts--${model.status}`
|
|
7450
7835
|
]
|
|
7451
7836
|
}, [
|
|
7452
|
-
|
|
7453
|
-
|
|
7454
|
-
|
|
7837
|
+
h12("header", { class: "absolute-voice-provider-contracts__header" }, [
|
|
7838
|
+
h12("span", { class: "absolute-voice-provider-contracts__eyebrow" }, model.title),
|
|
7839
|
+
h12("strong", { class: "absolute-voice-provider-contracts__label" }, model.label)
|
|
7455
7840
|
]),
|
|
7456
|
-
|
|
7457
|
-
model.rows.length ?
|
|
7841
|
+
h12("p", { class: "absolute-voice-provider-contracts__description" }, model.description),
|
|
7842
|
+
model.rows.length ? h12("div", { class: "absolute-voice-provider-contracts__rows" }, model.rows.map((row) => h12("article", {
|
|
7458
7843
|
class: [
|
|
7459
7844
|
"absolute-voice-provider-contracts__row",
|
|
7460
7845
|
`absolute-voice-provider-contracts__row--${row.status}`
|
|
7461
7846
|
],
|
|
7462
7847
|
key: `${row.kind}:${row.provider}`
|
|
7463
7848
|
}, [
|
|
7464
|
-
|
|
7465
|
-
|
|
7466
|
-
|
|
7849
|
+
h12("header", [
|
|
7850
|
+
h12("strong", row.label),
|
|
7851
|
+
h12("span", row.status)
|
|
7467
7852
|
]),
|
|
7468
|
-
|
|
7469
|
-
row.remediations.length ?
|
|
7853
|
+
h12("p", row.detail),
|
|
7854
|
+
row.remediations.length ? h12("ul", {
|
|
7470
7855
|
class: "absolute-voice-provider-contracts__remediations"
|
|
7471
|
-
}, row.remediations.map((remediation) =>
|
|
7856
|
+
}, row.remediations.map((remediation) => h12("li", {
|
|
7472
7857
|
key: `${row.kind}:${row.provider}:${remediation.label}`
|
|
7473
7858
|
}, [
|
|
7474
|
-
remediation.href ?
|
|
7475
|
-
|
|
7859
|
+
remediation.href ? h12("a", { href: remediation.href }, remediation.label) : h12("strong", remediation.label),
|
|
7860
|
+
h12("span", remediation.detail)
|
|
7476
7861
|
]))) : null,
|
|
7477
|
-
|
|
7478
|
-
|
|
7479
|
-
|
|
7862
|
+
h12("dl", row.rows.map((item) => h12("div", { key: item.label }, [
|
|
7863
|
+
h12("dt", item.label),
|
|
7864
|
+
h12("dd", item.value)
|
|
7480
7865
|
])))
|
|
7481
|
-
]))) :
|
|
7482
|
-
model.error ?
|
|
7866
|
+
]))) : h12("p", { class: "absolute-voice-provider-contracts__empty" }, "Configure provider contracts to see production coverage."),
|
|
7867
|
+
model.error ? h12("p", { class: "absolute-voice-provider-contracts__error" }, model.error) : null
|
|
7483
7868
|
]);
|
|
7484
7869
|
};
|
|
7485
7870
|
}
|
|
7486
7871
|
});
|
|
7487
7872
|
// src/vue/VoiceProviderStatus.ts
|
|
7488
|
-
import { computed as computed6, defineComponent as
|
|
7873
|
+
import { computed as computed6, defineComponent as defineComponent13, h as h13 } from "vue";
|
|
7489
7874
|
|
|
7490
7875
|
// src/client/providerStatus.ts
|
|
7491
7876
|
var fetchVoiceProviderStatus = async (path = "/api/provider-status", options = {}) => {
|
|
@@ -7568,9 +7953,9 @@ var createVoiceProviderStatusStore = (path = "/api/provider-status", options = {
|
|
|
7568
7953
|
};
|
|
7569
7954
|
|
|
7570
7955
|
// src/client/providerStatusWidget.ts
|
|
7571
|
-
var
|
|
7572
|
-
var
|
|
7573
|
-
var
|
|
7956
|
+
var DEFAULT_TITLE12 = "Voice Providers";
|
|
7957
|
+
var DEFAULT_DESCRIPTION12 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
|
|
7958
|
+
var escapeHtml18 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
7574
7959
|
var formatProvider3 = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
|
|
7575
7960
|
var formatStatus5 = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
|
|
7576
7961
|
var formatLatency = (value) => typeof value === "number" ? `${value}ms` : "No samples";
|
|
@@ -7614,37 +7999,37 @@ var createVoiceProviderStatusViewModel = (snapshot, options = {}) => {
|
|
|
7614
7999
|
const warningCount = providers.filter((provider) => isWarningStatus2(provider.status)).length;
|
|
7615
8000
|
const healthyCount = providers.filter((provider) => provider.status === "healthy").length;
|
|
7616
8001
|
return {
|
|
7617
|
-
description: options.description ??
|
|
8002
|
+
description: options.description ?? DEFAULT_DESCRIPTION12,
|
|
7618
8003
|
error: snapshot.error,
|
|
7619
8004
|
isLoading: snapshot.isLoading,
|
|
7620
8005
|
label: snapshot.error ? "Unavailable" : providers.length ? warningCount > 0 ? `${warningCount} needs attention` : `${healthyCount} healthy` : snapshot.isLoading ? "Checking" : "No provider traffic",
|
|
7621
8006
|
providers,
|
|
7622
8007
|
status: snapshot.error ? "error" : providers.length ? warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
7623
|
-
title: options.title ??
|
|
8008
|
+
title: options.title ?? DEFAULT_TITLE12,
|
|
7624
8009
|
updatedAt: snapshot.updatedAt
|
|
7625
8010
|
};
|
|
7626
8011
|
};
|
|
7627
8012
|
var renderVoiceProviderStatusHTML = (snapshot, options = {}) => {
|
|
7628
8013
|
const model = createVoiceProviderStatusViewModel(snapshot, options);
|
|
7629
|
-
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--${
|
|
8014
|
+
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--${escapeHtml18(provider.status)}">
|
|
7630
8015
|
<header>
|
|
7631
|
-
<strong>${
|
|
7632
|
-
<span>${
|
|
8016
|
+
<strong>${escapeHtml18(provider.label)}</strong>
|
|
8017
|
+
<span>${escapeHtml18(formatStatus5(provider.status))}</span>
|
|
7633
8018
|
</header>
|
|
7634
|
-
<p>${
|
|
8019
|
+
<p>${escapeHtml18(provider.detail)}</p>
|
|
7635
8020
|
<dl>${provider.rows.map((row) => `<div>
|
|
7636
|
-
<dt>${
|
|
7637
|
-
<dd>${
|
|
8021
|
+
<dt>${escapeHtml18(row.label)}</dt>
|
|
8022
|
+
<dd>${escapeHtml18(row.value)}</dd>
|
|
7638
8023
|
</div>`).join("")}</dl>
|
|
7639
8024
|
</article>`).join("")}</div>` : '<p class="absolute-voice-provider-status__empty">Run voice traffic to see provider health.</p>';
|
|
7640
|
-
return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${
|
|
8025
|
+
return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml18(model.status)}">
|
|
7641
8026
|
<header class="absolute-voice-provider-status__header">
|
|
7642
|
-
<span class="absolute-voice-provider-status__eyebrow">${
|
|
7643
|
-
<strong class="absolute-voice-provider-status__label">${
|
|
8027
|
+
<span class="absolute-voice-provider-status__eyebrow">${escapeHtml18(model.title)}</span>
|
|
8028
|
+
<strong class="absolute-voice-provider-status__label">${escapeHtml18(model.label)}</strong>
|
|
7644
8029
|
</header>
|
|
7645
|
-
<p class="absolute-voice-provider-status__description">${
|
|
8030
|
+
<p class="absolute-voice-provider-status__description">${escapeHtml18(model.description)}</p>
|
|
7646
8031
|
${providers}
|
|
7647
|
-
${model.error ? `<p class="absolute-voice-provider-status__error">${
|
|
8032
|
+
${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml18(model.error)}</p>` : ""}
|
|
7648
8033
|
</section>`;
|
|
7649
8034
|
};
|
|
7650
8035
|
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}`;
|
|
@@ -7686,13 +8071,13 @@ var defineVoiceProviderStatusElement = (tagName = "absolute-voice-provider-statu
|
|
|
7686
8071
|
};
|
|
7687
8072
|
|
|
7688
8073
|
// src/vue/useVoiceProviderStatus.ts
|
|
7689
|
-
import { onUnmounted as
|
|
8074
|
+
import { onUnmounted as onUnmounted12, ref as ref9, shallowRef as shallowRef11 } from "vue";
|
|
7690
8075
|
function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
|
|
7691
8076
|
const store = createVoiceProviderStatusStore(path, options);
|
|
7692
|
-
const error =
|
|
7693
|
-
const isLoading =
|
|
7694
|
-
const providers =
|
|
7695
|
-
const updatedAt =
|
|
8077
|
+
const error = ref9(null);
|
|
8078
|
+
const isLoading = ref9(false);
|
|
8079
|
+
const providers = shallowRef11([]);
|
|
8080
|
+
const updatedAt = ref9(undefined);
|
|
7696
8081
|
const sync = () => {
|
|
7697
8082
|
const snapshot = store.getSnapshot();
|
|
7698
8083
|
error.value = snapshot.error;
|
|
@@ -7703,7 +8088,7 @@ function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
|
|
|
7703
8088
|
const unsubscribe = store.subscribe(sync);
|
|
7704
8089
|
sync();
|
|
7705
8090
|
store.refresh().catch(() => {});
|
|
7706
|
-
|
|
8091
|
+
onUnmounted12(() => {
|
|
7707
8092
|
unsubscribe();
|
|
7708
8093
|
store.close();
|
|
7709
8094
|
});
|
|
@@ -7717,7 +8102,7 @@ function useVoiceProviderStatus(path = "/api/provider-status", options = {}) {
|
|
|
7717
8102
|
}
|
|
7718
8103
|
|
|
7719
8104
|
// src/vue/VoiceProviderStatus.ts
|
|
7720
|
-
var VoiceProviderStatus =
|
|
8105
|
+
var VoiceProviderStatus = defineComponent13({
|
|
7721
8106
|
name: "VoiceProviderStatus",
|
|
7722
8107
|
props: {
|
|
7723
8108
|
class: {
|
|
@@ -7754,41 +8139,41 @@ var VoiceProviderStatus = defineComponent12({
|
|
|
7754
8139
|
providers: status.providers.value,
|
|
7755
8140
|
updatedAt: status.updatedAt.value
|
|
7756
8141
|
}, options));
|
|
7757
|
-
return () =>
|
|
8142
|
+
return () => h13("section", {
|
|
7758
8143
|
class: [
|
|
7759
8144
|
"absolute-voice-provider-status",
|
|
7760
8145
|
`absolute-voice-provider-status--${model.value.status}`,
|
|
7761
8146
|
props.class
|
|
7762
8147
|
]
|
|
7763
8148
|
}, [
|
|
7764
|
-
|
|
7765
|
-
|
|
7766
|
-
|
|
8149
|
+
h13("header", { class: "absolute-voice-provider-status__header" }, [
|
|
8150
|
+
h13("span", { class: "absolute-voice-provider-status__eyebrow" }, model.value.title),
|
|
8151
|
+
h13("strong", { class: "absolute-voice-provider-status__label" }, model.value.label)
|
|
7767
8152
|
]),
|
|
7768
|
-
|
|
7769
|
-
model.value.providers.length ?
|
|
8153
|
+
h13("p", { class: "absolute-voice-provider-status__description" }, model.value.description),
|
|
8154
|
+
model.value.providers.length ? h13("div", { class: "absolute-voice-provider-status__providers" }, model.value.providers.map((provider) => h13("article", {
|
|
7770
8155
|
class: [
|
|
7771
8156
|
"absolute-voice-provider-status__provider",
|
|
7772
8157
|
`absolute-voice-provider-status__provider--${provider.status}`
|
|
7773
8158
|
],
|
|
7774
8159
|
key: provider.provider
|
|
7775
8160
|
}, [
|
|
7776
|
-
|
|
7777
|
-
|
|
7778
|
-
|
|
8161
|
+
h13("header", [
|
|
8162
|
+
h13("strong", provider.label),
|
|
8163
|
+
h13("span", provider.status)
|
|
7779
8164
|
]),
|
|
7780
|
-
|
|
7781
|
-
|
|
7782
|
-
|
|
7783
|
-
|
|
8165
|
+
h13("p", provider.detail),
|
|
8166
|
+
h13("dl", provider.rows.map((row) => h13("div", { key: row.label }, [
|
|
8167
|
+
h13("dt", row.label),
|
|
8168
|
+
h13("dd", row.value)
|
|
7784
8169
|
])))
|
|
7785
|
-
]))) :
|
|
7786
|
-
model.value.error ?
|
|
8170
|
+
]))) : h13("p", { class: "absolute-voice-provider-status__empty" }, "Run voice traffic to see provider health."),
|
|
8171
|
+
model.value.error ? h13("p", { class: "absolute-voice-provider-status__error" }, model.value.error) : null
|
|
7787
8172
|
]);
|
|
7788
8173
|
}
|
|
7789
8174
|
});
|
|
7790
8175
|
// src/vue/VoiceRoutingStatus.ts
|
|
7791
|
-
import { computed as computed7, defineComponent as
|
|
8176
|
+
import { computed as computed7, defineComponent as defineComponent14, h as h14 } from "vue";
|
|
7792
8177
|
|
|
7793
8178
|
// src/client/routingStatus.ts
|
|
7794
8179
|
var fetchVoiceRoutingStatus = async (path = "/api/routing/latest", options = {}) => {
|
|
@@ -7871,9 +8256,9 @@ var createVoiceRoutingStatusStore = (path = "/api/routing/latest", options = {})
|
|
|
7871
8256
|
};
|
|
7872
8257
|
|
|
7873
8258
|
// src/client/routingStatusWidget.ts
|
|
7874
|
-
var
|
|
7875
|
-
var
|
|
7876
|
-
var
|
|
8259
|
+
var DEFAULT_TITLE13 = "Voice Routing";
|
|
8260
|
+
var DEFAULT_DESCRIPTION13 = "Latest provider routing decision from the self-hosted trace store.";
|
|
8261
|
+
var escapeHtml19 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
7877
8262
|
var formatValue = (value, fallback = "None") => typeof value === "string" && value.trim() ? value : typeof value === "number" && Number.isFinite(value) ? String(value) : fallback;
|
|
7878
8263
|
var formatProviderRoutes = (routes) => routes && typeof routes === "object" ? Object.entries(routes).map(([role, provider]) => `${role}: ${formatValue(provider)}`).join(", ") || "None" : "None";
|
|
7879
8264
|
var getProviderRoute = (routes, role) => routes && typeof routes === "object" ? formatValue(routes[role], "Not configured") : "Not configured";
|
|
@@ -7942,35 +8327,35 @@ var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
|
|
|
7942
8327
|
return {
|
|
7943
8328
|
activeStack,
|
|
7944
8329
|
decision,
|
|
7945
|
-
description: options.description ??
|
|
8330
|
+
description: options.description ?? DEFAULT_DESCRIPTION13,
|
|
7946
8331
|
error: snapshot.error,
|
|
7947
8332
|
isLoading: snapshot.isLoading,
|
|
7948
8333
|
label: snapshot.error ? "Unavailable" : decision ? `${formatValue(decision.kind).toUpperCase()} ${formatValue(decision.status, "unknown")}` : snapshot.isLoading ? "Checking" : "No routing yet",
|
|
7949
8334
|
rows,
|
|
7950
8335
|
status: snapshot.error ? "error" : decision ? "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
7951
|
-
title: options.title ??
|
|
8336
|
+
title: options.title ?? DEFAULT_TITLE13,
|
|
7952
8337
|
updatedAt: snapshot.updatedAt
|
|
7953
8338
|
};
|
|
7954
8339
|
};
|
|
7955
8340
|
var renderVoiceRoutingStatusHTML = (snapshot, options = {}) => {
|
|
7956
8341
|
const model = createVoiceRoutingStatusViewModel(snapshot, options);
|
|
7957
8342
|
const activeStack = model.activeStack.length ? `<div class="absolute-voice-routing-status__stack" aria-label="Active voice stack">${model.activeStack.map((item) => `<div>
|
|
7958
|
-
<span>${
|
|
7959
|
-
<strong>${
|
|
8343
|
+
<span>${escapeHtml19(item.label)}</span>
|
|
8344
|
+
<strong>${escapeHtml19(item.value)}</strong>
|
|
7960
8345
|
</div>`).join("")}</div>` : "";
|
|
7961
8346
|
const rows = model.rows.length ? `<div class="absolute-voice-routing-status__grid">${model.rows.map((row) => `<div>
|
|
7962
|
-
<span>${
|
|
7963
|
-
<strong>${
|
|
8347
|
+
<span>${escapeHtml19(row.label)}</span>
|
|
8348
|
+
<strong>${escapeHtml19(row.value)}</strong>
|
|
7964
8349
|
</div>`).join("")}</div>` : '<p class="absolute-voice-routing-status__empty">Start a voice session to see the selected provider.</p>';
|
|
7965
|
-
return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${
|
|
8350
|
+
return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml19(model.status)}">
|
|
7966
8351
|
<header class="absolute-voice-routing-status__header">
|
|
7967
|
-
<span class="absolute-voice-routing-status__eyebrow">${
|
|
7968
|
-
<strong class="absolute-voice-routing-status__label">${
|
|
8352
|
+
<span class="absolute-voice-routing-status__eyebrow">${escapeHtml19(model.title)}</span>
|
|
8353
|
+
<strong class="absolute-voice-routing-status__label">${escapeHtml19(model.label)}</strong>
|
|
7969
8354
|
</header>
|
|
7970
|
-
<p class="absolute-voice-routing-status__description">${
|
|
8355
|
+
<p class="absolute-voice-routing-status__description">${escapeHtml19(model.description)}</p>
|
|
7971
8356
|
${activeStack}
|
|
7972
8357
|
${rows}
|
|
7973
|
-
${model.error ? `<p class="absolute-voice-routing-status__error">${
|
|
8358
|
+
${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml19(model.error)}</p>` : ""}
|
|
7974
8359
|
</section>`;
|
|
7975
8360
|
};
|
|
7976
8361
|
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}}`;
|
|
@@ -8012,13 +8397,13 @@ var defineVoiceRoutingStatusElement = (tagName = "absolute-voice-routing-status"
|
|
|
8012
8397
|
};
|
|
8013
8398
|
|
|
8014
8399
|
// src/vue/useVoiceRoutingStatus.ts
|
|
8015
|
-
import { onUnmounted as
|
|
8400
|
+
import { onUnmounted as onUnmounted13, ref as ref10, shallowRef as shallowRef12 } from "vue";
|
|
8016
8401
|
function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
|
|
8017
8402
|
const store = createVoiceRoutingStatusStore(path, options);
|
|
8018
|
-
const decision =
|
|
8019
|
-
const error =
|
|
8020
|
-
const isLoading =
|
|
8021
|
-
const updatedAt =
|
|
8403
|
+
const decision = shallowRef12(null);
|
|
8404
|
+
const error = ref10(null);
|
|
8405
|
+
const isLoading = ref10(false);
|
|
8406
|
+
const updatedAt = ref10(undefined);
|
|
8022
8407
|
const sync = () => {
|
|
8023
8408
|
const snapshot = store.getSnapshot();
|
|
8024
8409
|
decision.value = snapshot.decision;
|
|
@@ -8029,7 +8414,7 @@ function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
|
|
|
8029
8414
|
const unsubscribe = store.subscribe(sync);
|
|
8030
8415
|
sync();
|
|
8031
8416
|
store.refresh().catch(() => {});
|
|
8032
|
-
|
|
8417
|
+
onUnmounted13(() => {
|
|
8033
8418
|
unsubscribe();
|
|
8034
8419
|
store.close();
|
|
8035
8420
|
});
|
|
@@ -8043,7 +8428,7 @@ function useVoiceRoutingStatus(path = "/api/routing/latest", options = {}) {
|
|
|
8043
8428
|
}
|
|
8044
8429
|
|
|
8045
8430
|
// src/vue/VoiceRoutingStatus.ts
|
|
8046
|
-
var VoiceRoutingStatus =
|
|
8431
|
+
var VoiceRoutingStatus = defineComponent14({
|
|
8047
8432
|
name: "VoiceRoutingStatus",
|
|
8048
8433
|
props: {
|
|
8049
8434
|
class: {
|
|
@@ -8080,28 +8465,28 @@ var VoiceRoutingStatus = defineComponent13({
|
|
|
8080
8465
|
isLoading: status.isLoading.value,
|
|
8081
8466
|
updatedAt: status.updatedAt.value
|
|
8082
8467
|
}, options));
|
|
8083
|
-
return () =>
|
|
8468
|
+
return () => h14("section", {
|
|
8084
8469
|
class: [
|
|
8085
8470
|
"absolute-voice-routing-status",
|
|
8086
8471
|
`absolute-voice-routing-status--${model.value.status}`,
|
|
8087
8472
|
props.class
|
|
8088
8473
|
]
|
|
8089
8474
|
}, [
|
|
8090
|
-
|
|
8091
|
-
|
|
8092
|
-
|
|
8475
|
+
h14("header", { class: "absolute-voice-routing-status__header" }, [
|
|
8476
|
+
h14("span", { class: "absolute-voice-routing-status__eyebrow" }, model.value.title),
|
|
8477
|
+
h14("strong", { class: "absolute-voice-routing-status__label" }, model.value.label)
|
|
8093
8478
|
]),
|
|
8094
|
-
|
|
8095
|
-
model.value.rows.length ?
|
|
8096
|
-
|
|
8097
|
-
|
|
8098
|
-
]))) :
|
|
8099
|
-
model.value.error ?
|
|
8479
|
+
h14("p", { class: "absolute-voice-routing-status__description" }, model.value.description),
|
|
8480
|
+
model.value.rows.length ? h14("div", { class: "absolute-voice-routing-status__grid" }, model.value.rows.map((row) => h14("div", { key: row.label }, [
|
|
8481
|
+
h14("span", row.label),
|
|
8482
|
+
h14("strong", row.value)
|
|
8483
|
+
]))) : h14("p", { class: "absolute-voice-routing-status__empty" }, "Start a voice session to see the selected provider."),
|
|
8484
|
+
model.value.error ? h14("p", { class: "absolute-voice-routing-status__error" }, model.value.error) : null
|
|
8100
8485
|
]);
|
|
8101
8486
|
}
|
|
8102
8487
|
});
|
|
8103
8488
|
// src/vue/useVoiceAgentSquadStatus.ts
|
|
8104
|
-
import { onUnmounted as
|
|
8489
|
+
import { onUnmounted as onUnmounted14, ref as ref11, shallowRef as shallowRef13 } from "vue";
|
|
8105
8490
|
|
|
8106
8491
|
// src/client/traceTimeline.ts
|
|
8107
8492
|
var fetchVoiceTraceTimeline = async (path = "/api/voice-traces", options = {}) => {
|
|
@@ -8260,11 +8645,11 @@ var createVoiceAgentSquadStatusStore = (path = "/api/voice-traces", options = {}
|
|
|
8260
8645
|
// src/vue/useVoiceAgentSquadStatus.ts
|
|
8261
8646
|
function useVoiceAgentSquadStatus(path = "/api/voice-traces", options = {}) {
|
|
8262
8647
|
const store = createVoiceAgentSquadStatusStore(path, options);
|
|
8263
|
-
const current =
|
|
8264
|
-
const error =
|
|
8265
|
-
const isLoading =
|
|
8266
|
-
const report =
|
|
8267
|
-
const updatedAt =
|
|
8648
|
+
const current = shallowRef13(undefined);
|
|
8649
|
+
const error = ref11(null);
|
|
8650
|
+
const isLoading = ref11(false);
|
|
8651
|
+
const report = shallowRef13(undefined);
|
|
8652
|
+
const updatedAt = ref11(undefined);
|
|
8268
8653
|
const sync = () => {
|
|
8269
8654
|
const snapshot = store.getSnapshot();
|
|
8270
8655
|
current.value = snapshot.report.current;
|
|
@@ -8278,7 +8663,7 @@ function useVoiceAgentSquadStatus(path = "/api/voice-traces", options = {}) {
|
|
|
8278
8663
|
if (typeof window !== "undefined") {
|
|
8279
8664
|
store.refresh().catch(() => {});
|
|
8280
8665
|
}
|
|
8281
|
-
|
|
8666
|
+
onUnmounted14(() => {
|
|
8282
8667
|
unsubscribe();
|
|
8283
8668
|
store.close();
|
|
8284
8669
|
});
|
|
@@ -8292,7 +8677,7 @@ function useVoiceAgentSquadStatus(path = "/api/voice-traces", options = {}) {
|
|
|
8292
8677
|
};
|
|
8293
8678
|
}
|
|
8294
8679
|
// src/vue/VoiceTurnLatency.ts
|
|
8295
|
-
import { computed as computed8, defineComponent as
|
|
8680
|
+
import { computed as computed8, defineComponent as defineComponent15, h as h15 } from "vue";
|
|
8296
8681
|
|
|
8297
8682
|
// src/client/turnLatency.ts
|
|
8298
8683
|
var fetchVoiceTurnLatency = async (path = "/api/turn-latency", options = {}) => {
|
|
@@ -8398,56 +8783,56 @@ var createVoiceTurnLatencyStore = (path = "/api/turn-latency", options = {}) =>
|
|
|
8398
8783
|
};
|
|
8399
8784
|
|
|
8400
8785
|
// src/client/turnLatencyWidget.ts
|
|
8401
|
-
var
|
|
8402
|
-
var
|
|
8786
|
+
var DEFAULT_TITLE14 = "Turn Latency";
|
|
8787
|
+
var DEFAULT_DESCRIPTION14 = "Per-turn timing from first transcript to commit and assistant response start.";
|
|
8403
8788
|
var DEFAULT_PROOF_LABEL = "Run latency proof";
|
|
8404
|
-
var
|
|
8405
|
-
var
|
|
8789
|
+
var escapeHtml20 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
8790
|
+
var formatMs3 = (value) => typeof value === "number" ? `${Math.round(value)}ms` : "n/a";
|
|
8406
8791
|
var createVoiceTurnLatencyViewModel = (snapshot, options = {}) => {
|
|
8407
8792
|
const turns = (snapshot.report?.turns ?? []).map((turn) => ({
|
|
8408
8793
|
...turn,
|
|
8409
8794
|
label: turn.text || "Empty turn",
|
|
8410
8795
|
rows: turn.stages.map((stage) => ({
|
|
8411
8796
|
label: stage.label,
|
|
8412
|
-
value:
|
|
8797
|
+
value: formatMs3(stage.valueMs)
|
|
8413
8798
|
}))
|
|
8414
8799
|
}));
|
|
8415
8800
|
const warningCount = snapshot.report?.warnings ?? turns.filter((turn) => turn.status === "warn").length;
|
|
8416
8801
|
const failedCount = snapshot.report?.failed ?? turns.filter((turn) => turn.status === "fail").length;
|
|
8417
8802
|
return {
|
|
8418
|
-
description: options.description ??
|
|
8803
|
+
description: options.description ?? DEFAULT_DESCRIPTION14,
|
|
8419
8804
|
error: snapshot.error,
|
|
8420
8805
|
isLoading: snapshot.isLoading,
|
|
8421
|
-
label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} slow` : warningCount > 0 ? `${warningCount} warnings` : `avg ${
|
|
8806
|
+
label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} slow` : warningCount > 0 ? `${warningCount} warnings` : `avg ${formatMs3(snapshot.report?.averageTotalMs)}` : snapshot.isLoading ? "Checking" : "No turns",
|
|
8422
8807
|
proofLabel: options.proofPath ? options.proofLabel ?? DEFAULT_PROOF_LABEL : undefined,
|
|
8423
8808
|
showProofAction: Boolean(options.proofPath),
|
|
8424
8809
|
status: snapshot.error ? "error" : turns.length ? failedCount > 0 || warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
8425
|
-
title: options.title ??
|
|
8810
|
+
title: options.title ?? DEFAULT_TITLE14,
|
|
8426
8811
|
turns,
|
|
8427
8812
|
updatedAt: snapshot.updatedAt
|
|
8428
8813
|
};
|
|
8429
8814
|
};
|
|
8430
8815
|
var renderVoiceTurnLatencyHTML = (snapshot, options = {}) => {
|
|
8431
8816
|
const model = createVoiceTurnLatencyViewModel(snapshot, options);
|
|
8432
|
-
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--${
|
|
8817
|
+
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--${escapeHtml20(turn.status)}">
|
|
8433
8818
|
<header>
|
|
8434
|
-
<strong>${
|
|
8435
|
-
<span>${
|
|
8819
|
+
<strong>${escapeHtml20(turn.label)}</strong>
|
|
8820
|
+
<span>${escapeHtml20(turn.status)}</span>
|
|
8436
8821
|
</header>
|
|
8437
8822
|
<dl>${turn.rows.map((row) => `<div>
|
|
8438
|
-
<dt>${
|
|
8439
|
-
<dd>${
|
|
8823
|
+
<dt>${escapeHtml20(row.label)}</dt>
|
|
8824
|
+
<dd>${escapeHtml20(row.value)}</dd>
|
|
8440
8825
|
</div>`).join("")}</dl>
|
|
8441
8826
|
</article>`).join("")}</div>` : '<p class="absolute-voice-turn-latency__empty">Complete a voice turn to see latency diagnostics.</p>';
|
|
8442
|
-
return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${
|
|
8827
|
+
return `<section class="absolute-voice-turn-latency absolute-voice-turn-latency--${escapeHtml20(model.status)}">
|
|
8443
8828
|
<header class="absolute-voice-turn-latency__header">
|
|
8444
|
-
<span class="absolute-voice-turn-latency__eyebrow">${
|
|
8445
|
-
<strong class="absolute-voice-turn-latency__label">${
|
|
8829
|
+
<span class="absolute-voice-turn-latency__eyebrow">${escapeHtml20(model.title)}</span>
|
|
8830
|
+
<strong class="absolute-voice-turn-latency__label">${escapeHtml20(model.label)}</strong>
|
|
8446
8831
|
</header>
|
|
8447
|
-
<p class="absolute-voice-turn-latency__description">${
|
|
8448
|
-
${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${
|
|
8832
|
+
<p class="absolute-voice-turn-latency__description">${escapeHtml20(model.description)}</p>
|
|
8833
|
+
${model.showProofAction ? `<button class="absolute-voice-turn-latency__proof" data-absolute-voice-turn-latency-proof type="button">${escapeHtml20(model.proofLabel ?? DEFAULT_PROOF_LABEL)}</button>` : ""}
|
|
8449
8834
|
${turns}
|
|
8450
|
-
${model.error ? `<p class="absolute-voice-turn-latency__error">${
|
|
8835
|
+
${model.error ? `<p class="absolute-voice-turn-latency__error">${escapeHtml20(model.error)}</p>` : ""}
|
|
8451
8836
|
</section>`;
|
|
8452
8837
|
};
|
|
8453
8838
|
var mountVoiceTurnLatency = (element, path = "/api/turn-latency", options = {}) => {
|
|
@@ -8498,13 +8883,13 @@ var defineVoiceTurnLatencyElement = (tagName = "absolute-voice-turn-latency") =>
|
|
|
8498
8883
|
};
|
|
8499
8884
|
|
|
8500
8885
|
// src/vue/useVoiceTurnLatency.ts
|
|
8501
|
-
import { onUnmounted as
|
|
8886
|
+
import { onUnmounted as onUnmounted15, shallowRef as shallowRef14 } from "vue";
|
|
8502
8887
|
function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
|
|
8503
8888
|
const store = createVoiceTurnLatencyStore(path, options);
|
|
8504
|
-
const error =
|
|
8505
|
-
const isLoading =
|
|
8506
|
-
const report =
|
|
8507
|
-
const updatedAt =
|
|
8889
|
+
const error = shallowRef14(null);
|
|
8890
|
+
const isLoading = shallowRef14(false);
|
|
8891
|
+
const report = shallowRef14();
|
|
8892
|
+
const updatedAt = shallowRef14(undefined);
|
|
8508
8893
|
const sync = () => {
|
|
8509
8894
|
const snapshot = store.getSnapshot();
|
|
8510
8895
|
error.value = snapshot.error;
|
|
@@ -8515,7 +8900,7 @@ function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
|
|
|
8515
8900
|
const unsubscribe = store.subscribe(sync);
|
|
8516
8901
|
sync();
|
|
8517
8902
|
store.refresh().catch(() => {});
|
|
8518
|
-
|
|
8903
|
+
onUnmounted15(() => {
|
|
8519
8904
|
unsubscribe();
|
|
8520
8905
|
store.close();
|
|
8521
8906
|
});
|
|
@@ -8530,7 +8915,7 @@ function useVoiceTurnLatency(path = "/api/turn-latency", options = {}) {
|
|
|
8530
8915
|
}
|
|
8531
8916
|
|
|
8532
8917
|
// src/vue/VoiceTurnLatency.ts
|
|
8533
|
-
var VoiceTurnLatency =
|
|
8918
|
+
var VoiceTurnLatency = defineComponent15({
|
|
8534
8919
|
name: "VoiceTurnLatency",
|
|
8535
8920
|
props: {
|
|
8536
8921
|
class: { default: "", type: String },
|
|
@@ -8556,47 +8941,47 @@ var VoiceTurnLatency = defineComponent14({
|
|
|
8556
8941
|
report: latency.report.value,
|
|
8557
8942
|
updatedAt: latency.updatedAt.value
|
|
8558
8943
|
}, options));
|
|
8559
|
-
return () =>
|
|
8944
|
+
return () => h15("section", {
|
|
8560
8945
|
class: [
|
|
8561
8946
|
"absolute-voice-turn-latency",
|
|
8562
8947
|
`absolute-voice-turn-latency--${model.value.status}`,
|
|
8563
8948
|
props.class
|
|
8564
8949
|
]
|
|
8565
8950
|
}, [
|
|
8566
|
-
|
|
8567
|
-
|
|
8568
|
-
|
|
8951
|
+
h15("header", { class: "absolute-voice-turn-latency__header" }, [
|
|
8952
|
+
h15("span", { class: "absolute-voice-turn-latency__eyebrow" }, model.value.title),
|
|
8953
|
+
h15("strong", { class: "absolute-voice-turn-latency__label" }, model.value.label)
|
|
8569
8954
|
]),
|
|
8570
|
-
|
|
8571
|
-
model.value.showProofAction ?
|
|
8955
|
+
h15("p", { class: "absolute-voice-turn-latency__description" }, model.value.description),
|
|
8956
|
+
model.value.showProofAction ? h15("button", {
|
|
8572
8957
|
class: "absolute-voice-turn-latency__proof",
|
|
8573
8958
|
onClick: () => {
|
|
8574
8959
|
latency.runProof().catch(() => {});
|
|
8575
8960
|
},
|
|
8576
8961
|
type: "button"
|
|
8577
8962
|
}, model.value.proofLabel) : null,
|
|
8578
|
-
model.value.turns.length ?
|
|
8963
|
+
model.value.turns.length ? h15("div", { class: "absolute-voice-turn-latency__turns" }, model.value.turns.map((turn) => h15("article", {
|
|
8579
8964
|
class: [
|
|
8580
8965
|
"absolute-voice-turn-latency__turn",
|
|
8581
8966
|
`absolute-voice-turn-latency__turn--${turn.status}`
|
|
8582
8967
|
],
|
|
8583
8968
|
key: `${turn.sessionId}:${turn.turnId}`
|
|
8584
8969
|
}, [
|
|
8585
|
-
|
|
8586
|
-
|
|
8587
|
-
|
|
8970
|
+
h15("header", [
|
|
8971
|
+
h15("strong", turn.label),
|
|
8972
|
+
h15("span", turn.status)
|
|
8588
8973
|
]),
|
|
8589
|
-
|
|
8590
|
-
|
|
8591
|
-
|
|
8974
|
+
h15("dl", turn.rows.map((row) => h15("div", { key: row.label }, [
|
|
8975
|
+
h15("dt", row.label),
|
|
8976
|
+
h15("dd", row.value)
|
|
8592
8977
|
])))
|
|
8593
|
-
]))) :
|
|
8594
|
-
model.value.error ?
|
|
8978
|
+
]))) : h15("p", { class: "absolute-voice-turn-latency__empty" }, "Complete a voice turn to see latency diagnostics."),
|
|
8979
|
+
model.value.error ? h15("p", { class: "absolute-voice-turn-latency__error" }, model.value.error) : null
|
|
8595
8980
|
]);
|
|
8596
8981
|
}
|
|
8597
8982
|
});
|
|
8598
8983
|
// src/vue/VoiceTurnQuality.ts
|
|
8599
|
-
import { computed as computed9, defineComponent as
|
|
8984
|
+
import { computed as computed9, defineComponent as defineComponent16, h as h16 } from "vue";
|
|
8600
8985
|
|
|
8601
8986
|
// src/client/turnQuality.ts
|
|
8602
8987
|
var fetchVoiceTurnQuality = async (path = "/api/turn-quality", options = {}) => {
|
|
@@ -8678,9 +9063,9 @@ var createVoiceTurnQualityStore = (path = "/api/turn-quality", options = {}) =>
|
|
|
8678
9063
|
};
|
|
8679
9064
|
|
|
8680
9065
|
// src/client/turnQualityWidget.ts
|
|
8681
|
-
var
|
|
8682
|
-
var
|
|
8683
|
-
var
|
|
9066
|
+
var DEFAULT_TITLE15 = "Turn Quality";
|
|
9067
|
+
var DEFAULT_DESCRIPTION15 = "Per-turn STT confidence, fallback selection, corrections, and transcript coverage.";
|
|
9068
|
+
var escapeHtml21 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
8684
9069
|
var formatConfidence = (value) => typeof value === "number" ? `${Math.round(value * 100)}%` : "n/a";
|
|
8685
9070
|
var formatMaybe = (value) => value === undefined || value === "" ? "n/a" : String(value);
|
|
8686
9071
|
var getTurnDetail = (turn) => {
|
|
@@ -8724,37 +9109,37 @@ var createVoiceTurnQualityViewModel = (snapshot, options = {}) => {
|
|
|
8724
9109
|
const warningCount = snapshot.report?.warnings ?? turns.filter((turn) => turn.status === "warn").length;
|
|
8725
9110
|
const failedCount = snapshot.report?.failed ?? turns.filter((turn) => turn.status === "fail").length;
|
|
8726
9111
|
return {
|
|
8727
|
-
description: options.description ??
|
|
9112
|
+
description: options.description ?? DEFAULT_DESCRIPTION15,
|
|
8728
9113
|
error: snapshot.error,
|
|
8729
9114
|
isLoading: snapshot.isLoading,
|
|
8730
9115
|
label: snapshot.error ? "Unavailable" : turns.length ? failedCount > 0 ? `${failedCount} failed` : warningCount > 0 ? `${warningCount} warnings` : `${turns.length} healthy` : snapshot.isLoading ? "Checking" : "No turns",
|
|
8731
9116
|
status: snapshot.error ? "error" : turns.length ? failedCount > 0 || warningCount > 0 ? "warning" : "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
8732
|
-
title: options.title ??
|
|
9117
|
+
title: options.title ?? DEFAULT_TITLE15,
|
|
8733
9118
|
turns,
|
|
8734
9119
|
updatedAt: snapshot.updatedAt
|
|
8735
9120
|
};
|
|
8736
9121
|
};
|
|
8737
9122
|
var renderVoiceTurnQualityHTML = (snapshot, options = {}) => {
|
|
8738
9123
|
const model = createVoiceTurnQualityViewModel(snapshot, options);
|
|
8739
|
-
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--${
|
|
9124
|
+
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--${escapeHtml21(turn.status)}">
|
|
8740
9125
|
<header>
|
|
8741
|
-
<strong>${
|
|
8742
|
-
<span>${
|
|
9126
|
+
<strong>${escapeHtml21(turn.label)}</strong>
|
|
9127
|
+
<span>${escapeHtml21(turn.status)}</span>
|
|
8743
9128
|
</header>
|
|
8744
|
-
<p>${
|
|
9129
|
+
<p>${escapeHtml21(turn.detail)}</p>
|
|
8745
9130
|
<dl>${turn.rows.map((row) => `<div>
|
|
8746
|
-
<dt>${
|
|
8747
|
-
<dd>${
|
|
9131
|
+
<dt>${escapeHtml21(row.label)}</dt>
|
|
9132
|
+
<dd>${escapeHtml21(row.value)}</dd>
|
|
8748
9133
|
</div>`).join("")}</dl>
|
|
8749
9134
|
</article>`).join("")}</div>` : '<p class="absolute-voice-turn-quality__empty">Complete a voice turn to see STT quality diagnostics.</p>';
|
|
8750
|
-
return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${
|
|
9135
|
+
return `<section class="absolute-voice-turn-quality absolute-voice-turn-quality--${escapeHtml21(model.status)}">
|
|
8751
9136
|
<header class="absolute-voice-turn-quality__header">
|
|
8752
|
-
<span class="absolute-voice-turn-quality__eyebrow">${
|
|
8753
|
-
<strong class="absolute-voice-turn-quality__label">${
|
|
9137
|
+
<span class="absolute-voice-turn-quality__eyebrow">${escapeHtml21(model.title)}</span>
|
|
9138
|
+
<strong class="absolute-voice-turn-quality__label">${escapeHtml21(model.label)}</strong>
|
|
8754
9139
|
</header>
|
|
8755
|
-
<p class="absolute-voice-turn-quality__description">${
|
|
9140
|
+
<p class="absolute-voice-turn-quality__description">${escapeHtml21(model.description)}</p>
|
|
8756
9141
|
${turns}
|
|
8757
|
-
${model.error ? `<p class="absolute-voice-turn-quality__error">${
|
|
9142
|
+
${model.error ? `<p class="absolute-voice-turn-quality__error">${escapeHtml21(model.error)}</p>` : ""}
|
|
8758
9143
|
</section>`;
|
|
8759
9144
|
};
|
|
8760
9145
|
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}`;
|
|
@@ -8796,13 +9181,13 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
|
|
|
8796
9181
|
};
|
|
8797
9182
|
|
|
8798
9183
|
// src/vue/useVoiceTurnQuality.ts
|
|
8799
|
-
import { onUnmounted as
|
|
9184
|
+
import { onUnmounted as onUnmounted16, shallowRef as shallowRef15 } from "vue";
|
|
8800
9185
|
function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
|
|
8801
9186
|
const store = createVoiceTurnQualityStore(path, options);
|
|
8802
|
-
const error =
|
|
8803
|
-
const isLoading =
|
|
8804
|
-
const report =
|
|
8805
|
-
const updatedAt =
|
|
9187
|
+
const error = shallowRef15(null);
|
|
9188
|
+
const isLoading = shallowRef15(false);
|
|
9189
|
+
const report = shallowRef15();
|
|
9190
|
+
const updatedAt = shallowRef15(undefined);
|
|
8806
9191
|
const sync = () => {
|
|
8807
9192
|
const snapshot = store.getSnapshot();
|
|
8808
9193
|
error.value = snapshot.error;
|
|
@@ -8813,7 +9198,7 @@ function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
|
|
|
8813
9198
|
const unsubscribe = store.subscribe(sync);
|
|
8814
9199
|
sync();
|
|
8815
9200
|
store.refresh().catch(() => {});
|
|
8816
|
-
|
|
9201
|
+
onUnmounted16(() => {
|
|
8817
9202
|
unsubscribe();
|
|
8818
9203
|
store.close();
|
|
8819
9204
|
});
|
|
@@ -8821,7 +9206,7 @@ function useVoiceTurnQuality(path = "/api/turn-quality", options = {}) {
|
|
|
8821
9206
|
}
|
|
8822
9207
|
|
|
8823
9208
|
// src/vue/VoiceTurnQuality.ts
|
|
8824
|
-
var VoiceTurnQuality =
|
|
9209
|
+
var VoiceTurnQuality = defineComponent16({
|
|
8825
9210
|
name: "VoiceTurnQuality",
|
|
8826
9211
|
props: {
|
|
8827
9212
|
class: { default: "", type: String },
|
|
@@ -8843,41 +9228,41 @@ var VoiceTurnQuality = defineComponent15({
|
|
|
8843
9228
|
report: quality.report.value,
|
|
8844
9229
|
updatedAt: quality.updatedAt.value
|
|
8845
9230
|
}, options));
|
|
8846
|
-
return () =>
|
|
9231
|
+
return () => h16("section", {
|
|
8847
9232
|
class: [
|
|
8848
9233
|
"absolute-voice-turn-quality",
|
|
8849
9234
|
`absolute-voice-turn-quality--${model.value.status}`,
|
|
8850
9235
|
props.class
|
|
8851
9236
|
]
|
|
8852
9237
|
}, [
|
|
8853
|
-
|
|
8854
|
-
|
|
8855
|
-
|
|
9238
|
+
h16("header", { class: "absolute-voice-turn-quality__header" }, [
|
|
9239
|
+
h16("span", { class: "absolute-voice-turn-quality__eyebrow" }, model.value.title),
|
|
9240
|
+
h16("strong", { class: "absolute-voice-turn-quality__label" }, model.value.label)
|
|
8856
9241
|
]),
|
|
8857
|
-
|
|
8858
|
-
model.value.turns.length ?
|
|
9242
|
+
h16("p", { class: "absolute-voice-turn-quality__description" }, model.value.description),
|
|
9243
|
+
model.value.turns.length ? h16("div", { class: "absolute-voice-turn-quality__turns" }, model.value.turns.map((turn) => h16("article", {
|
|
8859
9244
|
class: [
|
|
8860
9245
|
"absolute-voice-turn-quality__turn",
|
|
8861
9246
|
`absolute-voice-turn-quality__turn--${turn.status}`
|
|
8862
9247
|
],
|
|
8863
9248
|
key: `${turn.sessionId}:${turn.turnId}`
|
|
8864
9249
|
}, [
|
|
8865
|
-
|
|
8866
|
-
|
|
8867
|
-
|
|
9250
|
+
h16("header", [
|
|
9251
|
+
h16("strong", turn.label),
|
|
9252
|
+
h16("span", turn.status)
|
|
8868
9253
|
]),
|
|
8869
|
-
|
|
8870
|
-
|
|
8871
|
-
|
|
8872
|
-
|
|
9254
|
+
h16("p", turn.detail),
|
|
9255
|
+
h16("dl", turn.rows.map((row) => h16("div", { key: row.label }, [
|
|
9256
|
+
h16("dt", row.label),
|
|
9257
|
+
h16("dd", row.value)
|
|
8873
9258
|
])))
|
|
8874
|
-
]))) :
|
|
8875
|
-
model.value.error ?
|
|
9259
|
+
]))) : h16("p", { class: "absolute-voice-turn-quality__empty" }, "Complete a voice turn to see STT quality diagnostics."),
|
|
9260
|
+
model.value.error ? h16("p", { class: "absolute-voice-turn-quality__error" }, model.value.error) : null
|
|
8876
9261
|
]);
|
|
8877
9262
|
}
|
|
8878
9263
|
});
|
|
8879
9264
|
// src/vue/useVoiceProfileComparison.ts
|
|
8880
|
-
import { onUnmounted as
|
|
9265
|
+
import { onUnmounted as onUnmounted17, ref as ref12, shallowRef as shallowRef16 } from "vue";
|
|
8881
9266
|
|
|
8882
9267
|
// src/client/profileComparison.ts
|
|
8883
9268
|
var fetchVoiceProfileComparison = async (path = "/api/voice/real-call-profile-history", options = {}) => {
|
|
@@ -8957,10 +9342,10 @@ var createVoiceProfileComparisonStore = (path = "/api/voice/real-call-profile-hi
|
|
|
8957
9342
|
// src/vue/useVoiceProfileComparison.ts
|
|
8958
9343
|
function useVoiceProfileComparison(path = "/api/voice/real-call-profile-history", options = {}) {
|
|
8959
9344
|
const store = createVoiceProfileComparisonStore(path, options);
|
|
8960
|
-
const error =
|
|
8961
|
-
const isLoading =
|
|
8962
|
-
const report =
|
|
8963
|
-
const updatedAt =
|
|
9345
|
+
const error = ref12(null);
|
|
9346
|
+
const isLoading = ref12(false);
|
|
9347
|
+
const report = shallowRef16(undefined);
|
|
9348
|
+
const updatedAt = ref12(undefined);
|
|
8964
9349
|
const sync = () => {
|
|
8965
9350
|
const snapshot = store.getSnapshot();
|
|
8966
9351
|
error.value = snapshot.error;
|
|
@@ -8973,7 +9358,7 @@ function useVoiceProfileComparison(path = "/api/voice/real-call-profile-history"
|
|
|
8973
9358
|
if (typeof window !== "undefined") {
|
|
8974
9359
|
store.refresh().catch(() => {});
|
|
8975
9360
|
}
|
|
8976
|
-
|
|
9361
|
+
onUnmounted17(() => {
|
|
8977
9362
|
unsubscribe();
|
|
8978
9363
|
store.close();
|
|
8979
9364
|
});
|
|
@@ -8986,7 +9371,7 @@ function useVoiceProfileComparison(path = "/api/voice/real-call-profile-history"
|
|
|
8986
9371
|
};
|
|
8987
9372
|
}
|
|
8988
9373
|
// src/vue/useVoiceLiveOps.ts
|
|
8989
|
-
import { onUnmounted as
|
|
9374
|
+
import { onUnmounted as onUnmounted18, ref as ref13, shallowRef as shallowRef17 } from "vue";
|
|
8990
9375
|
|
|
8991
9376
|
// src/client/liveOps.ts
|
|
8992
9377
|
var postVoiceLiveOpsAction = async (input, options = {}) => {
|
|
@@ -9077,11 +9462,11 @@ var createVoiceLiveOpsStore = (options = {}) => {
|
|
|
9077
9462
|
// src/vue/useVoiceLiveOps.ts
|
|
9078
9463
|
function useVoiceLiveOps(options = {}) {
|
|
9079
9464
|
const store = createVoiceLiveOpsStore(options);
|
|
9080
|
-
const error =
|
|
9081
|
-
const isRunning =
|
|
9082
|
-
const lastResult =
|
|
9083
|
-
const runningAction =
|
|
9084
|
-
const updatedAt =
|
|
9465
|
+
const error = ref13(null);
|
|
9466
|
+
const isRunning = ref13(false);
|
|
9467
|
+
const lastResult = shallowRef17(undefined);
|
|
9468
|
+
const runningAction = ref13(undefined);
|
|
9469
|
+
const updatedAt = ref13(undefined);
|
|
9085
9470
|
const sync = () => {
|
|
9086
9471
|
const snapshot = store.getSnapshot();
|
|
9087
9472
|
error.value = snapshot.error;
|
|
@@ -9092,7 +9477,7 @@ function useVoiceLiveOps(options = {}) {
|
|
|
9092
9477
|
};
|
|
9093
9478
|
const unsubscribe = store.subscribe(sync);
|
|
9094
9479
|
sync();
|
|
9095
|
-
|
|
9480
|
+
onUnmounted18(() => {
|
|
9096
9481
|
unsubscribe();
|
|
9097
9482
|
store.close();
|
|
9098
9483
|
});
|
|
@@ -9106,7 +9491,7 @@ function useVoiceLiveOps(options = {}) {
|
|
|
9106
9491
|
};
|
|
9107
9492
|
}
|
|
9108
9493
|
// src/vue/useVoiceCampaignDialerProof.ts
|
|
9109
|
-
import { onUnmounted as
|
|
9494
|
+
import { onUnmounted as onUnmounted19, shallowRef as shallowRef18 } from "vue";
|
|
9110
9495
|
|
|
9111
9496
|
// src/client/campaignDialerProof.ts
|
|
9112
9497
|
var fetchVoiceCampaignDialerProofStatus = async (path = "/api/voice/campaigns/dialer-proof", options = {}) => {
|
|
@@ -9229,11 +9614,11 @@ var createVoiceCampaignDialerProofStore = (path = "/api/voice/campaigns/dialer-p
|
|
|
9229
9614
|
// src/vue/useVoiceCampaignDialerProof.ts
|
|
9230
9615
|
function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof", options = {}) {
|
|
9231
9616
|
const store = createVoiceCampaignDialerProofStore(path, options);
|
|
9232
|
-
const error =
|
|
9233
|
-
const isLoading =
|
|
9234
|
-
const report =
|
|
9235
|
-
const status =
|
|
9236
|
-
const updatedAt =
|
|
9617
|
+
const error = shallowRef18(null);
|
|
9618
|
+
const isLoading = shallowRef18(false);
|
|
9619
|
+
const report = shallowRef18();
|
|
9620
|
+
const status = shallowRef18();
|
|
9621
|
+
const updatedAt = shallowRef18(undefined);
|
|
9237
9622
|
const sync = () => {
|
|
9238
9623
|
const snapshot = store.getSnapshot();
|
|
9239
9624
|
error.value = snapshot.error;
|
|
@@ -9247,7 +9632,7 @@ function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof",
|
|
|
9247
9632
|
if (typeof window !== "undefined") {
|
|
9248
9633
|
store.refresh().catch(() => {});
|
|
9249
9634
|
}
|
|
9250
|
-
|
|
9635
|
+
onUnmounted19(() => {
|
|
9251
9636
|
unsubscribe();
|
|
9252
9637
|
store.close();
|
|
9253
9638
|
});
|
|
@@ -9262,7 +9647,7 @@ function useVoiceCampaignDialerProof(path = "/api/voice/campaigns/dialer-proof",
|
|
|
9262
9647
|
};
|
|
9263
9648
|
}
|
|
9264
9649
|
// src/vue/useVoiceStream.ts
|
|
9265
|
-
import { onUnmounted as
|
|
9650
|
+
import { onUnmounted as onUnmounted20, ref as ref14, shallowRef as shallowRef19 } from "vue";
|
|
9266
9651
|
|
|
9267
9652
|
// src/client/actions.ts
|
|
9268
9653
|
var normalizeErrorMessage = (value) => {
|
|
@@ -10667,17 +11052,17 @@ var createVoiceStream = (path, options = {}) => {
|
|
|
10667
11052
|
// src/vue/useVoiceStream.ts
|
|
10668
11053
|
function useVoiceStream(path, options = {}) {
|
|
10669
11054
|
const stream = createVoiceStream(path, options);
|
|
10670
|
-
const assistantAudio =
|
|
10671
|
-
const assistantTexts =
|
|
10672
|
-
const call =
|
|
10673
|
-
const error =
|
|
10674
|
-
const isConnected =
|
|
10675
|
-
const partial =
|
|
10676
|
-
const reconnect =
|
|
10677
|
-
const sessionId =
|
|
10678
|
-
const sessionMetadata =
|
|
10679
|
-
const status =
|
|
10680
|
-
const turns =
|
|
11055
|
+
const assistantAudio = shallowRef19([]);
|
|
11056
|
+
const assistantTexts = shallowRef19([]);
|
|
11057
|
+
const call = shallowRef19(null);
|
|
11058
|
+
const error = ref14(null);
|
|
11059
|
+
const isConnected = ref14(false);
|
|
11060
|
+
const partial = ref14("");
|
|
11061
|
+
const reconnect = shallowRef19(stream.reconnect);
|
|
11062
|
+
const sessionId = ref14(stream.sessionId);
|
|
11063
|
+
const sessionMetadata = shallowRef19(stream.sessionMetadata);
|
|
11064
|
+
const status = ref14(stream.status);
|
|
11065
|
+
const turns = shallowRef19([]);
|
|
10681
11066
|
const sync = () => {
|
|
10682
11067
|
assistantAudio.value = [...stream.assistantAudio];
|
|
10683
11068
|
assistantTexts.value = [...stream.assistantTexts];
|
|
@@ -10697,7 +11082,7 @@ function useVoiceStream(path, options = {}) {
|
|
|
10697
11082
|
unsubscribe();
|
|
10698
11083
|
stream.close();
|
|
10699
11084
|
};
|
|
10700
|
-
|
|
11085
|
+
onUnmounted20(destroy);
|
|
10701
11086
|
return {
|
|
10702
11087
|
assistantAudio,
|
|
10703
11088
|
assistantTexts,
|
|
@@ -10718,7 +11103,7 @@ function useVoiceStream(path, options = {}) {
|
|
|
10718
11103
|
};
|
|
10719
11104
|
}
|
|
10720
11105
|
// src/vue/useVoiceController.ts
|
|
10721
|
-
import { onUnmounted as
|
|
11106
|
+
import { onUnmounted as onUnmounted21, ref as ref15, shallowRef as shallowRef20 } from "vue";
|
|
10722
11107
|
|
|
10723
11108
|
// src/client/htmx.ts
|
|
10724
11109
|
var DEFAULT_EVENT_NAME = "voice-refresh";
|
|
@@ -11370,17 +11755,17 @@ var createVoiceController = (path, options = {}) => {
|
|
|
11370
11755
|
// src/vue/useVoiceController.ts
|
|
11371
11756
|
function useVoiceController(path, options = {}) {
|
|
11372
11757
|
const controller = createVoiceController(path, options);
|
|
11373
|
-
const assistantAudio =
|
|
11374
|
-
const assistantTexts =
|
|
11375
|
-
const error =
|
|
11376
|
-
const isConnected =
|
|
11377
|
-
const isRecording =
|
|
11378
|
-
const partial =
|
|
11379
|
-
const reconnect =
|
|
11380
|
-
const recordingError =
|
|
11381
|
-
const sessionId =
|
|
11382
|
-
const status =
|
|
11383
|
-
const turns =
|
|
11758
|
+
const assistantAudio = shallowRef20([]);
|
|
11759
|
+
const assistantTexts = shallowRef20([]);
|
|
11760
|
+
const error = ref15(null);
|
|
11761
|
+
const isConnected = ref15(false);
|
|
11762
|
+
const isRecording = ref15(false);
|
|
11763
|
+
const partial = ref15("");
|
|
11764
|
+
const reconnect = shallowRef20(controller.reconnect);
|
|
11765
|
+
const recordingError = ref15(null);
|
|
11766
|
+
const sessionId = ref15(controller.sessionId);
|
|
11767
|
+
const status = ref15(controller.status);
|
|
11768
|
+
const turns = shallowRef20([]);
|
|
11384
11769
|
const sync = () => {
|
|
11385
11770
|
assistantAudio.value = [...controller.assistantAudio];
|
|
11386
11771
|
assistantTexts.value = [...controller.assistantTexts];
|
|
@@ -11400,7 +11785,7 @@ function useVoiceController(path, options = {}) {
|
|
|
11400
11785
|
unsubscribe();
|
|
11401
11786
|
controller.close();
|
|
11402
11787
|
};
|
|
11403
|
-
|
|
11788
|
+
onUnmounted21(destroy);
|
|
11404
11789
|
return {
|
|
11405
11790
|
assistantAudio,
|
|
11406
11791
|
assistantTexts,
|
|
@@ -11424,13 +11809,13 @@ function useVoiceController(path, options = {}) {
|
|
|
11424
11809
|
};
|
|
11425
11810
|
}
|
|
11426
11811
|
// src/vue/useVoiceTraceTimeline.ts
|
|
11427
|
-
import { onUnmounted as
|
|
11812
|
+
import { onUnmounted as onUnmounted22, ref as ref16, shallowRef as shallowRef21 } from "vue";
|
|
11428
11813
|
function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
|
|
11429
11814
|
const store = createVoiceTraceTimelineStore(path, options);
|
|
11430
|
-
const error =
|
|
11431
|
-
const isLoading =
|
|
11432
|
-
const report =
|
|
11433
|
-
const updatedAt =
|
|
11815
|
+
const error = ref16(null);
|
|
11816
|
+
const isLoading = ref16(false);
|
|
11817
|
+
const report = shallowRef21(null);
|
|
11818
|
+
const updatedAt = ref16(undefined);
|
|
11434
11819
|
const sync = () => {
|
|
11435
11820
|
const snapshot = store.getSnapshot();
|
|
11436
11821
|
error.value = snapshot.error;
|
|
@@ -11441,7 +11826,7 @@ function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
|
|
|
11441
11826
|
const unsubscribe = store.subscribe(sync);
|
|
11442
11827
|
sync();
|
|
11443
11828
|
store.refresh().catch(() => {});
|
|
11444
|
-
|
|
11829
|
+
onUnmounted22(() => {
|
|
11445
11830
|
unsubscribe();
|
|
11446
11831
|
store.close();
|
|
11447
11832
|
});
|
|
@@ -11454,7 +11839,7 @@ function useVoiceTraceTimeline(path = "/api/voice-traces", options = {}) {
|
|
|
11454
11839
|
};
|
|
11455
11840
|
}
|
|
11456
11841
|
// src/vue/useVoiceWorkflowStatus.ts
|
|
11457
|
-
import { onUnmounted as
|
|
11842
|
+
import { onUnmounted as onUnmounted23, ref as ref17, shallowRef as shallowRef22 } from "vue";
|
|
11458
11843
|
|
|
11459
11844
|
// src/client/workflowStatus.ts
|
|
11460
11845
|
var fetchVoiceWorkflowStatus = async (path = "/evals/scenarios/json", options = {}) => {
|
|
@@ -11538,10 +11923,10 @@ var createVoiceWorkflowStatusStore = (path = "/evals/scenarios/json", options =
|
|
|
11538
11923
|
// src/vue/useVoiceWorkflowStatus.ts
|
|
11539
11924
|
function useVoiceWorkflowStatus(path = "/evals/scenarios/json", options = {}) {
|
|
11540
11925
|
const store = createVoiceWorkflowStatusStore(path, options);
|
|
11541
|
-
const error =
|
|
11542
|
-
const isLoading =
|
|
11543
|
-
const report =
|
|
11544
|
-
const updatedAt =
|
|
11926
|
+
const error = ref17(null);
|
|
11927
|
+
const isLoading = ref17(false);
|
|
11928
|
+
const report = shallowRef22(undefined);
|
|
11929
|
+
const updatedAt = ref17(undefined);
|
|
11545
11930
|
const sync = () => {
|
|
11546
11931
|
const snapshot = store.getSnapshot();
|
|
11547
11932
|
error.value = snapshot.error;
|
|
@@ -11554,7 +11939,7 @@ function useVoiceWorkflowStatus(path = "/evals/scenarios/json", options = {}) {
|
|
|
11554
11939
|
if (typeof window !== "undefined") {
|
|
11555
11940
|
store.refresh().catch(() => {});
|
|
11556
11941
|
}
|
|
11557
|
-
|
|
11942
|
+
onUnmounted23(() => {
|
|
11558
11943
|
unsubscribe();
|
|
11559
11944
|
store.close();
|
|
11560
11945
|
});
|
|
@@ -11574,6 +11959,7 @@ export {
|
|
|
11574
11959
|
useVoiceStream,
|
|
11575
11960
|
useVoiceSessionSnapshot,
|
|
11576
11961
|
useVoiceRoutingStatus,
|
|
11962
|
+
useVoiceReconnectProfileEvidence,
|
|
11577
11963
|
useVoiceReadinessFailures,
|
|
11578
11964
|
useVoiceProviderStatus,
|
|
11579
11965
|
useVoiceProviderSimulationControls,
|
|
@@ -11594,6 +11980,7 @@ export {
|
|
|
11594
11980
|
VoiceTurnLatency,
|
|
11595
11981
|
VoiceSessionSnapshot,
|
|
11596
11982
|
VoiceRoutingStatus,
|
|
11983
|
+
VoiceReconnectProfileEvidence,
|
|
11597
11984
|
VoiceReadinessFailures,
|
|
11598
11985
|
VoiceProviderStatus,
|
|
11599
11986
|
VoiceProviderSimulationControls,
|