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.
- package/README.md +113 -0
- package/assets/chat-logo.png +0 -0
- package/dist/components/ChatMessage.d.ts +20 -0
- package/dist/components/ChatMessage.js +188 -0
- package/dist/components/GenAgentChat.d.ts +3 -0
- package/dist/components/GenAgentChat.js +520 -0
- package/dist/components/VoiceInput.d.ts +14 -0
- package/dist/components/VoiceInput.js +51 -0
- package/dist/hooks/useChat.d.ts +21 -0
- package/dist/hooks/useChat.js +256 -0
- package/dist/hooks/useVoiceInput.d.ts +16 -0
- package/dist/hooks/useVoiceInput.js +210 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/services/audioService.d.ts +17 -0
- package/dist/services/audioService.js +118 -0
- package/dist/services/chatService.d.ts +48 -0
- package/dist/services/chatService.js +376 -0
- package/dist/types/index.d.ts +42 -0
- package/dist/types/index.js +2 -0
- package/package.json +48 -0
|
@@ -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=
|
package/dist/index.d.ts
ADDED
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 {};
|