@absolutejs/voice 0.0.22-beta.315 → 0.0.22-beta.317

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
@@ -11914,6 +11914,9 @@ var buildVoiceMediaPipelineReport = (options = {}) => {
11914
11914
  processorGraph: options.processorGraph,
11915
11915
  quality,
11916
11916
  resampling,
11917
+ sessionIds: [
11918
+ ...new Set(frames.map((frame) => frame.sessionId).filter((sessionId) => typeof sessionId === "string"))
11919
+ ].sort(),
11917
11920
  status,
11918
11921
  surface: options.surface ?? "voice-media-pipeline",
11919
11922
  transport: options.transport,
@@ -12045,7 +12048,7 @@ var renderVoiceMediaPipelineHTML = (report, title = "Voice Media Pipeline Proof"
12045
12048
  ...report.quality.issues
12046
12049
  ].map((issue) => `<li class="${escapeHtml15(issue.severity)}"><strong>${escapeHtml15(issue.code)}</strong>: ${escapeHtml15(issue.message)}</li>`).join("");
12047
12050
  const segments = report.vad.segments.map((segment) => `<tr><td>${escapeHtml15(segment.segmentId)}</td><td>${escapeHtml15(segment.frameCount)}</td><td>${escapeHtml15(segment.durationMs ?? "n/a")}</td><td>${escapeHtml15(segment.turnId ?? "n/a")}</td></tr>`).join("");
12048
- return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml15(title)}</title><style>body{background:#101418;color:#f7f3e8;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1100px;padding:32px}.hero,.card{background:#17201d;border:1px solid #2e3d36;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(20,184,166,.18),rgba(245,158,11,.12))}.eyebrow{color:#5eead4;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.3rem,6vw,4.8rem);letter-spacing:-.06em;line-height:.9;margin:.2rem 0 1rem}.summary{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}.metric{background:#101814;border:1px solid #2e3d36;border-radius:18px;padding:14px}.metric span{color:#a8b5ad;display:block;font-size:.78rem;text-transform:uppercase}.metric strong{display:block;font-size:1.65rem;margin-top:5px}.status{border:1px solid #64748b;border-radius:999px;display:inline-flex;font-weight:900;padding:7px 11px}.pass{color:#86efac}.warn,.warning{color:#fde68a}.fail,.error{color:#fecaca}table{border-collapse:collapse;width:100%}td,th{border-bottom:1px solid #2e3d36;padding:10px;text-align:left}</style></head><body><main><section class="hero"><p class="eyebrow">Native media pipeline</p><h1>${escapeHtml15(title)}</h1><p class="status ${escapeHtml15(report.status)}">${escapeHtml15(report.status)}</p><p>${escapeHtml15(report.surface)}</p><section class="summary"><div class="metric"><span>Frames</span><strong>${String(report.frames)}</strong></div><div class="metric"><span>Input audio</span><strong>${String(report.calibration.inputAudioFrames)}</strong></div><div class="metric"><span>Assistant audio</span><strong>${String(report.calibration.assistantAudioFrames)}</strong></div><div class="metric"><span>Trace linked</span><strong>${String(report.calibration.traceLinkedFrames)}</strong></div><div class="metric"><span>First audio</span><strong>${escapeHtml15(report.calibration.firstAudioLatencyMs ?? "n/a")}ms</strong></div><div class="metric"><span>VAD segments</span><strong>${String(report.vad.segments.length)}</strong></div><div class="metric"><span>Interruptions</span><strong>${String(report.interruption.interruptionFrames)}</strong></div><div class="metric"><span>Processor graph</span><strong>${String(report.processorGraph?.nodes.length ?? 0)} nodes</strong></div><div class="metric"><span>Graph out/drop</span><strong>${String(report.processorGraph?.emittedFrames ?? 0)}/${String(report.processorGraph?.droppedFrames ?? 0)}</strong></div><div class="metric"><span>Resampling</span><strong>${report.calibration.resamplingRequired ? "required" : "not required"}</strong></div><div class="metric"><span>Transport</span><strong>${escapeHtml15(report.transport?.state ?? "n/a")}</strong></div><div class="metric"><span>Transport in/out</span><strong>${String(report.transport?.inputFrames ?? 0)}/${String(report.transport?.outputFrames ?? 0)}</strong></div><div class="metric"><span>Backpressure</span><strong>${String(report.transport?.backpressureEvents ?? 0)}</strong></div></section></section><section class="card"><h2>Issues</h2><ul>${issues || '<li class="pass">No media pipeline issues.</li>'}</ul></section><section class="card"><h2>VAD Segments</h2><table><thead><tr><th>Segment</th><th>Frames</th><th>Duration ms</th><th>Turn</th></tr></thead><tbody>${segments || '<tr><td colspan="4">No VAD segments.</td></tr>'}</tbody></table></section></main></body></html>`;
12051
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapeHtml15(title)}</title><style>body{background:#101418;color:#f7f3e8;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1100px;padding:32px}.hero,.card{background:#17201d;border:1px solid #2e3d36;border-radius:24px;margin-bottom:16px;padding:22px}.hero{background:linear-gradient(135deg,rgba(20,184,166,.18),rgba(245,158,11,.12))}.eyebrow{color:#5eead4;font-weight:900;letter-spacing:.1em;text-transform:uppercase}h1{font-size:clamp(2.3rem,6vw,4.8rem);letter-spacing:-.06em;line-height:.9;margin:.2rem 0 1rem}.summary{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}.metric{background:#101814;border:1px solid #2e3d36;border-radius:18px;padding:14px}.metric span{color:#a8b5ad;display:block;font-size:.78rem;text-transform:uppercase}.metric strong{display:block;font-size:1.65rem;margin-top:5px}.status{border:1px solid #64748b;border-radius:999px;display:inline-flex;font-weight:900;padding:7px 11px}.pass{color:#86efac}.warn,.warning{color:#fde68a}.fail,.error{color:#fecaca}table{border-collapse:collapse;width:100%}td,th{border-bottom:1px solid #2e3d36;padding:10px;text-align:left}</style></head><body><main><section class="hero"><p class="eyebrow">Native media pipeline</p><h1>${escapeHtml15(title)}</h1><p class="status ${escapeHtml15(report.status)}">${escapeHtml15(report.status)}</p><p>${escapeHtml15(report.surface)}</p><section class="summary"><div class="metric"><span>Frames</span><strong>${String(report.frames)}</strong></div><div class="metric"><span>Input audio</span><strong>${String(report.calibration.inputAudioFrames)}</strong></div><div class="metric"><span>Assistant audio</span><strong>${String(report.calibration.assistantAudioFrames)}</strong></div><div class="metric"><span>Trace linked</span><strong>${String(report.calibration.traceLinkedFrames)}</strong></div><div class="metric"><span>First audio</span><strong>${escapeHtml15(report.calibration.firstAudioLatencyMs ?? "n/a")}ms</strong></div><div class="metric"><span>VAD segments</span><strong>${String(report.vad.segments.length)}</strong></div><div class="metric"><span>Media quality</span><strong>${escapeHtml15(report.quality.status)}</strong></div><div class="metric"><span>Media gaps</span><strong>${String(report.quality.gapCount)}</strong></div><div class="metric"><span>Media jitter</span><strong>${escapeHtml15(report.quality.jitterMs ?? "n/a")}ms</strong></div><div class="metric"><span>Speech ratio</span><strong>${String(report.quality.speechRatio)}</strong></div><div class="metric"><span>Timestamp drift</span><strong>${escapeHtml15(report.quality.timestampDriftMs ?? "n/a")}ms</strong></div><div class="metric"><span>Interruptions</span><strong>${String(report.interruption.interruptionFrames)}</strong></div><div class="metric"><span>Processor graph</span><strong>${String(report.processorGraph?.nodes.length ?? 0)} nodes</strong></div><div class="metric"><span>Graph out/drop</span><strong>${String(report.processorGraph?.emittedFrames ?? 0)}/${String(report.processorGraph?.droppedFrames ?? 0)}</strong></div><div class="metric"><span>Resampling</span><strong>${report.calibration.resamplingRequired ? "required" : "not required"}</strong></div><div class="metric"><span>Transport</span><strong>${escapeHtml15(report.transport?.state ?? "n/a")}</strong></div><div class="metric"><span>Transport in/out</span><strong>${String(report.transport?.inputFrames ?? 0)}/${String(report.transport?.outputFrames ?? 0)}</strong></div><div class="metric"><span>Backpressure</span><strong>${String(report.transport?.backpressureEvents ?? 0)}</strong></div></section></section><section class="card"><h2>Issues</h2><ul>${issues || '<li class="pass">No media pipeline issues.</li>'}</ul></section><section class="card"><h2>VAD Segments</h2><table><thead><tr><th>Segment</th><th>Frames</th><th>Duration ms</th><th>Turn</th></tr></thead><tbody>${segments || '<tr><td colspan="4">No VAD segments.</td></tr>'}</tbody></table></section></main></body></html>`;
12049
12052
  };
