guideai-app 0.1.8 → 0.2.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/dist/GuideAI.js +1 -1
- package/dist/GuideAI.js.map +1 -1
- package/dist/components/Styles.d.ts +3 -0
- package/dist/components/Styles.js +6 -0
- package/dist/components/Styles.js.map +1 -0
- package/dist/hooks/useConversation.d.ts +11 -0
- package/dist/hooks/useConversation.js +286 -0
- package/dist/hooks/useConversation.js.map +1 -0
- package/dist/hooks/useRecording.d.ts +12 -0
- package/dist/hooks/useRecording.js +362 -0
- package/dist/hooks/useRecording.js.map +1 -0
- package/dist/index.esm.js +1 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +1 -19
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/api-services.d.ts +5 -0
- package/dist/utils/api-services.js +203 -0
- package/dist/utils/api-services.js.map +1 -0
- package/dist/utils/dom-interaction.d.ts +2 -0
- package/dist/utils/dom-interaction.js +195 -0
- package/dist/utils/dom-interaction.js.map +1 -0
- package/dist/utils/react-hooks.d.ts +9 -0
- package/dist/utils/react-hooks.js +19 -0
- package/dist/utils/react-hooks.js.map +1 -0
- package/dist/utils/storage.d.ts +9 -0
- package/dist/utils/storage.js +27 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/webrtc.d.ts +3 -0
- package/dist/utils/webrtc.js +135 -0
- package/dist/utils/webrtc.js.map +1 -0
- package/obfuscate.js +40 -0
- package/package.json +1 -1
- package/rollup.config.js +34 -0
- package/structure.md +128 -0
- package/todo.md +2 -0
|
@@ -0,0 +1,203 @@
|
|
|
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
|
+
export var DEFAULT_PROMPT = "you are Guide AI.\n Your role is to answer any question directly and succinctly that a user has. NEVER DIRECTLY MENTION THE SCREENSHOT, but use its information as much as possible to target your responses.\n If nothing is asked, then your goal is to generally assist them.\n IMPORTANT: NEVER answer in more than 10 words. Always be concise and limit answers to 1 sentence maximum. Be simple and as short as possible.\n Your job is to help them get it done through asking more and more targeted specific questions.";
|
|
38
|
+
export var geminiFlash = function (prompt) { return __awaiter(void 0, void 0, void 0, function () {
|
|
39
|
+
var response, responseJson, content, responseText;
|
|
40
|
+
return __generator(this, function (_a) {
|
|
41
|
+
switch (_a.label) {
|
|
42
|
+
case 0: return [4 /*yield*/, fetch("https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=AIzaSyBiFyzjYVupLyk8BdmfWzBL1GbzX8OUdPc", {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: {
|
|
45
|
+
'Content-Type': 'application/json'
|
|
46
|
+
},
|
|
47
|
+
body: JSON.stringify({
|
|
48
|
+
contents: [
|
|
49
|
+
{
|
|
50
|
+
parts: [
|
|
51
|
+
{
|
|
52
|
+
text: prompt
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
})
|
|
58
|
+
})];
|
|
59
|
+
case 1:
|
|
60
|
+
response = _a.sent();
|
|
61
|
+
return [4 /*yield*/, response.json()];
|
|
62
|
+
case 2:
|
|
63
|
+
responseJson = _a.sent();
|
|
64
|
+
content = responseJson.candidates[0].content;
|
|
65
|
+
responseText = content.parts[0].text;
|
|
66
|
+
return [2 /*return*/, responseText];
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}); };
|
|
70
|
+
export var createNewConversation = function (organizationKey) { return __awaiter(void 0, void 0, void 0, function () {
|
|
71
|
+
var now, response, conversation, error_1;
|
|
72
|
+
return __generator(this, function (_a) {
|
|
73
|
+
switch (_a.label) {
|
|
74
|
+
case 0:
|
|
75
|
+
_a.trys.push([0, 3, , 4]);
|
|
76
|
+
now = new Date();
|
|
77
|
+
return [4 /*yield*/, fetch('https://www.getguide.ai/api/conversations', {
|
|
78
|
+
method: 'POST',
|
|
79
|
+
headers: {
|
|
80
|
+
'Content-Type': 'application/json',
|
|
81
|
+
},
|
|
82
|
+
body: JSON.stringify({
|
|
83
|
+
id: crypto.randomUUID(),
|
|
84
|
+
userId: 'anonymous',
|
|
85
|
+
date: now.toISOString().split('T')[0],
|
|
86
|
+
time: now.toTimeString().split(' ')[0],
|
|
87
|
+
messages: [],
|
|
88
|
+
organization: organizationKey
|
|
89
|
+
})
|
|
90
|
+
})];
|
|
91
|
+
case 1:
|
|
92
|
+
response = _a.sent();
|
|
93
|
+
return [4 /*yield*/, response.json()];
|
|
94
|
+
case 2:
|
|
95
|
+
conversation = _a.sent();
|
|
96
|
+
console.log('Conversation created:', conversation);
|
|
97
|
+
return [2 /*return*/, conversation.id];
|
|
98
|
+
case 3:
|
|
99
|
+
error_1 = _a.sent();
|
|
100
|
+
console.error('Error creating conversation:', error_1);
|
|
101
|
+
return [2 /*return*/, null];
|
|
102
|
+
case 4: return [2 /*return*/];
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}); };
|
|
106
|
+
export var logMessage = function (conversationId, content, sender) { return __awaiter(void 0, void 0, void 0, function () {
|
|
107
|
+
var response, error_2;
|
|
108
|
+
return __generator(this, function (_a) {
|
|
109
|
+
switch (_a.label) {
|
|
110
|
+
case 0:
|
|
111
|
+
if (!conversationId)
|
|
112
|
+
return [2 /*return*/];
|
|
113
|
+
_a.label = 1;
|
|
114
|
+
case 1:
|
|
115
|
+
_a.trys.push([1, 3, , 4]);
|
|
116
|
+
return [4 /*yield*/, fetch("https://www.getguide.ai/api/conversations/".concat(conversationId, "/messages"), {
|
|
117
|
+
method: 'POST',
|
|
118
|
+
headers: {
|
|
119
|
+
'Content-Type': 'application/json'
|
|
120
|
+
},
|
|
121
|
+
body: JSON.stringify({ content: content, sender: sender })
|
|
122
|
+
})];
|
|
123
|
+
case 2:
|
|
124
|
+
response = _a.sent();
|
|
125
|
+
if (!response.ok) {
|
|
126
|
+
throw new Error("Failed to log message: ".concat(response.status, " ").concat(response.statusText));
|
|
127
|
+
}
|
|
128
|
+
return [3 /*break*/, 4];
|
|
129
|
+
case 3:
|
|
130
|
+
error_2 = _a.sent();
|
|
131
|
+
console.error('Error logging message:', error_2);
|
|
132
|
+
return [3 /*break*/, 4];
|
|
133
|
+
case 4: return [2 /*return*/];
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}); };
|
|
137
|
+
export var fetchEphemeralToken = function (organizationKey) { return __awaiter(void 0, void 0, void 0, function () {
|
|
138
|
+
var promptToUse, promptResponse, promptData, promptError_1, tokenEndpoint, response, errorText, data, error_3;
|
|
139
|
+
return __generator(this, function (_a) {
|
|
140
|
+
switch (_a.label) {
|
|
141
|
+
case 0:
|
|
142
|
+
_a.trys.push([0, 12, , 13]);
|
|
143
|
+
promptToUse = DEFAULT_PROMPT;
|
|
144
|
+
if (!organizationKey) return [3 /*break*/, 7];
|
|
145
|
+
_a.label = 1;
|
|
146
|
+
case 1:
|
|
147
|
+
_a.trys.push([1, 6, , 7]);
|
|
148
|
+
return [4 /*yield*/, fetch("https://www.getguide.ai/api/prompts/".concat(organizationKey))];
|
|
149
|
+
case 2:
|
|
150
|
+
promptResponse = _a.sent();
|
|
151
|
+
if (!promptResponse.ok) return [3 /*break*/, 4];
|
|
152
|
+
return [4 /*yield*/, promptResponse.json()];
|
|
153
|
+
case 3:
|
|
154
|
+
promptData = _a.sent();
|
|
155
|
+
promptToUse = promptData.prompt || DEFAULT_PROMPT;
|
|
156
|
+
return [3 /*break*/, 5];
|
|
157
|
+
case 4:
|
|
158
|
+
if (promptResponse.status !== 404) {
|
|
159
|
+
console.error("Failed to fetch prompt: ".concat(promptResponse.statusText));
|
|
160
|
+
}
|
|
161
|
+
_a.label = 5;
|
|
162
|
+
case 5: return [3 /*break*/, 7];
|
|
163
|
+
case 6:
|
|
164
|
+
promptError_1 = _a.sent();
|
|
165
|
+
console.error('Error fetching prompt:', promptError_1);
|
|
166
|
+
return [3 /*break*/, 7];
|
|
167
|
+
case 7:
|
|
168
|
+
tokenEndpoint = 'https://www.getguide.ai/api/realtime';
|
|
169
|
+
return [4 /*yield*/, fetch(tokenEndpoint, {
|
|
170
|
+
method: 'POST',
|
|
171
|
+
headers: {
|
|
172
|
+
'Content-Type': 'application/json',
|
|
173
|
+
},
|
|
174
|
+
body: JSON.stringify({
|
|
175
|
+
prompt: promptToUse,
|
|
176
|
+
})
|
|
177
|
+
})];
|
|
178
|
+
case 8:
|
|
179
|
+
response = _a.sent();
|
|
180
|
+
if (!!response.ok) return [3 /*break*/, 10];
|
|
181
|
+
return [4 /*yield*/, response.text().catch(function () { return 'No error details available'; })];
|
|
182
|
+
case 9:
|
|
183
|
+
errorText = _a.sent();
|
|
184
|
+
console.error("Token fetch failed with status ".concat(response.status, ":"), errorText);
|
|
185
|
+
throw new Error("Failed to fetch token: ".concat(response.status, " - ").concat(errorText));
|
|
186
|
+
case 10: return [4 /*yield*/, response.json()];
|
|
187
|
+
case 11:
|
|
188
|
+
data = _a.sent();
|
|
189
|
+
// Check token structure
|
|
190
|
+
if (!data.client_secret || !data.client_secret.value) {
|
|
191
|
+
console.error('Invalid token structure received:', JSON.stringify(data));
|
|
192
|
+
throw new Error('Invalid token structure received from server');
|
|
193
|
+
}
|
|
194
|
+
return [2 /*return*/, data.client_secret.value];
|
|
195
|
+
case 12:
|
|
196
|
+
error_3 = _a.sent();
|
|
197
|
+
console.error('Error fetching ephemeral token:', error_3);
|
|
198
|
+
return [2 /*return*/, null];
|
|
199
|
+
case 13: return [2 /*return*/];
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}); };
|
|
203
|
+
//# sourceMappingURL=api-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-services.js","sourceRoot":"","sources":["../../src/utils/api-services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
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
|
+
export var clickElement = function (element, rect) { return __awaiter(void 0, void 0, void 0, function () {
|
|
38
|
+
return __generator(this, function (_a) {
|
|
39
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
40
|
+
setTimeout(function () {
|
|
41
|
+
var clickEffectContainer = document.createElement('div');
|
|
42
|
+
clickEffectContainer.style.cssText = "\n position: fixed;\n left: ".concat(rect.left + rect.width / 2, "px;\n top: ").concat(rect.top + rect.height / 2, "px;\n width: 60px;\n height: 60px;\n z-index: 1000;\n pointer-events: none;\n transform: translate(-50%, -50%);\n ");
|
|
43
|
+
document.body.appendChild(clickEffectContainer);
|
|
44
|
+
for (var j = 0; j < 3; j++) {
|
|
45
|
+
var clickRipple = document.createElement('div');
|
|
46
|
+
clickRipple.style.cssText = "\n position: absolute;\n left: 50%;\n top: 50%;\n width: 40px;\n height: 40px;\n border: 2px solid rgba(0, 102, 255, ".concat(0.7 - (j * 0.2), ");\n border-radius: 50%;\n transform: translate(-50%, -50%) scale(0);\n opacity: 1;\n animation: click-ripple-animation 0.8s ease-out ").concat(j * 0.15, "s forwards;\n box-shadow: 0 0 8px rgba(0, 102, 255, 0.4);\n ");
|
|
47
|
+
clickEffectContainer.appendChild(clickRipple);
|
|
48
|
+
}
|
|
49
|
+
var clickDot = document.createElement('div');
|
|
50
|
+
clickDot.style.cssText = "\n position: absolute;\n left: 50%;\n top: 50%;\n width: 12px;\n height: 12px;\n background: rgba(0, 102, 255, 0.9);\n border-radius: 50%;\n transform: translate(-50%, -50%) scale(0);\n animation: click-dot-animation 0.4s ease-out forwards;\n box-shadow: 0 0 5px rgba(0, 102, 255, 0.8);\n ";
|
|
51
|
+
clickEffectContainer.appendChild(clickDot);
|
|
52
|
+
var clickEvent = new MouseEvent('click', {
|
|
53
|
+
view: window,
|
|
54
|
+
bubbles: true,
|
|
55
|
+
cancelable: true,
|
|
56
|
+
});
|
|
57
|
+
// Check for clickable subelements (links, buttons, inputs)
|
|
58
|
+
var clickableElements = element.querySelectorAll('a, button, input[type="button"], input[type="submit"]');
|
|
59
|
+
var clickableElement = clickableElements.length > 0 ? clickableElements[0] : element;
|
|
60
|
+
console.log('Clicking element:', clickableElement);
|
|
61
|
+
clickableElement.dispatchEvent(clickEvent);
|
|
62
|
+
var originalBoxShadow = clickableElement.style.boxShadow;
|
|
63
|
+
var originalTransition = clickableElement.style.transition;
|
|
64
|
+
var originalZIndex = clickableElement.style.zIndex;
|
|
65
|
+
clickableElement.style.transition = 'all 0.3s ease-out';
|
|
66
|
+
clickableElement.style.boxShadow = '0 0 0 2px rgba(0, 102, 255, 0.5), 0 0 10px rgba(0, 102, 255, 0.3)';
|
|
67
|
+
clickableElement.style.zIndex = '999';
|
|
68
|
+
setTimeout(function () {
|
|
69
|
+
clickableElement.style.boxShadow = originalBoxShadow;
|
|
70
|
+
clickableElement.style.transition = originalTransition;
|
|
71
|
+
clickableElement.style.zIndex = originalZIndex;
|
|
72
|
+
clickEffectContainer.remove();
|
|
73
|
+
resolve();
|
|
74
|
+
}, 1000);
|
|
75
|
+
}, 1500);
|
|
76
|
+
})];
|
|
77
|
+
});
|
|
78
|
+
}); };
|
|
79
|
+
export var highlightElement = function (selector, logMessageFn) { return __awaiter(void 0, void 0, void 0, function () {
|
|
80
|
+
var isHighlighting, selectors, cursorElement, _loop_1, i, state_1, error_1;
|
|
81
|
+
return __generator(this, function (_a) {
|
|
82
|
+
switch (_a.label) {
|
|
83
|
+
case 0:
|
|
84
|
+
isHighlighting = false;
|
|
85
|
+
if (isHighlighting)
|
|
86
|
+
return [2 /*return*/, false];
|
|
87
|
+
selectors = Array.isArray(selector) ? selector : [selector];
|
|
88
|
+
if (selectors.length === 0)
|
|
89
|
+
return [2 /*return*/, false];
|
|
90
|
+
console.log('Moving cursor to elements:', selectors);
|
|
91
|
+
cursorElement = null;
|
|
92
|
+
_a.label = 1;
|
|
93
|
+
case 1:
|
|
94
|
+
_a.trys.push([1, 6, , 7]);
|
|
95
|
+
isHighlighting = true;
|
|
96
|
+
_loop_1 = function (i) {
|
|
97
|
+
var currentSelector, element, node, rect, blueCursorSvg, viewportWidth, viewportHeight;
|
|
98
|
+
return __generator(this, function (_b) {
|
|
99
|
+
switch (_b.label) {
|
|
100
|
+
case 0:
|
|
101
|
+
currentSelector = selectors[i];
|
|
102
|
+
if (!(i > 0)) return [3 /*break*/, 2];
|
|
103
|
+
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1000); })];
|
|
104
|
+
case 1:
|
|
105
|
+
_b.sent();
|
|
106
|
+
_b.label = 2;
|
|
107
|
+
case 2:
|
|
108
|
+
element = void 0;
|
|
109
|
+
if (currentSelector.startsWith('//')) {
|
|
110
|
+
node = document.evaluate(currentSelector, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
|
|
111
|
+
if (!(node instanceof Element)) {
|
|
112
|
+
console.log('XPath returned a non-Element node:', currentSelector);
|
|
113
|
+
console.log(node);
|
|
114
|
+
if (logMessageFn) {
|
|
115
|
+
logMessageFn('XPath returned a non-Element node: ' + currentSelector, 'GUIDEAI');
|
|
116
|
+
}
|
|
117
|
+
return [2 /*return*/, "break"];
|
|
118
|
+
}
|
|
119
|
+
element = node;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
element = document.querySelector(currentSelector);
|
|
123
|
+
}
|
|
124
|
+
if (!element) {
|
|
125
|
+
console.log('Element not found:', currentSelector);
|
|
126
|
+
if (logMessageFn) {
|
|
127
|
+
logMessageFn('Element not found: ' + currentSelector, 'GUIDEAI');
|
|
128
|
+
}
|
|
129
|
+
return [2 /*return*/, "break"];
|
|
130
|
+
}
|
|
131
|
+
rect = element.getBoundingClientRect();
|
|
132
|
+
// Create cursor if it's the first element, or reuse existing cursor
|
|
133
|
+
if (!cursorElement) {
|
|
134
|
+
cursorElement = document.createElement('div');
|
|
135
|
+
cursorElement.id = 'guide-ai-cursor';
|
|
136
|
+
blueCursorSvg = "\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#0066ff\" d=\"M7,2l12,11.2l-5.8,0.5l3.3,7.3l-2.2,1l-3.2-7.4L7,18.5V2\" />\n </svg>\n ";
|
|
137
|
+
cursorElement.innerHTML = blueCursorSvg;
|
|
138
|
+
cursorElement.style.cssText = "\n position: fixed;\n width: 64px;\n height: 64px;\n pointer-events: none;\n z-index: 9999;\n transition: all 0.8s ease-in-out;\n transform: translate(-50%, 0);\n filter: drop-shadow(0 0 4px rgba(0, 102, 255, 0.8));\n ";
|
|
139
|
+
document.body.appendChild(cursorElement);
|
|
140
|
+
viewportWidth = window.innerWidth;
|
|
141
|
+
viewportHeight = window.innerHeight;
|
|
142
|
+
cursorElement.style.left = "".concat(viewportWidth / 2, "px");
|
|
143
|
+
cursorElement.style.top = "".concat(viewportHeight / 2, "px");
|
|
144
|
+
}
|
|
145
|
+
// Force reflow to ensure transition works
|
|
146
|
+
cursorElement.offsetHeight;
|
|
147
|
+
return [4 /*yield*/, new Promise(function (resolve) {
|
|
148
|
+
setTimeout(function () {
|
|
149
|
+
cursorElement.style.left = "".concat(rect.left + rect.width / 2, "px");
|
|
150
|
+
cursorElement.style.top = "".concat(rect.top + rect.height / 2 - 10, "px");
|
|
151
|
+
setTimeout(function () {
|
|
152
|
+
cursorElement.style.animation = 'cursor-jiggle 0.5s ease-in-out infinite';
|
|
153
|
+
resolve();
|
|
154
|
+
}, 800);
|
|
155
|
+
}, 100);
|
|
156
|
+
})];
|
|
157
|
+
case 3:
|
|
158
|
+
_b.sent();
|
|
159
|
+
return [4 /*yield*/, clickElement(element, rect)];
|
|
160
|
+
case 4:
|
|
161
|
+
_b.sent();
|
|
162
|
+
return [2 /*return*/];
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
};
|
|
166
|
+
i = 0;
|
|
167
|
+
_a.label = 2;
|
|
168
|
+
case 2:
|
|
169
|
+
if (!(i < selectors.length)) return [3 /*break*/, 5];
|
|
170
|
+
return [5 /*yield**/, _loop_1(i)];
|
|
171
|
+
case 3:
|
|
172
|
+
state_1 = _a.sent();
|
|
173
|
+
if (state_1 === "break")
|
|
174
|
+
return [3 /*break*/, 5];
|
|
175
|
+
_a.label = 4;
|
|
176
|
+
case 4:
|
|
177
|
+
i++;
|
|
178
|
+
return [3 /*break*/, 2];
|
|
179
|
+
case 5:
|
|
180
|
+
setTimeout(function () {
|
|
181
|
+
cursorElement === null || cursorElement === void 0 ? void 0 : cursorElement.remove();
|
|
182
|
+
isHighlighting = false;
|
|
183
|
+
}, 1000);
|
|
184
|
+
return [2 /*return*/, true];
|
|
185
|
+
case 6:
|
|
186
|
+
error_1 = _a.sent();
|
|
187
|
+
console.error('Error moving cursor:', error_1);
|
|
188
|
+
cursorElement === null || cursorElement === void 0 ? void 0 : cursorElement.remove();
|
|
189
|
+
isHighlighting = false;
|
|
190
|
+
return [2 /*return*/, false];
|
|
191
|
+
case 7: return [2 /*return*/];
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}); };
|
|
195
|
+
//# sourceMappingURL=dom-interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-interaction.js","sourceRoot":"","sources":["../../src/utils/dom-interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type UseStateHook = typeof React.useState;
|
|
3
|
+
export type UseEffectHook = typeof React.useEffect;
|
|
4
|
+
export type UseRefHook = typeof React.useRef;
|
|
5
|
+
export declare const getReactHooks: () => {
|
|
6
|
+
useState: UseStateHook;
|
|
7
|
+
useEffect: UseEffectHook;
|
|
8
|
+
useRef: UseRefHook;
|
|
9
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
// Get React hooks safely, avoiding duplicate React issues
|
|
3
|
+
export var getReactHooks = function () {
|
|
4
|
+
// Try to use the React instance from window if available (for react-scripts)
|
|
5
|
+
if (typeof window !== 'undefined' && window.React) {
|
|
6
|
+
return {
|
|
7
|
+
useState: window.React.useState,
|
|
8
|
+
useEffect: window.React.useEffect,
|
|
9
|
+
useRef: window.React.useRef
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
// Otherwise use the imported React
|
|
13
|
+
return {
|
|
14
|
+
useState: React.useState,
|
|
15
|
+
useEffect: React.useEffect,
|
|
16
|
+
useRef: React.useRef
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=react-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-hooks.js","sourceRoot":"","sources":["../../src/utils/react-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,0DAA0D;AAC1D,MAAM,CAAC,IAAM,aAAa,GAAG;IAC3B,6EAA6E;IAC7E,IAAI,OAAO,MAAM,KAAK,WAAW,IAAK,MAAc,CAAC,KAAK,EAAE,CAAC;QAC3D,OAAO;YACL,QAAQ,EAAG,MAAc,CAAC,KAAK,CAAC,QAAwB;YACxD,SAAS,EAAG,MAAc,CAAC,KAAK,CAAC,SAA0B;YAC3D,MAAM,EAAG,MAAc,CAAC,KAAK,CAAC,MAAoB;SACnD,CAAC;IACJ,CAAC;IACD,mCAAmC;IACnC,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const STORAGE_PREFIX = "guideAI_";
|
|
2
|
+
export declare const STORAGE_KEYS: {
|
|
3
|
+
CONVERSATION_ITEMS: string;
|
|
4
|
+
CONVERSATION_ID: string;
|
|
5
|
+
HAS_INTERACTED: string;
|
|
6
|
+
LAST_ACTIVITY: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const saveToStorage: (key: string, value: any) => void;
|
|
9
|
+
export declare const getFromStorage: <T>(key: string, defaultValue: T) => T;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Storage keys and helpers
|
|
2
|
+
export var STORAGE_PREFIX = 'guideAI_';
|
|
3
|
+
export var STORAGE_KEYS = {
|
|
4
|
+
CONVERSATION_ITEMS: "".concat(STORAGE_PREFIX, "conversationItems"),
|
|
5
|
+
CONVERSATION_ID: "".concat(STORAGE_PREFIX, "conversationId"),
|
|
6
|
+
HAS_INTERACTED: "".concat(STORAGE_PREFIX, "hasInteracted"),
|
|
7
|
+
LAST_ACTIVITY: "".concat(STORAGE_PREFIX, "lastActivity"),
|
|
8
|
+
};
|
|
9
|
+
export var saveToStorage = function (key, value) {
|
|
10
|
+
try {
|
|
11
|
+
localStorage.setItem(key, JSON.stringify(value));
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
console.error("Failed to save ".concat(key, " to localStorage:"), e);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
export var getFromStorage = function (key, defaultValue) {
|
|
18
|
+
try {
|
|
19
|
+
var item = localStorage.getItem(key);
|
|
20
|
+
return item ? JSON.parse(item) : defaultValue;
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
console.error("Failed to get ".concat(key, " from localStorage:"), e);
|
|
24
|
+
return defaultValue;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,IAAM,cAAc,GAAG,UAAU,CAAC;AACzC,MAAM,CAAC,IAAM,YAAY,GAAG;IAC1B,kBAAkB,EAAE,UAAG,cAAc,sBAAmB;IACxD,eAAe,EAAE,UAAG,cAAc,mBAAgB;IAClD,cAAc,EAAE,UAAG,cAAc,kBAAe;IAChD,aAAa,EAAE,UAAG,cAAc,iBAAc;CAC/C,CAAC;AAEF,MAAM,CAAC,IAAM,aAAa,GAAG,UAAC,GAAW,EAAE,KAAU;IACnD,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,yBAAkB,GAAG,sBAAmB,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,cAAc,GAAG,UAAK,GAAW,EAAE,YAAe;IAC7D,IAAI,CAAC;QACH,IAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAChD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wBAAiB,GAAG,wBAAqB,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare const initializeWebRTC: (audioStream: MediaStream, token: string, audioElementRef: React.RefObject<HTMLAudioElement>, peerConnectionRef: React.MutableRefObject<RTCPeerConnection | null>, dataChannelRef: React.MutableRefObject<RTCDataChannel | null>, onMessage: (message: any) => void, onOpen?: () => void) => Promise<boolean>;
|
|
3
|
+
export declare const sendMessage: (dataChannel: RTCDataChannel | null, message: any) => boolean;
|
|
@@ -0,0 +1,135 @@
|
|
|
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
|
+
export var initializeWebRTC = function (audioStream, token, audioElementRef, peerConnectionRef, dataChannelRef, onMessage, onOpen) { return __awaiter(void 0, void 0, void 0, function () {
|
|
38
|
+
var pc_1, dc, offer, baseUrl, model, sdpResponse, errorText, answerSdp, answer, error_1;
|
|
39
|
+
return __generator(this, function (_a) {
|
|
40
|
+
switch (_a.label) {
|
|
41
|
+
case 0:
|
|
42
|
+
_a.trys.push([0, 8, , 9]);
|
|
43
|
+
if (!token) {
|
|
44
|
+
console.error('Cannot initialize WebRTC without a valid token');
|
|
45
|
+
return [2 /*return*/, false];
|
|
46
|
+
}
|
|
47
|
+
pc_1 = new RTCPeerConnection();
|
|
48
|
+
peerConnectionRef.current = pc_1;
|
|
49
|
+
audioStream.getAudioTracks().forEach(function (track) {
|
|
50
|
+
pc_1.addTrack(track, audioStream);
|
|
51
|
+
});
|
|
52
|
+
if (!audioElementRef.current) {
|
|
53
|
+
console.error('Audio element ref is not set - responses won\'t be audible');
|
|
54
|
+
}
|
|
55
|
+
pc_1.ontrack = function (e) {
|
|
56
|
+
if (audioElementRef.current && e.track.kind === 'audio') {
|
|
57
|
+
var stream = new MediaStream([e.track]);
|
|
58
|
+
audioElementRef.current.srcObject = stream;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
dc = pc_1.createDataChannel('oai-events');
|
|
62
|
+
dataChannelRef.current = dc;
|
|
63
|
+
dc.onopen = function () {
|
|
64
|
+
console.log('Data channel opened');
|
|
65
|
+
if (onOpen) {
|
|
66
|
+
onOpen();
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
dc.onmessage = function (e) {
|
|
70
|
+
try {
|
|
71
|
+
var message = JSON.parse(e.data);
|
|
72
|
+
onMessage(message);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error('Error handling WebRTC message:', error);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
return [4 /*yield*/, pc_1.createOffer()];
|
|
79
|
+
case 1:
|
|
80
|
+
offer = _a.sent();
|
|
81
|
+
return [4 /*yield*/, pc_1.setLocalDescription(offer)];
|
|
82
|
+
case 2:
|
|
83
|
+
_a.sent();
|
|
84
|
+
if (!pc_1.localDescription || !pc_1.localDescription.sdp) {
|
|
85
|
+
throw new Error('Failed to create local SDP offer');
|
|
86
|
+
}
|
|
87
|
+
baseUrl = 'https://api.openai.com/v1/realtime';
|
|
88
|
+
model = "gpt-4o-realtime-preview-2024-12-17";
|
|
89
|
+
return [4 /*yield*/, fetch("".concat(baseUrl, "?model=").concat(model), {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
body: pc_1.localDescription.sdp,
|
|
92
|
+
headers: {
|
|
93
|
+
Authorization: "Bearer ".concat(token),
|
|
94
|
+
'Content-Type': 'application/sdp'
|
|
95
|
+
},
|
|
96
|
+
})];
|
|
97
|
+
case 3:
|
|
98
|
+
sdpResponse = _a.sent();
|
|
99
|
+
if (!!sdpResponse.ok) return [3 /*break*/, 5];
|
|
100
|
+
return [4 /*yield*/, sdpResponse.text().catch(function () { return 'No error details available'; })];
|
|
101
|
+
case 4:
|
|
102
|
+
errorText = _a.sent();
|
|
103
|
+
console.error('WebRTC connection failed with status:', sdpResponse.status);
|
|
104
|
+
console.error('Error details:', errorText);
|
|
105
|
+
throw new Error("Failed to connect to OpenAI WebRTC: ".concat(sdpResponse.status, " - ").concat(errorText));
|
|
106
|
+
case 5: return [4 /*yield*/, sdpResponse.text()];
|
|
107
|
+
case 6:
|
|
108
|
+
answerSdp = _a.sent();
|
|
109
|
+
answer = {
|
|
110
|
+
type: 'answer',
|
|
111
|
+
sdp: answerSdp,
|
|
112
|
+
};
|
|
113
|
+
return [4 /*yield*/, pc_1.setRemoteDescription(answer)];
|
|
114
|
+
case 7:
|
|
115
|
+
_a.sent();
|
|
116
|
+
return [2 /*return*/, true];
|
|
117
|
+
case 8:
|
|
118
|
+
error_1 = _a.sent();
|
|
119
|
+
console.error('Error initializing WebRTC:', error_1);
|
|
120
|
+
return [2 /*return*/, false];
|
|
121
|
+
case 9: return [2 /*return*/];
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}); };
|
|
125
|
+
export var sendMessage = function (dataChannel, message) {
|
|
126
|
+
if ((dataChannel === null || dataChannel === void 0 ? void 0 : dataChannel.readyState) === 'open') {
|
|
127
|
+
dataChannel.send(JSON.stringify(message));
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
console.error('Data channel not open, cannot send message');
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=webrtc.js.map
|