@absolutejs/voice 0.0.22-beta.250 → 0.0.22-beta.252

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/README.md CHANGED
@@ -1386,6 +1386,21 @@ app.use(
1386
1386
  );
1387
1387
  ```
1388
1388
 
1389
+ Use `evaluateVoiceProductionReadinessEvidence(...)` or `assertVoiceProductionReadinessEvidence(...)` when a proof pack should check the readiness JSON directly. This keeps release gates tied to structured evidence instead of route text:
1390
+
1391
+ ```ts
1392
+ const readiness = await buildVoiceProductionReadinessReport({
1393
+ store: runtime.traces,
1394
+ providerSlo,
1395
+ opsRecovery
1396
+ });
1397
+
1398
+ assertVoiceProductionReadinessEvidence(readiness, {
1399
+ requireStatus: 'pass',
1400
+ requiredChecks: ['Provider SLO gates', 'Session health', 'Turn quality']
1401
+ });
1402
+ ```
1403
+
1389
1404
  Built-in profiles:
1390
1405
 
1391
1406
  - `meeting-recorder`: live latency, session health, provider fallback, routing contracts, reconnect proof, and barge-in interruption proof.
@@ -2874,6 +2889,21 @@ console.log(voiceObservabilityExportSchemaId, voiceObservabilityExportSchemaVers
2874
2889
 
2875
2890
  Use `validateVoiceObservabilityExportRecord(...)` or `assertVoiceObservabilityExportRecord(...)` when reading customer-owned records back from SQLite, Postgres, S3, a webhook collector, a warehouse, or a SIEM. The validator accepts manifests, artifact indexes, delivery reports, delivery receipts, delivery histories, and database payload records, then checks the stable schema id/version plus the minimum shape required for safe ingestion.
2876
2891
 
2892
+ Use `evaluateVoicePlatformCoverage(...)` or `assertVoicePlatformCoverage(...)` when the product needs a structured "Vapi replacement surface coverage" gate. The assertion checks required buyer surfaces, evidence artifact names, total surface count, and failed-surface count:
2893
+
2894
+ ```ts
2895
+ const coverage = buildVoicePlatformCoverageSummary({
2896
+ coverage: latestProofPack.vapiCoverage,
2897
+ runId: latestProofPack.runId
2898
+ });
2899
+
2900
+ assertVoicePlatformCoverage(coverage, {
2901
+ minSurfaces: 12,
2902
+ requiredEvidence: ['productionReadiness', 'operationsRecord', 'providerSlo'],
2903
+ requiredSurfaces: ['Web voice assistant', 'Call logs and incident handoff']
2904
+ });
2905
+ ```
2906
+
2877
2907
  Use `replayVoiceObservabilityExport(...)` when you need to prove an already-delivered evidence bundle is still usable:
2878
2908
 
2879
2909
  ```ts
