@absolutejs/voice 0.0.22-beta.32 → 0.0.22-beta.34

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/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export { createStoredVoiceCallReviewArtifact, createStoredVoiceExternalObjectMap
7
7
  export { createVoiceAssistantMemoryHandle, createVoiceAssistantMemoryRecord, createVoiceMemoryAssistantMemoryStore, resolveVoiceAssistantMemoryNamespace } from './assistantMemory';
8
8
  export { createAnthropicVoiceAssistantModel, createGeminiVoiceAssistantModel, createJSONVoiceAssistantModel, createOpenAIVoiceAssistantModel, createVoiceProviderRouter } from './modelAdapters';
9
9
  export { createVoiceProviderHealthHTMLHandler, createVoiceProviderHealthJSONHandler, createVoiceProviderHealthRoutes, renderVoiceProviderHealthHTML, summarizeVoiceProviderHealth } from './providerHealth';
10
+ export { createVoiceSTTProviderRouter, createVoiceTTSProviderRouter } from './providerAdapters';
10
11
  export { buildVoiceTraceReplay, createVoiceMemoryTraceSinkDeliveryStore, createVoiceTraceHTTPSink, createVoiceMemoryTraceEventStore, createVoiceTraceSinkDeliveryId, createVoiceTraceSinkDeliveryRecord, createVoiceTraceSinkStore, createVoiceTraceEvent, createVoiceTraceEventId, deliverVoiceTraceEventsToSinks, evaluateVoiceTrace, exportVoiceTrace, filterVoiceTraceEvents, pruneVoiceTraceEvents, redactVoiceTraceEvent, redactVoiceTraceEvents, redactVoiceTraceText, renderVoiceTraceHTML, renderVoiceTraceMarkdown, resolveVoiceTraceRedactionOptions, selectVoiceTraceEventsForPrune, summarizeVoiceTrace } from './trace';
11
12
  export { createVoiceSQLiteExternalObjectMapStore, createVoiceSQLiteIntegrationEventStore, createVoiceSQLiteReviewStore, createVoiceSQLiteRuntimeStorage, createVoiceSQLiteSessionStore, createVoiceSQLiteTaskStore, createVoiceSQLiteTraceSinkDeliveryStore, createVoiceSQLiteTraceEventStore } from './sqliteStore';
12
13
  export { createVoicePostgresExternalObjectMapStore, createVoicePostgresIntegrationEventStore, createVoicePostgresReviewStore, createVoicePostgresRuntimeStorage, createVoicePostgresSessionStore, createVoicePostgresTaskStore, createVoicePostgresTraceSinkDeliveryStore, createVoicePostgresTraceEventStore } from './postgresStore';
@@ -36,6 +37,7 @@ export type { VoiceAssistantMemoryBinding, VoiceAssistantMemoryHandle, VoiceAssi
36
37
  export type { VoiceSessionListHTMLHandlerOptions, VoiceSessionListItem, VoiceSessionListOptions, VoiceSessionListRoutesOptions, VoiceSessionListStatus, VoiceSessionReplay, VoiceSessionReplayHTMLHandlerOptions, VoiceSessionReplayOptions, VoiceSessionReplayRoutesOptions, VoiceSessionReplayTurn } from './sessionReplay';
37
38
  export type { AnthropicVoiceAssistantModelOptions, GeminiVoiceAssistantModelOptions, OpenAIVoiceAssistantModelOptions, VoiceProviderRouterEvent, VoiceProviderRouterFallbackMode, VoiceProviderRouterHealthOptions, VoiceProviderRouterOptions, VoiceProviderRouterPolicy, VoiceProviderRouterProviderHealth, VoiceProviderRouterProviderProfile, VoiceJSONAssistantModelHandler, VoiceJSONAssistantModelOptions } from './modelAdapters';
38
39
  export type { VoiceProviderHealthStatus, VoiceProviderHealthSummary, VoiceProviderHealthSummaryOptions } from './providerHealth';
40
+ export type { VoiceIOProviderRouterEvent, VoiceSTTProviderRouterOptions, VoiceTTSProviderRouterOptions } from './providerAdapters';
39
41
  export type { VoiceAgent, VoiceAgentMessage, VoiceAgentMessageRole, VoiceAgentModel, VoiceAgentModelInput, VoiceAgentModelOutput, VoiceAgentOptions, VoiceAgentRunResult, VoiceAgentSquadOptions, VoiceAgentTool, VoiceAgentToolCall, VoiceAgentToolResult } from './agent';
40
42
  export type { VoiceOpsRuntime, VoiceOpsRuntimeConfig, VoiceOpsRuntimeSummary, VoiceOpsRuntimeSinkWorkerConfig, VoiceOpsRuntimeTaskWorkerConfig, VoiceOpsRuntimeTickResult, VoiceOpsRuntimeWebhookWorkerConfig } from './opsRuntime';
41
43
  export type { VoiceOpsPresetName, VoiceOpsPresetOverrides, VoiceResolvedOpsPreset } from './opsPresets';
package/dist/index.js CHANGED
@@ -8858,6 +8858,368 @@ var createGeminiVoiceAssistantModel = (options) => {
8858
8858
  }
8859
8859
  };
8860
8860
  };
