guideai-app 0.1.7 → 0.1.9

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.
@@ -0,0 +1,362 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { useState, useRef, useCallback } from 'react';
38
+ import { initializeWebRTC, sendMessage } from '../utils/webrtc';
39
+ import { fetchEphemeralToken } from '../utils/api-services';
40
+ import { geminiFlash } from '../utils/api-services';
41
+ import { highlightElement } from '../utils/dom-interaction';
42
+ export var useRecording = function (organizationKey, onError, logMessageFn, addConversationHistoryFn, storeConversationItemFn, updateConversationItem, isAddingHistoryContextRef) {
43
+ var _a = useState('idle'), status = _a[0], setStatus = _a[1];
44
+ var _b = useState(false), isSessionReady = _b[0], setIsSessionReady = _b[1];
45
+ var _c = useState(null), ephemeralToken = _c[0], setEphemeralToken = _c[1];
46
+ var peerConnectionRef = useRef(null);
47
+ var dataChannelRef = useRef(null);
48
+ var mediaStreamRef = useRef(null);
49
+ var audioElementRef = useRef(null);
50
+ var sendWebRTCMessage = useCallback(function (message) {
51
+ if (message.type === "conversation.item.create") {
52
+ console.log("item create", message.item);
53
+ }
54
+ else {
55
+ console.log("sendWebRTCMessage", message);
56
+ }
57
+ return sendMessage(dataChannelRef.current, message);
58
+ }, []);
59
+ var cleanupWebRTC = useCallback(function () {
60
+ if (mediaStreamRef.current) {
61
+ mediaStreamRef.current.getAudioTracks().forEach(function (track) {
62
+ track.stop();
63
+ });
64
+ mediaStreamRef.current = null;
65
+ }
66
+ if (dataChannelRef.current) {
67
+ dataChannelRef.current.close();
68
+ dataChannelRef.current = null;
69
+ }
70
+ if (peerConnectionRef.current) {
71
+ peerConnectionRef.current.close();
72
+ peerConnectionRef.current = null;
73
+ }
74
+ if (audioElementRef.current) {
75
+ audioElementRef.current.srcObject = null;
76
+ }
77
+ // Reset session ready state
78
+ setIsSessionReady(false);
79
+ if (isAddingHistoryContextRef.current) {
80
+ isAddingHistoryContextRef.current = false;
81
+ }
82
+ }, [isAddingHistoryContextRef]);
83
+ var handleWebRTCMessage = useCallback(function (message) {
84
+ try {
85
+ var ignoreMessages = ["delta", "input_audio_buffer", "rate_limits",
86
+ "response.audio.done", "response.output_item", "response.content_part", "output_audio_buffer",
87
+ "response.created", "response.function_call_arguments.delta", "response.function_call_arguments.done"
88
+ ];
89
+ switch (message.type) {
90
+ case 'session.updated':
91
+ // console.log('session.updated', message);
92
+ setIsSessionReady(true);
93
+ // If we're not already adding history and we have history
94
+ if (!isAddingHistoryContextRef.current) {
95
+ isAddingHistoryContextRef.current = true;
96
+ addConversationHistoryFn(sendWebRTCMessage);
97
+ }
98
+ setStatus('recording');
99
+ break;
100
+ case 'conversation.item.input_audio_transcription.completed':
101
+ console.log('User transcript:', message.transcript);
102
+ updateConversationItem(message.item_id, {
103
+ content: [{ type: "input_text", text: message.transcript }]
104
+ });
105
+ break;
106
+ case 'response.audio_transcript.done':
107
+ console.log('Assistant message:', message.transcript);
108
+ updateConversationItem(message.item_id, {
109
+ content: [{ type: "text", text: message.transcript }],
110
+ status: "completed"
111
+ });
112
+ break;
113
+ case 'response.function_call_arguments.done':
114
+ updateConversationItem(message.item_id, {
115
+ arguments: message.arguments,
116
+ status: "completed"
117
+ });
118
+ break;
119
+ case "conversation.item.created":
120
+ storeConversationItemFn(message);
121
+ // console.log('conversation.item.created', message);
122
+ break;
123
+ case 'response.done':
124
+ console.log('response.done', message);
125
+ var hasMessageOutput = false;
126
+ for (var _i = 0, _a = message.response.output; _i < _a.length; _i++) {
127
+ var out = _a[_i];
128
+ switch (out.type) {
129
+ case "message":
130
+ hasMessageOutput = true;
131
+ break;
132
+ case "function_call":
133
+ if (out.name === 'highlight' && out.arguments) {
134
+ try {
135
+ var argsToUse = out.arguments;
136
+ var prompt_1 = "\n Validate the following JSON string and return ONLY a correct JSON object:\n Note: The selector(s) should be either a css selector or an xpath, so modify those if invalid.\n Also, [url=''] is a valid css selector, so do not modify it if it's present.\n Do not add any other text or newlines to the response.\n It should be of the following format:\n { \"selector\": \"string\" }\n or\n { \"selector\": [\"string\", ...] }\n DO NOT add any other text or newlines to the response, it should begin and end with curly braces.\n DO NOT add '''json to the response.\n The JSON string is:\n ".concat(argsToUse, "\n ");
137
+ geminiFlash(prompt_1).then(function (response) {
138
+ response = response.replace("```json", "").replace("```", "").trim();
139
+ var parsedArgs = JSON.parse(response);
140
+ highlightElement(parsedArgs.selector, logMessageFn);
141
+ }).catch(function (err) {
142
+ console.error("Error calling Gemini:", err);
143
+ });
144
+ }
145
+ catch (error) {
146
+ console.error('Error parsing function arguments:', error);
147
+ console.log(out.arguments);
148
+ logMessageFn('Error parsing function arguments: ' + out.arguments, 'GUIDEAI');
149
+ }
150
+ }
151
+ sendWebRTCMessage({
152
+ type: "conversation.item.create",
153
+ item: {
154
+ type: "function_call_output",
155
+ call_id: out.call_id,
156
+ output: JSON.stringify(true)
157
+ }
158
+ });
159
+ break;
160
+ }
161
+ }
162
+ // Only send response.create if there were no message outputs, only function calls
163
+ if (!hasMessageOutput && message.response.output.some(function (out) { return out.type === "function_call"; })) {
164
+ sendWebRTCMessage({
165
+ type: 'response.create',
166
+ modalities: ["audio", "text"]
167
+ });
168
+ }
169
+ break;
170
+ case "output_audio_buffer.started":
171
+ setStatus('playing');
172
+ break;
173
+ case "output_audio_buffer.stopped":
174
+ setStatus('idle');
175
+ break;
176
+ case 'error':
177
+ if (message.error.code === 'session_expired') {
178
+ console.error('Session expired:', message);
179
+ setStatus('idle');
180
+ break;
181
+ }
182
+ console.error('OpenAI API error:', message);
183
+ onError(new Error(message.error.message || 'Unknown API error'), 'OpenAI API error');
184
+ setStatus('idle');
185
+ break;
186
+ default:
187
+ if (!ignoreMessages.some(function (fragment) { return message.type.includes(fragment); })) {
188
+ console.log('Unhandled:', message.type, message);
189
+ }
190
+ }
191
+ }
192
+ catch (error) {
193
+ console.error('Error handling WebRTC message:', error);
194
+ setStatus('idle');
195
+ }
196
+ }, [addConversationHistoryFn, isAddingHistoryContextRef, logMessageFn, onError, sendWebRTCMessage, storeConversationItemFn]);
197
+ var sendInitialSessionUpdate = useCallback(function () {
198
+ sendWebRTCMessage({
199
+ type: "session.update",
200
+ session: {
201
+ tools: [{
202
+ type: "function",
203
+ name: "highlight",
204
+ description: "Highlight specific elements on the page to guide the user's attention",
205
+ parameters: {
206
+ type: "object",
207
+ properties: {
208
+ selector: {
209
+ oneOf: [
210
+ {
211
+ type: "string",
212
+ description: "CSS selector or XPath for the element to highlight (e.g., '#search-bar')"
213
+ },
214
+ {
215
+ type: "array",
216
+ items: {
217
+ type: "string"
218
+ },
219
+ description: "List of CSS selectors or XPaths to highlight in sequence (e.g., ['#first-button', '#second-button'])"
220
+ }
221
+ ],
222
+ description: "CSS selector(s) or XPath(s) for the element(s) to highlight. Can be a single selector string or an array of selectors to process sequentially."
223
+ }
224
+ },
225
+ required: ["selector"]
226
+ }
227
+ }],
228
+ tool_choice: "auto",
229
+ turn_detection: {
230
+ type: "server_vad",
231
+ create_response: false,
232
+ interrupt_response: false
233
+ },
234
+ input_audio_transcription: {
235
+ model: "gpt-4o-mini-transcribe",
236
+ language: "en",
237
+ prompt: "The user may say 'cert' often, so make sure to listen for that."
238
+ },
239
+ }
240
+ });
241
+ }, [sendWebRTCMessage]);
242
+ var startRecording = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
243
+ var audioStream, tokenToUse, _a, initialized, error_1, error_2;
244
+ var _b;
245
+ return __generator(this, function (_c) {
246
+ switch (_c.label) {
247
+ case 0:
248
+ _c.trys.push([0, 9, , 10]);
249
+ setStatus('initializing');
250
+ if (!(peerConnectionRef.current &&
251
+ ((_b = dataChannelRef.current) === null || _b === void 0 ? void 0 : _b.readyState) === 'open' &&
252
+ mediaStreamRef.current)) return [3 /*break*/, 1];
253
+ console.log('Using existing WebRTC connection');
254
+ mediaStreamRef.current.getAudioTracks().forEach(function (track) {
255
+ track.enabled = true;
256
+ });
257
+ setStatus('recording');
258
+ return [3 /*break*/, 8];
259
+ case 1:
260
+ console.log('Initializing microphone and WebRTC');
261
+ cleanupWebRTC();
262
+ _c.label = 2;
263
+ case 2:
264
+ _c.trys.push([2, 7, , 8]);
265
+ return [4 /*yield*/, navigator.mediaDevices.getUserMedia({
266
+ audio: {
267
+ echoCancellation: true,
268
+ noiseSuppression: true,
269
+ autoGainControl: true,
270
+ channelCount: 1,
271
+ sampleRate: 48000,
272
+ }
273
+ })];
274
+ case 3:
275
+ audioStream = _c.sent();
276
+ mediaStreamRef.current = audioStream;
277
+ _a = ephemeralToken;
278
+ if (_a) return [3 /*break*/, 5];
279
+ return [4 /*yield*/, fetchEphemeralToken(organizationKey)];
280
+ case 4:
281
+ _a = (_c.sent());
282
+ _c.label = 5;
283
+ case 5:
284
+ tokenToUse = _a;
285
+ if (!tokenToUse) {
286
+ throw new Error('Failed to obtain authorization token');
287
+ }
288
+ setEphemeralToken(tokenToUse);
289
+ return [4 /*yield*/, initializeWebRTC(audioStream, tokenToUse, audioElementRef, peerConnectionRef, dataChannelRef, handleWebRTCMessage, sendInitialSessionUpdate)];
290
+ case 6:
291
+ initialized = _c.sent();
292
+ if (!initialized) {
293
+ // Clean up if initialization fails
294
+ audioStream.getAudioTracks().forEach(function (track) {
295
+ track.stop();
296
+ });
297
+ mediaStreamRef.current = null;
298
+ setStatus('idle');
299
+ return [2 /*return*/];
300
+ }
301
+ return [3 /*break*/, 8];
302
+ case 7:
303
+ error_1 = _c.sent();
304
+ console.error('Error during recording setup:', error_1);
305
+ onError(error_1, 'Microphone or WebRTC setup failed');
306
+ setStatus('idle');
307
+ return [2 /*return*/];
308
+ case 8: return [3 /*break*/, 10];
309
+ case 9:
310
+ error_2 = _c.sent();
311
+ setStatus('idle');
312
+ onError(error_2, 'Starting recording failed');
313
+ return [3 /*break*/, 10];
314
+ case 10: return [2 /*return*/];
315
+ }
316
+ });
317
+ }); }, [cleanupWebRTC, ephemeralToken, handleWebRTCMessage, sendInitialSessionUpdate, onError, organizationKey]);
318
+ var stopRecording = useCallback(function () {
319
+ setStatus('processing');
320
+ if (mediaStreamRef.current) {
321
+ mediaStreamRef.current.getAudioTracks().forEach(function (track) {
322
+ track.enabled = false;
323
+ });
324
+ }
325
+ // Add delay before sending response.create
326
+ setTimeout(function () {
327
+ sendWebRTCMessage({
328
+ type: 'response.create',
329
+ });
330
+ }, 500);
331
+ setStatus('processing');
332
+ }, [sendWebRTCMessage]);
333
+ var toggleRecording = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
334
+ return __generator(this, function (_a) {
335
+ switch (_a.label) {
336
+ case 0:
337
+ if (!(status === 'idle')) return [3 /*break*/, 2];
338
+ return [4 /*yield*/, startRecording()];
339
+ case 1:
340
+ _a.sent();
341
+ return [3 /*break*/, 4];
342
+ case 2:
343
+ if (!(status === 'recording')) return [3 /*break*/, 4];
344
+ return [4 /*yield*/, stopRecording()];
345
+ case 3:
346
+ _a.sent();
347
+ _a.label = 4;
348
+ case 4: return [2 /*return*/];
349
+ }
350
+ });
351
+ }); }, [startRecording, status, stopRecording]);
352
+ return {
353
+ status: status,
354
+ isSessionReady: isSessionReady,
355
+ toggleRecording: toggleRecording,
356
+ cleanupWebRTC: cleanupWebRTC,
357
+ audioElementRef: audioElementRef,
358
+ ephemeralToken: ephemeralToken,
359
+ setEphemeralToken: setEphemeralToken
360
+ };
361
+ };
362
+ //# sourceMappingURL=useRecording.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRecording.js","sourceRoot":"","sources":["../../src/hooks/useRecording.ts"],"names":[],"mappings":"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"}