@mirai/core 0.4.512 → 0.4.513

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.
@@ -7,12 +7,19 @@ exports.useOpenAiRealtimeSession = void 0;
7
7
  var _dataSources = require("@mirai/data-sources");
8
8
  var _react = require("react");
9
9
  var _helpers = require("../../../../helpers");
10
+ var _lobby = require("../../../services/lobby.service");
10
11
  const useOpenAiRealtimeSession = () => {
11
12
  const audioElementRef = (0, _react.useRef)(null);
12
13
  const audioContextRef = (0, _react.useRef)(null);
13
14
  const peerConnectionRef = (0, _react.useRef)(null);
14
15
  const dataChannelRef = (0, _react.useRef)(null);
15
16
  const localStreamRef = (0, _react.useRef)(null);
17
+ const localAudioTrackRef = (0, _react.useRef)(null);
18
+ const microphoneEnabledRef = (0, _react.useRef)(false);
19
+ const pendingIntroRef = (0, _react.useRef)(false);
20
+ const introResponseIdRef = (0, _react.useRef)(null);
21
+ const pendingMcpRef = (0, _react.useRef)(false);
22
+ const pendingMcpCallIdRef = (0, _react.useRef)(null);
16
23
  const pendingUserTranscriptRef = (0, _react.useRef)('');
17
24
  const inputSourceRef = (0, _react.useRef)(null);
18
25
  const outputSourceRef = (0, _react.useRef)(null);
@@ -49,6 +56,12 @@ const useOpenAiRealtimeSession = () => {
49
56
  localStream.getTracks().forEach(track => track.stop());
50
57
  localStreamRef.current = null;
51
58
  }
59
+ localAudioTrackRef.current = null;
60
+ microphoneEnabledRef.current = false;
61
+ pendingIntroRef.current = false;
62
+ introResponseIdRef.current = null;
63
+ pendingMcpRef.current = false;
64
+ pendingMcpCallIdRef.current = null;
52
65
  if (audioElementRef.current) {
53
66
  audioElementRef.current.srcObject = null;
54
67
  audioElementRef.current = null;
@@ -74,6 +87,25 @@ const useOpenAiRealtimeSession = () => {
74
87
  }
75
88
  pendingUserTranscriptRef.current = '';
76
89
  }, []);