8861
+ // src/providerAdapters.ts
8862
+ class VoiceIOProviderTimeoutError extends Error {
8863
+ provider;
8864
+ timeoutMs;
8865
+ constructor(kind, provider, timeoutMs) {
8866
+ super(`Voice ${kind} provider ${provider} exceeded ${timeoutMs}ms latency budget.`);
8867
+ this.name = "VoiceIOProviderTimeoutError";
8868
+ this.provider = provider;
8869
+ this.timeoutMs = timeoutMs;
8870
+ }
8871
+ }
8872
+ var errorMessage2 = (error) => error instanceof Error ? error.message : String(error);
8873
+ var createEmitter = () => {
8874
+ const listeners = new Map;
8875
+ return {
8876
+ emit: async (event, payload) => {
8877
+ await Promise.all([...listeners.get(event) ?? []].map((handler) => Promise.resolve(handler(payload))));
8878
+ },
8879
+ on: (event, handler) => {
8880
+ const set = listeners.get(event) ?? new Set;
8881
+ set.add(handler);
8882
+ listeners.set(event, set);
8883
+ return () => {
8884
+ set.delete(handler);
8885
+ };
8886
+ }
8887
+ };
8888
+ };
8889
+ var getTimeoutMs = (options, provider) => {
8890
+ const timeoutMs = options.providerProfiles?.[provider]?.timeoutMs ?? options.timeoutMs;
8891
+ return typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : undefined;
8892
+ };
8893
+ var withTimeout = async (input) => {
8894
+ if (!input.timeoutMs) {
8895
+ return input.run();
8896
+ }
8897
+ let timeout;
8898
+ try {
8899
+ return await Promise.race([
8900
+ Promise.resolve(input.run()),
8901
+ new Promise((_, reject) => {
8902
+ timeout = setTimeout(() => reject(new VoiceIOProviderTimeoutError(input.kind, input.provider, input.timeoutMs)), input.timeoutMs);
8903
+ })
8904
+ ]);
8905
+ } finally {
8906
+ if (timeout) {
8907
+ clearTimeout(timeout);
8908
+ }
8909
+ }
8910
+ };
8911
+ var createResolver = (options) => {
8912
+ const providerIds = Object.keys(options.adapters);
8913
+ const firstProvider = providerIds[0];
8914
+ const healthOptions = typeof options.providerHealth === "object" ? options.providerHealth : options.providerHealth ? {} : undefined;
8915
+ const healthState = new Map;
8916
+ const now = () => healthOptions?.now?.() ?? Date.now();
8917
+ const failureThreshold = Math.max(1, healthOptions?.failureThreshold ?? 1);
8918
+ const cooldownMs = Math.max(0, healthOptions?.cooldownMs ?? 30000);
8919
+ const getHealth = (provider) => {
8920
+ const existing = healthState.get(provider);
8921
+ if (existing) {
8922
+ return existing;
8923
+ }
8924
+ const next = {
8925
+ consecutiveFailures: 0,
8926
+ provider,
8927
+ status: "healthy"
8928
+ };
8929
+ healthState.set(provider, next);
8930
+ return next;
8931
+ };
8932
+ const cloneHealth = (provider) => {
8933
+ if (!healthOptions) {
8934
+ return;
8935
+ }
8936
+ return {
8937
+ ...getHealth(provider)
8938
+ };
8939
+ };
8940
+ const getSuppressionRemainingMs = (provider) => {
8941
+ if (!healthOptions) {
8942
+ return;
8943
+ }
8944
+ const suppressedUntil = getHealth(provider).suppressedUntil;
8945
+ return typeof suppressedUntil === "number" ? Math.max(0, suppressedUntil - now()) : undefined;
8946
+ };
8947
+ const isSuppressed = (provider) => {
8948
+ if (!healthOptions) {
8949
+ return false;
8950
+ }
8951
+ const suppressedUntil = getHealth(provider).suppressedUntil;
8952
+ return typeof suppressedUntil === "number" && suppressedUntil > now();
8953
+ };
8954
+ const recordSuccess = (provider) => {
8955
+ if (!healthOptions) {
8956
+ return;
8957
+ }
8958
+ const health = getHealth(provider);
8959
+ health.consecutiveFailures = 0;
8960
+ health.status = "healthy";
8961
+ health.suppressedUntil = undefined;
8962
+ return cloneHealth(provider);
8963
+ };
8964
+ const recordError = (provider, isProviderError) => {
8965
+ if (!healthOptions || !isProviderError) {
8966
+ return cloneHealth(provider);
8967
+ }
8968
+ const health = getHealth(provider);
8969
+ health.consecutiveFailures += 1;
8970
+ health.lastFailureAt = now();
8971
+ if (health.consecutiveFailures >= failureThreshold) {
8972
+ health.status = "suppressed";
8973
+ health.suppressedUntil = now() + cooldownMs;
8974
+ }
8975
+ return cloneHealth(provider);
8976
+ };
8977
+ const resolveOrder = async (input) => {
8978
+ const selectedProvider = await options.selectProvider?.(input) ?? firstProvider;
8979
+ const fallbackOrder = typeof options.fallback === "function" ? await options.fallback(input) : options.fallback;
8980
+ const candidates = [selectedProvider, ...fallbackOrder ?? providerIds];
8981
+ const seen = new Set;
8982
+ const rankedOrder = candidates.filter((provider) => {
8983
+ if (!provider || seen.has(provider) || !options.adapters[provider]) {
8984
+ return false;
8985
+ }
8986
+ seen.add(provider);
8987
+ return true;
8988
+ });
8989
+ const healthyOrder = healthOptions ? rankedOrder.filter((provider) => !isSuppressed(provider)) : rankedOrder;
8990
+ const order = healthyOrder.length ? healthyOrder : rankedOrder;
8991
+ return {
8992
+ order,
8993
+ selectedProvider: selectedProvider && !isSuppressed(selectedProvider) ? selectedProvider : order[0]
8994
+ };
8995
+ };
8996
+ const emit = async (event, input) => {
8997
+ await options.onProviderEvent?.(event, input);
8998
+ };
8999
+ return {
9000
+ emit,
9001
+ getSuppressionRemainingMs,
9002
+ providerIds,
9003
+ recordError,
9004
+ recordSuccess,
9005
+ resolveOrder
9006
+ };
9007
+ };
9008
+ var createVoiceSTTProviderRouter = (options) => {
9009
+ const resolver = createResolver(options);
9010
+ return {
9011
+ kind: "stt",
9012
+ open: async (input) => {
9013
+ const { order, selectedProvider } = await resolver.resolveOrder(input);
9014
+ if (!selectedProvider || order.length === 0) {
9015
+ throw new Error("Voice STT provider router has no available providers.");
9016
+ }
9017
+ let lastError;
9018
+ for (const [index, provider] of order.entries()) {
9019
+ const adapter = options.adapters[provider];
9020
+ if (!adapter) {
9021
+ continue;
9022
+ }
9023
+ const startedAt = Date.now();
9024
+ try {
9025
+ const session = await withTimeout({
9026
+ kind: "stt",
9027
+ operation: "open",
9028
+ provider,
9029
+ run: () => adapter.open(input),
9030
+ timeoutMs: getTimeoutMs(options, provider)
9031
+ });
9032
+ const providerHealth = resolver.recordSuccess(provider);
9033
+ await resolver.emit({
9034
+ at: Date.now(),
9035
+ attempt: index + 1,
9036
+ elapsedMs: Date.now() - startedAt,
9037
+ fallbackProvider: provider === selectedProvider ? undefined : provider,
9038
+ kind: "stt",
9039
+ latencyBudgetMs: getTimeoutMs(options, provider),
9040
+ operation: "open",
9041
+ provider,
9042
+ providerHealth,
9043
+ selectedProvider,
9044
+ status: provider === selectedProvider ? "success" : "fallback"
9045
+ }, input);
9046
+ return session;
9047
+ } catch (error) {
9048
+ lastError = error;
9049
+ const hasNextProvider = index < order.length - 1;
9050
+ const shouldFallback = options.isProviderError?.(error, provider) ?? true;
9051
+ const providerHealth = resolver.recordError(provider, shouldFallback);
9052
+ await resolver.emit({
9053
+ at: Date.now(),
9054
+ attempt: index + 1,
9055
+ elapsedMs: Date.now() - startedAt,
9056
+ error: errorMessage2(error),
9057
+ fallbackProvider: shouldFallback ? order[index + 1] : undefined,
9058
+ kind: "stt",
9059
+ latencyBudgetMs: getTimeoutMs(options, provider),
9060
+ operation: "open",
9061
+ provider,
9062
+ providerHealth,
9063
+ selectedProvider,
9064
+ status: "error",
9065
+ suppressionRemainingMs: resolver.getSuppressionRemainingMs(provider),
9066
+ suppressedUntil: providerHealth?.suppressedUntil,
9067
+ timedOut: error instanceof VoiceIOProviderTimeoutError
9068
+ }, input);
9069
+ if (!hasNextProvider || !shouldFallback) {
9070
+ throw error;
9071
+ }
9072
+ }
9073
+ }
9074
+ throw lastError ?? new Error("Voice STT provider router did not open a provider.");
9075
+ }
9076
+ };
9077
+ };
9078
+ var createVoiceTTSProviderRouter = (options) => {
9079
+ const resolver = createResolver(options);
9080
+ return {
9081
+ kind: "tts",
9082
+ open: async (input) => {
9083
+ const { order, selectedProvider } = await resolver.resolveOrder(input);
9084
+ if (!selectedProvider || order.length === 0) {
9085
+ throw new Error("Voice TTS provider router has no available providers.");
9086
+ }
9087
+ const emitter = createEmitter();
9088
+ let activeSession;
9089
+ let activeProvider;
9090
+ let nextProviderIndex = 0;
9091
+ const attach = (session) => {
9092
+ session.on("audio", (event) => emitter.emit("audio", event));
9093
+ session.on("error", (event) => emitter.emit("error", event));
9094
+ session.on("close", (event) => emitter.emit("close", event));
9095
+ };
9096
+ const openProvider = async (provider, attempt) => {
9097
+ const adapter = options.adapters[provider];
9098
+ if (!adapter) {
9099
+ throw new Error(`Voice TTS provider ${provider} is not configured.`);
9100
+ }
9101
+ const startedAt = Date.now();
9102
+ const session = await withTimeout({
9103
+ kind: "tts",
9104
+ operation: "open",
9105
+ provider,
9106
+ run: () => adapter.open(input),
9107
+ timeoutMs: getTimeoutMs(options, provider)
9108
+ });
9109
+ attach(session);
9110
+ activeSession = session;
9111
+ activeProvider = provider;
9112
+ const providerHealth = resolver.recordSuccess(provider);
9113
+ await resolver.emit({
9114
+ at: Date.now(),
9115
+ attempt,
9116
+ elapsedMs: Date.now() - startedAt,
9117
+ fallbackProvider: provider === selectedProvider ? undefined : provider,
9118
+ kind: "tts",
9119
+ latencyBudgetMs: getTimeoutMs(options, provider),
9120
+ operation: "open",
9121
+ provider,
9122
+ providerHealth,
9123
+ selectedProvider,
9124
+ status: provider === selectedProvider ? "success" : "fallback"
9125
+ }, input);
9126
+ return session;
9127
+ };
9128
+ const failProvider = async (inputEvent) => {
9129
+ const shouldFallback = options.isProviderError?.(inputEvent.error, inputEvent.provider) ?? true;
9130
+ const providerHealth = resolver.recordError(inputEvent.provider, shouldFallback);
9131
+ await resolver.emit({
9132
+ at: Date.now(),
9133
+ attempt: inputEvent.attempt,
9134
+ elapsedMs: Date.now() - inputEvent.startedAt,
9135
+ error: errorMessage2(inputEvent.error),
9136
+ fallbackProvider: shouldFallback ? order[nextProviderIndex] : undefined,
9137
+ kind: "tts",
9138
+ latencyBudgetMs: getTimeoutMs(options, inputEvent.provider),
9139
+ operation: inputEvent.operation,
9140
+ provider: inputEvent.provider,
9141
+ providerHealth,
9142
+ selectedProvider,
9143
+ status: "error",
9144
+ suppressionRemainingMs: resolver.getSuppressionRemainingMs(inputEvent.provider),
9145
+ suppressedUntil: providerHealth?.suppressedUntil,
9146
+ timedOut: inputEvent.error instanceof VoiceIOProviderTimeoutError
9147
+ }, input);
9148
+ return shouldFallback;
9149
+ };
9150
+ for (const [index, provider] of order.entries()) {
9151
+ nextProviderIndex = index + 1;
9152
+ const startedAt = Date.now();
9153
+ try {
9154
+ await openProvider(provider, index + 1);
9155
+ break;
9156
+ } catch (error) {
9157
+ const shouldFallback = await failProvider({
9158
+ attempt: index + 1,
9159
+ error,
9160
+ operation: "open",
9161
+ provider,
9162
+ startedAt
9163
+ });
9164
+ if (!shouldFallback || index >= order.length - 1) {
9165
+ throw error;
9166
+ }
9167
+ }
9168
+ }
9169
+ if (!activeSession || !activeProvider) {
9170
+ throw new Error("Voice TTS provider router did not open a provider.");
9171
+ }
9172
+ const sendWithFallback = async (text) => {
9173
+ for (;; ) {
9174
+ const session = activeSession;
9175
+ const provider = activeProvider;
9176
+ if (!session || !provider) {
9177
+ throw new Error("Voice TTS provider router has no active provider.");
9178
+ }
9179
+ const startedAt = Date.now();
9180
+ try {
9181
+ await withTimeout({
9182
+ kind: "tts",
9183
+ operation: "send",
9184
+ provider,
9185
+ run: () => session.send(text),
9186
+ timeoutMs: getTimeoutMs(options, provider)
9187
+ });
9188
+ return;
9189
+ } catch (error) {
9190
+ const shouldFallback = await failProvider({
9191
+ attempt: nextProviderIndex,
9192
+ error,
9193
+ operation: "send",
9194
+ provider,
9195
+ startedAt
9196
+ });
9197
+ const nextProvider = order[nextProviderIndex];
9198
+ if (!shouldFallback || !nextProvider) {
9199
+ throw error;
9200
+ }
9201
+ nextProviderIndex += 1;
9202
+ await session.close("tts-provider-fallback").catch(() => {});
9203
+ await openProvider(nextProvider, nextProviderIndex);
9204
+ }
9205
+ }
9206
+ };
9207
+ return {
9208
+ close: async (reason) => {
9209
+ await activeSession?.close(reason);
9210
+ activeSession = undefined;
9211
+ activeProvider = undefined;
9212
+ await emitter.emit("close", {
9213
+ reason,
9214
+ type: "close"
9215
+ });
9216
+ },
9217
+ on: emitter.on,
9218
+ send: sendWithFallback
9219
+ };
9220
+ }
9221
+ };
9222
+ };
8861
9223
  // src/sqliteStore.ts
