@absolutejs/voice 0.0.22-beta.60 → 0.0.22-beta.61

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.
@@ -0,0 +1,10 @@
1
+ import { type VoiceProviderSimulationControlsOptions } from '../client/providerSimulationControls';
2
+ export declare const useVoiceProviderSimulationControls: <TProvider extends string = string>(options: VoiceProviderSimulationControlsOptions<TProvider>) => {
3
+ run: (provider: TProvider, mode: import("../testing").VoiceIOProviderFailureSimulationMode) => Promise<import("../testing").VoiceIOProviderFailureSimulationResult<TProvider> | null>;
4
+ error: string | null;
5
+ isRunning: boolean;
6
+ lastResult: import("../testing").VoiceIOProviderFailureSimulationResult<TProvider> | null;
7
+ mode: import("../testing").VoiceIOProviderFailureSimulationMode | null;
8
+ provider: TProvider | null;
9
+ updatedAt?: number;
10
+ };
@@ -0,0 +1,11 @@
1
+ import type { VoiceProviderSimulationControlsOptions } from '../client/providerSimulationControls';
2
+ export declare const createVoiceProviderSimulationControls: <TProvider extends string = string>(options: VoiceProviderSimulationControlsOptions<TProvider>) => {
3
+ bind: (element: Element) => () => void;
4
+ getHTML: () => string;
5
+ getViewModel: () => import("../client").VoiceProviderSimulationControlsViewModel<TProvider>;
6
+ close: () => void;
7
+ getServerSnapshot: () => import("../client").VoiceProviderSimulationControlsSnapshot<TProvider>;
8
+ getSnapshot: () => import("../client").VoiceProviderSimulationControlsSnapshot<TProvider>;
9
+ run: (provider: TProvider, mode: import("../testing").VoiceIOProviderFailureSimulationMode) => Promise<import("../testing").VoiceIOProviderFailureSimulationResult<TProvider> | null>;
10
+ subscribe: (listener: () => void) => () => void;
11
+ };
@@ -1,5 +1,6 @@
1
1
  export { createVoiceAppKitStatus } from './createVoiceAppKitStatus';
2
2
  export { createVoiceOpsStatus } from './createVoiceOpsStatus';
3
+ export { createVoiceProviderSimulationControls } from './createVoiceProviderSimulationControls';
3
4
  export { createVoiceStream } from './createVoiceStream';
4
5
  export { createVoiceProviderStatus } from './createVoiceProviderStatus';
5
6
  export { createVoiceRoutingStatus } from './createVoiceRoutingStatus';
@@ -287,6 +287,192 @@ var createVoiceOpsStatus = (path = "/app-kit/status", options = {}) => {
287
287
  subscribe: store.subscribe
288
288
  };
289
289
  };
