@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 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 routingEvents = listVoiceRoutingEvents(events);
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(events, options);
32429
- const providerRecovery = summarizeVoiceProviderFallbackRecovery(events);
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: events.filter((event) => event.payload.kind === "stt"),
32474
+ events: readinessEvents.filter((event) => event.payload.kind === "stt"),
32473
32475
  providers: options.sttProviders ?? []
32474
32476
  }),
32475
32477
  summarizeVoiceProviderHealth({
32476
- events: events.filter((event) => event.payload.kind === "tts"),
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
- routes.get(path, async ({ query, request }) => buildVoiceProductionReadinessReport(await resolveOptions({ query, request }), { query, request }));
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 resolveOptions({ query, request });
33579
- const gate = await buildVoiceProductionReadinessGate(resolvedOptions, {
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 resolveOptions({ query, request });
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.363",
3
+ "version": "0.0.22-beta.365",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",