@absolutejs/voice 0.0.22-beta.2 → 0.0.22-beta.20

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,36 @@
1
+ import type { VoiceAgentModelInput, VoiceAgentModelOutput } from '../agent';
2
+ import type { VoiceSessionRecord } from '../types';
3
+ import type { VoiceProviderRouterEvent, VoiceProviderRouterHealthOptions } from '../modelAdapters';
4
+ export type VoiceProviderFailureSimulationMode = 'failure' | 'recovery';
5
+ export type VoiceProviderFailureSimulationContext<TProvider extends string = string> = {
6
+ query: {
7
+ provider: TProvider;
8
+ recoverProvider?: TProvider;
9
+ simulateFailureProvider?: TProvider;
10
+ };
11
+ };
12
+ export type VoiceProviderFailureSimulationResult<TProvider extends string = string, TResult = unknown> = {
13
+ mode: VoiceProviderFailureSimulationMode;
14
+ provider: TProvider;
15
+ result: VoiceAgentModelOutput<TResult>;
16
+ status: 'simulated';
17
+ };
18
+ type ProviderListResolver<TContext, TSession extends VoiceSessionRecord, TProvider extends string> = readonly TProvider[] | ((input: VoiceAgentModelInput<TContext, TSession>) => readonly TProvider[] | Promise<readonly TProvider[]>);
19
+ export type VoiceProviderFailureSimulatorOptions<TContext extends VoiceProviderFailureSimulationContext<TProvider>, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown, TProvider extends string = string> = {
20
+ allowProviders?: ProviderListResolver<TContext, TSession, TProvider>;
21
+ fallback?: readonly TProvider[] | ((provider: TProvider, input: VoiceAgentModelInput<TContext, TSession>) => readonly TProvider[] | Promise<readonly TProvider[]>);
22
+ isProviderError?: (error: unknown, provider: TProvider) => boolean;
23
+ isRateLimitError?: (error: unknown, provider: TProvider) => boolean;
24
+ onProviderEvent?: (event: VoiceProviderRouterEvent<TProvider>, input: VoiceAgentModelInput<TContext, TSession>) => Promise<void> | void;
25
+ providerHealth?: boolean | VoiceProviderRouterHealthOptions;
26
+ providerLabel?: (provider: TProvider) => string;
27
+ providers: readonly TProvider[];
28
+ response?: (input: {
29
+ mode: VoiceProviderFailureSimulationMode;
30
+ provider: TProvider;
31
+ } & VoiceAgentModelInput<TContext, TSession>) => VoiceAgentModelOutput<TResult> | Promise<VoiceAgentModelOutput<TResult>>;
32
+ };
33
+ export declare const createVoiceProviderFailureSimulator: <TProvider extends string, TResult = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TContext extends VoiceProviderFailureSimulationContext<TProvider> = VoiceProviderFailureSimulationContext<TProvider>>(options: VoiceProviderFailureSimulatorOptions<TContext, TSession, TResult, TProvider>) => {
34
+ run: (provider: TProvider, mode: VoiceProviderFailureSimulationMode) => Promise<VoiceProviderFailureSimulationResult<TProvider, TResult>>;
35
+ };
36
+ export {};
package/dist/trace.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type VoiceTraceEventType = 'agent.handoff' | 'agent.model' | 'agent.result' | 'agent.tool' | 'call.lifecycle' | 'session.error' | 'turn.assistant' | 'turn.committed' | 'turn.cost' | 'turn.transcript';
1
+ export type VoiceTraceEventType = 'assistant.guardrail' | 'assistant.memory' | 'assistant.run' | 'agent.handoff' | 'agent.model' | 'agent.result' | 'agent.tool' | 'call.lifecycle' | 'session.error' | 'turn.assistant' | 'turn.committed' | 'turn.cost' | 'turn.transcript';
2
2
  export type VoiceTraceEvent<TPayload extends Record<string, unknown> = Record<string, unknown>> = {
3
3
  at: number;
4
4
  id?: string;
@@ -1,2 +1,3 @@
1
1
  export { useVoiceStream } from './useVoiceStream';
2
2
  export { useVoiceController } from './useVoiceController';
3
+ export { useVoiceProviderStatus } from './useVoiceProviderStatus';
package/dist/vue/index.js CHANGED
@@ -1270,7 +1270,120 @@ var useVoiceController = (path, options = {}) => {
1270
1270
  turns
1271
1271
  };
1272
1272
  };
