@absolutejs/voice 0.0.22-beta.143 → 0.0.22-beta.145

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.
@@ -9,6 +9,29 @@ export type VoiceDeliverySinkDescriptor = {
9
9
  id: string;
10
10
  kind: VoiceDeliverySinkKind;
11
11
  label: string;
12
+ mode?: string;
13
+ target?: string;
14
+ };
15
+ export type VoiceDeliverySinkDescriptorInput = {
16
+ description?: string;
17
+ href?: string;
18
+ id?: string;
19
+ kind: VoiceDeliverySinkKind;
20
+ label?: string;
21
+ mode?: string;
22
+ target?: string;
23
+ };
24
+ export type VoiceDeliverySinkPairOptions = {
25
+ auditHref?: string;
26
+ auditId?: string;
27
+ auditLabel?: string;
28
+ description?: string;
29
+ kind: VoiceDeliverySinkKind;
30
+ mode?: string;
31
+ target?: string;
32
+ traceHref?: string;
33
+ traceId?: string;
34
+ traceLabel?: string;
12
35
  };
13
36
  export type VoiceDeliverySinkReport = {
14
37
  auditDeliveries?: VoiceTraceDeliverySinkSurface<VoiceAuditSinkDeliveryQueueSummary>;
@@ -41,6 +64,13 @@ export type VoiceDeliverySinkRoutesOptions = {
41
64
  store: VoiceTraceSinkDeliveryStore;
42
65
  };
43
66
  };
67
+ export declare const createVoiceDeliverySinkDescriptor: (input: VoiceDeliverySinkDescriptorInput) => VoiceDeliverySinkDescriptor;
68
+ export declare const createVoiceFileDeliverySink: (input?: Omit<VoiceDeliverySinkDescriptorInput, "kind">) => VoiceDeliverySinkDescriptor;
69
+ export declare const createVoiceWebhookDeliverySink: (input?: Omit<VoiceDeliverySinkDescriptorInput, "kind">) => VoiceDeliverySinkDescriptor;
70
+ export declare const createVoiceS3DeliverySink: (input?: Omit<VoiceDeliverySinkDescriptorInput, "kind">) => VoiceDeliverySinkDescriptor;
71
+ export declare const createVoicePostgresDeliverySink: (input?: Omit<VoiceDeliverySinkDescriptorInput, "kind">) => VoiceDeliverySinkDescriptor;
72
+ export declare const createVoiceSQLiteDeliverySink: (input?: Omit<VoiceDeliverySinkDescriptorInput, "kind">) => VoiceDeliverySinkDescriptor;
73
+ export declare const createVoiceDeliverySinkPair: (options: VoiceDeliverySinkPairOptions) => VoiceDeliverySinkDescriptor[];
44
74
  export declare const buildVoiceDeliverySinkReport: (options: VoiceDeliverySinkRoutesOptions) => Promise<VoiceDeliverySinkReport>;
