@mirai/core 0.4.518 → 0.4.520
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.
|
@@ -8,6 +8,37 @@ var _dataSources = require("@mirai/data-sources");
|
|
|
8
8
|
var _react = require("react");
|
|
9
9
|
var _helpers = require("../../../../helpers");
|
|
10
10
|
var _lobby = require("../../../services/lobby.service");
|
|
11
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
12
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
13
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
14
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
15
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
16
|
+
const createMcpState = () => ({
|
|
17
|
+
pending: false,
|
|
18
|
+
pendingCallIds: new Set(),
|
|
19
|
+
pendingCount: 0,
|
|
20
|
+
handledCallIds: new Set(),
|
|
21
|
+
handledApprovalIds: new Set(),
|
|
22
|
+
responseIds: new Set(),
|
|
23
|
+
responsesDone: new Set(),
|
|
24
|
+
responsesWithMessage: new Set(),
|
|
25
|
+
resumeRequestedCallIds: new Set(),
|
|
26
|
+
resumeRequestedAny: false,
|
|
27
|
+
retry: {
|
|
28
|
+
count: 0,
|
|
29
|
+
timeoutId: null
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
const createResponseState = () => ({
|
|
33
|
+
activeId: null,
|
|
34
|
+
resumeAfterActive: false
|
|
35
|
+
});
|
|
36
|
+
const createFunctionState = () => ({
|
|
37
|
+
pendingCalls: new Map(),
|
|
38
|
+
pendingFollowup: false,
|
|
39
|
+
pendingFollowupReason: null,
|
|
40
|
+
handledOpenUrlCalls: new Set()
|
|
41
|
+
});
|
|
11
42
|
const useOpenAiRealtimeSession = () => {
|
|
12
43
|
const audioElementRef = (0, _react.useRef)(null);
|
|
13
44
|
const audioContextRef = (0, _react.useRef)(null);
|
|
@@ -18,8 +49,9 @@ const useOpenAiRealtimeSession = () => {
|
|
|
18
49
|
const microphoneEnabledRef = (0, _react.useRef)(false);
|
|
19
50
|
const pendingIntroRef = (0, _react.useRef)(false);
|
|
20
51
|
const introResponseIdRef = (0, _react.useRef)(null);
|
|
21
|
-
const
|
|
22
|
-
const
|
|
52
|
+
const mcpStateRef = (0, _react.useRef)(createMcpState());
|
|
53
|
+
const responseStateRef = (0, _react.useRef)(createResponseState());
|
|
54
|
+
const functionStateRef = (0, _react.useRef)(createFunctionState());
|
|
23
55
|
const pendingUserTranscriptRef = (0, _react.useRef)('');
|
|
24
56
|
const inputSourceRef = (0, _react.useRef)(null);
|
|
25
57
|
const outputSourceRef = (0, _react.useRef)(null);
|
|
@@ -60,8 +92,12 @@ const useOpenAiRealtimeSession = () => {
|
|
|
60
92
|
microphoneEnabledRef.current = false;
|
|
61
93
|
pendingIntroRef.current = false;
|
|
62
94
|
introResponseIdRef.current = null;
|
|
63
|
-
|
|
64
|
-
|
|
95
|
+
if (mcpStateRef.current.retry.timeoutId) {
|
|
96
|
+
clearTimeout(mcpStateRef.current.retry.timeoutId);
|
|
97
|
+
}
|
|
98
|
+
mcpStateRef.current = createMcpState();
|
|
99
|
+
responseStateRef.current = createResponseState();
|
|
100
|
+
functionStateRef.current = createFunctionState();
|
|
65
101
|
if (audioElementRef.current) {
|
|
66
102
|
audioElementRef.current.srcObject = null;
|
|
67
103
|
audioElementRef.current = null;
|
|
@@ -87,26 +123,214 @@ const useOpenAiRealtimeSession = () => {
|
|
|
87
123
|
}
|
|
88
124
|
pendingUserTranscriptRef.current = '';
|
|
89
125
|
}, []);
|
|
126
|
+
const safeJsonParse = (0, _react.useCallback)(value => {
|
|
127
|
+
if (typeof value !== 'string') return null;
|
|
128
|
+
try {
|
|
129
|
+
return JSON.parse(value);
|
|
130
|
+
} catch (_unused) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}, []);
|
|
134
|
+
const isAllowedOpenUrl = (0, _react.useCallback)(url => {
|
|
135
|
+
if (typeof url !== 'string') return false;
|
|
136
|
+
return url.trim().startsWith('https://reservation.mirai');
|
|
137
|
+
}, []);
|
|
90
138
|
const enableMicrophone = (0, _react.useCallback)(() => {
|
|
91
139
|
const track = localAudioTrackRef.current;
|
|
92
140
|
if (!track || microphoneEnabledRef.current) return;
|
|
93
141
|
track.enabled = true;
|
|
94
142
|
microphoneEnabledRef.current = true;
|
|
95
143
|
}, []);
|
|
96
|
-
const
|
|
97
|
-
if (
|
|
98
|
-
|
|
99
|
-
|
|
144
|
+
const clearPendingMcp = (0, _react.useCallback)(() => {
|
|
145
|
+
if (mcpStateRef.current.retry.timeoutId) {
|
|
146
|
+
clearTimeout(mcpStateRef.current.retry.timeoutId);
|
|
147
|
+
}
|
|
148
|
+
mcpStateRef.current = createMcpState();
|
|
149
|
+
}, []);
|
|
150
|
+
const sendResponseCreate = (0, _react.useCallback)(reason => {
|
|
151
|
+
if (responseStateRef.current.activeId) {
|
|
152
|
+
functionStateRef.current.pendingFollowup = true;
|
|
153
|
+
functionStateRef.current.pendingFollowupReason = reason || null;
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
100
156
|
const channel = dataChannelRef.current;
|
|
101
157
|
if (channel && channel.readyState === 'open') {
|
|
102
158
|
channel.send(JSON.stringify({
|
|
103
159
|
type: 'response.create'
|
|
104
160
|
}));
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}, []);
|
|
165
|
+
const resumeMcpIfNeeded = (0, _react.useCallback)(outputCallId => {
|
|
166
|
+
if (outputCallId) {
|
|
167
|
+
mcpStateRef.current.pendingCallIds.delete(outputCallId);
|
|
168
|
+
}
|
|
169
|
+
if (!mcpStateRef.current.pending || mcpStateRef.current.pendingCount > 0) return;
|
|
170
|
+
if (outputCallId && mcpStateRef.current.resumeRequestedCallIds.has(outputCallId)) return;
|
|
171
|
+
if (!outputCallId && mcpStateRef.current.resumeRequestedAny) return;
|
|
172
|
+
if (!outputCallId && mcpStateRef.current.resumeRequestedCallIds.size > 0) return;
|
|
173
|
+
const shouldResume = [...mcpStateRef.current.responseIds].some(responseId => mcpStateRef.current.responsesDone.has(responseId) && !mcpStateRef.current.responsesWithMessage.has(responseId));
|
|
174
|
+
if (!shouldResume) return;
|
|
175
|
+
if (sendResponseCreate('mcp_completed')) {
|
|
176
|
+
if (outputCallId) mcpStateRef.current.resumeRequestedCallIds.add(outputCallId);
|
|
177
|
+
if (!outputCallId) mcpStateRef.current.resumeRequestedAny = true;
|
|
178
|
+
} else if (responseStateRef.current.activeId) {
|
|
179
|
+
responseStateRef.current.resumeAfterActive = true;
|
|
105
180
|
}
|
|
106
|
-
|
|
107
|
-
|
|
181
|
+
}, [sendResponseCreate]);
|
|
182
|
+
const trackMcpStart = (0, _react.useCallback)(callId => {
|
|
183
|
+
mcpStateRef.current.pending = true;
|
|
184
|
+
if (callId) {
|
|
185
|
+
if (mcpStateRef.current.handledCallIds.has(callId)) return;
|
|
186
|
+
if (mcpStateRef.current.pendingCallIds.has(callId)) return;
|
|
187
|
+
mcpStateRef.current.pendingCallIds.add(callId);
|
|
188
|
+
mcpStateRef.current.pendingCount += 1;
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
mcpStateRef.current.pendingCount += 1;
|
|
192
|
+
}, []);
|
|
193
|
+
const getFunctionCallKey = (0, _react.useCallback)((callId, responseId, name) => {
|
|
194
|
+
if (callId) return callId;
|
|
195
|
+
if (responseId && name) return "".concat(responseId, ":").concat(name);
|
|
196
|
+
return null;
|
|
197
|
+
}, []);
|
|
198
|
+
const upsertFunctionCall = (0, _react.useCallback)(_ref => {
|
|
199
|
+
let {
|
|
200
|
+
key,
|
|
201
|
+
name,
|
|
202
|
+
responseId,
|
|
203
|
+
callId,
|
|
204
|
+
args
|
|
205
|
+
} = _ref;
|
|
206
|
+
if (!key) return;
|
|
207
|
+
const existing = functionStateRef.current.pendingCalls.get(key) || {
|
|
208
|
+
key
|
|
209
|
+
};
|
|
210
|
+
functionStateRef.current.pendingCalls.set(key, _objectSpread(_objectSpread({}, existing), {}, {
|
|
211
|
+
name: name !== null && name !== void 0 ? name : existing.name,
|
|
212
|
+
responseId: responseId !== null && responseId !== void 0 ? responseId : existing.responseId,
|
|
213
|
+
callId: callId !== null && callId !== void 0 ? callId : existing.callId,
|
|
214
|
+
args: args !== null && args !== void 0 ? args : existing.args
|
|
215
|
+
}));
|
|
216
|
+
}, []);
|
|
217
|
+
const handleMcpCompletion = (0, _react.useCallback)(outputCallId => {
|
|
218
|
+
mcpStateRef.current.pending = true;
|
|
219
|
+
if (outputCallId) {
|
|
220
|
+
if (mcpStateRef.current.handledCallIds.has(outputCallId)) return;
|
|
221
|
+
mcpStateRef.current.handledCallIds.add(outputCallId);
|
|
222
|
+
}
|
|
223
|
+
if (mcpStateRef.current.pendingCount > 0) mcpStateRef.current.pendingCount -= 1;
|
|
224
|
+
resumeMcpIfNeeded(outputCallId);
|
|
225
|
+
}, [resumeMcpIfNeeded]);
|
|
226
|
+
const scheduleResumeRetry = (0, _react.useCallback)(outputCallId => {
|
|
227
|
+
if (!mcpStateRef.current.pending) return;
|
|
228
|
+
if (mcpStateRef.current.retry.timeoutId) return;
|
|
229
|
+
if (mcpStateRef.current.retry.count >= 2) {
|
|
230
|
+
clearPendingMcp();
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const attempt = mcpStateRef.current.retry.count + 1;
|
|
234
|
+
const delay = attempt * 600;
|
|
235
|
+
mcpStateRef.current.retry.count = attempt;
|
|
236
|
+
mcpStateRef.current.retry.timeoutId = setTimeout(() => {
|
|
237
|
+
mcpStateRef.current.retry.timeoutId = null;
|
|
238
|
+
if (outputCallId) mcpStateRef.current.resumeRequestedCallIds.delete(outputCallId);
|
|
239
|
+
mcpStateRef.current.resumeRequestedAny = false;
|
|
240
|
+
resumeMcpIfNeeded(outputCallId);
|
|
241
|
+
}, delay);
|
|
242
|
+
}, [clearPendingMcp, resumeMcpIfNeeded]);
|
|
243
|
+
const sendFunctionCallOutput = (0, _react.useCallback)((callId, output) => {
|
|
244
|
+
const channel = dataChannelRef.current;
|
|
245
|
+
if (!callId || !channel || channel.readyState !== 'open') return false;
|
|
246
|
+
channel.send(JSON.stringify({
|
|
247
|
+
type: 'conversation.item.create',
|
|
248
|
+
item: {
|
|
249
|
+
type: 'function_call_output',
|
|
250
|
+
call_id: callId,
|
|
251
|
+
output: JSON.stringify(output || {})
|
|
252
|
+
}
|
|
253
|
+
}));
|
|
254
|
+
return true;
|
|
255
|
+
}, []);
|
|
256
|
+
const sendItemRetrieve = (0, _react.useCallback)(itemId => {
|
|
257
|
+
const channel = dataChannelRef.current;
|
|
258
|
+
if (!itemId || !channel || channel.readyState !== 'open') return false;
|
|
259
|
+
channel.send(JSON.stringify({
|
|
260
|
+
type: 'conversation.item.retrieve',
|
|
261
|
+
item_id: itemId
|
|
262
|
+
}));
|
|
263
|
+
return true;
|
|
108
264
|
}, []);
|
|
109
|
-
const
|
|
265
|
+
const sendMcpApproval = (0, _react.useCallback)(function (approvalRequestId) {
|
|
266
|
+
let approve = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
267
|
+
const channel = dataChannelRef.current;
|
|
268
|
+
if (!approvalRequestId || !channel || channel.readyState !== 'open') return false;
|
|
269
|
+
channel.send(JSON.stringify({
|
|
270
|
+
type: 'conversation.item.create',
|
|
271
|
+
previous_item_id: approvalRequestId,
|
|
272
|
+
item: {
|
|
273
|
+
type: 'mcp_approval_response',
|
|
274
|
+
approval_request_id: approvalRequestId,
|
|
275
|
+
approve
|
|
276
|
+
}
|
|
277
|
+
}));
|
|
278
|
+
return true;
|
|
279
|
+
}, []);
|
|
280
|
+
const requestFollowupResponse = (0, _react.useCallback)((reason, outputCallId) => {
|
|
281
|
+
functionStateRef.current.pendingFollowup = true;
|
|
282
|
+
functionStateRef.current.pendingFollowupReason = reason || null;
|
|
283
|
+
if (sendResponseCreate(reason || 'followup')) {
|
|
284
|
+
mcpStateRef.current.resumeRequestedAny = true;
|
|
285
|
+
if (outputCallId) mcpStateRef.current.resumeRequestedCallIds.add(outputCallId);
|
|
286
|
+
}
|
|
287
|
+
}, [sendResponseCreate]);
|
|
288
|
+
const handleOpenUrlCalls = (0, _react.useCallback)(_ref2 => {
|
|
289
|
+
let {
|
|
290
|
+
responseId,
|
|
291
|
+
outputItems
|
|
292
|
+
} = _ref2;
|
|
293
|
+
const responseOpenUrlItems = Array.isArray(outputItems) ? outputItems.filter(item => (item === null || item === void 0 ? void 0 : item.type) === 'function_call' && (item === null || item === void 0 ? void 0 : item.name) === 'open_url') : [];
|
|
294
|
+
responseOpenUrlItems.forEach(item => {
|
|
295
|
+
const key = getFunctionCallKey(item.call_id || item.id || null, responseId, item.name);
|
|
296
|
+
upsertFunctionCall({
|
|
297
|
+
key,
|
|
298
|
+
name: item.name,
|
|
299
|
+
responseId,
|
|
300
|
+
callId: item.call_id || item.id || null,
|
|
301
|
+
args: item.arguments || null
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
const pendingCalls = [...functionStateRef.current.pendingCalls.values()].filter(call => {
|
|
305
|
+
if (!(call !== null && call !== void 0 && call.name) || call.name !== 'open_url') return false;
|
|
306
|
+
if (!responseId) return true;
|
|
307
|
+
return !call.responseId || call.responseId === responseId;
|
|
308
|
+
});
|
|
309
|
+
for (const call of pendingCalls) {
|
|
310
|
+
const callKey = call.key || call.callId || call.args || null;
|
|
311
|
+
if (callKey && functionStateRef.current.handledOpenUrlCalls.has(callKey)) continue;
|
|
312
|
+
const args = safeJsonParse(call.args);
|
|
313
|
+
const url = args === null || args === void 0 ? void 0 : args.url;
|
|
314
|
+
if (!isAllowedOpenUrl(url)) {
|
|
315
|
+
if (call.callId) {
|
|
316
|
+
sendFunctionCallOutput(call.callId, {
|
|
317
|
+
error: 'blocked_url',
|
|
318
|
+
allowed_prefix: 'https://reservation.mirai'
|
|
319
|
+
});
|
|
320
|
+
requestFollowupResponse('open_url_blocked', call.callId);
|
|
321
|
+
}
|
|
322
|
+
if (call.key) functionStateRef.current.pendingCalls.delete(call.key);
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (callKey) functionStateRef.current.handledOpenUrlCalls.add(callKey);
|
|
326
|
+
if (call.key) functionStateRef.current.pendingCalls.delete(call.key);
|
|
327
|
+
cleanupRealtimeSession(true);
|
|
328
|
+
window.location.assign(url.trim());
|
|
329
|
+
return true;
|
|
330
|
+
}
|
|
331
|
+
return false;
|
|
332
|
+
}, [cleanupRealtimeSession, getFunctionCallKey, isAllowedOpenUrl, requestFollowupResponse, safeJsonParse, sendFunctionCallOutput, upsertFunctionCall]);
|
|
333
|
+
const startSession = (0, _react.useCallback)(async _ref3 => {
|
|
110
334
|
let {
|
|
111
335
|
assistant_name,
|
|
112
336
|
chainId,
|
|
@@ -115,7 +339,7 @@ const useOpenAiRealtimeSession = () => {
|
|
|
115
339
|
locale,
|
|
116
340
|
setIsConnecting,
|
|
117
341
|
setReady
|
|
118
|
-
} =
|
|
342
|
+
} = _ref3;
|
|
119
343
|
cleanupRealtimeSession();
|
|
120
344
|
const fingerprint = localStorage.getItem('MIRAI:FINGERPRINT');
|
|
121
345
|
try {
|
|
@@ -129,10 +353,10 @@ const useOpenAiRealtimeSession = () => {
|
|
|
129
353
|
peerConnectionRef.current = peerConnection;
|
|
130
354
|
audioElementRef.current = document.createElement('audio');
|
|
131
355
|
audioElementRef.current.autoplay = true;
|
|
132
|
-
peerConnection.ontrack =
|
|
356
|
+
peerConnection.ontrack = _ref4 => {
|
|
133
357
|
let {
|
|
134
358
|
streams
|
|
135
|
-
} =
|
|
359
|
+
} = _ref4;
|
|
136
360
|
const [remoteStream] = streams;
|
|
137
361
|
if (audioElementRef.current) {
|
|
138
362
|
audioElementRef.current.srcObject = remoteStream || null;
|
|
@@ -208,12 +432,25 @@ const useOpenAiRealtimeSession = () => {
|
|
|
208
432
|
}));
|
|
209
433
|
});
|
|
210
434
|
dataChannel.addEventListener('message', async event => {
|
|
211
|
-
var _payload$item, _payload$item2, _payload$item5, _payload$
|
|
435
|
+
var _payload$item, _payload$item2, _payload$item3, _payload$item4, _payload$item5, _payload$item6, _payload$item9, _payload$item0;
|
|
212
436
|
const payload = JSON.parse(event.data);
|
|
213
|
-
|
|
437
|
+
const {
|
|
438
|
+
response
|
|
439
|
+
} = payload;
|
|
440
|
+
const itemId = ((_payload$item = payload.item) === null || _payload$item === void 0 ? void 0 : _payload$item.id) || payload.item_id || null;
|
|
441
|
+
const callId = ((_payload$item2 = payload.item) === null || _payload$item2 === void 0 ? void 0 : _payload$item2.call_id) || payload.call_id || itemId;
|
|
442
|
+
const responseId = payload.response_id || (response === null || response === void 0 ? void 0 : response.id) || null;
|
|
443
|
+
if (payload.type === 'response.output_item.added' && ((_payload$item3 = payload.item) === null || _payload$item3 === void 0 ? void 0 : _payload$item3.type) === 'message') {
|
|
214
444
|
if (pendingIntroRef.current && !introResponseIdRef.current && payload.response_id) {
|
|
215
445
|
introResponseIdRef.current = payload.response_id;
|
|
216
446
|
}
|
|
447
|
+
if (responseId) {
|
|
448
|
+
mcpStateRef.current.responsesWithMessage.add(responseId);
|
|
449
|
+
mcpStateRef.current.responseIds.delete(responseId);
|
|
450
|
+
}
|
|
451
|
+
if (mcpStateRef.current.pending && mcpStateRef.current.pendingCount === 0) {
|
|
452
|
+
clearPendingMcp();
|
|
453
|
+
}
|
|
217
454
|
}
|
|
218
455
|
if (payload.type === 'output_audio_buffer.stopped') {
|
|
219
456
|
if (pendingIntroRef.current && introResponseIdRef.current && payload.response_id === introResponseIdRef.current) {
|
|
@@ -222,32 +459,124 @@ const useOpenAiRealtimeSession = () => {
|
|
|
222
459
|
introResponseIdRef.current = null;
|
|
223
460
|
}
|
|
224
461
|
}
|
|
225
|
-
if (payload.type === 'response.output_item.added' && ((_payload$
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
462
|
+
if (payload.type === 'response.output_item.added' && (((_payload$item4 = payload.item) === null || _payload$item4 === void 0 ? void 0 : _payload$item4.type) === 'mcp_call' || ((_payload$item5 = payload.item) === null || _payload$item5 === void 0 ? void 0 : _payload$item5.type) === 'mcp_tool_call')) {
|
|
463
|
+
if (responseId) mcpStateRef.current.responseIds.add(responseId);
|
|
464
|
+
trackMcpStart(callId);
|
|
465
|
+
}
|
|
466
|
+
if (payload.type === 'response.output_item.added' && ((_payload$item6 = payload.item) === null || _payload$item6 === void 0 ? void 0 : _payload$item6.type) === 'function_call') {
|
|
467
|
+
var _payload$item7, _payload$item8;
|
|
468
|
+
const name = ((_payload$item7 = payload.item) === null || _payload$item7 === void 0 ? void 0 : _payload$item7.name) || payload.name || null;
|
|
469
|
+
const key = getFunctionCallKey(callId, responseId, name);
|
|
470
|
+
upsertFunctionCall({
|
|
471
|
+
key,
|
|
472
|
+
name,
|
|
473
|
+
responseId,
|
|
474
|
+
callId,
|
|
475
|
+
args: ((_payload$item8 = payload.item) === null || _payload$item8 === void 0 ? void 0 : _payload$item8.arguments) || null
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
if (payload.type === 'response.function_call_arguments.done') {
|
|
479
|
+
const name = payload.name || null;
|
|
480
|
+
const key = getFunctionCallKey(payload.call_id || null, responseId, name);
|
|
481
|
+
upsertFunctionCall({
|
|
482
|
+
key,
|
|
483
|
+
name,
|
|
484
|
+
responseId,
|
|
485
|
+
callId: payload.call_id || null,
|
|
486
|
+
args: payload.arguments
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
if (payload.type === 'response.mcp_call.in_progress') {
|
|
490
|
+
trackMcpStart(callId);
|
|
491
|
+
if (payload.item_id) sendItemRetrieve(payload.item_id);
|
|
492
|
+
}
|
|
493
|
+
if (payload.type === 'response.mcp_tool_call.in_progress') {
|
|
494
|
+
trackMcpStart(callId);
|
|
495
|
+
if (payload.item_id) sendItemRetrieve(payload.item_id);
|
|
496
|
+
}
|
|
497
|
+
if (payload.type === 'mcp_list_tools.in_progress' || payload.type === 'response.mcp_list_tools.in_progress') {
|
|
498
|
+
if (payload.item_id) sendItemRetrieve(payload.item_id);
|
|
229
499
|
}
|
|
230
|
-
if (payload.type === 'response.output_item.done' && ((_payload$
|
|
231
|
-
|
|
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);
|
|
500
|
+
if (payload.type === 'response.output_item.done' && (((_payload$item9 = payload.item) === null || _payload$item9 === void 0 ? void 0 : _payload$item9.type) === 'mcp_call' || ((_payload$item0 = payload.item) === null || _payload$item0 === void 0 ? void 0 : _payload$item0.type) === 'mcp_tool_call')) {
|
|
501
|
+
handleMcpCompletion(callId);
|
|
234
502
|
}
|
|
235
|
-
if (payload.type === 'response.
|
|
236
|
-
|
|
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);
|
|
503
|
+
if (payload.type === 'response.mcp_call.completed' || payload.type === 'response.mcp_call.failed' || payload.type === 'response.mcp_tool_call.completed' || payload.type === 'response.mcp_tool_call.failed') {
|
|
504
|
+
handleMcpCompletion(callId);
|
|
239
505
|
}
|
|
240
|
-
if (payload.type === '
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
506
|
+
if (payload.type === 'conversation.item.added' || payload.type === 'conversation.item.retrieved') {
|
|
507
|
+
var _payload$item1, _payload$item10, _payload$item11;
|
|
508
|
+
if (((_payload$item1 = payload.item) === null || _payload$item1 === void 0 ? void 0 : _payload$item1.type) === 'mcp_call' || ((_payload$item10 = payload.item) === null || _payload$item10 === void 0 ? void 0 : _payload$item10.type) === 'mcp_tool_call') {
|
|
509
|
+
trackMcpStart(callId);
|
|
510
|
+
}
|
|
511
|
+
if (((_payload$item11 = payload.item) === null || _payload$item11 === void 0 ? void 0 : _payload$item11.type) === 'mcp_approval_request') {
|
|
512
|
+
var _payload$item12;
|
|
513
|
+
const approvalId = ((_payload$item12 = payload.item) === null || _payload$item12 === void 0 ? void 0 : _payload$item12.id) || payload.item_id || null;
|
|
514
|
+
if (approvalId && !mcpStateRef.current.handledApprovalIds.has(approvalId)) {
|
|
515
|
+
mcpStateRef.current.handledApprovalIds.add(approvalId);
|
|
516
|
+
sendMcpApproval(approvalId, true);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
if (payload.type === 'conversation.item.done') {
|
|
521
|
+
var _payload$item13, _payload$item14, _payload$item15;
|
|
522
|
+
if (((_payload$item13 = payload.item) === null || _payload$item13 === void 0 ? void 0 : _payload$item13.type) === 'mcp_call' || ((_payload$item14 = payload.item) === null || _payload$item14 === void 0 ? void 0 : _payload$item14.type) === 'mcp_tool_call') {
|
|
523
|
+
handleMcpCompletion(callId);
|
|
524
|
+
}
|
|
525
|
+
if (((_payload$item15 = payload.item) === null || _payload$item15 === void 0 ? void 0 : _payload$item15.type) === 'mcp_approval_request') {
|
|
526
|
+
var _payload$item16;
|
|
527
|
+
const approvalId = ((_payload$item16 = payload.item) === null || _payload$item16 === void 0 ? void 0 : _payload$item16.id) || payload.item_id || null;
|
|
528
|
+
if (approvalId && !mcpStateRef.current.handledApprovalIds.has(approvalId)) {
|
|
529
|
+
mcpStateRef.current.handledApprovalIds.add(approvalId);
|
|
530
|
+
sendMcpApproval(approvalId, true);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
if (payload.type === 'response.done') {
|
|
535
|
+
var _response$status_deta, _response$status_deta2, _response$status_deta3;
|
|
536
|
+
if (responseId) mcpStateRef.current.responsesDone.add(responseId);
|
|
537
|
+
const outputItems = Array.isArray(response === null || response === void 0 ? void 0 : response.output) ? response.output : [];
|
|
538
|
+
const hasMessage = outputItems.some(item => (item === null || item === void 0 ? void 0 : item.type) === 'message');
|
|
539
|
+
const status = response === null || response === void 0 ? void 0 : response.status;
|
|
540
|
+
const reason = (response === null || response === void 0 ? void 0 : (_response$status_deta = response.status_details) === null || _response$status_deta === void 0 ? void 0 : _response$status_deta.reason) || (response === null || response === void 0 ? void 0 : (_response$status_deta2 = response.status_details) === null || _response$status_deta2 === void 0 ? void 0 : (_response$status_deta3 = _response$status_deta2.error) === null || _response$status_deta3 === void 0 ? void 0 : _response$status_deta3.code) || null;
|
|
541
|
+
if (status === 'completed') {
|
|
542
|
+
if (hasMessage && mcpStateRef.current.pending && mcpStateRef.current.pendingCount === 0 && mcpStateRef.current.responseIds.size === 0) {
|
|
543
|
+
clearPendingMcp();
|
|
544
|
+
}
|
|
545
|
+
} else if (mcpStateRef.current.pending) {
|
|
546
|
+
if (status === 'failed') {
|
|
547
|
+
scheduleResumeRetry(callId);
|
|
548
|
+
} else if (status === 'cancelled' && reason !== 'turn_detected') {
|
|
549
|
+
scheduleResumeRetry(callId);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
resumeMcpIfNeeded(callId);
|
|
553
|
+
handleOpenUrlCalls({
|
|
554
|
+
responseId,
|
|
555
|
+
outputItems
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
if (payload.type === 'response.created') {
|
|
559
|
+
if (responseId) responseStateRef.current.activeId = responseId;
|
|
245
560
|
}
|
|
246
561
|
if (payload.type === 'conversation.item.input_audio_transcription.completed') {
|
|
247
562
|
var _payload$transcript;
|
|
248
563
|
const transcript = (_payload$transcript = payload.transcript) === null || _payload$transcript === void 0 ? void 0 : _payload$transcript.trim();
|
|
249
564
|
if (transcript) pendingUserTranscriptRef.current += transcript;
|
|
250
565
|
}
|
|
566
|
+
if (payload.type === 'response.done' && responseId && responseStateRef.current.activeId === responseId) {
|
|
567
|
+
responseStateRef.current.activeId = null;
|
|
568
|
+
if (responseStateRef.current.resumeAfterActive) {
|
|
569
|
+
responseStateRef.current.resumeAfterActive = false;
|
|
570
|
+
mcpStateRef.current.resumeRequestedAny = false;
|
|
571
|
+
resumeMcpIfNeeded();
|
|
572
|
+
}
|
|
573
|
+
if (functionStateRef.current.pendingFollowup) {
|
|
574
|
+
const reason = functionStateRef.current.pendingFollowupReason;
|
|
575
|
+
functionStateRef.current.pendingFollowup = false;
|
|
576
|
+
functionStateRef.current.pendingFollowupReason = null;
|
|
577
|
+
sendResponseCreate(reason || 'followup');
|
|
578
|
+
}
|
|
579
|
+
}
|
|
251
580
|
if (payload.type === 'response.output_audio_transcript.done') {
|
|
252
581
|
var _payload$transcript2;
|
|
253
582
|
const transcript = (_payload$transcript2 = payload.transcript) === null || _payload$transcript2 === void 0 ? void 0 : _payload$transcript2.trim();
|
|
@@ -326,7 +655,7 @@ const useOpenAiRealtimeSession = () => {
|
|
|
326
655
|
} finally {
|
|
327
656
|
setIsConnecting(false);
|
|
328
657
|
}
|
|
329
|
-
}, [cleanupRealtimeSession, enableMicrophone, resumeMcpIfNeeded]);
|
|
658
|
+
}, [cleanupRealtimeSession, clearPendingMcp, enableMicrophone, handleMcpCompletion, handleOpenUrlCalls, resumeMcpIfNeeded, scheduleResumeRetry, sendItemRetrieve, sendMcpApproval, sendResponseCreate, trackMcpStart, upsertFunctionCall, getFunctionCallKey]);
|
|
330
659
|
const endSession = (0, _react.useCallback)(() => {
|
|
331
660
|
cleanupRealtimeSession(true);
|
|
332
661
|
}, [cleanupRealtimeSession]);
|
|
@@ -1 +1 @@
|
|
|
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: `/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 = ({ 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":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAEA,IAAAE,QAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAEA,MAAMI,wBAAwB,GAAGA,CAAA,KAAM;EACrC,MAAMC,eAAe,GAAG,IAAAC,aAAM,EAAC,IAAI,CAAC;EACpC,MAAMC,eAAe,GAAG,IAAAD,aAAM,EAAC,IAAI,CAAC;EACpC,MAAME,iBAAiB,GAAG,IAAAF,aAAM,EAAC,IAAI,CAAC;EACtC,MAAMG,cAAc,GAAG,IAAAH,aAAM,EAAC,IAAI,CAAC;EACnC,MAAMI,cAAc,GAAG,IAAAJ,aAAM,EAAC,IAAI,CAAC;EACnC,MAAMK,kBAAkB,GAAG,IAAAL,aAAM,EAAC,IAAI,CAAC;EACvC,MAAMM,oBAAoB,GAAG,IAAAN,aAAM,EAAC,KAAK,CAAC;EAC1C,MAAMO,eAAe,GAAG,IAAAP,aAAM,EAAC,KAAK,CAAC;EACrC,MAAMQ,kBAAkB,GAAG,IAAAR,aAAM,EAAC,IAAI,CAAC;EACvC,MAAMS,aAAa,GAAG,IAAAT,aAAM,EAAC,KAAK,CAAC;EACnC,MAAMU,mBAAmB,GAAG,IAAAV,aAAM,EAAC,IAAI,CAAC;EACxC,MAAMW,wBAAwB,GAAG,IAAAX,aAAM,EAAC,EAAE,CAAC;EAC3C,MAAMY,cAAc,GAAG,IAAAZ,aAAM,EAAC,IAAI,CAAC;EACnC,MAAMa,eAAe,GAAG,IAAAb,aAAM,EAAC,IAAI,CAAC;EACpC,MAAMc,qBAAqB,GAAG,IAAAd,aAAM,EAAC,IAAI,CAAC;EAC1C,MAAMe,sBAAsB,GAAG,IAAAf,aAAM,EAAC,IAAI,CAAC;EAC3C,MAAMgB,iBAAiB,GAAG,IAAAhB,aAAM,EAAC;IAC/BiB,aAAa,EAAE,IAAI;IACnBC,cAAc,EAAE,IAAI;IACpBC,yBAAyB,EAAEA,CAAA,KAAM,IAAI;IACrCC,0BAA0B,EAAEA,CAAA,KAAM;EACpC,CAAC,CAAC;EAEF,MAAMC,sBAAsB,GAAG,IAAAC,kBAAW,EAAC,YAA0B;IAAA,IAAzBC,YAAY,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,KAAK;IAC9D,MAAMG,WAAW,GAAGxB,cAAc,CAACyB,OAAO;IAC1C,IAAID,WAAW,EAAE;MACf,IAAIJ,YAAY,IAAII,WAAW,CAACE,UAAU,KAAK,MAAM,EAAE;QACrDF,WAAW,CAACG,IAAI,CAACC,IAAI,CAACC,SAAS,CAAC;UAAEC,IAAI,EAAE;QAAgB,CAAC,CAAC,CAAC;MAC7D;MACAN,WAAW,CAACO,KAAK,CAAC,CAAC;MACnB/B,cAAc,CAACyB,OAAO,GAAG,IAAI;IAC/B;IAEA,MAAMO,cAAc,GAAGjC,iBAAiB,CAAC0B,OAAO;IAChD,IAAIO,cAAc,EAAE;MAClBA,cAAc,CAACC,UAAU,CAAC,CAAC,CAACC,OAAO,CAAEC,MAAM,IAAK;QAC9C,IAAIA,MAAM,CAACC,KAAK,EAAED,MAAM,CAACC,KAAK,CAACC,IAAI,CAAC,CAAC;MACvC,CAAC,CAAC;MACFL,cAAc,CAACD,KAAK,CAAC,CAAC;MACtBhC,iBAAiB,CAAC0B,OAAO,GAAG,IAAI;IAClC;IAEA,MAAMa,WAAW,GAAGrC,cAAc,CAACwB,OAAO;IAC1C,IAAIa,WAAW,EAAE;MACfA,WAAW,CAACC,SAAS,CAAC,CAAC,CAACL,OAAO,CAAEE,KAAK,IAAKA,KAAK,CAACC,IAAI,CAAC,CAAC,CAAC;MACxDpC,cAAc,CAACwB,OAAO,GAAG,IAAI;IAC/B;IAEAvB,kBAAkB,CAACuB,OAAO,GAAG,IAAI;IACjCtB,oBAAoB,CAACsB,OAAO,GAAG,KAAK;IACpCrB,eAAe,CAACqB,OAAO,GAAG,KAAK;IAC/BpB,kBAAkB,CAACoB,OAAO,GAAG,IAAI;IACjCnB,aAAa,CAACmB,OAAO,GAAG,KAAK;IAC7BlB,mBAAmB,CAACkB,OAAO,GAAG,IAAI;IAElC,IAAI7B,eAAe,CAAC6B,OAAO,EAAE;MAC3B7B,eAAe,CAAC6B,OAAO,CAACe,SAAS,GAAG,IAAI;MACxC5C,eAAe,CAAC6B,OAAO,GAAG,IAAI;IAChC;IAEA,IAAIhB,cAAc,CAACgB,OAAO,EAAE;MAC1BhB,cAAc,CAACgB,OAAO,CAACgB,UAAU,CAAC,CAAC;MACnChC,cAAc,CAACgB,OAAO,GAAG,IAAI;IAC/B;IAEA,IAAIf,eAAe,CAACe,OAAO,EAAE;MAC3Bf,eAAe,CAACe,OAAO,CAACgB,UAAU,CAAC,CAAC;MACpC/B,eAAe,CAACe,OAAO,GAAG,IAAI;IAChC;IAEAZ,iBAAiB,CAACY,OAAO,CAACX,aAAa,GAAG,IAAI;IAC9CD,iBAAiB,CAACY,OAAO,CAACV,cAAc,GAAG,IAAI;IAC/CF,iBAAiB,CAACY,OAAO,CAACT,yBAAyB,GAAG,MAAM,IAAI;IAChEH,iBAAiB,CAACY,OAAO,CAACR,0BAA0B,GAAG,MAAM,IAAI;IACjEN,qBAAqB,CAACc,OAAO,GAAG,IAAI;IACpCb,sBAAsB,CAACa,OAAO,GAAG,IAAI;IAErC,MAAMiB,YAAY,GAAG5C,eAAe,CAAC2B,OAAO;IAC5C,IAAIiB,YAAY,EAAE;MAChBA,YAAY,CAACX,KAAK,CAAC,CAAC;MACpBjC,eAAe,CAAC2B,OAAO,GAAG,IAAI;IAChC;IAEAjB,wBAAwB,CAACiB,OAAO,GAAG,EAAE;EACvC,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMkB,gBAAgB,GAAG,IAAAxB,kBAAW,EAAC,MAAM;IACzC,MAAMiB,KAAK,GAAGlC,kBAAkB,CAACuB,OAAO;IACxC,IAAI,CAACW,KAAK,IAAIjC,oBAAoB,CAACsB,OAAO,EAAE;IAC5CW,KAAK,CAACQ,OAAO,GAAG,IAAI;IACpBzC,oBAAoB,CAACsB,OAAO,GAAG,IAAI;EACrC,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMoB,iBAAiB,GAAG,IAAA1B,kBAAW,EAAE2B,YAAY,IAAK;IACtD,IAAI,CAACxC,aAAa,CAACmB,OAAO,EAAE;IAC5B,MAAMsB,aAAa,GAAGxC,mBAAmB,CAACkB,OAAO;IACjD,IAAIsB,aAAa,IAAID,YAAY,IAAIC,aAAa,KAAKD,YAAY,EAAE;IACrE,MAAME,OAAO,GAAGhD,cAAc,CAACyB,OAAO;IACtC,IAAIuB,OAAO,IAAIA,OAAO,CAACtB,UAAU,KAAK,MAAM,EAAE;MAC5CsB,OAAO,CAACrB,IAAI,CAACC,IAAI,CAACC,SAAS,CAAC;QAAEC,IAAI,EAAE;MAAkB,CAAC,CAAC,CAAC;IAC3D;IACAxB,aAAa,CAACmB,OAAO,GAAG,KAAK;IAC7BlB,mBAAmB,CAACkB,OAAO,GAAG,IAAI;EACpC,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMwB,YAAY,GAAG,IAAA9B,kBAAW,EAC9B,MAAA+B,IAAA,IAA4F;IAAA,IAArF;MAAEC,cAAc;MAAEC,OAAO;MAAEC,OAAO;MAAEC,OAAO;MAAEC,MAAM;MAAEC,eAAe;MAAEC;IAAS,CAAC,GAAAP,IAAA;IACrFhC,sBAAsB,CAAC,CAAC;IAExB,MAAMwC,WAAW,GAAGC,YAAY,CAACC,OAAO,CAAC,mBAAmB,CAAC;IAE7D,IAAI;MACF,MAAMC,eAAe,GAAG,MAAM,IAAAC,oBAAO,EAAC;QACpCC,QAAQ,gCAAAC,MAAA,CAAgCN,WAAW,eAAAM,MAAA,CAAYV,OAAO,GAAG,EAAE,GAAGD,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI,EAAE,eAAAW,MAAA,CACzFV,OAAO,GAAGF,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI,EAAE,GAAG,EAAE,CAC5B;QACFa,QAAQ,EAAEC,OAAO,CAACC,GAAG,CAACC,eAAe;QACrCC,MAAM,EAAE;MACV,CAAC,CAAC;MAEF,MAAMC,YAAY,GAAGT,eAAe,CAACU,KAAK;MAC1C,MAAMvC,cAAc,GAAG,IAAIwC,iBAAiB,CAAC,CAAC;MAC9CzE,iBAAiB,CAAC0B,OAAO,GAAGO,cAAc;MAE1CpC,eAAe,CAAC6B,OAAO,GAAGgD,QAAQ,CAACC,aAAa,CAAC,OAAO,CAAC;MACzD9E,eAAe,CAAC6B,OAAO,CAACkD,QAAQ,GAAG,IAAI;MACvC3C,cAAc,CAAC4C,OAAO,GAAGC,KAAA,IAAiB;QAAA,IAAhB;UAAEC;QAAQ,CAAC,GAAAD,KAAA;QACnC,MAAM,CAACE,YAAY,CAAC,GAAGD,OAAO;QAC9B,IAAIlF,eAAe,CAAC6B,OAAO,EAAE;UAC3B7B,eAAe,CAAC6B,OAAO,CAACe,SAAS,GAAGuC,YAAY,IAAI,IAAI;QAC1D;QACA,IAAI,CAACjF,eAAe,CAAC2B,OAAO,IAAI,CAACZ,iBAAiB,CAACY,OAAO,CAACV,cAAc,IAAI,CAACgE,YAAY,EAAE;QAC5F,IAAIrE,eAAe,CAACe,OAAO,EAAEf,eAAe,CAACe,OAAO,CAACgB,UAAU,CAAC,CAAC;QACjE/B,eAAe,CAACe,OAAO,GAAG3B,eAAe,CAAC2B,OAAO,CAACuD,uBAAuB,CAACD,YAAY,CAAC;QACvFrE,eAAe,CAACe,OAAO,CAACwD,OAAO,CAACpE,iBAAiB,CAACY,OAAO,CAACV,cAAc,CAAC;MAC3E,CAAC;MAED,MAAMmE,WAAW,GAAG,MAAMC,SAAS,CAACC,YAAY,CAACC,YAAY,CAAC;QAC5DC,KAAK,EAAE;UACLC,gBAAgB,EAAE,IAAI;UACtBC,gBAAgB,EAAE,IAAI;UACtBC,eAAe,EAAE,IAAI;UACrBC,YAAY,EAAE,CAAC;UACfC,UAAU,EAAE;QACd;MACF,CAAC,CAAC;MAEF1F,cAAc,CAACwB,OAAO,GAAGyD,WAAW;MACpC,MAAM,CAAC9C,KAAK,CAAC,GAAG8C,WAAW,CAACU,cAAc,CAAC,CAAC;MAE5C,MAAMC,uBAAuB,GAAGC,UAAU,CAACC,YAAY,IAAID,UAAU,CAACE,kBAAkB;MACxF,IAAI,CAACH,uBAAuB,EAAE,MAAM,IAAII,KAAK,CAAC,4BAA4B,CAAC;MAC3E,MAAMvD,YAAY,GAAG,IAAImD,uBAAuB,CAAC,CAAC;MAClD/F,eAAe,CAAC2B,OAAO,GAAGiB,YAAY;MACtC,IAAIA,YAAY,CAACwD,KAAK,KAAK,WAAW,EAAE,MAAMxD,YAAY,CAACyD,MAAM,CAAC,CAAC;MACnE,MAAMrF,aAAa,GAAG4B,YAAY,CAAC0D,cAAc,CAAC,CAAC;MACnD,MAAMrF,cAAc,GAAG2B,YAAY,CAAC0D,cAAc,CAAC,CAAC;MACpDtF,aAAa,CAACuF,OAAO,GAAG,IAAI;MAC5BtF,cAAc,CAACsF,OAAO,GAAG,IAAI;MAC7BxF,iBAAiB,CAACY,OAAO,CAACX,aAAa,GAAGA,aAAa;MACvDD,iBAAiB,CAACY,OAAO,CAACV,cAAc,GAAGA,cAAc;MACzDJ,qBAAqB,CAACc,OAAO,GAAG,IAAI6E,UAAU,CAACxF,aAAa,CAACyF,iBAAiB,CAAC;MAC/E3F,sBAAsB,CAACa,OAAO,GAAG,IAAI6E,UAAU,CAACvF,cAAc,CAACwF,iBAAiB,CAAC;MACjF1F,iBAAiB,CAACY,OAAO,CAACT,yBAAyB,GAAG,MAAM;QAC1D,IAAI,CAACH,iBAAiB,CAACY,OAAO,CAACX,aAAa,IAAI,CAACH,qBAAqB,CAACc,OAAO,EAAE,OAAO,IAAI;QAC3FZ,iBAAiB,CAACY,OAAO,CAACX,aAAa,CAAC0F,oBAAoB,CAAC7F,qBAAqB,CAACc,OAAO,CAAC;QAC3F,OAAOd,qBAAqB,CAACc,OAAO;MACtC,CAAC;MACDZ,iBAAiB,CAACY,OAAO,CAACR,0BAA0B,GAAG,MAAM;QAC3D,IAAI,CAACJ,iBAAiB,CAACY,OAAO,CAACV,cAAc,IAAI,CAACH,sBAAsB,CAACa,OAAO,EAAE,OAAO,IAAI;QAC7FZ,iBAAiB,CAACY,OAAO,CAACV,cAAc,CAACyF,oBAAoB,CAAC5F,sBAAsB,CAACa,OAAO,CAAC;QAC7F,OAAOb,sBAAsB,CAACa,OAAO;MACvC,CAAC;MAED,MAAMgF,WAAW,GAAG/D,YAAY,CAACsC,uBAAuB,CAACE,WAAW,CAAC;MACrEzE,cAAc,CAACgB,OAAO,GAAGgF,WAAW;MACpCA,WAAW,CAACxB,OAAO,CAACnE,aAAa,CAAC;MAElC,IAAIsB,KAAK,EAAE;QACTlC,kBAAkB,CAACuB,OAAO,GAAGW,KAAK;QAClCA,KAAK,CAACQ,OAAO,GAAG,KAAK;QACrB,MAAMR,KAAK,CAACsE,gBAAgB,CAAC;UAC3BnB,gBAAgB,EAAE,IAAI;UACtBC,gBAAgB,EAAE,IAAI;UACtBC,eAAe,EAAE;QACnB,CAAC,CAAC;QACFzD,cAAc,CAAC2E,QAAQ,CAACvE,KAAK,EAAE8C,WAAW,CAAC;MAC7C;MAEA,MAAM1D,WAAW,GAAGQ,cAAc,CAAC4E,iBAAiB,CAAC,YAAY,CAAC;MAClE5G,cAAc,CAACyB,OAAO,GAAGD,WAAW;MAEpCA,WAAW,CAACqF,gBAAgB,CAAC,MAAM,EAAE,MAAM;QACzCrG,wBAAwB,CAACiB,OAAO,GAAG,EAAE;QACrCqF,kBAAK,CAACC,OAAO,CAACC,cAAK,CAACC,OAAO,EAAE;UAAEC,EAAE,EAAE;QAAa,CAAC,CAAC;QAElD,MAAMC,UAAU,GAAG5D,MAAM,IAAI,OAAO;QACpC,MAAM6D,mBAAmB,6DAAApD,MAAA,CAA4DmD,UAAU,wGAAAnD,MAAA,CAAmGb,cAAc,sIAAkI;QAElV/C,eAAe,CAACqB,OAAO,GAAG,IAAI;QAC9BpB,kBAAkB,CAACoB,OAAO,GAAG,IAAI;QACjCD,WAAW,CAACG,IAAI,CACdC,IAAI,CAACC,SAAS,CAAC;UACbC,IAAI,EAAE,iBAAiB;UACvBuF,QAAQ,EAAE;YACRC,YAAY,EAAEF;UAChB;QACF,CAAC,CACH,CAAC;MACH,CAAC,CAAC;MAEF5F,WAAW,CAACqF,gBAAgB,CAAC,SAAS,EAAE,MAAOU,KAAK,IAAK;QAAA,IAAAC,aAAA,EAAAC,cAAA,EAAAC,cAAA,EAAAC,cAAA;QACvD,MAAMC,OAAO,GAAGhG,IAAI,CAACiG,KAAK,CAACN,KAAK,CAACO,IAAI,CAAC;QAEtC,IAAIF,OAAO,CAAC9F,IAAI,KAAK,4BAA4B,IAAI,EAAA0F,aAAA,GAAAI,OAAO,CAACG,IAAI,cAAAP,aAAA,uBAAZA,aAAA,CAAc1F,IAAI,MAAK,SAAS,EAAE;UACrF,IAAI1B,eAAe,CAACqB,OAAO,IAAI,CAACpB,kBAAkB,CAACoB,OAAO,IAAImG,OAAO,CAACI,WAAW,EAAE;YACjF3H,kBAAkB,CAACoB,OAAO,GAAGmG,OAAO,CAACI,WAAW;UAClD;QACF;QAEA,IAAIJ,OAAO,CAAC9F,IAAI,KAAK,6BAA6B,EAAE;UAClD,IACE1B,eAAe,CAACqB,OAAO,IACvBpB,kBAAkB,CAACoB,OAAO,IAC1BmG,OAAO,CAACI,WAAW,KAAK3H,kBAAkB,CAACoB,OAAO,EAClD;YACAkB,gBAAgB,CAAC,CAAC;YAClBvC,eAAe,CAACqB,OAAO,GAAG,KAAK;YAC/BpB,kBAAkB,CAACoB,OAAO,GAAG,IAAI;UACnC;QACF;QAEA,IAAImG,OAAO,CAAC9F,IAAI,KAAK,4BAA4B,IAAI,EAAA2F,cAAA,GAAAG,OAAO,CAACG,IAAI,cAAAN,cAAA,uBAAZA,cAAA,CAAc3F,IAAI,MAAK,UAAU,EAAE;UAAA,IAAAmG,cAAA,EAAAC,cAAA;UACtF5H,aAAa,CAACmB,OAAO,GAAG,IAAI;UAC5BlB,mBAAmB,CAACkB,OAAO,GAAG,EAAAwG,cAAA,GAAAL,OAAO,CAACG,IAAI,cAAAE,cAAA,uBAAZA,cAAA,CAAcE,OAAO,OAAAD,cAAA,GAAIN,OAAO,CAACG,IAAI,cAAAG,cAAA,uBAAZA,cAAA,CAAchB,EAAE,KAAI,IAAI;QACjF;QAEA,IAAIU,OAAO,CAAC9F,IAAI,KAAK,2BAA2B,IAAI,EAAA4F,cAAA,GAAAE,OAAO,CAACG,IAAI,cAAAL,cAAA,uBAAZA,cAAA,CAAc5F,IAAI,MAAK,UAAU,EAAE;UAAA,IAAAsG,cAAA,EAAAC,cAAA;UACrF,MAAMvF,YAAY,GAAG,EAAAsF,cAAA,GAAAR,OAAO,CAACG,IAAI,cAAAK,cAAA,uBAAZA,cAAA,CAAcD,OAAO,OAAAE,cAAA,GAAIT,OAAO,CAACG,IAAI,cAAAM,cAAA,uBAAZA,cAAA,CAAcnB,EAAE,KAAI,IAAI;UACtErE,iBAAiB,CAACC,YAAY,CAAC;QACjC;QAEA,IAAI8E,OAAO,CAAC9F,IAAI,KAAK,2BAA2B,IAAI,EAAA6F,cAAA,GAAAC,OAAO,CAACG,IAAI,cAAAJ,cAAA,uBAAZA,cAAA,CAAc7F,IAAI,MAAK,iBAAiB,EAAE;UAAA,IAAAwG,cAAA,EAAAC,cAAA,EAAAC,cAAA;UAC5F,MAAM1F,YAAY,GAAG,EAAAwF,cAAA,GAAAV,OAAO,CAACG,IAAI,cAAAO,cAAA,uBAAZA,cAAA,CAAcH,OAAO,OAAAI,cAAA,GAAIX,OAAO,CAACG,IAAI,cAAAQ,cAAA,uBAAZA,cAAA,CAAcE,WAAW,OAAAD,cAAA,GAAIZ,OAAO,CAACG,IAAI,cAAAS,cAAA,uBAAZA,cAAA,CAActB,EAAE,KAAI,IAAI;UACnGrE,iBAAiB,CAACC,YAAY,CAAC;QACjC;QAEA,IAAI8E,OAAO,CAAC9F,IAAI,KAAK,uCAAuC,IAAI8F,OAAO,CAACc,IAAI,KAAK,UAAU,EAAE;UAC3F,MAAM;YAAEC;UAAI,CAAC,GAAG/G,IAAI,CAACiG,KAAK,CAACD,OAAO,CAACvG,SAAS,CAAC;UAC7CuH,MAAM,CAACC,QAAQ,CAACC,IAAI,GAAGH,GAAG;QAC5B;QAEA,IAAIf,OAAO,CAAC9F,IAAI,KAAK,uDAAuD,EAAE;UAAA,IAAAiH,mBAAA;UAC5E,MAAMC,UAAU,IAAAD,mBAAA,GAAGnB,OAAO,CAACoB,UAAU,cAAAD,mBAAA,uBAAlBA,mBAAA,CAAoBE,IAAI,CAAC,CAAC;UAC7C,IAAID,UAAU,EAAExI,wBAAwB,CAACiB,OAAO,IAAIuH,UAAU;QAChE;QAEA,IAAIpB,OAAO,CAAC9F,IAAI,KAAK,uCAAuC,EAAE;UAAA,IAAAoH,oBAAA;UAC5D,MAAMF,UAAU,IAAAE,oBAAA,GAAGtB,OAAO,CAACoB,UAAU,cAAAE,oBAAA,uBAAlBA,oBAAA,CAAoBD,IAAI,CAAC,CAAC;UAC7C,IAAI,CAACD,UAAU,IAAI,CAACxI,wBAAwB,CAACiB,OAAO,EAAE;UAEtD,MAAM0H,KAAK,GAAG3I,wBAAwB,CAACiB,OAAO,CAACwH,IAAI,CAAC,CAAC;UACrDzI,wBAAwB,CAACiB,OAAO,GAAG,EAAE;UAErC,MAAM2H,YAAY,GAAG7F,MAAM,IAAI,OAAO;UAEtC,IAAIF,OAAO,EAAE;YACX,IAAI;cACF,MAAMgG,MAAM,GAAG,MAAM,IAAAC,mBAAY,EAAC;gBAChC5F,WAAW;gBACX6F,SAAS,EAAElG,OAAO;gBAClBmG,OAAO,EAAE;kBAAEjG,MAAM,EAAE6F;gBAAa;cAClC,CAAC,CAAC;cACF,IAAIC,MAAM,EAAE;gBACV,MAAM,IAAAI,wBAAiB,EAAC;kBAAEC,MAAM,EAAE,MAAM;kBAAEC,IAAI,EAAER,KAAK;kBAAEE,MAAM;kBAAEO,IAAI,EAAE;oBAAEtE,KAAK,EAAE;kBAAK;gBAAE,CAAC,CAAC;gBACvF,MAAM,IAAAmE,wBAAiB,EAAC;kBAAEC,MAAM,EAAE,IAAI;kBAAEC,IAAI,EAAEX,UAAU;kBAAEK,MAAM;kBAAEO,IAAI,EAAE;oBAAEtE,KAAK,EAAE;kBAAK;gBAAE,CAAC,CAAC;cAC5F;YACF,CAAC,CAAC,OAAOuE,KAAK,EAAE;cACd/C,kBAAK,CAACC,OAAO,CAACC,cAAK,CAACC,OAAO,EAAE;gBAAEC,EAAE,EAAE,YAAY;gBAAE2C,KAAK,EAAEA,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEC;cAAQ,CAAC,CAAC;YAC3E;UACF;UAEAhD,kBAAK,CAACC,OAAO,CAACC,cAAK,CAACC,OAAO,EAAE;YAC3BC,EAAE,EAAE,kBAAkB;YACtBxD,WAAW;YACXqG,IAAI,EAAEf,UAAU;YAChBG,KAAK;YACLa,KAAK,EAAE,MAAM;YACbzG,MAAM,EAAE6F;UACV,CAAC,CAAC;QACJ;MACF,CAAC,CAAC;MAEF,MAAMa,KAAK,GAAG,MAAMjI,cAAc,CAACkI,WAAW,CAAC,CAAC;MAChD,MAAMlI,cAAc,CAACmI,mBAAmB,CAACF,KAAK,CAAC;MAE/C,MAAMG,WAAW,GAAG,MAAMC,KAAK,CAAC,0CAA0C,EAAE;QAC1EhG,MAAM,EAAE,MAAM;QACdsF,IAAI,EAAEM,KAAK,CAACK,GAAG;QACfC,OAAO,EAAE;UACPC,aAAa,YAAAxG,MAAA,CAAYM,YAAY,CAAE;UACvC,cAAc,EAAE;QAClB;MACF,CAAC,CAAC;MAEF,IAAI,CAAC8F,WAAW,CAACK,EAAE,EAAE,MAAM,IAAIxE,KAAK,CAAC,6CAA6C,CAAC;MAEnF,MAAMyE,MAAM,GAAG;QAAE5I,IAAI,EAAE,QAAQ;QAAEwI,GAAG,EAAE,MAAMF,WAAW,CAACL,IAAI,CAAC;MAAE,CAAC;MAEhE,MAAM/H,cAAc,CAAC2I,oBAAoB,CAACD,MAAM,CAAC;MACjDjH,QAAQ,CAAC,IAAI,CAAC;IAChB,CAAC,CAAC,OAAOoG,KAAK,EAAE;MACd/C,kBAAK,CAACC,OAAO,CAACC,cAAK,CAACC,OAAO,EAAE;QAAEC,EAAE,EAAE,YAAY;QAAE2C,KAAK,EAAEA,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEC;MAAQ,CAAC,CAAC;MACzErG,QAAQ,CAAC,KAAK,CAAC;MACf,MAAMoG,KAAK;IACb,CAAC,SAAS;MACRrG,eAAe,CAAC,KAAK,CAAC;IACxB;EACF,CAAC,EACD,CAACtC,sBAAsB,EAAEyB,gBAAgB,EAAEE,iBAAiB,CAC9D,CAAC;EAED,MAAM+H,UAAU,GAAG,IAAAzJ,kBAAW,EAAC,MAAM;IACnCD,sBAAsB,CAAC,IAAI,CAAC;EAC9B,CAAC,EAAE,CAACA,sBAAsB,CAAC,CAAC;EAE5B,OAAO;IAAE+B,YAAY;IAAE2H,UAAU;IAAEC,cAAc,EAAEhK,iBAAiB,CAACY;EAAQ,CAAC;AAChF,CAAC;AAACqJ,OAAA,CAAAnL,wBAAA,GAAAA,wBAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useOpenAiRealtimeSession.js","names":["_dataSources","require","_react","_helpers","_lobby","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","createMcpState","pending","pendingCallIds","Set","pendingCount","handledCallIds","handledApprovalIds","responseIds","responsesDone","responsesWithMessage","resumeRequestedCallIds","resumeRequestedAny","retry","count","timeoutId","createResponseState","activeId","resumeAfterActive","createFunctionState","pendingCalls","Map","pendingFollowup","pendingFollowupReason","handledOpenUrlCalls","useOpenAiRealtimeSession","audioElementRef","useRef","audioContextRef","peerConnectionRef","dataChannelRef","localStreamRef","localAudioTrackRef","microphoneEnabledRef","pendingIntroRef","introResponseIdRef","mcpStateRef","responseStateRef","functionStateRef","pendingUserTranscriptRef","inputSourceRef","outputSourceRef","inputFrequencyDataRef","outputFrequencyDataRef","audioAnalyzersRef","inputAnalyser","outputAnalyser","getInputByteFrequencyData","getOutputByteFrequencyData","cleanupRealtimeSession","useCallback","shouldSignal","undefined","dataChannel","current","readyState","send","JSON","stringify","type","close","peerConnection","getSenders","sender","track","stop","localStream","getTracks","clearTimeout","srcObject","disconnect","audioContext","safeJsonParse","parse","_unused","isAllowedOpenUrl","url","trim","startsWith","enableMicrophone","enabled","clearPendingMcp","sendResponseCreate","reason","channel","resumeMcpIfNeeded","outputCallId","delete","has","size","shouldResume","some","responseId","add","trackMcpStart","callId","getFunctionCallKey","name","concat","upsertFunctionCall","_ref","key","args","existing","get","set","handleMcpCompletion","scheduleResumeRetry","attempt","delay","setTimeout","sendFunctionCallOutput","output","item","call_id","sendItemRetrieve","itemId","item_id","sendMcpApproval","approvalRequestId","approve","previous_item_id","approval_request_id","requestFollowupResponse","handleOpenUrlCalls","_ref2","outputItems","responseOpenUrlItems","Array","isArray","id","values","callKey","error","allowed_prefix","window","location","assign","startSession","_ref3","assistant_name","chainId","hotelId","isChain","locale","setIsConnecting","setReady","fingerprint","localStorage","getItem","sessionResponse","request","endpoint","hostname","process","env","SERVICE_SYNAPSE","method","ephemeralKey","RTCPeerConnection","document","createElement","autoplay","ontrack","_ref4","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","localeHint","introductionMessage","response","instructions","event","_payload$item","_payload$item2","_payload$item3","_payload$item4","_payload$item5","_payload$item6","_payload$item9","_payload$item0","payload","data","response_id","_payload$item7","_payload$item8","_payload$item1","_payload$item10","_payload$item11","_payload$item12","approvalId","_payload$item13","_payload$item14","_payload$item15","_payload$item16","_response$status_deta","_response$status_deta2","_response$status_deta3","hasMessage","status","status_details","code","_payload$transcript","transcript","_payload$transcript2","input","activeLocale","chatId","ensureChatId","channelId","session","createChatMessage","author","body","meta","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 createMcpState = () => ({\n pending: false,\n pendingCallIds: new Set(),\n pendingCount: 0,\n handledCallIds: new Set(),\n handledApprovalIds: new Set(),\n responseIds: new Set(),\n responsesDone: new Set(),\n responsesWithMessage: new Set(),\n resumeRequestedCallIds: new Set(),\n resumeRequestedAny: false,\n retry: { count: 0, timeoutId: null },\n});\n\nconst createResponseState = () => ({\n activeId: null,\n resumeAfterActive: false,\n});\n\nconst createFunctionState = () => ({\n pendingCalls: new Map(),\n pendingFollowup: false,\n pendingFollowupReason: null,\n handledOpenUrlCalls: new Set(),\n});\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 mcpStateRef = useRef(createMcpState());\n const responseStateRef = useRef(createResponseState());\n const functionStateRef = useRef(createFunctionState());\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 if (mcpStateRef.current.retry.timeoutId) {\n clearTimeout(mcpStateRef.current.retry.timeoutId);\n }\n mcpStateRef.current = createMcpState();\n responseStateRef.current = createResponseState();\n functionStateRef.current = createFunctionState();\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 safeJsonParse = useCallback((value) => {\n if (typeof value !== 'string') return null;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }, []);\n\n const isAllowedOpenUrl = useCallback((url) => {\n if (typeof url !== 'string') return false;\n return url.trim().startsWith('https://reservation.mirai');\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 clearPendingMcp = useCallback(() => {\n if (mcpStateRef.current.retry.timeoutId) {\n clearTimeout(mcpStateRef.current.retry.timeoutId);\n }\n mcpStateRef.current = createMcpState();\n }, []);\n\n const sendResponseCreate = useCallback((reason) => {\n if (responseStateRef.current.activeId) {\n functionStateRef.current.pendingFollowup = true;\n functionStateRef.current.pendingFollowupReason = reason || null;\n return false;\n }\n const channel = dataChannelRef.current;\n if (channel && channel.readyState === 'open') {\n channel.send(JSON.stringify({ type: 'response.create' }));\n return true;\n }\n return false;\n }, []);\n\n const resumeMcpIfNeeded = useCallback(\n (outputCallId) => {\n if (outputCallId) {\n mcpStateRef.current.pendingCallIds.delete(outputCallId);\n }\n if (!mcpStateRef.current.pending || mcpStateRef.current.pendingCount > 0) return;\n if (outputCallId && mcpStateRef.current.resumeRequestedCallIds.has(outputCallId)) return;\n if (!outputCallId && mcpStateRef.current.resumeRequestedAny) return;\n if (!outputCallId && mcpStateRef.current.resumeRequestedCallIds.size > 0) return;\n const shouldResume = [...mcpStateRef.current.responseIds].some(\n (responseId) =>\n mcpStateRef.current.responsesDone.has(responseId) &&\n !mcpStateRef.current.responsesWithMessage.has(responseId),\n );\n if (!shouldResume) return;\n if (sendResponseCreate('mcp_completed')) {\n if (outputCallId) mcpStateRef.current.resumeRequestedCallIds.add(outputCallId);\n if (!outputCallId) mcpStateRef.current.resumeRequestedAny = true;\n } else if (responseStateRef.current.activeId) {\n responseStateRef.current.resumeAfterActive = true;\n }\n },\n [sendResponseCreate],\n );\n\n const trackMcpStart = useCallback((callId) => {\n mcpStateRef.current.pending = true;\n if (callId) {\n if (mcpStateRef.current.handledCallIds.has(callId)) return;\n if (mcpStateRef.current.pendingCallIds.has(callId)) return;\n mcpStateRef.current.pendingCallIds.add(callId);\n mcpStateRef.current.pendingCount += 1;\n return;\n }\n mcpStateRef.current.pendingCount += 1;\n }, []);\n\n const getFunctionCallKey = useCallback((callId, responseId, name) => {\n if (callId) return callId;\n if (responseId && name) return `${responseId}:${name}`;\n return null;\n }, []);\n\n const upsertFunctionCall = useCallback(({ key, name, responseId, callId, args }) => {\n if (!key) return;\n const existing = functionStateRef.current.pendingCalls.get(key) || { key };\n functionStateRef.current.pendingCalls.set(key, {\n ...existing,\n name: name ?? existing.name,\n responseId: responseId ?? existing.responseId,\n callId: callId ?? existing.callId,\n args: args ?? existing.args,\n });\n }, []);\n\n const handleMcpCompletion = useCallback(\n (outputCallId) => {\n mcpStateRef.current.pending = true;\n if (outputCallId) {\n if (mcpStateRef.current.handledCallIds.has(outputCallId)) return;\n mcpStateRef.current.handledCallIds.add(outputCallId);\n }\n if (mcpStateRef.current.pendingCount > 0) mcpStateRef.current.pendingCount -= 1;\n resumeMcpIfNeeded(outputCallId);\n },\n [resumeMcpIfNeeded],\n );\n\n const scheduleResumeRetry = useCallback(\n (outputCallId) => {\n if (!mcpStateRef.current.pending) return;\n if (mcpStateRef.current.retry.timeoutId) return;\n if (mcpStateRef.current.retry.count >= 2) {\n clearPendingMcp();\n return;\n }\n const attempt = mcpStateRef.current.retry.count + 1;\n const delay = attempt * 600;\n mcpStateRef.current.retry.count = attempt;\n mcpStateRef.current.retry.timeoutId = setTimeout(() => {\n mcpStateRef.current.retry.timeoutId = null;\n if (outputCallId) mcpStateRef.current.resumeRequestedCallIds.delete(outputCallId);\n mcpStateRef.current.resumeRequestedAny = false;\n resumeMcpIfNeeded(outputCallId);\n }, delay);\n },\n [clearPendingMcp, resumeMcpIfNeeded],\n );\n\n const sendFunctionCallOutput = useCallback((callId, output) => {\n const channel = dataChannelRef.current;\n if (!callId || !channel || channel.readyState !== 'open') return false;\n channel.send(\n JSON.stringify({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output: JSON.stringify(output || {}),\n },\n }),\n );\n return true;\n }, []);\n\n const sendItemRetrieve = useCallback((itemId) => {\n const channel = dataChannelRef.current;\n if (!itemId || !channel || channel.readyState !== 'open') return false;\n channel.send(\n JSON.stringify({\n type: 'conversation.item.retrieve',\n item_id: itemId,\n }),\n );\n return true;\n }, []);\n\n const sendMcpApproval = useCallback((approvalRequestId, approve = true) => {\n const channel = dataChannelRef.current;\n if (!approvalRequestId || !channel || channel.readyState !== 'open') return false;\n channel.send(\n JSON.stringify({\n type: 'conversation.item.create',\n previous_item_id: approvalRequestId,\n item: {\n type: 'mcp_approval_response',\n approval_request_id: approvalRequestId,\n approve,\n },\n }),\n );\n return true;\n }, []);\n\n const requestFollowupResponse = useCallback(\n (reason, outputCallId) => {\n functionStateRef.current.pendingFollowup = true;\n functionStateRef.current.pendingFollowupReason = reason || null;\n if (sendResponseCreate(reason || 'followup')) {\n mcpStateRef.current.resumeRequestedAny = true;\n if (outputCallId) mcpStateRef.current.resumeRequestedCallIds.add(outputCallId);\n }\n },\n [sendResponseCreate],\n );\n\n const handleOpenUrlCalls = useCallback(\n ({ responseId, outputItems }) => {\n const responseOpenUrlItems = Array.isArray(outputItems)\n ? outputItems.filter((item) => item?.type === 'function_call' && item?.name === 'open_url')\n : [];\n responseOpenUrlItems.forEach((item) => {\n const key = getFunctionCallKey(item.call_id || item.id || null, responseId, item.name);\n upsertFunctionCall({\n key,\n name: item.name,\n responseId,\n callId: item.call_id || item.id || null,\n args: item.arguments || null,\n });\n });\n\n const pendingCalls = [...functionStateRef.current.pendingCalls.values()].filter((call) => {\n if (!call?.name || call.name !== 'open_url') return false;\n if (!responseId) return true;\n return !call.responseId || call.responseId === responseId;\n });\n\n for (const call of pendingCalls) {\n const callKey = call.key || call.callId || call.args || null;\n if (callKey && functionStateRef.current.handledOpenUrlCalls.has(callKey)) continue;\n const args = safeJsonParse(call.args);\n const url = args?.url;\n if (!isAllowedOpenUrl(url)) {\n if (call.callId) {\n sendFunctionCallOutput(call.callId, {\n error: 'blocked_url',\n allowed_prefix: 'https://reservation.mirai',\n });\n requestFollowupResponse('open_url_blocked', call.callId);\n }\n if (call.key) functionStateRef.current.pendingCalls.delete(call.key);\n continue;\n }\n if (callKey) functionStateRef.current.handledOpenUrlCalls.add(callKey);\n if (call.key) functionStateRef.current.pendingCalls.delete(call.key);\n cleanupRealtimeSession(true);\n window.location.assign(url.trim());\n return true;\n }\n return false;\n },\n [\n cleanupRealtimeSession,\n getFunctionCallKey,\n isAllowedOpenUrl,\n requestFollowupResponse,\n safeJsonParse,\n sendFunctionCallOutput,\n upsertFunctionCall,\n ],\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 = ({ 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 const { response } = payload;\n const itemId = payload.item?.id || payload.item_id || null;\n const callId = payload.item?.call_id || payload.call_id || itemId;\n const responseId = payload.response_id || response?.id || null;\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 if (responseId) {\n mcpStateRef.current.responsesWithMessage.add(responseId);\n mcpStateRef.current.responseIds.delete(responseId);\n }\n if (mcpStateRef.current.pending && mcpStateRef.current.pendingCount === 0) {\n clearPendingMcp();\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 (\n payload.type === 'response.output_item.added' &&\n (payload.item?.type === 'mcp_call' || payload.item?.type === 'mcp_tool_call')\n ) {\n if (responseId) mcpStateRef.current.responseIds.add(responseId);\n trackMcpStart(callId);\n }\n\n if (payload.type === 'response.output_item.added' && payload.item?.type === 'function_call') {\n const name = payload.item?.name || payload.name || null;\n const key = getFunctionCallKey(callId, responseId, name);\n upsertFunctionCall({ key, name, responseId, callId, args: payload.item?.arguments || null });\n }\n\n if (payload.type === 'response.function_call_arguments.done') {\n const name = payload.name || null;\n const key = getFunctionCallKey(payload.call_id || null, responseId, name);\n upsertFunctionCall({ key, name, responseId, callId: payload.call_id || null, args: payload.arguments });\n }\n\n if (payload.type === 'response.mcp_call.in_progress') {\n trackMcpStart(callId);\n if (payload.item_id) sendItemRetrieve(payload.item_id);\n }\n\n if (payload.type === 'response.mcp_tool_call.in_progress') {\n trackMcpStart(callId);\n if (payload.item_id) sendItemRetrieve(payload.item_id);\n }\n\n if (payload.type === 'mcp_list_tools.in_progress' || payload.type === 'response.mcp_list_tools.in_progress') {\n if (payload.item_id) sendItemRetrieve(payload.item_id);\n }\n\n if (\n payload.type === 'response.output_item.done' &&\n (payload.item?.type === 'mcp_call' || payload.item?.type === 'mcp_tool_call')\n ) {\n handleMcpCompletion(callId);\n }\n\n if (\n payload.type === 'response.mcp_call.completed' ||\n payload.type === 'response.mcp_call.failed' ||\n payload.type === 'response.mcp_tool_call.completed' ||\n payload.type === 'response.mcp_tool_call.failed'\n ) {\n handleMcpCompletion(callId);\n }\n\n if (payload.type === 'conversation.item.added' || payload.type === 'conversation.item.retrieved') {\n if (payload.item?.type === 'mcp_call' || payload.item?.type === 'mcp_tool_call') {\n trackMcpStart(callId);\n }\n if (payload.item?.type === 'mcp_approval_request') {\n const approvalId = payload.item?.id || payload.item_id || null;\n if (approvalId && !mcpStateRef.current.handledApprovalIds.has(approvalId)) {\n mcpStateRef.current.handledApprovalIds.add(approvalId);\n sendMcpApproval(approvalId, true);\n }\n }\n }\n\n if (payload.type === 'conversation.item.done') {\n if (payload.item?.type === 'mcp_call' || payload.item?.type === 'mcp_tool_call') {\n handleMcpCompletion(callId);\n }\n if (payload.item?.type === 'mcp_approval_request') {\n const approvalId = payload.item?.id || payload.item_id || null;\n if (approvalId && !mcpStateRef.current.handledApprovalIds.has(approvalId)) {\n mcpStateRef.current.handledApprovalIds.add(approvalId);\n sendMcpApproval(approvalId, true);\n }\n }\n }\n\n if (payload.type === 'response.done') {\n if (responseId) mcpStateRef.current.responsesDone.add(responseId);\n const outputItems = Array.isArray(response?.output) ? response.output : [];\n const hasMessage = outputItems.some((item) => item?.type === 'message');\n const status = response?.status;\n const reason = response?.status_details?.reason || response?.status_details?.error?.code || null;\n if (status === 'completed') {\n if (\n hasMessage &&\n mcpStateRef.current.pending &&\n mcpStateRef.current.pendingCount === 0 &&\n mcpStateRef.current.responseIds.size === 0\n ) {\n clearPendingMcp();\n }\n } else if (mcpStateRef.current.pending) {\n if (status === 'failed') {\n scheduleResumeRetry(callId);\n } else if (status === 'cancelled' && reason !== 'turn_detected') {\n scheduleResumeRetry(callId);\n }\n }\n resumeMcpIfNeeded(callId);\n handleOpenUrlCalls({ responseId, outputItems });\n }\n\n if (payload.type === 'response.created') {\n if (responseId) responseStateRef.current.activeId = responseId;\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.done' && responseId && responseStateRef.current.activeId === responseId) {\n responseStateRef.current.activeId = null;\n if (responseStateRef.current.resumeAfterActive) {\n responseStateRef.current.resumeAfterActive = false;\n mcpStateRef.current.resumeRequestedAny = false;\n resumeMcpIfNeeded();\n }\n if (functionStateRef.current.pendingFollowup) {\n const reason = functionStateRef.current.pendingFollowupReason;\n functionStateRef.current.pendingFollowup = false;\n functionStateRef.current.pendingFollowupReason = null;\n sendResponseCreate(reason || 'followup');\n }\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 [\n cleanupRealtimeSession,\n clearPendingMcp,\n enableMicrophone,\n handleMcpCompletion,\n handleOpenUrlCalls,\n resumeMcpIfNeeded,\n scheduleResumeRetry,\n sendItemRetrieve,\n sendMcpApproval,\n sendResponseCreate,\n trackMcpStart,\n upsertFunctionCall,\n getFunctionCallKey,\n ],\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":[]}
|