290
+ // src/client/providerSimulationControls.ts
291
+ var postSimulation = async (pathPrefix, mode, provider, fetchImpl) => {
292
+ const response = await fetchImpl(`${pathPrefix}/${mode}?provider=${encodeURIComponent(provider)}`, { method: "POST" });
293
+ const body = await response.json().catch(() => null);
294
+ if (!response.ok) {
295
+ const message = body && typeof body === "object" && "error" in body ? String(body.error) : `Voice provider simulation failed: HTTP ${response.status}`;
296
+ throw new Error(message);
297
+ }
298
+ return body;
299
+ };
300
+ var createVoiceProviderSimulationControlsStore = (options) => {
301
+ const listeners = new Set;
302
+ const fetchImpl = options.fetch ?? globalThis.fetch;
303
+ const pathPrefix = options.pathPrefix ?? `/api/${options.kind ?? "stt"}-simulate`;
304
+ let closed = false;
305
+ let snapshot = {
306
+ error: null,
307
+ isRunning: false,
308
+ lastResult: null,
309
+ mode: null,
310
+ provider: null
311
+ };
312
+ const emit = () => {
313
+ for (const listener of listeners) {
314
+ listener();
315
+ }
316
+ };
317
+ const run = async (provider, mode) => {
318
+ if (closed) {
319
+ return snapshot.lastResult;
320
+ }
321
+ snapshot = {
322
+ ...snapshot,
323
+ error: null,
324
+ isRunning: true,
325
+ mode,
326
+ provider
327
+ };
328
+ emit();
329
+ try {
330
+ const result = await postSimulation(pathPrefix, mode, provider, fetchImpl);
331
+ snapshot = {
332
+ error: null,
333
+ isRunning: false,
334
+ lastResult: result,
335
+ mode,
336
+ provider,
337
+ updatedAt: Date.now()
338
+ };
339
+ emit();
340
+ return result;
341
+ } catch (error) {
342
+ snapshot = {
343
+ ...snapshot,
344
+ error: error instanceof Error ? error.message : String(error),
345
+ isRunning: false
346
+ };
347
+ emit();
348
+ throw error;
349
+ }
350
+ };
351
+ const close = () => {
352
+ closed = true;
353
+ listeners.clear();
354
+ };
355
+ return {
356
+ close,
357
+ getServerSnapshot: () => snapshot,
358
+ getSnapshot: () => snapshot,
359
+ run,
360
+ subscribe: (listener) => {
361
+ listeners.add(listener);
362
+ return () => {
363
+ listeners.delete(listener);
364
+ };
365
+ }
366
+ };
367
+ };
368
+
369
+ // src/client/providerSimulationControlsWidget.ts
370
+ var escapeHtml2 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
371
+ var formatKind = (kind) => (kind ?? "stt").toUpperCase();
372
+ var createVoiceProviderSimulationControlsViewModel = (snapshot, options) => {
373
+ const configuredProviders = options.providers.filter((provider) => provider.configured !== false);
374
+ const fallbackReady = !options.fallbackRequiredProvider || configuredProviders.some((entry) => entry.provider === options.fallbackRequiredProvider);
375
+ const failureProviders = (options.failureProviders ? options.failureProviders.map((provider) => ({ provider })) : configuredProviders).filter((provider) => configuredProviders.some((entry) => entry.provider === provider.provider));
376
+ return {
377
+ canSimulateFailure: configuredProviders.length > 0 && fallbackReady,
378
+ description: options.failureMessage ?? `Simulate ${formatKind(options.kind)} provider failure and recovery without changing credentials.`,
379
+ error: snapshot.error,
380
+ failureProviders,
381
+ isRunning: snapshot.isRunning,
382
+ label: snapshot.isRunning ? `Running ${snapshot.mode ?? "simulation"}` : snapshot.lastResult ? `${snapshot.lastResult.provider} ${snapshot.lastResult.mode} simulated` : configuredProviders.length ? `${configuredProviders.length} configured` : "No configured providers",
383
+ providers: configuredProviders,
384
+ resultText: snapshot.lastResult ? JSON.stringify(snapshot.lastResult, null, 2) : null,
385
+ title: options.title ?? `${formatKind(options.kind)} Failure Simulation`
386
+ };
387
+ };
388
+ var renderVoiceProviderSimulationControlsHTML = (snapshot, options) => {
389
+ const model = createVoiceProviderSimulationControlsViewModel(snapshot, options);
390
+ const failureButtons = model.failureProviders.map((provider) => `<button type="button" data-voice-provider-fail="${escapeHtml2(provider.provider)}"${!model.canSimulateFailure || snapshot.isRunning ? " disabled" : ""}>Simulate ${escapeHtml2(provider.provider)} ${escapeHtml2(formatKind(options.kind))} failure</button>`).join("");
391
+ const recoveryButtons = model.providers.map((provider) => `<button type="button" data-voice-provider-recover="${escapeHtml2(provider.provider)}"${snapshot.isRunning ? " disabled" : ""}>Mark ${escapeHtml2(provider.provider)} recovered</button>`).join("");
392
+ return `<section class="absolute-voice-provider-simulation absolute-voice-provider-simulation--${snapshot.error ? "error" : snapshot.isRunning ? "running" : "ready"}">
393
+ <header class="absolute-voice-provider-simulation__header">
394
+ <span class="absolute-voice-provider-simulation__eyebrow">${escapeHtml2(model.title)}</span>
395
+ <strong class="absolute-voice-provider-simulation__label">${escapeHtml2(model.label)}</strong>
396
+ </header>
397
+ <p class="absolute-voice-provider-simulation__description">${escapeHtml2(model.description)}</p>
398
+ ${model.canSimulateFailure ? "" : `<p class="absolute-voice-provider-simulation__empty">${escapeHtml2(options.fallbackRequiredMessage ?? "Configure fallback providers before simulating failure.")}</p>`}
399
+ <div class="absolute-voice-provider-simulation__actions">${failureButtons}${recoveryButtons}</div>
400
+ ${snapshot.error ? `<p class="absolute-voice-provider-simulation__error">${escapeHtml2(snapshot.error)}</p>` : ""}
401
+ ${model.resultText ? `<pre class="absolute-voice-provider-simulation__result">${escapeHtml2(model.resultText)}</pre>` : ""}
402
+ </section>`;
403
+ };
404
+ var bindVoiceProviderSimulationControls = (element, store) => {
405
+ const onClick = (event) => {
406
+ const target = event.target;
407
+ if (!(target instanceof HTMLElement)) {
408
+ return;
409
+ }
410
+ const failProvider = target.getAttribute("data-voice-provider-fail");
411
+ const recoverProvider = target.getAttribute("data-voice-provider-recover");
412
+ if (failProvider) {
413
+ store.run(failProvider, "failure").catch(() => {});
414
+ }
415
+ if (recoverProvider) {
416
+ store.run(recoverProvider, "recovery").catch(() => {});
417
+ }
418
+ };
419
+ element.addEventListener("click", onClick);
420
+ return () => element.removeEventListener("click", onClick);
421
+ };
422
+ var mountVoiceProviderSimulationControls = (element, options) => {
423
+ const store = createVoiceProviderSimulationControlsStore(options);
424
+ const render = () => {
425
+ element.innerHTML = renderVoiceProviderSimulationControlsHTML(store.getSnapshot(), options);
426
+ };
427
+ const unsubscribeStore = store.subscribe(render);
428
+ const unsubscribeDom = bindVoiceProviderSimulationControls(element, store);
429
+ render();
430
+ return {
431
+ close: () => {
432
+ unsubscribeDom();
433
+ unsubscribeStore();
434
+ store.close();
435
+ },
436
+ run: store.run
437
+ };
438
+ };
439
+ var defineVoiceProviderSimulationControlsElement = (tagName = "absolute-voice-provider-simulation") => {
440
+ if (typeof window === "undefined" || typeof customElements === "undefined" || customElements.get(tagName)) {
441
+ return;
442
+ }
443
+ customElements.define(tagName, class AbsoluteVoiceProviderSimulationElement extends HTMLElement {
444
+ mounted;
445
+ connectedCallback() {
446
+ const providers = (this.getAttribute("providers") ?? "").split(",").map((provider) => provider.trim()).filter(Boolean).map((provider) => ({ provider }));
447
+ const failureProviders = (this.getAttribute("failure-providers") ?? "").split(",").map((provider) => provider.trim()).filter(Boolean);
448
+ this.mounted = mountVoiceProviderSimulationControls(this, {
449
+ failureProviders: failureProviders.length ? failureProviders : undefined,
450
+ fallbackRequiredMessage: this.getAttribute("fallback-required-message") ?? undefined,
451
+ fallbackRequiredProvider: this.getAttribute("fallback-required-provider") ?? undefined,
452
+ failureMessage: this.getAttribute("failure-message") ?? undefined,
453
+ kind: this.getAttribute("kind") ?? "stt",
454
+ pathPrefix: this.getAttribute("path-prefix") ?? undefined,
455
+ providers,
456
+ title: this.getAttribute("title") ?? undefined
457
+ });
458
+ }
459
+ disconnectedCallback() {
460
+ this.mounted?.close();
461
+ this.mounted = undefined;
462
+ }
463
+ });
464
+ };
465
+
466
+ // src/svelte/createVoiceProviderSimulationControls.ts
467
+ var createVoiceProviderSimulationControls = (options) => {
468
+ const store = createVoiceProviderSimulationControlsStore(options);
469
+ return {
470
+ ...store,
471
+ bind: (element) => bindVoiceProviderSimulationControls(element, store),
472
+ getHTML: () => renderVoiceProviderSimulationControlsHTML(store.getSnapshot(), options),
473
+ getViewModel: () => createVoiceProviderSimulationControlsViewModel(store.getSnapshot(), options)
474
+ };
475
+ };
290
476
  // src/client/actions.ts
