genassist-chat-react 1.0.0

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,51 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Mic, Loader2 } from 'lucide-react';
3
+ import { useVoiceInput } from '../hooks/useVoiceInput';
4
+ export var VoiceInput = function (_a) {
5
+ var onTranscription = _a.onTranscription, onError = _a.onError, baseUrl = _a.baseUrl, apiKey = _a.apiKey, theme = _a.theme;
6
+ var _b = useVoiceInput({
7
+ baseUrl: baseUrl,
8
+ apiKey: apiKey,
9
+ onTranscription: onTranscription,
10
+ onError: onError,
11
+ }), isRecording = _b.isRecording, isLoading = _b.isLoading, toggleRecording = _b.toggleRecording;
12
+ var handleClick = function (e) {
13
+ e.preventDefault();
14
+ e.stopPropagation();
15
+ toggleRecording();
16
+ };
17
+ var getButtonContent = function () {
18
+ if (isLoading) {
19
+ return (_jsx(Loader2, { size: 20, color: "#757575", style: {
20
+ animation: 'spin 1s linear infinite',
21
+ } }));
22
+ }
23
+ return _jsx(Mic, { size: 20, color: isRecording ? '#ff0000' : '#757575' });
24
+ };
25
+ var getTitle = function () {
26
+ if (isLoading)
27
+ return 'Connecting...';
28
+ return isRecording ? 'Stop Recording' : 'Start Recording';
29
+ };
30
+ var buttonStyle = {
31
+ backgroundColor: '#ffffff',
32
+ color: isRecording ? '#ff0000' : '#757575',
33
+ border: 'none',
34
+ borderRadius: '8px',
35
+ width: '48px',
36
+ height: '48px',
37
+ display: 'flex',
38
+ alignItems: 'center',
39
+ justifyContent: 'center',
40
+ cursor: isLoading ? 'not-allowed' : 'pointer',
41
+ outline: 'none',
42
+ transition: 'all 0.2s ease',
43
+ flexShrink: 0,
44
+ boxShadow: '0 1px 3px rgba(0, 0, 0, 0.05)',
45
+ opacity: isLoading ? 0.7 : 1,
46
+ };
47
+ // Keyframe animation for the spinner
48
+ var spinKeyframes = "\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n ";
49
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: spinKeyframes }), _jsx("button", { type: "button", style: buttonStyle, onClick: handleClick, title: getTitle(), disabled: isLoading, children: getButtonContent() })] }));
50
+ };
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm9pY2VJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL1ZvaWNlSW5wdXQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFjdkQsTUFBTSxDQUFDLElBQU0sVUFBVSxHQUE4QixVQUFDLEVBTXJEO1FBTEMsZUFBZSxxQkFBQSxFQUNmLE9BQU8sYUFBQSxFQUNQLE9BQU8sYUFBQSxFQUNQLE1BQU0sWUFBQSxFQUNOLEtBQUssV0FBQTtJQUVDLElBQUEsS0FBOEMsYUFBYSxDQUFDO1FBQ2hFLE9BQU8sU0FBQTtRQUNQLE1BQU0sUUFBQTtRQUNOLGVBQWUsaUJBQUE7UUFDZixPQUFPLFNBQUE7S0FDUixDQUFDLEVBTE0sV0FBVyxpQkFBQSxFQUFFLFNBQVMsZUFBQSxFQUFFLGVBQWUscUJBSzdDLENBQUM7SUFFSCxJQUFNLFdBQVcsR0FBRyxVQUFDLENBQW1CO1FBQ3RDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNuQixDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEIsZUFBZSxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDO0lBRUYsSUFBTSxnQkFBZ0IsR0FBRztRQUN2QixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUNMLEtBQUMsT0FBTyxJQUNOLElBQUksRUFBRSxFQUFFLEVBQ1IsS0FBSyxFQUFDLFNBQVMsRUFDZixLQUFLLEVBQUU7b0JBQ0wsU0FBUyxFQUFFLHlCQUF5QjtpQkFDckMsR0FDRCxDQUNILENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxLQUFDLEdBQUcsSUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFJLENBQUM7SUFDdkUsQ0FBQyxDQUFDO0lBRUYsSUFBTSxRQUFRLEdBQUc7UUFDZixJQUFJLFNBQVM7WUFBRSxPQUFPLGVBQWUsQ0FBQztRQUN0QyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0lBQzVELENBQUMsQ0FBQztJQUVGLElBQU0sV0FBVyxHQUF3QjtRQUN2QyxlQUFlLEVBQUUsU0FBUztRQUMxQixLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDMUMsTUFBTSxFQUFFLE1BQU07UUFDZCxZQUFZLEVBQUUsS0FBSztRQUNuQixLQUFLLEVBQUUsTUFBTTtRQUNiLE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLE1BQU07UUFDZixVQUFVLEVBQUUsUUFBUTtRQUNwQixjQUFjLEVBQUUsUUFBUTtRQUN4QixNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDN0MsT0FBTyxFQUFFLE1BQU07UUFDZixVQUFVLEVBQUUsZUFBZTtRQUMzQixVQUFVLEVBQUUsQ0FBQztRQUNiLFNBQVMsRUFBRSwrQkFBK0I7UUFDMUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdCLENBQUM7SUFFRixxQ0FBcUM7SUFDckMsSUFBTSxhQUFhLEdBQUcsc0pBU3JCLENBQUM7SUFFRixPQUFPLENBQ0wsOEJBQ0UsMEJBQVEsYUFBYSxHQUFTLEVBQzlCLGlCQUNFLElBQUksRUFBQyxRQUFRLEVBQ2IsS0FBSyxFQUFFLFdBQVcsRUFDbEIsT0FBTyxFQUFFLFdBQVcsRUFDcEIsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUNqQixRQUFRLEVBQUUsU0FBUyxZQUVsQixnQkFBZ0IsRUFBRSxHQUNaLElBQ1IsQ0FDSixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE1pYywgTG9hZGVyMiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyB1c2VWb2ljZUlucHV0IH0gZnJvbSAnLi4vaG9va3MvdXNlVm9pY2VJbnB1dCc7XG5cbmludGVyZmFjZSBWb2ljZUlucHV0UHJvcHMge1xuICBvblRyYW5zY3JpcHRpb246ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uRXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIGJhc2VVcmw6IHN0cmluZztcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIHRoZW1lPzoge1xuICAgIHByaW1hcnlDb2xvcj86IHN0cmluZztcbiAgICBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XG4gICAgZm9udEZhbWlseT86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFZvaWNlSW5wdXQ6IFJlYWN0LkZDPFZvaWNlSW5wdXRQcm9wcz4gPSAoe1xuICBvblRyYW5zY3JpcHRpb24sXG4gIG9uRXJyb3IsXG4gIGJhc2VVcmwsXG4gIGFwaUtleSxcbiAgdGhlbWVcbn0pID0+IHtcbiAgY29uc3QgeyBpc1JlY29yZGluZywgaXNMb2FkaW5nLCB0b2dnbGVSZWNvcmRpbmcgfSA9IHVzZVZvaWNlSW5wdXQoe1xuICAgIGJhc2VVcmwsXG4gICAgYXBpS2V5LFxuICAgIG9uVHJhbnNjcmlwdGlvbixcbiAgICBvbkVycm9yLFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVDbGljayA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdG9nZ2xlUmVjb3JkaW5nKCk7XG4gIH07XG5cbiAgY29uc3QgZ2V0QnV0dG9uQ29udGVudCA9ICgpID0+IHtcbiAgICBpZiAoaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8TG9hZGVyMiBcbiAgICAgICAgICBzaXplPXsyMH0gXG4gICAgICAgICAgY29sb3I9XCIjNzU3NTc1XCIgXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGFuaW1hdGlvbjogJ3NwaW4gMXMgbGluZWFyIGluZmluaXRlJyxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIDxNaWMgc2l6ZT17MjB9IGNvbG9yPXtpc1JlY29yZGluZyA/ICcjZmYwMDAwJyA6ICcjNzU3NTc1J30gLz47XG4gIH07XG5cbiAgY29uc3QgZ2V0VGl0bGUgPSAoKSA9PiB7XG4gICAgaWYgKGlzTG9hZGluZykgcmV0dXJuICdDb25uZWN0aW5nLi4uJztcbiAgICByZXR1cm4gaXNSZWNvcmRpbmcgPyAnU3RvcCBSZWNvcmRpbmcnIDogJ1N0YXJ0IFJlY29yZGluZyc7XG4gIH07XG5cbiAgY29uc3QgYnV0dG9uU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAnI2ZmZmZmZicsXG4gICAgY29sb3I6IGlzUmVjb3JkaW5nID8gJyNmZjAwMDAnIDogJyM3NTc1NzUnLFxuICAgIGJvcmRlcjogJ25vbmUnLFxuICAgIGJvcmRlclJhZGl1czogJzhweCcsXG4gICAgd2lkdGg6ICc0OHB4JyxcbiAgICBoZWlnaHQ6ICc0OHB4JyxcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgIGN1cnNvcjogaXNMb2FkaW5nID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJyxcbiAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgdHJhbnNpdGlvbjogJ2FsbCAwLjJzIGVhc2UnLFxuICAgIGZsZXhTaHJpbms6IDAsXG4gICAgYm94U2hhZG93OiAnMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wNSknLFxuICAgIG9wYWNpdHk6IGlzTG9hZGluZyA/IDAuNyA6IDEsXG4gIH07XG5cbiAgLy8gS2V5ZnJhbWUgYW5pbWF0aW9uIGZvciB0aGUgc3Bpbm5lclxuICBjb25zdCBzcGluS2V5ZnJhbWVzID0gYFxuICAgIEBrZXlmcmFtZXMgc3BpbiB7XG4gICAgICBmcm9tIHtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgICB9XG4gICAgICB0byB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgICB9XG4gICAgfVxuICBgO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxzdHlsZT57c3BpbktleWZyYW1lc308L3N0eWxlPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgc3R5bGU9e2J1dHRvblN0eWxlfVxuICAgICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgICAgdGl0bGU9e2dldFRpdGxlKCl9XG4gICAgICAgIGRpc2FibGVkPXtpc0xvYWRpbmd9XG4gICAgICA+XG4gICAgICAgIHtnZXRCdXR0b25Db250ZW50KCl9XG4gICAgICA8L2J1dHRvbj5cbiAgICA8Lz5cbiAgKTtcbn07ICJdfQ==
@@ -0,0 +1,21 @@
1
+ import { ChatMessage } from '../types';
2
+ export interface UseChatProps {
3
+ baseUrl: string;
4
+ apiKey: string;
5
+ metadata?: Record<string, any>;
6
+ onError?: (error: Error) => void;
7
+ onTakeover?: () => void;
8
+ onFinalize?: () => void;
9
+ }
10
+ export declare const useChat: ({ baseUrl, apiKey, metadata, onError, onTakeover, onFinalize }: UseChatProps) => {
11
+ messages: ChatMessage[];
12
+ isLoading: boolean;
13
+ sendMessage: (text: string) => Promise<void>;
14
+ resetConversation: () => Promise<void>;
15
+ startConversation: () => Promise<void>;
16
+ connectionState: "connecting" | "connected" | "disconnected";
17
+ conversationId: string | null;
18
+ possibleQueries: string[];
19
+ isTakenOver: boolean;
20
+ isFinalized: boolean;
21
+ };
@@ -0,0 +1,256 @@
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
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
38
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
39
+ if (ar || !(i in from)) {
40
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
41
+ ar[i] = from[i];
42
+ }
43
+ }
44
+ return to.concat(ar || Array.prototype.slice.call(from));
45
+ };
46
+ import { useState, useEffect, useCallback, useRef } from 'react';
47
+ import { ChatService } from '../services/chatService';
48
+ export var useChat = function (_a) {
49
+ var baseUrl = _a.baseUrl, apiKey = _a.apiKey, metadata = _a.metadata, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize;
50
+ var _b = useState(function () {
51
+ try {
52
+ var storedMessages = localStorage.getItem('chatMessages');
53
+ return storedMessages ? JSON.parse(storedMessages) : [];
54
+ }
55
+ catch (error) {
56
+ console.error('Error loading messages from localStorage:', error);
57
+ return [];
58
+ }
59
+ }), messages = _b[0], setMessages = _b[1];
60
+ var _c = useState(false), isLoading = _c[0], setIsLoading = _c[1];
61
+ var _d = useState('disconnected'), connectionState = _d[0], setConnectionState = _d[1];
62
+ var chatServiceRef = useRef(null);
63
+ var _e = useState(null), conversationId = _e[0], setConversationId = _e[1];
64
+ var _f = useState([]), possibleQueries = _f[0], setPossibleQueries = _f[1];
65
+ var _g = useState(false), isTakenOver = _g[0], setIsTakenOver = _g[1];
66
+ var _h = useState(false), isFinalized = _h[0], setIsFinalized = _h[1];
67
+ // Initialize chat service
68
+ useEffect(function () {
69
+ chatServiceRef.current = new ChatService(baseUrl, apiKey, metadata);
70
+ chatServiceRef.current.setMessageHandler(function (message) {
71
+ setMessages(function (prevMessages) { return __spreadArray(__spreadArray([], prevMessages, true), [message], false); });
72
+ });
73
+ chatServiceRef.current.setTakeoverHandler(function () {
74
+ setIsTakenOver(true);
75
+ if (onTakeover) {
76
+ onTakeover();
77
+ }
78
+ });
79
+ chatServiceRef.current.setFinalizedHandler(function () {
80
+ setIsFinalized(true);
81
+ if (onFinalize) {
82
+ onFinalize();
83
+ }
84
+ });
85
+ chatServiceRef.current.setConnectionStateHandler(setConnectionState);
86
+ // Check for a saved conversation and connect to it
87
+ var convId = chatServiceRef.current.getConversationId();
88
+ if (convId) {
89
+ setConversationId(convId);
90
+ if (chatServiceRef.current.isConversationFinalized()) {
91
+ setIsFinalized(true);
92
+ }
93
+ else {
94
+ chatServiceRef.current.connectWebSocket();
95
+ }
96
+ }
97
+ // Cleanup
98
+ return function () {
99
+ if (chatServiceRef.current) {
100
+ chatServiceRef.current.disconnect();
101
+ }
102
+ };
103
+ }, [baseUrl, apiKey, metadata, onError, onTakeover, onFinalize]);
104
+ useEffect(function () {
105
+ try {
106
+ localStorage.setItem('chatMessages', JSON.stringify(messages));
107
+ }
108
+ catch (error) {
109
+ console.error('Error saving messages to localStorage:', error);
110
+ }
111
+ }, [messages]);
112
+ // Reset conversation
113
+ var resetConversation = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
114
+ var convId, queries, error_1;
115
+ return __generator(this, function (_a) {
116
+ switch (_a.label) {
117
+ case 0:
118
+ if (!chatServiceRef.current) {
119
+ return [2 /*return*/];
120
+ }
121
+ setConnectionState('connecting');
122
+ setIsLoading(true);
123
+ setMessages([]);
124
+ setPossibleQueries([]);
125
+ localStorage.removeItem('chatMessages');
126
+ setIsFinalized(false);
127
+ _a.label = 1;
128
+ case 1:
129
+ _a.trys.push([1, 3, 4, 5]);
130
+ // Reset the conversation in the chat service
131
+ chatServiceRef.current.resetConversation();
132
+ return [4 /*yield*/, chatServiceRef.current.startConversation()];
133
+ case 2:
134
+ convId = _a.sent();
135
+ setConversationId(convId);
136
+ setConnectionState('connected');
137
+ // Get possible queries from API response
138
+ if (chatServiceRef.current.getPossibleQueries) {
139
+ queries = chatServiceRef.current.getPossibleQueries();
140
+ if (queries && queries.length > 0) {
141
+ setPossibleQueries(queries);
142
+ }
143
+ }
144
+ return [3 /*break*/, 5];
145
+ case 3:
146
+ error_1 = _a.sent();
147
+ setConnectionState('disconnected');
148
+ if (onError && error_1 instanceof Error) {
149
+ onError(error_1);
150
+ }
151
+ else {
152
+ console.error('Failed to reset conversation:', error_1);
153
+ }
154
+ return [3 /*break*/, 5];
155
+ case 4:
156
+ setIsLoading(false);
157
+ return [7 /*endfinally*/];
158
+ case 5: return [2 /*return*/];
159
+ }
160
+ });
161
+ }); }, [onError]);
162
+ // Send message
163
+ var sendMessage = useCallback(function (text) { return __awaiter(void 0, void 0, void 0, function () {
164
+ var error_2;
165
+ return __generator(this, function (_a) {
166
+ switch (_a.label) {
167
+ case 0:
168
+ if (!chatServiceRef.current) {
169
+ throw new Error('Chat service not initialized');
170
+ }
171
+ _a.label = 1;
172
+ case 1:
173
+ _a.trys.push([1, 3, 4, 5]);
174
+ setIsLoading(true);
175
+ return [4 /*yield*/, chatServiceRef.current.sendMessage(text)];
176
+ case 2:
177
+ _a.sent();
178
+ return [3 /*break*/, 5];
179
+ case 3:
180
+ error_2 = _a.sent();
181
+ if (onError && error_2 instanceof Error) {
182
+ onError(error_2);
183
+ }
184
+ else {
185
+ console.error('Failed to send message:', error_2);
186
+ }
187
+ return [3 /*break*/, 5];
188
+ case 4:
189
+ setIsLoading(false);
190
+ return [7 /*endfinally*/];
191
+ case 5: return [2 /*return*/];
192
+ }
193
+ });
194
+ }); }, [onError]);
195
+ var startConversation = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
196
+ var convId, queries, error_3;
197
+ return __generator(this, function (_a) {
198
+ switch (_a.label) {
199
+ case 0:
200
+ if (!chatServiceRef.current) {
201
+ return [2 /*return*/];
202
+ }
203
+ _a.label = 1;
204
+ case 1:
205
+ _a.trys.push([1, 3, 4, 5]);
206
+ setConnectionState('connecting');
207
+ setIsLoading(true);
208
+ // Reset state for new conversation
209
+ setMessages([]);
210
+ setPossibleQueries([]);
211
+ localStorage.removeItem('chatMessages');
212
+ setIsFinalized(false);
213
+ chatServiceRef.current.resetConversation();
214
+ return [4 /*yield*/, chatServiceRef.current.startConversation()];
215
+ case 2:
216
+ convId = _a.sent();
217
+ setConversationId(convId);
218
+ setConnectionState('connected');
219
+ if (chatServiceRef.current.getPossibleQueries) {
220
+ queries = chatServiceRef.current.getPossibleQueries();
221
+ if (queries && queries.length > 0) {
222
+ setPossibleQueries(queries);
223
+ }
224
+ }
225
+ return [3 /*break*/, 5];
226
+ case 3:
227
+ error_3 = _a.sent();
228
+ setConnectionState('disconnected');
229
+ if (onError && error_3 instanceof Error) {
230
+ onError(error_3);
231
+ }
232
+ else {
233
+ console.error('Failed to start conversation:', error_3);
234
+ }
235
+ return [3 /*break*/, 5];
236
+ case 4:
237
+ setIsLoading(false);
238
+ return [7 /*endfinally*/];
239
+ case 5: return [2 /*return*/];
240
+ }
241
+ });
242
+ }); }, [onError]);
243
+ return {
244
+ messages: messages,
245
+ isLoading: isLoading,
246
+ sendMessage: sendMessage,
247
+ resetConversation: resetConversation,
248
+ startConversation: startConversation,
249
+ connectionState: connectionState,
250
+ conversationId: conversationId,
251
+ possibleQueries: possibleQueries,
252
+ isTakenOver: isTakenOver,
253
+ isFinalized: isFinalized
254
+ };
255
+ };
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBWXRELE1BQU0sQ0FBQyxJQUFNLE9BQU8sR0FBRyxVQUFDLEVBQTRFO1FBQTFFLE9BQU8sYUFBQSxFQUFFLE1BQU0sWUFBQSxFQUFFLFFBQVEsY0FBQSxFQUFFLE9BQU8sYUFBQSxFQUFFLFVBQVUsZ0JBQUEsRUFBRSxVQUFVLGdCQUFBO0lBQzVFLElBQUEsS0FBMEIsUUFBUSxDQUFnQjtRQUN0RCxJQUFJLENBQUM7WUFDSCxJQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVELE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUMsQ0FBQyxFQVJLLFFBQVEsUUFBQSxFQUFFLFdBQVcsUUFRMUIsQ0FBQztJQUNHLElBQUEsS0FBNEIsUUFBUSxDQUFVLEtBQUssQ0FBQyxFQUFuRCxTQUFTLFFBQUEsRUFBRSxZQUFZLFFBQTRCLENBQUM7SUFDckQsSUFBQSxLQUF3QyxRQUFRLENBQThDLGNBQWMsQ0FBQyxFQUE1RyxlQUFlLFFBQUEsRUFBRSxrQkFBa0Is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bGJhY2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2hhdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQ2hhdFByb3BzIHtcbiAgYmFzZVVybDogc3RyaW5nO1xuICBhcGlLZXk6IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgb25UYWtlb3Zlcj86ICgpID0+IHZvaWQ7XG4gIG9uRmluYWxpemU/OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdCA9ICh7IGJhc2VVcmwsIGFwaUtleSwgbWV0YWRhdGEsIG9uRXJyb3IsIG9uVGFrZW92ZXIsIG9uRmluYWxpemUgfTogVXNlQ2hhdFByb3BzKSA9PiB7XG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWRNZXNzYWdlcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjaGF0TWVzc2FnZXMnKTtcbiAgICAgIHJldHVybiBzdG9yZWRNZXNzYWdlcyA/IEpTT04ucGFyc2Uoc3RvcmVkTWVzc2FnZXMpIDogW107XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgbWVzc2FnZXMgZnJvbSBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtjb25uZWN0aW9uU3RhdGUsIHNldENvbm5lY3Rpb25TdGF0ZV0gPSB1c2VTdGF0ZTwnY29ubmVjdGluZycgfCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnPignZGlzY29ubmVjdGVkJyk7XG4gIGNvbnN0IGNoYXRTZXJ2aWNlUmVmID0gdXNlUmVmPENoYXRTZXJ2aWNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtjb252ZXJzYXRpb25JZCwgc2V0Q29udmVyc2F0aW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtwb3NzaWJsZVF1ZXJpZXMsIHNldFBvc3NpYmxlUXVlcmllc10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oW10pO1xuICBjb25zdCBbaXNUYWtlbk92ZXIsIHNldElzVGFrZW5PdmVyXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW2lzRmluYWxpemVkLCBzZXRJc0ZpbmFsaXplZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBjaGF0IHNlcnZpY2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50ID0gbmV3IENoYXRTZXJ2aWNlKGJhc2VVcmwsIGFwaUtleSwgbWV0YWRhdGEpO1xuICAgIFxuICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0TWVzc2FnZUhhbmRsZXIoKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XG4gICAgICBzZXRNZXNzYWdlcyhwcmV2TWVzc2FnZXMgPT4gWy4uLnByZXZNZXNzYWdlcywgbWVzc2FnZV0pO1xuICAgIH0pO1xuXG4gICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRUYWtlb3ZlckhhbmRsZXIoKCkgPT4ge1xuICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICBpZiAob25UYWtlb3Zlcikge1xuICAgICAgICBvblRha2VvdmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICBpZiAob25GaW5hbGl6ZSkge1xuICAgICAgICBvbkZpbmFsaXplKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldENvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoc2V0Q29ubmVjdGlvblN0YXRlKTtcblxuICAgIC8vIENoZWNrIGZvciBhIHNhdmVkIGNvbnZlcnNhdGlvbiBhbmQgY29ubmVjdCB0byBpdFxuICAgIGNvbnN0IGNvbnZJZCA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0Q29udmVyc2F0aW9uSWQoKTtcbiAgICBpZiAoY29udklkKSB7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmlzQ29udmVyc2F0aW9uRmluYWxpemVkKCkpIHtcbiAgICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LmNvbm5lY3RXZWJTb2NrZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFudXBcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5kaXNjb25uZWN0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2Jhc2VVcmwsIGFwaUtleSwgbWV0YWRhdGEsIG9uRXJyb3IsIG9uVGFrZW92ZXIsIG9uRmluYWxpemVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2hhdE1lc3NhZ2VzJywgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2F2aW5nIG1lc3NhZ2VzIHRvIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gICAgfVxuICB9LCBbbWVzc2FnZXNdKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb25cbiAgY29uc3QgcmVzZXRDb252ZXJzYXRpb24gPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGluZycpO1xuICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2hhdE1lc3NhZ2VzJyk7XG4gICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNldCB0aGUgY29udmVyc2F0aW9uIGluIHRoZSBjaGF0IHNlcnZpY2VcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQucmVzZXRDb252ZXJzYXRpb24oKTtcbiAgICAgIFxuICAgICAgLy8gU3RhcnQgYSBuZXcgY29udmVyc2F0aW9uXG4gICAgICBjb25zdCBjb252SWQgPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnN0YXJ0Q29udmVyc2F0aW9uKCk7XG4gICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0ZWQnKTtcblxuICAgICAgLy8gR2V0IHBvc3NpYmxlIHF1ZXJpZXMgZnJvbSBBUEkgcmVzcG9uc2VcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcykge1xuICAgICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICBpZiAob25FcnJvciAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlc2V0IGNvbnZlcnNhdGlvbjonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgfVxuICB9LCBbb25FcnJvcl0pO1xuXG4gIC8vIFNlbmQgbWVzc2FnZVxuICBjb25zdCBzZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKGFzeW5jICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hhdCBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNlbmRNZXNzYWdlKHRleHQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAob25FcnJvciAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHNlbmQgbWVzc2FnZTonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgfVxuICB9LCBbb25FcnJvcl0pO1xuXG4gIGNvbnN0IHN0YXJ0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0aW5nJyk7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICBcbiAgICAgIC8vIFJlc2V0IHN0YXRlIGZvciBuZXcgY29udmVyc2F0aW9uXG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2NoYXRNZXNzYWdlcycpO1xuICAgICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5yZXNldENvbnZlcnNhdGlvbigpO1xuXG4gICAgICBjb25zdCBjb252SWQgPSBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnN0YXJ0Q29udmVyc2F0aW9uKCk7XG4gICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0ZWQnKTtcblxuICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcygpO1xuICAgICAgICBpZiAocXVlcmllcyAmJiBxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgIGlmIChvbkVycm9yICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihlcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY29udmVyc2F0aW9uOicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtvbkVycm9yXSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlcyxcbiAgICBpc0xvYWRpbmcsXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgcmVzZXRDb252ZXJzYXRpb24sXG4gICAgc3RhcnRDb252ZXJzYXRpb24sXG4gICAgY29ubmVjdGlvblN0YXRlLFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIHBvc3NpYmxlUXVlcmllcyxcbiAgICBpc1Rha2VuT3ZlcixcbiAgICBpc0ZpbmFsaXplZFxuICB9O1xufTsgIl19
@@ -0,0 +1,16 @@
1
+ interface UseVoiceInputProps {
2
+ baseUrl: string;
3
+ apiKey: string;
4
+ onTranscription: (text: string) => void;
5
+ onError: (error: Error) => void;
6
+ }
7
+ interface UseVoiceInputReturn {
8
+ isRecording: boolean;
9
+ isLoading: boolean;
10
+ isSessionActive: boolean;
11
+ startSession: () => Promise<void>;
12
+ stopSession: () => void;
13
+ toggleRecording: () => void;
14
+ }
15
+ export declare const useVoiceInput: ({ baseUrl, apiKey, onTranscription, onError, }: UseVoiceInputProps) => UseVoiceInputReturn;
16
+ export {};
@@ -0,0 +1,210 @@
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 { useRef, useState, useEffect, useCallback } from 'react';
38
+ export var useVoiceInput = function (_a) {
39
+ var baseUrl = _a.baseUrl, apiKey = _a.apiKey, onTranscription = _a.onTranscription, onError = _a.onError;
40
+ var _b = useState(false), isRecording = _b[0], setIsRecording = _b[1];
41
+ var _c = useState(false), isLoading = _c[0], setIsLoading = _c[1];
42
+ var _d = useState(false), isSessionActive = _d[0], setIsSessionActive = _d[1];
43
+ var peerConnection = useRef(null);
44
+ var dataChannel = useRef(null);
45
+ var audioElement = useRef(null);
46
+ var cleanup = useCallback(function () {
47
+ if (dataChannel.current) {
48
+ dataChannel.current.close();
49
+ dataChannel.current = null;
50
+ }
51
+ if (peerConnection.current) {
52
+ peerConnection.current.getSenders().forEach(function (sender) {
53
+ if (sender.track) {
54
+ sender.track.stop();
55
+ }
56
+ });
57
+ peerConnection.current.close();
58
+ peerConnection.current = null;
59
+ }
60
+ if (audioElement.current) {
61
+ audioElement.current.srcObject = null;
62
+ audioElement.current = null;
63
+ }
64
+ setIsRecording(false);
65
+ setIsSessionActive(false);
66
+ setIsLoading(false);
67
+ }, []);
68
+ var handleDataChannelMessage = useCallback(function (event) {
69
+ var data = JSON.parse(event.data);
70
+ // Handle conversation item created events which may contain transcripts
71
+ if (data.type === 'conversation.item.created' && data.item) {
72
+ // Check if the item has content with transcript
73
+ if (data.item.content && Array.isArray(data.item.content)) {
74
+ for (var _i = 0, _a = data.item.content; _i < _a.length; _i++) {
75
+ var contentItem = _a[_i];
76
+ if (contentItem.type === 'input_audio' && contentItem.transcript) {
77
+ onTranscription(contentItem.transcript);
78
+ return;
79
+ }
80
+ }
81
+ }
82
+ // Check if the item itself has a transcript field
83
+ if (data.item.transcript) {
84
+ onTranscription(data.item.transcript);
85
+ return;
86
+ }
87
+ }
88
+ // Handle input audio transcription completed events
89
+ if (data.type === 'conversation.item.input_audio_transcription.completed' && data.transcript) {
90
+ onTranscription(data.transcript);
91
+ }
92
+ // Handle response audio transcript events
93
+ if (data.type === 'response.audio_transcript.done' && data.transcript) {
94
+ onTranscription(data.transcript);
95
+ }
96
+ // Check for any other events with transcript field
97
+ if (data.transcript && !data.type.includes('error')) {
98
+ onTranscription(data.transcript);
99
+ }
100
+ }, [onTranscription]);
101
+ var startSession = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
102
+ var tokenResponse, ephemeralKey, pc, mediaStream, dc, offer, response, answer, error_1;
103
+ var _a;
104
+ return __generator(this, function (_b) {
105
+ switch (_b.label) {
106
+ case 0:
107
+ setIsLoading(true);
108
+ _b.label = 1;
109
+ case 1:
110
+ _b.trys.push([1, 10, , 11]);
111
+ return [4 /*yield*/, fetch("".concat(baseUrl, "api/voice/openai/session"), {
112
+ headers: {
113
+ 'x-api-key': apiKey
114
+ }
115
+ })];
116
+ case 2:
117
+ tokenResponse = _b.sent();
118
+ if (!tokenResponse.ok) {
119
+ throw new Error('Failed to get ephemeral API key');
120
+ }
121
+ return [4 /*yield*/, tokenResponse.json()];
122
+ case 3:
123
+ ephemeralKey = _b.sent();
124
+ pc = new RTCPeerConnection();
125
+ // Set up to play remote audio from the model
126
+ audioElement.current = document.createElement("audio");
127
+ audioElement.current.autoplay = true;
128
+ pc.ontrack = function (e) {
129
+ if (audioElement.current) {
130
+ audioElement.current.srcObject = e.streams[0];
131
+ }
132
+ };
133
+ return [4 /*yield*/, navigator.mediaDevices.getUserMedia({
134
+ audio: true,
135
+ })];
136
+ case 4:
137
+ mediaStream = _b.sent();
138
+ pc.addTrack(mediaStream.getTracks()[0]);
139
+ dc = pc.createDataChannel("oai-events");
140
+ dataChannel.current = dc;
141
+ dc.onmessage = handleDataChannelMessage;
142
+ dc.onopen = function () {
143
+ setIsSessionActive(true);
144
+ setIsLoading(false);
145
+ };
146
+ return [4 /*yield*/, pc.createOffer()];
147
+ case 5:
148
+ offer = _b.sent();
149
+ return [4 /*yield*/, pc.setLocalDescription(offer)];
150
+ case 6:
151
+ _b.sent();
152
+ return [4 /*yield*/, fetch('https://api.openai.com/v1/realtime', {
153
+ method: 'POST',
154
+ headers: {
155
+ 'Authorization': "Bearer ".concat(ephemeralKey),
156
+ 'Content-Type': 'application/sdp',
157
+ },
158
+ body: offer.sdp,
159
+ })];
160
+ case 7:
161
+ response = _b.sent();
162
+ _a = {
163
+ type: 'answer'
164
+ };
165
+ return [4 /*yield*/, response.text()];
166
+ case 8:
167
+ answer = (_a.sdp = _b.sent(),
168
+ _a);
169
+ return [4 /*yield*/, pc.setRemoteDescription(new RTCSessionDescription(answer))];
170
+ case 9:
171
+ _b.sent();
172
+ peerConnection.current = pc;
173
+ setIsRecording(true);
174
+ return [3 /*break*/, 11];
175
+ case 10:
176
+ error_1 = _b.sent();
177
+ onError(error_1);
178
+ cleanup();
179
+ return [3 /*break*/, 11];
180
+ case 11: return [2 /*return*/];
181
+ }
182
+ });
183
+ }); }, [baseUrl, apiKey, handleDataChannelMessage, onError, cleanup]);
184
+ var stopSession = useCallback(function () {
185
+ cleanup();
186
+ }, [cleanup]);
187
+ var toggleRecording = useCallback(function () {
188
+ if (isLoading)
189
+ return;
190
+ if (isRecording) {
191
+ stopSession();
192
+ }
193
+ else {
194
+ startSession();
195
+ }
196
+ }, [isLoading, isRecording, startSession, stopSession]);
197
+ // Cleanup on component unmount
198
+ useEffect(function () {
199
+ return cleanup;
200
+ }, [cleanup]);
201
+ return {
202
+ isRecording: isRecording,
203
+ isLoading: isLoading,
204
+ isSessionActive: isSessionActive,
205
+ startSession: startSession,
206
+ stopSession: stopSession,
207
+ toggleRecording: toggleRecording,
208
+ };
209
+ };
210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlVm9pY2VJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VWb2ljZUlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFrQmpFLE1BQU0sQ0FBQyxJQUFNLGFBQWEsR0FBRyxVQUFDLEVBS1Q7UUFKbkIsT0FBTyxhQUFBLEVBQ1AsTUFBTSxZQUFBLEVBQ04sZUFBZSxxQkFBQSxFQUNmLE9BQU8sYUFBQTtJQUVELElBQUEsS0FBZ0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUE5QyxXQUFXLFFBQUEsRUFBRSxjQUFjLFFBQW1CLENBQUM7SUFDaEQsSUFBQSxLQUE0QixRQUFRLENBQUMsS0FBSyxDQUFDLEVBQTFDLFNBQVMsUUFBQSxFQUFFLFlBQVksUUFBbUIsQ0FBQztJQUM1QyxJQUFBLEtBQXdDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBdEQsZUFBZSxRQUFBLEVBQUUsa0JBQWtCLFFBQW1CLENBQUM7SUFFOUQsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUEyQixJQUFJLENBQUMsQ0FBQztJQUM5RCxJQUFNLFdBQVcsR0FBRyxNQUFNLENBQXdCLElBQUksQ0FBQyxDQUFDO0lBQ3hELElBQU0sWUFBWSxHQUFHLE1BQU0sQ0FBMEIsSUFBSSxDQUFDLENBQUM7SUFFM0QsSUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDO1FBQzFCLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsV0FBVyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzNCLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQUMsTUFBTTtnQkFDakQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0IsY0FBYyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QyxZQUFZLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO1FBRUQsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxJQUFNLHdCQUF3QixHQUFHLFdBQVcsQ0FBQyxVQUFDLEtBQW1CO1FBQy9ELElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBDLHdFQUF3RTtRQUN4RSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssMkJBQTJCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNELGdEQUFnRDtZQUNoRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxLQUEwQixVQUFpQixFQUFqQixLQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFqQixjQUFpQixFQUFqQixJQUFpQixFQUFFLENBQUM7b0JBQXpDLElBQU0sV0FBVyxTQUFBO29CQUNwQixJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssYUFBYSxJQUFJLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDakUsZUFBZSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDeEMsT0FBTztvQkFDVCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsa0RBQWtEO1lBQ2xELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDekIsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RDLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUVELG9EQUFvRDtRQUNwRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssdURBQXVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdGLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssZ0NBQWdDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3RFLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELG1EQUFtRDtRQUNuRCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3BELGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFFdEIsSUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDOzs7Ozs7b0JBQy9CLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7OztvQkFHSyxxQkFBTSxLQUFLLENBQUMsVUFBRyxPQUFPLDZCQUEwQixFQUFFOzRCQUN0RSxPQUFPLEVBQUU7Z0NBQ1AsV0FBVyxFQUFFLE1BQU07NkJBQ3BCO3lCQUNGLENBQUMsRUFBQTs7b0JBSkksYUFBYSxHQUFHLFNBSXBCO29CQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUM7d0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztvQkFDckQsQ0FBQztvQkFFb0IscUJBQU0sYUFBYSxDQUFDLElBQUksRUFBRSxFQUFBOztvQkFBekMsWUFBWSxHQUFHLFNBQTBCO29CQUd6QyxFQUFFLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO29CQUVuQyw2Q0FBNkM7b0JBQzdDLFlBQVksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdkQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO29CQUNyQyxFQUFFLENBQUMsT0FBTyxHQUFHLFVBQUMsQ0FBQzt3QkFDYixJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0QkFDekIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDaEQsQ0FBQztvQkFDSCxDQUFDLENBQUM7b0JBR2tCLHFCQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDOzRCQUM1RCxLQUFLLEVBQUUsSUFBSTt5QkFDWixDQUFDLEVBQUE7O29CQUZJLFdBQVcsR0FBRyxTQUVsQjtvQkFDRixFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUdsQyxFQUFFLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUM5QyxXQUFXLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztvQkFFekIsRUFBRSxDQUFDLFNBQVMsR0FBRyx3QkFBd0IsQ0FBQztvQkFFeEMsRUFBRSxDQUFDLE1BQU0sR0FBRzt3QkFDVixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDekIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN0QixDQUFDLENBQUM7b0JBR1kscUJBQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFBOztvQkFBOUIsS0FBSyxHQUFHLFNBQXNCO29CQUNwQyxxQkFBTSxFQUFFLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUE7O29CQUFuQyxTQUFtQyxDQUFDO29CQUVuQixxQkFBTSxLQUFLLENBQUMsb0NBQW9DLEVBQUU7NEJBQ2pFLE1BQU0sRUFBRSxNQUFNOzRCQUNkLE9BQU8sRUFBRTtnQ0FDUCxlQUFlLEVBQUUsaUJBQVUsWUFBWSxDQUFFO2dDQUN6QyxjQUFjLEVBQUUsaUJBQWlCOzZCQUNsQzs0QkFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUc7eUJBQ2hCLENBQUMsRUFBQTs7b0JBUEksUUFBUSxHQUFHLFNBT2Y7O3dCQUdBLElBQUksRUFBRSxRQUFROztvQkFDVCxxQkFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUE7O29CQUZ0QixNQUFNLElBRVYsTUFBRyxHQUFFLFNBQXFCOzJCQUMzQjtvQkFFRCxxQkFBTSxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFBOztvQkFBaEUsU0FBZ0UsQ0FBQztvQkFFakUsY0FBYyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQzVCLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7OztvQkFFckIsT0FBTyxDQUFDLE9BQWMsQ0FBQyxDQUFDO29CQUN4QixPQUFPLEVBQUUsQ0FBQzs7Ozs7U0FFYixFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUVsRSxJQUFNLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDOUIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWQsSUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDO1FBQ2xDLElBQUksU0FBUztZQUFFLE9BQU87UUFFdEIsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixXQUFXLEVBQUUsQ0FBQztRQUNoQixDQUFDO2FBQU0sQ0FBQztZQUNOLFlBQVksRUFBRSxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBRXhELCtCQUErQjtJQUMvQixTQUFTLENBQUM7UUFDUixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWQsT0FBTztRQUNMLFdBQVcsYUFBQTtRQUNYLFNBQVMsV0FBQTtRQUNULGVBQWUsaUJBQUE7UUFDZixZQUFZLGNBQUE7UUFDWixXQUFXLGFBQUE7UUFDWCxlQUFlLGlCQUFBO0tBQ2hCLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuXG5pbnRlcmZhY2UgVXNlVm9pY2VJbnB1dFByb3BzIHtcbiAgYmFzZVVybDogc3RyaW5nO1xuICBhcGlLZXk6IHN0cmluZztcbiAgb25UcmFuc2NyaXB0aW9uOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBvbkVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgVXNlVm9pY2VJbnB1dFJldHVybiB7XG4gIGlzUmVjb3JkaW5nOiBib29sZWFuO1xuICBpc0xvYWRpbmc6IGJvb2xlYW47XG4gIGlzU2Vzc2lvbkFjdGl2ZTogYm9vbGVhbjtcbiAgc3RhcnRTZXNzaW9uOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzdG9wU2Vzc2lvbjogKCkgPT4gdm9pZDtcbiAgdG9nZ2xlUmVjb3JkaW5nOiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgdXNlVm9pY2VJbnB1dCA9ICh7XG4gIGJhc2VVcmwsXG4gIGFwaUtleSxcbiAgb25UcmFuc2NyaXB0aW9uLFxuICBvbkVycm9yLFxufTogVXNlVm9pY2VJbnB1dFByb3BzKTogVXNlVm9pY2VJbnB1dFJldHVybiA9PiB7XG4gIGNvbnN0IFtpc1JlY29yZGluZywgc2V0SXNSZWNvcmRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXNTZXNzaW9uQWN0aXZlLCBzZXRJc1Nlc3Npb25BY3RpdmVdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBcbiAgY29uc3QgcGVlckNvbm5lY3Rpb24gPSB1c2VSZWY8UlRDUGVlckNvbm5lY3Rpb24gfCBudWxsPihudWxsKTtcbiAgY29uc3QgZGF0YUNoYW5uZWwgPSB1c2VSZWY8UlRDRGF0YUNoYW5uZWwgfCBudWxsPihudWxsKTtcbiAgY29uc3QgYXVkaW9FbGVtZW50ID0gdXNlUmVmPEhUTUxBdWRpb0VsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICBjb25zdCBjbGVhbnVwID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChkYXRhQ2hhbm5lbC5jdXJyZW50KSB7XG4gICAgICBkYXRhQ2hhbm5lbC5jdXJyZW50LmNsb3NlKCk7XG4gICAgICBkYXRhQ2hhbm5lbC5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocGVlckNvbm5lY3Rpb24uY3VycmVudCkge1xuICAgICAgcGVlckNvbm5lY3Rpb24uY3VycmVudC5nZXRTZW5kZXJzKCkuZm9yRWFjaCgoc2VuZGVyKSA9PiB7XG4gICAgICAgIGlmIChzZW5kZXIudHJhY2spIHtcbiAgICAgICAgICBzZW5kZXIudHJhY2suc3RvcCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHBlZXJDb25uZWN0aW9uLmN1cnJlbnQuY2xvc2UoKTtcbiAgICAgIHBlZXJDb25uZWN0aW9uLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChhdWRpb0VsZW1lbnQuY3VycmVudCkge1xuICAgICAgYXVkaW9FbGVtZW50LmN1cnJlbnQuc3JjT2JqZWN0ID0gbnVsbDtcbiAgICAgIGF1ZGlvRWxlbWVudC5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG5cbiAgICBzZXRJc1JlY29yZGluZyhmYWxzZSk7XG4gICAgc2V0SXNTZXNzaW9uQWN0aXZlKGZhbHNlKTtcbiAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlRGF0YUNoYW5uZWxNZXNzYWdlID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcbiAgICBcbiAgICAvLyBIYW5kbGUgY29udmVyc2F0aW9uIGl0ZW0gY3JlYXRlZCBldmVudHMgd2hpY2ggbWF5IGNvbnRhaW4gdHJhbnNjcmlwdHNcbiAgICBpZiAoZGF0YS50eXBlID09PSAnY29udmVyc2F0aW9uLml0ZW0uY3JlYXRlZCcgJiYgZGF0YS5pdGVtKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBoYXMgY29udGVudCB3aXRoIHRyYW5zY3JpcHRcbiAgICAgIGlmIChkYXRhLml0ZW0uY29udGVudCAmJiBBcnJheS5pc0FycmF5KGRhdGEuaXRlbS5jb250ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRlbnRJdGVtIG9mIGRhdGEuaXRlbS5jb250ZW50KSB7XG4gICAgICAgICAgaWYgKGNvbnRlbnRJdGVtLnR5cGUgPT09ICdpbnB1dF9hdWRpbycgJiYgY29udGVudEl0ZW0udHJhbnNjcmlwdCkge1xuICAgICAgICAgICAgb25UcmFuc2NyaXB0aW9uKGNvbnRlbnRJdGVtLnRyYW5zY3JpcHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpdHNlbGYgaGFzIGEgdHJhbnNjcmlwdCBmaWVsZFxuICAgICAgaWYgKGRhdGEuaXRlbS50cmFuc2NyaXB0KSB7XG4gICAgICAgIG9uVHJhbnNjcmlwdGlvbihkYXRhLml0ZW0udHJhbnNjcmlwdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIGlucHV0IGF1ZGlvIHRyYW5zY3JpcHRpb24gY29tcGxldGVkIGV2ZW50c1xuICAgIGlmIChkYXRhLnR5cGUgPT09ICdjb252ZXJzYXRpb24uaXRlbS5pbnB1dF9hdWRpb190cmFuc2NyaXB0aW9uLmNvbXBsZXRlZCcgJiYgZGF0YS50cmFuc2NyaXB0KSB7XG4gICAgICBvblRyYW5zY3JpcHRpb24oZGF0YS50cmFuc2NyaXB0KTtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIHJlc3BvbnNlIGF1ZGlvIHRyYW5zY3JpcHQgZXZlbnRzXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ3Jlc3BvbnNlLmF1ZGlvX3RyYW5zY3JpcHQuZG9uZScgJiYgZGF0YS50cmFuc2NyaXB0KSB7XG4gICAgICBvblRyYW5zY3JpcHRpb24oZGF0YS50cmFuc2NyaXB0KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIGFueSBvdGhlciBldmVudHMgd2l0aCB0cmFuc2NyaXB0IGZpZWxkXG4gICAgaWYgKGRhdGEudHJhbnNjcmlwdCAmJiAhZGF0YS50eXBlLmluY2x1ZGVzKCdlcnJvcicpKSB7XG4gICAgICBvblRyYW5zY3JpcHRpb24oZGF0YS50cmFuc2NyaXB0KTtcbiAgICB9XG4gIH0sIFtvblRyYW5zY3JpcHRpb25dKTtcblxuICBjb25zdCBzdGFydFNlc3Npb24gPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgZXBoZW1lcmFsIEFQSSBrZXkgZnJvbSBiYWNrZW5kXG4gICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH1hcGkvdm9pY2Uvb3BlbmFpL3Nlc3Npb25gLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAneC1hcGkta2V5JzogYXBpS2V5XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoIXRva2VuUmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IGVwaGVtZXJhbCBBUEkga2V5Jyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IGVwaGVtZXJhbEtleSA9IGF3YWl0IHRva2VuUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBwZWVyIGNvbm5lY3Rpb25cbiAgICAgIGNvbnN0IHBjID0gbmV3IFJUQ1BlZXJDb25uZWN0aW9uKCk7XG5cbiAgICAgIC8vIFNldCB1cCB0byBwbGF5IHJlbW90ZSBhdWRpbyBmcm9tIHRoZSBtb2RlbFxuICAgICAgYXVkaW9FbGVtZW50LmN1cnJlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYXVkaW9cIik7XG4gICAgICBhdWRpb0VsZW1lbnQuY3VycmVudC5hdXRvcGxheSA9IHRydWU7XG4gICAgICBwYy5vbnRyYWNrID0gKGUpID0+IHtcbiAgICAgICAgaWYgKGF1ZGlvRWxlbWVudC5jdXJyZW50KSB7XG4gICAgICAgICAgYXVkaW9FbGVtZW50LmN1cnJlbnQuc3JjT2JqZWN0ID0gZS5zdHJlYW1zWzBdO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgbG9jYWwgYXVkaW8gdHJhY2sgZm9yIG1pY3JvcGhvbmUgaW5wdXRcbiAgICAgIGNvbnN0IG1lZGlhU3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuICAgICAgICBhdWRpbzogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcGMuYWRkVHJhY2sobWVkaWFTdHJlYW0uZ2V0VHJhY2tzKClbMF0pO1xuXG4gICAgICAvLyBTZXQgdXAgZGF0YSBjaGFubmVsIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgZXZlbnRzXG4gICAgICBjb25zdCBkYyA9IHBjLmNyZWF0ZURhdGFDaGFubmVsKFwib2FpLWV2ZW50c1wiKTtcbiAgICAgIGRhdGFDaGFubmVsLmN1cnJlbnQgPSBkYztcblxuICAgICAgZGMub25tZXNzYWdlID0gaGFuZGxlRGF0YUNoYW5uZWxNZXNzYWdlO1xuICAgICAgXG4gICAgICBkYy5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIHNldElzU2Vzc2lvbkFjdGl2ZSh0cnVlKTtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0YXJ0IHRoZSBzZXNzaW9uIHVzaW5nIFNEUFxuICAgICAgY29uc3Qgb2ZmZXIgPSBhd2FpdCBwYy5jcmVhdGVPZmZlcigpO1xuICAgICAgYXdhaXQgcGMuc2V0TG9jYWxEZXNjcmlwdGlvbihvZmZlcik7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEvcmVhbHRpbWUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7ZXBoZW1lcmFsS2V5fWAsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9zZHAnLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBvZmZlci5zZHAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYW5zd2VyOiBSVENTZXNzaW9uRGVzY3JpcHRpb25Jbml0ID0ge1xuICAgICAgICB0eXBlOiAnYW5zd2VyJyxcbiAgICAgICAgc2RwOiBhd2FpdCByZXNwb25zZS50ZXh0KCksXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBwYy5zZXRSZW1vdGVEZXNjcmlwdGlvbihuZXcgUlRDU2Vzc2lvbkRlc2NyaXB0aW9uKGFuc3dlcikpO1xuXG4gICAgICBwZWVyQ29ubmVjdGlvbi5jdXJyZW50ID0gcGM7XG4gICAgICBzZXRJc1JlY29yZGluZyh0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgb25FcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfVxuICB9LCBbYmFzZVVybCwgYXBpS2V5LCBoYW5kbGVEYXRhQ2hhbm5lbE1lc3NhZ2UsIG9uRXJyb3IsIGNsZWFudXBdKTtcblxuICBjb25zdCBzdG9wU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjbGVhbnVwKCk7XG4gIH0sIFtjbGVhbnVwXSk7XG5cbiAgY29uc3QgdG9nZ2xlUmVjb3JkaW5nID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChpc0xvYWRpbmcpIHJldHVybjtcbiAgICBcbiAgICBpZiAoaXNSZWNvcmRpbmcpIHtcbiAgICAgIHN0b3BTZXNzaW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0U2Vzc2lvbigpO1xuICAgIH1cbiAgfSwgW2lzTG9hZGluZywgaXNSZWNvcmRpbmcsIHN0YXJ0U2Vzc2lvbiwgc3RvcFNlc3Npb25dKTtcblxuICAvLyBDbGVhbnVwIG9uIGNvbXBvbmVudCB1bm1vdW50XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuIGNsZWFudXA7XG4gIH0sIFtjbGVhbnVwXSk7XG5cbiAgcmV0dXJuIHtcbiAgICBpc1JlY29yZGluZyxcbiAgICBpc0xvYWRpbmcsXG4gICAgaXNTZXNzaW9uQWN0aXZlLFxuICAgIHN0YXJ0U2Vzc2lvbixcbiAgICBzdG9wU2Vzc2lvbixcbiAgICB0b2dnbGVSZWNvcmRpbmcsXG4gIH07XG59OyAiXX0=
@@ -0,0 +1,2 @@
1
+ export { GenAgentChat } from './components/GenAgentChat';
2
+ export type { GenAgentChatProps, ChatMessage } from './types';
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { GenAgentChat } from './components/GenAgentChat';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgR2VuQWdlbnRDaGF0IH0gZnJvbSAnLi9jb21wb25lbnRzL0dlbkFnZW50Q2hhdCc7XG5leHBvcnQgdHlwZSB7IEdlbkFnZW50Q2hhdFByb3BzLCBDaGF0TWVzc2FnZSB9IGZyb20gJy4vdHlwZXMnOyAiXX0=
@@ -0,0 +1,17 @@
1
+ interface AudioServiceConfig {
2
+ baseUrl: string;
3
+ apiKey: string;
4
+ }
5
+ export declare class AudioService {
6
+ private baseUrl;
7
+ private apiKey;
8
+ private ws;
9
+ private audioChunks;
10
+ private resolvePromise;
11
+ private rejectPromise;
12
+ constructor(config: AudioServiceConfig);
13
+ textToSpeech(text: string, voice?: string): Promise<Blob>;
14
+ private cleanup;
15
+ playAudio(audioBlob: Blob): Promise<void>;
16
+ }
17
+ export {};