@hivegpt/hiveai-angular 0.0.581 → 0.0.582
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/bundles/hivegpt-hiveai-angular.umd.js +285 -503
- package/bundles/hivegpt-hiveai-angular.umd.js.map +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js +1 -1
- package/bundles/hivegpt-hiveai-angular.umd.min.js.map +1 -1
- package/esm2015/hivegpt-hiveai-angular.js +4 -5
- package/esm2015/lib/components/voice-agent/services/audio-analyzer.service.js +3 -3
- package/esm2015/lib/components/voice-agent/services/voice-agent.service.js +118 -85
- package/esm2015/lib/components/voice-agent/services/websocket-voice-client.service.js +114 -46
- package/esm2015/lib/components/voice-agent/voice-agent.module.js +3 -5
- package/fesm2015/hivegpt-hiveai-angular.js +223 -422
- package/fesm2015/hivegpt-hiveai-angular.js.map +1 -1
- package/hivegpt-hiveai-angular.d.ts +3 -4
- package/hivegpt-hiveai-angular.d.ts.map +1 -1
- package/hivegpt-hiveai-angular.metadata.json +1 -1
- package/lib/components/voice-agent/services/audio-analyzer.service.d.ts +2 -2
- package/lib/components/voice-agent/services/voice-agent.service.d.ts +11 -13
- package/lib/components/voice-agent/services/voice-agent.service.d.ts.map +1 -1
- package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts +23 -20
- package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts.map +1 -1
- package/lib/components/voice-agent/voice-agent.module.d.ts +1 -1
- package/lib/components/voice-agent/voice-agent.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/esm2015/lib/components/voice-agent/services/daily-voice-client.service.js +0 -305
- package/lib/components/voice-agent/services/daily-voice-client.service.d.ts +0 -62
- package/lib/components/voice-agent/services/daily-voice-client.service.d.ts.map +0 -1
|
@@ -1,70 +1,83 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
1
|
+
import { Injectable, NgZone } from '@angular/core';
|
|
2
2
|
import { Subject } from 'rxjs';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
/**
|
|
5
|
-
* WebSocket
|
|
5
|
+
* Native WebSocket client for voice session (signaling, transcripts, speaking hints).
|
|
6
6
|
* CRITICAL: Uses native WebSocket only. NO Socket.IO, NO ngx-socket-io.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* - Parse JSON messages (room_created, user_transcript, bot_transcript)
|
|
11
|
-
* - Emit roomCreated$, userTranscript$, botTranscript$
|
|
12
|
-
* - NO audio logic, NO mic logic. Audio is handled by Daily.js (WebRTC).
|
|
8
|
+
* Connects to `ws_url` from `POST {baseUrl}/ai/ask-voice-socket`.
|
|
9
|
+
* Parses JSON messages for transcripts and optional assistant/user speaking flags.
|
|
13
10
|
*/
|
|
14
11
|
export class WebSocketVoiceClientService {
|
|
15
|
-
constructor() {
|
|
12
|
+
constructor(ngZone) {
|
|
13
|
+
this.ngZone = ngZone;
|
|
16
14
|
this.ws = null;
|
|
17
|
-
|
|
15
|
+
/** True when {@link disconnect} initiated the close (not counted as remote close). */
|
|
16
|
+
this.closeInitiatedByClient = false;
|
|
17
|
+
this.openedSubject = new Subject();
|
|
18
|
+
this.remoteCloseSubject = new Subject();
|
|
18
19
|
this.userTranscriptSubject = new Subject();
|
|
19
20
|
this.botTranscriptSubject = new Subject();
|
|
20
|
-
|
|
21
|
-
this.
|
|
22
|
-
/**
|
|
21
|
+
this.assistantSpeakingSubject = new Subject();
|
|
22
|
+
this.serverUserSpeakingSubject = new Subject();
|
|
23
|
+
/** Fires once each time the WebSocket reaches OPEN. */
|
|
24
|
+
this.opened$ = this.openedSubject.asObservable();
|
|
25
|
+
/** Fires when the socket closes without a client-initiated {@link disconnect}. */
|
|
26
|
+
this.remoteClose$ = this.remoteCloseSubject.asObservable();
|
|
23
27
|
this.userTranscript$ = this.userTranscriptSubject.asObservable();
|
|
24
|
-
/** Emits bot transcript updates. */
|
|
25
28
|
this.botTranscript$ = this.botTranscriptSubject.asObservable();
|
|
29
|
+
/** Assistant/bot speaking, when the server sends explicit events (see {@link handleJsonMessage}). */
|
|
30
|
+
this.assistantSpeaking$ = this.assistantSpeakingSubject.asObservable();
|
|
31
|
+
/** User speaking from server-side VAD, if provided. */
|
|
32
|
+
this.serverUserSpeaking$ = this.serverUserSpeakingSubject.asObservable();
|
|
26
33
|
}
|
|
27
|
-
/** Connect to signaling WebSocket. No audio over this connection. */
|
|
28
34
|
connect(wsUrl) {
|
|
29
35
|
var _a;
|
|
30
36
|
if (((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) {
|
|
31
37
|
return;
|
|
32
38
|
}
|
|
33
39
|
if (this.ws) {
|
|
40
|
+
this.closeInitiatedByClient = true;
|
|
34
41
|
this.ws.close();
|
|
35
|
-
this.ws = null;
|
|
36
42
|
}
|
|
37
43
|
try {
|
|
38
|
-
|
|
39
|
-
this.ws
|
|
40
|
-
|
|
44
|
+
const socket = new WebSocket(wsUrl);
|
|
45
|
+
this.ws = socket;
|
|
46
|
+
socket.onopen = () => {
|
|
47
|
+
if (this.ws !== socket)
|
|
48
|
+
return;
|
|
49
|
+
this.ngZone.run(() => this.openedSubject.next());
|
|
50
|
+
};
|
|
51
|
+
socket.onmessage = (event) => {
|
|
52
|
+
if (this.ws !== socket)
|
|
53
|
+
return;
|
|
54
|
+
if (typeof event.data !== 'string') {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
41
57
|
try {
|
|
42
58
|
const msg = JSON.parse(event.data);
|
|
43
|
-
|
|
44
|
-
const roomUrl = ((_a = msg.room_url) !== null && _a !== void 0 ? _a : msg.roomUrl);
|
|
45
|
-
if (typeof roomUrl === 'string') {
|
|
46
|
-
this.roomCreatedSubject.next(roomUrl);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
else if ((msg === null || msg === void 0 ? void 0 : msg.type) === 'user_transcript' && typeof msg.text === 'string') {
|
|
50
|
-
this.userTranscriptSubject.next({
|
|
51
|
-
text: msg.text,
|
|
52
|
-
final: msg.final === true,
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
else if ((msg === null || msg === void 0 ? void 0 : msg.type) === 'bot_transcript' && typeof msg.text === 'string') {
|
|
56
|
-
this.botTranscriptSubject.next(msg.text);
|
|
57
|
-
}
|
|
59
|
+
this.ngZone.run(() => this.handleJsonMessage(msg));
|
|
58
60
|
}
|
|
59
|
-
catch (
|
|
60
|
-
// Ignore non-JSON
|
|
61
|
+
catch (_a) {
|
|
62
|
+
// Ignore non-JSON
|
|
61
63
|
}
|
|
62
64
|
};
|
|
63
|
-
|
|
64
|
-
this.
|
|
65
|
+
socket.onerror = () => {
|
|
66
|
+
this.ngZone.run(() => {
|
|
67
|
+
if (this.ws === socket && socket.readyState !== WebSocket.CLOSED) {
|
|
68
|
+
socket.close();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
65
71
|
};
|
|
66
|
-
|
|
67
|
-
this.ws
|
|
72
|
+
socket.onclose = () => {
|
|
73
|
+
if (this.ws === socket) {
|
|
74
|
+
this.ws = null;
|
|
75
|
+
}
|
|
76
|
+
const client = this.closeInitiatedByClient;
|
|
77
|
+
this.closeInitiatedByClient = false;
|
|
78
|
+
if (!client) {
|
|
79
|
+
this.ngZone.run(() => this.remoteCloseSubject.next());
|
|
80
|
+
}
|
|
68
81
|
};
|
|
69
82
|
}
|
|
70
83
|
catch (err) {
|
|
@@ -73,23 +86,78 @@ export class WebSocketVoiceClientService {
|
|
|
73
86
|
throw err;
|
|
74
87
|
}
|
|
75
88
|
}
|
|
76
|
-
|
|
89
|
+
handleJsonMessage(msg) {
|
|
90
|
+
const type = msg.type;
|
|
91
|
+
const typeStr = typeof type === 'string' ? type : '';
|
|
92
|
+
if (typeStr === 'session_ready' || typeStr === 'connected' || typeStr === 'voice_session_started') {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (typeStr === 'assistant_speaking' ||
|
|
96
|
+
typeStr === 'bot_speaking') {
|
|
97
|
+
if (msg.active === true || msg.speaking === true) {
|
|
98
|
+
this.assistantSpeakingSubject.next(true);
|
|
99
|
+
}
|
|
100
|
+
else if (msg.active === false || msg.speaking === false) {
|
|
101
|
+
this.assistantSpeakingSubject.next(false);
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (typeStr === 'user_speaking') {
|
|
106
|
+
if (msg.active === true || msg.speaking === true) {
|
|
107
|
+
this.serverUserSpeakingSubject.next(true);
|
|
108
|
+
}
|
|
109
|
+
else if (msg.active === false || msg.speaking === false) {
|
|
110
|
+
this.serverUserSpeakingSubject.next(false);
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (typeStr === 'input_audio_buffer.speech_started') {
|
|
115
|
+
this.serverUserSpeakingSubject.next(true);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (typeStr === 'input_audio_buffer.speech_stopped') {
|
|
119
|
+
this.serverUserSpeakingSubject.next(false);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (typeStr === 'response.audio.delta') {
|
|
123
|
+
this.assistantSpeakingSubject.next(true);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (typeStr === 'response.audio.done' ||
|
|
127
|
+
typeStr === 'response.output_audio.done') {
|
|
128
|
+
this.assistantSpeakingSubject.next(false);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (typeStr === 'user_transcript' && typeof msg.text === 'string') {
|
|
132
|
+
this.userTranscriptSubject.next({
|
|
133
|
+
text: msg.text,
|
|
134
|
+
final: msg.final === true,
|
|
135
|
+
});
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (typeStr === 'bot_transcript' && typeof msg.text === 'string') {
|
|
139
|
+
this.botTranscriptSubject.next(msg.text);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
77
142
|
disconnect() {
|
|
78
|
-
if (this.ws) {
|
|
79
|
-
|
|
80
|
-
this.ws = null;
|
|
143
|
+
if (!this.ws) {
|
|
144
|
+
return;
|
|
81
145
|
}
|
|
146
|
+
this.closeInitiatedByClient = true;
|
|
147
|
+
this.ws.close();
|
|
82
148
|
}
|
|
83
|
-
/** Whether the WebSocket is open. */
|
|
84
149
|
get isConnected() {
|
|
85
150
|
var _a;
|
|
86
151
|
return ((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN;
|
|
87
152
|
}
|
|
88
153
|
}
|
|
89
|
-
WebSocketVoiceClientService.ɵprov = i0.ɵɵdefineInjectable({ factory: function WebSocketVoiceClientService_Factory() { return new WebSocketVoiceClientService(); }, token: WebSocketVoiceClientService, providedIn: "root" });
|
|
154
|
+
WebSocketVoiceClientService.ɵprov = i0.ɵɵdefineInjectable({ factory: function WebSocketVoiceClientService_Factory() { return new WebSocketVoiceClientService(i0.ɵɵinject(i0.NgZone)); }, token: WebSocketVoiceClientService, providedIn: "root" });
|
|
90
155
|
WebSocketVoiceClientService.decorators = [
|
|
91
156
|
{ type: Injectable, args: [{
|
|
92
157
|
providedIn: 'root',
|
|
93
158
|
},] }
|
|
94
159
|
];
|
|
95
|
-
|
|
160
|
+
WebSocketVoiceClientService.ctorParameters = () => [
|
|
161
|
+
{ type: NgZone }
|
|
162
|
+
];
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXZvaWNlLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3NlcnZpY2VzL3dlYnNvY2tldC12b2ljZS1jbGllbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQXVCM0M7Ozs7OztHQU1HO0FBSUgsTUFBTSxPQUFPLDJCQUEyQjtJQWdDdEMsWUFBb0IsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUEvQjFCLE9BQUUsR0FBcUIsSUFBSSxDQUFDO1FBQ3BDLHNGQUFzRjtRQUM5RSwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFFL0Isa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3BDLHVCQUFrQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDekMsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7UUFDdEQseUJBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUM3Qyw2QkFBd0IsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ2xELDhCQUF5QixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFFM0QsdURBQXVEO1FBQ3ZELFlBQU8sR0FBcUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUU5RCxrRkFBa0Y7UUFDbEYsaUJBQVksR0FBcUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXhFLG9CQUFlLEdBQ2IsSUFBSSxDQUFD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QUcsSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksV0FBVzs7UUFDYixPQUFPLENBQUEsTUFBQSxJQUFJLENBQUMsRUFBRSwwQ0FBRSxVQUFVLE1BQUssU0FBUyxDQUFDLElBQUksQ0FBQztJQUNoRCxDQUFDOzs7O1lBaktGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBakNvQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbi8qKiBXZWJTb2NrZXQgbWVzc2FnZSB0eXBlcyBmcm9tIGJhY2tlbmQgKHZvaWNlIHNlc3Npb24gb3ZlciBhIHNpbmdsZSBXUykuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzTWVzc2FnZVVzZXJUcmFuc2NyaXB0IHtcbiAgdHlwZTogJ3VzZXJfdHJhbnNjcmlwdCc7XG4gIHRleHQ6IHN0cmluZztcbiAgZmluYWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdzTWVzc2FnZUJvdFRyYW5zY3JpcHQge1xuICB0eXBlOiAnYm90X3RyYW5zY3JpcHQnO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFdzTWVzc2FnZSA9XG4gIHwgV3NNZXNzYWdlVXNlclRyYW5zY3JpcHRcbiAgfCBXc01lc3NhZ2VCb3RUcmFuc2NyaXB0O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHREYXRhIHtcbiAgdGV4dDogc3RyaW5nO1xuICBmaW5hbDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBOYXRpdmUgV2ViU29ja2V0IGNsaWVudCBmb3Igdm9pY2Ugc2Vzc2lvbiAoc2lnbmFsaW5nLCB0cmFuc2NyaXB0cywgc3BlYWtpbmcgaGludHMpLlxuICogQ1JJVElDQUw6IFVzZXMgbmF0aXZlIFdlYlNvY2tldCBvbmx5LiBOTyBTb2NrZXQuSU8sIE5PIG5neC1zb2NrZXQtaW8uXG4gKlxuICogQ29ubmVjdHMgdG8gYHdzX3VybGAgZnJvbSBgUE9TVCB7YmFzZVVybH0vYWkvYXNrLXZvaWNlLXNvY2tldGAuXG4gKiBQYXJzZXMgSlNPTiBtZXNzYWdlcyBmb3IgdHJhbnNjcmlwdHMgYW5kIG9wdGlvbmFsIGFzc2lzdGFudC91c2VyIHNwZWFraW5nIGZsYWdzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0Vm9pY2VDbGllbnRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSB3czogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUcnVlIHdoZW4ge0BsaW5rIGRpc2Nvbm5lY3R9IGluaXRpYXRlZCB0aGUgY2xvc2UgKG5vdCBjb3VudGVkIGFzIHJlbW90ZSBjbG9zZSkuICovXG4gIHByaXZhdGUgY2xvc2VJbml0aWF0ZWRCeUNsaWVudCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgb3BlbmVkU3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVtb3RlQ2xvc2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSB1c2VyVHJhbnNjcmlwdFN1YmplY3QgPSBuZXcgU3ViamVjdDxUcmFuc2NyaXB0RGF0YT4oKTtcbiAgcHJpdmF0ZSBib3RUcmFuc2NyaXB0U3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBhc3Npc3RhbnRTcGVha2luZ1N1YmplY3QgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIHNlcnZlclVzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIC8qKiBGaXJlcyBvbmNlIGVhY2ggdGltZSB0aGUgV2ViU29ja2V0IHJlYWNoZXMgT1BFTi4gKi9cbiAgb3BlbmVkJDogT2JzZXJ2YWJsZTx2b2lkPiA9IHRoaXMub3BlbmVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogRmlyZXMgd2hlbiB0aGUgc29ja2V0IGNsb3NlcyB3aXRob3V0IGEgY2xpZW50LWluaXRpYXRlZCB7QGxpbmsgZGlzY29ubmVjdH0uICovXG4gIHJlbW90ZUNsb3NlJDogT2JzZXJ2YWJsZTx2b2lkPiA9IHRoaXMucmVtb3RlQ2xvc2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHVzZXJUcmFuc2NyaXB0JDogT2JzZXJ2YWJsZTxUcmFuc2NyaXB0RGF0YT4gPVxuICAgIHRoaXMudXNlclRyYW5zY3JpcHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGJvdFRyYW5zY3JpcHQkOiBPYnNlcnZhYmxlPHN0cmluZz4gPVxuICAgIHRoaXMuYm90VHJhbnNjcmlwdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIEFzc2lzdGFudC9ib3Qgc3BlYWtpbmcsIHdoZW4gdGhlIHNlcnZlciBzZW5kcyBleHBsaWNpdCBldmVudHMgKHNlZSB7QGxpbmsgaGFuZGxlSnNvbk1lc3NhZ2V9KS4gKi9cbiAgYXNzaXN0YW50U3BlYWtpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID1cbiAgICB0aGlzLmFzc2lzdGFudFNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogVXNlciBzcGVha2luZyBmcm9tIHNlcnZlci1zaWRlIFZBRCwgaWYgcHJvdmlkZWQuICovXG4gIHNlcnZlclVzZXJTcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPVxuICAgIHRoaXMuc2VydmVyVXNlclNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lKSB7fVxuXG4gIGNvbm5lY3Qod3NVcmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLndzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy53cykge1xuICAgICAgdGhpcy5jbG9zZUluaXRpYXRlZEJ5Q2xpZW50ID0gdHJ1ZTtcbiAgICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh3c1VybCk7XG4gICAgICB0aGlzLndzID0gc29ja2V0O1xuICAgICAgc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMud3MgIT09IHNvY2tldCkgcmV0dXJuO1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5vcGVuZWRTdWJqZWN0Lm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLndzICE9PSBzb2NrZXQpIHJldHVybjtcbiAgICAgICAgaWYgKHR5cGVvZiBldmVudC5kYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlSnNvbk1lc3NhZ2UobXNnKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSBub24tSlNPTlxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc29ja2V0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMud3MgPT09IHNvY2tldCAmJiBzb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0LkNMT1NFRCkge1xuICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBzb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMud3MgPT09IHNvY2tldCkge1xuICAgICAgICAgIHRoaXMud3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xvc2VJbml0aWF0ZWRCeUNsaWVudDtcbiAgICAgICAgdGhpcy5jbG9zZUluaXRpYXRlZEJ5Q2xpZW50ID0gZmFsc2U7XG4gICAgICAgIGlmICghY2xpZW50KSB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMucmVtb3RlQ2xvc2VTdWJqZWN0Lm5leHQoKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdXZWJTb2NrZXRWb2ljZUNsaWVudDogY29ubmVjdCBmYWlsZWQnLCBlcnIpO1xuICAgICAgdGhpcy53cyA9IG51bGw7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVKc29uTWVzc2FnZShtc2c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgY29uc3QgdHlwZSA9IG1zZy50eXBlO1xuICAgIGNvbnN0IHR5cGVTdHIgPSB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgPyB0eXBlIDogJyc7XG5cbiAgICBpZiAodHlwZVN0ciA9PT0gJ3Nlc3Npb25fcmVhZHknIHx8IHR5cGVTdHIgPT09ICdjb25uZWN0ZWQnIHx8IHR5cGVTdHIgPT09ICd2b2ljZV9zZXNzaW9uX3N0YXJ0ZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZVN0ciA9PT0gJ2Fzc2lzdGFudF9zcGVha2luZycgfHxcbiAgICAgIHR5cGVTdHIgPT09ICdib3Rfc3BlYWtpbmcnXG4gICAgKSB7XG4gICAgICBpZiAobXNnLmFjdGl2ZSA9PT0gdHJ1ZSB8fCBtc2cuc3BlYWtpbmcgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5hc3Npc3RhbnRTcGVha2luZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAobXNnLmFjdGl2ZSA9PT0gZmFsc2UgfHwgbXNnLnNwZWFraW5nID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLmFzc2lzdGFudFNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZVN0ciA9PT0gJ3VzZXJfc3BlYWtpbmcnKSB7XG4gICAgICBpZiAobXNnLmFjdGl2ZSA9PT0gdHJ1ZSB8fCBtc2cuc3BlYWtpbmcgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXJVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKG1zZy5hY3RpdmUgPT09IGZhbHNlIHx8IG1zZy5zcGVha2luZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXJVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlU3RyID09PSAnaW5wdXRfYXVkaW9fYnVmZmVyLnNwZWVjaF9zdGFydGVkJykge1xuICAgICAgdGhpcy5zZXJ2ZXJVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlU3RyID09PSAnaW5wdXRfYXVkaW9fYnVmZmVyLnNwZWVjaF9zdG9wcGVkJykge1xuICAgICAgdGhpcy5zZXJ2ZXJVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlU3RyID09PSAncmVzcG9uc2UuYXVkaW8uZGVsdGEnKSB7XG4gICAgICB0aGlzLmFzc2lzdGFudFNwZWFraW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlU3RyID09PSAncmVzcG9uc2UuYXVkaW8uZG9uZScgfHxcbiAgICAgIHR5cGVTdHIgPT09ICdyZXNwb25zZS5vdXRwdXRfYXVkaW8uZG9uZSdcbiAgICApIHtcbiAgICAgIHRoaXMuYXNzaXN0YW50U3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlU3RyID09PSAndXNlcl90cmFuc2NyaXB0JyAmJiB0eXBlb2YgbXNnLnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnVzZXJUcmFuc2NyaXB0U3ViamVjdC5uZXh0KHtcbiAgICAgICAgdGV4dDogbXNnLnRleHQsXG4gICAgICAgIGZpbmFsOiBtc2cuZmluYWwgPT09IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVTdHIgPT09ICdib3RfdHJhbnNjcmlwdCcgJiYgdHlwZW9mIG1zZy50ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5ib3RUcmFuc2NyaXB0U3ViamVjdC5uZXh0KG1zZy50ZXh0KTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy53cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlSW5pdGlhdGVkQnlDbGllbnQgPSB0cnVlO1xuICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgfVxuXG4gIGdldCBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU47XG4gIH1cbn1cbiJdfQ==
|
|
@@ -4,9 +4,8 @@ import { VoiceAgentModalComponent } from './components/voice-agent-modal/voice-a
|
|
|
4
4
|
import { VoiceAgentService } from './services/voice-agent.service';
|
|
5
5
|
import { AudioAnalyzerService } from './services/audio-analyzer.service';
|
|
6
6
|
import { WebSocketVoiceClientService } from './services/websocket-voice-client.service';
|
|
7
|
-
import { DailyVoiceClientService } from './services/daily-voice-client.service';
|
|
8
7
|
/**
|
|
9
|
-
* Voice agent module. Uses native WebSocket
|
|
8
|
+
* Voice agent module. Uses native WebSocket for the voice session.
|
|
10
9
|
* Does NOT use Socket.IO or ngx-socket-io.
|
|
11
10
|
*/
|
|
12
11
|
export class VoiceAgentModule {
|
|
@@ -22,12 +21,11 @@ VoiceAgentModule.decorators = [
|
|
|
22
21
|
providers: [
|
|
23
22
|
VoiceAgentService,
|
|
24
23
|
AudioAnalyzerService,
|
|
25
|
-
WebSocketVoiceClientService
|
|
26
|
-
DailyVoiceClientService
|
|
24
|
+
WebSocketVoiceClientService
|
|
27
25
|
],
|
|
28
26
|
exports: [
|
|
29
27
|
VoiceAgentModalComponent
|
|
30
28
|
]
|
|
31
29
|
},] }
|
|
32
30
|
];
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3ZvaWNlLWFnZW50Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUV4Rjs7O0dBR0c7QUFpQkgsTUFBTSxPQUFPLGdCQUFnQjs7O1lBaEI1QixRQUFRLFNBQUM7Z0JBQ1IsWUFBWSxFQUFFO29CQUNaLHdCQUF3QjtpQkFDekI7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLFlBQVk7aUJBQ2I7Z0JBQ0QsU0FBUyxFQUFFO29CQUNULGlCQUFpQjtvQkFDakIsb0JBQW9CO29CQUNwQiwyQkFBMkI7aUJBQzVCO2dCQUNELE9BQU8sRUFBRTtvQkFDUCx3QkFBd0I7aUJBQ3pCO2FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFZvaWNlQWdlbnRNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy92b2ljZS1hZ2VudC1tb2RhbC92b2ljZS1hZ2VudC1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVm9pY2VBZ2VudFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQXVkaW9BbmFseXplclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2F1ZGlvLWFuYWx5emVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2ViU29ja2V0Vm9pY2VDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy93ZWJzb2NrZXQtdm9pY2UtY2xpZW50LnNlcnZpY2UnO1xuXG4vKipcbiAqIFZvaWNlIGFnZW50IG1vZHVsZS4gVXNlcyBuYXRpdmUgV2ViU29ja2V0IGZvciB0aGUgdm9pY2Ugc2Vzc2lvbi5cbiAqIERvZXMgTk9UIHVzZSBTb2NrZXQuSU8gb3Igbmd4LXNvY2tldC1pby5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgVm9pY2VBZ2VudE1vZGFsQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGVcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgVm9pY2VBZ2VudFNlcnZpY2UsXG4gICAgQXVkaW9BbmFseXplclNlcnZpY2UsXG4gICAgV2ViU29ja2V0Vm9pY2VDbGllbnRTZXJ2aWNlXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBWb2ljZUFnZW50TW9kYWxDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50TW9kdWxlIHsgfVxuIl19
|