@absolutejs/voice 0.0.22-beta.223 → 0.0.22-beta.225
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 +14 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +135 -4
- package/dist/observabilityExport.d.ts +43 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2748,9 +2748,15 @@ Use observability exports when a buyer wants the hosted-dashboard evidence graph
|
|
|
2748
2748
|
```ts
|
|
2749
2749
|
import {
|
|
2750
2750
|
buildVoiceObservabilityExport,
|
|
2751
|
+
createVoiceFileObservabilityExportDeliveryReceiptStore,
|
|
2751
2752
|
createVoiceObservabilityExportRoutes
|
|
2752
2753
|
} from '@absolutejs/voice';
|
|
2753
2754
|
|
|
2755
|
+
const observabilityReceipts =
|
|
2756
|
+
createVoiceFileObservabilityExportDeliveryReceiptStore({
|
|
2757
|
+
directory: '.voice-runtime/observability-export-receipts'
|
|
2758
|
+
});
|
|
2759
|
+
|
|
2754
2760
|
app.use(
|
|
2755
2761
|
createVoiceObservabilityExportRoutes({
|
|
2756
2762
|
artifactIntegrity: {
|
|
@@ -2761,8 +2767,15 @@ app.use(
|
|
|
2761
2767
|
directory: '.voice-runtime/observability-exports',
|
|
2762
2768
|
kind: 'file',
|
|
2763
2769
|
label: 'Local customer-owned observability archive'
|
|
2770
|
+
},
|
|
2771
|
+
{
|
|
2772
|
+
bucket: process.env.VOICE_OBSERVABILITY_EXPORT_S3_BUCKET,
|
|
2773
|
+
keyPrefix: 'voice/observability-exports',
|
|
2774
|
+
kind: 's3',
|
|
2775
|
+
label: 'S3 customer-owned observability archive'
|
|
2764
2776
|
}
|
|
2765
2777
|
],
|
|
2778
|
+
deliveryReceipts: observabilityReceipts,
|
|
2766
2779
|
artifacts: [
|
|
2767
2780
|
{
|
|
2768
2781
|
id: 'latest-proof-pack',
|
|
@@ -2798,7 +2811,7 @@ const exportReport = await buildVoiceObservabilityExport({
|
|
|
2798
2811
|
});
|
|
2799
2812
|
```
|
|
2800
2813
|
|
|
2801
|
-
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`, 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. 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.
|
|
2814
|
+
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. Delivery receipt stores persist run id, destinations, status, 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.
|
|
2802
2815
|
|
|
2803
2816
|
Pass the same report into production readiness when export health should block deploys:
|
|
2804
2817
|
|
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 { buildVoiceObservabilityArtifactIndex, buildVoiceObservabilityExport, createVoiceObservabilityExportRoutes, deliverVoiceObservabilityExport, renderVoiceObservabilityExportMarkdown } from './observabilityExport';
|
|
56
|
+
export { buildVoiceObservabilityArtifactIndex, buildVoiceObservabilityExportDeliveryHistory, buildVoiceObservabilityExport, createVoiceFileObservabilityExportDeliveryReceiptStore, createVoiceMemoryObservabilityExportDeliveryReceiptStore, createVoiceObservabilityExportRoutes, deliverVoiceObservabilityExport, renderVoiceObservabilityExportMarkdown } 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, VoiceObservabilityExportDeliveryOptions, VoiceObservabilityExportDeliveryReport, VoiceObservabilityExportEnvelope, VoiceObservabilityExportIssue, VoiceObservabilityExportIssueCode, VoiceObservabilityExportOptions, VoiceObservabilityExportRedactionSummary, VoiceObservabilityExportReport, VoiceObservabilityExportRoutesOptions, VoiceObservabilityExportStatus } from './observabilityExport';
|
|
121
|
+
export type { VoiceObservabilityExportArtifact, VoiceObservabilityExportArtifactChecksum, VoiceObservabilityExportArtifactFreshness, VoiceObservabilityExportArtifactIndex, VoiceObservabilityExportArtifactIndexItem, VoiceObservabilityExportArtifactKind, VoiceObservabilityExportDeliverySummary, VoiceObservabilityExportDeliveryDestination, VoiceObservabilityExportDeliveryDestinationResult, VoiceObservabilityExportDeliveryHistory, VoiceObservabilityExportDeliveryOptions, VoiceObservabilityExportDeliveryReceipt, VoiceObservabilityExportDeliveryReceiptStore, VoiceObservabilityExportDeliveryReport, VoiceObservabilityExportEnvelope, VoiceObservabilityExportIssue, VoiceObservabilityExportIssueCode, VoiceObservabilityExportOptions, VoiceObservabilityExportRedactionSummary, VoiceObservabilityExportReport, VoiceObservabilityExportRoutesOptions, VoiceObservabilityExportStatus } 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
|
@@ -24943,7 +24943,7 @@ var createVoiceOperationsRecordRoutes = (options) => {
|
|
|
24943
24943
|
// src/observabilityExport.ts
|
|
24944
24944
|
import { Elysia as Elysia42 } from "elysia";
|
|
24945
24945
|
import { createHash } from "crypto";
|
|
24946
|
-
import { mkdir as mkdir4, readFile as readFile2, stat } from "fs/promises";
|
|
24946
|
+
import { mkdir as mkdir4, readFile as readFile2, stat, unlink } from "fs/promises";
|
|
24947
24947
|
import { join as join3 } from "path";
|
|
24948
24948
|
var isDeliveryStore = (value) => !Array.isArray(value) && typeof value.list === "function";
|
|
24949
24949
|
var getString18 = (value) => typeof value === "string" ? value : undefined;
|
|
@@ -24984,10 +24984,80 @@ var checksumFile = async (path) => {
|
|
|
24984
24984
|
return createHash("sha256").update(buffer).digest("hex");
|
|
24985
24985
|
};
|
|
24986
24986
|
var byteLength = (value) => new TextEncoder().encode(value).byteLength;
|
|
24987
|
+
var deliveryReceiptId = (runId) => `observability-export:${encodeURIComponent(runId)}`;
|
|
24987
24988
|
var safeArtifactFileName = (artifact) => {
|
|
24988
24989
|
const extension = artifact.contentType === "image/png" ? ".png" : artifact.contentType?.includes("markdown") ? ".md" : artifact.contentType?.includes("json") ? ".json" : "";
|
|
24989
24990
|
return `${artifact.id.replace(/[^a-z0-9_.-]/gi, "-")}${extension}`;
|
|
24990
24991
|
};
|
|
24992
|
+
var normalizeExportS3KeyPrefix = (prefix) => prefix?.trim().replace(/^\/+|\/+$/g, "") ?? "voice/observability-exports";
|
|
24993
|
+
var joinS3Key = (...parts) => parts.map((part) => part.trim().replace(/^\/+|\/+$/g, "")).filter(Boolean).join("/");
|
|
24994
|
+
var writeS3Object = async (input) => {
|
|
24995
|
+
const file = input.client.file(input.key, input.options);
|
|
24996
|
+
await file.write(input.value, {
|
|
24997
|
+
type: input.contentType
|
|
24998
|
+
});
|
|
24999
|
+
};
|
|
25000
|
+
var createVoiceMemoryObservabilityExportDeliveryReceiptStore = () => {
|
|
25001
|
+
const receipts = new Map;
|
|
25002
|
+
return {
|
|
25003
|
+
get: (id) => receipts.get(id),
|
|
25004
|
+
list: () => [...receipts.values()].sort((left, right) => right.checkedAt - left.checkedAt),
|
|
25005
|
+
remove: (id) => {
|
|
25006
|
+
receipts.delete(id);
|
|
25007
|
+
},
|
|
25008
|
+
set: (id, receipt) => {
|
|
25009
|
+
receipts.set(id, receipt);
|
|
25010
|
+
}
|
|
25011
|
+
};
|
|
25012
|
+
};
|
|
25013
|
+
var createVoiceFileObservabilityExportDeliveryReceiptStore = (options) => {
|
|
25014
|
+
const receiptPath = (id) => join3(options.directory, `${encodeURIComponent(id)}.json`);
|
|
25015
|
+
return {
|
|
25016
|
+
get: async (id) => {
|
|
25017
|
+
const file = Bun.file(receiptPath(id));
|
|
25018
|
+
if (!await file.exists()) {
|
|
25019
|
+
return;
|
|
25020
|
+
}
|
|
25021
|
+
return JSON.parse(await file.text());
|
|
25022
|
+
},
|
|
25023
|
+
list: async () => {
|
|
25024
|
+
await mkdir4(options.directory, { recursive: true });
|
|
25025
|
+
const receipts = [];
|
|
25026
|
+
for (const entry of await Array.fromAsync(new Bun.Glob("*.json").scan(options.directory))) {
|
|
25027
|
+
const file = Bun.file(join3(options.directory, entry));
|
|
25028
|
+
receipts.push(JSON.parse(await file.text()));
|
|
25029
|
+
}
|
|
25030
|
+
return receipts.sort((left, right) => right.checkedAt - left.checkedAt);
|
|
25031
|
+
},
|
|
25032
|
+
remove: async (id) => {
|
|
25033
|
+
await unlink(receiptPath(id)).catch(() => {
|
|
25034
|
+
return;
|
|
25035
|
+
});
|
|
25036
|
+
},
|
|
25037
|
+
set: async (id, receipt) => {
|
|
25038
|
+
await mkdir4(options.directory, { recursive: true });
|
|
25039
|
+
await Bun.write(receiptPath(id), `${JSON.stringify(receipt, null, 2)}
|
|
25040
|
+
`);
|
|
25041
|
+
}
|
|
25042
|
+
};
|
|
25043
|
+
};
|
|
25044
|
+
var buildVoiceObservabilityExportDeliveryHistory = async (store) => {
|
|
25045
|
+
const receipts = await store.list();
|
|
25046
|
+
const failed = receipts.reduce((count, receipt) => count + receipt.summary.failed, 0);
|
|
25047
|
+
const delivered = receipts.reduce((count, receipt) => count + receipt.summary.delivered, 0);
|
|
25048
|
+
const totalDestinations = receipts.reduce((count, receipt) => count + receipt.summary.total, 0);
|
|
25049
|
+
return {
|
|
25050
|
+
checkedAt: Date.now(),
|
|
25051
|
+
receipts,
|
|
25052
|
+
status: failed > 0 || receipts.some((receipt) => receipt.status === "fail") ? "fail" : receipts.some((receipt) => receipt.status === "warn") ? "warn" : "pass",
|
|
25053
|
+
summary: {
|
|
25054
|
+
delivered,
|
|
25055
|
+
failed,
|
|
25056
|
+
receipts: receipts.length,
|
|
25057
|
+
totalDestinations
|
|
25058
|
+
}
|
|
25059
|
+
};
|
|
25060
|
+
};
|
|
24991
25061
|
var inferContentType = (artifact) => {
|
|
24992
25062
|
if (artifact.contentType) {
|
|
24993
25063
|
return artifact.contentType;
|
|
@@ -25352,6 +25422,50 @@ var deliverVoiceObservabilityExport = async (options) => {
|
|
|
25352
25422
|
target
|
|
25353
25423
|
};
|
|
25354
25424
|
}
|
|
25425
|
+
if (destination.kind === "s3") {
|
|
25426
|
+
const keyPrefix = normalizeExportS3KeyPrefix(destination.keyPrefix);
|
|
25427
|
+
const rootKey = joinS3Key(keyPrefix, runId);
|
|
25428
|
+
const client = destination.client ?? new Bun.S3Client(destination);
|
|
25429
|
+
const s3Options = destination;
|
|
25430
|
+
await writeS3Object({
|
|
25431
|
+
client,
|
|
25432
|
+
contentType: "application/json",
|
|
25433
|
+
key: joinS3Key(rootKey, "manifest.json"),
|
|
25434
|
+
options: s3Options,
|
|
25435
|
+
value: manifest
|
|
25436
|
+
});
|
|
25437
|
+
await writeS3Object({
|
|
25438
|
+
client,
|
|
25439
|
+
contentType: "application/json",
|
|
25440
|
+
key: joinS3Key(rootKey, "artifact-index.json"),
|
|
25441
|
+
options: s3Options,
|
|
25442
|
+
value: index
|
|
25443
|
+
});
|
|
25444
|
+
if (destination.includeArtifacts !== false) {
|
|
25445
|
+
for (const artifact of options.report.artifacts) {
|
|
25446
|
+
if (!artifact.path) {
|
|
25447
|
+
continue;
|
|
25448
|
+
}
|
|
25449
|
+
await writeS3Object({
|
|
25450
|
+
client,
|
|
25451
|
+
contentType: artifact.contentType ?? inferContentType(artifact),
|
|
25452
|
+
key: joinS3Key(rootKey, "artifacts", safeArtifactFileName(artifact)),
|
|
25453
|
+
options: s3Options,
|
|
25454
|
+
value: await readFile2(stripArtifactPathAnchor(artifact.path))
|
|
25455
|
+
});
|
|
25456
|
+
}
|
|
25457
|
+
}
|
|
25458
|
+
return {
|
|
25459
|
+
artifactCount: destination.includeArtifacts === false ? 0 : options.report.artifacts.filter((artifact) => artifact.path).length,
|
|
25460
|
+
deliveredAt: Date.now(),
|
|
25461
|
+
destinationId,
|
|
25462
|
+
destinationKind: destination.kind,
|
|
25463
|
+
label,
|
|
25464
|
+
manifestBytes: byteLength(manifest),
|
|
25465
|
+
status: "delivered",
|
|
25466
|
+
target: destination.bucket ? `s3://${destination.bucket}/${rootKey}` : rootKey
|
|
25467
|
+
};
|
|
25468
|
+
}
|
|
25355
25469
|
const controller = new AbortController;
|
|
25356
25470
|
const timeout = setTimeout(() => controller.abort(), destination.timeoutMs ?? 1e4);
|
|
25357
25471
|
try {
|
|
@@ -25396,22 +25510,32 @@ var deliverVoiceObservabilityExport = async (options) => {
|
|
|
25396
25510
|
label,
|
|
25397
25511
|
manifestBytes: byteLength(manifest),
|
|
25398
25512
|
status: "failed",
|
|
25399
|
-
target: destination.kind === "file" ? destination.directory : destination.url
|
|
25513
|
+
target: destination.kind === "file" ? destination.directory : destination.kind === "s3" ? destination.bucket ? `s3://${destination.bucket}/${normalizeExportS3KeyPrefix(destination.keyPrefix)}` : normalizeExportS3KeyPrefix(destination.keyPrefix) : destination.url
|
|
25400
25514
|
};
|
|
25401
25515
|
}
|
|
25402
25516
|
}));
|
|
25403
25517
|
const failed = destinations.filter((destination) => destination.status === "failed").length;
|
|
25404
|
-
|
|
25518
|
+
const status = failed > 0 || options.report.status === "fail" ? "fail" : options.report.status === "warn" ? "warn" : "pass";
|
|
25519
|
+
const report = {
|
|
25405
25520
|
checkedAt,
|
|
25406
25521
|
destinations,
|
|
25407
25522
|
exportStatus: options.report.status,
|
|
25408
|
-
status
|
|
25523
|
+
status,
|
|
25409
25524
|
summary: {
|
|
25410
25525
|
delivered: destinations.length - failed,
|
|
25411
25526
|
failed,
|
|
25412
25527
|
total: destinations.length
|
|
25413
25528
|
}
|
|
25414
25529
|
};
|
|
25530
|
+
if (options.receipts) {
|
|
25531
|
+
const receipt = {
|
|
25532
|
+
...report,
|
|
25533
|
+
id: deliveryReceiptId(runId),
|
|
25534
|
+
runId
|
|
25535
|
+
};
|
|
25536
|
+
await options.receipts.set(receipt.id, receipt);
|
|
25537
|
+
}
|
|
25538
|
+
return report;
|
|
25415
25539
|
};
|
|
25416
25540
|
var createVoiceObservabilityExportRoutes = (options = {}) => {
|
|
25417
25541
|
const path = options.path ?? "/api/voice/observability-export";
|
|
@@ -25468,8 +25592,12 @@ var createVoiceObservabilityExportRoutes = (options = {}) => {
|
|
|
25468
25592
|
});
|
|
25469
25593
|
}
|
|
25470
25594
|
if (deliveryPath !== false && options.deliveryDestinations) {
|
|
25595
|
+
if (options.deliveryReceipts) {
|
|
25596
|
+
app.get(deliveryPath, async () => Response.json(await buildVoiceObservabilityExportDeliveryHistory(options.deliveryReceipts), { headers }));
|
|
25597
|
+
}
|
|
25471
25598
|
app.post(deliveryPath, async () => Response.json(await deliverVoiceObservabilityExport({
|
|
25472
25599
|
destinations: options.deliveryDestinations ?? [],
|
|
25600
|
+
receipts: options.deliveryReceipts,
|
|
25473
25601
|
report: await buildReport()
|
|
25474
25602
|
}), { headers }));
|
|
25475
25603
|
}
|
|
@@ -28366,6 +28494,7 @@ export {
|
|
|
28366
28494
|
createVoiceMemoryTraceSinkDeliveryStore,
|
|
28367
28495
|
createVoiceMemoryTraceEventStore,
|
|
28368
28496
|
createVoiceMemoryStore,
|
|
28497
|
+
createVoiceMemoryObservabilityExportDeliveryReceiptStore,
|
|
28369
28498
|
createVoiceMemoryLiveOpsControlStore,
|
|
28370
28499
|
createVoiceMemoryIncidentBundleStore,
|
|
28371
28500
|
createVoiceMemoryHandoffDeliveryStore,
|
|
@@ -28401,6 +28530,7 @@ export {
|
|
|
28401
28530
|
createVoiceFileScenarioFixtureStore,
|
|
28402
28531
|
createVoiceFileRuntimeStorage,
|
|
28403
28532
|
createVoiceFileReviewStore,
|
|
28533
|
+
createVoiceFileObservabilityExportDeliveryReceiptStore,
|
|
28404
28534
|
createVoiceFileIntegrationEventStore,
|
|
28405
28535
|
createVoiceFileIncidentBundleStore,
|
|
28406
28536
|
createVoiceFileExternalObjectMapStore,
|
|
@@ -28499,6 +28629,7 @@ export {
|
|
|
28499
28629
|
buildVoiceOpsConsoleReport,
|
|
28500
28630
|
buildVoiceOpsActionHistoryReport,
|
|
28501
28631
|
buildVoiceOperationsRecord,
|
|
28632
|
+
buildVoiceObservabilityExportDeliveryHistory,
|
|
28502
28633
|
buildVoiceObservabilityExport,
|
|
28503
28634
|
buildVoiceObservabilityArtifactIndex,
|
|
28504
28635
|
buildVoiceLiveOpsControlState,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Elysia } from 'elysia';
|
|
2
|
+
import type { S3Client, S3Options } from 'bun';
|
|
2
3
|
import { type VoiceAuditSinkDeliveryQueueSummary, type VoiceAuditSinkDeliveryRecord, type VoiceAuditSinkDeliveryStore } from './auditSinks';
|
|
3
4
|
import type { VoiceAuditEventStore, VoiceAuditEventType } from './audit';
|
|
4
5
|
import { type VoiceOperationsRecord } from './operationsRecord';
|
|
@@ -113,7 +114,15 @@ export type VoiceObservabilityExportDeliveryDestination = {
|
|
|
113
114
|
includeArtifacts?: boolean;
|
|
114
115
|
kind: 'file';
|
|
115
116
|
label?: string;
|
|
116
|
-
} | {
|
|
117
|
+
} | (S3Options & {
|
|
118
|
+
bucket?: string;
|
|
119
|
+
client?: Pick<S3Client, 'file'>;
|
|
120
|
+
id?: string;
|
|
121
|
+
includeArtifacts?: boolean;
|
|
122
|
+
keyPrefix?: string;
|
|
123
|
+
kind: 's3';
|
|
124
|
+
label?: string;
|
|
125
|
+
}) | {
|
|
117
126
|
fetch?: typeof fetch;
|
|
118
127
|
headers?: Record<string, string>;
|
|
119
128
|
id?: string;
|
|
@@ -145,9 +154,36 @@ export type VoiceObservabilityExportDeliveryReport = {
|
|
|
145
154
|
total: number;
|
|
146
155
|
};
|
|
147
156
|
};
|
|
157
|
+
export type VoiceObservabilityExportDeliveryReceipt = {
|
|
158
|
+
checkedAt: number;
|
|
159
|
+
destinations: VoiceObservabilityExportDeliveryDestinationResult[];
|
|
160
|
+
exportStatus: VoiceObservabilityExportStatus;
|
|
161
|
+
id: string;
|
|
162
|
+
runId: string;
|
|
163
|
+
status: VoiceObservabilityExportStatus;
|
|
164
|
+
summary: VoiceObservabilityExportDeliveryReport['summary'];
|
|
165
|
+
};
|
|
166
|
+
export type VoiceObservabilityExportDeliveryReceiptStore = {
|
|
167
|
+
get: (id: string) => Promise<VoiceObservabilityExportDeliveryReceipt | undefined> | VoiceObservabilityExportDeliveryReceipt | undefined;
|
|
168
|
+
list: () => Promise<VoiceObservabilityExportDeliveryReceipt[]> | VoiceObservabilityExportDeliveryReceipt[];
|
|
169
|
+
remove: (id: string) => Promise<void> | void;
|
|
170
|
+
set: (id: string, receipt: VoiceObservabilityExportDeliveryReceipt) => Promise<void> | void;
|
|
171
|
+
};
|
|
172
|
+
export type VoiceObservabilityExportDeliveryHistory = {
|
|
173
|
+
checkedAt: number;
|
|
174
|
+
receipts: VoiceObservabilityExportDeliveryReceipt[];
|
|
175
|
+
status: VoiceObservabilityExportStatus;
|
|
176
|
+
summary: {
|
|
177
|
+
delivered: number;
|
|
178
|
+
failed: number;
|
|
179
|
+
receipts: number;
|
|
180
|
+
totalDestinations: number;
|
|
181
|
+
};
|
|
182
|
+
};
|
|
148
183
|
export type VoiceObservabilityExportDeliveryOptions = {
|
|
149
184
|
destinations: VoiceObservabilityExportDeliveryDestination[];
|
|
150
185
|
report: VoiceObservabilityExportReport;
|
|
186
|
+
receipts?: VoiceObservabilityExportDeliveryReceiptStore;
|
|
151
187
|
runId?: string;
|
|
152
188
|
};
|
|
153
189
|
export type VoiceObservabilityExportOptions = {
|
|
@@ -179,6 +215,7 @@ export type VoiceObservabilityExportRoutesOptions = VoiceObservabilityExportOpti
|
|
|
179
215
|
artifactIndexPath?: false | string;
|
|
180
216
|
deliveryDestinations?: VoiceObservabilityExportDeliveryDestination[];
|
|
181
217
|
deliveryPath?: false | string;
|
|
218
|
+
deliveryReceipts?: VoiceObservabilityExportDeliveryReceiptStore;
|
|
182
219
|
htmlPath?: false | string;
|
|
183
220
|
markdownPath?: false | string;
|
|
184
221
|
name?: string;
|
|
@@ -186,6 +223,11 @@ export type VoiceObservabilityExportRoutesOptions = VoiceObservabilityExportOpti
|
|
|
186
223
|
render?: (report: VoiceObservabilityExportReport) => string | Promise<string>;
|
|
187
224
|
title?: string;
|
|
188
225
|
};
|
|
226
|
+
export declare const createVoiceMemoryObservabilityExportDeliveryReceiptStore: () => VoiceObservabilityExportDeliveryReceiptStore;
|
|
227
|
+
export declare const createVoiceFileObservabilityExportDeliveryReceiptStore: (options: {
|
|
228
|
+
directory: string;
|
|
229
|
+
}) => VoiceObservabilityExportDeliveryReceiptStore;
|
|
230
|
+
export declare const buildVoiceObservabilityExportDeliveryHistory: (store: VoiceObservabilityExportDeliveryReceiptStore) => Promise<VoiceObservabilityExportDeliveryHistory>;
|
|
189
231
|
export declare const buildVoiceObservabilityExport: (options?: VoiceObservabilityExportOptions) => Promise<VoiceObservabilityExportReport>;
|
|
190
232
|
export declare const renderVoiceObservabilityExportMarkdown: (report: VoiceObservabilityExportReport, options?: {
|
|
191
233
|
title?: string;
|