8862
9224
  import { Database } from "bun:sqlite";
8863
9225
  var normalizeTableNameSegment = (value) => value.trim().replace(/[^a-zA-Z0-9_]+/g, "_").replace(/^_+|_+$/g, "") || "voice";
@@ -10556,10 +10918,10 @@ var createVoiceOpsTaskProcessorWorker = (options) => ({
10556
10918
  result.completed += 1;
10557
10919
  } catch (error) {
10558
10920
  await options.onError?.(error, task);
10559
- const errorMessage2 = error instanceof Error ? error.message : String(error);
10921
+ const errorMessage3 = error instanceof Error ? error.message : String(error);
10560
10922
  const failedTask = failVoiceOpsTask(task, {
10561
10923
  actor: task.claimedBy ?? "ops-worker",
10562
- error: errorMessage2
10924
+ error: errorMessage3
10563
10925
  });
10564
10926
  if (shouldDeadLetterTask(failedTask, options.maxFailures)) {
10565
10927
  const deadLetterTask = deadLetterVoiceOpsTask(failedTask, {
@@ -11886,6 +12248,7 @@ export {
11886
12248
  createVoiceTaskUpdatedEvent,
11887
12249
  createVoiceTaskSLABreachedEvent,
11888
12250
  createVoiceTaskCreatedEvent,
12251
+ createVoiceTTSProviderRouter,
11889
12252
  createVoiceSessionsJSONHandler,
11890
12253
  createVoiceSessionsHTMLHandler,
11891
12254
  createVoiceSessionReplayRoutes,
@@ -11895,6 +12258,7 @@ export {
11895
12258
  createVoiceSessionListRoutes,
11896
12259
  createVoiceSession,
11897
12260
  createVoiceSTTRoutingCorrectionHandler,
12261
+ createVoiceSTTProviderRouter,
11898
12262
  createVoiceSQLiteTraceSinkDeliveryStore,
11899
12263
  createVoiceSQLiteTraceEventStore,
11900
12264
  createVoiceSQLiteTaskStore,
@@ -0,0 +1,37 @@
1
+ import type { STTAdapter, STTAdapterOpenOptions, TTSAdapter, TTSAdapterOpenOptions } from './types';
2
+ import type { VoiceProviderRouterHealthOptions, VoiceProviderRouterProviderHealth, VoiceProviderRouterProviderProfile } from './modelAdapters';
3
+ type MaybePromise<T> = T | Promise<T>;
4
+ type VoiceIOProviderKind = 'stt' | 'tts';
5
+ type VoiceIOProviderStatus = 'error' | 'fallback' | 'success';
6
+ export type VoiceIOProviderRouterEvent<TProvider extends string = string> = {
7
+ at: number;
8
+ attempt: number;
9
+ elapsedMs: number;
10
+ error?: string;
11
+ fallbackProvider?: TProvider;
12
+ kind: VoiceIOProviderKind;
13
+ latencyBudgetMs?: number;
14
+ operation: 'open' | 'send';
15
+ provider: TProvider;
16
+ providerHealth?: VoiceProviderRouterProviderHealth<TProvider>;
17
+ selectedProvider: TProvider;
18
+ status: VoiceIOProviderStatus;
19
+ suppressionRemainingMs?: number;
20
+ suppressedUntil?: number;
21
+ timedOut?: boolean;
22
+ };
23
+ export type VoiceIOProviderRouterOptions<TProvider extends string, TAdapter, TOpenOptions> = {
24
+ adapters: Partial<Record<TProvider, TAdapter>>;
25
+ fallback?: readonly TProvider[] | ((input: TOpenOptions) => MaybePromise<readonly TProvider[]>);
26
+ isProviderError?: (error: unknown, provider: TProvider) => boolean;
27
+ onProviderEvent?: (event: VoiceIOProviderRouterEvent<TProvider>, input: TOpenOptions) => Promise<void> | void;
28
+ providerHealth?: boolean | VoiceProviderRouterHealthOptions;
29
+ providerProfiles?: Partial<Record<TProvider, VoiceProviderRouterProviderProfile>>;
30
+ selectProvider?: (input: TOpenOptions) => MaybePromise<TProvider | undefined>;
31
+ timeoutMs?: number;
32
+ };
33
+ export type VoiceSTTProviderRouterOptions<TProvider extends string = string, TOptions extends STTAdapterOpenOptions = STTAdapterOpenOptions> = VoiceIOProviderRouterOptions<TProvider, STTAdapter<TOptions>, TOptions>;
34
+ export type VoiceTTSProviderRouterOptions<TProvider extends string = string, TOptions extends TTSAdapterOpenOptions = TTSAdapterOpenOptions> = VoiceIOProviderRouterOptions<TProvider, TTSAdapter<TOptions>, TOptions>;
35
+ export declare const createVoiceSTTProviderRouter: <TProvider extends string = string, TOptions extends STTAdapterOpenOptions = STTAdapterOpenOptions>(options: VoiceSTTProviderRouterOptions<TProvider, TOptions>) => STTAdapter<TOptions>;
36
+ export declare const createVoiceTTSProviderRouter: <TProvider extends string = string, TOptions extends TTSAdapterOpenOptions = TTSAdapterOpenOptions>(options: VoiceTTSProviderRouterOptions<TProvider, TOptions>) => TTSAdapter<TOptions>;
37
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.32",
3
+ "version": "0.0.22-beta.34",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",