@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 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
- return {
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: failed > 0 || options.report.status === "fail" ? "fail" : options.report.status === "warn" ? "warn" : "pass",
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.223",
3
+ "version": "0.0.22-beta.225",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",