12050
12053
  var createVoiceMediaPipelineRoutes = (options = {}) => {
12051
12054
  const path = options.path ?? "/api/voice/media-pipeline";
@@ -29038,6 +29041,7 @@ var readinessGateCodes = {
29038
29041
  "Delivery runtime": "voice.readiness.delivery_runtime",
29039
29042
  "Handoff delivery": "voice.readiness.handoff_delivery",
29040
29043
  "Live latency proof": "voice.readiness.live_latency",
29044
+ "Media pipeline quality": "voice.readiness.media_pipeline_quality",
29041
29045
  "Operations records": "voice.readiness.operations_records",
29042
29046
  "Operator action history": "voice.readiness.operator_action_history",
29043
29047
  "Ops recovery": "voice.readiness.ops_recovery",
@@ -29211,6 +29215,12 @@ var resolveMonitoringNotifierDelivery = async (options, input) => {
29211
29215
  }
29212
29216
  return typeof options.monitoringNotifierDelivery === "function" ? await options.monitoringNotifierDelivery(input) : options.monitoringNotifierDelivery;
29213
29217
  };
29218
+ var resolveMediaPipeline = async (options, input) => {
29219
+ if (options.mediaPipeline === false || options.mediaPipeline === undefined) {
29220
+ return;
29221
+ }
29222
+ return typeof options.mediaPipeline === "function" ? await options.mediaPipeline(input) : options.mediaPipeline;
29223
+ };
29214
29224
  var isVoiceTelephonyWebhookSecurityReport = (value) => typeof value.generatedAt === "number" && Array.isArray(value.providers) && typeof value.status === "string";
29215
29225
  var resolveTelephonyWebhookSecurity = async (options, input) => {
29216
29226
  if (options.telephonyWebhookSecurity === false || options.telephonyWebhookSecurity === undefined) {
@@ -29546,6 +29556,13 @@ var buildOperationsRecordLinks = (input) => {
29546
29556
  sessionId: event.sessionId,
29547
29557
  status: latencyMs > input.liveLatencyFailAfterMs ? "fail" : "warn"
29548
29558
  }));
29559
+ const mediaQuality = input.mediaPipeline && input.mediaPipeline.status !== "pass" ? input.mediaPipeline.sessionIds.map((sessionId) => ({
29560
+ detail: `${input.mediaPipeline?.quality.issues.length ?? 0} media quality issue(s)`,
29561
+ href: voiceOperationsRecordHref(input.base, sessionId),
29562
+ label: "Open media quality operations record",
29563
+ sessionId,
29564
+ status: "fail"
29565
+ })) : [];
29549
29566
  return {
29550
29567
  failedSessions: input.failedSessionIds.map((sessionId) => ({
29551
29568
  href: voiceOperationsRecordHref(input.base, sessionId),
@@ -29554,6 +29571,7 @@ var buildOperationsRecordLinks = (input) => {
29554
29571
  status: failedSessionSet.has(sessionId) ? "fail" : "warn"
29555
29572
  })),
29556
29573
  failingLatency,
29574
+ mediaQuality,
29557
29575
  providerErrors
29558
29576
  };
29559
29577
  };
@@ -29586,6 +29604,7 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
29586
29604
  phoneAgentSmokes,
29587
29605
  monitoring,
29588
29606
  monitoringNotifierDelivery,
29607
+ mediaPipeline,
29589
29608
  telephonyWebhookSecurity,
29590
29609
  reconnectContracts,
29591
29610
  bargeInReports,
@@ -29628,6 +29647,7 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
29628
29647
  resolvePhoneAgentSmokes(options, { query, request }),
29629
29648
  resolveMonitoring(options, { query, request }),
29630
29649
  resolveMonitoringNotifierDelivery(options, { query, request }),
29650
+ resolveMediaPipeline(options, { query, request }),
29631
29651
  resolveTelephonyWebhookSecurity(options, { query, request }),
29632
29652
  resolveReconnectContracts(options, { query, request }),
29633
29653
  resolveBargeInReports(options, { query, request }),
@@ -29648,7 +29668,8 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
29648
29668
  failedSessionIds: failedSessionItems.map((session) => session.sessionId),
29649
29669
  liveLatencyFailAfterMs: options.liveLatencyFailAfterMs ?? 3200,
29650
29670
  liveLatencyMaxAgeMs: options.liveLatencyMaxAgeMs,
29651
- liveLatencyWarnAfterMs: options.liveLatencyWarnAfterMs ?? 1800
29671
+ liveLatencyWarnAfterMs: options.liveLatencyWarnAfterMs ?? 1800,
29672
+ mediaPipeline
29652
29673
  });
