maidr 2.22.1 → 2.23.1

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/maidr.js CHANGED
@@ -405,7 +405,7 @@ class Constants {
405
405
  * @default 0
406
406
  * @memberof AdvancedUserSettings
407
407
  */
408
- canTrack = 0; // 0 / 1, can we track user data
408
+ canTrack = 1; // 0 / 1, can we track user data
409
409
  /**
410
410
  * How are we representing braille? like, is it 1:1 with the chart, or do we do some compression and try to represent as accuratly as we can? Not currently in use.
411
411
  * @type {boolean}
@@ -446,6 +446,7 @@ class Constants {
446
446
  'LLMGeminiMulti',
447
447
  'LLMModels',
448
448
  'autoInitLLM',
449
+ 'clientToken',
449
450
  ];
450
451
 
451
452
  // LLM settings
@@ -644,6 +645,17 @@ class Constants {
644
645
  */
645
646
  manualData = true; // pull from manual data like chart2music (true), or do the old method where we pull from the chart (false)
646
647
 
648
+ /**
649
+ * Base URL for the API calls to backend services.
650
+ */
651
+ // baseURL = 'https://maidr-service.azurewebsites.net/api/';
652
+ baseURL = 'http://localhost:7071/api/';
653
+
654
+ // code = '?code=I8Aa2PlPspjQ8Hks0QzGyszP8_i2-XJ3bq7Xh8-ykEe4AzFuYn_QWA%3D%3D';
655
+ code = '';
656
+
657
+ clientToken = null;
658
+
647
659
  /**
648
660
  * Stops the autoplay if it is currently running.
649
661
  *
@@ -1203,14 +1215,18 @@ class Menu {
1203
1215
  document.getElementById('LLM_model_openai'),
1204
1216
  'change',
1205
1217
  function (e) {
1206
- if (e.target.checked) {
1207
- document
1208
- .getElementById('openai_auth_key_container')
1209
- .classList.remove('hidden');
1218
+ if (constants.clientToken && constants.emailAuthKey) {
1219
+ console.log('Client token and email auth key already set');
1210
1220
  } else {
1211
- document
1212
- .getElementById('openai_auth_key_container')
1213
- .classList.add('hidden');
1221
+ if (e.target.checked) {
1222
+ document
1223
+ .getElementById('openai_auth_key_container')
1224
+ .classList.remove('hidden');
1225
+ } else {
1226
+ document
1227
+ .getElementById('openai_auth_key_container')
1228
+ .classList.add('hidden');
1229
+ }
1214
1230
  }
1215
1231
  },
1216
1232
  ]);
@@ -1219,14 +1235,18 @@ class Menu {
1219
1235
  document.getElementById('LLM_model_gemini'),
1220
1236
  'change',
1221
1237
  function (e) {
1222
- if (e.target.checked) {
1223
- document
1224
- .getElementById('gemini_auth_key_container')
1225
- .classList.remove('hidden');
1238
+ if (constants.clientToken && constants.emailAuthKey) {
1239
+ console.log('Client token and email auth key already set');
1226
1240
  } else {
1227
- document
1228
- .getElementById('gemini_auth_key_container')
1229
- .classList.add('hidden');
1241
+ if (e.target.checked) {
1242
+ document
1243
+ .getElementById('gemini_auth_key_container')
1244
+ .classList.remove('hidden');
1245
+ } else {
1246
+ document
1247
+ .getElementById('gemini_auth_key_container')
1248
+ .classList.add('hidden');
1249
+ }
1230
1250
  }
1231
1251
  },
1232
1252
  ]);
@@ -1235,18 +1255,26 @@ class Menu {
1235
1255
  document.getElementById('LLM_model_claude'),
1236
1256
  'change',
1237
1257
  function (e) {
1238
- // if (e.target.checked) {
1239
- document
1240
- .getElementById('claude_auth_key_container')
1241
- .classList.add('hidden');
1242
- // } else {
1243
- // document
1244
- // .getElementById('claude_auth_key_container')
1245
- // .classList.add('hidden');
1246
- // }
1258
+ if (constants.clientToken && constants.emailAuthKey) {
1259
+ console.log('Client token and email auth key already set');
1260
+ } else {
1261
+ document
1262
+ .getElementById('claude_auth_key_container')
1263
+ .classList.add('hidden');
1264
+ }
1247
1265
  },
1248
1266
  ]);
1249
1267
 
1268
+ constants.events.push([
1269
+ document
1270
+ .getElementById('email_auth_key')
1271
+ .addEventListener('keydown', function (event) {
1272
+ if (event.key === 'Enter') {
1273
+ document.getElementById('verify').click();
1274
+ }
1275
+ }),
1276
+ ]);
1277
+
1250
1278
  // Skill level other events
1251
1279
  constants.events.push([
1252
1280
  document.getElementById('skill_level'),
@@ -1293,6 +1321,9 @@ class Menu {
1293
1321
  if (checked.length > 2) {
1294
1322
  checkbox.checked = false;
1295
1323
  alert('You can select up to 2 AI models.');
1324
+ } else if (checked.length === 0) {
1325
+ checkbox.checked = true;
1326
+ alert('You must select at least one AI model.');
1296
1327
  }
1297
1328
  });
1298
1329
  });
@@ -1393,12 +1424,17 @@ class Menu {
1393
1424
  document.getElementById('aria_mode_assertive').checked = false;
1394
1425
  }
1395
1426
 
1396
- for (let model in constants.LLMModels) {
1397
- document.getElementById(`LLM_model_${model}`).checked = true;
1427
+ if (constants.emailAuthKey && constants.clientToken) {
1428
+ console.log('email auth key and client token found');
1429
+ this.DisableLLMAPIKeys();
1430
+ } else {
1431
+ for (let model in constants.LLMModels) {
1432
+ document.getElementById(`LLM_model_${model}`).checked = true;
1398
1433
 
1399
- document
1400
- .getElementById(`${model}_auth_key_container`)
1401
- .classList.remove('hidden');
1434
+ document
1435
+ .getElementById(`${model}_auth_key_container`)
1436
+ .classList.remove('hidden');
1437
+ }
1402
1438
  }
1403
1439
  document
1404
1440
  .getElementById(`claude_auth_key_container`)
@@ -1477,38 +1513,75 @@ class Menu {
1477
1513
  }
1478
1514
  }
1479
1515
 
1480
- VerifyEmail() {
1481
- let email = document.getElementById('email_auth_key').value;
1482
- if (email && email.indexOf('@') !== -1) {
1483
- let url = `https://maidr-service.azurewebsites.net/api/send_email?code=I8Aa2PlPspjQ8Hks0QzGyszP8_i2-XJ3bq7Xh8-ykEe4AzFuYn_QWA%3D%3D`;
1516
+ DisableLLMAPIKeys() {
1517
+ document.getElementById('email_auth_key').disabled = true;
1484
1518
 
1485
- let requestJson = {
1486
- email: email,
1487
- };
1519
+ // hide verify button
1520
+ document.getElementById('verify').classList.add('hidden');
1488
1521
 
1489
- fetch(url, {
1490
- method: 'POST',
1491
- headers: {
1492
- 'Content-Type': 'application/json',
1493
- Authentication: constants.emailAuthKey,
1494
- },
1495
- body: JSON.stringify(requestJson),
1496
- })
1497
- .then((response) => response.json())
1498
- .then((data) => {
1499
- if (data && data.success) {
1500
- alert('Link sent to email address: ' + email);
1501
- } else {
1502
- console.log(data);
1503
- alert(data.data);
1504
- }
1522
+ // remove listener on enter
1523
+ document
1524
+ .getElementById('email_auth_key')
1525
+ .removeEventListener('keydown', function (event) {
1526
+ if (event.key === 'Enter') {
1527
+ document.getElementById('verify').click();
1528
+ }
1529
+ });
1530
+ }
1531
+
1532
+ isEmailTriggered = false;
1533
+
1534
+ VerifyEmail() {
1535
+ console.log('verify email');
1536
+ if (!this.isEmailTriggered) {
1537
+ this.isEmailTriggered = true;
1538
+ let email = document.getElementById('email_auth_key').value;
1539
+ if (email && email.indexOf('@') !== -1) {
1540
+ let url = constants.baseURL + `send_email` + constants.code;
1541
+
1542
+ let requestJson = {
1543
+ email: email,
1544
+ };
1545
+
1546
+ fetch(url, {
1547
+ method: 'POST',
1548
+ headers: {
1549
+ 'Content-Type': 'application/json',
1550
+ Authentication: constants.emailAuthKey,
1551
+ },
1552
+ body: JSON.stringify(requestJson),
1505
1553
  })
1506
- .catch((error) => {
1507
- console.log(error);
1508
- alert(error.data);
1509
- });
1510
- } else {
1511
- alert('Please enter a valid email address.');
1554
+ .then((response) => response.json())
1555
+ .then((data) => {
1556
+ if (data && data.message && data.client_token) {
1557
+ alert(data.message);
1558
+ constants.clientToken = data.client_token;
1559
+
1560
+ this.DisableLLMAPIKeys();
1561
+
1562
+ for (let model in constants.LLMModels) {
1563
+ document
1564
+ .getElementById(`${model}_auth_key_container`)
1565
+ .classList.add('hidden');
1566
+ }
1567
+
1568
+ this.SaveDataToLocalStorage();
1569
+ this.isEmailTriggered = false;
1570
+ } else {
1571
+ console.log(data);
1572
+ alert(data.data);
1573
+ this.isEmailTriggered = false;
1574
+ }
1575
+ })
1576
+ .catch((error) => {
1577
+ console.log(error);
1578
+ alert(error.data);
1579
+ this.isEmailTriggered = false;
1580
+ });
1581
+ } else {
1582
+ alert('Please enter a valid email address.');
1583
+ this.isEmailTriggered = false;
1584
+ }
1512
1585
  }
1513
1586
  }
1514
1587
 
@@ -1811,6 +1884,16 @@ class ChatLLM {
1811
1884
  'click',
1812
1885
  function (e) {
1813
1886
  document.getElementById('email_auth_key').value = '';
1887
+ document.getElementById('email_auth_key').disabled = false;
1888
+ constants.clientToken = '';
1889
+ document.getElementById('verify').classList.remove('hidden');
1890
+ document
1891
+ .getElementById('email_auth_key')
1892
+ .addEventListener('keydown', function (event) {
1893
+ if (event.key === 'Enter') {
1894
+ document.getElementById('verify').click();
1895
+ }
1896
+ });
1814
1897
  },
1815
1898
  ]);
1816
1899
  constants.events.push([
@@ -2290,8 +2373,7 @@ class ChatLLM {
2290
2373
 
2291
2374
  ClaudePromptAPI(text, imgBase64 = null) {
2292
2375
  console.log('Claude prompt API');
2293
- let url =
2294
- 'https://maidr-service.azurewebsites.net/api/claude?code=I8Aa2PlPspjQ8Hks0QzGyszP8_i2-XJ3bq7Xh8-ykEe4AzFuYn_QWA%3D%3D';
2376
+ let url = constants.baseURL + 'claude' + constants.code;
2295
2377
 
2296
2378
  // Create the prompt
2297
2379
  let prompt = constants.LLMSystemMessage;
@@ -2313,7 +2395,7 @@ class ChatLLM {
2313
2395
  method: 'POST',
2314
2396
  headers: {
2315
2397
  'Content-Type': 'application/json',
2316
- Authentication: constants.emailAuthKey,
2398
+ Authentication: constants.emailAuthKey + ' ' + constants.clientToken,
2317
2399
  },
2318
2400
  body: JSON.stringify(requestJson),
2319
2401
  })
@@ -2368,17 +2450,15 @@ class ChatLLM {
2368
2450
 
2369
2451
  OpenAIPromptAPI(text, img = null) {
2370
2452
  // request init
2371
- let url =
2372
- 'https://maidr-service.azurewebsites.net/api/openai?code=I8Aa2PlPspjQ8Hks0QzGyszP8_i2-XJ3bq7Xh8-ykEe4AzFuYn_QWA%3D%3D';
2453
+ let url = constants.baseURL + 'openai' + constants.code;
2373
2454
  let auth = constants.openAIAuthKey;
2374
2455
  let requestJson = chatLLM.OpenAIJson(text, img);
2375
- console.log('LLM request: ', requestJson);
2376
2456
 
2377
2457
  fetch(url, {
2378
2458
  method: 'POST',
2379
2459
  headers: {
2380
2460
  'Content-Type': 'application/json',
2381
- Authentication: constants.emailAuthKey,
2461
+ Authentication: constants.emailAuthKey + ' ' + constants.clientToken,
2382
2462
  },
2383
2463
  body: JSON.stringify(requestJson),
2384
2464
  })
@@ -2402,7 +2482,7 @@ class ChatLLM {
2402
2482
  if (!this.requestJson) {
2403
2483
  this.requestJson = {};
2404
2484
  //this.requestJson.model = 'gpt-4-vision-preview';
2405
- this.requestJson.model = 'gpt-4o-2024-08-06';
2485
+ this.requestJson.model = 'gpt-4o-2024-11-20';
2406
2486
  this.requestJson.max_tokens = constants.LLMmaxResponseTokens; // note: if this is too short (tested with less than 200), the response gets cut off
2407
2487
 
2408
2488
  // sys message
@@ -2505,8 +2585,7 @@ class ChatLLM {
2505
2585
  }
2506
2586
 
2507
2587
  async GeminiPromptAPI(text, imgBase64 = null) {
2508
- let url =
2509
- 'https://maidr-service.azurewebsites.net/api/gemini?code=I8Aa2PlPspjQ8Hks0QzGyszP8_i2-XJ3bq7Xh8-ykEe4AzFuYn_QWA%3D%3D';
2588
+ let url = constants.baseURL + 'gemini' + constants.code;
2510
2589
 
2511
2590
  // Create the prompt
2512
2591
  let prompt = constants.LLMSystemMessage;
@@ -2528,7 +2607,7 @@ class ChatLLM {
2528
2607
  method: 'POST',
2529
2608
  headers: {
2530
2609
  'Content-Type': 'application/json',
2531
- Authentication: constants.emailAuthKey,
2610
+ Authentication: constants.emailAuthKey + ' ' + constants.clientToken,
2532
2611
  },
2533
2612
  body: JSON.stringify(requestJson),
2534
2613
  });
@@ -3096,8 +3175,7 @@ class Helper {
3096
3175
  */
3097
3176
  class Tracker {
3098
3177
  // URL
3099
- logUrl =
3100
- 'https://maidr-service.azurewebsites.net/api/log?code=I8Aa2PlPspjQ8Hks0QzGyszP8_i2-XJ3bq7Xh8-ykEe4AzFuYn_QWA%3D%3D'; // TODO Replace
3178
+ logUrl = constants.baseURL + 'log' + constants.code; // TODO Replace
3101
3179
  isLocal = false;
3102
3180
 
3103
3181
  constructor() {
@@ -11800,13 +11878,13 @@ function SetEvents() {
11800
11878
  for (let i = 0; i < constants.events.length; i++) {
11801
11879
  if (Array.isArray(constants.events[i][0])) {
11802
11880
  for (let j = 0; j < constants.events[i][0].length; j++) {
11803
- constants.events[i][0][j].addEventListener(
11881
+ constants.events[i][0][j]?.addEventListener(
11804
11882
  constants.events[i][1],
11805
11883
  constants.events[i][2]
11806
11884
  );
11807
11885
  }
11808
11886
  } else {
11809
- constants.events[i][0].addEventListener(
11887
+ constants.events[i][0]?.addEventListener(
11810
11888
  constants.events[i][1],
11811
11889
  constants.events[i][2]
11812
11890
  );