@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 +21 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +81 -0
- package/dist/observabilityExport.d.ts +40 -0
- package/dist/productionReadiness.d.ts +14 -1
- package/package.json +1 -1
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
|
|
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("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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>;
|