@voice-ai-labs/web-sdk 0.2.0

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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +219 -0
  3. package/dist/__tests__/setup.d.ts +2 -0
  4. package/dist/__tests__/setup.d.ts.map +1 -0
  5. package/dist/__tests__/setup.js +13 -0
  6. package/dist/__tests__/setup.js.map +1 -0
  7. package/dist/client/agents.d.ts +202 -0
  8. package/dist/client/agents.d.ts.map +1 -0
  9. package/dist/client/agents.js +233 -0
  10. package/dist/client/agents.js.map +1 -0
  11. package/dist/client/analytics.d.ts +77 -0
  12. package/dist/client/analytics.d.ts.map +1 -0
  13. package/dist/client/analytics.js +95 -0
  14. package/dist/client/analytics.js.map +1 -0
  15. package/dist/client/base.d.ts +69 -0
  16. package/dist/client/base.d.ts.map +1 -0
  17. package/dist/client/base.js +210 -0
  18. package/dist/client/base.js.map +1 -0
  19. package/dist/client/index.d.ts +71 -0
  20. package/dist/client/index.d.ts.map +1 -0
  21. package/dist/client/index.js +73 -0
  22. package/dist/client/index.js.map +1 -0
  23. package/dist/client/knowledge-base.d.ts +110 -0
  24. package/dist/client/knowledge-base.d.ts.map +1 -0
  25. package/dist/client/knowledge-base.js +126 -0
  26. package/dist/client/knowledge-base.js.map +1 -0
  27. package/dist/client/phone-numbers.d.ts +116 -0
  28. package/dist/client/phone-numbers.d.ts.map +1 -0
  29. package/dist/client/phone-numbers.js +143 -0
  30. package/dist/client/phone-numbers.js.map +1 -0
  31. package/dist/components/VoiceAgentWidget.d.ts +80 -0
  32. package/dist/components/VoiceAgentWidget.d.ts.map +1 -0
  33. package/dist/components/VoiceAgentWidget.js +407 -0
  34. package/dist/components/VoiceAgentWidget.js.map +1 -0
  35. package/dist/components/index.d.ts +14 -0
  36. package/dist/components/index.d.ts.map +1 -0
  37. package/dist/components/index.js +13 -0
  38. package/dist/components/index.js.map +1 -0
  39. package/dist/index.d.ts +184 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.esm.js +28724 -0
  42. package/dist/index.esm.js.map +1 -0
  43. package/dist/index.js +28732 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/types.d.ts +453 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +13 -0
  48. package/dist/types.js.map +1 -0
  49. package/package.json +50 -0