1273
+ // src/vue/useVoiceProviderStatus.ts
1274
+ import { onUnmounted as onUnmounted3, ref as ref3, shallowRef as shallowRef3 } from "vue";
1275
+
1276
+ // src/client/providerStatus.ts
1277
+ var fetchVoiceProviderStatus = async (path = "/api/provider-status", options = {}) => {
1278
+ const fetchImpl = options.fetch ?? globalThis.fetch;
1279
+ const response = await fetchImpl(path);
1280
+ if (!response.ok) {
1281
+ throw new Error(`Voice provider status failed: HTTP ${response.status}`);
1282
+ }
1283
+ return await response.json();
1284
+ };
1285
+ var createVoiceProviderStatusStore = (path = "/api/provider-status", options = {}) => {
1286
+ const listeners = new Set;
1287
+ let closed = false;
1288
+ let timer;
1289
+ let snapshot = {
1290
+ error: null,
1291
+ isLoading: false,
1292
+ providers: []
1293
+ };
1294
+ const emit = () => {
1295
+ for (const listener of listeners) {
1296
+ listener();
1297
+ }
1298
+ };
1299
+ const refresh = async () => {
1300
+ if (closed) {
1301
+ return snapshot.providers;
1302
+ }
1303
+ snapshot = {
1304
+ ...snapshot,
1305
+ error: null,
1306
+ isLoading: true
1307
+ };
1308
+ emit();
1309
+ try {
1310
+ const providers = await fetchVoiceProviderStatus(path, options);
1311
+ snapshot = {
1312
+ error: null,
1313
+ isLoading: false,
1314
+ providers,
1315
+ updatedAt: Date.now()
1316
+ };
1317
+ emit();
1318
+ return providers;
1319
+ } catch (error) {
1320
+ snapshot = {
1321
+ ...snapshot,
1322
+ error: error instanceof Error ? error.message : String(error),
1323
+ isLoading: false
1324
+ };
1325
+ emit();
1326
+ throw error;
1327
+ }
1328
+ };
1329
+ const close = () => {
1330
+ closed = true;
1331
+ if (timer) {
1332
+ clearInterval(timer);
1333
+ timer = undefined;
1334
+ }
1335
+ listeners.clear();
1336
+ };
1337
+ if (options.intervalMs && options.intervalMs > 0) {
1338
+ timer = setInterval(() => {
1339
+ refresh().catch(() => {});
1340
+ }, options.intervalMs);
1341
+ }
1342
+ return {
1343
+ close,
1344
+ getServerSnapshot: () => snapshot,
1345
+ getSnapshot: () => snapshot,
1346
+ refresh,
1347
+ subscribe: (listener) => {
1348
+ listeners.add(listener);
1349
+ return () => {
1350
+ listeners.delete(listener);
1351
+ };
1352
+ }
1353
+ };
1354
+ };
1355
+
1356
+ // src/vue/useVoiceProviderStatus.ts
1357
+ var useVoiceProviderStatus = (path = "/api/provider-status", options = {}) => {
1358
+ const store = createVoiceProviderStatusStore(path, options);
1359
+ const error = ref3(null);
1360
+ const isLoading = ref3(false);
1361
+ const providers = shallowRef3([]);
1362
+ const updatedAt = ref3(undefined);
1363
+ const sync = () => {
1364
+ const snapshot = store.getSnapshot();
1365
+ error.value = snapshot.error;
1366
+ isLoading.value = snapshot.isLoading;
1367
+ providers.value = [...snapshot.providers];
1368
+ updatedAt.value = snapshot.updatedAt;
1369
+ };
1370
+ const unsubscribe = store.subscribe(sync);
1371
+ sync();
1372
+ store.refresh().catch(() => {});
1373
+ onUnmounted3(() => {
1374
+ unsubscribe();
1375
+ store.close();
1376
+ });
1377
+ return {
1378
+ error,
1379
+ isLoading,
1380
+ providers,
1381
+ refresh: store.refresh,
1382
+ updatedAt
1383
+ };
1384
+ };
1273
1385
  export {
1274
1386
  useVoiceStream,
1387
+ useVoiceProviderStatus,
1275
1388
  useVoiceController
1276
1389
  };
@@ -0,0 +1,9 @@
1
+ import { type VoiceProviderStatusClientOptions } from '../client/providerStatus';
2
+ import type { VoiceProviderHealthSummary } from '../providerHealth';
3
+ export declare const useVoiceProviderStatus: <TProvider extends string = string>(path?: string, options?: VoiceProviderStatusClientOptions) => {
4
+ error: import("vue").Ref<string | null, string | null>;
5
+ isLoading: import("vue").Ref<boolean, boolean>;
6
+ providers: import("vue").ShallowRef<VoiceProviderHealthSummary<TProvider>[], VoiceProviderHealthSummary<TProvider>[]>;
7
+ refresh: () => Promise<VoiceProviderHealthSummary<TProvider>[]>;
8
+ updatedAt: import("vue").Ref<number | undefined, number | undefined>;
9
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.2",
3
+ "version": "0.0.22-beta.20",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",