@eka-care/medassist-core 1.0.50 → 1.0.52
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/Synapse.d.ts +4 -0
- package/dist/Synapse.d.ts.map +1 -1
- package/dist/Synapse.js +23 -0
- package/dist/constants/index.d.ts +0 -7
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +1 -13
- package/dist/conversation.d.ts +7 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +10 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/messages/types.d.ts +2 -5
- package/dist/messages/types.d.ts.map +1 -1
- package/dist/resources/toolCall/types.d.ts +6 -4
- package/dist/resources/toolCall/types.d.ts.map +1 -1
- package/dist/voice/VoiceAgent.d.ts +42 -0
- package/dist/voice/VoiceAgent.d.ts.map +1 -0
- package/dist/voice/VoiceAgent.js +301 -0
- package/dist/voice/VoiceAudioAnalyser.d.ts +7 -0
- package/dist/voice/VoiceAudioAnalyser.d.ts.map +1 -0
- package/dist/voice/VoiceAudioAnalyser.js +36 -0
- package/dist/voice/index.d.ts +3 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +20 -0
- package/dist/voice/types.d.ts +36 -0
- package/dist/voice/types.d.ts.map +1 -0
- package/dist/voice/types.js +18 -0
- package/package.json +1 -1
package/dist/Synapse.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { SYNAPSE_REALTIME_EVENTS } from "./messages/types";
|
|
|
6
6
|
import { type SessionResponse } from "./resources/session/types";
|
|
7
7
|
import { type AudioMetaData } from "./media/audio/types";
|
|
8
8
|
import type { AgentConfigResponse, ExistingSessionOptions, SendMessageOptions, SynapseSDKConfig, USER_FEEDBACK } from "./types";
|
|
9
|
+
import { VoiceAgent } from "./voice/VoiceAgent";
|
|
9
10
|
export declare class SynapseSDK {
|
|
10
11
|
private connection;
|
|
11
12
|
private messageManager;
|
|
@@ -16,6 +17,7 @@ export declare class SynapseSDK {
|
|
|
16
17
|
private isRefreshingSession;
|
|
17
18
|
private connectionAttempts;
|
|
18
19
|
private sdkEventEmitter;
|
|
20
|
+
private _voice;
|
|
19
21
|
constructor(config: SynapseSDKConfig);
|
|
20
22
|
/**
|
|
21
23
|
* Start the session
|
|
@@ -62,10 +64,12 @@ export declare class SynapseSDK {
|
|
|
62
64
|
endRecording(): void;
|
|
63
65
|
getAgentConfig(): Promise<AgentConfigResponse>;
|
|
64
66
|
isConnected(): boolean;
|
|
67
|
+
get voice(): VoiceAgent;
|
|
65
68
|
/**
|
|
66
69
|
* End the session
|
|
67
70
|
*/
|
|
68
71
|
endSession(): void;
|
|
72
|
+
private buildVoiceConfig;
|
|
69
73
|
private emitError;
|
|
70
74
|
private toSessionError;
|
|
71
75
|
/**
|
package/dist/Synapse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Synapse.d.ts","sourceRoot":"","sources":["../src/Synapse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,EACL,uBAAuB,EAExB,MAAM,kBAAkB,CAAC;AAsB1B,OAAO,EACL,KAAK,eAAe,EACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,kBAAkB,EAA2C,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Synapse.d.ts","sourceRoot":"","sources":["../src/Synapse.ts"],"names":[],"mappings":"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"}
|
package/dist/Synapse.js
CHANGED
|
@@ -16,6 +16,7 @@ const EventEmitter_1 = require("./internal/events/EventEmitter");
|
|
|
16
16
|
const Error_1 = require("./utils/Error");
|
|
17
17
|
const Error_2 = require("./internal/Error/Error");
|
|
18
18
|
const Events_1 = require("./events/Events");
|
|
19
|
+
const VoiceAgent_1 = require("./voice/VoiceAgent");
|
|
19
20
|
//TODO: Fix issue with handling error content type ,which is comming as a connection error to the user
|
|
20
21
|
class SynapseSDK {
|
|
21
22
|
connection = null;
|
|
@@ -28,6 +29,7 @@ class SynapseSDK {
|
|
|
28
29
|
isRefreshingSession = false;
|
|
29
30
|
connectionAttempts = 0;
|
|
30
31
|
sdkEventEmitter = new EventEmitter_1.EventEmitter();
|
|
32
|
+
_voice = null;
|
|
31
33
|
constructor(config) {
|
|
32
34
|
this.config = {
|
|
33
35
|
...config,
|
|
@@ -274,14 +276,35 @@ class SynapseSDK {
|
|
|
274
276
|
isConnected() {
|
|
275
277
|
return this.connection?.isConnected() ?? false;
|
|
276
278
|
}
|
|
279
|
+
get voice() {
|
|
280
|
+
if (!this._voice) {
|
|
281
|
+
this._voice = new VoiceAgent_1.VoiceAgent(this.buildVoiceConfig(), () => {
|
|
282
|
+
const s = this.getSessionConfig();
|
|
283
|
+
return { sessionId: s.session_id, sessionToken: s.session_token };
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
return this._voice;
|
|
287
|
+
}
|
|
277
288
|
/**
|
|
278
289
|
* End the session
|
|
279
290
|
*/
|
|
280
291
|
endSession() {
|
|
281
292
|
console.log("end sesion called ");
|
|
293
|
+
this._voice?.destroy();
|
|
294
|
+
this._voice = null;
|
|
282
295
|
this.closeConnection();
|
|
283
296
|
this.cleanup();
|
|
284
297
|
}
|
|
298
|
+
buildVoiceConfig() {
|
|
299
|
+
const base = this.config.serverUrl ||
|
|
300
|
+
(0, constants_1.getConfig)(this.config.environment).BASE_API_URL;
|
|
301
|
+
return {
|
|
302
|
+
offerUrl: `${base}/med-assist/voice/offer`,
|
|
303
|
+
handleRefresh: async () => {
|
|
304
|
+
await this.handleSessionExpiry();
|
|
305
|
+
},
|
|
306
|
+
};
|
|
307
|
+
}
|
|
285
308
|
emitError(error) {
|
|
286
309
|
this.config.callbacks?.onError?.(error);
|
|
287
310
|
}
|
|
@@ -12,13 +12,6 @@ declare const STAGING_CONFIG: {
|
|
|
12
12
|
};
|
|
13
13
|
export type EnvironmentConfig = typeof DEVELOPMENT_CONFIG | typeof PRODUCTION_CONFIG | typeof STAGING_CONFIG;
|
|
14
14
|
export declare const getConfig: (environment?: Environment) => EnvironmentConfig;
|
|
15
|
-
export declare enum SYNAPSE_TOOL_NAME {
|
|
16
|
-
MOBILE_VERIFICATION = "mobile_verification",
|
|
17
|
-
AVAILABILITY_DATES = "availability_dates",
|
|
18
|
-
AVAILABILITY_SLOTS = "availability_slots",
|
|
19
|
-
DOCTOR_DETAILS = "doctor_details",
|
|
20
|
-
GET_LOCATION = "get_location"
|
|
21
|
-
}
|
|
22
15
|
export type Environment = "development" | "production" | "staging";
|
|
23
16
|
export {};
|
|
24
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,iBAAiB;;;CAGtB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,iBAAiB;;;CAGtB,CAAC;AAEF,QAAA,MAAM,kBAAkB;;;CAIvB,CAAC;AAEF,QAAA,MAAM,cAAc;;;CAGnB,CAAC;AACF,MAAM,MAAM,iBAAiB,GACzB,OAAO,kBAAkB,GACzB,OAAO,iBAAiB,GACxB,OAAO,cAAc,CAAC;AAE1B,eAAO,MAAM,SAAS,GACpB,cAAa,WAA0B,KACtC,iBASF,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC"}
|
package/dist/constants/index.js
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getConfig = void 0;
|
|
4
4
|
const PRODUCTION_CONFIG = {
|
|
5
5
|
WEBSOCKET_URL: "wss://matrix-ws.eka.care/reloaded",
|
|
6
6
|
BASE_API_URL: "https://matrix.eka.care/reloaded",
|
|
7
7
|
};
|
|
8
|
-
// const PRODUCTION_CONFIG = {
|
|
9
|
-
// WEBSOCKET_URL: "ws://87677104b49f.ngrok-free.app/reloaded",
|
|
10
|
-
// BASE_API_URL: "https://87677104b49f.ngrok-free.app/reloaded",
|
|
11
|
-
// }
|
|
12
8
|
const DEVELOPMENT_CONFIG = {
|
|
13
9
|
// can be used for local development
|
|
14
10
|
WEBSOCKET_URL: "wss://matrix-ws.dev.eka.care/reloaded",
|
|
@@ -31,11 +27,3 @@ const getConfig = (environment = "production") => {
|
|
|
31
27
|
return PRODUCTION_CONFIG;
|
|
32
28
|
};
|
|
33
29
|
exports.getConfig = getConfig;
|
|
34
|
-
var SYNAPSE_TOOL_NAME;
|
|
35
|
-
(function (SYNAPSE_TOOL_NAME) {
|
|
36
|
-
SYNAPSE_TOOL_NAME["MOBILE_VERIFICATION"] = "mobile_verification";
|
|
37
|
-
SYNAPSE_TOOL_NAME["AVAILABILITY_DATES"] = "availability_dates";
|
|
38
|
-
SYNAPSE_TOOL_NAME["AVAILABILITY_SLOTS"] = "availability_slots";
|
|
39
|
-
SYNAPSE_TOOL_NAME["DOCTOR_DETAILS"] = "doctor_details";
|
|
40
|
-
SYNAPSE_TOOL_NAME["GET_LOCATION"] = "get_location";
|
|
41
|
-
})(SYNAPSE_TOOL_NAME || (exports.SYNAPSE_TOOL_NAME = SYNAPSE_TOOL_NAME = {}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAAA,oBAAY,oBAAoB;IAC9B,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;CAChB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SYNAPSE_CONVERSATION = void 0;
|
|
4
|
+
var SYNAPSE_CONVERSATION;
|
|
5
|
+
(function (SYNAPSE_CONVERSATION) {
|
|
6
|
+
SYNAPSE_CONVERSATION["TEXT"] = "text";
|
|
7
|
+
SYNAPSE_CONVERSATION["FILE"] = "file";
|
|
8
|
+
SYNAPSE_CONVERSATION["AUDIO"] = "audio";
|
|
9
|
+
SYNAPSE_CONVERSATION["VOICE"] = "voice";
|
|
10
|
+
})(SYNAPSE_CONVERSATION || (exports.SYNAPSE_CONVERSATION = SYNAPSE_CONVERSATION = {}));
|
package/dist/index.d.ts
CHANGED
|
@@ -27,4 +27,6 @@ export { ErrorUtils } from "./utils/Error";
|
|
|
27
27
|
export * from "./media/audio/types";
|
|
28
28
|
export type { SendMessageOptions } from "./types";
|
|
29
29
|
export { SYNAPSE_MESSAGE_TYPES } from "./messages/types";
|
|
30
|
+
export * from "./conversation";
|
|
31
|
+
export * from "./voice";
|
|
30
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,iBAAiB,EACjB,cAAc,GACf,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,cAAc,6BAA6B,CAAC;AAG5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,cAAc,4BAA4B,CAAC;AAG3C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,cAAc,qBAAqB,CAAC;AAEpC,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,iBAAiB,EACjB,cAAc,GACf,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,cAAc,6BAA6B,CAAC;AAG5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,cAAc,4BAA4B,CAAC;AAG3C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,cAAc,qBAAqB,CAAC;AAEpC,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -71,3 +71,5 @@ Object.defineProperty(exports, "ErrorUtils", { enumerable: true, get: function (
|
|
|
71
71
|
__exportStar(require("./media/audio/types"), exports);
|
|
72
72
|
var types_2 = require("./messages/types");
|
|
73
73
|
Object.defineProperty(exports, "SYNAPSE_MESSAGE_TYPES", { enumerable: true, get: function () { return types_2.SYNAPSE_MESSAGE_TYPES; } });
|
|
74
|
+
__exportStar(require("./conversation"), exports);
|
|
75
|
+
__exportStar(require("./voice"), exports);
|
package/dist/messages/types.d.ts
CHANGED
|
@@ -82,13 +82,11 @@ export type TDoctorAvailability = {
|
|
|
82
82
|
availability?: TAvailability[];
|
|
83
83
|
date_preference?: string;
|
|
84
84
|
slot_preference?: string;
|
|
85
|
-
} & {
|
|
86
|
-
[key: string]: unknown;
|
|
87
85
|
};
|
|
88
86
|
export type TAvailability = {
|
|
89
|
-
date
|
|
87
|
+
date: string;
|
|
90
88
|
day?: string;
|
|
91
|
-
slots
|
|
89
|
+
slots: string[];
|
|
92
90
|
selected_slot?: string;
|
|
93
91
|
};
|
|
94
92
|
export type THospital = {
|
|
@@ -113,7 +111,6 @@ export type TCardInput = {
|
|
|
113
111
|
title?: string;
|
|
114
112
|
tags?: string;
|
|
115
113
|
icon?: string;
|
|
116
|
-
img?: string;
|
|
117
114
|
description?: string;
|
|
118
115
|
banner?: {
|
|
119
116
|
text: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/messages/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,eAAO,MAAM,qBAAqB;;;;;;;;;CAAuB,CAAC;AAE1D,MAAM,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG,qBAAqB,CAAC;AACpD,MAAM,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,aAAa,EAAE,CAAA;CAClC;AACD,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAG1D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;CAY1B,CAAC;AAEX,MAAM,MAAM,uBAAuB,GACjC,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,OAAO,uBAAuB,CAAC,CAAC;AAEzE,eAAO,MAAM,4BAA4B;;;;;;;;;;;;CAY/B,CAAC;AAEX,MAAM,MAAM,4BAA4B,GACtC,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,OAAO,4BAA4B,CAAC,CAAC;AAEnF,eAAO,MAAM,gCAAgC;;CAEnC,CAAC;AAEX,MAAM,MAAM,gCAAgC,GAC1C,CAAC,OAAO,gCAAgC,CAAC,CAAC,MAAM,OAAO,gCAAgC,CAAC,CAAC;AAG3F,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAE/C,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/messages/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,9 @@ export declare enum SYNAPSE_COMPONENTS {
|
|
|
29
29
|
export type SYNAPSE_TOOL_TYPES = {
|
|
30
30
|
ELICITATION: "elicitation";
|
|
31
31
|
};
|
|
32
|
+
export type TDoctorDetailsMap = {
|
|
33
|
+
[doctor_id: string]: TDoctorDetails;
|
|
34
|
+
};
|
|
32
35
|
export type ToolCallbacks = {
|
|
33
36
|
[key in SYNAPSE_TOOL_CALLBACK_NAME]: {
|
|
34
37
|
tool_name: SYNAPSE_TOOL_NAME;
|
|
@@ -48,8 +51,8 @@ export type TGetLocationToolResponse = ResourceResponse & {
|
|
|
48
51
|
accuracy?: number;
|
|
49
52
|
};
|
|
50
53
|
export type TDoctorCardInput = {
|
|
51
|
-
|
|
52
|
-
doctor_details?:
|
|
54
|
+
doctors: TDoctorAvailability[];
|
|
55
|
+
doctor_details?: TDoctorDetailsMap;
|
|
53
56
|
};
|
|
54
57
|
export type TOption = {
|
|
55
58
|
id: string;
|
|
@@ -82,7 +85,7 @@ export type SynapseInputCompMap = {
|
|
|
82
85
|
};
|
|
83
86
|
export type SynapseSelectedCompMap = {
|
|
84
87
|
[SYNAPSE_COMPONENTS.CARD]: TCardInput;
|
|
85
|
-
[SYNAPSE_COMPONENTS.DOCTOR_CARD]:
|
|
88
|
+
[SYNAPSE_COMPONENTS.DOCTOR_CARD]: TDoctorCardInput;
|
|
86
89
|
[SYNAPSE_COMPONENTS.MEDIA_CARD]: TMediaCard;
|
|
87
90
|
[SYNAPSE_COMPONENTS.MULTI]: TOption;
|
|
88
91
|
[SYNAPSE_COMPONENTS.PILL]: TOption;
|
|
@@ -120,7 +123,6 @@ type BaseToolDetails = {
|
|
|
120
123
|
toast_message?: string;
|
|
121
124
|
mcp_meta_fields?: string[];
|
|
122
125
|
disp_toast_msg?: string;
|
|
123
|
-
orientation?: "vertical" | "horizontal";
|
|
124
126
|
};
|
|
125
127
|
};
|
|
126
128
|
type ComponentToolDetails<C extends SYNAPSE_COMPONENTS> = BaseToolDetails & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/resources/toolCall/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGjD,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAEpE,MAAM,MAAM,8BAA8B,GAAG,gBAAgB,GAAG;IAC9D,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG,gBAAgB,GAAG;IAC9D,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,oBAAY,iBAAiB;IAC3B,mBAAmB,wBAAwB;IAC3C,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;IACzC,mBAAmB,wBAAwB;IAC3C,cAAc,mBAAmB;IACjC,YAAY,iBAAiB;CAC9B;AAED,oBAAY,kBAAkB;IAC5B,MAAM,kBAAkB;IACxB,GAAG,QAAQ;IACX,KAAK,kBAAkB;IACvB,IAAI,UAAU;IACd,KAAK,UAAU;IACf,WAAW,gBAAgB;IAC3B,IAAI,SAAS;IACb,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,aAAa,CAAC;CAC5B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/resources/toolCall/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { VOICE_AGENT_STATE, type VoiceAgentConfig, type VoiceSessionCredentials } from "./types";
|
|
2
|
+
export declare class VoiceAgent {
|
|
3
|
+
private config;
|
|
4
|
+
private getCredentials;
|
|
5
|
+
private emitter;
|
|
6
|
+
private remoteAnalyser;
|
|
7
|
+
private localAnalyser;
|
|
8
|
+
private pc;
|
|
9
|
+
private pcId;
|
|
10
|
+
private dataChannel;
|
|
11
|
+
private localStream;
|
|
12
|
+
private remoteAudio;
|
|
13
|
+
private _state;
|
|
14
|
+
private _isMuted;
|
|
15
|
+
private manuallyDisconnected;
|
|
16
|
+
private _hasConnectionFailureNotified;
|
|
17
|
+
/** true while local mic audio is above the speaking threshold */
|
|
18
|
+
private _userSpeaking;
|
|
19
|
+
/** debounce timer: fires THINKING after user goes silent */
|
|
20
|
+
private _silenceTimer;
|
|
21
|
+
constructor(config: VoiceAgentConfig, getCredentials: () => VoiceSessionCredentials);
|
|
22
|
+
get state(): VOICE_AGENT_STATE;
|
|
23
|
+
get isMuted(): boolean;
|
|
24
|
+
on(event: string, listener: (...args: unknown[]) => void): void;
|
|
25
|
+
off(event: string, listener: (...args: unknown[]) => void): void;
|
|
26
|
+
connect(): Promise<void>;
|
|
27
|
+
disconnect(): void;
|
|
28
|
+
toggleMute(): void;
|
|
29
|
+
reset(): void;
|
|
30
|
+
destroy(): void;
|
|
31
|
+
private setState;
|
|
32
|
+
private clearSilenceTimer;
|
|
33
|
+
private handleConnectionFailure;
|
|
34
|
+
private releaseResources;
|
|
35
|
+
/**
|
|
36
|
+
* Analyse the local microphone stream to detect when the user
|
|
37
|
+
* stops talking → transition LISTENING → THINKING.
|
|
38
|
+
*/
|
|
39
|
+
private startLocalAudioAnalysis;
|
|
40
|
+
private handleRemoteTrack;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=VoiceAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceAgent.d.ts","sourceRoot":"","sources":["../../src/voice/VoiceAgent.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,iBAAiB,EAEjB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAE7B,MAAM,SAAS,CAAC;AA6BjB,qBAAa,UAAU;IAqBnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;IArBxB,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,cAAc,CAAgD;IACtE,OAAO,CAAC,aAAa,CAAgD;IAErE,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,oBAAoB,CAAkB;IAC9C,OAAO,CAAC,6BAA6B,CAAkB;IAEvD,iEAAiE;IACjE,OAAO,CAAC,aAAa,CAAkB;IACvC,4DAA4D;IAC5D,OAAO,CAAC,aAAa,CAA8C;gBAGzD,MAAM,EAAE,gBAAgB,EACxB,cAAc,EAAE,MAAM,uBAAuB;IAGvD,IAAI,KAAK,IAAI,iBAAiB,CAE7B;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAI/D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAI1D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsI9B,UAAU,IAAI,IAAI;IAOlB,UAAU,IAAI,IAAI;IAclB,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,gBAAgB;IAkCxB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,iBAAiB;CAyB1B"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VoiceAgent = void 0;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
const EventEmitter_1 = require("../internal/events/EventEmitter");
|
|
6
|
+
const VoiceAudioAnalyser_1 = require("./VoiceAudioAnalyser");
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
const DEFAULT_ICE_SERVERS = [
|
|
9
|
+
{ urls: "stun:stun.l.google.com:19302" },
|
|
10
|
+
];
|
|
11
|
+
const DEFAULT_ICE_GATHERING_TIMEOUT_MS = 3000;
|
|
12
|
+
const DEFAULT_SPEAKING_THRESHOLD = 8;
|
|
13
|
+
const OFFER_PATH = "/med-assist/voice/offer";
|
|
14
|
+
const USER_SILENCE_DEBOUNCE_MS = 600;
|
|
15
|
+
function waitForIceGathering(pc, timeoutMs) {
|
|
16
|
+
return new Promise((resolve) => {
|
|
17
|
+
if (pc.iceGatheringState === "complete") {
|
|
18
|
+
resolve();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const timeout = setTimeout(resolve, timeoutMs);
|
|
22
|
+
pc.onicegatheringstatechange = () => {
|
|
23
|
+
if (pc.iceGatheringState === "complete") {
|
|
24
|
+
clearTimeout(timeout);
|
|
25
|
+
resolve();
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
class VoiceAgent {
|
|
31
|
+
config;
|
|
32
|
+
getCredentials;
|
|
33
|
+
emitter = new EventEmitter_1.EventEmitter();
|
|
34
|
+
remoteAnalyser = new VoiceAudioAnalyser_1.VoiceAudioAnalyser();
|
|
35
|
+
localAnalyser = new VoiceAudioAnalyser_1.VoiceAudioAnalyser();
|
|
36
|
+
pc = null;
|
|
37
|
+
pcId = null;
|
|
38
|
+
dataChannel = null;
|
|
39
|
+
localStream = null;
|
|
40
|
+
remoteAudio = null;
|
|
41
|
+
_state = types_1.VOICE_AGENT_STATE.IDLE;
|
|
42
|
+
_isMuted = false;
|
|
43
|
+
manuallyDisconnected = false;
|
|
44
|
+
_hasConnectionFailureNotified = false;
|
|
45
|
+
/** true while local mic audio is above the speaking threshold */
|
|
46
|
+
_userSpeaking = false;
|
|
47
|
+
/** debounce timer: fires THINKING after user goes silent */
|
|
48
|
+
_silenceTimer = null;
|
|
49
|
+
constructor(config, getCredentials) {
|
|
50
|
+
this.config = config;
|
|
51
|
+
this.getCredentials = getCredentials;
|
|
52
|
+
}
|
|
53
|
+
get state() {
|
|
54
|
+
return this._state;
|
|
55
|
+
}
|
|
56
|
+
get isMuted() {
|
|
57
|
+
return this._isMuted;
|
|
58
|
+
}
|
|
59
|
+
on(event, listener) {
|
|
60
|
+
this.emitter.on(event, listener);
|
|
61
|
+
}
|
|
62
|
+
off(event, listener) {
|
|
63
|
+
this.emitter.off(event, listener);
|
|
64
|
+
}
|
|
65
|
+
async connect() {
|
|
66
|
+
const credentials = this.getCredentials();
|
|
67
|
+
this.setState(types_1.VOICE_AGENT_STATE.CONNECTING);
|
|
68
|
+
this._hasConnectionFailureNotified = false;
|
|
69
|
+
try {
|
|
70
|
+
if (!navigator.mediaDevices?.getUserMedia) {
|
|
71
|
+
throw new Error("Microphone access is not available. Please ensure you are using a secure (HTTPS) connection.");
|
|
72
|
+
}
|
|
73
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
74
|
+
audio: {
|
|
75
|
+
channelCount: 1,
|
|
76
|
+
echoCancellation: true,
|
|
77
|
+
noiseSuppression: true,
|
|
78
|
+
autoGainControl: true,
|
|
79
|
+
sampleRate: 16000,
|
|
80
|
+
},
|
|
81
|
+
video: false,
|
|
82
|
+
});
|
|
83
|
+
this.localStream = stream;
|
|
84
|
+
const iceServers = this.config.iceServers ?? DEFAULT_ICE_SERVERS;
|
|
85
|
+
const pc = new RTCPeerConnection({ iceServers });
|
|
86
|
+
this.pc = pc;
|
|
87
|
+
// Data channel required by SmallWebRTCTransport — without it the server
|
|
88
|
+
// connects ICE but drops queued greeting/audio.
|
|
89
|
+
this.dataChannel = pc.createDataChannel("pipecat-events", {
|
|
90
|
+
ordered: true,
|
|
91
|
+
});
|
|
92
|
+
this.dataChannel.onopen = () => console.log("data channel open");
|
|
93
|
+
this.dataChannel.onclose = () => {
|
|
94
|
+
this.handleConnectionFailure(new Error("Data channel closed"), "Voice connection failed");
|
|
95
|
+
};
|
|
96
|
+
this.dataChannel.onerror = () => {
|
|
97
|
+
this.handleConnectionFailure(new Error("Data channel error"), "Voice connection failed");
|
|
98
|
+
};
|
|
99
|
+
stream.getAudioTracks().forEach((track) => pc.addTrack(track, stream));
|
|
100
|
+
pc.ontrack = (event) => this.handleRemoteTrack(event);
|
|
101
|
+
pc.onconnectionstatechange = () => {
|
|
102
|
+
if (pc.connectionState === "connected") {
|
|
103
|
+
this.setState(types_1.VOICE_AGENT_STATE.LISTENING);
|
|
104
|
+
this.startLocalAudioAnalysis(stream);
|
|
105
|
+
}
|
|
106
|
+
else if (pc.connectionState === "failed" ||
|
|
107
|
+
pc.connectionState === "closed") {
|
|
108
|
+
this.releaseResources();
|
|
109
|
+
this.setState(types_1.VOICE_AGENT_STATE.IDLE);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
pc.oniceconnectionstatechange = () => {
|
|
113
|
+
if ((pc.iceConnectionState === "connected" ||
|
|
114
|
+
pc.iceConnectionState === "completed") &&
|
|
115
|
+
this._state === types_1.VOICE_AGENT_STATE.CONNECTING) {
|
|
116
|
+
this.setState(types_1.VOICE_AGENT_STATE.LISTENING);
|
|
117
|
+
this.startLocalAudioAnalysis(stream);
|
|
118
|
+
}
|
|
119
|
+
else if (pc.iceConnectionState === "failed") {
|
|
120
|
+
this.releaseResources();
|
|
121
|
+
this.setState(types_1.VOICE_AGENT_STATE.IDLE);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const offer = await pc.createOffer();
|
|
125
|
+
await pc.setLocalDescription(offer);
|
|
126
|
+
const timeoutMs = this.config.iceGatheringTimeoutMs ?? DEFAULT_ICE_GATHERING_TIMEOUT_MS;
|
|
127
|
+
await waitForIceGathering(pc, timeoutMs);
|
|
128
|
+
const DEFAULT_API_ORIGIN = (0, constants_1.getConfig)(this.config?.environment || "production").BASE_API_URL;
|
|
129
|
+
const offerUrl = this.config.offerUrl ?? `${this.config.baseUrl ?? DEFAULT_API_ORIGIN}${OFFER_PATH}`;
|
|
130
|
+
const createOfferRequest = (sessionCredentials) => fetch(offerUrl, {
|
|
131
|
+
method: "POST",
|
|
132
|
+
headers: { "Content-Type": "application/json" },
|
|
133
|
+
body: JSON.stringify({
|
|
134
|
+
sdp: pc.localDescription.sdp,
|
|
135
|
+
type: pc.localDescription.type,
|
|
136
|
+
pc_id: this.pcId,
|
|
137
|
+
request_data: {
|
|
138
|
+
session_id: sessionCredentials.sessionId,
|
|
139
|
+
token: sessionCredentials.sessionToken,
|
|
140
|
+
},
|
|
141
|
+
}),
|
|
142
|
+
});
|
|
143
|
+
let response = await createOfferRequest(credentials);
|
|
144
|
+
if (response.status === 401 && this.config.handleRefresh) {
|
|
145
|
+
await this.config.handleRefresh();
|
|
146
|
+
const refreshedCredentials = this.getCredentials();
|
|
147
|
+
response = await createOfferRequest(refreshedCredentials);
|
|
148
|
+
}
|
|
149
|
+
if (!response.ok) {
|
|
150
|
+
const errBody = await response.json().catch(() => null);
|
|
151
|
+
console.error("error calling offer", errBody);
|
|
152
|
+
throw new Error(errBody?.detail || errBody?.error || `Server error: ${response.status}`);
|
|
153
|
+
}
|
|
154
|
+
const answer = await response.json();
|
|
155
|
+
this.pcId = answer.pc_id;
|
|
156
|
+
if (pc.signalingState === "closed")
|
|
157
|
+
return;
|
|
158
|
+
await pc.setRemoteDescription(new RTCSessionDescription({ sdp: answer.sdp, type: answer.type }));
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
this.handleConnectionFailure(err);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
disconnect() {
|
|
165
|
+
this.manuallyDisconnected = true;
|
|
166
|
+
this.setState(types_1.VOICE_AGENT_STATE.DISCONNECTING);
|
|
167
|
+
this.releaseResources();
|
|
168
|
+
this.setState(types_1.VOICE_AGENT_STATE.IDLE);
|
|
169
|
+
}
|
|
170
|
+
toggleMute() {
|
|
171
|
+
if (!this.localStream)
|
|
172
|
+
return;
|
|
173
|
+
const track = this.localStream.getAudioTracks()[0];
|
|
174
|
+
if (!track)
|
|
175
|
+
return;
|
|
176
|
+
const wasEnabled = track.enabled;
|
|
177
|
+
this.localStream.getAudioTracks().forEach((t) => {
|
|
178
|
+
t.enabled = !wasEnabled;
|
|
179
|
+
});
|
|
180
|
+
this._isMuted = wasEnabled;
|
|
181
|
+
this.clearSilenceTimer();
|
|
182
|
+
this._userSpeaking = false;
|
|
183
|
+
this.setState(wasEnabled ? types_1.VOICE_AGENT_STATE.MUTED : types_1.VOICE_AGENT_STATE.LISTENING);
|
|
184
|
+
}
|
|
185
|
+
reset() {
|
|
186
|
+
this.setState(types_1.VOICE_AGENT_STATE.IDLE);
|
|
187
|
+
}
|
|
188
|
+
destroy() {
|
|
189
|
+
this.releaseResources();
|
|
190
|
+
this.emitter.removeAllListeners();
|
|
191
|
+
this._state = types_1.VOICE_AGENT_STATE.IDLE;
|
|
192
|
+
}
|
|
193
|
+
// ──────────────────────────── private ────────────────────────────
|
|
194
|
+
setState(next) {
|
|
195
|
+
this._state = next;
|
|
196
|
+
this.emitter.emit(types_1.VOICE_AGENT_EVENTS.STATE_CHANGED, next);
|
|
197
|
+
}
|
|
198
|
+
clearSilenceTimer() {
|
|
199
|
+
if (this._silenceTimer !== null) {
|
|
200
|
+
clearTimeout(this._silenceTimer);
|
|
201
|
+
this._silenceTimer = null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
handleConnectionFailure(cause, message = "Voice connection failed") {
|
|
205
|
+
if (this._hasConnectionFailureNotified)
|
|
206
|
+
return;
|
|
207
|
+
if (this._state === types_1.VOICE_AGENT_STATE.DISCONNECTING || this.manuallyDisconnected)
|
|
208
|
+
return;
|
|
209
|
+
this._hasConnectionFailureNotified = true;
|
|
210
|
+
console.error("voice connection failure", cause);
|
|
211
|
+
this.releaseResources();
|
|
212
|
+
this.setState(types_1.VOICE_AGENT_STATE.ERROR);
|
|
213
|
+
const voiceError = { message, cause };
|
|
214
|
+
this.emitter.emit(types_1.VOICE_AGENT_EVENTS.ERROR, voiceError);
|
|
215
|
+
}
|
|
216
|
+
releaseResources() {
|
|
217
|
+
this.remoteAnalyser.stop();
|
|
218
|
+
this.localAnalyser.stop();
|
|
219
|
+
this.clearSilenceTimer();
|
|
220
|
+
this._userSpeaking = false;
|
|
221
|
+
if (this.localStream) {
|
|
222
|
+
this.localStream.getTracks().forEach((t) => t.stop());
|
|
223
|
+
this.localStream = null;
|
|
224
|
+
}
|
|
225
|
+
if (this.dataChannel) {
|
|
226
|
+
this.dataChannel.close();
|
|
227
|
+
this.dataChannel = null;
|
|
228
|
+
}
|
|
229
|
+
if (this.pc) {
|
|
230
|
+
this.pc.onconnectionstatechange = null;
|
|
231
|
+
this.pc.oniceconnectionstatechange = null;
|
|
232
|
+
this.pc.ontrack = null;
|
|
233
|
+
this.pc.onicecandidate = null;
|
|
234
|
+
this.pc.ondatachannel = null;
|
|
235
|
+
this.pc.close();
|
|
236
|
+
this.pc = null;
|
|
237
|
+
}
|
|
238
|
+
this.pcId = null;
|
|
239
|
+
this._isMuted = false;
|
|
240
|
+
if (this.remoteAudio) {
|
|
241
|
+
this.remoteAudio.srcObject = null;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Analyse the local microphone stream to detect when the user
|
|
246
|
+
* stops talking → transition LISTENING → THINKING.
|
|
247
|
+
*/
|
|
248
|
+
startLocalAudioAnalysis(stream) {
|
|
249
|
+
const threshold = this.config.speakingThreshold ?? DEFAULT_SPEAKING_THRESHOLD;
|
|
250
|
+
this.localAnalyser.start(stream, threshold, (isUserSpeaking) => {
|
|
251
|
+
// Only act when the connection is live and not muted / agent speaking
|
|
252
|
+
if (this._state !== types_1.VOICE_AGENT_STATE.LISTENING &&
|
|
253
|
+
this._state !== types_1.VOICE_AGENT_STATE.THINKING) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
if (isUserSpeaking) {
|
|
257
|
+
this._userSpeaking = true;
|
|
258
|
+
this.clearSilenceTimer();
|
|
259
|
+
// If we had already moved to THINKING, go back to LISTENING
|
|
260
|
+
if (this._state === types_1.VOICE_AGENT_STATE.THINKING) {
|
|
261
|
+
this.setState(types_1.VOICE_AGENT_STATE.LISTENING);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else if (this._userSpeaking && this._silenceTimer === null) {
|
|
265
|
+
// User just went silent — debounce before entering THINKING
|
|
266
|
+
this._silenceTimer = setTimeout(() => {
|
|
267
|
+
this._silenceTimer = null;
|
|
268
|
+
if (this._userSpeaking &&
|
|
269
|
+
this._state === types_1.VOICE_AGENT_STATE.LISTENING) {
|
|
270
|
+
this._userSpeaking = false;
|
|
271
|
+
this.setState(types_1.VOICE_AGENT_STATE.THINKING);
|
|
272
|
+
}
|
|
273
|
+
}, USER_SILENCE_DEBOUNCE_MS);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
handleRemoteTrack(event) {
|
|
278
|
+
if (!this.remoteAudio) {
|
|
279
|
+
this.remoteAudio = new Audio();
|
|
280
|
+
this.remoteAudio.autoplay = true;
|
|
281
|
+
}
|
|
282
|
+
const remoteStream = event.streams[0];
|
|
283
|
+
this.remoteAudio.srcObject = remoteStream;
|
|
284
|
+
const threshold = this.config.speakingThreshold ?? DEFAULT_SPEAKING_THRESHOLD;
|
|
285
|
+
this.remoteAnalyser.start(remoteStream, threshold, (isSpeaking) => {
|
|
286
|
+
if (isSpeaking) {
|
|
287
|
+
// Agent started speaking — cancel any pending silence timer
|
|
288
|
+
this.clearSilenceTimer();
|
|
289
|
+
this._userSpeaking = false;
|
|
290
|
+
if (this._state !== types_1.VOICE_AGENT_STATE.SPEAKING) {
|
|
291
|
+
this.setState(types_1.VOICE_AGENT_STATE.SPEAKING);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else if (this._state === types_1.VOICE_AGENT_STATE.SPEAKING) {
|
|
295
|
+
// Agent stopped — go back to listening
|
|
296
|
+
this.setState(types_1.VOICE_AGENT_STATE.LISTENING);
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
exports.VoiceAgent = VoiceAgent;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceAudioAnalyser.d.ts","sourceRoot":"","sources":["../../src/voice/VoiceAudioAnalyser.ts"],"names":[],"mappings":"AAEA,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,SAAS,CAAuB;IAExC,KAAK,CACH,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,GAC9C,IAAI;IAqBP,IAAI,IAAI,IAAI;CAUb"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VoiceAudioAnalyser = void 0;
|
|
4
|
+
const DEFAULT_FFT_SIZE = 256;
|
|
5
|
+
class VoiceAudioAnalyser {
|
|
6
|
+
audioCtx = null;
|
|
7
|
+
animFrame = null;
|
|
8
|
+
start(stream, threshold, onSpeakingChange) {
|
|
9
|
+
const audioCtx = new AudioContext();
|
|
10
|
+
this.audioCtx = audioCtx;
|
|
11
|
+
const analyser = audioCtx.createAnalyser();
|
|
12
|
+
analyser.fftSize = DEFAULT_FFT_SIZE;
|
|
13
|
+
audioCtx.createMediaStreamSource(stream).connect(analyser);
|
|
14
|
+
const data = new Uint8Array(analyser.frequencyBinCount);
|
|
15
|
+
const poll = () => {
|
|
16
|
+
if (!this.audioCtx)
|
|
17
|
+
return;
|
|
18
|
+
analyser.getByteFrequencyData(data);
|
|
19
|
+
const avg = data.reduce((s, v) => s + v, 0) / data.length;
|
|
20
|
+
onSpeakingChange(avg > threshold);
|
|
21
|
+
this.animFrame = requestAnimationFrame(poll);
|
|
22
|
+
};
|
|
23
|
+
poll();
|
|
24
|
+
}
|
|
25
|
+
stop() {
|
|
26
|
+
if (this.animFrame !== null) {
|
|
27
|
+
cancelAnimationFrame(this.animFrame);
|
|
28
|
+
this.animFrame = null;
|
|
29
|
+
}
|
|
30
|
+
if (this.audioCtx) {
|
|
31
|
+
this.audioCtx.close().catch(() => { });
|
|
32
|
+
this.audioCtx = null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.VoiceAudioAnalyser = VoiceAudioAnalyser;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.VoiceAgent = void 0;
|
|
18
|
+
var VoiceAgent_1 = require("./VoiceAgent");
|
|
19
|
+
Object.defineProperty(exports, "VoiceAgent", { enumerable: true, get: function () { return VoiceAgent_1.VoiceAgent; } });
|
|
20
|
+
__exportStar(require("./types"), exports);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Environment } from "../constants";
|
|
2
|
+
export declare const VOICE_AGENT_STATE: {
|
|
3
|
+
readonly IDLE: "idle";
|
|
4
|
+
readonly CONNECTING: "connecting";
|
|
5
|
+
readonly CONNECTED: "connected";
|
|
6
|
+
readonly LISTENING: "listening";
|
|
7
|
+
readonly THINKING: "thinking";
|
|
8
|
+
readonly SPEAKING: "speaking";
|
|
9
|
+
readonly MUTED: "muted";
|
|
10
|
+
readonly DISCONNECTING: "disconnecting";
|
|
11
|
+
readonly ERROR: "error";
|
|
12
|
+
};
|
|
13
|
+
export type VOICE_AGENT_STATE = (typeof VOICE_AGENT_STATE)[keyof typeof VOICE_AGENT_STATE];
|
|
14
|
+
export declare const VOICE_AGENT_EVENTS: {
|
|
15
|
+
readonly STATE_CHANGED: "voice:state_changed";
|
|
16
|
+
readonly ERROR: "voice:error";
|
|
17
|
+
};
|
|
18
|
+
export type VOICE_AGENT_EVENTS = (typeof VOICE_AGENT_EVENTS)[keyof typeof VOICE_AGENT_EVENTS];
|
|
19
|
+
export interface VoiceAgentConfig {
|
|
20
|
+
baseUrl?: string;
|
|
21
|
+
offerUrl?: string;
|
|
22
|
+
handleRefresh?: () => Promise<void>;
|
|
23
|
+
iceServers?: RTCIceServer[];
|
|
24
|
+
iceGatheringTimeoutMs?: number;
|
|
25
|
+
speakingThreshold?: number;
|
|
26
|
+
environment?: Environment;
|
|
27
|
+
}
|
|
28
|
+
export interface VoiceSessionCredentials {
|
|
29
|
+
sessionId: string;
|
|
30
|
+
sessionToken: string;
|
|
31
|
+
}
|
|
32
|
+
export interface VoiceError {
|
|
33
|
+
message: string;
|
|
34
|
+
cause?: unknown;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/voice/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,iBAAiB;;;;;;;;;;CAUpB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAC3B,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE7D,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAC5B,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VOICE_AGENT_EVENTS = exports.VOICE_AGENT_STATE = void 0;
|
|
4
|
+
exports.VOICE_AGENT_STATE = {
|
|
5
|
+
IDLE: "idle",
|
|
6
|
+
CONNECTING: "connecting",
|
|
7
|
+
CONNECTED: "connected",
|
|
8
|
+
LISTENING: "listening",
|
|
9
|
+
THINKING: "thinking",
|
|
10
|
+
SPEAKING: "speaking",
|
|
11
|
+
MUTED: "muted",
|
|
12
|
+
DISCONNECTING: "disconnecting",
|
|
13
|
+
ERROR: "error",
|
|
14
|
+
};
|
|
15
|
+
exports.VOICE_AGENT_EVENTS = {
|
|
16
|
+
STATE_CHANGED: "voice:state_changed",
|
|
17
|
+
ERROR: "voice:error",
|
|
18
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eka-care/medassist-core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.52",
|
|
4
4
|
"description": "TypeScript SDK for real-time medical chatbot experiences with session management, WebSocket connectivity, and media handling",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|