29653
29674
  const checks = [
29654
29675
  {
@@ -29803,6 +29824,17 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
29803
29824
  const metrics = providerSlo?.kinds[issue.kind]?.metrics;
29804
29825
  return Object.values(metrics ?? {}).find((metric) => metric.label === issue.label || issue.code.endsWith(metric.label.toLowerCase().replace(/[^a-z0-9]+/g, "_")));
29805
29826
  };
29827
+ const mediaPipelineSummary = mediaPipeline ? {
29828
+ assistantAudioFrames: mediaPipeline.quality.assistantAudioFrames,
29829
+ backpressureEvents: mediaPipeline.quality.backpressureEvents,
29830
+ gapCount: mediaPipeline.quality.gapCount,
29831
+ inputAudioFrames: mediaPipeline.quality.inputAudioFrames,
29832
+ issues: mediaPipeline.calibration.issues.length + mediaPipeline.interruption.issues.length + mediaPipeline.quality.issues.length,
29833
+ jitterMs: mediaPipeline.quality.jitterMs,
29834
+ speechRatio: mediaPipeline.quality.speechRatio,
29835
+ status: mediaPipeline.status === "pass" ? "pass" : "fail",
29836
+ timestampDriftMs: mediaPipeline.quality.timestampDriftMs
29837
+ } : undefined;
29806
29838
  checks.push({
29807
29839
  detail: liveLatency.total === 0 ? "No browser live-latency measurements are recorded yet." : liveLatency.status === "pass" ? `Live browser turn latency averages ${liveLatency.averageLatencyMs}ms.` : `${liveLatency.failed} failed and ${liveLatency.warnings} warned live-latency measurement(s).`,
29808
29840
  href: firstOperationsRecordHref(operationsRecords.failingLatency) ?? options.links?.liveLatency ?? "/traces",
@@ -29834,6 +29866,42 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
29834
29866
  ...calibratedThresholdActions()
29835
29867
  ]
29836
29868
  });
