@memori.ai/memori-react 7.21.1 → 7.22.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/components/StartPanel/StartPanel.css +29 -0
  3. package/dist/components/StartPanel/StartPanel.js +2 -1
  4. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  5. package/dist/components/UploadButton/UploadButton.d.ts +1 -0
  6. package/dist/components/UploadButton/UploadButton.js +142 -3
  7. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  8. package/dist/locales/de.json +8 -0
  9. package/dist/locales/en.json +8 -0
  10. package/dist/locales/es.json +8 -0
  11. package/dist/locales/it.json +8 -0
  12. package/esm/components/StartPanel/StartPanel.css +29 -0
  13. package/esm/components/StartPanel/StartPanel.js +2 -1
  14. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  15. package/esm/components/UploadButton/UploadButton.d.ts +1 -0
  16. package/esm/components/UploadButton/UploadButton.js +142 -3
  17. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  18. package/esm/locales/de.json +8 -0
  19. package/esm/locales/en.json +8 -0
  20. package/esm/locales/es.json +8 -0
  21. package/esm/locales/it.json +8 -0
  22. package/package.json +1 -1
  23. package/src/components/StartPanel/StartPanel.css +29 -0
  24. package/src/components/StartPanel/StartPanel.tsx +47 -0
  25. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +814 -0
  26. package/src/components/UploadButton/UploadButton.tsx +206 -5
  27. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +1 -1
  28. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +74 -0
  29. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +148 -0
  30. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +74 -0
  31. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +74 -0
  32. package/src/locales/de.json +8 -0
  33. package/src/locales/en.json +8 -0
  34. package/src/locales/es.json +8 -0
  35. package/src/locales/it.json +8 -0
