@absolutejs/voice 0.0.22-beta.233 → 0.0.22-beta.235

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
@@ -2796,7 +2796,8 @@ Replay sources support supplied records plus file, S3, SQLite, and Postgres deli
2796
2796
  import {
2797
2797
  buildVoiceObservabilityExport,
2798
2798
  createVoiceFileObservabilityExportDeliveryReceiptStore,
2799
- createVoiceObservabilityExportRoutes
2799
+ createVoiceObservabilityExportRoutes,
2800
+ createVoiceObservabilityExportReplayRoutes
2800
2801
  } from '@absolutejs/voice';
2801
2802
 
2802
2803
  const observabilityReceipts =
@@ -2856,6 +2857,17 @@ app.use(
2856
2857
  })
2857
2858
  );
2858
2859
 
2860
+ app.use(
2861
+ createVoiceObservabilityExportReplayRoutes({
2862
+ source: async () => ({
2863
+ kind: 'sqlite',
2864
+ path: '.voice-runtime/observability-exports.sqlite',
2865
+ runId: 'latest-proof-pack',
2866
+ tableName: 'voice_observability_exports'
2867
+ })
2868
+ })
2869
+ );
2870
+
2859
2871
  const exportReport = await buildVoiceObservabilityExport({
2860
2872
  artifactIntegrity: {
2861
2873
  maxAgeMs: 15 * 60 * 1000
@@ -2871,7 +2883,7 @@ const exportReport = await buildVoiceObservabilityExport({
2871
2883
  });
2872
2884
  ```
2873
2885
 
2874
- The route helper exposes JSON at `/api/voice/observability-export`, an artifact index at `/api/voice/observability-export/artifacts`, per-artifact downloads at `/api/voice/observability-export/artifacts/:artifactId`, delivery at `POST /api/voice/observability-export/deliveries`, delivery history at `GET /api/voice/observability-export/deliveries`, Markdown at `/voice/observability-export.md`, and HTML at `/voice/observability-export`. Path-backed artifacts are hashed with SHA-256 by default, include byte size and freshness metadata, and can fail the export when required evidence is missing or stale. File delivery writes `manifest.json`, `artifact-index.json`, and artifact files into a customer-owned archive directory; webhook delivery posts the manifest and artifact index to a buyer-owned collector, SIEM bridge, or warehouse endpoint; S3 delivery writes the same manifest, index, and artifact files through Bun's native S3 client; SQLite and Postgres delivery persist the schema id/version, manifest, artifact index, checksum metadata, status, run id, and timestamps into buyer-owned database tables. Delivery receipt stores persist run id, destinations, status, schema, and target history so operators can prove exports have been continuously healthy. Failed trace/audit deliveries fail the export report, pending deliveries warn, and every trace/audit envelope includes the linked operations-record URL when one is configured. This is the primitive to use when customers ask how voice evidence leaves the app without going through a hosted vendor dashboard.
2886
+ The route helper exposes JSON at `/api/voice/observability-export`, an artifact index at `/api/voice/observability-export/artifacts`, per-artifact downloads at `/api/voice/observability-export/artifacts/:artifactId`, delivery at `POST /api/voice/observability-export/deliveries`, delivery history at `GET /api/voice/observability-export/deliveries`, Markdown at `/voice/observability-export.md`, and HTML at `/voice/observability-export`. `createVoiceObservabilityExportReplayRoutes(...)` adds JSON replay proof at `/api/voice/observability-export/replay` and a readable replay proof page at `/voice/observability-export/replay`. Path-backed artifacts are hashed with SHA-256 by default, include byte size and freshness metadata, and can fail the export when required evidence is missing or stale. File delivery writes `manifest.json`, `artifact-index.json`, and artifact files into a customer-owned archive directory; webhook delivery posts the manifest and artifact index to a buyer-owned collector, SIEM bridge, or warehouse endpoint; S3 delivery writes the same manifest, index, and artifact files through Bun's native S3 client; SQLite and Postgres delivery persist the schema id/version, manifest, artifact index, checksum metadata, status, run id, and timestamps into buyer-owned database tables. Delivery receipt stores persist run id, destinations, status, schema, and target history so operators can prove exports have been continuously healthy. Failed trace/audit deliveries fail the export report, pending deliveries warn, and every trace/audit envelope includes the linked operations-record URL when one is configured. This is the primitive to use when customers ask how voice evidence leaves the app without going through a hosted vendor dashboard.
2875
2887
 
2876
2888
  Pass the same report into production readiness when export health should block deploys:
2877
2889
 
@@ -2895,12 +2907,18 @@ app.use(
2895
2907
  maxAgeMs: 60 * 60 * 1000,
2896
2908
  store: observabilityExportDeliveryReceipts
2897
2909
  },
2910
+ observabilityExportReplay: {
2911
+ kind: 'sqlite',
2912
+ path: '.voice-runtime/observability-exports.sqlite',
2913
+ runId: 'latest-proof-pack',
2914
+ tableName: 'voice_observability_exports'
2915
+ },
2898
2916
  store: runtimeStorage.traces
2899
2917
  })
2900
2918
  );
2901
2919
  ```
2902
2920
 
2903
- Readiness adds `Observability export` and `Observability export delivery` checks. Failed export manifests fail the deploy gate, and delivery receipt history can fail or warn when no successful delivery exists or the latest success is older than your configured freshness window.
2921
+ Readiness adds `Observability export`, `Observability export delivery`, and `Observability export replay` checks. Failed export manifests fail the deploy gate, delivery receipt history can fail or warn when no successful delivery exists or the latest success is older than your configured freshness window, and replay health can fail the gate when customer-owned evidence cannot be read back cleanly from file, S3, SQLite, or Postgres.
2904
2922
 
2905
2923
  ## Production Voice Ops
2906
2924
 
package/dist/index.d.ts CHANGED
@@ -53,7 +53,7 @@ export { createVoiceReadinessProfile, recommendVoiceReadinessProfile } from './r
53
53
  export { buildVoiceProviderContractMatrix, createVoiceProviderContractMatrixHTMLHandler, createVoiceProviderContractMatrixJSONHandler, createVoiceProviderContractMatrixPreset, createVoiceProviderContractMatrixRoutes, evaluateVoiceProviderStackGaps, renderVoiceProviderContractMatrixHTML, recommendVoiceProviderStack } from './providerStackRecommendations';
54
54
  export { buildVoiceOpsConsoleReport, createVoiceOpsConsoleRoutes, renderVoiceOpsConsoleHTML } from './opsConsoleRoutes';
55
55
  export { buildVoiceOperationsRecord, createVoiceOperationsRecordRoutes, renderVoiceOperationsRecordHTML, renderVoiceOperationsRecordIncidentMarkdown } from './operationsRecord';
56
- export { assertVoiceObservabilityExportRecord, buildVoiceObservabilityArtifactIndex, buildVoiceObservabilityExportDeliveryHistory, buildVoiceObservabilityExportReplayReport, buildVoiceObservabilityExport, assertVoiceObservabilityExportSchema, createVoiceObservabilityExportSchema, createVoiceFileObservabilityExportDeliveryReceiptStore, createVoiceMemoryObservabilityExportDeliveryReceiptStore, createVoiceObservabilityExportRoutes, deliverVoiceObservabilityExport, loadVoiceObservabilityExportReplaySource, replayVoiceObservabilityExport, renderVoiceObservabilityExportMarkdown, validateVoiceObservabilityExportRecord, voiceObservabilityExportSchemaId, voiceObservabilityExportSchemaVersion } from './observabilityExport';
56
+ export { assertVoiceObservabilityExportRecord, buildVoiceObservabilityArtifactIndex, buildVoiceObservabilityExportDeliveryHistory, buildVoiceObservabilityExportReplayReport, buildVoiceObservabilityExport, assertVoiceObservabilityExportSchema, createVoiceObservabilityExportSchema, createVoiceFileObservabilityExportDeliveryReceiptStore, createVoiceMemoryObservabilityExportDeliveryReceiptStore, createVoiceObservabilityExportRoutes, createVoiceObservabilityExportReplayRoutes, deliverVoiceObservabilityExport, loadVoiceObservabilityExportReplaySource, replayVoiceObservabilityExport, renderVoiceObservabilityExportReplayHTML, renderVoiceObservabilityExportMarkdown, validateVoiceObservabilityExportRecord, voiceObservabilityExportSchemaId, voiceObservabilityExportSchemaVersion } from './observabilityExport';
57
57
  export { buildVoiceOpsRecoveryReadinessCheck, buildVoiceOpsRecoveryReport, createVoiceOpsRecoveryRoutes, renderVoiceOpsRecoveryHTML, renderVoiceOpsRecoveryMarkdown } from './opsRecovery';
58
58
  export { buildVoiceIncidentBundle, createStoredVoiceIncidentBundleArtifact, createVoiceIncidentBundleRoutes, createVoiceMemoryIncidentBundleStore, pruneVoiceIncidentBundleArtifacts, saveVoiceIncidentBundleArtifact } from './incidentBundle';
59
59
  export { summarizeVoiceOpsStatus } from './opsStatus';
@@ -118,7 +118,7 @@ export type { VoiceProductionReadinessAction, VoiceProductionReadinessAuditOptio
118
118
  export type { VoiceReadinessProfileName, VoiceReadinessProfileOptions, VoiceReadinessProfileRecommendation, VoiceReadinessProfileRecommendationScore, VoiceReadinessProfileRoutesOptions } from './readinessProfiles';
119
119
  export type { VoiceProviderStackChoice, VoiceProviderStackCapabilities, VoiceProviderStackCapabilityGap, VoiceProviderStackCapabilityGapInput, VoiceProviderStackCapabilityGapReport, VoiceProviderContractCheck, VoiceProviderContractCheckStatus, VoiceProviderContractDefinition, VoiceProviderContractMatrixHandlerOptions, VoiceProviderContractMatrixHTMLHandlerOptions, VoiceProviderContractMatrixInput, VoiceProviderContractMatrixPresetOptions, VoiceProviderContractMatrixReport, VoiceProviderContractMatrixRoutesOptions, VoiceProviderContractMatrixRow, VoiceProviderStackInput, VoiceProviderStackKind, VoiceProviderStackRecommendation } from './providerStackRecommendations';
120
120
  export type { VoiceOperationsRecord, VoiceOperationsRecordAgentHandoff, VoiceOperationsRecordAuditSummary, VoiceOperationsRecordIntegrationEventSummary, VoiceOperationsRecordOptions, VoiceOperationsRecordOutcome, VoiceOperationsRecordProviderDecision, VoiceOperationsRecordReviewSummary, VoiceOperationsRecordRoutesOptions, VoiceOperationsRecordStatus, VoiceOperationsRecordTaskSummary, VoiceOperationsRecordTranscriptTurn, VoiceOperationsRecordTool } from './operationsRecord';
121
- 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, VoiceObservabilityExportReplaySource, VoiceObservabilityExportReport, VoiceObservabilityExportRoutesOptions, VoiceObservabilityExportSchema, VoiceObservabilityExportStatus, VoiceObservabilityExportValidationIssue, VoiceObservabilityExportValidationResult } from './observabilityExport';
121
+ 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';
122
122
  export type { VoiceOpsRecoveryFailedSession, VoiceOpsRecoveryInterventionSummary, VoiceOpsRecoveryIssue, VoiceOpsRecoveryIssueCode, VoiceOpsRecoveryLinks, VoiceOpsRecoveryProviderSummary, VoiceOpsRecoveryReport, VoiceOpsRecoveryReportOptions, VoiceOpsRecoveryRoutesOptions, VoiceOpsRecoveryStatus } from './opsRecovery';
123
123
  export type { StoredVoiceIncidentBundleArtifact, VoiceIncidentBundle, VoiceIncidentBundleArtifactOptions, VoiceIncidentBundleFormat, VoiceIncidentBundleOptions, VoiceIncidentBundleRetentionOptions, VoiceIncidentBundleRetentionReport, VoiceIncidentBundleRoutesOptions, VoiceIncidentBundleStore, VoiceIncidentBundleStoreFilter, VoiceIncidentBundleSummary } from './incidentBundle';
124
124
  export type { VoiceQualityLink, VoiceQualityMetric, VoiceQualityReport, VoiceQualityRoutesOptions, VoiceQualityStatus, VoiceQualityThresholds } from './qualityRoutes';
package/dist/index.js CHANGED
@@ -23509,6 +23509,45 @@ var loadVoiceObservabilityExportReplaySource = async (source) => {
23509
23509
  };
23510
23510
  };
23511
23511
  var replayVoiceObservabilityExport = async (source) => buildVoiceObservabilityExportReplayReport(await loadVoiceObservabilityExportReplaySource(source));
23512
+ var escapeObservabilityReplayHtml = (value) => String(value).replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
23513
+ var isVoiceObservabilityExportReplayReport = (value) => isRecord2(value) && isRecord2(value.summary) && isRecord2(value.records) && Array.isArray(value.issues) && typeof value.checkedAt === "number" && isStatus2(value.status);
23514
+ var resolveVoiceObservabilityExportReplayReport = async (input) => {
23515
+ const resolved = typeof input === "function" ? await input() : input;
23516
+ return isVoiceObservabilityExportReplayReport(resolved) ? resolved : replayVoiceObservabilityExport(resolved);
23517
+ };
23518
+ var renderVoiceObservabilityExportReplayHTML = (report, options = {}) => {
23519
+ const title = options.title ?? "Voice Observability Export Replay";
23520
+ const issues = report.issues.map((issue) => `<tr><td>${escapeObservabilityReplayHtml(issue.severity)}</td><td>${escapeObservabilityReplayHtml(issue.label)}</td><td>${escapeObservabilityReplayHtml(issue.value ?? "")}</td><td>${escapeObservabilityReplayHtml(issue.detail ?? "")}</td></tr>`).join("") || '<tr><td colspan="4">No replay issues.</td></tr>';
23521
+ const records = Object.entries(report.records).map(([kind, result]) => `<tr><td>${escapeObservabilityReplayHtml(kind)}</td><td>${escapeObservabilityReplayHtml(result?.ok ? "valid" : "invalid")}</td><td>${escapeObservabilityReplayHtml(result?.issues.length ?? 0)}</td><td>${escapeObservabilityReplayHtml(result?.schema ? `${result.schema.id ?? "missing"}@${result.schema.version ?? "missing"}` : "not present")}</td></tr>`).join("");
23522
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${escapeObservabilityReplayHtml(title)}</title><style>body{background:#0d1117;color:#f8fafc;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1060px;padding:32px}.hero{background:linear-gradient(135deg,rgba(34,197,94,.16),rgba(14,165,233,.12));border:1px solid #263241;border-radius:26px;margin-bottom:18px;padding:28px}.eyebrow{color:#67e8f9;font-size:.78rem;font-weight:900;letter-spacing:.12em;text-transform:uppercase}h1{font-size:clamp(2.1rem,5vw,4.2rem);line-height:.95;margin:.2rem 0 1rem}.status{border:1px solid #334155;border-radius:999px;display:inline-flex;font-weight:800;padding:8px 12px;text-transform:uppercase}.pass{color:#86efac}.warn{color:#fde68a}.fail{color:#fca5a5}.metrics{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));margin:18px 0}.metrics article,table,.primitive{background:#151b23;border:1px solid #263241;border-radius:18px}.metrics article,.primitive{padding:16px}.metrics span{color:#a8b0b8}.metrics strong{display:block;font-size:2rem;margin-top:.25rem}.primitive{margin:0 0 18px}.primitive p{color:#cbd5e1;line-height:1.55}table{border-collapse:collapse;margin-bottom:18px;overflow:hidden;width:100%}td,th{border-bottom:1px solid #263241;padding:12px;text-align:left}code{color:#bfdbfe}@media(max-width:760px){main{padding:20px}}</style></head><body><main><section class="hero"><p class="eyebrow">Customer-owned observability proof</p><h1>${escapeObservabilityReplayHtml(title)}</h1><p>This page reads back a delivered observability export and validates the manifest, artifact index, delivery evidence, and schema contract from storage you own.</p><p class="status ${escapeObservabilityReplayHtml(report.status)}">Status: ${escapeObservabilityReplayHtml(report.status)}</p><section class="metrics"><article><span>Artifacts</span><strong>${report.summary.artifacts}</strong></article><article><span>Delivery destinations</span><strong>${report.summary.deliveryDestinations}</strong></article><article><span>Validation issues</span><strong>${report.summary.validationIssues}</strong></article><article><span>Failed artifacts</span><strong>${report.summary.failedArtifacts}</strong></article></section></section><section class="primitive"><p class="eyebrow">Primitive</p><p><code>createVoiceObservabilityExportReplayRoutes(...)</code> gives self-hosted apps a readable replay proof and a JSON report for CI, release gates, SIEM ingestion, or customer evidence packets.</p></section><h2>Records</h2><table><thead><tr><th>Record</th><th>Status</th><th>Issues</th><th>Schema</th></tr></thead><tbody>${records}</tbody></table><h2>Issues</h2><table><thead><tr><th>Severity</th><th>Label</th><th>Value</th><th>Detail</th></tr></thead><tbody>${issues}</tbody></table><p>Checked at ${escapeObservabilityReplayHtml(new Date(report.checkedAt).toISOString())}</p></main></body></html>`;
23523
+ };
23524
+ var createVoiceObservabilityExportReplayRoutes = (options) => {
23525
+ const path = options.path ?? "/api/voice/observability-export/replay";
23526
+ const htmlPath = options.htmlPath ?? "/voice/observability-export/replay";
23527
+ const headers = {
23528
+ "cache-control": "no-store",
23529
+ ...options.headers ?? {}
23530
+ };
23531
+ const buildReport = () => resolveVoiceObservabilityExportReplayReport(options.source);
23532
+ const app = new Elysia39({
23533
+ name: options.name ?? "absolute-voice-observability-export-replay"
23534
+ });
23535
+ app.get(path, async () => Response.json(await buildReport(), { headers }));
23536
+ if (htmlPath !== false) {
23537
+ app.get(htmlPath, async () => {
23538
+ const report = await buildReport();
23539
+ return new Response(options.render ? await options.render(report) : renderVoiceObservabilityExportReplayHTML(report, {
23540
+ title: options.title
23541
+ }), {
23542
+ headers: {
23543
+ ...headers,
23544
+ "content-type": "text/html; charset=utf-8"
23545
+ }
23546
+ });
23547
+ });
23548
+ }
23549
+ return app;
23550
+ };
23512
23551
  var deliverObservabilityExportToSQLite = async (input) => {
23513
23552
  if (!input.destination.database && !input.destination.path) {
23514
23553
  throw new Error("SQLite observability export delivery requires destination.database or destination.path.");
@@ -24309,6 +24348,7 @@ var readinessGateCodes = {
24309
24348
  "Operator action history": "voice.readiness.operator_action_history",
24310
24349
  "Ops recovery": "voice.readiness.ops_recovery",
24311
24350
  "Observability export delivery": "voice.readiness.observability_export_delivery",
24351
+ "Observability export replay": "voice.readiness.observability_export_replay",
24312
24352
  "Phone agent production smoke": "voice.readiness.phone_agent_smoke",
24313
24353
  "Provider contract matrix": "voice.readiness.provider_contract_matrix",
24314
24354
  "Provider fallback recovery": "voice.readiness.provider_fallback_recovery",
@@ -24617,6 +24657,14 @@ var resolveObservabilityExportDeliveryHistory = async (options, input) => {
24617
24657
  }
24618
24658
  return;
24619
24659
  };
24660
+ var isVoiceObservabilityExportReplayReport2 = (value) => typeof value.checkedAt === "number" && Array.isArray(value.issues) && typeof value.status === "string" && ("summary" in value);
24661
+ var resolveObservabilityExportReplay = async (options, input) => {
24662
+ if (!options.observabilityExportReplay) {
24663
+ return;
24664
+ }
24665
+ const source = typeof options.observabilityExportReplay === "function" ? await options.observabilityExportReplay(input) : options.observabilityExportReplay;
24666
+ return isVoiceObservabilityExportReplayReport2(source) ? source : replayVoiceObservabilityExport(source);
24667
+ };
24620
24668
  var summarizeTraceDeliveries = async (options) => {
24621
24669
  if (!options.traceDeliveries) {
24622
24670
  return;
@@ -24777,6 +24825,7 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
24777
24825
  opsRecovery,
24778
24826
  observabilityExport,
24779
24827
  observabilityExportDeliveryHistory,
24828
+ observabilityExportReplay,
24780
24829
  proofSources
24781
24830
  ] = await Promise.all([
24782
24831
  evaluateVoiceQuality({ events }),
@@ -24814,6 +24863,7 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
24814
24863
  resolveOpsRecovery(options, { query, request }),
24815
24864
  resolveObservabilityExport(options, { query, request }),
24816
24865
  resolveObservabilityExportDeliveryHistory(options, { query, request }),
24866
+ resolveObservabilityExportReplay(options, { query, request }),
24817
24867
  resolveProofSources(options, { query, request })
24818
24868
  ]);
24819
24869
  const deliveryRuntime = summarizeDeliveryRuntime(deliveryRuntimeSummary);
@@ -25056,6 +25106,15 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
25056
25106
  totalDestinations: observabilityExportDeliveryHistory.history.summary.totalDestinations
25057
25107
  };
25058
25108
  })() : undefined;
25109
+ const observabilityExportReplaySummary = observabilityExportReplay ? {
25110
+ artifacts: observabilityExportReplay.summary.artifacts,
25111
+ deliveryDestinations: observabilityExportReplay.summary.deliveryDestinations,
25112
+ failedArtifacts: observabilityExportReplay.summary.failedArtifacts,
25113
+ failedDeliveryDestinations: observabilityExportReplay.summary.failedDeliveryDestinations,
25114
+ issues: observabilityExportReplay.issues.length,
25115
+ status: observabilityExportReplay.status,
25116
+ validationIssues: observabilityExportReplay.summary.validationIssues
25117
+ } : undefined;
25059
25118
  if (agentSquadContractSummary) {
25060
25119
  checks.push({
25061
25120
  detail: agentSquadContractSummary.status === "pass" ? `${agentSquadContractSummary.passed} agent squad contract(s) are passing.` : agentSquadContractSummary.total === 0 ? "No agent squad contracts are configured." : `${agentSquadContractSummary.failed} agent squad contract(s) failed.`,
@@ -25152,6 +25211,25 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
25152
25211
  ]
25153
25212
  });
25154
25213
  }
25214
+ if (observabilityExportReplaySummary && observabilityExportReplay) {
25215
+ const firstIssue = observabilityExportReplay.issues[0];
25216
+ const href = options.links?.observabilityExportDeliveries ?? options.links?.observabilityExport ?? "/api/voice/observability-export/deliveries";
25217
+ checks.push({
25218
+ detail: observabilityExportReplaySummary.status === "pass" ? `${observabilityExportReplaySummary.artifacts} exported artifact(s) and ${observabilityExportReplaySummary.deliveryDestinations} delivery destination(s) replay from customer-owned evidence.` : firstIssue?.detail ?? `${observabilityExportReplaySummary.issues} observability export replay issue(s) need review.`,
25219
+ href,
25220
+ label: "Observability export replay",
25221
+ proofSource: proofSource("observabilityExportReplay", "observabilityExportDeliveryHistory", "observability"),
25222
+ status: observabilityExportReplaySummary.status,
25223
+ value: `${observabilityExportReplaySummary.validationIssues} validation issue(s)`,
25224
+ actions: observabilityExportReplaySummary.status === "pass" ? [] : [
25225
+ {
25226
+ description: "Replay the customer-owned observability export from file, S3, SQLite, or Postgres and inspect validation, artifact, or delivery failures.",
25227
+ href,
25228
+ label: "Open export replay evidence"
25229
+ }
25230
+ ]
25231
+ });
25232
+ }
25155
25233
  if (providerStack) {
25156
25234
  const missingLanes = providerStack.gaps.filter((gap) => gap.status !== "pass");
25157
25235
  checks.push({
@@ -25415,6 +25493,7 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
25415
25493
  } : undefined,
25416
25494
  observabilityExport: observabilityExportSummary,
25417
25495
  observabilityExportDeliveryHistory: observabilityExportDeliveryHistorySummary,
25496
+ observabilityExportReplay: observabilityExportReplaySummary,
25418
25497
  providers: {
25419
25498
  degraded: degradedProviders,
25420
25499
  total: providers.length
@@ -29012,6 +29091,7 @@ export {
29012
29091
  renderVoiceOpsActionHistoryHTML,
29013
29092
  renderVoiceOperationsRecordIncidentMarkdown,
29014
29093
  renderVoiceOperationsRecordHTML,
29094
+ renderVoiceObservabilityExportReplayHTML,
29015
29095
  renderVoiceObservabilityExportMarkdown,
29016
29096
  renderVoiceLiveLatencyHTML,
29017
29097
  renderVoiceLatencySLOMarkdown,
@@ -29215,6 +29295,7 @@ export {
29215
29295
  createVoiceOperationsRecordRoutes,
29216
29296
  createVoiceObservabilityExportSchema,
29217
29297
  createVoiceObservabilityExportRoutes,
29298
+ createVoiceObservabilityExportReplayRoutes,
29218
29299
  createVoiceMemoryTraceSinkDeliveryStore,
29219
29300
  createVoiceMemoryTraceEventStore,
29220
29301
  createVoiceMemoryStore,
@@ -301,6 +301,15 @@ export type VoiceObservabilityExportReplaySource = {
301
301
  sql?: VoicePostgresClient;
302
302
  tableName?: string;
303
303
  };
304
+ export type VoiceObservabilityExportReplayRoutesOptions = {
305
+ headers?: HeadersInit;
306
+ htmlPath?: false | string;
307
+ name?: string;
308
+ path?: string;
309
+ render?: (report: VoiceObservabilityExportReplayReport) => string | Promise<string>;
310
+ source: VoiceObservabilityExportReplaySource | VoiceObservabilityExportReplayReport | (() => VoiceObservabilityExportReplaySource | VoiceObservabilityExportReplayReport | Promise<VoiceObservabilityExportReplaySource | VoiceObservabilityExportReplayReport>);
311
+ title?: string;
312
+ };
304
313
  export type VoiceObservabilityExportDeliveryOptions = {
305
314
  destinations: VoiceObservabilityExportDeliveryDestination[];
306
315
  report: VoiceObservabilityExportReport;
@@ -347,6 +356,37 @@ export type VoiceObservabilityExportRoutesOptions = VoiceObservabilityExportOpti
347
356
  export declare const buildVoiceObservabilityExportReplayReport: (records: VoiceObservabilityExportReplayRecords) => VoiceObservabilityExportReplayReport;
348
357
  export declare const loadVoiceObservabilityExportReplaySource: (source: VoiceObservabilityExportReplaySource) => Promise<VoiceObservabilityExportReplayRecords>;
349
358
  export declare const replayVoiceObservabilityExport: (source: VoiceObservabilityExportReplaySource) => Promise<VoiceObservabilityExportReplayReport>;
359
+ export declare const renderVoiceObservabilityExportReplayHTML: (report: VoiceObservabilityExportReplayReport, options?: {
360
+ title?: string;
361
+ }) => string;
362
+ export declare const createVoiceObservabilityExportReplayRoutes: (options: VoiceObservabilityExportReplayRoutesOptions) => Elysia<"", {
363
+ decorator: {};
364
+ store: {};
365
+ derive: {};
366
+ resolve: {};
367
+ }, {
368
+ typebox: {};
369
+ error: {};
370
+ }, {
371
+ schema: {};
372
+ standaloneSchema: {};
373
+ macro: {};
374
+ macroFn: {};
375
+ parser: {};
376
+ response: {};
377
+ }, {}, {
378
+ derive: {};
379
+ resolve: {};
380
+ schema: {};
381
+ standaloneSchema: {};
382
+ response: {};
383
+ }, {
384
+ derive: {};
385
+ resolve: {};
386
+ schema: {};
387
+ standaloneSchema: {};
388
+ response: {};
389
+ }>;
350
390
  export declare const createVoiceMemoryObservabilityExportDeliveryReceiptStore: () => VoiceObservabilityExportDeliveryReceiptStore;
351
391
  export declare const createVoiceFileObservabilityExportDeliveryReceiptStore: (options: {
352
392
  directory: string;
@@ -15,7 +15,7 @@ import type { VoiceProviderContractMatrixReport, VoiceProviderStackCapabilityGap
15
15
  import { type VoiceProviderSloReport, type VoiceProviderSloReportOptions } from './providerSlo';
16
16
  import type { VoiceCampaignReadinessProofReport } from './campaign';
17
17
  import { type VoiceOpsRecoveryReport } from './opsRecovery';
18
- import { type VoiceObservabilityExportDeliveryHistory, type VoiceObservabilityExportDeliveryReceiptStore, type VoiceObservabilityExportReport } from './observabilityExport';
18
+ import { type VoiceObservabilityExportDeliveryHistory, type VoiceObservabilityExportDeliveryReceiptStore, type VoiceObservabilityExportReplayReport, type VoiceObservabilityExportReplaySource, type VoiceObservabilityExportReport } from './observabilityExport';
19
19
  export type VoiceProductionReadinessObservabilityExportDeliveryHistoryOptions = {
20
20
  failOnMissing?: boolean;
21
21
  failOnStale?: boolean;
@@ -181,6 +181,15 @@ export type VoiceProductionReadinessReport = {
181
181
  status: VoiceProductionReadinessStatus;
182
182
  totalDestinations: number;
183
183
  };
184
+ observabilityExportReplay?: {
185
+ artifacts: number;
186
+ deliveryDestinations: number;
187
+ failedArtifacts: number;
188
+ failedDeliveryDestinations: number;
189
+ issues: number;
190
+ status: VoiceProductionReadinessStatus;
191
+ validationIssues: number;
192
+ };
184
193
  providers: {
185
194
  degraded: number;
186
195
  total: number;
@@ -372,6 +381,10 @@ export type VoiceProductionReadinessRoutesOptions = {
372
381
  query: Record<string, unknown>;
373
382
  request: Request;
374
383
  }) => Promise<VoiceObservabilityExportDeliveryHistory | VoiceObservabilityExportDeliveryReceiptStore | VoiceProductionReadinessObservabilityExportDeliveryHistoryOptions> | VoiceObservabilityExportDeliveryHistory | VoiceObservabilityExportDeliveryReceiptStore | VoiceProductionReadinessObservabilityExportDeliveryHistoryOptions);
384
+ observabilityExportReplay?: false | VoiceObservabilityExportReplayReport | VoiceObservabilityExportReplaySource | ((input: {
385
+ query: Record<string, unknown>;
386
+ request: Request;
387
+ }) => Promise<VoiceObservabilityExportReplayReport | VoiceObservabilityExportReplaySource> | VoiceObservabilityExportReplayReport | VoiceObservabilityExportReplaySource);
375
388
  path?: string;
376
389
  phoneAgentSmokes?: false | readonly VoicePhoneAgentProductionSmokeReport[] | ((input: {
377
390
  query: Record<string, unknown>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.233",
3
+ "version": "0.0.22-beta.235",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",