29869
+ if (mediaPipeline && mediaPipelineSummary) {
29870
+ const firstIssue = [
29871
+ ...mediaPipeline.quality.issues,
29872
+ ...mediaPipeline.calibration.issues,
29873
+ ...mediaPipeline.interruption.issues
29874
+ ][0];
29875
+ checks.push({
29876
+ detail: mediaPipelineSummary.status === "pass" ? `Media pipeline quality is passing with ${mediaPipelineSummary.inputAudioFrames} input frame(s), ${mediaPipelineSummary.assistantAudioFrames} assistant frame(s), ${mediaPipelineSummary.gapCount} gap(s), ${String(mediaPipelineSummary.jitterMs ?? "n/a")}ms jitter, and ${mediaPipelineSummary.speechRatio} speech ratio.` : firstIssue?.message ?? `${mediaPipelineSummary.issues} media pipeline issue(s) need review.`,
29877
+ href: firstOperationsRecordHref(operationsRecords.mediaQuality) ?? options.links?.mediaPipeline ?? "/voice/media-pipeline",
29878
+ label: "Media pipeline quality",
29879
+ proofSource: proofSource("mediaPipeline", "mediaQuality"),
29880
+ gateExplanation: mediaPipelineSummary.status === "pass" ? undefined : {
29881
+ evidenceHref: firstOperationsRecordHref(operationsRecords.mediaQuality) ?? options.links?.mediaPipeline ?? "/voice/media-pipeline",
29882
+ observed: firstIssue?.code ?? `${mediaPipelineSummary.issues} issue(s)`,
29883
+ remediation: "Inspect media pipeline quality, fix excessive gaps, jitter, drift, speech-ratio, or backpressure issues, then rerun readiness proof.",
29884
+ thresholdLabel: "Media quality report status",
29885
+ unit: "status"
29886
+ },
29887
+ status: mediaPipelineSummary.status,
29888
+ value: mediaPipelineSummary.status === "pass" ? `${mediaPipelineSummary.gapCount} gaps` : `${mediaPipelineSummary.issues} issue(s)`,
29889
+ actions: mediaPipelineSummary.status === "pass" ? [] : [
29890
+ ...firstOperationsRecordHref(operationsRecords.mediaQuality) ? [
29891
+ {
29892
+ description: "Open the exact call/session operations record for the first media quality issue.",
29893
+ href: firstOperationsRecordHref(operationsRecords.mediaQuality),
29894
+ label: "Open media operations record"
29895
+ }
29896
+ ] : [],
29897
+ {
29898
+ description: "Open media pipeline proof and inspect quality, calibration, VAD, interruption, transport, and processor-graph evidence.",
29899
+ href: options.links?.mediaPipeline ?? "/voice/media-pipeline",
29900
+ label: "Open media pipeline proof"
29901
+ }
29902
+ ]
29903
+ });
29904
+ }
29837
29905
  const carrierSummary = carriers ? {
29838
29906
  failing: carriers.summary.failing,
29839
29907
  providers: carriers.summary.providers,
@@ -30405,6 +30473,7 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
30405
30473
  observabilityExportDeliveries: "/api/voice/observability-export/deliveries",
30406
30474
  monitoring: "/voice/monitors",
30407
30475
  monitoringNotifierDelivery: "/api/voice/monitor-issues/notifications",
30476
+ mediaPipeline: "/voice/media-pipeline",
30408
30477
  opsActions: "/voice/ops-actions",
30409
30478
  opsRecovery: "/ops-recovery",
30410
30479
  phoneAgentSmoke: "/sessions",
@@ -30438,6 +30507,7 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
30438
30507
  total: handoffs.total
30439
30508
  },