@@ -13,8 +13,9 @@ type UploadError = {
13
13
 
14
14
  /**
15
15
  * FileUploadButton component allows users to upload and convert files to text
16
- * Supports PDF and TXT files up to 10MB
16
+ * Supports PDF, TXT, CSV and XLSX files up to 10MB
17
17
  * Extracts text from PDFs using PDF.js
18
+ * Extracts text from XLSX using xlsx library
18
19
  */
19
20
 
20
21
  const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
@@ -22,11 +23,14 @@ const MAX_TEXT_LENGTH = 100000; // 100,000 characters
22
23
  const PDF_JS_VERSION = '3.11.174'; // Last stable version with .min.js files
23
24
  const WORKER_URL = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${PDF_JS_VERSION}/pdf.worker.min.js`;
24
25
  const PDF_JS_URL = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${PDF_JS_VERSION}/pdf.min.js`;
26
+ const XLSX_URL =
27
+ 'https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/xlsx.full.min.js';
25
28
 
26
- // Add type definition for pdfjsLib
29
+ // Add type definitions for external libraries
27
30
  declare global {
28
31
  interface Window {
29
32
  pdfjsLib: any;
33
+ XLSX: any;
30
34
  }
31
35
  }
32
36
 
@@ -105,6 +109,16 @@ const FileUploadButton = ({
105
109
  // Return extracted text
106
110
  return text;
107
111
  } catch (error) {
112
+ setErrors(prev => [
113
+ ...prev,
114
+ {
115
+ message: `PDF extraction failed: ${
116
+ error instanceof Error ? error.message : 'Unknown error'
117
+ }`,
118
+ severity: 'error',
119
+ fileId: file.name,
120
+ },
121
+ ]);
108
122
  throw new Error(
109
123
  `PDF extraction failed: ${
110
124
  error instanceof Error ? error.message : 'Unknown error'
@@ -113,6 +127,191 @@ const FileUploadButton = ({
113
127
  }
114
128
  };
115
129
 
130
+ /**
131
+ * Extracts text from XLSX using xlsx library with enhanced error handling
132
+ * @param file XLSX file to process
133
+ * @returns Promise resolving to extracted text
134
+ */
135
+ const extractTextFromXLSX = async (file: File): Promise<string> => {
136
+ try {
137
+ // First, check if the XLSX library is loaded in the window object
138
+ // If not, dynamically load it by creating and appending a script tag
139
+ if (!window.XLSX) {
140
+ await new Promise((resolve, reject) => {
141
+ const script = document.createElement('script');
142
+ script.src = XLSX_URL;
143
+ script.onload = resolve;
144
+ script.onerror = reject;
145
+ document.head.appendChild(script);
146
+ });
147
+ }
148
+
149
+ // Convert the File object to ArrayBuffer for XLSX parsing
150
+ const arrayBuffer = await file.arrayBuffer();
151
+
152
+ // Check for minimum valid Excel file size
153
+ if (arrayBuffer.byteLength < 4) {
154
+ throw new Error('File appears to be corrupted or empty');
155
+ }
156
+
157
+ let workbook;
158
+ try {
159
+ // Try parsing with full options first
160
+ workbook = window.XLSX.read(arrayBuffer, {
161
+ type: 'array',
162
+ cellFormula: false, // Disable formula parsing to avoid potential issues
163
+ cellNF: false, // Disable number format parsing
164
+ cellHTML: false, // Disable HTML parsing
165
+ cellText: true, // Force text output
166
+ cellDates: false, // Disable date parsing to avoid errors
167
+ error: (e: any) => {
168
+ console.warn('Non-fatal XLSX error:', e);
169
+ }, // Log non-fatal errors
170
+ cellStyles: false, // Disable style parsing
171
+ });
172
+ } catch (initialError) {
173
+ console.warn(
174
+ 'Initial XLSX parsing failed, attempting recovery mode:',
175
+ initialError
176
+ );
177
+
178
+ // Fallback to a more permissive parsing method
179
+ try {
180
+ workbook = window.XLSX.read(arrayBuffer, {
181
+ type: 'array',
182
+ sheetRows: 1000, // Limit number of rows to parse
183
+ cellFormula: false,
184
+ cellStyles: false,
185
+ bookDeps: false, // Don't parse external dependencies
186
+ bookFiles: false, // Don't parse embedded files
187
+ bookProps: false, // Don't parse document properties
188
+ bookSheets: false, // Don't parse sheet properties
189
+ bookVBA: false, // Don't parse VBA
190
+ WTF: true, // "What the Formula" mode - ignores errors when possible
191
+ });
192
+ } catch (recoveryError) {
193
+ setErrors(prev => [
194
+ ...prev,
195
+ {
196
+ message: `File appears to be corrupted. Recovery attempt failed: ${
197
+ recoveryError instanceof Error
198
+ ? recoveryError.message
199
+ : 'Unknown error'
200
+ }`,
201
+ severity: 'error',
202
+ fileId: file.name,
203
+ },
204
+ ]);
205
+ throw new Error(
206
+ `File appears to be corrupted. Recovery attempt failed: ${
207
+ recoveryError instanceof Error
208
+ ? recoveryError.message
209
+ : 'Unknown error'
210
+ }`
211
+ );
212
+ }
213
+ }
214
+
215
+ // Verify that workbook contains at least one sheet
216
+ if (
217
+ !workbook ||
218
+ !workbook.SheetNames ||
219
+ workbook.SheetNames.length === 0
220
+ ) {
221
+ throw new Error('Excel file contains no valid worksheets');
222
+ }
223
+
224
+ let text = '';
225
+ let successfulSheets = 0;
226
+ const totalSheets = workbook.SheetNames.length;
227
+
228
+ // Loop through each sheet in the workbook
229
+ for (const sheetName of workbook.SheetNames) {
230
+ try {
231
+ const worksheet = workbook.Sheets[sheetName];
232
+ if (!worksheet) {
233
+ throw new Error(`Sheet ${sheetName} is empty or corrupted`);
234
+ }
235
+
236
+ // Safely get the dimensions of the sheet
237
+ const range = window.XLSX.utils.decode_range(
238
+ worksheet['!ref'] || 'A1:A1'
239
+ );
240
+
241
+ // Check if sheet seems abnormally large (possible corruption)
242
+ const rowCount = range.e.r - range.s.r + 1;
243
+ const colCount = range.e.c - range.s.c + 1;
244
+ if (rowCount > 10000 || colCount > 1000) {
245
+ throw new Error(
246
+ `Sheet ${sheetName} has suspicious dimensions (${rowCount}x${colCount}) and may be corrupted`
247
+ );
248
+ }
249
+
250
+ // Try to convert sheet to CSV
251
+ let csv;
252
+ try {
253
+ csv = window.XLSX.utils.sheet_to_csv(worksheet);
254
+ } catch (csvError) {
255
+ // If CSV conversion fails, try a more basic cell-by-cell approach
256
+ csv = '';
257
+ for (let r = range.s.r; r <= Math.min(range.e.r, 1000); ++r) {
258
+ let row = '';
259
+ for (let c = range.s.c; c <= Math.min(range.e.c, 100); ++c) {
260
+ const cell =
261
+ worksheet[window.XLSX.utils.encode_cell({ r: r, c: c })];
262
+ row += (cell ? String(cell.v || '') : '') + ',';
263
+ }
264
+ csv += row + '\n';
265
+ }
266
+ csv += '...(truncated due to potential corruption)';
267
+ }
268
+
269
+ // Add sheet name and content to final text
270
+ text += `Sheet: ${sheetName}\n${csv}\n\n`;
271
+ successfulSheets++;
272
+ } catch (sheetError) {
273
+ // Log sheet-specific error but continue with other sheets
274
+ text += `Sheet: ${sheetName}\nError extracting content: ${
275
+ sheetError instanceof Error ? sheetError.message : 'Unknown error'
276
+ }\n\n`;
277
+ }
278
+ }
279
+
280
+ // If we couldn't extract any sheets successfully
281
+ if (successfulSheets === 0) {
282
+ throw new Error(
283
+ 'Could not extract any valid content from the Excel file'
284
+ );
285
+ }
286
+
287
+ // If some sheets failed but others succeeded
288
+ if (successfulSheets < totalSheets) {
289
+ text =
290
+ `Warning: Only extracted ${successfulSheets} of ${totalSheets} sheets due to possible corruption.\n\n` +
291
+ text;
292
+ }
293
+
294
+ return text; // Return the extracted text from all sheets
295
+ } catch (error) {
296
+ setErrors(prev => [
297
+ ...prev,
298
+ {
299
+ message: `XLSX extraction failed: ${
300
+ error instanceof Error ? error.message : 'Unknown error'
301
+ }`,
302
+ severity: 'error',
303
+ fileId: file.name,
304
+ },
305
+ ]);
306
+ // If any error occurs during processing, throw with descriptive message
307
+ throw new Error(
308
+ `XLSX extraction failed: ${
309
+ error instanceof Error ? error.message : 'Unknown error'
310
+ }`
311
+ );
312
+ }
313
+ };
314
+
116
315
  /**
117
316
  * Validates uploaded file
118
317
  * Checks file type and size restrictions
@@ -121,7 +320,7 @@ const FileUploadButton = ({
121
320
  */
122
321
  const validateFile = (file: File): boolean => {
123
322
  const fileExt = `.${file.name.split('.').pop()?.toLowerCase()}`;
124
- const ALLOWED_FILE_TYPES = ['.pdf', '.txt'];
323
+ const ALLOWED_FILE_TYPES = ['.pdf', '.txt', '.json', '.xlsx', '.csv'];
125
324
 
126
325
  if (!ALLOWED_FILE_TYPES.includes(fileExt)) {
127
326
  addError({
@@ -161,8 +360,10 @@ const FileUploadButton = ({
161
360
 
162
361
  if (fileExt === 'pdf') {
163
362
  text = await extractTextFromPDF(file);
164
- } else if (fileExt === 'txt' || fileExt === 'json') {
363
+ } else if (fileExt === 'txt' || fileExt === 'json' || fileExt === 'csv') {
165
364
  text = await file.text();
365
+ } else if (fileExt === 'xlsx') {
366
+ text = await extractTextFromXLSX(file);
166
367
  }
167
368
 
168
369
  // Check text length limit
@@ -241,7 +442,7 @@ const FileUploadButton = ({
241
442
  <input
242
443
  ref={fileInputRef}
243
444
  type="file"
244
- accept=".pdf,.txt,.json"
445
+ accept=".pdf,.txt,.json,.xlsx,.csv"
245
446
  className="memori--upload-file-input"
246
447
  onChange={handleFileSelect}
247
448
  multiple
@@ -6,7 +6,7 @@ exports[`renders UploadButton unchanged 1`] = `
6
6
  class="relative file-upload-wrapper"
7
7
  >
8
8
  <input
9
- accept=".pdf,.txt,.json"
9
+ accept=".pdf,.txt,.json,.xlsx,.csv"
10
10
  class="memori--upload-file-input"
11
11
  multiple=""
12
12
  type="file"
@@ -337,6 +337,80 @@ exports[`renders Chat layout unchanged 1`] = `
337
337
  </option>
338
338
  </select>
339
339
  </div>
340
+ <div
341
+ class="memori--start-privacy-explanation-container"
342
+ >
343
+ <p
344
+ class="memori--start-privacy-explanation"
345
+ >
346
+ Le conversazioni sono visibili all'autore dell'agente
347
+ </p>
348
+ <div
349
+ class="memori-tooltip memori-tooltip--align-right"
350
+ >
351
+ <div
352
+ class="memori-tooltip--content"
353
+ >
354
+ <div
355
+ class="memori--privacy-tooltip-content"
356
+ >
357
+ <p>
358
+
359
+ Tutte le conversazioni con questo agente sono visibili all'autore dell'agente
360
+ </p>
361
+ <ul
362
+ class="memori--privacy-tooltip-content-list"
363
+ >
364
+ <li>
365
+ Per utenti anonimi: l'autore vedrà il contenuto e l'indirizzo IP
366
+ </li>
367
+ <li>
368
+ Per utenti registrati: l'autore vedrà il contenuto e il nome utente
369
+ </li>
370
+ </ul>
371
+ <p>
372
+ L'autore utilizza queste informazioni per migliorare le funzionalità dell'agente. Continuando, accetti queste condizioni.
373
+ </p>
374
+ <a
375
+ href="https://memori.ai/en/privacy-policy"
376
+ rel="noopener noreferrer"
377
+ target="_blank"
378
+ >
379
+ Informativa sulla privacy
380
+ </a>
381
+ </div>
382
+ </div>
383
+ <div
384
+ class="memori-tooltip--trigger"
385
+ >
386
+ <svg
387
+ aria-hidden="true"
388
+ class="memori--start-privacy-explanation-icon"
389
+ fill="none"
390
+ focusable="false"
391
+ role="img"
392
+ stroke="currentColor"
393
+ stroke-linecap="round"
394
+ stroke-linejoin="round"
395
+ stroke-width="1.5"
396
+ viewBox="0 0 24 24"
397
+ xmlns="http://www.w3.org/2000/svg"
398
+ >
399
+ <circle
400
+ cx="12"
401
+ cy="12"
402
+ r="10"
403
+ />
404
+ <path
405
+ d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"
406
+ />
407
+ <path
408
+ d="M12 17L12.01 17"
409
+ />
410
+ </svg>
411
+ </div>
412
+ </div>
413
+ </div>
340
414
  <button
341
415
  class="memori-button memori-button--primary memori-button--rounded memori-button--padded memori--start-button"
342
416
  >
@@ -376,6 +376,80 @@ exports[`renders FullPage layout unchanged 1`] = `
376
376
  </option>
377
377
  </select>
378
378
  </div>
379
+ <div
380
+ class="memori--start-privacy-explanation-container"
381
+ >
382
+ <p
383
+ class="memori--start-privacy-explanation"
384
+ >
385
+ Le conversazioni sono visibili all'autore dell'agente
386
+ </p>
387
+ <div
388
+ class="memori-tooltip memori-tooltip--align-right"
389
+ >
390
+ <div
391
+ class="memori-tooltip--content"
392
+ >
393
+ <div
394
+ class="memori--privacy-tooltip-content"
395
+ >
396
+ <p>
397
+
398
+ Tutte le conversazioni con questo agente sono visibili all'autore dell'agente
399
+ </p>
400
+ <ul
401
+ class="memori--privacy-tooltip-content-list"
402
+ >
403
+ <li>
404
+ Per utenti anonimi: l'autore vedrà il contenuto e l'indirizzo IP
405
+ </li>
406
+ <li>
407
+ Per utenti registrati: l'autore vedrà il contenuto e il nome utente
408
+ </li>
409
+ </ul>
410
+ <p>
411
+ L'autore utilizza queste informazioni per migliorare le funzionalità dell'agente. Continuando, accetti queste condizioni.
412
+ </p>
413
+ <a
414
+ href="https://memori.ai/en/privacy-policy"
415
+ rel="noopener noreferrer"
416
+ target="_blank"
417
+ >
418
+ Informativa sulla privacy
419
+ </a>
420
+ </div>
421
+ </div>
422
+ <div
423
+ class="memori-tooltip--trigger"
424
+ >
425
+ <svg
426
+ aria-hidden="true"
427
+ class="memori--start-privacy-explanation-icon"
428
+ fill="none"
429
+ focusable="false"
430
+ role="img"
431
+ stroke="currentColor"
432
+ stroke-linecap="round"
433
+ stroke-linejoin="round"
434
+ stroke-width="1.5"
435
+ viewBox="0 0 24 24"
436
+ xmlns="http://www.w3.org/2000/svg"
437
+ >
438
+ <circle
439
+ cx="12"
440
+ cy="12"
441
+ r="10"
442
+ />
443
+ <path
444
+ d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"
445
+ />
446
+ <path
447
+ d="M12 17L12.01 17"
448
+ />
449
+ </svg>
450
+ </div>
451
+ </div>
452
+ </div>
379
453
  <button
380
454
  class="memori-button memori-button--primary memori-button--rounded memori-button--padded memori--start-button"
381
455
  >
@@ -838,6 +912,80 @@ exports[`renders FullPage layout with root css properties unchanged 1`] = `
838
912
  </option>
839
913
  </select>
840
914
  </div>
915
+ <div
916
+ class="memori--start-privacy-explanation-container"
917
+ >
918
+ <p
919
+ class="memori--start-privacy-explanation"
920
+ >
921
+ Le conversazioni sono visibili all'autore dell'agente
922
+ </p>
923
+ <div
924
+ class="memori-tooltip memori-tooltip--align-right"
925
+ >
926
+ <div
927
+ class="memori-tooltip--content"
928
+ >
929
+ <div
930
+ class="memori--privacy-tooltip-content"
931
+ >
932
+ <p>
933
+
934
+ Tutte le conversazioni con questo agente sono visibili all'autore dell'agente
935
+ </p>
936
+ <ul
937
+ class="memori--privacy-tooltip-content-list"
938
+ >
939
+ <li>
940
+ Per utenti anonimi: l'autore vedrà il contenuto e l'indirizzo IP
941
+ </li>
942
+ <li>
943
+ Per utenti registrati: l'autore vedrà il contenuto e il nome utente
944
+ </li>
945
+ </ul>
946
+ <p>
947
+ L'autore utilizza queste informazioni per migliorare le funzionalità dell'agente. Continuando, accetti queste condizioni.
948
+ </p>
949
+ <a
950
+ href="https://memori.ai/en/privacy-policy"
951
+ rel="noopener noreferrer"
952
+ target="_blank"
953
+ >
954
+ Informativa sulla privacy
955
+ </a>
956
+ </div>
957
+ </div>
958
+ <div
959
+ class="memori-tooltip--trigger"
960
+ >
961
+ <svg
962
+ aria-hidden="true"
963
+ class="memori--start-privacy-explanation-icon"
964
+ fill="none"
965
+ focusable="false"
966
+ role="img"
967
+ stroke="currentColor"
968
+ stroke-linecap="round"
969
+ stroke-linejoin="round"
970
+ stroke-width="1.5"
971
+ viewBox="0 0 24 24"
972
+ xmlns="http://www.w3.org/2000/svg"
973
+ >
974
+ <circle
975
+ cx="12"
976
+ cy="12"
977
+ r="10"
978
+ />
979
+ <path
980
+ d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"
981
+ />
982
+ <path
983
+ d="M12 17L12.01 17"
984
+ />
985
+ </svg>
986
+ </div>
987
+ </div>
988
+ </div>
841
989
  <button
842
990
  class="memori-button memori-button--primary memori-button--rounded memori-button--padded memori--start-button"
843
991
  >
@@ -430,6 +430,80 @@ exports[`renders Totem layout unchanged 1`] = `
430
430
  </option>
431
431
  </select>
432
432
  </div>
433
+ <div
434
+ class="memori--start-privacy-explanation-container"
435
+ >
436
+ <p
437
+ class="memori--start-privacy-explanation"
438
+ >
439
+ Le conversazioni sono visibili all'autore dell'agente
440
+ </p>
441
+ <div
442
+ class="memori-tooltip memori-tooltip--align-right"
443
+ >
444
+ <div
445
+ class="memori-tooltip--content"
446
+ >
447
+ <div
448
+ class="memori--privacy-tooltip-content"
449
+ >
450
+ <p>
451
+
452
+ Tutte le conversazioni con questo agente sono visibili all'autore dell'agente
453
+ </p>
454
+ <ul
455
+ class="memori--privacy-tooltip-content-list"
456
+ >
457
+ <li>
458
+ Per utenti anonimi: l'autore vedrà il contenuto e l'indirizzo IP
459
+ </li>
460
+ <li>
461
+ Per utenti registrati: l'autore vedrà il contenuto e il nome utente
462
+ </li>
463
+ </ul>
464
+ <p>
465
+ L'autore utilizza queste informazioni per migliorare le funzionalità dell'agente. Continuando, accetti queste condizioni.
466
+ </p>
467
+ <a
468
+ href="https://memori.ai/en/privacy-policy"
469
+ rel="noopener noreferrer"
470
+ target="_blank"
471
+ >
472
+ Informativa sulla privacy
473
+ </a>
474
+ </div>
475
+ </div>
476
+ <div
477
+ class="memori-tooltip--trigger"
478
+ >
479
+ <svg
480
+ aria-hidden="true"
481
+ class="memori--start-privacy-explanation-icon"
482
+ fill="none"
483
+ focusable="false"
484
+ role="img"
485
+ stroke="currentColor"
486
+ stroke-linecap="round"
487
+ stroke-linejoin="round"
488
+ stroke-width="1.5"
489
+ viewBox="0 0 24 24"
490
+ xmlns="http://www.w3.org/2000/svg"
491
+ >
492
+ <circle
493
+ cx="12"
494
+ cy="12"
495
+ r="10"
496
+ />
497
+ <path
498
+ d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"
499
+ />
500
+ <path
501
+ d="M12 17L12.01 17"
502
+ />
503
+ </svg>
504
+ </div>
505
+ </div>
506
+ </div>
433
507
  <button
434
508
  class="memori-button memori-button--primary memori-button--rounded memori-button--padded memori--start-button"
435
509
  >
@@ -376,6 +376,80 @@ exports[`renders ZOOMED_FULL_BODY layout unchanged 1`] = `
376
376
  </option>
377
377
  </select>
378
378
  </div>
379
+ <div
380
+ class="memori--start-privacy-explanation-container"
381
+ >
382
+ <p
383
+ class="memori--start-privacy-explanation"
384
+ >
385
+ Le conversazioni sono visibili all'autore dell'agente
386
+ </p>
387
+ <div
388
+ class="memori-tooltip memori-tooltip--align-right"
389
+ >
390
+ <div
391
+ class="memori-tooltip--content"
392
+ >
393
+ <div
394
+ class="memori--privacy-tooltip-content"
395
+ >
396
+ <p>
397
+
398
+ Tutte le conversazioni con questo agente sono visibili all'autore dell'agente
399
+ </p>
400
+ <ul
401
+ class="memori--privacy-tooltip-content-list"
402
+ >
403
+ <li>
404
+ Per utenti anonimi: l'autore vedrà il contenuto e l'indirizzo IP
405
+ </li>
406
+ <li>
407
+ Per utenti registrati: l'autore vedrà il contenuto e il nome utente
408
+ </li>
409
+ </ul>
410
+ <p>
411
+ L'autore utilizza queste informazioni per migliorare le funzionalità dell'agente. Continuando, accetti queste condizioni.
412
+ </p>
413
+ <a
414
+ href="https://memori.ai/en/privacy-policy"
415
+ rel="noopener noreferrer"
416
+ target="_blank"
417
+ >
418
+ Informativa sulla privacy
419
+ </a>
420
+ </div>
421
+ </div>
422
+ <div
423
+ class="memori-tooltip--trigger"
424
+ >
425
+ <svg
426
+ aria-hidden="true"
427
+ class="memori--start-privacy-explanation-icon"
428
+ fill="none"
429
+ focusable="false"
430
+ role="img"
431
+ stroke="currentColor"
432
+ stroke-linecap="round"
433
+ stroke-linejoin="round"
434
+ stroke-width="1.5"
435
+ viewBox="0 0 24 24"
436
+ xmlns="http://www.w3.org/2000/svg"
437
+ >
438
+ <circle
439
+ cx="12"
440
+ cy="12"
441
+ r="10"
442
+ />
443
+ <path
444
+ d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"
445
+ />
446
+ <path
447
+ d="M12 17L12.01 17"
448
+ />
449
+ </svg>
450
+ </div>
451
+ </div>
452
+ </div>
379
453
  <button
380
454
  class="memori-button memori-button--primary memori-button--rounded memori-button--padded memori--start-button"
381
455
  >