@absolutejs/voice 0.0.22-beta.191 → 0.0.22-beta.193

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
@@ -21,6 +21,7 @@ Pick the path that matches what you are building:
21
21
 
22
22
  - Browser voice agent: mount `voice(...)`, choose an STT adapter, and use the React/Vue/Svelte/Angular/HTML/HTMX client helpers for mic, transcript, reconnect, and status UI.
23
23
  - Phone voice agent: mount Twilio, Telnyx, or Plivo routes, normalize carrier outcomes, inspect carrier readiness, and persist call lifecycle traces.
24
+ - Outbound campaigns: create self-hosted campaign queues, import CSV/JSON recipients, enforce rate limits/quiet hours/retry backoff, dry-run carrier dialers, and fail production readiness when campaign proof regresses.
24
25
  - Production readiness: mount the status and proof primitives you need, such as `createVoiceOpsStatusRoutes(...)`, `createVoiceProductionReadinessRoutes(...)`, quality routes, trace routes, eval routes, and smoke contracts.
25
26
  - Provider routing and fallback: use LLM/STT/TTS provider routers, provider health, provider simulation controls, and cost/latency-aware routing policies.
26
27
  - Evals and simulation: mount `createVoiceSimulationSuiteRoutes(...)` to run scenario fixtures, workflow contracts, tool contracts, outcome contracts, baseline comparisons, and saved benchmark artifacts before live traffic.