package/dist/index.d.ts CHANGED
@@ -14,8 +14,8 @@ export { buildVoiceDiagnosticsMarkdown, createVoiceDiagnosticsRoutes, resolveVoi
14
14
  export { buildVoiceDemoReadyReport, createVoiceDemoReadyRoutes, renderVoiceDemoReadyHTML } from './demoReadyRoutes';
15
15
  export { buildVoiceDeliverySinkReport, createVoiceDeliverySinkDescriptor, createVoiceDeliverySinkPair, createVoiceDeliverySinkRoutes, createVoiceFileDeliverySink, createVoicePostgresDeliverySink, createVoiceS3DeliverySink, createVoiceSQLiteDeliverySink, createVoiceWebhookDeliverySink, renderVoiceDeliverySinkHTML } from './deliverySinkRoutes';
16
16
  export { buildVoiceOpsActionHistoryReport, createVoiceOpsActionAuditRoutes, recordVoiceOpsActionAudit, renderVoiceOpsActionHistoryHTML } from './opsActionAuditRoutes';
17
- export { buildVoicePlatformCoverageSummary, createVoicePlatformCoverageRoutes } from './platformCoverage';
18
- export type { VoicePlatformCoverageEvidence, VoicePlatformCoverageRoutesOptions, VoicePlatformCoverageStatus, VoicePlatformCoverageSummary, VoicePlatformCoverageSummaryInput, VoicePlatformCoverageSurface } from './platformCoverage';
17
+ export { assertVoicePlatformCoverage, buildVoicePlatformCoverageSummary, createVoicePlatformCoverageRoutes, evaluateVoicePlatformCoverage } from './platformCoverage';
18
+ export type { VoicePlatformCoverageAssertionInput, VoicePlatformCoverageAssertionReport, VoicePlatformCoverageEvidence, VoicePlatformCoverageRoutesOptions, VoicePlatformCoverageStatus, VoicePlatformCoverageSummary, VoicePlatformCoverageSummaryInput, VoicePlatformCoverageSurface } from './platformCoverage';
19
19
  export { buildEmptyVoiceProofTrendReport, buildVoiceProofTrendReport, createVoiceProofTrendRoutes, DEFAULT_VOICE_PROOF_TRENDS_MAX_AGE_MS, formatVoiceProofTrendAge, normalizeVoiceProofTrendReport, readVoiceProofTrendReportFile } from './proofTrends';
20
20
  export type { VoiceProofTrendCycle, VoiceProofTrendReport, VoiceProofTrendReportInput, VoiceProofTrendRoutesOptions, VoiceProofTrendStatus, VoiceProofTrendSummary } from './proofTrends';
21
21
  export { buildVoiceLiveOpsControlState, createVoiceLiveOpsController, createVoiceLiveOpsRoutes, createVoiceMemoryLiveOpsControlStore, getVoiceLiveOpsControlStatus, VOICE_LIVE_OPS_ACTIONS } from './liveOps';
@@ -52,12 +52,12 @@ export { createVoiceProviderCapabilityHTMLHandler, createVoiceProviderCapability
52
52
  export { assertVoiceProviderRoutingContract, runVoiceProviderRoutingContract } from './providerRoutingContract';
53
53
  export { assertVoiceProviderSloEvidence, buildVoiceProviderSloReport, createVoiceProviderSloRoutes, evaluateVoiceProviderSloEvidence, renderVoiceProviderSloHTML, renderVoiceProviderSloMarkdown } from './providerSlo';
54
54
  export { createVoicePhoneAgentProductionSmokeHTMLHandler, createVoicePhoneAgentProductionSmokeJSONHandler, createVoicePhoneAgentProductionSmokeRoutes, renderVoicePhoneAgentProductionSmokeHTML, runVoicePhoneAgentProductionSmokeContract } from './phoneAgentProductionSmoke';
55
- export { buildVoiceProductionReadinessGate, buildVoiceProductionReadinessReport, createVoiceProductionReadinessRoutes, renderVoiceProductionReadinessHTML, summarizeVoiceProductionReadinessGate } from './productionReadiness';
55
+ export { assertVoiceProductionReadinessEvidence, buildVoiceProductionReadinessGate, buildVoiceProductionReadinessReport, createVoiceProductionReadinessRoutes, evaluateVoiceProductionReadinessEvidence, renderVoiceProductionReadinessHTML, summarizeVoiceProductionReadinessGate } from './productionReadiness';
56
56
  export { createVoiceReadinessProfile, recommendVoiceReadinessProfile } from './readinessProfiles';
57
57
  export { buildVoiceProviderContractMatrix, createVoiceProviderContractMatrixHTMLHandler, createVoiceProviderContractMatrixJSONHandler, createVoiceProviderContractMatrixPreset, createVoiceProviderContractMatrixRoutes, evaluateVoiceProviderStackGaps, renderVoiceProviderContractMatrixHTML, recommendVoiceProviderStack } from './providerStackRecommendations';
58
58
  export { buildVoiceOpsConsoleReport, createVoiceOpsConsoleRoutes, renderVoiceOpsConsoleHTML } from './opsConsoleRoutes';
59
59
  export { assertVoiceOperationsRecordGuardrails, buildVoiceOperationsRecord, createVoiceOperationsRecordRoutes, evaluateVoiceOperationsRecordGuardrails, renderVoiceOperationsRecordGuardrailMarkdown, renderVoiceOperationsRecordHTML, renderVoiceOperationsRecordIncidentMarkdown } from './operationsRecord';
60
- export { assertVoiceObservabilityExportRecord, buildVoiceObservabilityArtifactIndex, buildVoiceObservabilityExportDeliveryHistory, buildVoiceObservabilityExportReplayReport, buildVoiceObservabilityExport, assertVoiceObservabilityExportSchema, createVoiceObservabilityExportSchema, createVoiceFileObservabilityExportDeliveryReceiptStore, createVoiceMemoryObservabilityExportDeliveryReceiptStore, createVoiceObservabilityExportRoutes, createVoiceObservabilityExportReplayRoutes, deliverVoiceObservabilityExport, loadVoiceObservabilityExportReplaySource, replayVoiceObservabilityExport, renderVoiceObservabilityExportReplayHTML, renderVoiceObservabilityExportMarkdown, validateVoiceObservabilityExportRecord, voiceObservabilityExportSchemaId, voiceObservabilityExportSchemaVersion } from './observabilityExport';
60
+ export { assertVoiceObservabilityExportDeliveryEvidence, assertVoiceObservabilityExportRecord, assertVoiceObservabilityExportReplayEvidence, buildVoiceObservabilityArtifactIndex, buildVoiceObservabilityExportDeliveryHistory, buildVoiceObservabilityExportReplayReport, buildVoiceObservabilityExport, assertVoiceObservabilityExportSchema, createVoiceObservabilityExportSchema, createVoiceFileObservabilityExportDeliveryReceiptStore, createVoiceMemoryObservabilityExportDeliveryReceiptStore, createVoiceObservabilityExportRoutes, createVoiceObservabilityExportReplayRoutes, deliverVoiceObservabilityExport, evaluateVoiceObservabilityExportDeliveryEvidence, evaluateVoiceObservabilityExportReplayEvidence, loadVoiceObservabilityExportReplaySource, replayVoiceObservabilityExport, renderVoiceObservabilityExportReplayHTML, renderVoiceObservabilityExportMarkdown, validateVoiceObservabilityExportRecord, voiceObservabilityExportSchemaId, voiceObservabilityExportSchemaVersion } from './observabilityExport';
61
61
  export { buildVoiceOpsRecoveryReadinessCheck, buildVoiceOpsRecoveryReport, createVoiceOpsRecoveryRoutes, renderVoiceOpsRecoveryHTML, renderVoiceOpsRecoveryMarkdown } from './opsRecovery';
62
62
  export { buildVoiceIncidentBundle, createStoredVoiceIncidentBundleArtifact, createVoiceIncidentBundleRoutes, createVoiceMemoryIncidentBundleStore, pruneVoiceIncidentBundleArtifacts, saveVoiceIncidentBundleArtifact } from './incidentBundle';
63
63
  export { summarizeVoiceOpsStatus } from './opsStatus';
@@ -120,11 +120,11 @@ export type { VoicePhoneAgentCarrier, VoicePhoneAgentCarrierSummary, VoicePhoneA
120
120
  export type { VoicePhoneAgentProductionSmokeIssue, VoicePhoneAgentProductionSmokeHandlerOptions, VoicePhoneAgentProductionSmokeHTMLHandlerOptions, VoicePhoneAgentProductionSmokeOptions, VoicePhoneAgentProductionSmokeReport, VoicePhoneAgentProductionSmokeRoutesOptions, VoicePhoneAgentProductionSmokeRequirement } from './phoneAgentProductionSmoke';
121
121
  export type { VoiceOpsConsoleLink, VoiceOpsConsoleReport, VoiceOpsConsoleRoutesOptions } from './opsConsoleRoutes';
122
122
  export type { VoiceOpsStatus, VoiceOpsStatusLink, VoiceOpsStatusOptions, VoiceOpsStatusReport, VoiceOpsStatusRoutesOptions } from './opsStatus';
123
- export type { VoiceProductionReadinessAction, VoiceProductionReadinessAuditOptions, VoiceProductionReadinessAuditRequirement, VoiceProductionReadinessAuditSummary, VoiceProductionReadinessCheck, VoiceProductionReadinessGateIssue, VoiceProductionReadinessGateOptions, VoiceProductionReadinessGateProfile, VoiceProductionReadinessGateProfileSurface, VoiceProductionReadinessGateReport, VoiceProductionReadinessOpsActionHistoryOptions, VoiceProductionReadinessOpsActionHistorySummary, VoiceProductionReadinessOperationsRecordLink, VoiceProductionReadinessOperationsRecordLinks, VoiceProductionReadinessProfileExplanation, VoiceProductionReadinessProfileSurface, VoiceProductionReadinessProofSource, VoiceProductionReadinessReport, VoiceProductionReadinessRoutesOptions, VoiceProductionReadinessTraceDeliverySummary, VoiceProductionReadinessAuditDeliveryOptions, VoiceProductionReadinessAuditDeliverySummary, VoiceProductionReadinessTraceDeliveryOptions, VoiceProductionReadinessStatus } from './productionReadiness';
123
+ export type { VoiceProductionReadinessAction, VoiceProductionReadinessAuditOptions, VoiceProductionReadinessAuditRequirement, VoiceProductionReadinessAuditSummary, VoiceProductionReadinessAssertionInput, VoiceProductionReadinessAssertionReport, VoiceProductionReadinessCheck, VoiceProductionReadinessGateIssue, VoiceProductionReadinessGateOptions, VoiceProductionReadinessGateProfile, VoiceProductionReadinessGateProfileSurface, VoiceProductionReadinessGateReport, VoiceProductionReadinessOpsActionHistoryOptions, VoiceProductionReadinessOpsActionHistorySummary, VoiceProductionReadinessOperationsRecordLink, VoiceProductionReadinessOperationsRecordLinks, VoiceProductionReadinessProfileExplanation, VoiceProductionReadinessProfileSurface, VoiceProductionReadinessProofSource, VoiceProductionReadinessReport, VoiceProductionReadinessRoutesOptions, VoiceProductionReadinessTraceDeliverySummary, VoiceProductionReadinessAuditDeliveryOptions, VoiceProductionReadinessAuditDeliverySummary, VoiceProductionReadinessTraceDeliveryOptions, VoiceProductionReadinessStatus } from './productionReadiness';
124
124
  export type { VoiceReadinessProfileName, VoiceReadinessProfileOptions, VoiceReadinessProfileRecommendation, VoiceReadinessProfileRecommendationScore, VoiceReadinessProfileRoutesOptions } from './readinessProfiles';
125
125
  export type { VoiceProviderStackChoice, VoiceProviderStackCapabilities, VoiceProviderStackCapabilityGap, VoiceProviderStackCapabilityGapInput, VoiceProviderStackCapabilityGapReport, VoiceProviderContractCheck, VoiceProviderContractCheckStatus, VoiceProviderContractDefinition, VoiceProviderContractMatrixHandlerOptions, VoiceProviderContractMatrixHTMLHandlerOptions, VoiceProviderContractMatrixInput, VoiceProviderContractMatrixPresetOptions, VoiceProviderContractMatrixReport, VoiceProviderContractMatrixRoutesOptions, VoiceProviderContractMatrixRow, VoiceProviderStackInput, VoiceProviderStackKind, VoiceProviderStackRecommendation } from './providerStackRecommendations';
126
126
  export type { VoiceOperationsRecord, VoiceOperationsRecordAgentHandoff, VoiceOperationsRecordAuditSummary, VoiceOperationsRecordGuardrailAssertionInput, VoiceOperationsRecordGuardrailAssertionReport, VoiceOperationsRecordGuardrailDecision, VoiceOperationsRecordGuardrailFinding, VoiceOperationsRecordGuardrailSummary, VoiceOperationsRecordIntegrationEventSummary, VoiceOperationsRecordOptions, VoiceOperationsRecordOutcome, VoiceOperationsRecordProviderDecision, VoiceOperationsRecordReviewSummary, VoiceOperationsRecordRoutesOptions, VoiceOperationsRecordStatus, VoiceOperationsRecordTaskSummary, VoiceOperationsRecordTranscriptTurn, VoiceOperationsRecordTool } from './operationsRecord';
127
- export type { VoiceObservabilityExportArtifact, VoiceObservabilityExportArtifactChecksum, VoiceObservabilityExportArtifactFreshness, VoiceObservabilityExportArtifactIndex, VoiceObservabilityExportArtifactIndexItem, VoiceObservabilityExportArtifactKind, VoiceObservabilityExportDeliverySummary, VoiceObservabilityExportDeliveryDestination, VoiceObservabilityExportDeliveryDestinationResult, VoiceObservabilityExportDeliveryHistory, VoiceObservabilityExportDeliveryOptions, VoiceObservabilityExportDeliveryReceipt, VoiceObservabilityExportDeliveryReceiptStore, VoiceObservabilityExportDeliveryReport, VoiceObservabilityExportEnvelope, VoiceObservabilityExportIssue, VoiceObservabilityExportIssueCode, VoiceObservabilityExportOptions, VoiceObservabilityExportIngestedRecordKind, VoiceObservabilityExportRedactionSummary, VoiceObservabilityExportRecordValidationOptions, VoiceObservabilityExportReplayIssue, VoiceObservabilityExportReplayIssueCode, VoiceObservabilityExportReplayRecords, VoiceObservabilityExportReplayReport, VoiceObservabilityExportReplayRoutesOptions, VoiceObservabilityExportReplaySource, VoiceObservabilityExportReport, VoiceObservabilityExportRoutesOptions, VoiceObservabilityExportSchema, VoiceObservabilityExportStatus, VoiceObservabilityExportValidationIssue, VoiceObservabilityExportValidationResult } from './observabilityExport';
127
+ export type { VoiceObservabilityExportArtifact, VoiceObservabilityExportArtifactChecksum, VoiceObservabilityExportArtifactFreshness, VoiceObservabilityExportArtifactIndex, VoiceObservabilityExportArtifactIndexItem, VoiceObservabilityExportArtifactKind, VoiceObservabilityExportDeliveryAssertionInput, VoiceObservabilityExportDeliveryAssertionReport, VoiceObservabilityExportDeliverySummary, VoiceObservabilityExportDeliveryDestination, VoiceObservabilityExportDeliveryDestinationResult, VoiceObservabilityExportDeliveryHistory, VoiceObservabilityExportDeliveryOptions, VoiceObservabilityExportDeliveryReceipt, VoiceObservabilityExportDeliveryReceiptStore, VoiceObservabilityExportDeliveryReport, VoiceObservabilityExportEnvelope, VoiceObservabilityExportIssue, VoiceObservabilityExportIssueCode, VoiceObservabilityExportOptions, VoiceObservabilityExportIngestedRecordKind, VoiceObservabilityExportRedactionSummary, VoiceObservabilityExportRecordValidationOptions, VoiceObservabilityExportReplayIssue, VoiceObservabilityExportReplayIssueCode, VoiceObservabilityExportReplayAssertionInput, VoiceObservabilityExportReplayAssertionReport, VoiceObservabilityExportReplayRecords, VoiceObservabilityExportReplayReport, VoiceObservabilityExportReplayRoutesOptions, VoiceObservabilityExportReplaySource, VoiceObservabilityExportReport, VoiceObservabilityExportRoutesOptions, VoiceObservabilityExportSchema, VoiceObservabilityExportStatus, VoiceObservabilityExportValidationIssue, VoiceObservabilityExportValidationResult } from './observabilityExport';
128
128
  export type { VoiceOpsRecoveryFailedSession, VoiceOpsRecoveryInterventionSummary, VoiceOpsRecoveryIssue, VoiceOpsRecoveryIssueCode, VoiceOpsRecoveryLinks, VoiceOpsRecoveryProviderSummary, VoiceOpsRecoveryReport, VoiceOpsRecoveryReportOptions, VoiceOpsRecoveryRoutesOptions, VoiceOpsRecoveryStatus } from './opsRecovery';
129
129
  export type { StoredVoiceIncidentBundleArtifact, VoiceIncidentBundle, VoiceIncidentBundleArtifactOptions, VoiceIncidentBundleFormat, VoiceIncidentBundleOptions, VoiceIncidentBundleRetentionOptions, VoiceIncidentBundleRetentionReport, VoiceIncidentBundleRoutesOptions, VoiceIncidentBundleStore, VoiceIncidentBundleStoreFilter, VoiceIncidentBundleSummary } from './incidentBundle';
130
130
  export type { VoiceQualityLink, VoiceQualityMetric, VoiceQualityReport, VoiceQualityRoutesOptions, VoiceQualityStatus, VoiceQualityThresholds } from './qualityRoutes';
package/dist/index.js CHANGED
@@ -12277,6 +12277,48 @@ var buildVoicePlatformCoverageSummary = (input) => {
12277
12277
  total: coverage.length
12278
12278
  };
12279
12279
  };
12280
+ var evaluateVoicePlatformCoverage = (summary, input = {}) => {
12281
+ const issues = [];
12282
+ const surfaces = summary.coverage.map((surface) => surface.surface).sort();
12283
+ const failed = summary.coverage.filter((surface) => surface.status !== "pass").length;
12284
+ const missing = summary.coverage.reduce((total, surface) => total + (surface.missing ?? 0), 0);
12285
+ const evidenceNames = new Set(summary.coverage.flatMap((surface) => surface.evidence.map((evidence) => evidence.name)));
12286
+ if ((input.requirePass ?? true) && !summary.ok) {
12287
+ issues.push(`Expected platform coverage to pass, found ${summary.status}.`);
12288
+ }
12289
+ if (input.minSurfaces !== undefined && summary.total < input.minSurfaces) {
12290
+ issues.push(`Expected at least ${String(input.minSurfaces)} platform coverage surfaces, found ${String(summary.total)}.`);
12291
+ }
12292
+ if (input.maxFailedSurfaces !== undefined && failed > input.maxFailedSurfaces) {
12293
+ issues.push(`Expected at most ${String(input.maxFailedSurfaces)} failing platform coverage surfaces, found ${String(failed)}.`);
12294
+ }
12295
+ for (const surface of input.requiredSurfaces ?? []) {
12296
+ if (!surfaces.includes(surface)) {
12297
+ issues.push(`Missing platform coverage surface: ${surface}.`);
12298
+ }
12299
+ }
12300
+ for (const evidence of input.requiredEvidence ?? []) {
12301
+ if (!evidenceNames.has(evidence)) {
12302
+ issues.push(`Missing platform coverage evidence: ${evidence}.`);
12303
+ }
12304
+ }
12305
+ return {
12306
+ failed,
12307
+ issues,
12308
+ missing,
12309
+ ok: issues.length === 0,
12310
+ status: summary.status,
12311
+ surfaces,
12312
+ total: summary.total
12313
+ };
12314
+ };
12315
+ var assertVoicePlatformCoverage = (summary, input = {}) => {
12316
+ const report = evaluateVoicePlatformCoverage(summary, input);
12317
+ if (!report.ok) {
12318
+ throw new Error(`Voice platform coverage assertion failed: ${report.issues.join(" ")}`);
12319
+ }
12320
+ return report;
12321
+ };
12280
12322
  var normalizeCoverageSummary = (value) => ("status" in value) && ("total" in value) && ("coverage" in value) ? value : buildVoicePlatformCoverageSummary(value);
12281
12323
  var createVoicePlatformCoverageRoutes = (options) => {
12282
12324
  const path = options.path ?? "/api/voice/platform-coverage";
@@ -23809,6 +23851,62 @@ var buildVoiceObservabilityExportReplayReport = (records) => {
23809
23851
  }
23810
23852
  };
23811
23853
  };
23854
+ var evaluateVoiceObservabilityExportReplayEvidence = (report, input = {}) => {
23855
+ const issues = [];
23856
+ const requiredStatus = input.requireStatus ?? "pass";
23857
+ const maxIssues = input.maxIssues ?? 0;
23858
+ const maxValidationIssues = input.maxValidationIssues ?? 0;
23859
+ const maxFailedArtifacts = input.maxFailedArtifacts ?? 0;
23860
+ const maxFailedDeliveryDestinations = input.maxFailedDeliveryDestinations ?? 0;
23861
+ const minArtifacts = input.minArtifacts ?? 1;
23862
+ const minDeliveryDestinations = input.minDeliveryDestinations;
23863
+ const recordKinds = Object.values(report.records).map((record) => record?.kind).filter((kind) => Boolean(kind)).sort();
23864
+ if (report.status !== requiredStatus) {
23865
+ issues.push(`Expected observability export replay status ${requiredStatus}, found ${report.status}.`);
23866
+ }
23867
+ if (report.issues.length > maxIssues) {
23868
+ issues.push(`Expected at most ${String(maxIssues)} observability export replay issue(s), found ${String(report.issues.length)}.`);
23869
+ }
23870
+ if (report.summary.validationIssues > maxValidationIssues) {
23871
+ issues.push(`Expected at most ${String(maxValidationIssues)} observability export replay validation issue(s), found ${String(report.summary.validationIssues)}.`);
23872
+ }
23873
+ if (report.summary.failedArtifacts > maxFailedArtifacts) {
23874
+ issues.push(`Expected at most ${String(maxFailedArtifacts)} failed observability export artifact(s), found ${String(report.summary.failedArtifacts)}.`);
23875
+ }
23876
+ if (report.summary.failedDeliveryDestinations > maxFailedDeliveryDestinations) {
23877
+ issues.push(`Expected at most ${String(maxFailedDeliveryDestinations)} failed observability export delivery destination(s), found ${String(report.summary.failedDeliveryDestinations)}.`);
23878
+ }
23879
+ if (report.summary.artifacts < minArtifacts) {
23880
+ issues.push(`Expected at least ${String(minArtifacts)} replayed observability export artifact(s), found ${String(report.summary.artifacts)}.`);
23881
+ }
23882
+ if (minDeliveryDestinations !== undefined && report.summary.deliveryDestinations < minDeliveryDestinations) {
23883
+ issues.push(`Expected at least ${String(minDeliveryDestinations)} replayed observability export delivery destination(s), found ${String(report.summary.deliveryDestinations)}.`);
23884
+ }
23885
+ for (const recordKind of input.requiredRecordKinds ?? []) {
23886
+ if (!recordKinds.includes(recordKind)) {
23887
+ issues.push(`Missing observability export replay record kind: ${recordKind}.`);
23888
+ }
23889
+ }
23890
+ return {
23891
+ artifacts: report.summary.artifacts,
23892
+ deliveryDestinations: report.summary.deliveryDestinations,
23893
+ failedArtifacts: report.summary.failedArtifacts,
23894
+ failedDeliveryDestinations: report.summary.failedDeliveryDestinations,
23895
+ issues,
23896
+ ok: issues.length === 0,
23897
+ recordKinds,
23898
+ replayIssues: report.issues.length,
23899
+ status: report.status,
23900
+ validationIssues: report.summary.validationIssues
23901
+ };
23902
+ };
23903
+ var assertVoiceObservabilityExportReplayEvidence = (report, input = {}) => {
23904
+ const assertion = evaluateVoiceObservabilityExportReplayEvidence(report, input);
23905
+ if (!assertion.ok) {
23906
+ throw new Error(`Voice observability export replay assertion failed: ${assertion.issues.join(" ")}`);
23907
+ }
23908
+ return assertion;
23909
+ };
23812
23910
  var loadVoiceObservabilityExportReplaySource = async (source) => {
23813
23911
  if (source.kind === "records") {
23814
23912
  return source;
@@ -24079,6 +24177,89 @@ var buildVoiceObservabilityExportDeliveryHistory = async (store) => {
24079
24177
  }
24080
24178
  };
24081
24179
  };
24180
+ var getSuccessfulObservabilityExportReceipts = (history) => history.receipts.filter((receipt) => receipt.status === "pass" && receipt.exportStatus === "pass" && receipt.summary.delivered > 0 && receipt.summary.failed === 0);
24181
+ var getLatestSuccessfulObservabilityExportReceipt = (history) => getSuccessfulObservabilityExportReceipts(history).sort((left, right) => right.checkedAt - left.checkedAt)[0];
24182
+ var evaluateVoiceObservabilityExportDeliveryEvidence = (history, input = {}) => {
24183
+ const issues = [];
24184
+ const requiredStatus = input.requireStatus ?? "pass";
24185
+ const maxFailed = input.maxFailed ?? 0;
24186
+ const maxFailedReceipts = input.maxFailedReceipts ?? 0;
24187
+ const maxFailedExportReceipts = input.maxFailedExportReceipts ?? 0;
24188
+ const minDelivered = input.minDelivered ?? 1;
24189
+ const minReceipts = input.minReceipts ?? 1;
24190
+ const minTotalDestinations = input.minTotalDestinations ?? 1;
24191
+ const now = input.now ?? Date.now();
24192
+ const failedReceipts = history.receipts.filter((receipt) => receipt.status === "fail").length;
24193
+ const failedExportReceipts = history.receipts.filter((receipt) => receipt.exportStatus === "fail").length;
24194
+ const latestSuccess = getLatestSuccessfulObservabilityExportReceipt(history);
24195
+ const latestSuccessAgeMs = latestSuccess ? Math.max(0, now - latestSuccess.checkedAt) : undefined;
24196
+ const destinations = history.receipts.flatMap((receipt) => receipt.destinations);
24197
+ const destinationIds = [
24198
+ ...new Set(destinations.map((destination) => destination.destinationId))
24199
+ ].sort();
24200
+ const destinationKinds = [
24201
+ ...new Set(destinations.map((destination) => destination.destinationKind))
24202
+ ].sort();
24203
+ if (history.status !== requiredStatus) {
24204
+ issues.push(`Expected observability export delivery status ${requiredStatus}, found ${history.status}.`);
24205
+ }
24206
+ if (history.summary.failed > maxFailed) {
24207
+ issues.push(`Expected at most ${String(maxFailed)} failed observability export delivery destination(s), found ${String(history.summary.failed)}.`);
24208
+ }
24209
+ if (failedReceipts > maxFailedReceipts) {
24210
+ issues.push(`Expected at most ${String(maxFailedReceipts)} failed observability export delivery receipt(s), found ${String(failedReceipts)}.`);
24211
+ }
24212
+ if (failedExportReceipts > maxFailedExportReceipts) {
24213
+ issues.push(`Expected at most ${String(maxFailedExportReceipts)} failed observability export receipt manifest(s), found ${String(failedExportReceipts)}.`);
24214
+ }
24215
+ if (history.summary.delivered < minDelivered) {
24216
+ issues.push(`Expected at least ${String(minDelivered)} delivered observability export destination(s), found ${String(history.summary.delivered)}.`);
24217
+ }
24218
+ if (history.summary.receipts < minReceipts) {
24219
+ issues.push(`Expected at least ${String(minReceipts)} observability export delivery receipt(s), found ${String(history.summary.receipts)}.`);
24220
+ }
24221
+ if (history.summary.totalDestinations < minTotalDestinations) {
24222
+ issues.push(`Expected at least ${String(minTotalDestinations)} observability export destination(s), found ${String(history.summary.totalDestinations)}.`);
24223
+ }
24224
+ if (input.maxLatestSuccessAgeMs !== undefined) {
24225
+ if (latestSuccessAgeMs === undefined) {
24226
+ issues.push("Missing successful observability export delivery receipt.");
24227
+ } else if (latestSuccessAgeMs > input.maxLatestSuccessAgeMs) {
24228
+ issues.push(`Expected latest successful observability export delivery age at most ${String(input.maxLatestSuccessAgeMs)}ms, found ${String(latestSuccessAgeMs)}ms.`);
24229
+ }
24230
+ }
24231
+ for (const destinationId of input.requiredDestinationIds ?? []) {
24232
+ if (!destinationIds.includes(destinationId)) {
24233
+ issues.push(`Missing observability export delivery destination: ${destinationId}.`);
24234
+ }
24235
+ }
24236
+ for (const destinationKind of input.requiredDestinationKinds ?? []) {
24237
+ if (!destinationKinds.includes(destinationKind)) {
24238
+ issues.push(`Missing observability export delivery destination kind: ${destinationKind}.`);
24239
+ }
24240
+ }
24241
+ return {
24242
+ delivered: history.summary.delivered,
24243
+ destinationIds,
24244
+ destinationKinds,
24245
+ failed: history.summary.failed,
24246
+ failedExportReceipts,
24247
+ failedReceipts,
24248
+ issues,
24249
+ latestSuccessAgeMs,
24250
+ ok: issues.length === 0,
24251
+ receipts: history.summary.receipts,
24252
+ status: history.status,
24253
+ totalDestinations: history.summary.totalDestinations
24254
+ };
24255
+ };
24256
+ var assertVoiceObservabilityExportDeliveryEvidence = (history, input = {}) => {
24257
+ const assertion = evaluateVoiceObservabilityExportDeliveryEvidence(history, input);
24258
+ if (!assertion.ok) {
24259
+ throw new Error(`Voice observability export delivery assertion failed: ${assertion.issues.join(" ")}`);
24260
+ }
24261
+ return assertion;
24262
+ };
24082
24263
  var inferContentType = (artifact) => {
24083
24264
  if (artifact.contentType) {
24084
24265
  return artifact.contentType;
@@ -24776,6 +24957,48 @@ var summarizeVoiceProductionReadinessGate = (report, options = {}) => {
24776
24957
  warnings
24777
24958
  };
24778
24959
  };
24960
+ var evaluateVoiceProductionReadinessEvidence = (report, input = {}) => {
24961
+ const gate = summarizeVoiceProductionReadinessGate(report);
24962
+ const issues = [];
24963
+ const checks = report.checks.map((check) => check.label).sort();
24964
+ const requiredStatus = input.requireStatus ?? "pass";
24965
+ const requireGateOk = input.requireGateOk ?? true;
24966
+ const maxFailures = input.maxFailures ?? 0;
24967
+ const maxWarnings = input.maxWarnings;
24968
+ if (report.status !== requiredStatus) {
24969
+ issues.push(`Expected production readiness status ${requiredStatus}, found ${report.status}.`);
24970
+ }
24971
+ if (requireGateOk && !gate.ok) {
24972
+ issues.push(`Expected production readiness gate to pass, found ${gate.status}.`);
24973
+ }
24974
+ if (gate.failures.length > maxFailures) {
24975
+ issues.push(`Expected at most ${String(maxFailures)} production readiness failures, found ${String(gate.failures.length)}.`);
24976
+ }
24977
+ if (maxWarnings !== undefined && gate.warnings.length > maxWarnings) {
24978
+ issues.push(`Expected at most ${String(maxWarnings)} production readiness warnings, found ${String(gate.warnings.length)}.`);
24979
+ }
24980
+ for (const check of input.requiredChecks ?? []) {
24981
+ if (!checks.includes(check)) {
24982
+ issues.push(`Missing production readiness check: ${check}.`);
24983
+ }
24984
+ }
24985
+ return {
24986
+ checks,
24987
+ failures: gate.failures.length,
24988
+ gateOk: gate.ok,
24989
+ issues,
24990
+ ok: issues.length === 0,
24991
+ status: report.status,
24992
+ warnings: gate.warnings.length
24993
+ };
24994
+ };
24995
+ var assertVoiceProductionReadinessEvidence = (report, input = {}) => {
24996
+ const assertion = evaluateVoiceProductionReadinessEvidence(report, input);
24997
+ if (!assertion.ok) {
24998
+ throw new Error(`Voice production readiness assertion failed: ${assertion.issues.join(" ")}`);
24999
+ }
25000
+ return assertion;
25001
+ };
24779
25002
  var carrierStatus = (matrix) => matrix.summary.failing > 0 ? "fail" : matrix.summary.warnings > 0 || matrix.summary.ready < matrix.summary.providers ? "warn" : "pass";
24780
25003
  var resolveCarriers = async (options, input) => {
24781
25004
  if (options.carriers === false || options.carriers === undefined) {
@@ -30074,7 +30297,11 @@ export {
30074
30297
  evaluateVoiceQuality,
30075
30298
  evaluateVoiceProviderStackGaps,
30076
30299
  evaluateVoiceProviderSloEvidence,
30300
+ evaluateVoiceProductionReadinessEvidence,
30301
+ evaluateVoicePlatformCoverage,
30077
30302
  evaluateVoiceOperationsRecordGuardrails,
30303
+ evaluateVoiceObservabilityExportReplayEvidence,
30304
+ evaluateVoiceObservabilityExportDeliveryEvidence,
30078
30305
  evaluateVoiceGuardrailPolicy,
30079
30306
  encodeTwilioMulawBase64,
30080
30307
  deliverVoiceTraceEventsToSinks,
@@ -30389,9 +30616,13 @@ export {
30389
30616
  assignVoiceOpsTask,
30390
30617
  assertVoiceProviderSloEvidence,
30391
30618
  assertVoiceProviderRoutingContract,
30619
+ assertVoiceProductionReadinessEvidence,
30620
+ assertVoicePlatformCoverage,
30392
30621
  assertVoiceOperationsRecordGuardrails,
30393
30622
  assertVoiceObservabilityExportSchema,
30623
+ assertVoiceObservabilityExportReplayEvidence,
30394
30624
  assertVoiceObservabilityExportRecord,
30625
+ assertVoiceObservabilityExportDeliveryEvidence,
30395
30626
  assertVoiceLatencySLOGate,
30396
30627
  assertVoiceAgentSquadContract,
30397
30628
  applyVoiceTelephonyOutcome,
@@ -269,6 +269,55 @@ export type VoiceObservabilityExportReplayReport = {
269
269
  validationIssues: number;
270
270
  };
271
271
  };
272
+ export type VoiceObservabilityExportDeliveryAssertionInput = {
273
+ maxFailed?: number;
274
+ maxFailedExportReceipts?: number;
275
+ maxFailedReceipts?: number;
276
+ maxLatestSuccessAgeMs?: number;
277
+ minDelivered?: number;
278
+ minReceipts?: number;
279
+ minTotalDestinations?: number;
280
+ now?: number;
281
+ requireStatus?: VoiceObservabilityExportStatus;
282
+ requiredDestinationIds?: string[];
283
+ requiredDestinationKinds?: VoiceObservabilityExportDeliveryDestination['kind'][];
284
+ };
285
+ export type VoiceObservabilityExportDeliveryAssertionReport = {
286
+ delivered: number;
287
+ destinationIds: string[];
288
+ destinationKinds: VoiceObservabilityExportDeliveryDestination['kind'][];
289
+ failed: number;
290
+ failedExportReceipts: number;
291
+ failedReceipts: number;
292
+ issues: string[];
293
+ latestSuccessAgeMs?: number;
294
+ ok: boolean;
295
+ receipts: number;
296
+ status: VoiceObservabilityExportStatus;
297
+ totalDestinations: number;
298
+ };
299
+ export type VoiceObservabilityExportReplayAssertionInput = {
300
+ maxFailedArtifacts?: number;
301
+ maxFailedDeliveryDestinations?: number;
302
+ maxIssues?: number;
303
+ maxValidationIssues?: number;
304
+ minArtifacts?: number;
305
+ minDeliveryDestinations?: number;
306
+ requireStatus?: VoiceObservabilityExportStatus;
307
+ requiredRecordKinds?: VoiceObservabilityExportIngestedRecordKind[];
308
+ };
309
+ export type VoiceObservabilityExportReplayAssertionReport = {
310
+ artifacts: number;
311
+ deliveryDestinations: number;
312
+ failedArtifacts: number;
313
+ failedDeliveryDestinations: number;
314
+ issues: string[];
315
+ ok: boolean;
316
+ recordKinds: VoiceObservabilityExportIngestedRecordKind[];
317
+ replayIssues: number;
318
+ status: VoiceObservabilityExportStatus;
319
+ validationIssues: number;
320
+ };
272
321
  export type VoiceObservabilityExportReplaySource = {
273
322
  artifactIndex?: unknown;
274
323
  databaseRecord?: unknown;
@@ -354,6 +403,8 @@ export type VoiceObservabilityExportRoutesOptions = VoiceObservabilityExportOpti
354
403
  title?: string;
355
404
  };
356
405
  export declare const buildVoiceObservabilityExportReplayReport: (records: VoiceObservabilityExportReplayRecords) => VoiceObservabilityExportReplayReport;
406
+ export declare const evaluateVoiceObservabilityExportReplayEvidence: (report: VoiceObservabilityExportReplayReport, input?: VoiceObservabilityExportReplayAssertionInput) => VoiceObservabilityExportReplayAssertionReport;
407
+ export declare const assertVoiceObservabilityExportReplayEvidence: (report: VoiceObservabilityExportReplayReport, input?: VoiceObservabilityExportReplayAssertionInput) => VoiceObservabilityExportReplayAssertionReport;
357
408
  export declare const loadVoiceObservabilityExportReplaySource: (source: VoiceObservabilityExportReplaySource) => Promise<VoiceObservabilityExportReplayRecords>;
358
409
  export declare const replayVoiceObservabilityExport: (source: VoiceObservabilityExportReplaySource) => Promise<VoiceObservabilityExportReplayReport>;
359
410
  export declare const renderVoiceObservabilityExportReplayHTML: (report: VoiceObservabilityExportReplayReport, options?: {
@@ -392,6 +443,8 @@ export declare const createVoiceFileObservabilityExportDeliveryReceiptStore: (op
392
443
  directory: string;
393
444
  }) => VoiceObservabilityExportDeliveryReceiptStore;
394
445
  export declare const buildVoiceObservabilityExportDeliveryHistory: (store: VoiceObservabilityExportDeliveryReceiptStore) => Promise<VoiceObservabilityExportDeliveryHistory>;
446
+ export declare const evaluateVoiceObservabilityExportDeliveryEvidence: (history: VoiceObservabilityExportDeliveryHistory, input?: VoiceObservabilityExportDeliveryAssertionInput) => VoiceObservabilityExportDeliveryAssertionReport;
447
+ export declare const assertVoiceObservabilityExportDeliveryEvidence: (history: VoiceObservabilityExportDeliveryHistory, input?: VoiceObservabilityExportDeliveryAssertionInput) => VoiceObservabilityExportDeliveryAssertionReport;
395
448
  export declare const buildVoiceObservabilityExport: (options?: VoiceObservabilityExportOptions) => Promise<VoiceObservabilityExportReport>;
396
449
  export declare const renderVoiceObservabilityExportMarkdown: (report: VoiceObservabilityExportReport, options?: {
397
450
  title?: string;
@@ -42,7 +42,25 @@ export type VoicePlatformCoverageRoutesOptions = {
42
42
  path?: string;
43
43
  source: (() => Promise<VoicePlatformCoverageSummary | VoicePlatformCoverageSummaryInput> | VoicePlatformCoverageSummary | VoicePlatformCoverageSummaryInput) | VoicePlatformCoverageSummary | VoicePlatformCoverageSummaryInput;
44
44
  };
45
+ export type VoicePlatformCoverageAssertionInput = {
46
+ maxFailedSurfaces?: number;
47
+ minSurfaces?: number;
48
+ requiredEvidence?: string[];
49
+ requiredSurfaces?: string[];
50
+ requirePass?: boolean;
51
+ };
52
+ export type VoicePlatformCoverageAssertionReport = {
53
+ failed: number;
54
+ issues: string[];
55
+ missing: number;
56
+ ok: boolean;
57
+ status: VoicePlatformCoverageStatus;
58
+ surfaces: string[];
59
+ total: number;
60
+ };
45
61
  export declare const buildVoicePlatformCoverageSummary: (input: VoicePlatformCoverageSummaryInput) => VoicePlatformCoverageSummary;
62
+ export declare const evaluateVoicePlatformCoverage: (summary: VoicePlatformCoverageSummary, input?: VoicePlatformCoverageAssertionInput) => VoicePlatformCoverageAssertionReport;
63
+ export declare const assertVoicePlatformCoverage: (summary: VoicePlatformCoverageSummary, input?: VoicePlatformCoverageAssertionInput) => VoicePlatformCoverageAssertionReport;
46
64
  export declare const createVoicePlatformCoverageRoutes: (options: VoicePlatformCoverageRoutesOptions) => Elysia<"", {
47
65
  decorator: {};
48
66
  store: {};
@@ -58,6 +58,22 @@ export type VoiceProductionReadinessGateReport = {
58
58
  status: VoiceProductionReadinessStatus;
59
59
  warnings: VoiceProductionReadinessGateIssue[];
60
60
  };
61
+ export type VoiceProductionReadinessAssertionInput = {
62
+ maxFailures?: number;
63
+ maxWarnings?: number;
64
+ requiredChecks?: string[];
65
+ requireGateOk?: boolean;
66
+ requireStatus?: VoiceProductionReadinessStatus;
67
+ };
68
+ export type VoiceProductionReadinessAssertionReport = {
69
+ checks: string[];
70
+ failures: number;
71
+ gateOk: boolean;
72
+ issues: string[];
73
+ ok: boolean;
74
+ status: VoiceProductionReadinessStatus;
75
+ warnings: number;
76
+ };
61
77
  export type VoiceProductionReadinessProofSource = {
62
78
  detail?: string;
63
79
  href?: string;
@@ -425,6 +441,8 @@ export type VoiceProductionReadinessRoutesOptions = {
425
441
  liveLatencyFailAfterMs?: number;
426
442
  };
427
443
  export declare const summarizeVoiceProductionReadinessGate: (report: VoiceProductionReadinessReport, options?: VoiceProductionReadinessGateOptions) => VoiceProductionReadinessGateReport;
444
+ export declare const evaluateVoiceProductionReadinessEvidence: (report: VoiceProductionReadinessReport, input?: VoiceProductionReadinessAssertionInput) => VoiceProductionReadinessAssertionReport;
445
+ export declare const assertVoiceProductionReadinessEvidence: (report: VoiceProductionReadinessReport, input?: VoiceProductionReadinessAssertionInput) => VoiceProductionReadinessAssertionReport;
428
446
  export declare const buildVoiceProductionReadinessReport: (options: VoiceProductionReadinessRoutesOptions, input?: {
429
447
  query?: Record<string, unknown>;
430
448
  request?: Request;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.250",
3
+ "version": "0.0.22-beta.252",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",