@absolutejs/voice 0.0.22-beta.363 → 0.0.22-beta.365
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/index.js +47 -21
- package/dist/productionReadiness.d.ts +2 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -32423,10 +32423,12 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
|
|
|
32423
32423
|
const request = input.request ?? new Request("http://localhost/");
|
|
32424
32424
|
const query = input.query ?? {};
|
|
32425
32425
|
const events = await options.store.list();
|
|
32426
|
-
const
|
|
32426
|
+
const minTraceAt = typeof options.traceMaxAgeMs === "number" && Number.isFinite(options.traceMaxAgeMs) && options.traceMaxAgeMs > 0 ? Date.now() - options.traceMaxAgeMs : undefined;
|
|
32427
|
+
const readinessEvents = minTraceAt === undefined ? events : events.filter((event) => event.at >= minTraceAt);
|
|
32428
|
+
const routingEvents = listVoiceRoutingEvents(readinessEvents);
|
|
32427
32429
|
const routingSessions = summarizeVoiceRoutingSessions(routingEvents);
|
|
32428
|
-
const liveLatency = summarizeLiveLatency(
|
|
32429
|
-
const providerRecovery = summarizeVoiceProviderFallbackRecovery(
|
|
32430
|
+
const liveLatency = summarizeLiveLatency(readinessEvents, options);
|
|
32431
|
+
const providerRecovery = summarizeVoiceProviderFallbackRecovery(readinessEvents);
|
|
32430
32432
|
const [
|
|
32431
32433
|
quality,
|
|
32432
32434
|
providers,
|
|
@@ -32462,23 +32464,23 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
|
|
|
32462
32464
|
proofSources,
|
|
32463
32465
|
additionalChecks
|
|
32464
32466
|
] = await Promise.all([
|
|
32465
|
-
evaluateVoiceQuality({ events }),
|
|
32467
|
+
evaluateVoiceQuality({ events: readinessEvents }),
|
|
32466
32468
|
Promise.all([
|
|
32467
32469
|
summarizeVoiceProviderHealth({
|
|
32468
|
-
events,
|
|
32470
|
+
events: readinessEvents,
|
|
32469
32471
|
providers: options.llmProviders ?? []
|
|
32470
32472
|
}),
|
|
32471
32473
|
summarizeVoiceProviderHealth({
|
|
32472
|
-
events:
|
|
32474
|
+
events: readinessEvents.filter((event) => event.payload.kind === "stt"),
|
|
32473
32475
|
providers: options.sttProviders ?? []
|
|
32474
32476
|
}),
|
|
32475
32477
|
summarizeVoiceProviderHealth({
|
|
32476
|
-
events:
|
|
32478
|
+
events: readinessEvents.filter((event) => event.payload.kind === "tts"),
|
|
32477
32479
|
providers: options.ttsProviders ?? []
|
|
32478
32480
|
})
|
|
32479
32481
|
]).then((groups) => groups.flat()),
|
|
32480
|
-
summarizeVoiceSessions({ events, status: "all" }),
|
|
32481
|
-
summarizeVoiceHandoffHealth({ events }),
|
|
32482
|
+
summarizeVoiceSessions({ events: readinessEvents, status: "all" }),
|
|
32483
|
+
summarizeVoiceHandoffHealth({ events: readinessEvents }),
|
|
32482
32484
|
summarizeAuditEvidence(options),
|
|
32483
32485
|
summarizeAuditDeliveries(options),
|
|
32484
32486
|
summarizeOpsActionHistory(options),
|
|
@@ -32515,7 +32517,7 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
|
|
|
32515
32517
|
const failedSessionItems = sessions.filter((session) => session.status === "failed");
|
|
32516
32518
|
const operationsRecords = buildOperationsRecordLinks({
|
|
32517
32519
|
base: options.links?.operationsRecords ?? "/voice-operations",
|
|
32518
|
-
events,
|
|
32520
|
+
events: readinessEvents,
|
|
32519
32521
|
failedSessionIds: failedSessionItems.map((session) => session.sessionId),
|
|
32520
32522
|
liveLatencyFailAfterMs: options.liveLatencyFailAfterMs ?? 3200,
|
|
32521
32523
|
liveLatencyMaxAgeMs: options.liveLatencyMaxAgeMs,
|
|
@@ -33563,6 +33565,7 @@ var createVoiceProductionReadinessRoutes = (options) => {
|
|
|
33563
33565
|
const routes = new Elysia54({
|
|
33564
33566
|
name: options.name ?? "absolutejs-voice-production-readiness"
|
|
33565
33567
|
});
|
|
33568
|
+
let cachedReport;
|
|
33566
33569
|
const resolveOptions = async (input) => {
|
|
33567
33570
|
if (!options.resolveOptions) {
|
|
33568
33571
|
return options;
|
|
@@ -33572,14 +33575,41 @@ var createVoiceProductionReadinessRoutes = (options) => {
|
|
|
33572
33575
|
...await options.resolveOptions(input)
|
|
33573
33576
|
};
|
|
33574
33577
|
};
|
|
33575
|
-
|
|
33578
|
+
const reportCacheKey = (query, request) => {
|
|
33579
|
+
const url = new URL(request.url);
|
|
33580
|
+
const queryKey = Object.entries(query).map(([key, value]) => [key, String(value)]).sort(([left], [right]) => left.localeCompare(right)).map(([key, value]) => `${key}=${value}`).join("&");
|
|
33581
|
+
return `${url.pathname}?${queryKey}`;
|
|
33582
|
+
};
|
|
33583
|
+
const getReport = async (query, request) => {
|
|
33584
|
+
const cacheMs = typeof options.cacheMs === "number" && Number.isFinite(options.cacheMs) && options.cacheMs > 0 ? options.cacheMs : 0;
|
|
33585
|
+
const key = reportCacheKey(query, request);
|
|
33586
|
+
if (cacheMs > 0 && cachedReport && cachedReport.key === key && Date.now() - cachedReport.loadedAt <= cacheMs) {
|
|
33587
|
+
return cachedReport.value;
|
|
33588
|
+
}
|
|
33589
|
+
const value = (async () => {
|
|
33590
|
+
const resolvedOptions = await resolveOptions({ query, request });
|
|
33591
|
+
return {
|
|
33592
|
+
report: await buildVoiceProductionReadinessReport(resolvedOptions, {
|
|
33593
|
+
query,
|
|
33594
|
+
request
|
|
33595
|
+
}),
|
|
33596
|
+
resolvedOptions
|
|
33597
|
+
};
|
|
33598
|
+
})();
|
|
33599
|
+
if (cacheMs > 0) {
|
|
33600
|
+
cachedReport = {
|
|
33601
|
+
key,
|
|
33602
|
+
loadedAt: Date.now(),
|
|
33603
|
+
value
|
|
33604
|
+
};
|
|
33605
|
+
}
|
|
33606
|
+
return value;
|
|
33607
|
+
};
|
|
33608
|
+
routes.get(path, async ({ query, request }) => (await getReport(query, request)).report);
|
|
33576
33609
|
if (gatePath !== false) {
|
|
33577
33610
|
routes.get(gatePath, async ({ query, request }) => {
|
|
33578
|
-
const resolvedOptions = await
|
|
33579
|
-
const gate =
|
|
33580
|
-
query,
|
|
33581
|
-
request
|
|
33582
|
-
});
|
|
33611
|
+
const { report, resolvedOptions } = await getReport(query, request);
|
|
33612
|
+
const gate = summarizeVoiceProductionReadinessGate(report, resolvedOptions.gate || undefined);
|
|
33583
33613
|
return new Response(JSON.stringify(gate), {
|
|
33584
33614
|
headers: {
|
|
33585
33615
|
"Content-Type": "application/json; charset=utf-8",
|
|
@@ -33591,11 +33621,7 @@ var createVoiceProductionReadinessRoutes = (options) => {
|
|
|
33591
33621
|
}
|
|
33592
33622
|
if (htmlPath !== false) {
|
|
33593
33623
|
routes.get(htmlPath, async ({ query, request }) => {
|
|
33594
|
-
const resolvedOptions = await
|
|
33595
|
-
const report = await buildVoiceProductionReadinessReport(resolvedOptions, {
|
|
33596
|
-
query,
|
|
33597
|
-
request
|
|
33598
|
-
});
|
|
33624
|
+
const { report, resolvedOptions } = await getReport(query, request);
|
|
33599
33625
|
const body = await (resolvedOptions.render ?? renderVoiceProductionReadinessHTML)(report);
|
|
33600
33626
|
return new Response(body, {
|
|
33601
33627
|
headers: {
|
|
@@ -484,6 +484,7 @@ export type VoiceProductionReadinessRoutesOptions = {
|
|
|
484
484
|
query: Record<string, unknown>;
|
|
485
485
|
request: Request;
|
|
486
486
|
}) => Promise<VoiceCampaignReadinessProofReport> | VoiceCampaignReadinessProofReport);
|
|
487
|
+
cacheMs?: number;
|
|
487
488
|
deliveryRuntime?: false | VoiceDeliveryRuntime | VoiceDeliveryRuntimeSummary | ((input: {
|
|
488
489
|
query: Record<string, unknown>;
|
|
489
490
|
request: Request;
|
|
@@ -581,6 +582,7 @@ export type VoiceProductionReadinessRoutesOptions = {
|
|
|
581
582
|
title?: string;
|
|
582
583
|
traceDeliveries?: false | VoiceProductionReadinessTraceDeliveryOptions;
|
|
583
584
|
ttsProviders?: readonly string[];
|
|
585
|
+
traceMaxAgeMs?: number;
|
|
584
586
|
liveLatencyWarnAfterMs?: number;
|
|
585
587
|
liveLatencyFailAfterMs?: number;
|
|
586
588
|
liveLatencyMaxAgeMs?: number;
|