@@ -240,7 +241,7 @@ app.use(
240
241
  Built-in profiles:
241
242
 
242
243
  - `meeting-recorder`: live latency, session health, provider fallback, routing contracts, reconnect proof, and barge-in interruption proof.
243
- - `phone-agent`: carrier readiness, phone-agent smoke proof, handoffs, provider routing contracts, audit/trace delivery health, and delivery runtime proof.
244
+ - `phone-agent`: carrier readiness, phone-agent smoke proof, campaign readiness proof, handoffs, provider routing contracts, audit/trace delivery health, and delivery runtime proof.
244
245
  - `ops-heavy`: audit evidence, operator action history, audit/trace delivery health, delivery runtime proof, and deploy-gate support.
245
246
 
246
247
  Phone-agent fast path:
@@ -250,6 +251,10 @@ app.use(
250
251
  createVoiceProductionReadinessRoutes({
251
252
  ...createVoiceReadinessProfile('phone-agent', {
252
253
  auditDeliveries: runtime.auditDeliveries,
254
+ campaignReadiness: () =>
255
+ runVoiceCampaignReadinessProof({
256
+ store: runtime.campaigns
257
+ }),
253
258
  carriers: loadCarrierMatrixInputs,
254
259
  deliveryRuntime,
255
260
  explain: true,
@@ -443,6 +448,112 @@ app.use(
443
448
 
444
449
  The suite rolls up session quality, scenario evals, fixture simulations, tool contracts, and outcome contracts into one pass/fail report. It is the code-owned equivalent of "test this voice flow before production" without requiring a hosted voice-agent dashboard.
445
450
 
451
+ ## Self-Hosted Campaigns
452
+
453
+ Use `createVoiceCampaignRoutes(...)` when you need Retell/Bland-style outbound campaign primitives without giving a hosted dialer ownership of recipients, attempts, outcomes, or readiness proof.
454
+
455
+ ```ts
456
+ import {
457
+ createVoiceCampaignRoutes,
458
+ createVoiceProductionReadinessRoutes,
459
+ createVoiceReadinessProfile,
460
+ createVoiceSQLiteCampaignStore,
461
+ runVoiceCampaignReadinessProof
462
+ } from '@absolutejs/voice';
463
+
464
+ const campaigns = createVoiceSQLiteCampaignStore({
465
+ path: '.voice-runtime/campaigns.sqlite'
466
+ });
467
+
468
+ app.use(
469
+ createVoiceCampaignRoutes({
470
+ htmlPath: '/voice/campaigns',
471
+ path: '/api/voice/campaigns',
472
+ store: campaigns,
473
+ title: 'Outbound Campaigns'
474
+ })
475
+ );
476
+ ```
477
+
478
+ The campaign runtime gives you explicit primitives instead of a campaign app kit:
479
+
480
+ - `importVoiceCampaignRecipients(...)`: validates CSV/JSON rows, phone numbers, consent, duplicates, variables, and metadata.
481
+ - `VoiceCampaignRuntime.importRecipients(...)`: persists accepted recipients and returns rejected-row evidence.
482
+ - `tick(...)`: enforces campaign status, max concurrency, attempt windows, quiet hours, rolling rate limits, retry backoff, and `maxAttempts`.
483
+ - `pause(...)`, `resume(...)`, `cancel(...)`: operator-safe campaign controls.
484
+ - `applyVoiceCampaignTelephonyOutcome(...)`: maps Twilio/Telnyx/Plivo webhook decisions back into campaign attempts.
485
+ - `buildVoiceCampaignObservabilityReport(...)`: queue depth, active attempts, leases, attempt rates, failures, and stuck work.
486
+
487
+ Import recipients through the route API:
488
+
489
+ ```ts
490
+ await fetch('/api/voice/campaigns/campaign-1/recipients/import', {
491
+ body: JSON.stringify({
492
+ csv: `id,name,phone,consent,segment
493
+ recipient-1,Ada,+15550001001,yes,trial
494
+ recipient-2,Grace,+15550001002,true,enterprise`,
495
+ requireConsent: true,
496
+ variableColumns: ['segment']
497
+ }),
498
+ headers: {
499
+ 'content-type': 'application/json'
500
+ },
501
+ method: 'POST'
502
+ });
503
+ ```
504
+
505
+ Create campaigns with scheduling controls:
506
+
507
+ ```ts
508
+ await runtime.create({
509
+ maxAttempts: 3,
510
+ maxConcurrentAttempts: 10,
511
+ name: 'Renewal outreach',
512
+ schedule: {
513
+ attemptWindow: { startHour: 9, endHour: 17 },
514
+ quietHours: { startHour: 12, endHour: 13 },
515
+ rateLimit: { maxAttempts: 60, windowMs: 60_000 },
516
+ retryPolicy: { backoffMs: [5 * 60_000, 30 * 60_000] }
517
+ }
518
+ });
519
+ ```
520
+
521
+ Certify the campaign path without live carrier traffic:
522
+
523
+ ```ts
524
+ const campaignReadiness = await runVoiceCampaignReadinessProof({
525
+ store: campaigns
526
+ });
527
+
528
+ if (!campaignReadiness.ok) {
529
+ throw new Error(
530
+ campaignReadiness.checks
531
+ .filter((check) => check.status !== 'pass')
532
+ .map((check) => check.name)
533
+ .join('\n')
534
+ );
535
+ }
536
+ ```
537
+
538
+ Pass that proof into production readiness so campaign regressions block deploys:
539
+
540
+ ```ts
541
+ app.use(
542
+ createVoiceProductionReadinessRoutes({
543
+ ...createVoiceReadinessProfile('phone-agent', {
544
+ campaignReadiness: () =>
545
+ runVoiceCampaignReadinessProof({
546
+ store: campaigns
547
+ }),
548
+ explain: true
549
+ }),
550
+ store: runtime.traces
551
+ })
552
+ );
553
+ ```
554
+
555
+ For carrier-specific outbound dialing, use `createVoiceTwilioCampaignDialer(...)`, `createVoiceTelnyxCampaignDialer(...)`, or `createVoicePlivoCampaignDialer(...)` as the campaign `dialer`. `runVoiceCampaignDialerProof(...)` dry-runs those provider requests with intercepted fetch calls and synthetic webhook outcomes, so you can prove metadata and outcome application before a real campaign sends traffic.
556
+
446
557
  ## Phone Voice Agent In 20 Minutes
447
558
 
448
559
  Use `createVoicePhoneAgent(...)` when the agent needs to answer or place calls through your own Twilio, Telnyx, or Plivo account. This is the self-hosted alternative to a hosted phone-agent dashboard: your app owns the carrier routes, stream URLs, webhooks, traces, readiness checks, and lifecycle outcomes.
package/dist/agent.d.ts CHANGED
@@ -103,6 +103,7 @@ export type VoiceAgent<TContext = unknown, TSession extends VoiceSessionRecord =
103
103
  context: TContext;
104
104
  messages?: VoiceAgentMessage[];
105
105
  session: TSession;
106
+ system?: string;
106
107
  turn: VoiceTurnRecord;
107
108
  }) => Promise<VoiceAgentRunResult<TResult>>;
108
109
  };
@@ -6,6 +6,6 @@ export declare class VoiceLiveOpsService {
6
6
  isRunning: import("@angular/core").Signal<boolean>;
7
7
  lastResult: import("@angular/core").Signal<VoiceLiveOpsActionResult | undefined>;
8
8
  run: (input: import("..").VoiceLiveOpsActionInput) => Promise<VoiceLiveOpsActionResult | undefined>;
9
- runningAction: import("@angular/core").Signal<"escalate" | "assign" | "create-task" | "force-handoff" | "inject-instruction" | "operator-takeover" | "pause-assistant" | "resume-assistant" | "tag" | undefined>;
9
+ runningAction: import("@angular/core").Signal<"assign" | "create-task" | "escalate" | "force-handoff" | "inject-instruction" | "operator-takeover" | "pause-assistant" | "resume-assistant" | "tag" | undefined>;
10
10
  };
11
11
  }
@@ -4,6 +4,26 @@ import type { VoiceTelephonyOutcomeDecision, VoiceTelephonyOutcomeProviderEvent,
4
4
  export type VoiceCampaignStatus = 'canceled' | 'completed' | 'draft' | 'paused' | 'running';
5
5
  export type VoiceCampaignRecipientStatus = 'canceled' | 'completed' | 'failed' | 'pending' | 'queued';
6
6
  export type VoiceCampaignAttemptStatus = 'canceled' | 'failed' | 'queued' | 'running' | 'succeeded';
7
+ export type VoiceCampaignTimeWindow = {
8
+ daysOfWeek?: number[];
9
+ endHour: number;
10
+ startHour: number;
11
+ timeZoneOffsetMinutes?: number;
12
+ };
13
+ export type VoiceCampaignRateLimit = {
14
+ maxAttempts: number;
15
+ windowMs: number;
16
+ };
17
+ export type VoiceCampaignRetryPolicy = {
18
+ backoffMs?: number | number[];
19
+ maxBackoffMs?: number;
20
+ };
21
+ export type VoiceCampaignSchedule = {
22
+ attemptWindow?: VoiceCampaignTimeWindow;
23
+ quietHours?: VoiceCampaignTimeWindow;
24
+ rateLimit?: VoiceCampaignRateLimit;
25
+ retryPolicy?: VoiceCampaignRetryPolicy;
26
+ };
7
27
  export type VoiceCampaignRecipient = {
8
28
  attempts: number;
9
29
  completedAt?: number;
@@ -38,6 +58,7 @@ export type VoiceCampaign = {
38
58
  maxConcurrentAttempts: number;
39
59
  metadata?: Record<string, unknown>;
40
60
  name: string;
61
+ schedule?: VoiceCampaignSchedule;
41
62
  status: VoiceCampaignStatus;
42
63
  updatedAt: number;
43
64
  };
@@ -70,6 +91,7 @@ export type VoiceCampaignCreateInput = {
70
91
  maxConcurrentAttempts?: number;
71
92
  metadata?: Record<string, unknown>;
72
93
  name: string;
94
+ schedule?: VoiceCampaignSchedule;
73
95
  };
74
96
  export type VoiceCampaignRecipientInput = {
75
97
  id?: string;
@@ -78,6 +100,32 @@ export type VoiceCampaignRecipientInput = {
78
100
  phone: string;
79
101
  variables?: VoiceCampaignRecipient['variables'];
80
102
  };
103
+ export type VoiceCampaignRecipientImportRow = Record<string, unknown>;
104
+ export type VoiceCampaignRecipientImportIssueCode = 'duplicate' | 'missing-consent' | 'missing-phone' | 'invalid-phone';
105
+ export type VoiceCampaignRecipientImportIssue = {
106
+ code: VoiceCampaignRecipientImportIssueCode;
107
+ message: string;
108
+ row: number;
109
+ value?: unknown;
110
+ };
111
+ export type VoiceCampaignRecipientImportOptions = {
112
+ consentColumn?: string;
113
+ csv?: string;
114
+ dedupe?: boolean;
115
+ idColumn?: string;
116
+ metadataColumns?: string[];
117
+ nameColumn?: string;
118
+ phoneColumn?: string;
119
+ requireConsent?: boolean;
120
+ rows?: VoiceCampaignRecipientImportRow[];
121
+ variableColumns?: string[];
122
+ };
123
+ export type VoiceCampaignRecipientImportResult = {
124
+ accepted: VoiceCampaignRecipientInput[];
125
+ duplicates: number;
126
+ rejected: VoiceCampaignRecipientImportIssue[];
127
+ total: number;
128
+ };
81
129
  export type VoiceCampaignAttemptResultInput = {
82
130
  error?: string;
83
131
  externalCallId?: string;
@@ -86,6 +134,11 @@ export type VoiceCampaignAttemptResultInput = {
86
134
  };
87
135
  export type VoiceCampaignTickResult = {
88
136
  attempted: number;
137
+ blocked: Array<{
138
+ reason: 'outside-attempt-window' | 'quiet-hours' | 'rate-limit' | 'retry-backoff';
139
+ recipientId?: string;
140
+ until?: number;
141
+ }>;
89
142
  campaignId: string;
90
143
  errors: Array<{
91
144
  error: string;
@@ -109,6 +162,34 @@ export type VoiceCampaignProofReport = {
109
162
  summary: VoiceCampaignSummary;
110
163
  tick: VoiceCampaignTickResult;
111
164
  };
165
+ export type VoiceCampaignReadinessCheck = {
166
+ details?: Record<string, unknown>;
167
+ name: string;
168
+ status: 'fail' | 'pass';
169
+ };
170
+ export type VoiceCampaignReadinessProofOptions = {
171
+ store?: VoiceCampaignStore;
172
+ };
173
+ export type VoiceCampaignReadinessProofReport = {
174
+ campaigns: {
175
+ retry: VoiceCampaignRecord;
176
+ scheduled: VoiceCampaignRecord;
177
+ };
178
+ checks: VoiceCampaignReadinessCheck[];
179
+ generatedAt: number;
180
+ import: VoiceCampaignRecipientImportResult;
181
+ ok: boolean;
182
+ proof: 'voice-campaign-readiness';
183
+ ticks: {
184
+ allowed: VoiceCampaignTickResult;
185
+ quietHours: VoiceCampaignTickResult;
186
+ rateLimited: VoiceCampaignTickResult;
187
+ retryAllowed: VoiceCampaignTickResult;
188
+ retryBackoff: VoiceCampaignTickResult;
189
+ retryInitial: VoiceCampaignTickResult;
190
+ windowBlocked: VoiceCampaignTickResult;
191
+ };
192
+ };
112
193
  export type VoiceCampaignSummary = {
113
194
  attempts: {
114
195
  failed: number;
@@ -136,6 +217,7 @@ export type VoiceCampaignSummary = {
136
217
  };
137
218
  export type VoiceCampaignRuntimeOptions = {
138
219
  dialer?: VoiceCampaignDialer;
220
+ now?: () => number;
139
221
  store: VoiceCampaignStore;
140
222
  };
141
223
  export type VoiceCampaignRuntime = {
@@ -145,6 +227,9 @@ export type VoiceCampaignRuntime = {
145
227
  create: (input: VoiceCampaignCreateInput) => Promise<VoiceCampaignRecord>;
146
228
  enqueue: (campaignId: string) => Promise<VoiceCampaignRecord>;
147
229
  get: (campaignId: string) => Promise<VoiceCampaignRecord | undefined>;
230
+ importRecipients: (campaignId: string, input: VoiceCampaignRecipientImportOptions) => Promise<VoiceCampaignRecord & {
231
+ import: VoiceCampaignRecipientImportResult;
232
+ }>;
148
233
  list: () => Promise<VoiceCampaignRecord[]>;
149
234
  pause: (campaignId: string) => Promise<VoiceCampaignRecord>;
150
235
  remove: (campaignId: string) => Promise<void>;
@@ -279,6 +364,7 @@ export type VoiceCampaignTelephonyOutcomeResult = {
279
364
  status?: 'failed' | 'succeeded';
280
365
  attemptId?: string;
281
366
  };
367
+ export declare const importVoiceCampaignRecipients: (options: VoiceCampaignRecipientImportOptions) => VoiceCampaignRecipientImportResult;
282
368
  export declare const createVoiceMemoryCampaignStore: () => VoiceCampaignStore;
283
369
  export declare const summarizeVoiceCampaigns: (records: VoiceCampaignRecord[]) => VoiceCampaignSummary;
284
370
  export declare const buildVoiceCampaignObservabilityReport: (records: VoiceCampaignRecord[], options?: VoiceCampaignObservabilityOptions) => Promise<VoiceCampaignObservabilityReport>;
@@ -288,6 +374,7 @@ export declare const createVoiceCampaignWorkerLoop: (options: VoiceCampaignWorke
288
374
  export declare const applyVoiceCampaignTelephonyOutcome: <TResult = unknown>(input: VoiceCampaignTelephonyOutcomeInput<TResult>, options?: VoiceCampaignTelephonyOutcomeOptions<TResult>) => Promise<VoiceCampaignTelephonyOutcomeResult>;
289
375
  export declare const createVoiceCampaignTelephonyOutcomeHandler: <TResult = unknown>(options: VoiceCampaignTelephonyOutcomeOptions<TResult>) => (input: VoiceTelephonyWebhookDecision<TResult>) => Promise<VoiceCampaignTelephonyOutcomeResult>;
290
376
  export declare const runVoiceCampaignProof: (options?: VoiceCampaignProofOptions) => Promise<VoiceCampaignProofReport>;
377
+ export declare const runVoiceCampaignReadinessProof: (options?: VoiceCampaignReadinessProofOptions) => Promise<VoiceCampaignReadinessProofReport>;
291
378
  export declare const renderVoiceCampaignsHTML: (records: VoiceCampaignRecord[], options?: {
292
379
  title?: string;
293
380
  }) => string;
@@ -338,6 +425,20 @@ export declare const createVoiceCampaignRoutes: (options: VoiceCampaignRoutesOpt
338
425
  };
339
426
  };
340
427
  };
428
+ } & {
429
+ [x: string]: {
430
+ "readiness-proof": {
431
+ get: {
432
+ body: unknown;
433
+ params: {};
434
+ query: unknown;
435
+ headers: unknown;
436
+ response: {
437
+ 200: VoiceCampaignReadinessProofReport;
438
+ };
439
+ };
440
+ };
441
+ };
341
442
  } & {
342
443
  [x: string]: {
343
444
  post: {
@@ -428,6 +529,37 @@ export declare const createVoiceCampaignRoutes: (options: VoiceCampaignRoutesOpt
428
529
  };
429
530
  };
430
531
  };
532
+ } & {
533
+ [x: string]: {
534
+ ":campaignId": {
535
+ recipients: {
536
+ import: {
537
+ post: {
538
+ body: unknown;
539
+ params: {
540
+ campaignId: string;
541
+ } & {};
542
+ query: unknown;
543
+ headers: unknown;
544
+ response: {
545
+ 200: VoiceCampaignRecord & {
546
+ import: VoiceCampaignRecipientImportResult;
547
+ };
548
+ 422: {
549
+ type: "validation";
550
+ on: string;
551
+ summary?: string;
552
+ message?: string;
553
+ found?: unknown;
554
+ property?: string;
555
+ expected?: string;
556
+ };
557
+ };
558
+ };
559
+ };
560
+ };
561
+ };
562
+ };
431
563
  } & {
432
564
  [x: string]: {
433
565
  ":campaignId": {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { voice } from './plugin';
2
- export { applyVoiceCampaignTelephonyOutcome, buildVoiceCampaignObservabilityReport, createVoiceCampaignTelephonyOutcomeHandler, createVoiceCampaign, createVoiceCampaignRoutes, createVoiceCampaignWorker, createVoiceCampaignWorkerLoop, createVoiceMemoryCampaignStore, renderVoiceCampaignObservabilityHTML, renderVoiceCampaignsHTML, runVoiceCampaignProof, summarizeVoiceCampaigns } from './campaign';
2
+ export { applyVoiceCampaignTelephonyOutcome, buildVoiceCampaignObservabilityReport, createVoiceCampaignTelephonyOutcomeHandler, createVoiceCampaign, createVoiceCampaignRoutes, createVoiceCampaignWorker, createVoiceCampaignWorkerLoop, createVoiceMemoryCampaignStore, importVoiceCampaignRecipients, renderVoiceCampaignObservabilityHTML, renderVoiceCampaignsHTML, runVoiceCampaignProof, runVoiceCampaignReadinessProof, summarizeVoiceCampaigns } from './campaign';
3
3
  export { createVoicePlivoCampaignDialer, createVoiceTelnyxCampaignDialer, createVoiceTwilioCampaignDialer, getVoiceCampaignDialerProofStatus, runVoiceCampaignDialerProof } from './campaignDialers';
4
4
  export { createVoiceAssistant, createVoiceExperiment, summarizeVoiceAssistantRuns } from './assistant';
5
5
  export { createVoiceAssistantHealthHTMLHandler, createVoiceAssistantHealthJSONHandler, createVoiceAssistantHealthRoutes, renderVoiceAssistantHealthHTML, summarizeVoiceAssistantHealth } from './assistantHealth';
@@ -33,6 +33,7 @@ export { createVoiceToolIdempotencyKey, createVoiceToolRuntime } from './toolRun
33
33
  export { createVoiceToolContract, createVoiceToolContractHTMLHandler, createVoiceToolContractJSONHandler, createVoiceToolContractRoutes, createVoiceToolRuntimeContractDefaults, renderVoiceToolContractHTML, runVoiceToolContractSuite, runVoiceToolContract } from './toolContract';
34
34
  export { createVoiceTurnLatencyHTMLHandler, createVoiceTurnLatencyJSONHandler, createVoiceTurnLatencyRoutes, renderVoiceTurnLatencyHTML, summarizeVoiceTurnLatency } from './turnLatency';
35
35
  export { createVoiceLiveLatencyRoutes, renderVoiceLiveLatencyHTML, summarizeVoiceLiveLatency } from './liveLatency';
36
+ export { assertVoiceLatencySLOGate, buildVoiceLatencySLOGate, renderVoiceLatencySLOMarkdown } from './latencySlo';
36
37
  export { createVoiceTurnQualityHTMLHandler, createVoiceTurnQualityJSONHandler, createVoiceTurnQualityRoutes, renderVoiceTurnQualityHTML, summarizeVoiceTurnQuality } from './turnQuality';
37
38
  export { createVoiceOutcomeContractHTMLHandler, createVoiceOutcomeContractJSONHandler, createVoiceOutcomeContractRoutes, renderVoiceOutcomeContractHTML, runVoiceOutcomeContractSuite } from './outcomeContract';
38
39
  export { applyVoiceTelephonyOutcome, createMemoryVoiceTelephonyWebhookIdempotencyStore, createVoiceTelephonyOutcomePolicy, createVoiceTelephonyWebhookHandler, createVoiceTelephonyWebhookRoutes, parseVoiceTelephonyWebhookEvent, resolveVoiceTelephonyOutcome, signVoiceTwilioWebhook, verifyVoiceTwilioWebhookSignature, voiceTelephonyOutcomeToRouteResult } from './telephonyOutcome';
@@ -82,7 +83,7 @@ export { conditionAudioChunk, resolveAudioConditioningConfig } from './audioCond
82
83
  export { resolveVoiceRuntimePreset } from './presets';
83
84
  export { resolveTurnDetectionConfig, TURN_PROFILE_DEFAULTS } from './turnProfiles';
84
85
  export { createVoiceCallReviewFromLiveTelephonyReport, createVoiceCallReviewRecorder, renderVoiceCallReviewHTML, renderVoiceCallReviewMarkdown } from './testing/review';
85
- export type { VoiceCampaign, VoiceCampaignAttempt, VoiceCampaignAttemptResultInput, VoiceCampaignAttemptStatus, VoiceCampaignCreateInput, VoiceCampaignDialer, VoiceCampaignDialerInput, VoiceCampaignDialerResult, VoiceCampaignProofOptions, VoiceCampaignProofReport, VoiceCampaignRecipient, VoiceCampaignRecipientInput, VoiceCampaignRecipientStatus, VoiceCampaignRecord, VoiceCampaignRoutesOptions, VoiceCampaignRuntime, VoiceCampaignRuntimeOptions, VoiceCampaignStatus, VoiceCampaignStore, VoiceCampaignSummary, VoiceCampaignTickResult } from './campaign';
86
+ export type { VoiceCampaign, VoiceCampaignAttempt, VoiceCampaignAttemptResultInput, VoiceCampaignAttemptStatus, VoiceCampaignCreateInput, VoiceCampaignDialer, VoiceCampaignDialerInput, VoiceCampaignDialerResult, VoiceCampaignProofOptions, VoiceCampaignProofReport, VoiceCampaignReadinessCheck, VoiceCampaignReadinessProofOptions, VoiceCampaignReadinessProofReport, VoiceCampaignRecipient, VoiceCampaignRecipientImportIssue, VoiceCampaignRecipientImportIssueCode, VoiceCampaignRecipientImportOptions, VoiceCampaignRecipientImportResult, VoiceCampaignRecipientImportRow, VoiceCampaignRecipientInput, VoiceCampaignRecipientStatus, VoiceCampaignRecord, VoiceCampaignRoutesOptions, VoiceCampaignRuntime, VoiceCampaignRuntimeOptions, VoiceCampaignRateLimit, VoiceCampaignRetryPolicy, VoiceCampaignSchedule, VoiceCampaignStatus, VoiceCampaignStore, VoiceCampaignSummary, VoiceCampaignTimeWindow, VoiceCampaignTickResult } from './campaign';
86
87
  export type { VoiceCampaignDialerProofCarrierRequest, VoiceCampaignDialerProofOptions, VoiceCampaignDialerProofProvider, VoiceCampaignDialerProofProviderResult, VoiceCampaignDialerProofReport, VoiceCampaignDialerProofStatus, VoicePlivoCampaignDialerOptions, VoiceTelnyxCampaignDialerOptions, VoiceTwilioCampaignDialerOptions } from './campaignDialers';
87
88
  export type { VoiceBargeInReport, VoiceBargeInRoutesOptions } from './bargeInRoutes';
88
89
  export type { VoiceAssistant, VoiceAssistantArtifactPlan, VoiceAssistantExperiment, VoiceAssistantExperimentOptions, VoiceAssistantGuardrailInput, VoiceAssistantGuardrails, VoiceAssistantMemoryLifecycle, VoiceAssistantMemoryLifecycleInput, VoiceAssistantOptions, VoiceAssistantOutputGuardrailInput, VoiceAssistantPreset, VoiceAssistantRunsSummary, VoiceAssistantRunSummary, VoiceAssistantVariant } from './assistant';
@@ -101,6 +102,7 @@ export type { VoiceProviderCapabilityDefinition, VoiceProviderCapabilityHandlerO
101
102
  export type { VoiceProviderRoutingContractDefinition, VoiceProviderRoutingContractIssue, VoiceProviderRoutingContractReport, VoiceProviderRoutingContractRunOptions, VoiceProviderRoutingExpectation, VoiceProviderRoutingStatus } from './providerRoutingContract';
102
103
  export type { VoiceTurnLatencyHTMLHandlerOptions, VoiceTurnLatencyItem, VoiceTurnLatencyOptions, VoiceTurnLatencyReport, VoiceTurnLatencyRoutesOptions, VoiceTurnLatencyStage, VoiceTurnLatencyStatus } from './turnLatency';
103
104
  export type { VoiceLiveLatencyOptions, VoiceLiveLatencyReport, VoiceLiveLatencyRoutesOptions, VoiceLiveLatencySample, VoiceLiveLatencyStatus } from './liveLatency';
105
+ export type { VoiceLatencySLOBudget, VoiceLatencySLOGateError, VoiceLatencySLOGateOptions, VoiceLatencySLOGateReport, VoiceLatencySLOMeasurement, VoiceLatencySLOStage, VoiceLatencySLOStageSummary, VoiceLatencySLOStatus } from './latencySlo';
104
106
  export type { VoiceTurnQualityHTMLHandlerOptions, VoiceTurnQualityItem, VoiceTurnQualityOptions, VoiceTurnQualityReport, VoiceTurnQualityRoutesOptions, VoiceTurnQualityStatus } from './turnQuality';
105
107
  export type { VoiceOutcomeContractDefinition, VoiceOutcomeContractHTMLHandlerOptions, VoiceOutcomeContractIssue, VoiceOutcomeContractOptions, VoiceOutcomeContractReport, VoiceOutcomeContractRoutesOptions, VoiceOutcomeContractStatus, VoiceOutcomeContractSuiteReport } from './outcomeContract';
106
108
  export type { VoiceTelephonyOutcomeAction, VoiceTelephonyOutcomeDecision, VoiceTelephonyOutcomePolicy, VoiceTelephonyOutcomeProviderEvent, VoiceTelephonyOutcomeRouteResult, VoiceTelephonyOutcomeStatusDecision, VoiceTelephonyWebhookDecision, VoiceTelephonyWebhookHandlerOptions, VoiceTelephonyWebhookIdempotencyStore, VoiceTelephonyWebhookParseInput, VoiceTelephonyWebhookProvider, VoiceTelephonyWebhookRoutesOptions, VoiceTelephonyWebhookVerificationResult, StoredVoiceTelephonyWebhookDecision } from './telephonyOutcome';
@@ -111,7 +113,7 @@ export type { VoiceOpsStatus, VoiceOpsStatusLink, VoiceOpsStatusOptions, VoiceOp
111
113
  export type { VoiceProductionReadinessAction, VoiceProductionReadinessAuditOptions, VoiceProductionReadinessAuditRequirement, VoiceProductionReadinessAuditSummary, VoiceProductionReadinessCheck, VoiceProductionReadinessGateIssue, VoiceProductionReadinessGateOptions, VoiceProductionReadinessGateProfile, VoiceProductionReadinessGateProfileSurface, VoiceProductionReadinessGateReport, VoiceProductionReadinessOpsActionHistoryOptions, VoiceProductionReadinessOpsActionHistorySummary, VoiceProductionReadinessOperationsRecordLink, VoiceProductionReadinessOperationsRecordLinks, VoiceProductionReadinessProfileExplanation, VoiceProductionReadinessProfileSurface, VoiceProductionReadinessProofSource, VoiceProductionReadinessReport, VoiceProductionReadinessRoutesOptions, VoiceProductionReadinessTraceDeliverySummary, VoiceProductionReadinessAuditDeliveryOptions, VoiceProductionReadinessAuditDeliverySummary, VoiceProductionReadinessTraceDeliveryOptions, VoiceProductionReadinessStatus } from './productionReadiness';
112
114
  export type { VoiceReadinessProfileName, VoiceReadinessProfileOptions, VoiceReadinessProfileRecommendation, VoiceReadinessProfileRecommendationScore, VoiceReadinessProfileRoutesOptions } from './readinessProfiles';
113
115
  export type { VoiceProviderStackChoice, VoiceProviderStackCapabilities, VoiceProviderStackCapabilityGap, VoiceProviderStackCapabilityGapInput, VoiceProviderStackCapabilityGapReport, VoiceProviderContractCheck, VoiceProviderContractCheckStatus, VoiceProviderContractDefinition, VoiceProviderContractMatrixHandlerOptions, VoiceProviderContractMatrixHTMLHandlerOptions, VoiceProviderContractMatrixInput, VoiceProviderContractMatrixPresetOptions, VoiceProviderContractMatrixReport, VoiceProviderContractMatrixRoutesOptions, VoiceProviderContractMatrixRow, VoiceProviderStackInput, VoiceProviderStackKind, VoiceProviderStackRecommendation } from './providerStackRecommendations';
114
- export type { VoiceOperationsRecord, VoiceOperationsRecordAgentHandoff, VoiceOperationsRecordAuditSummary, VoiceOperationsRecordOptions, VoiceOperationsRecordOutcome, VoiceOperationsRecordRoutesOptions, VoiceOperationsRecordStatus, VoiceOperationsRecordTool } from './operationsRecord';
116
+ export type { VoiceOperationsRecord, VoiceOperationsRecordAgentHandoff, VoiceOperationsRecordAuditSummary, VoiceOperationsRecordIntegrationEventSummary, VoiceOperationsRecordOptions, VoiceOperationsRecordOutcome, VoiceOperationsRecordReviewSummary, VoiceOperationsRecordRoutesOptions, VoiceOperationsRecordStatus, VoiceOperationsRecordTaskSummary, VoiceOperationsRecordTool } from './operationsRecord';
115
117
  export type { StoredVoiceIncidentBundleArtifact, VoiceIncidentBundle, VoiceIncidentBundleArtifactOptions, VoiceIncidentBundleFormat, VoiceIncidentBundleOptions, VoiceIncidentBundleRetentionOptions, VoiceIncidentBundleRetentionReport, VoiceIncidentBundleRoutesOptions, VoiceIncidentBundleStore, VoiceIncidentBundleStoreFilter, VoiceIncidentBundleSummary } from './incidentBundle';
116
118
  export type { VoiceQualityLink, VoiceQualityMetric, VoiceQualityReport, VoiceQualityRoutesOptions, VoiceQualityStatus, VoiceQualityThresholds } from './qualityRoutes';
117
119
  export type { VoiceResilienceIOSimulator, VoiceResilienceLink, VoiceResiliencePageData, VoiceResilienceRoutesOptions, VoiceResilienceSimulationProvider, VoiceRoutingKindSummary, VoiceRoutingDecisionSummary, VoiceRoutingDecisionSummaryOptions, VoiceRoutingEvent, VoiceRoutingEventKind, VoiceRoutingSessionSummary, VoiceRoutingSessionSummaryOptions } from './resilienceRoutes';