90
+ const enableMicrophone = (0, _react.useCallback)(() => {
91
+ const track = localAudioTrackRef.current;
92
+ if (!track || microphoneEnabledRef.current) return;
93
+ track.enabled = true;
94
+ microphoneEnabledRef.current = true;
95
+ }, []);
96
+ const resumeMcpIfNeeded = (0, _react.useCallback)(outputCallId => {
97
+ if (!pendingMcpRef.current) return;
98
+ const pendingCallId = pendingMcpCallIdRef.current;
99
+ if (pendingCallId && outputCallId && pendingCallId !== outputCallId) return;
100
+ const channel = dataChannelRef.current;
101
+ if (channel && channel.readyState === 'open') {
102
+ channel.send(JSON.stringify({
103
+ type: 'response.create'
104
+ }));
105
+ }
106
+ pendingMcpRef.current = false;
107
+ pendingMcpCallIdRef.current = null;
108
+ }, []);
77
109
  const startSession = (0, _react.useCallback)(async _ref => {
78
110
  let {
79
111
  assistant_name,
@@ -88,7 +120,7 @@ const useOpenAiRealtimeSession = () => {
88
120
  const fingerprint = localStorage.getItem('MIRAI:FINGERPRINT');
89
121
  try {
90
122
  const sessionResponse = await (0, _dataSources.request)({
91
- endpoint: "/audio/session?fingerprint=".concat(fingerprint, "&hotelId=").concat(isChain ? '' : hotelId !== null && hotelId !== void 0 ? hotelId : '', "&chainId=").concat(isChain ? chainId !== null && chainId !== void 0 ? chainId : '' : ''),
123
+ endpoint: "/voice/session?fingerprint=".concat(fingerprint, "&hotelId=").concat(isChain ? '' : hotelId !== null && hotelId !== void 0 ? hotelId : '', "&chainId=").concat(isChain ? chainId !== null && chainId !== void 0 ? chainId : '' : ''),
92
124
  hostname: process.env.SERVICE_SYNAPSE,
93
125
  method: 'GET'
94
126
  });
@@ -97,10 +129,14 @@ const useOpenAiRealtimeSession = () => {
97
129
  peerConnectionRef.current = peerConnection;
98
130
  audioElementRef.current = document.createElement('audio');
99
131
  audioElementRef.current.autoplay = true;
100
- peerConnection.ontrack = event => {
101
- // eslint-disable-next-line prefer-destructuring
102
- audioElementRef.current.srcObject = event.streams[0];
103
- const [remoteStream] = event.streams;
132
+ peerConnection.ontrack = _ref2 => {
133
+ let {
134
+ streams
135
+ } = _ref2;
136
+ const [remoteStream] = streams;
137
+ if (audioElementRef.current) {
138
+ audioElementRef.current.srcObject = remoteStream || null;
139
+ }
104
140
  if (!audioContextRef.current || !audioAnalyzersRef.current.outputAnalyser || !remoteStream) return;
105
141
  if (outputSourceRef.current) outputSourceRef.current.disconnect();
106
142
  outputSourceRef.current = audioContextRef.current.createMediaStreamSource(remoteStream);
@@ -144,6 +180,8 @@ const useOpenAiRealtimeSession = () => {
144
180
  inputSourceRef.current = inputSource;
145
181
  inputSource.connect(inputAnalyser);
146
182
  if (track) {
183
+ localAudioTrackRef.current = track;
184
+ track.enabled = false;
147
185
  await track.applyConstraints({
148
186
  echoCancellation: true,
149
187
  noiseSuppression: true,
@@ -160,6 +198,8 @@ const useOpenAiRealtimeSession = () => {
160
198
  });
161
199
  const localeHint = locale || 'en-US';
162
200
  const introductionMessage = "Respond in the language that matches the locale code \"".concat(localeHint, "\". Introduce yourself using the following sentence, translated into that language: \"Hello, I am ").concat(assistant_name, ", your virtual assistant. I can help you with information about our services and facilities. What would you like to know today?\"");
201
+ pendingIntroRef.current = true;
202
+ introResponseIdRef.current = null;
163
203
  dataChannel.send(JSON.stringify({
164
204
  type: 'response.create',
165
205
  response: {
@@ -167,16 +207,35 @@ const useOpenAiRealtimeSession = () => {
167
207
  }
168
208
  }));
169
209
  });
170
- dataChannel.addEventListener('message', event => {
171
- var _payload$item;
210
+ dataChannel.addEventListener('message', async event => {
211
+ var _payload$item, _payload$item2, _payload$item5, _payload$item8;
172
212
  const payload = JSON.parse(event.data);
173
- if (payload.type === 'response.output_item.done' && ((_payload$item = payload.item) === null || _payload$item === void 0 ? void 0 : _payload$item.type) === 'mcp_call') {
174
- dataChannel.send(JSON.stringify({
175
- type: 'response.create',
176
- response: {
177
- response_id: payload.response_id
178
- }
179
- }));
213
+ if (payload.type === 'response.output_item.added' && ((_payload$item = payload.item) === null || _payload$item === void 0 ? void 0 : _payload$item.type) === 'message') {
214
+ if (pendingIntroRef.current && !introResponseIdRef.current && payload.response_id) {
215
+ introResponseIdRef.current = payload.response_id;
216
+ }
217
+ }
218
+ if (payload.type === 'output_audio_buffer.stopped') {
219
+ if (pendingIntroRef.current && introResponseIdRef.current && payload.response_id === introResponseIdRef.current) {
220
+ enableMicrophone();
221
+ pendingIntroRef.current = false;
222
+ introResponseIdRef.current = null;
223
+ }
224
+ }
225
+ if (payload.type === 'response.output_item.added' && ((_payload$item2 = payload.item) === null || _payload$item2 === void 0 ? void 0 : _payload$item2.type) === 'mcp_call') {
226
+ var _payload$item3, _payload$item4;
227
+ pendingMcpRef.current = true;
228
+ pendingMcpCallIdRef.current = ((_payload$item3 = payload.item) === null || _payload$item3 === void 0 ? void 0 : _payload$item3.call_id) || ((_payload$item4 = payload.item) === null || _payload$item4 === void 0 ? void 0 : _payload$item4.id) || null;
229
+ }
230
+ if (payload.type === 'response.output_item.done' && ((_payload$item5 = payload.item) === null || _payload$item5 === void 0 ? void 0 : _payload$item5.type) === 'mcp_call') {
231
+ var _payload$item6, _payload$item7;
232
+ const outputCallId = ((_payload$item6 = payload.item) === null || _payload$item6 === void 0 ? void 0 : _payload$item6.call_id) || ((_payload$item7 = payload.item) === null || _payload$item7 === void 0 ? void 0 : _payload$item7.id) || null;
233
+ resumeMcpIfNeeded(outputCallId);
234
+ }
235
+ if (payload.type === 'response.output_item.done' && ((_payload$item8 = payload.item) === null || _payload$item8 === void 0 ? void 0 : _payload$item8.type) === 'mcp_call_output') {
236
+ var _payload$item9, _payload$item0, _payload$item1;
237
+ const outputCallId = ((_payload$item9 = payload.item) === null || _payload$item9 === void 0 ? void 0 : _payload$item9.call_id) || ((_payload$item0 = payload.item) === null || _payload$item0 === void 0 ? void 0 : _payload$item0.mcp_call_id) || ((_payload$item1 = payload.item) === null || _payload$item1 === void 0 ? void 0 : _payload$item1.id) || null;
238
+ resumeMcpIfNeeded(outputCallId);
180
239
  }
181
240
  if (payload.type === 'response.function_call_arguments.done' && payload.name === 'open_url') {
182
241
  const {
@@ -196,6 +255,40 @@ const useOpenAiRealtimeSession = () => {
196
255
  const input = pendingUserTranscriptRef.current.trim();
197
256
  pendingUserTranscriptRef.current = '';
198
257
  const activeLocale = locale || 'en-US';
258
+ if (hotelId) {
259
+ try {
260
+ const chatId = await (0, _lobby.ensureChatId)({
261
+ fingerprint,
262
+ channelId: hotelId,
263
+ session: {
264
+ locale: activeLocale
265
+ }
266
+ });
267
+ if (chatId) {
268
+ await (0, _lobby.createChatMessage)({
269
+ author: 'user',
270
+ body: input,
271
+ chatId,
272
+ meta: {
273
+ audio: true
274
+ }
275
+ });
276
+ await (0, _lobby.createChatMessage)({
277
+ author: 'ai',
278
+ body: transcript,
279
+ chatId,
280
+ meta: {
281
+ audio: true
282
+ }
283
+ });
284
+ }
285
+ } catch (error) {
286
+ _dataSources.Event.publish(_helpers.EVENT.METRICS, {
287
+ id: 'AURA:ERROR',
288
+ error: error === null || error === void 0 ? void 0 : error.message
289
+ });
290
+ }
291
+ }
199
292
  _dataSources.Event.publish(_helpers.EVENT.METRICS, {
200
293
  id: 'SYNAPSE_RESPONSE',
201
294
  fingerprint,
@@ -233,7 +326,7 @@ const useOpenAiRealtimeSession = () => {
233
326
  } finally {
234
327
  setIsConnecting(false);
235
328
  }
236
- }, [cleanupRealtimeSession]);
329
+ }, [cleanupRealtimeSession, enableMicrophone, resumeMcpIfNeeded]);
237
330
  const endSession = (0, _react.useCallback)(() => {
238
331
  cleanupRealtimeSession(true);
239
332
  }, [cleanupRealtimeSession]);
@@ -1 +1 @@
1
- {"version":3,"file":"useOpenAiRealtimeSession.js","names":["_dataSources","require","_react","_helpers","useOpenAiRealtimeSession","audioElementRef","useRef","audioContextRef","peerConnectionRef","dataChannelRef","localStreamRef","pendingUserTranscriptRef","inputSourceRef","outputSourceRef","inputFrequencyDataRef","outputFrequencyDataRef","audioAnalyzersRef","inputAnalyser","outputAnalyser","getInputByteFrequencyData","getOutputByteFrequencyData","cleanupRealtimeSession","useCallback","shouldSignal","arguments","length","undefined","dataChannel","current","readyState","send","JSON","stringify","type","close","peerConnection","getSenders","forEach","sender","track","stop","localStream","getTracks","srcObject","disconnect","audioContext","startSession","_ref","assistant_name","chainId","hotelId","isChain","locale","setIsConnecting","setReady","fingerprint","localStorage","getItem","sessionResponse","request","endpoint","concat","hostname","process","env","SERVICE_SYNAPSE","method","ephemeralKey","value","RTCPeerConnection","document","createElement","autoplay","ontrack","event","streams","remoteStream","createMediaStreamSource","connect","mediaStream","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","channelCount","sampleRate","getAudioTracks","AudioContextConstructor","globalThis","AudioContext","webkitAudioContext","Error","state","resume","createAnalyser","fftSize","Uint8Array","frequencyBinCount","getByteFrequencyData","inputSource","applyConstraints","addTrack","createDataChannel","addEventListener","Event","publish","EVENT","METRICS","id","localeHint","introductionMessage","response","instructions","_payload$item","payload","parse","data","item","response_id","name","url","window","location","href","_payload$transcript","transcript","trim","_payload$transcript2","input","activeLocale","text","agent","offer","createOffer","setLocalDescription","sdpResponse","fetch","body","sdp","headers","Authorization","ok","answer","setRemoteDescription","error","message","endSession","audioAnalyzers","exports"],"sources":["../../../../../../src/components/Chat/components/Aura/hooks/useOpenAiRealtimeSession.js"],"sourcesContent":["import { Event, request } from '@mirai/data-sources';\nimport { useCallback, useRef } from 'react';\n\nimport { EVENT } from '../../../../helpers';\n\nconst useOpenAiRealtimeSession = () => {\n const audioElementRef = useRef(null);\n const audioContextRef = useRef(null);\n const peerConnectionRef = useRef(null);\n const dataChannelRef = useRef(null);\n const localStreamRef = useRef(null);\n const pendingUserTranscriptRef = useRef('');\n const inputSourceRef = useRef(null);\n const outputSourceRef = useRef(null);\n const inputFrequencyDataRef = useRef(null);\n const outputFrequencyDataRef = useRef(null);\n const audioAnalyzersRef = useRef({\n inputAnalyser: null,\n outputAnalyser: null,\n getInputByteFrequencyData: () => null,\n getOutputByteFrequencyData: () => null,\n });\n\n const cleanupRealtimeSession = useCallback((shouldSignal = false) => {\n const dataChannel = dataChannelRef.current;\n if (dataChannel) {\n if (shouldSignal && dataChannel.readyState === 'open') {\n dataChannel.send(JSON.stringify({ type: 'session.close' }));\n }\n dataChannel.close();\n dataChannelRef.current = null;\n }\n\n const peerConnection = peerConnectionRef.current;\n if (peerConnection) {\n peerConnection.getSenders().forEach((sender) => {\n if (sender.track) sender.track.stop();\n });\n peerConnection.close();\n peerConnectionRef.current = null;\n }\n\n const localStream = localStreamRef.current;\n if (localStream) {\n localStream.getTracks().forEach((track) => track.stop());\n localStreamRef.current = null;\n }\n\n if (audioElementRef.current) {\n audioElementRef.current.srcObject = null;\n audioElementRef.current = null;\n }\n\n if (inputSourceRef.current) {\n inputSourceRef.current.disconnect();\n inputSourceRef.current = null;\n }\n\n if (outputSourceRef.current) {\n outputSourceRef.current.disconnect();\n outputSourceRef.current = null;\n }\n\n audioAnalyzersRef.current.inputAnalyser = null;\n audioAnalyzersRef.current.outputAnalyser = null;\n audioAnalyzersRef.current.getInputByteFrequencyData = () => null;\n audioAnalyzersRef.current.getOutputByteFrequencyData = () => null;\n inputFrequencyDataRef.current = null;\n outputFrequencyDataRef.current = null;\n\n const audioContext = audioContextRef.current;\n if (audioContext) {\n audioContext.close();\n audioContextRef.current = null;\n }\n\n pendingUserTranscriptRef.current = '';\n }, []);\n\n const startSession = useCallback(\n async ({ assistant_name, chainId, hotelId, isChain, locale, setIsConnecting, setReady }) => {\n cleanupRealtimeSession();\n\n const fingerprint = localStorage.getItem('MIRAI:FINGERPRINT');\n\n try {\n const sessionResponse = await request({\n endpoint: `/audio/session?fingerprint=${fingerprint}&hotelId=${isChain ? '' : hotelId ?? ''}&chainId=${\n isChain ? chainId ?? '' : ''\n }`,\n hostname: process.env.SERVICE_SYNAPSE,\n method: 'GET',\n });\n\n const ephemeralKey = sessionResponse.value;\n const peerConnection = new RTCPeerConnection();\n peerConnectionRef.current = peerConnection;\n\n audioElementRef.current = document.createElement('audio');\n audioElementRef.current.autoplay = true;\n peerConnection.ontrack = (event) => {\n // eslint-disable-next-line prefer-destructuring\n audioElementRef.current.srcObject = event.streams[0];\n const [remoteStream] = event.streams;\n if (!audioContextRef.current || !audioAnalyzersRef.current.outputAnalyser || !remoteStream) return;\n if (outputSourceRef.current) outputSourceRef.current.disconnect();\n outputSourceRef.current = audioContextRef.current.createMediaStreamSource(remoteStream);\n outputSourceRef.current.connect(audioAnalyzersRef.current.outputAnalyser);\n };\n\n const mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n sampleRate: 48000,\n },\n });\n\n localStreamRef.current = mediaStream;\n const [track] = mediaStream.getAudioTracks();\n\n const AudioContextConstructor = globalThis.AudioContext || globalThis.webkitAudioContext;\n if (!AudioContextConstructor) throw new Error('AudioContext not supported');\n const audioContext = new AudioContextConstructor();\n audioContextRef.current = audioContext;\n if (audioContext.state === 'suspended') await audioContext.resume();\n const inputAnalyser = audioContext.createAnalyser();\n const outputAnalyser = audioContext.createAnalyser();\n inputAnalyser.fftSize = 1024;\n outputAnalyser.fftSize = 1024;\n audioAnalyzersRef.current.inputAnalyser = inputAnalyser;\n audioAnalyzersRef.current.outputAnalyser = outputAnalyser;\n inputFrequencyDataRef.current = new Uint8Array(inputAnalyser.frequencyBinCount);\n outputFrequencyDataRef.current = new Uint8Array(outputAnalyser.frequencyBinCount);\n audioAnalyzersRef.current.getInputByteFrequencyData = () => {\n if (!audioAnalyzersRef.current.inputAnalyser || !inputFrequencyDataRef.current) return null;\n audioAnalyzersRef.current.inputAnalyser.getByteFrequencyData(inputFrequencyDataRef.current);\n return inputFrequencyDataRef.current;\n };\n audioAnalyzersRef.current.getOutputByteFrequencyData = () => {\n if (!audioAnalyzersRef.current.outputAnalyser || !outputFrequencyDataRef.current) return null;\n audioAnalyzersRef.current.outputAnalyser.getByteFrequencyData(outputFrequencyDataRef.current);\n return outputFrequencyDataRef.current;\n };\n\n const inputSource = audioContext.createMediaStreamSource(mediaStream);\n inputSourceRef.current = inputSource;\n inputSource.connect(inputAnalyser);\n\n if (track) {\n await track.applyConstraints({\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n });\n peerConnection.addTrack(track, mediaStream);\n }\n\n const dataChannel = peerConnection.createDataChannel('oai-events');\n dataChannelRef.current = dataChannel;\n\n dataChannel.addEventListener('open', () => {\n pendingUserTranscriptRef.current = '';\n Event.publish(EVENT.METRICS, { id: 'AURA:START' });\n\n const localeHint = locale || 'en-US';\n const introductionMessage = `Respond in the language that matches the locale code \"${localeHint}\". Introduce yourself using the following sentence, translated into that language: \"Hello, I am ${assistant_name}, your virtual assistant. I can help you with information about our services and facilities. What would you like to know today?\"`;\n\n dataChannel.send(\n JSON.stringify({\n type: 'response.create',\n response: {\n instructions: introductionMessage,\n },\n }),\n );\n });\n\n dataChannel.addEventListener('message', (event) => {\n const payload = JSON.parse(event.data);\n\n if (payload.type === 'response.output_item.done' && payload.item?.type === 'mcp_call') {\n dataChannel.send(\n JSON.stringify({\n type: 'response.create',\n response: {\n response_id: payload.response_id,\n },\n }),\n );\n }\n\n if (payload.type === 'response.function_call_arguments.done' && payload.name === 'open_url') {\n const { url } = JSON.parse(payload.arguments);\n window.location.href = url;\n }\n\n if (payload.type === 'conversation.item.input_audio_transcription.completed') {\n const transcript = payload.transcript?.trim();\n if (transcript) pendingUserTranscriptRef.current += transcript;\n }\n\n if (payload.type === 'response.output_audio_transcript.done') {\n const transcript = payload.transcript?.trim();\n if (!transcript || !pendingUserTranscriptRef.current) return;\n\n const input = pendingUserTranscriptRef.current.trim();\n pendingUserTranscriptRef.current = '';\n\n const activeLocale = locale || 'en-US';\n\n Event.publish(EVENT.METRICS, {\n id: 'SYNAPSE_RESPONSE',\n fingerprint,\n text: transcript,\n input,\n agent: 'aura',\n locale: activeLocale,\n });\n }\n });\n\n const offer = await peerConnection.createOffer();\n await peerConnection.setLocalDescription(offer);\n\n const sdpResponse = await fetch('https://api.openai.com/v1/realtime/calls', {\n method: 'POST',\n body: offer.sdp,\n headers: {\n Authorization: `Bearer ${ephemeralKey}`,\n 'Content-Type': 'application/sdp',\n },\n });\n\n if (!sdpResponse.ok) throw new Error('Failed to establish OpenAI Realtime session');\n\n const answer = { type: 'answer', sdp: await sdpResponse.text() };\n\n await peerConnection.setRemoteDescription(answer);\n setReady(true);\n } catch (error) {\n Event.publish(EVENT.METRICS, { id: 'AURA:ERROR', error: error?.message });\n setReady(false);\n throw error;\n } finally {\n setIsConnecting(false);\n }\n },\n [cleanupRealtimeSession],\n );\n\n const endSession = useCallback(() => {\n cleanupRealtimeSession(true);\n }, [cleanupRealtimeSession]);\n\n return { startSession, endSession, audioAnalyzers: audioAnalyzersRef.current };\n};\n\nexport { useOpenAiRealtimeSession };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useOpenAiRealtimeSession.js","names":["_dataSources","require","_react","_helpers","_lobby","useOpenAiRealtimeSession","audioElementRef","useRef","audioContextRef","peerConnectionRef","dataChannelRef","localStreamRef","localAudioTrackRef","microphoneEnabledRef","pendingIntroRef","introResponseIdRef","pendingMcpRef","pendingMcpCallIdRef","pendingUserTranscriptRef","inputSourceRef","outputSourceRef","inputFrequencyDataRef","outputFrequencyDataRef","audioAnalyzersRef","inputAnalyser","outputAnalyser","getInputByteFrequencyData","getOutputByteFrequencyData","cleanupRealtimeSession","useCallback","shouldSignal","arguments","length","undefined","dataChannel","current","readyState","send","JSON","stringify","type","close","peerConnection","getSenders","forEach","sender","track","stop","localStream","getTracks","srcObject","disconnect","audioContext","enableMicrophone","enabled","resumeMcpIfNeeded","outputCallId","pendingCallId","channel","startSession","_ref","assistant_name","chainId","hotelId","isChain","locale","setIsConnecting","setReady","fingerprint","localStorage","getItem","sessionResponse","request","endpoint","concat","hostname","process","env","SERVICE_SYNAPSE","method","ephemeralKey","value","RTCPeerConnection","document","createElement","autoplay","ontrack","_ref2","streams","remoteStream","createMediaStreamSource","connect","mediaStream","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","channelCount","sampleRate","getAudioTracks","AudioContextConstructor","globalThis","AudioContext","webkitAudioContext","Error","state","resume","createAnalyser","fftSize","Uint8Array","frequencyBinCount","getByteFrequencyData","inputSource","applyConstraints","addTrack","createDataChannel","addEventListener","Event","publish","EVENT","METRICS","id","localeHint","introductionMessage","response","instructions","event","_payload$item","_payload$item2","_payload$item5","_payload$item8","payload","parse","data","item","response_id","_payload$item3","_payload$item4","call_id","_payload$item6","_payload$item7","_payload$item9","_payload$item0","_payload$item1","mcp_call_id","name","url","window","location","href","_payload$transcript","transcript","trim","_payload$transcript2","input","activeLocale","chatId","ensureChatId","channelId","session","createChatMessage","author","body","meta","error","message","text","agent","offer","createOffer","setLocalDescription","sdpResponse","fetch","sdp","headers","Authorization","ok","answer","setRemoteDescription","endSession","audioAnalyzers","exports"],"sources":["../../../../../../src/components/Chat/components/Aura/hooks/useOpenAiRealtimeSession.js"],"sourcesContent":["import { Event, request } from '@mirai/data-sources';\nimport { useCallback, useRef } from 'react';\n\nimport { EVENT } from '../../../../helpers';\nimport { createChatMessage, ensureChatId } from '../../../services/lobby.service';\n\nconst useOpenAiRealtimeSession = () => {\n const audioElementRef = useRef(null);\n const audioContextRef = useRef(null);\n const peerConnectionRef = useRef(null);\n const dataChannelRef = useRef(null);\n const localStreamRef = useRef(null);\n const localAudioTrackRef = useRef(null);\n const microphoneEnabledRef = useRef(false);\n const pendingIntroRef = useRef(false);\n const introResponseIdRef = useRef(null);\n const pendingMcpRef = useRef(false);\n const pendingMcpCallIdRef = useRef(null);\n const pendingUserTranscriptRef = useRef('');\n const inputSourceRef = useRef(null);\n const outputSourceRef = useRef(null);\n const inputFrequencyDataRef = useRef(null);\n const outputFrequencyDataRef = useRef(null);\n const audioAnalyzersRef = useRef({\n inputAnalyser: null,\n outputAnalyser: null,\n getInputByteFrequencyData: () => null,\n getOutputByteFrequencyData: () => null,\n });\n\n const cleanupRealtimeSession = useCallback((shouldSignal = false) => {\n const dataChannel = dataChannelRef.current;\n if (dataChannel) {\n if (shouldSignal && dataChannel.readyState === 'open') {\n dataChannel.send(JSON.stringify({ type: 'session.close' }));\n }\n dataChannel.close();\n dataChannelRef.current = null;\n }\n\n const peerConnection = peerConnectionRef.current;\n if (peerConnection) {\n peerConnection.getSenders().forEach((sender) => {\n if (sender.track) sender.track.stop();\n });\n peerConnection.close();\n peerConnectionRef.current = null;\n }\n\n const localStream = localStreamRef.current;\n if (localStream) {\n localStream.getTracks().forEach((track) => track.stop());\n localStreamRef.current = null;\n }\n\n localAudioTrackRef.current = null;\n microphoneEnabledRef.current = false;\n pendingIntroRef.current = false;\n introResponseIdRef.current = null;\n pendingMcpRef.current = false;\n pendingMcpCallIdRef.current = null;\n\n if (audioElementRef.current) {\n audioElementRef.current.srcObject = null;\n audioElementRef.current = null;\n }\n\n if (inputSourceRef.current) {\n inputSourceRef.current.disconnect();\n inputSourceRef.current = null;\n }\n\n if (outputSourceRef.current) {\n outputSourceRef.current.disconnect();\n outputSourceRef.current = null;\n }\n\n audioAnalyzersRef.current.inputAnalyser = null;\n audioAnalyzersRef.current.outputAnalyser = null;\n audioAnalyzersRef.current.getInputByteFrequencyData = () => null;\n audioAnalyzersRef.current.getOutputByteFrequencyData = () => null;\n inputFrequencyDataRef.current = null;\n outputFrequencyDataRef.current = null;\n\n const audioContext = audioContextRef.current;\n if (audioContext) {\n audioContext.close();\n audioContextRef.current = null;\n }\n\n pendingUserTranscriptRef.current = '';\n }, []);\n\n const enableMicrophone = useCallback(() => {\n const track = localAudioTrackRef.current;\n if (!track || microphoneEnabledRef.current) return;\n track.enabled = true;\n microphoneEnabledRef.current = true;\n }, []);\n\n const resumeMcpIfNeeded = useCallback((outputCallId) => {\n if (!pendingMcpRef.current) return;\n const pendingCallId = pendingMcpCallIdRef.current;\n if (pendingCallId && outputCallId && pendingCallId !== outputCallId) return;\n const channel = dataChannelRef.current;\n if (channel && channel.readyState === 'open') {\n channel.send(JSON.stringify({ type: 'response.create' }));\n }\n pendingMcpRef.current = false;\n pendingMcpCallIdRef.current = null;\n }, []);\n\n const startSession = useCallback(\n async ({ assistant_name, chainId, hotelId, isChain, locale, setIsConnecting, setReady }) => {\n cleanupRealtimeSession();\n\n const fingerprint = localStorage.getItem('MIRAI:FINGERPRINT');\n\n try {\n const sessionResponse = await request({\n endpoint: `/voice/session?fingerprint=${fingerprint}&hotelId=${isChain ? '' : hotelId ?? ''}&chainId=${\n isChain ? chainId ?? '' : ''\n }`,\n hostname: process.env.SERVICE_SYNAPSE,\n method: 'GET',\n });\n\n const ephemeralKey = sessionResponse.value;\n const peerConnection = new RTCPeerConnection();\n peerConnectionRef.current = peerConnection;\n\n audioElementRef.current = document.createElement('audio');\n audioElementRef.current.autoplay = true;\n peerConnection.ontrack = ({ streams }) => {\n const [remoteStream] = streams;\n if (audioElementRef.current) {\n audioElementRef.current.srcObject = remoteStream || null;\n }\n if (!audioContextRef.current || !audioAnalyzersRef.current.outputAnalyser || !remoteStream) return;\n if (outputSourceRef.current) outputSourceRef.current.disconnect();\n outputSourceRef.current = audioContextRef.current.createMediaStreamSource(remoteStream);\n outputSourceRef.current.connect(audioAnalyzersRef.current.outputAnalyser);\n };\n\n const mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n sampleRate: 48000,\n },\n });\n\n localStreamRef.current = mediaStream;\n const [track] = mediaStream.getAudioTracks();\n\n const AudioContextConstructor = globalThis.AudioContext || globalThis.webkitAudioContext;\n if (!AudioContextConstructor) throw new Error('AudioContext not supported');\n const audioContext = new AudioContextConstructor();\n audioContextRef.current = audioContext;\n if (audioContext.state === 'suspended') await audioContext.resume();\n const inputAnalyser = audioContext.createAnalyser();\n const outputAnalyser = audioContext.createAnalyser();\n inputAnalyser.fftSize = 1024;\n outputAnalyser.fftSize = 1024;\n audioAnalyzersRef.current.inputAnalyser = inputAnalyser;\n audioAnalyzersRef.current.outputAnalyser = outputAnalyser;\n inputFrequencyDataRef.current = new Uint8Array(inputAnalyser.frequencyBinCount);\n outputFrequencyDataRef.current = new Uint8Array(outputAnalyser.frequencyBinCount);\n audioAnalyzersRef.current.getInputByteFrequencyData = () => {\n if (!audioAnalyzersRef.current.inputAnalyser || !inputFrequencyDataRef.current) return null;\n audioAnalyzersRef.current.inputAnalyser.getByteFrequencyData(inputFrequencyDataRef.current);\n return inputFrequencyDataRef.current;\n };\n audioAnalyzersRef.current.getOutputByteFrequencyData = () => {\n if (!audioAnalyzersRef.current.outputAnalyser || !outputFrequencyDataRef.current) return null;\n audioAnalyzersRef.current.outputAnalyser.getByteFrequencyData(outputFrequencyDataRef.current);\n return outputFrequencyDataRef.current;\n };\n\n const inputSource = audioContext.createMediaStreamSource(mediaStream);\n inputSourceRef.current = inputSource;\n inputSource.connect(inputAnalyser);\n\n if (track) {\n localAudioTrackRef.current = track;\n track.enabled = false;\n await track.applyConstraints({\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n });\n peerConnection.addTrack(track, mediaStream);\n }\n\n const dataChannel = peerConnection.createDataChannel('oai-events');\n dataChannelRef.current = dataChannel;\n\n dataChannel.addEventListener('open', () => {\n pendingUserTranscriptRef.current = '';\n Event.publish(EVENT.METRICS, { id: 'AURA:START' });\n\n const localeHint = locale || 'en-US';\n const introductionMessage = `Respond in the language that matches the locale code \"${localeHint}\". Introduce yourself using the following sentence, translated into that language: \"Hello, I am ${assistant_name}, your virtual assistant. I can help you with information about our services and facilities. What would you like to know today?\"`;\n\n pendingIntroRef.current = true;\n introResponseIdRef.current = null;\n dataChannel.send(\n JSON.stringify({\n type: 'response.create',\n response: {\n instructions: introductionMessage,\n },\n }),\n );\n });\n\n dataChannel.addEventListener('message', async (event) => {\n const payload = JSON.parse(event.data);\n\n if (payload.type === 'response.output_item.added' && payload.item?.type === 'message') {\n if (pendingIntroRef.current && !introResponseIdRef.current && payload.response_id) {\n introResponseIdRef.current = payload.response_id;\n }\n }\n\n if (payload.type === 'output_audio_buffer.stopped') {\n if (\n pendingIntroRef.current &&\n introResponseIdRef.current &&\n payload.response_id === introResponseIdRef.current\n ) {\n enableMicrophone();\n pendingIntroRef.current = false;\n introResponseIdRef.current = null;\n }\n }\n\n if (payload.type === 'response.output_item.added' && payload.item?.type === 'mcp_call') {\n pendingMcpRef.current = true;\n pendingMcpCallIdRef.current = payload.item?.call_id || payload.item?.id || null;\n }\n\n if (payload.type === 'response.output_item.done' && payload.item?.type === 'mcp_call') {\n const outputCallId = payload.item?.call_id || payload.item?.id || null;\n resumeMcpIfNeeded(outputCallId);\n }\n\n if (payload.type === 'response.output_item.done' && payload.item?.type === 'mcp_call_output') {\n const outputCallId = payload.item?.call_id || payload.item?.mcp_call_id || payload.item?.id || null;\n resumeMcpIfNeeded(outputCallId);\n }\n\n if (payload.type === 'response.function_call_arguments.done' && payload.name === 'open_url') {\n const { url } = JSON.parse(payload.arguments);\n window.location.href = url;\n }\n\n if (payload.type === 'conversation.item.input_audio_transcription.completed') {\n const transcript = payload.transcript?.trim();\n if (transcript) pendingUserTranscriptRef.current += transcript;\n }\n\n if (payload.type === 'response.output_audio_transcript.done') {\n const transcript = payload.transcript?.trim();\n if (!transcript || !pendingUserTranscriptRef.current) return;\n\n const input = pendingUserTranscriptRef.current.trim();\n pendingUserTranscriptRef.current = '';\n\n const activeLocale = locale || 'en-US';\n\n if (hotelId) {\n try {\n const chatId = await ensureChatId({\n fingerprint,\n channelId: hotelId,\n session: { locale: activeLocale },\n });\n if (chatId) {\n await createChatMessage({ author: 'user', body: input, chatId, meta: { audio: true } });\n await createChatMessage({ author: 'ai', body: transcript, chatId, meta: { audio: true } });\n }\n } catch (error) {\n Event.publish(EVENT.METRICS, { id: 'AURA:ERROR', error: error?.message });\n }\n }\n\n Event.publish(EVENT.METRICS, {\n id: 'SYNAPSE_RESPONSE',\n fingerprint,\n text: transcript,\n input,\n agent: 'aura',\n locale: activeLocale,\n });\n }\n });\n\n const offer = await peerConnection.createOffer();\n await peerConnection.setLocalDescription(offer);\n\n const sdpResponse = await fetch('https://api.openai.com/v1/realtime/calls', {\n method: 'POST',\n body: offer.sdp,\n headers: {\n Authorization: `Bearer ${ephemeralKey}`,\n 'Content-Type': 'application/sdp',\n },\n });\n\n if (!sdpResponse.ok) throw new Error('Failed to establish OpenAI Realtime session');\n\n const answer = { type: 'answer', sdp: await sdpResponse.text() };\n\n await peerConnection.setRemoteDescription(answer);\n setReady(true);\n } catch (error) {\n Event.publish(EVENT.METRICS, { id: 'AURA:ERROR', error: error?.message });\n setReady(false);\n throw error;\n } finally {\n setIsConnecting(false);\n }\n },\n [cleanupRealtimeSession, enableMicrophone, resumeMcpIfNeeded],\n );\n\n const endSession = useCallback(() => {\n cleanupRealtimeSession(true);\n }, [cleanupRealtimeSession]);\n\n return { startSession, endSession, audioAnalyzers: audioAnalyzersRef.current };\n};\n\nexport { useOpenAiRealtimeSession };\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ensureChatId = exports.createChatMessage = void 0;
7
+ var _dataSources = require("@mirai/data-sources");
8
+ const createChatMessage = async function () {
9
+ let {
10
+ author,
11
+ body,
12
+ chatId,
13
+ meta,
14
+ session
15
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
16
+ if (!chatId) return null;
17
+ try {
18
+ return await (0, _dataSources.request)({
19
+ endpoint: "/api/chats/".concat(chatId, "/messages"),
20
+ hostname: process.env.SERVICE_LOBBY,
21
+ method: 'POST',
22
+ headers: {
23
+ 'x-mcp-secret': process.env.MCP_SECRET
24
+ },
25
+ author,
26
+ body,
27
+ meta,
28
+ session
29
+ });
30
+ } catch (_unused) {
31
+ return null;
32
+ }
33
+ };
34
+ exports.createChatMessage = createChatMessage;
35
+ const ensureChatId = async function () {
36
+ let {
37
+ fingerprint,
38
+ channelId,
39
+ session
40
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
41
+ if (!fingerprint || !channelId) return null;
42
+ try {
43
+ var _ensured$chat;
44
+ const ensured = await (0, _dataSources.request)({
45
+ endpoint: '/api/chats/ensure',
46
+ hostname: process.env.SERVICE_LOBBY,
47
+ method: 'POST',
48
+ headers: {
49
+ 'x-mcp-secret': process.env.MCP_SECRET
50
+ },
51
+ fingerprint,
52
+ channelId,
53
+ session
54
+ });
55
+ return (ensured === null || ensured === void 0 ? void 0 : (_ensured$chat = ensured.chat) === null || _ensured$chat === void 0 ? void 0 : _ensured$chat.id) || null;
56
+ } catch (_unused2) {
57
+ return null;
58
+ }
59
+ };
60
+ exports.ensureChatId = ensureChatId;
61
+ //# sourceMappingURL=lobby.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lobby.service.js","names":["_dataSources","require","createChatMessage","author","body","chatId","meta","session","arguments","length","undefined","request","endpoint","concat","hostname","process","env","SERVICE_LOBBY","method","headers","MCP_SECRET","_unused","exports","ensureChatId","fingerprint","channelId","_ensured$chat","ensured","chat","id","_unused2"],"sources":["../../../../src/components/Chat/services/lobby.service.js"],"sourcesContent":["import { request } from '@mirai/data-sources';\n\nexport const createChatMessage = async ({ author, body, chatId, meta, session } = {}) => {\n if (!chatId) return null;\n\n try {\n return await request({\n endpoint: `/api/chats/${chatId}/messages`,\n hostname: process.env.SERVICE_LOBBY,\n method: 'POST',\n headers: { 'x-mcp-secret': process.env.MCP_SECRET },\n author,\n body,\n meta,\n session,\n });\n } catch {\n return null;\n }\n};\n\nexport const ensureChatId = async ({ fingerprint, channelId, session } = {}) => {\n if (!fingerprint || !channelId) return null;\n\n try {\n const ensured = await request({\n endpoint: '/api/chats/ensure',\n hostname: process.env.SERVICE_LOBBY,\n method: 'POST',\n headers: { 'x-mcp-secret': process.env.MCP_SECRET },\n fingerprint,\n channelId,\n session,\n });\n\n return ensured?.chat?.id || null;\n } catch {\n return null;\n }\n};\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEO,MAAMC,iBAAiB,GAAG,eAAAA,CAAA,EAAwD;EAAA,IAAjD;IAAEC,MAAM;IAAEC,IAAI;IAAEC,MAAM;IAAEC,IAAI;IAAEC;EAAQ,CAAC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAClF,IAAI,CAACH,MAAM,EAAE,OAAO,IAAI;EAExB,IAAI;IACF,OAAO,MAAM,IAAAM,oBAAO,EAAC;MACnBC,QAAQ,gBAAAC,MAAA,CAAgBR,MAAM,cAAW;MACzCS,QAAQ,EAAEC,OAAO,CAACC,GAAG,CAACC,aAAa;MACnCC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QAAE,cAAc,EAAEJ,OAAO,CAACC,GAAG,CAACI;MAAW,CAAC;MACnDjB,MAAM;MACNC,IAAI;MACJE,IAAI;MACJC;IACF,CAAC,CAAC;EACJ,CAAC,CAAC,OAAAc,OAAA,EAAM;IACN,OAAO,IAAI;EACb;AACF,CAAC;AAACC,OAAA,CAAApB,iBAAA,GAAAA,iBAAA;AAEK,MAAMqB,YAAY,GAAG,eAAAA,CAAA,EAAoD;EAAA,IAA7C;IAAEC,WAAW;IAAEC,SAAS;IAAElB;EAAQ,CAAC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EACzE,IAAI,CAACgB,WAAW,IAAI,CAACC,SAAS,EAAE,OAAO,IAAI;EAE3C,IAAI;IAAA,IAAAC,aAAA;IACF,MAAMC,OAAO,GAAG,MAAM,IAAAhB,oBAAO,EAAC;MAC5BC,QAAQ,EAAE,mBAAmB;MAC7BE,QAAQ,EAAEC,OAAO,CAACC,GAAG,CAACC,aAAa;MACnCC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QAAE,cAAc,EAAEJ,OAAO,CAACC,GAAG,CAACI;MAAW,CAAC;MACnDI,WAAW;MACXC,SAAS;MACTlB;IACF,CAAC,CAAC;IAEF,OAAO,CAAAoB,OAAO,aAAPA,OAAO,wBAAAD,aAAA,GAAPC,OAAO,CAAEC,IAAI,cAAAF,aAAA,uBAAbA,aAAA,CAAeG,EAAE,KAAI,IAAI;EAClC,CAAC,CAAC,OAAAC,QAAA,EAAM;IACN,OAAO,IAAI;EACb;AACF,CAAC;AAACR,OAAA,CAAAC,YAAA,GAAAA,YAAA","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mirai/core",
3
- "version": "0.4.512",
3
+ "version": "0.4.513",
4
4
  "source": "src/index.js",
5
5
  "repository": "https://gitlab.com/miraicorp/dev/frontend/core",
6
6
  "author": "JΛVI <hello@soyjavi.com>",