@@ -0,0 +1,407 @@
1
+ /**
2
+ * VoiceAgentWidget - UI widget for Voice.AI
3
+ *
4
+ * Features:
5
+ * - Click to connect/disconnect
6
+ * - Shape morphs based on state (circle/square)
7
+ * - Audio bars react to agent speech
8
+ * - Expandable transcript panel with text input
9
+ */
10
+ export class VoiceAgentWidget {
11
+ constructor(options) {
12
+ this.widgetElement = null;
13
+ this.buttonElement = null;
14
+ this.buttonShape = null;
15
+ this.glowElement = null;
16
+ this.endButton = null;
17
+ this.bars = [];
18
+ // Transcript panel
19
+ this.panelElement = null;
20
+ this.messagesContainer = null;
21
+ this.inputElement = null;
22
+ this.isPanelOpen = false;
23
+ this.messages = [];
24
+ this.isConnected = false;
25
+ this.isConnecting = false;
26
+ this.agentState = 'disconnected';
27
+ this.audioLevel = 0;
28
+ this.animationFrame = null;
29
+ this.unsubscribeStatus = null;
30
+ this.unsubscribeAgentState = null;
31
+ this.unsubscribeAudioLevel = null;
32
+ this.unsubscribeError = null;
33
+ this.unsubscribeTranscription = null;
34
+ this.sdk = options.sdk;
35
+ this.connectionOptions = options.connectionOptions;
36
+ this.position = options.position || 'bottom-right';
37
+ this.container = options.container || document.body;
38
+ this.size = options.size || 64;
39
+ this.theme = { ...VoiceAgentWidget.DEFAULT_THEME, ...options.theme };
40
+ this.showTranscript = options.showTranscript !== false;
41
+ this.init();
42
+ }
43
+ init() {
44
+ this.createWidget();
45
+ this.setupEventListeners();
46
+ this.startAnimationLoop();
47
+ }
48
+ createWidget() {
49
+ // Main container
50
+ this.widgetElement = document.createElement('div');
51
+ this.widgetElement.className = `voice-agent-widget voice-agent-widget-${this.position}`;
52
+ // Create transcript panel first (behind button)
53
+ if (this.showTranscript) {
54
+ this.createTranscriptPanel();
55
+ }
56
+ // Button
57
+ this.buttonElement = document.createElement('button');
58
+ this.buttonElement.className = 'voice-agent-widget-trigger';
59
+ this.buttonElement.setAttribute('aria-label', 'Start voice call');
60
+ this.buttonElement.style.width = `${this.size}px`;
61
+ this.buttonElement.style.height = `${this.size}px`;
62
+ this.buttonElement.addEventListener('click', () => this.handleClick());
63
+ const buttonContainer = document.createElement('div');
64
+ buttonContainer.className = 'voice-agent-widget-button-container';
65
+ this.glowElement = document.createElement('div');
66
+ this.glowElement.className = 'voice-agent-widget-glow';
67
+ this.applyGlowTheme();
68
+ this.buttonShape = document.createElement('div');
69
+ this.buttonShape.className = 'voice-agent-widget-button';
70
+ this.buttonShape.style.width = `${this.size}px`;
71
+ this.buttonShape.style.height = `${this.size}px`;
72
+ this.applyButtonTheme();
73
+ const innerGlow = document.createElement('div');
74
+ innerGlow.className = 'voice-agent-widget-inner-glow';
75
+ const barsContainer = document.createElement('div');
76
+ barsContainer.className = 'voice-agent-widget-bars';
77
+ this.bars = [];
78
+ for (let i = 0; i < 3; i++) {
79
+ const bar = document.createElement('div');
80
+ bar.className = 'voice-agent-widget-bar';
81
+ this.bars.push(bar);
82
+ barsContainer.appendChild(bar);
83
+ }
84
+ this.buttonShape.appendChild(barsContainer);
85
+ this.buttonShape.appendChild(innerGlow);
86
+ buttonContainer.appendChild(this.glowElement);
87
+ buttonContainer.appendChild(this.buttonShape);
88
+ this.bars.forEach(bar => {
89
+ bar.style.background = this.theme.barColor || 'rgba(255, 255, 255, 0.8)';
90
+ });
91
+ this.buttonElement.appendChild(buttonContainer);
92
+ this.widgetElement.appendChild(this.buttonElement);
93
+ // End button
94
+ this.endButton = document.createElement('button');
95
+ this.endButton.className = 'voice-agent-widget-end-button';
96
+ this.endButton.innerHTML = '✕';
97
+ this.endButton.style.display = 'none';
98
+ this.endButton.addEventListener('click', (e) => {
99
+ e.stopPropagation();
100
+ this.handleDisconnect();
101
+ });
102
+ this.widgetElement.appendChild(this.endButton);
103
+ this.container.appendChild(this.widgetElement);
104
+ }
105
+ createTranscriptPanel() {
106
+ // Panel container - expands from button
107
+ this.panelElement = document.createElement('div');
108
+ this.panelElement.className = 'voice-agent-widget-panel';
109
+ // Messages area
110
+ this.messagesContainer = document.createElement('div');
111
+ this.messagesContainer.className = 'voice-agent-widget-messages';
112
+ // Input area
113
+ const inputArea = document.createElement('div');
114
+ inputArea.className = 'voice-agent-widget-input-area';
115
+ this.inputElement = document.createElement('input');
116
+ this.inputElement.type = 'text';
117
+ this.inputElement.placeholder = 'Type a message...';
118
+ this.inputElement.className = 'voice-agent-widget-input';
119
+ this.inputElement.addEventListener('keydown', (e) => {
120
+ if (e.key === 'Enter' && this.inputElement?.value.trim()) {
121
+ this.sendTextMessage(this.inputElement.value.trim());
122
+ this.inputElement.value = '';
123
+ }
124
+ });
125
+ const sendButton = document.createElement('button');
126
+ sendButton.className = 'voice-agent-widget-send-button';
127
+ sendButton.innerHTML = '↑';
128
+ sendButton.addEventListener('click', () => {
129
+ if (this.inputElement?.value.trim()) {
130
+ this.sendTextMessage(this.inputElement.value.trim());
131
+ this.inputElement.value = '';
132
+ }
133
+ });
134
+ inputArea.appendChild(this.inputElement);
135
+ inputArea.appendChild(sendButton);
136
+ this.panelElement.appendChild(this.messagesContainer);
137
+ this.panelElement.appendChild(inputArea);
138
+ this.widgetElement.appendChild(this.panelElement);
139
+ }
140
+ setupEventListeners() {
141
+ this.unsubscribeStatus = this.sdk.onStatusChange((status) => {
142
+ this.isConnected = status.connected;
143
+ this.isConnecting = status.connecting;
144
+ // Auto-open panel when connected
145
+ if (status.connected && this.showTranscript && !this.isPanelOpen) {
146
+ this.togglePanel(true);
147
+ }
148
+ // Close panel when disconnected
149
+ if (!status.connected && !status.connecting) {
150
+ this.togglePanel(false);
151
+ }
152
+ this.updateUI();
153
+ });
154
+ this.unsubscribeAgentState = this.sdk.onAgentStateChange((state) => {
155
+ this.agentState = state.state;
156
+ this.updateUI();
157
+ });
158
+ this.unsubscribeAudioLevel = this.sdk.onAudioLevel((level) => {
159
+ this.audioLevel = level.level;
160
+ if (this.agentState === 'speaking' && this.bars.length === 3) {
161
+ const scaledLevel = Math.sqrt(level.level);
162
+ const baseHeight = 4 + scaledLevel * 14;
163
+ this.bars[0].style.height = `${Math.max(4, baseHeight * 0.7)}px`;
164
+ this.bars[1].style.height = `${Math.min(18, baseHeight)}px`;
165
+ this.bars[2].style.height = `${Math.max(4, baseHeight * 0.7)}px`;
166
+ }
167
+ });
168
+ this.unsubscribeError = this.sdk.onError((error) => {
169
+ console.error('[VoiceAgentWidget] Error:', error.message);
170
+ this.updateUI();
171
+ });
172
+ // Subscribe to transcriptions - use segment.id for proper grouping
173
+ this.unsubscribeTranscription = this.sdk.onTranscription((segment) => {
174
+ // The segment.id stays the same as the transcription updates
175
+ // This is the key to updating in place rather than creating new bubbles
176
+ this.updateOrAddMessage({
177
+ id: segment.id,
178
+ text: segment.text,
179
+ role: segment.role,
180
+ timestamp: segment.timestamp,
181
+ isFinal: segment.isFinal
182
+ });
183
+ });
184
+ }
185
+ addMessage(message) {
186
+ this.messages.push(message);
187
+ this.renderMessages();
188
+ }
189
+ updateOrAddMessage(message) {
190
+ const existingIndex = this.messages.findIndex(m => m.id === message.id);
191
+ if (existingIndex >= 0) {
192
+ // Update existing message in data
193
+ this.messages[existingIndex] = message;
194
+ // Update just the DOM element, don't re-render everything
195
+ this.updateMessageElement(message);
196
+ }
197
+ else {
198
+ // Add new message
199
+ this.messages.push(message);
200
+ this.appendMessageElement(message);
201
+ }
202
+ }
203
+ updateMessageElement(message) {
204
+ if (!this.messagesContainer)
205
+ return;
206
+ const existingEl = this.messagesContainer.querySelector(`[data-msg-id="${message.id}"]`);
207
+ if (existingEl) {
208
+ existingEl.textContent = message.text;
209
+ }
210
+ }
211
+ appendMessageElement(message) {
212
+ if (!this.messagesContainer)
213
+ return;
214
+ const bubble = document.createElement('div');
215
+ bubble.className = `voice-agent-widget-message voice-agent-widget-message-${message.role}`;
216
+ bubble.setAttribute('data-msg-id', message.id);
217
+ bubble.textContent = message.text;
218
+ this.messagesContainer.appendChild(bubble);
219
+ // Auto-scroll to bottom
220
+ this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight;
221
+ }
222
+ renderMessages() {
223
+ if (!this.messagesContainer)
224
+ return;
225
+ this.messagesContainer.innerHTML = '';
226
+ this.messages.forEach(msg => {
227
+ const bubble = document.createElement('div');
228
+ bubble.className = `voice-agent-widget-message voice-agent-widget-message-${msg.role}`;
229
+ bubble.setAttribute('data-msg-id', msg.id);
230
+ bubble.textContent = msg.text;
231
+ this.messagesContainer.appendChild(bubble);
232
+ });
233
+ // Auto-scroll to bottom
234
+ this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight;
235
+ }
236
+ async sendTextMessage(text) {
237
+ if (!this.isConnected)
238
+ return;
239
+ // Add user message immediately
240
+ this.addMessage({
241
+ id: `msg-${Date.now()}`,
242
+ text,
243
+ role: 'user',
244
+ timestamp: Date.now()
245
+ });
246
+ try {
247
+ await this.sdk.sendMessage(text);
248
+ }
249
+ catch (error) {
250
+ console.error('[VoiceAgentWidget] Failed to send message:', error);
251
+ }
252
+ }
253
+ togglePanel(open) {
254
+ this.isPanelOpen = open !== undefined ? open : !this.isPanelOpen;
255
+ if (this.panelElement) {
256
+ if (this.isPanelOpen) {
257
+ this.panelElement.classList.add('open');
258
+ }
259
+ else {
260
+ this.panelElement.classList.remove('open');
261
+ }
262
+ }
263
+ }
264
+ startAnimationLoop() {
265
+ let time = 0;
266
+ const animate = () => {
267
+ time += 0.05;
268
+ if (this.glowElement) {
269
+ let intensity = 0.2;
270
+ if (this.isConnecting) {
271
+ intensity = 0.4 + Math.sin(time * 3) * 0.2;
272
+ }
273
+ else if (this.isConnected) {
274
+ intensity = 0.5 + this.audioLevel * 0.5;
275
+ }
276
+ this.glowElement.style.opacity = String(intensity);
277
+ }
278
+ if (this.bars.length === 3) {
279
+ if (this.agentState === 'speaking') {
280
+ this.bars.forEach(bar => bar.style.opacity = '1');
281
+ }
282
+ else if (this.isConnecting) {
283
+ const pulse = 5 + Math.sin(time * 5) * 3;
284
+ this.bars[0].style.height = `${pulse}px`;
285
+ this.bars[1].style.height = `${5 + Math.sin(time * 5 + 0.7) * 3}px`;
286
+ this.bars[2].style.height = `${5 + Math.sin(time * 5 + 1.4) * 3}px`;
287
+ }
288
+ else if (this.isConnected && this.agentState === 'listening') {
289
+ const breath = 6 + Math.sin(time * 1.5) * 2;
290
+ this.bars[0].style.height = `${breath}px`;
291
+ this.bars[1].style.height = `${breath + 2}px`;
292
+ this.bars[2].style.height = `${breath}px`;
293
+ }
294
+ else {
295
+ this.bars[0].style.height = '4px';
296
+ this.bars[1].style.height = '5px';
297
+ this.bars[2].style.height = '4px';
298
+ }
299
+ }
300
+ this.animationFrame = requestAnimationFrame(animate);
301
+ };
302
+ this.animationFrame = requestAnimationFrame(animate);
303
+ }
304
+ async handleClick() {
305
+ if (this.isConnecting)
306
+ return;
307
+ if (this.isConnected) {
308
+ // Toggle panel instead of disconnect
309
+ if (this.showTranscript) {
310
+ this.togglePanel();
311
+ }
312
+ }
313
+ else {
314
+ await this.handleConnect();
315
+ }
316
+ }
317
+ async handleConnect() {
318
+ this.isConnecting = true;
319
+ this.messages = []; // Clear messages
320
+ this.renderMessages();
321
+ this.updateUI();
322
+ try {
323
+ await this.sdk.connect(this.connectionOptions);
324
+ }
325
+ catch (error) {
326
+ console.error('[VoiceAgentWidget] Connection failed:', error);
327
+ this.isConnecting = false;
328
+ this.updateUI();
329
+ }
330
+ }
331
+ async handleDisconnect() {
332
+ await this.sdk.disconnect();
333
+ this.togglePanel(false);
334
+ this.updateUI();
335
+ }
336
+ updateUI() {
337
+ if (!this.widgetElement || !this.buttonElement || !this.endButton)
338
+ return;
339
+ const stateClasses = [
340
+ 'voice-agent-widget-state-disconnected',
341
+ 'voice-agent-widget-state-connecting',
342
+ 'voice-agent-widget-state-listening',
343
+ 'voice-agent-widget-state-speaking'
344
+ ];
345
+ stateClasses.forEach(cls => this.widgetElement.classList.remove(cls));
346
+ if (this.isConnecting) {
347
+ this.widgetElement.classList.add('voice-agent-widget-state-connecting');
348
+ }
349
+ else if (this.isConnected) {
350
+ if (this.agentState === 'speaking') {
351
+ this.widgetElement.classList.add('voice-agent-widget-state-speaking');
352
+ }
353
+ else {
354
+ this.widgetElement.classList.add('voice-agent-widget-state-listening');
355
+ }
356
+ }
357
+ else {
358
+ this.widgetElement.classList.add('voice-agent-widget-state-disconnected');
359
+ }
360
+ this.endButton.style.display = this.isConnected ? 'flex' : 'none';
361
+ }
362
+ applyButtonTheme() {
363
+ if (!this.buttonShape)
364
+ return;
365
+ this.buttonShape.style.background = this.theme.backgroundColor || 'rgba(10, 15, 25, 0.8)';
366
+ this.buttonShape.style.borderColor = this.theme.borderColor || 'rgba(45, 212, 191, 0.5)';
367
+ }
368
+ applyGlowTheme() {
369
+ if (!this.glowElement)
370
+ return;
371
+ const primary = this.theme.primaryColor || 'rgba(45, 212, 191, 1)';
372
+ this.glowElement.style.background = `radial-gradient(circle at center, ${primary} 0%, transparent 70%)`;
373
+ }
374
+ setTheme(theme) {
375
+ this.theme = { ...this.theme, ...theme };
376
+ this.applyButtonTheme();
377
+ this.applyGlowTheme();
378
+ this.bars.forEach(bar => {
379
+ bar.style.background = this.theme.barColor || 'rgba(255, 255, 255, 0.8)';
380
+ });
381
+ }
382
+ destroy() {
383
+ if (this.animationFrame) {
384
+ cancelAnimationFrame(this.animationFrame);
385
+ }
386
+ if (this.unsubscribeStatus)
387
+ this.unsubscribeStatus();
388
+ if (this.unsubscribeAgentState)
389
+ this.unsubscribeAgentState();
390
+ if (this.unsubscribeAudioLevel)
391
+ this.unsubscribeAudioLevel();
392
+ if (this.unsubscribeError)
393
+ this.unsubscribeError();
394
+ if (this.unsubscribeTranscription)
395
+ this.unsubscribeTranscription();
396
+ if (this.widgetElement && this.widgetElement.parentNode) {
397
+ this.widgetElement.parentNode.removeChild(this.widgetElement);
398
+ }
399
+ }
400
+ }
401
+ VoiceAgentWidget.DEFAULT_THEME = {
402
+ primaryColor: 'rgba(45, 212, 191, 1)',
403
+ backgroundColor: 'rgba(10, 15, 25, 0.8)',
404
+ borderColor: 'rgba(45, 212, 191, 0.5)',
405
+ barColor: 'rgba(255, 255, 255, 0.8)'
406
+ };
407
+ //# sourceMappingURL=VoiceAgentWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VoiceAgentWidget.js","sourceRoot":"","sources":["../../src/components/VoiceAgentWidget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * SAMPLE UI COMPONENTS
3
+ *
4
+ * These are REFERENCE IMPLEMENTATIONS showing how to build UI on top of VoiceAgentSDK.
5
+ *
6
+ * For production use:
7
+ * 1. Copy this folder to your project
8
+ * 2. Customize the widget design, colors, animations
9
+ * 3. Import VoiceAgentSDK from '@voice-ai-labs/web-sdk'
10
+ * 4. Build your own UI using the SDK's event callbacks
11
+ */
12
+ export { VoiceAgentWidget } from './VoiceAgentWidget';
13
+ export type { VoiceAgentWidgetOptions, VoiceAgentWidgetTheme } from './VoiceAgentWidget';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * SAMPLE UI COMPONENTS
3
+ *
4
+ * These are REFERENCE IMPLEMENTATIONS showing how to build UI on top of VoiceAgentSDK.
5
+ *
6
+ * For production use:
7
+ * 1. Copy this folder to your project
8
+ * 2. Customize the widget design, colors, animations
9
+ * 3. Import VoiceAgentSDK from '@voice-ai-labs/web-sdk'
10
+ * 4. Build your own UI using the SDK's event callbacks
11
+ */
12
+ export { VoiceAgentWidget } from './VoiceAgentWidget';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Voice.AI Web SDK
3
+ *
4
+ * A single, unified SDK for Voice.AI services.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import VoiceAI from '@voice-ai-labs/web-sdk';
9
+ *
10
+ * const voiceai = new VoiceAI({ apiKey: 'vk_...' });
11
+ *
12
+ * // Real-time voice connection
13
+ * await voiceai.connect({ agentId: 'agent-123' });
14
+ * voiceai.onTranscription((seg) => console.log(`${seg.role}: ${seg.text}`));
15
+ * await voiceai.disconnect();
16
+ *
17
+ * // REST API operations
18
+ * const agents = await voiceai.agents.list();
19
+ * await voiceai.agents.create({ name: 'Support', config: {...} });
20
+ * const history = await voiceai.analytics.getCallHistory();
21
+ * ```
22
+ */
23
+ import { AgentClient } from './client/agents';
24
+ import { AnalyticsClient } from './client/analytics';
25
+ import { KnowledgeBaseClient } from './client/knowledge-base';
26
+ import { PhoneNumberClient } from './client/phone-numbers';
27
+ import type { ConnectionOptions, ConnectionStatus, TranscriptionHandler, ConnectionStatusHandler, ErrorHandler, AudioCaptureOptions, AgentStateInfo, MicrophoneState, AgentStateHandler, AudioLevelHandler, MicrophoneStateHandler, VoiceAIConfig } from './types';
28
+ /**
29
+ * VoiceAI - The unified Voice.AI SDK
30
+ *
31
+ * Provides both real-time voice agent connections and REST API access
32
+ * through a single, easy-to-use interface.
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * import VoiceAI from '@voice-ai-labs/web-sdk';
37
+ *
38
+ * const voiceai = new VoiceAI({ apiKey: 'vk_your_api_key' });
39
+ *
40
+ * // Connect to a voice agent
41
+ * await voiceai.connect({ agentId: 'agent-123' });
42
+ *
43
+ * // Listen for transcriptions
44
+ * voiceai.onTranscription((segment) => {
45
+ * console.log(`${segment.role}: ${segment.text}`);
46
+ * });
47
+ *
48
+ * // Disconnect when done
49
+ * await voiceai.disconnect();
50
+ * ```
51
+ */
52
+ export declare class VoiceAI {
53
+ /** Agent management - create, update, deploy, pause, delete agents */
54
+ readonly agents: AgentClient;
55
+ /** Analytics - call history, transcripts, stats */
56
+ readonly analytics: AnalyticsClient;
57
+ /** Knowledge Base - manage RAG documents */
58
+ readonly knowledgeBase: KnowledgeBaseClient;
59
+ /** Phone Numbers - search, select, release phone numbers */
60
+ readonly phoneNumbers: PhoneNumberClient;
61
+ private room;
62
+ private connectionStatus;
63
+ private transcriptionHandlers;
64
+ private statusHandlers;
65
+ private errorHandlers;
66
+ private agentStateHandlers;
67
+ private audioLevelHandlers;
68
+ private microphoneStateHandlers;
69
+ private apiUrl;
70
+ private apiKey;
71
+ private cachedConnectionDetails;
72
+ private currentAgentState;
73
+ private agentParticipantId;
74
+ private audioLevelInterval;
75
+ /**
76
+ * Create a new VoiceAI client
77
+ *
78
+ * @param config - Configuration options
79
+ * @param config.apiKey - Your Voice.AI API key (required)
80
+ * @param config.apiUrl - Custom API URL (optional, defaults to production)
81
+ */
82
+ constructor(config: VoiceAIConfig);
83
+ /**
84
+ * Connect to a voice agent for real-time conversation
85
+ *
86
+ * @param options - Connection options
87
+ * @param options.agentId - ID of the agent to connect to
88
+ * @param options.autoPublishMic - Auto-enable microphone (default: true)
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * await voiceai.connect({ agentId: 'agent-123' });
93
+ * ```
94
+ */
95
+ connect(options: ConnectionOptions): Promise<void>;
96
+ /**
97
+ * Disconnect from the voice agent and end the call
98
+ */
99
+ disconnect(): Promise<void>;
100
+ /**
101
+ * Check if currently connected to a voice agent
102
+ */
103
+ isConnected(): boolean;
104
+ /**
105
+ * Get current connection status
106
+ */
107
+ getStatus(): ConnectionStatus;
108
+ /**
109
+ * Get current agent state (listening, speaking, thinking, etc.)
110
+ */
111
+ getAgentState(): AgentStateInfo;
112
+ /**
113
+ * Get current microphone state
114
+ */
115
+ getMicrophoneState(): MicrophoneState;
116
+ /**
117
+ * Send a text message to the agent
118
+ */
119
+ sendMessage(text: string): Promise<void>;
120
+ /**
121
+ * Enable or disable the microphone
122
+ */
123
+ setMicrophoneEnabled(enabled: boolean): Promise<void>;
124
+ /**
125
+ * Subscribe to transcription events (user and agent speech)
126
+ * @returns Unsubscribe function
127
+ */
128
+ onTranscription(handler: TranscriptionHandler): () => void;
129
+ /**
130
+ * Subscribe to connection status changes
131
+ * @returns Unsubscribe function
132
+ */
133
+ onStatusChange(handler: ConnectionStatusHandler): () => void;
134
+ /**
135
+ * Subscribe to error events
136
+ * @returns Unsubscribe function
137
+ */
138
+ onError(handler: ErrorHandler): () => void;
139
+ /**
140
+ * Subscribe to agent state changes (listening, speaking, thinking)
141
+ * @returns Unsubscribe function
142
+ */
143
+ onAgentStateChange(handler: AgentStateHandler): () => void;
144
+ /**
145
+ * Subscribe to audio level updates (for visualizations)
146
+ * @returns Unsubscribe function
147
+ */
148
+ onAudioLevel(handler: AudioLevelHandler): () => void;
149
+ /**
150
+ * Subscribe to microphone state changes
151
+ * @returns Unsubscribe function
152
+ */
153
+ onMicrophoneStateChange(handler: MicrophoneStateHandler): () => void;
154
+ private isTokenExpired;
155
+ private getOrRefreshConnectionDetails;
156
+ private getConnectionDetails;
157
+ private setupAudio;
158
+ private setupRoomListeners;
159
+ private detectAgentParticipant;
160
+ private startAudioLevelMonitoring;
161
+ private stopAudioLevelMonitoring;
162
+ private updateAgentState;
163
+ private updateStatus;
164
+ private emitTranscription;
165
+ private emitError;
166
+ private emitAgentState;
167
+ private emitAudioLevel;
168
+ private emitMicrophoneState;
169
+ }
170
+ /** Default export - the VoiceAI class */
171
+ export default VoiceAI;
172
+ /** Error class for API errors */
173
+ export { VoiceAIError } from './client/base';
174
+ export type { VoiceAIConfig, ConnectionOptions, ConnectionDetails, ConnectionStatus, TranscriptionSegment, TranscriptionHandler, ConnectionStatusHandler, ErrorHandler, AgentStateHandler, AudioLevelHandler, MicrophoneStateHandler, AgentState, AgentStateInfo, AudioLevelInfo, MicrophoneState, AudioCaptureOptions, TTSParams, MCPServerConfig, PublicAgentConfig, Agent, CreateAgentRequest, UpdateAgentRequest, AgentDeployResponse, AgentPauseResponse, AgentDeleteResponse, AgentConnectionStatusResponse, InitAgentRequest, InitAgentResponse, PaginatedAgentResponse, ListAgentsOptions, CallHistoryItem, PaginatedCallHistoryResponse, GetCallHistoryOptions, TranscriptResponse, KnowledgeBaseDocument, CreateKnowledgeBaseRequest, UpdateKnowledgeBaseRequest, KnowledgeBaseResponse, KnowledgeBaseWithDocuments, PaginatedKnowledgeBaseResponse, PhoneNumberInfo, AvailablePhoneNumber, SearchPhoneNumbersRequest, SearchPhoneNumbersResponse, PurchasePhoneNumberRequest, PurchasePhoneNumberResponse, AllPhoneNumbersResponse, PaginationMeta, PaginationOptions, ErrorResponse, } from './types';
175
+ /**
176
+ * Generate optimized audio capture options for voice agents
177
+ *
178
+ * @param options - Optional overrides
179
+ * @returns AudioCaptureOptions optimized for voice
180
+ */
181
+ export declare function generateOptimalAudioOptions(options?: Partial<AudioCaptureOptions>): AudioCaptureOptions;
182
+ export { VoiceAgentWidget } from './components/VoiceAgentWidget';
183
+ export type { VoiceAgentWidgetOptions, VoiceAgentWidgetTheme } from './components/VoiceAgentWidget';
184
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}