291
477
  var normalizeErrorMessage = (value) => {
292
478
  if (typeof value === "string" && value.trim()) {
@@ -885,7 +1071,7 @@ var createVoiceProviderStatusStore = (path = "/api/provider-status", options = {
885
1071
  // src/client/providerStatusWidget.ts
886
1072
  var DEFAULT_TITLE2 = "Voice Providers";
887
1073
  var DEFAULT_DESCRIPTION2 = "Live provider health, fallback counts, latency, and suppression state from your self-hosted trace store.";
888
- var escapeHtml2 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
1074
+ var escapeHtml3 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
889
1075
  var formatProvider = (provider) => provider.split(/[-_\s]+/).filter(Boolean).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ") || provider;
890
1076
  var formatStatus = (status) => status.split("-").map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join(" ");
891
1077
  var formatLatency = (value) => typeof value === "number" ? `${value}ms` : "No samples";
@@ -941,25 +1127,25 @@ var createVoiceProviderStatusViewModel = (snapshot, options = {}) => {
941
1127
  };
942
1128
  var renderVoiceProviderStatusHTML = (snapshot, options = {}) => {
943
1129
  const model = createVoiceProviderStatusViewModel(snapshot, options);
944
- const providers = model.providers.length ? `<div class="absolute-voice-provider-status__providers">${model.providers.map((provider) => `<article class="absolute-voice-provider-status__provider absolute-voice-provider-status__provider--${escapeHtml2(provider.status)}">
1130
+ const providers = model.providers.length ? `<div class="absolute-voice-provider-status__providers">${model.providers.map((provider) => `<article class="absolute-voice-provider-status__provider absolute-voice-provider-status__provider--${escapeHtml3(provider.status)}">
945
1131
  <header>
946
- <strong>${escapeHtml2(provider.label)}</strong>
947
- <span>${escapeHtml2(formatStatus(provider.status))}</span>
1132
+ <strong>${escapeHtml3(provider.label)}</strong>
1133
+ <span>${escapeHtml3(formatStatus(provider.status))}</span>
948
1134
  </header>
949
- <p>${escapeHtml2(provider.detail)}</p>
1135
+ <p>${escapeHtml3(provider.detail)}</p>
950
1136
  <dl>${provider.rows.map((row) => `<div>
951
- <dt>${escapeHtml2(row.label)}</dt>
952
- <dd>${escapeHtml2(row.value)}</dd>
1137
+ <dt>${escapeHtml3(row.label)}</dt>
1138
+ <dd>${escapeHtml3(row.value)}</dd>
953
1139
  </div>`).join("")}</dl>
954
1140
  </article>`).join("")}</div>` : '<p class="absolute-voice-provider-status__empty">Run voice traffic to see provider health.</p>';
955
- return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml2(model.status)}">
1141
+ return `<section class="absolute-voice-provider-status absolute-voice-provider-status--${escapeHtml3(model.status)}">
956
1142
  <header class="absolute-voice-provider-status__header">
957
- <span class="absolute-voice-provider-status__eyebrow">${escapeHtml2(model.title)}</span>
958
- <strong class="absolute-voice-provider-status__label">${escapeHtml2(model.label)}</strong>
1143
+ <span class="absolute-voice-provider-status__eyebrow">${escapeHtml3(model.title)}</span>
1144
+ <strong class="absolute-voice-provider-status__label">${escapeHtml3(model.label)}</strong>
959
1145
  </header>
960
- <p class="absolute-voice-provider-status__description">${escapeHtml2(model.description)}</p>
1146
+ <p class="absolute-voice-provider-status__description">${escapeHtml3(model.description)}</p>
961
1147
  ${providers}
962
- ${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml2(model.error)}</p>` : ""}
1148
+ ${model.error ? `<p class="absolute-voice-provider-status__error">${escapeHtml3(model.error)}</p>` : ""}
963
1149
  </section>`;
964
1150
  };
965
1151
  var getVoiceProviderStatusCSS = () => `.absolute-voice-provider-status{border:1px solid #d8d2c4;border-radius:20px;background:#fffaf0;color:#16130d;padding:18px;box-shadow:0 18px 40px rgba(47,37,18,.12);font-family:inherit}.absolute-voice-provider-status--error,.absolute-voice-provider-status--warning{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-provider-status__header,.absolute-voice-provider-status__provider header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-provider-status__eyebrow{color:#73664f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-provider-status__label{font-size:24px;line-height:1}.absolute-voice-provider-status__description,.absolute-voice-provider-status__provider p,.absolute-voice-provider-status__provider dt,.absolute-voice-provider-status__empty{color:#514733}.absolute-voice-provider-status__providers{display:grid;gap:12px;margin-top:14px}.absolute-voice-provider-status__provider{background:#fff;border:1px solid #eee4d2;border-radius:16px;padding:14px}.absolute-voice-provider-status__provider--degraded,.absolute-voice-provider-status__provider--rate-limited,.absolute-voice-provider-status__provider--suppressed{border-color:#f2a7a7}.absolute-voice-provider-status__provider--recoverable{border-color:#fbbf24}.absolute-voice-provider-status__provider p{margin:10px 0}.absolute-voice-provider-status__provider dl{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin:0}.absolute-voice-provider-status__provider div{background:#fffaf0;border:1px solid #eee4d2;border-radius:12px;padding:8px}.absolute-voice-provider-status__provider dt{font-size:12px}.absolute-voice-provider-status__provider dd{font-weight:800;margin:4px 0 0}.absolute-voice-provider-status__empty{margin:14px 0 0}.absolute-voice-provider-status__error{color:#9f1239;font-weight:700}`;
@@ -1092,7 +1278,7 @@ var createVoiceRoutingStatusStore = (path = "/api/routing/latest", options = {})
1092
1278
  // src/client/routingStatusWidget.ts
1093
1279
  var DEFAULT_TITLE3 = "Voice Routing";
1094
1280
  var DEFAULT_DESCRIPTION3 = "Latest provider routing decision from the self-hosted trace store.";
1095
- var escapeHtml3 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
1281
+ var escapeHtml4 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
1096
1282
  var formatValue = (value, fallback = "None") => typeof value === "string" && value.trim() ? value : typeof value === "number" && Number.isFinite(value) ? String(value) : fallback;
1097
1283
  var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
1098
1284
  const decision = snapshot.decision;
@@ -1129,17 +1315,17 @@ var createVoiceRoutingStatusViewModel = (snapshot, options = {}) => {
1129
1315
  var renderVoiceRoutingStatusHTML = (snapshot, options = {}) => {
1130
1316
  const model = createVoiceRoutingStatusViewModel(snapshot, options);
1131
1317
  const rows = model.rows.length ? `<div class="absolute-voice-routing-status__grid">${model.rows.map((row) => `<div>
1132
- <span>${escapeHtml3(row.label)}</span>
1133
- <strong>${escapeHtml3(row.value)}</strong>
1318
+ <span>${escapeHtml4(row.label)}</span>
1319
+ <strong>${escapeHtml4(row.value)}</strong>
1134
1320
  </div>`).join("")}</div>` : '<p class="absolute-voice-routing-status__empty">Start a voice session to see the selected provider.</p>';
1135
- return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml3(model.status)}">
1321
+ return `<section class="absolute-voice-routing-status absolute-voice-routing-status--${escapeHtml4(model.status)}">
1136
1322
  <header class="absolute-voice-routing-status__header">
1137
- <span class="absolute-voice-routing-status__eyebrow">${escapeHtml3(model.title)}</span>
1138
- <strong class="absolute-voice-routing-status__label">${escapeHtml3(model.label)}</strong>
1323
+ <span class="absolute-voice-routing-status__eyebrow">${escapeHtml4(model.title)}</span>
1324
+ <strong class="absolute-voice-routing-status__label">${escapeHtml4(model.label)}</strong>
1139
1325
  </header>
1140
- <p class="absolute-voice-routing-status__description">${escapeHtml3(model.description)}</p>
1326
+ <p class="absolute-voice-routing-status__description">${escapeHtml4(model.description)}</p>
1141
1327
  ${rows}
1142
- ${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml3(model.error)}</p>` : ""}
1328
+ ${model.error ? `<p class="absolute-voice-routing-status__error">${escapeHtml4(model.error)}</p>` : ""}
1143
1329
  </section>`;
1144
1330
  };
1145
1331
  var getVoiceRoutingStatusCSS = () => `.absolute-voice-routing-status{border:1px solid #d8d2c4;border-radius:20px;background:#fffaf0;color:#16130d;padding:18px;box-shadow:0 18px 40px rgba(47,37,18,.12);font-family:inherit}.absolute-voice-routing-status--error{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-routing-status__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-routing-status__eyebrow{color:#73664f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-routing-status__label{font-size:24px;line-height:1}.absolute-voice-routing-status__description{color:#514733;margin:12px 0 0}.absolute-voice-routing-status__grid{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:14px}.absolute-voice-routing-status__grid div{background:#fff;border:1px solid #eee4d2;border-radius:14px;padding:10px 12px}.absolute-voice-routing-status__grid span{color:#655944;display:block;font-size:12px;margin-bottom:4px}.absolute-voice-routing-status__grid strong{overflow-wrap:anywhere}.absolute-voice-routing-status__empty{color:#655944;margin:14px 0 0}.absolute-voice-routing-status__error{color:#9f1239;font-weight:700}`;
@@ -1904,6 +2090,7 @@ export {
1904
2090
  createVoiceStream2 as createVoiceStream,
1905
2091
  createVoiceRoutingStatus,
1906
2092
  createVoiceProviderStatus,
2093
+ createVoiceProviderSimulationControls,
1907
2094
  createVoiceOpsStatus,
1908
2095
  createVoiceController,
1909
2096
  createVoiceAppKitStatus
@@ -0,0 +1,88 @@
1
+ import { type PropType } from 'vue';
2
+ import type { VoiceProviderSimulationProvider } from '../client/providerSimulationControls';
3
+ export declare const VoiceProviderSimulationControls: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ class: {
5
+ default: string;
6
+ type: StringConstructor;
7
+ };
8
+ fallbackRequiredMessage: {
9
+ default: undefined;
10
+ type: StringConstructor;
11
+ };
12
+ fallbackRequiredProvider: {
13
+ default: undefined;
14
+ type: StringConstructor;
15
+ };
16
+ failureMessage: {
17
+ default: undefined;
18
+ type: StringConstructor;
19
+ };
20
+ failureProviders: {
21
+ default: undefined;
22
+ type: PropType<readonly string[] | undefined>;
23
+ };
24
+ kind: {
25
+ default: string;
26
+ type: StringConstructor;
27
+ };
28
+ pathPrefix: {
29
+ default: undefined;
30
+ type: StringConstructor;
31
+ };
32
+ providers: {
33
+ required: true;
34
+ type: PropType<readonly VoiceProviderSimulationProvider[]>;
35
+ };
36
+ title: {
37
+ default: undefined;
38
+ type: StringConstructor;
39
+ };
40
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
41
+ [key: string]: any;
42
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
43
+ class: {
44
+ default: string;
45
+ type: StringConstructor;
46
+ };
47
+ fallbackRequiredMessage: {
48
+ default: undefined;
49
+ type: StringConstructor;
50
+ };
51
+ fallbackRequiredProvider: {
52
+ default: undefined;
53
+ type: StringConstructor;
54
+ };
55
+ failureMessage: {
56
+ default: undefined;
57
+ type: StringConstructor;
58
+ };
59
+ failureProviders: {
60
+ default: undefined;
61
+ type: PropType<readonly string[] | undefined>;
62
+ };
63
+ kind: {
64
+ default: string;
65
+ type: StringConstructor;
66
+ };
67
+ pathPrefix: {
68
+ default: undefined;
69
+ type: StringConstructor;
70
+ };
71
+ providers: {
72
+ required: true;
73
+ type: PropType<readonly VoiceProviderSimulationProvider[]>;
74
+ };
75
+ title: {
76
+ default: undefined;
77
+ type: StringConstructor;
78
+ };
79
+ }>> & Readonly<{}>, {
80
+ kind: string;
81
+ title: string;
82
+ fallbackRequiredProvider: string;
83
+ fallbackRequiredMessage: string;
84
+ failureProviders: readonly string[] | undefined;
85
+ failureMessage: string;
86
+ pathPrefix: string;
87
+ class: string;
88
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -1,9 +1,11 @@
1
1
  export { VoiceOpsStatus } from './VoiceOpsStatus';
2
+ export { VoiceProviderSimulationControls } from './VoiceProviderSimulationControls';
2
3
  export { VoiceProviderStatus } from './VoiceProviderStatus';
3
4
  export { VoiceRoutingStatus } from './VoiceRoutingStatus';
4
5
  export { useVoiceAppKitStatus } from './useVoiceAppKitStatus';
5
6
  export { useVoiceStream } from './useVoiceStream';
6
7
  export { useVoiceController } from './useVoiceController';
7
8
  export { useVoiceProviderStatus } from './useVoiceProviderStatus';
9
+ export { useVoiceProviderSimulationControls } from './useVoiceProviderSimulationControls';
8
10
  export { useVoiceRoutingStatus } from './useVoiceRoutingStatus';
9
11
  export { useVoiceWorkflowStatus } from './useVoiceWorkflowStatus';