45
75
  export declare const renderVoiceDeliverySinkHTML: (report: VoiceDeliverySinkReport, options?: {
46
76
  title?: string;
package/dist/index.d.ts CHANGED
@@ -12,11 +12,11 @@ export { createVoiceBargeInRoutes, renderVoiceBargeInHTML, summarizeVoiceBargeIn
12
12
  export { createVoiceReconnectContractRoutes, renderVoiceReconnectContractHTML, summarizeVoiceReconnectContractSnapshots, runVoiceReconnectContract } from './reconnectContract';
13
13
  export { buildVoiceDiagnosticsMarkdown, createVoiceDiagnosticsRoutes, resolveVoiceDiagnosticsTraceFilter } from './diagnosticsRoutes';
14
14
  export { buildVoiceDemoReadyReport, createVoiceDemoReadyRoutes, renderVoiceDemoReadyHTML } from './demoReadyRoutes';
15
- export { buildVoiceDeliverySinkReport, createVoiceDeliverySinkRoutes, renderVoiceDeliverySinkHTML } from './deliverySinkRoutes';
15
+ export { buildVoiceDeliverySinkReport, createVoiceDeliverySinkDescriptor, createVoiceDeliverySinkPair, createVoiceDeliverySinkRoutes, createVoiceFileDeliverySink, createVoicePostgresDeliverySink, createVoiceS3DeliverySink, createVoiceSQLiteDeliverySink, createVoiceWebhookDeliverySink, renderVoiceDeliverySinkHTML } from './deliverySinkRoutes';
16
16
  export { applyVoiceDataRetentionPolicy, buildVoiceDataRetentionPlan } from './dataControl';
17
17
  export type { VoiceDataRetentionPolicy, VoiceDataRetentionReport, VoiceDataRetentionScope, VoiceDataRetentionScopeReport, VoiceDataRetentionStores } from './dataControl';
18
18
  export type { VoiceDemoReadyReport, VoiceDemoReadyRoutesOptions, VoiceDemoReadySection, VoiceDemoReadyStatus } from './demoReadyRoutes';
19
- export type { VoiceDeliverySinkDescriptor, VoiceDeliverySinkKind, VoiceDeliverySinkReport, VoiceDeliverySinkRoutesOptions, VoiceTraceDeliverySinkSurface } from './deliverySinkRoutes';
19
+ export type { VoiceDeliverySinkDescriptor, VoiceDeliverySinkDescriptorInput, VoiceDeliverySinkKind, VoiceDeliverySinkPairOptions, VoiceDeliverySinkReport, VoiceDeliverySinkRoutesOptions, VoiceTraceDeliverySinkSurface } from './deliverySinkRoutes';
20
20
  export { compareVoiceEvalBaseline, createVoiceFileEvalBaselineStore, createVoiceFileScenarioFixtureStore, createVoiceEvalRoutes, renderVoiceEvalBaselineHTML, renderVoiceEvalHTML, renderVoiceScenarioEvalHTML, renderVoiceScenarioFixtureEvalHTML, runVoiceScenarioEvals, runVoiceScenarioFixtureEvals, runVoiceSessionEvals } from './evalRoutes';
21
21
  export { createVoiceSimulationSuiteRoutes, renderVoiceSimulationSuiteHTML, runVoiceSimulationSuite } from './simulationSuite';
22
22
  export { createVoiceWorkflowContract, createVoiceWorkflowContractHandler, createVoiceWorkflowContractPreset, createVoiceWorkflowScenario, recordVoiceWorkflowContractTrace, validateVoiceWorkflowRouteResult } from './workflowContract';
package/dist/index.js CHANGED
@@ -11348,6 +11348,56 @@ var rollupDeliverySinkStatus = (report) => {
11348
11348
  ];
11349
11349
  return statuses.includes("fail") ? "fail" : statuses.includes("warn") ? "warn" : "pass";
11350
11350
  };
11351
+ var deliverySinkLabel = (kind) => `${String(kind).replaceAll(/[-_]+/g, " ")} sink`;
11352
+ var createVoiceDeliverySinkDescriptor = (input) => ({
11353
+ description: input.description,
11354
+ href: input.href,
11355
+ id: input.id ?? `${input.kind}-sink`,
11356
+ kind: input.kind,
11357
+ label: input.label ?? deliverySinkLabel(input.kind),
11358
+ mode: input.mode,
11359
+ target: input.target
11360
+ });
11361
+ var createVoiceFileDeliverySink = (input = {}) => createVoiceDeliverySinkDescriptor({
11362
+ ...input,
11363
+ kind: "file"
11364
+ });
11365
+ var createVoiceWebhookDeliverySink = (input = {}) => createVoiceDeliverySinkDescriptor({
11366
+ ...input,
11367
+ kind: "webhook"
11368
+ });
11369
+ var createVoiceS3DeliverySink = (input = {}) => createVoiceDeliverySinkDescriptor({
11370
+ ...input,
11371
+ kind: "s3"
11372
+ });
11373
+ var createVoicePostgresDeliverySink = (input = {}) => createVoiceDeliverySinkDescriptor({
11374
+ ...input,
11375
+ kind: "postgres"
11376
+ });
11377
+ var createVoiceSQLiteDeliverySink = (input = {}) => createVoiceDeliverySinkDescriptor({
11378
+ ...input,
11379
+ kind: "sqlite"
11380
+ });
11381
+ var createVoiceDeliverySinkPair = (options) => [
11382
+ createVoiceDeliverySinkDescriptor({
11383
+ description: options.description,
11384
+ href: options.auditHref,
11385
+ id: options.auditId ?? `${options.kind}-audit-sink`,
11386
+ kind: options.kind,
11387
+ label: options.auditLabel ?? `${deliverySinkLabel(options.kind)} audit`,
11388
+ mode: options.mode,
11389
+ target: options.target
11390
+ }),
11391
+ createVoiceDeliverySinkDescriptor({
11392
+ description: options.description,
11393
+ href: options.traceHref,
11394
+ id: options.traceId ?? `${options.kind}-trace-sink`,
11395
+ kind: options.kind,
11396
+ label: options.traceLabel ?? `${deliverySinkLabel(options.kind)} trace`,
11397
+ mode: options.mode,
11398
+ target: options.target
11399
+ })
11400
+ ];
11351
11401
  var buildVoiceDeliverySinkReport = async (options) => {
11352
11402
  const [auditSummary, traceSummary] = await Promise.all([
11353
11403
  options.auditDeliveries ? Promise.resolve(options.auditDeliveries.store.list()).then((deliveries) => summarizeVoiceAuditSinkDeliveries(deliveries)) : undefined,
@@ -11382,11 +11432,14 @@ var renderSurfaceCard = (surface) => {
11382
11432
  };
11383
11433
  var renderVoiceDeliverySinkHTML = (report, options = {}) => {
11384
11434
  const title = options.title ?? "AbsoluteJS Voice Delivery Sinks";
11385
- const sinks = report.sinks.length ? report.sinks.map((sink) => `<article><span>${escapeHtml14(sink.kind)}</span><strong style="font-size:1.5rem">${escapeHtml14(sink.label)}</strong>${sink.description ? `<p class="muted">${escapeHtml14(sink.description)}</p>` : ""}${sink.href ? `<p><a href="${escapeHtml14(sink.href)}">Open sink</a></p>` : ""}</article>`).join("") : '<article><span>Sink</span><strong style="font-size:1.5rem">Not described</strong><p class="muted">Pass sink descriptors to document your file, webhook, S3, SQLite, or Postgres targets.</p></article>';
11435
+ const sinks = report.sinks.length ? report.sinks.map((sink) => `<article><span>${escapeHtml14(sink.kind)}</span><strong style="font-size:1.5rem">${escapeHtml14(sink.label)}</strong>${sink.description ? `<p class="muted">${escapeHtml14(sink.description)}</p>` : ""}${sink.mode ? `<p class="muted">Mode: ${escapeHtml14(sink.mode)}</p>` : ""}${sink.target ? `<p class="muted">Target: <code>${escapeHtml14(sink.target)}</code></p>` : ""}${sink.href ? `<p><a href="${escapeHtml14(sink.href)}">Open sink</a></p>` : ""}</article>`).join("") : '<article><span>Sink</span><strong style="font-size:1.5rem">Not described</strong><p class="muted">Pass sink descriptors to document your file, webhook, S3, SQLite, or Postgres targets.</p></article>';
11386
11436
  return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${escapeHtml14(title)}</title><style>body{background:#11120d;color:#fbf7e8;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{max-width:1120px;margin:auto;padding:32px}a{color:#fde68a;text-decoration:none}.hero{background:linear-gradient(135deg,rgba(253,230,138,.2),rgba(34,197,94,.14));border:1px solid #3a3420;border-radius:30px;margin-bottom:18px;padding:28px}.eyebrow{color:#fde68a;font-weight:900;letter-spacing:.12em;text-transform:uppercase}h1{font-size:clamp(2.4rem,6vw,4.8rem);line-height:.9;margin:.2rem 0 1rem}.status{border:1px solid #575030;border-radius:999px;display:inline-flex;font-weight:900;padding:8px 12px}.status.pass{border-color:rgba(34,197,94,.65)}.status.warn{border-color:rgba(245,158,11,.65)}.status.fail{border-color:rgba(239,68,68,.75)}.muted{color:#b8b093}.grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));margin:18px 0}article,.card{background:#191a13;border:1px solid #33311f;border-radius:22px;padding:18px}article span{color:#b8b093;display:block;font-weight:800}article strong{display:block;font-size:2.4rem;margin-top:8px}pre{background:#0c0d09;border:1px solid #33311f;border-radius:18px;color:#fef3c7;overflow:auto;padding:16px}code{color:#fef3c7}</style></head><body><main><p><a href="/production-readiness">Production readiness</a></p><section class="hero"><p class="eyebrow">Composable sink primitive</p><h1>${escapeHtml14(title)}</h1><p class="muted">Delivery queues prove audit and trace exports without owning your infrastructure. Swap file, webhook, S3, SQLite, or Postgres sinks behind the same readiness surface.</p><p class="status ${escapeHtml14(report.status)}">Overall: ${escapeHtml14(report.status.toUpperCase())}</p><p class="muted">Checked ${escapeHtml14(new Date(report.checkedAt).toLocaleString())}</p></section><section class="grid">${renderSurfaceCard(report.auditDeliveries)}${renderSurfaceCard(report.traceDeliveries)}${sinks}</section><section class="card"><h2>Primitive shape</h2><p class="muted">Mount delivery sink routes beside audit and trace delivery queues. Production readiness can consume the same stores for pass/fail evidence.</p><pre>createVoiceDeliverySinkRoutes({
11387
11437
  auditDeliveries: { store: runtimeStorage.auditDeliveries },
11388
11438
  traceDeliveries: { store: runtimeStorage.traceDeliveries },
11389
- sinks: [{ id: "audit-file", kind: "file", label: "Audit file sink" }]
11439
+ sinks: createVoiceDeliverySinkPair({
11440
+ kind: "file",
11441
+ target: "file://.voice-runtime/voice-demo"
11442
+ })
11390
11443
  })</pre></section></main></body></html>`;
11391
11444
  };
11392
11445
  var createVoiceDeliverySinkRoutes = (options) => {
@@ -20288,15 +20341,16 @@ var buildVoiceOpsConsoleReport = async (options) => {
20288
20341
  const trace = summarizeVoiceTrace(events);
20289
20342
  const deliverySinkOptions = options.deliverySinks || undefined;
20290
20343
  const deliverySinks = deliverySinkOptions ? await buildVoiceDeliverySinkReport(deliverySinkOptions) : undefined;
20291
- const links = options.links ?? (deliverySinks ? [
20292
- ...DEFAULT_LINKS,
20344
+ const baseLinks = options.links ?? DEFAULT_LINKS;
20345
+ const links = deliverySinks && !baseLinks.some((link) => link.href === (deliverySinkOptions?.htmlPath ?? "/delivery-sinks") || link.statusHref === (deliverySinkOptions?.path ?? "/api/voice-delivery-sinks")) ? [
20346
+ ...baseLinks,
20293
20347
  {
20294
20348
  description: "Configured audit and trace delivery sinks with queue health.",
20295
20349
  href: deliverySinkOptions?.htmlPath === false ? deliverySinkOptions.path ?? "/api/voice-delivery-sinks" : deliverySinkOptions?.htmlPath ?? "/delivery-sinks",
20296
20350
  label: "Delivery Sinks",
20297
20351
  statusHref: deliverySinkOptions?.path ?? "/api/voice-delivery-sinks"
20298
20352
  }
20299
- ] : DEFAULT_LINKS);
20353
+ ] : baseLinks;
20300
20354
  return {
20301
20355
  checkedAt: Date.now(),
20302
20356
  deliverySinks,
@@ -20499,17 +20553,20 @@ var summarizeVoiceOpsStatus = async (options) => {
20499
20553
  };
20500
20554
  statuses.push(status);
20501
20555
  }
20556
+ const baseLinks = options.links ?? DEFAULT_LINKS2;
20557
+ const deliverySinkOptions = options.deliverySinks || undefined;
20558
+ const links = deliverySinkOptions && !baseLinks.some((link) => link.href === (deliverySinkOptions.htmlPath ?? "/delivery-sinks") || link.statusHref === (deliverySinkOptions.path ?? "/api/voice-delivery-sinks")) ? [
20559
+ ...baseLinks,
20560
+ {
20561
+ description: "Audit and trace delivery sink health.",
20562
+ href: deliverySinkOptions.htmlPath === false ? deliverySinkOptions.path ?? "/api/voice-delivery-sinks" : deliverySinkOptions.htmlPath ?? "/delivery-sinks",
20563
+ label: "Delivery Sinks",
20564
+ statusHref: deliverySinkOptions.path ?? "/api/voice-delivery-sinks"
20565
+ }
20566
+ ] : baseLinks;
20502
20567
  return {
20503
20568
  checkedAt: Date.now(),
20504
- links: options.links ?? (options.deliverySinks ? [
20505
- ...DEFAULT_LINKS2,
20506
- {
20507
- description: "Audit and trace delivery sink health.",
20508
- href: options.deliverySinks.htmlPath === false ? options.deliverySinks.path ?? "/api/voice-delivery-sinks" : options.deliverySinks.htmlPath ?? "/delivery-sinks",
20509
- label: "Delivery Sinks",
20510
- statusHref: options.deliverySinks.path ?? "/api/voice-delivery-sinks"
20511
- }
20512
- ] : DEFAULT_LINKS2),
20569
+ links,
20513
20570
  status: statuses.includes("fail") ? "fail" : "pass",
20514
20571
  surfaces,
20515
20572
  ...countStatus(statuses)
@@ -23058,6 +23115,7 @@ export {
23058
23115
  createVoiceWebhookHandoffAdapter,
23059
23116
  createVoiceWebhookDeliveryWorkerLoop,
23060
23117
  createVoiceWebhookDeliveryWorker,
23118
+ createVoiceWebhookDeliverySink,
23061
23119
  createVoiceTwilioRedirectHandoffAdapter,
23062
23120
  createVoiceTwilioCampaignDialer,
23063
23121
  createVoiceTurnQualityRoutes,
@@ -23115,10 +23173,12 @@ export {
23115
23173
  createVoiceSQLiteReviewStore,
23116
23174
  createVoiceSQLiteIntegrationEventStore,
23117
23175
  createVoiceSQLiteExternalObjectMapStore,
23176
+ createVoiceSQLiteDeliverySink,
23118
23177
  createVoiceSQLiteCampaignStore,
23119
23178
  createVoiceSQLiteAuditSinkDeliveryStore,
23120
23179
  createVoiceSQLiteAuditEventStore,
23121
23180
  createVoiceS3ReviewStore,
23181
+ createVoiceS3DeliverySink,
23122
23182
  createVoiceRoutingDecisionSummary,
23123
23183
  createVoiceReviewSavedEvent,
23124
23184
  createVoiceResilienceRoutes,
@@ -23144,6 +23204,7 @@ export {
23144
23204
  createVoicePostgresReviewStore,
23145
23205
  createVoicePostgresIntegrationEventStore,
23146
23206
  createVoicePostgresExternalObjectMapStore,
23207
+ createVoicePostgresDeliverySink,
23147
23208
  createVoicePostgresCampaignStore,
23148
23209
  createVoicePostgresAuditSinkDeliveryStore,
23149
23210
  createVoicePostgresAuditEventStore,
@@ -23200,6 +23261,7 @@ export {
23200
23261
  createVoiceFileIntegrationEventStore,
23201
23262
  createVoiceFileExternalObjectMapStore,
23202
23263
  createVoiceFileEvalBaselineStore,
23264
+ createVoiceFileDeliverySink,
23203
23265
  createVoiceFileCampaignStore,
23204
23266
  createVoiceFileAuditSinkDeliveryStore,
23205
23267
  createVoiceFileAuditEventStore,
@@ -23211,6 +23273,8 @@ export {
23211
23273
  createVoiceDiagnosticsRoutes,
23212
23274
  createVoiceDemoReadyRoutes,
23213
23275
  createVoiceDeliverySinkRoutes,
23276
+ createVoiceDeliverySinkPair,
23277
+ createVoiceDeliverySinkDescriptor,
23214
23278
  createVoiceCampaignWorkerLoop,
23215
23279
  createVoiceCampaignWorker,
23216
23280
  createVoiceCampaignTelephonyOutcomeHandler,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.143",
3
+ "version": "0.0.22-beta.145",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",