30440
30509
  liveLatency,
30510
+ mediaPipeline: mediaPipelineSummary,
30441
30511
  monitoring: monitoringSummary,
30442
30512
  monitoringNotifierDelivery: monitoringNotifierDeliverySummary,
30443
30513
  opsActionHistory,
@@ -24,6 +24,7 @@ export type VoiceMediaPipelineReport = {
24
24
  quality: MediaQualityReport;
25
25
  resampling?: MediaResamplingPlan;
26
26
  processorGraph?: MediaProcessorGraphReport;
27
+ sessionIds: string[];
27
28
  status: MediaPipelineStatus;
28
29
  surface: string;
29
30
  transport?: MediaTransportReport;
@@ -19,6 +19,7 @@ import type { VoiceProviderOrchestrationReport } from './providerOrchestration';
19
19
  import type { VoiceCampaignReadinessProofReport } from './campaign';
20
20
  import { type VoiceOpsRecoveryReport } from './opsRecovery';
21
21
  import { type VoiceObservabilityExportDeliveryHistory, type VoiceObservabilityExportDeliveryReceiptStore, type VoiceObservabilityExportReplayReport, type VoiceObservabilityExportReplaySource, type VoiceObservabilityExportReport } from './observabilityExport';
22
+ import type { VoiceMediaPipelineReport } from './mediaPipelineRoutes';
22
23
  export type VoiceProductionReadinessObservabilityExportDeliveryHistoryOptions = {
23
24
  failOnMissing?: boolean;
24
25
  failOnStale?: boolean;
@@ -132,6 +133,7 @@ export type VoiceProductionReadinessReport = {
132
133
  observabilityExportDeliveries?: string;
133
134
  monitoring?: string;
134
135
  monitoringNotifierDelivery?: string;
136
+ mediaPipeline?: string;
135
137
  opsActions?: string;
136
138
  opsRecovery?: string;
137
139
  phoneAgentSmoke?: string;
@@ -207,6 +209,17 @@ export type VoiceProductionReadinessReport = {
207
209
  status: VoiceProductionReadinessStatus;
208
210
  total: number;
209
211
  };
212
+ mediaPipeline?: {
213
+ assistantAudioFrames: number;
214
+ backpressureEvents: number;
215
+ gapCount: number;
216
+ inputAudioFrames: number;
217
+ issues: number;
218
+ jitterMs?: number;
219
+ speechRatio: number;
220
+ status: VoiceProductionReadinessStatus;
221
+ timestampDriftMs?: number;
222
+ };
210
223
  opsActionHistory?: VoiceProductionReadinessOpsActionHistorySummary;
211
224
  opsRecovery?: {
212
225
  issues: number;
@@ -311,6 +324,7 @@ export type VoiceProductionReadinessOperationsRecordLink = {
311
324
  export type VoiceProductionReadinessOperationsRecordLinks = {
312
325
  failedSessions: VoiceProductionReadinessOperationsRecordLink[];
313
326
  failingLatency: VoiceProductionReadinessOperationsRecordLink[];
327
+ mediaQuality: VoiceProductionReadinessOperationsRecordLink[];
314
328
  providerErrors: VoiceProductionReadinessOperationsRecordLink[];
315
329
  };
316
330
  export type VoiceProductionReadinessAuditRequirement = {
@@ -446,6 +460,10 @@ export type VoiceProductionReadinessRoutesOptions = {
446
460
  query: Record<string, unknown>;
447
461
  request: Request;
448
462
  }) => Promise<VoiceMonitorNotifierDeliveryReport> | VoiceMonitorNotifierDeliveryReport);
463
+ mediaPipeline?: false | VoiceMediaPipelineReport | ((input: {
464
+ query: Record<string, unknown>;
465
+ request: Request;
466
+ }) => Promise<VoiceMediaPipelineReport> | VoiceMediaPipelineReport);
449
467
  opsActionHistory?: false | VoiceProductionReadinessOpsActionHistoryOptions;
450
468
  opsRecovery?: false | VoiceOpsRecoveryReport | ((input: {
451
469
  query: Record<string, unknown>;
@@ -51,6 +51,7 @@ export declare const useVoiceReadinessFailures: (path?: string, options?: VoiceR
51
51
  readonly observabilityExportDeliveries?: string | undefined;
52
52
  readonly monitoring?: string | undefined;
53
53
  readonly monitoringNotifierDelivery?: string | undefined;
54
+ readonly mediaPipeline?: string | undefined;
54
55
  readonly opsActions?: string | undefined;
55
56
  readonly opsRecovery?: string | undefined;
56
57
  readonly phoneAgentSmoke?: string | undefined;
@@ -101,6 +102,13 @@ export declare const useVoiceReadinessFailures: (path?: string, options?: VoiceR
101
102
  readonly sessionId: string;
102
103
  readonly status: import("..").VoiceProductionReadinessStatus;
103
104
  }[];
105
+ readonly mediaQuality: readonly {
106
+ readonly detail?: string | undefined;
107
+ readonly href: string;
108
+ readonly label: string;
109
+ readonly sessionId: string;
110
+ readonly status: import("..").VoiceProductionReadinessStatus;
111
+ }[];
104
112
  readonly providerErrors: readonly {
105
113
  readonly detail?: string | undefined;
106
114
  readonly href: string;
@@ -230,6 +238,17 @@ export declare const useVoiceReadinessFailures: (path?: string, options?: VoiceR
230
238
  readonly status: import("..").VoiceProductionReadinessStatus;
231
239
  readonly total: number;
232
240
  } | undefined;
241
+ readonly mediaPipeline?: {
242
+ readonly assistantAudioFrames: number;
243
+ readonly backpressureEvents: number;
244
+ readonly gapCount: number;
245
+ readonly inputAudioFrames: number;
246
+ readonly issues: number;
247
+ readonly jitterMs?: number | undefined;
248
+ readonly speechRatio: number;
249
+ readonly status: import("..").VoiceProductionReadinessStatus;
250
+ readonly timestampDriftMs?: number | undefined;
251
+ } | undefined;
233
252
  readonly opsActionHistory?: {
234
253
  readonly failed: number;
235
254
  readonly passed: number;
@@ -434,6 +453,7 @@ export declare const useVoiceReadinessFailures: (path?: string, options?: VoiceR
434
453
  readonly observabilityExportDeliveries?: string | undefined;
435
454
  readonly monitoring?: string | undefined;
436
455
  readonly monitoringNotifierDelivery?: string | undefined;
456
+ readonly mediaPipeline?: string | undefined;
437
457
  readonly opsActions?: string | undefined;
438
458
  readonly opsRecovery?: string | undefined;
439
459
  readonly phoneAgentSmoke?: string | undefined;
@@ -484,6 +504,13 @@ export declare const useVoiceReadinessFailures: (path?: string, options?: VoiceR
484
504
  readonly sessionId: string;
485
505
  readonly status: import("..").VoiceProductionReadinessStatus;
486
506
  }[];
507
+ readonly mediaQuality: readonly {
508
+ readonly detail?: string | undefined;
509
+ readonly href: string;
510
+ readonly label: string;
511
+ readonly sessionId: string;
512
+ readonly status: import("..").VoiceProductionReadinessStatus;
513
+ }[];
487
514
  readonly providerErrors: readonly {
488
515
  readonly detail?: string | undefined;
489
516
  readonly href: string;
@@ -613,6 +640,17 @@ export declare const useVoiceReadinessFailures: (path?: string, options?: VoiceR
613
640
  readonly status: import("..").VoiceProductionReadinessStatus;
614
641
  readonly total: number;
615
642
  } | undefined;
643
+ readonly mediaPipeline?: {
644
+ readonly assistantAudioFrames: number;
645
+ readonly backpressureEvents: number;
646
+ readonly gapCount: number;
647
+ readonly inputAudioFrames: number;
648
+ readonly issues: number;
649
+ readonly jitterMs?: number | undefined;
650
+ readonly speechRatio: number;
651
+ readonly status: import("..").VoiceProductionReadinessStatus;
652
+ readonly timestampDriftMs?: number | undefined;
653
+ } | undefined;
616
654
  readonly opsActionHistory?: {
617
655
  readonly failed: number;
618
656
  readonly passed: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.315",
3
+ "version": "0.0.22-beta.317",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",