@memori.ai/memori-react 8.36.0 → 8.38.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 (43) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/components/ChatBubble/ChatBubble.js +9 -1
  3. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  4. package/dist/components/ChatInputs/ChatInputs.js +30 -30
  5. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  6. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +17 -1
  7. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  8. package/dist/components/WhyThisAnswer/WhyThisAnswer.js +9 -2
  9. package/dist/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  10. package/dist/locales/de.json +2 -0
  11. package/dist/locales/en.json +2 -0
  12. package/dist/locales/es.json +2 -0
  13. package/dist/locales/fr.json +3 -10
  14. package/dist/locales/it.json +2 -0
  15. package/dist/version.d.ts +1 -1
  16. package/dist/version.js +1 -1
  17. package/esm/components/ChatBubble/ChatBubble.js +9 -1
  18. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  19. package/esm/components/ChatInputs/ChatInputs.js +30 -30
  20. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  21. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +17 -1
  22. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  23. package/esm/components/WhyThisAnswer/WhyThisAnswer.js +9 -2
  24. package/esm/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  25. package/esm/locales/de.json +2 -0
  26. package/esm/locales/en.json +2 -0
  27. package/esm/locales/es.json +2 -0
  28. package/esm/locales/fr.json +3 -10
  29. package/esm/locales/it.json +2 -0
  30. package/esm/version.d.ts +1 -1
  31. package/esm/version.js +1 -1
  32. package/package.json +1 -1
  33. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +70 -0
  34. package/src/components/ChatBubble/ChatBubble.tsx +13 -1
  35. package/src/components/ChatInputs/ChatInputs.tsx +21 -17
  36. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +25 -1
  37. package/src/components/WhyThisAnswer/WhyThisAnswer.tsx +18 -3
  38. package/src/locales/de.json +3 -1
  39. package/src/locales/en.json +2 -0
  40. package/src/locales/es.json +2 -0
  41. package/src/locales/fr.json +3 -10
  42. package/src/locales/it.json +2 -1
  43. package/src/version.ts +1 -1
@@ -625,6 +625,13 @@ exports[`renders Chat unchanged 1`] = `
625
625
  </div>
626
626
  </div>
627
627
  </fieldset>
628
+ <div
629
+ class="memori-chat-inputs--disclaimer"
630
+ >
631
+ <div>
632
+ write_and_speak.aiDisclaimer
633
+ </div>
634
+ </div>
628
635
  </div>
629
636
  </div>
630
637
  </div>
@@ -1285,6 +1292,13 @@ exports[`renders Chat with context vars unchanged 1`] = `
1285
1292
  </div>
1286
1293
  </div>
1287
1294
  </fieldset>
1295
+ <div
1296
+ class="memori-chat-inputs--disclaimer"
1297
+ >
1298
+ <div>
1299
+ write_and_speak.aiDisclaimer
1300
+ </div>
1301
+ </div>
1288
1302
  </div>
1289
1303
  </div>
1290
1304
  </div>
@@ -1891,6 +1905,13 @@ exports[`renders Chat with custom user avatar as react element unchanged 1`] = `
1891
1905
  </div>
1892
1906
  </div>
1893
1907
  </fieldset>
1908
+ <div
1909
+ class="memori-chat-inputs--disclaimer"
1910
+ >
1911
+ <div>
1912
+ write_and_speak.aiDisclaimer
1913
+ </div>
1914
+ </div>
1894
1915
  </div>
1895
1916
  </div>
1896
1917
  </div>
@@ -2503,6 +2524,13 @@ exports[`renders Chat with custom user avatar unchanged 1`] = `
2503
2524
  </div>
2504
2525
  </div>
2505
2526
  </fieldset>
2527
+ <div
2528
+ class="memori-chat-inputs--disclaimer"
2529
+ >
2530
+ <div>
2531
+ write_and_speak.aiDisclaimer
2532
+ </div>
2533
+ </div>
2506
2534
  </div>
2507
2535
  </div>
2508
2536
  </div>
@@ -3168,6 +3196,13 @@ exports[`renders Chat with dates unchanged 1`] = `
3168
3196
  </div>
3169
3197
  </div>
3170
3198
  </fieldset>
3199
+ <div
3200
+ class="memori-chat-inputs--disclaimer"
3201
+ >
3202
+ <div>
3203
+ write_and_speak.aiDisclaimer
3204
+ </div>
3205
+ </div>
3171
3206
  </div>
3172
3207
  </div>
3173
3208
  </div>
@@ -3824,6 +3859,13 @@ exports[`renders Chat with hints unchanged 1`] = `
3824
3859
  </div>
3825
3860
  </div>
3826
3861
  </fieldset>
3862
+ <div
3863
+ class="memori-chat-inputs--disclaimer"
3864
+ >
3865
+ <div>
3866
+ write_and_speak.aiDisclaimer
3867
+ </div>
3868
+ </div>
3827
3869
  </div>
3828
3870
  </div>
3829
3871
  </div>
@@ -4721,6 +4763,13 @@ exports[`renders Chat with media unchanged 1`] = `
4721
4763
  </div>
4722
4764
  </div>
4723
4765
  </fieldset>
4766
+ <div
4767
+ class="memori-chat-inputs--disclaimer"
4768
+ >
4769
+ <div>
4770
+ write_and_speak.aiDisclaimer
4771
+ </div>
4772
+ </div>
4724
4773
  </div>
4725
4774
  </div>
4726
4775
  </div>
@@ -5363,6 +5412,13 @@ exports[`renders Chat with memori typing unchanged 1`] = `
5363
5412
  </div>
5364
5413
  </div>
5365
5414
  </fieldset>
5415
+ <div
5416
+ class="memori-chat-inputs--disclaimer"
5417
+ >
5418
+ <div>
5419
+ write_and_speak.aiDisclaimer
5420
+ </div>
5421
+ </div>
5366
5422
  </div>
5367
5423
  </div>
5368
5424
  </div>
@@ -6108,6 +6164,13 @@ exports[`renders Chat with message consumption unchanged 1`] = `
6108
6164
  </div>
6109
6165
  </div>
6110
6166
  </fieldset>
6167
+ <div
6168
+ class="memori-chat-inputs--disclaimer"
6169
+ >
6170
+ <div>
6171
+ write_and_speak.aiDisclaimer
6172
+ </div>
6173
+ </div>
6111
6174
  </div>
6112
6175
  </div>
6113
6176
  </div>
@@ -6720,6 +6783,13 @@ exports[`renders Chat with user unchanged 1`] = `
6720
6783
  </div>
6721
6784
  </div>
6722
6785
  </fieldset>
6786
+ <div
6787
+ class="memori-chat-inputs--disclaimer"
6788
+ >
6789
+ <div>
6790
+ write_and_speak.aiDisclaimer
6791
+ </div>
6792
+ </div>
6723
6793
  </div>
6724
6794
  </div>
6725
6795
  </div>
@@ -32,6 +32,18 @@ import {
32
32
  import Expandable from '../ui/Expandable';
33
33
  import Modal from '../ui/Modal';
34
34
  import memoriApiClient from '@memori.ai/memori-api-client';
35
+ const ASSET_URL_PATTERN = /https?:\/\/\S*\/api\/v\d+\/asset\/\S+/gi;
36
+
37
+ const sanitizeRawCopyText = (text: string) =>
38
+ sanitizeMsg(
39
+ stripAttachmentTags(text)
40
+ .replace(/<\/?documents?\b[^>]*>/gi, '')
41
+ .replace(/<documents?\b[^>]*\/>/gi, '')
42
+ .replace(/<\/?attachments?\b[^>]*>/gi, '')
43
+ .replace(/<attachments?\b[^>]*\/>/gi, '')
44
+ .replace(ASSET_URL_PATTERN, '')
45
+ .trim()
46
+ );
35
47
 
36
48
  // Always import and load MathJax
37
49
  import { installMathJax } from '../../helpers/utils';
@@ -132,7 +144,7 @@ const ChatBubble: React.FC<Props> = ({
132
144
  shouldShowCopyButtons &&
133
145
  !!message.text?.length &&
134
146
  plainText !== message.text;
135
- const rawMessageText = sanitizeMsg(
147
+ const rawMessageText = sanitizeRawCopyText(
136
148
  message.fromUser
137
149
  ? message.text || ''
138
150
  : (message.text || '').replaceAll(/<think.*?>(.*?)<\/think>/gs, '')
@@ -3,7 +3,6 @@ import { DialogState, Medium } from '@memori.ai/memori-api-client/dist/types';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import toast from 'react-hot-toast';
5
5
  import ChatTextArea from '../ChatTextArea/ChatTextArea';
6
- import Button from '../ui/Button';
7
6
  import Send from '../icons/Send';
8
7
  import MicrophoneButton from '../MicrophoneButton/MicrophoneButton';
9
8
  import cx from 'classnames';
@@ -11,7 +10,7 @@ import Microphone from '../icons/Microphone';
11
10
  import UploadButton from '../UploadButton/UploadButton';
12
11
  import FilePreview from '../FilePreview/FilePreview';
13
12
  import memoriApiClient from '@memori.ai/memori-api-client';
14
- import Plus from '../icons/Plus';
13
+
15
14
  export interface Props {
16
15
  dialogState?: DialogState;
17
16
  instruct?: boolean;
@@ -136,8 +135,6 @@ const ChatInputs: React.FC<Props> = ({
136
135
  };
137
136
  });
138
137
 
139
-
140
-
141
138
  sendMessage(userMessage, mediaWithIds);
142
139
 
143
140
  // Reset states after sending
@@ -233,17 +230,21 @@ const ChatInputs: React.FC<Props> = ({
233
230
 
234
231
  const target = e.target as HTMLTextAreaElement;
235
232
  const selectionLength = target.selectionEnd - target.selectionStart;
236
- const lengthAfterPaste = userMessage.length - selectionLength + text.length;
233
+ const lengthAfterPaste =
234
+ userMessage.length - selectionLength + text.length;
237
235
 
238
236
  if (
239
237
  maxTextareaCharacters != null &&
240
238
  lengthAfterPaste > maxTextareaCharacters
241
239
  ) {
242
240
  e.preventDefault();
243
- toast(t('upload.pasteContentExceedsLimit', {
244
- defaultValue:
245
- 'Pasted content exceeds the size limit. Try shortening the text or splitting it into smaller parts.',
246
- }), { icon: '⚠️' });
241
+ toast(
242
+ t('upload.pasteContentExceedsLimit', {
243
+ defaultValue:
244
+ 'Pasted content exceeds the size limit. Try shortening the text or splitting it into smaller parts.',
245
+ }),
246
+ { icon: '⚠️' }
247
+ );
247
248
  return;
248
249
  }
249
250
 
@@ -276,10 +277,13 @@ const ChatInputs: React.FC<Props> = ({
276
277
 
277
278
  if (text.length > perDocumentLimit) {
278
279
  e.preventDefault();
279
- toast(t('upload.pasteContentExceedsLimit', {
280
- defaultValue:
281
- 'Pasted content exceeds the size limit. Try shortening the text or splitting it into smaller parts.',
282
- }), { icon: '⚠️' });
280
+ toast(
281
+ t('upload.pasteContentExceedsLimit', {
282
+ defaultValue:
283
+ 'Pasted content exceeds the size limit. Try shortening the text or splitting it into smaller parts.',
284
+ }),
285
+ { icon: '⚠️' }
286
+ );
283
287
  return;
284
288
  }
285
289
 
@@ -456,14 +460,14 @@ ${text}
456
460
  </div>
457
461
  </fieldset>
458
462
  {/* Disclaimer */}
459
- {/* <div className="memori-chat-inputs--disclaimer">
463
+ <div className="memori-chat-inputs--disclaimer">
460
464
  <div>
461
465
  {t(
462
- 'chat.disclaimer',
463
- 'AIsuru può commettere errori. Assicurati di verificare le informazioni importanti.'
466
+ 'write_and_speak.aiDisclaimer',
467
+ "L'agente può commettere errori. Assicurati di verificare le risposte."
464
468
  )}
465
469
  </div>
466
- </div> */}
470
+ </div>
467
471
  </div>
468
472
  );
469
473
  };
@@ -386,11 +386,35 @@ const UploadDocuments: React.FC<UploadDocumentsProps> = ({
386
386
  type: 'text/plain',
387
387
  });
388
388
 
389
- const [sourceUrl, textAssetUrl] = await Promise.all([
389
+ const uploadResults = await Promise.allSettled([
390
390
  uploadAssetFile(file),
391
391
  uploadAssetFile(textFile),
392
392
  ]);
393
393
 
394
+ const sourceUrl =
395
+ uploadResults[0].status === 'fulfilled'
396
+ ? uploadResults[0].value
397
+ : undefined;
398
+ const textAssetUrl =
399
+ uploadResults[1].status === 'fulfilled'
400
+ ? uploadResults[1].value
401
+ : undefined;
402
+
403
+ // Keep the document even when one of the optional links fails to upload.
404
+ if (
405
+ uploadResults[0].status === 'rejected' ||
406
+ uploadResults[1].status === 'rejected'
407
+ ) {
408
+ onDocumentError?.({
409
+ message: t('upload.partialAssetUploadWarning', {
410
+ fileName: file.name,
411
+ defaultValue:
412
+ 'Some file links could not be uploaded, but the document was added anyway.',
413
+ }),
414
+ severity: 'warning',
415
+ });
416
+ }
417
+
394
418
  processedFiles.push({
395
419
  name: file.name,
396
420
  id: fileId,
@@ -27,6 +27,18 @@ export interface Props {
27
27
  const addQuestionMark = (question: string) =>
28
28
  question.endsWith('?') ? question : `${question}?`;
29
29
 
30
+ const removeDocumentTags = (text: string) =>
31
+ text
32
+ // Remove document wrapper tags while keeping their inner content.
33
+ .replace(/<\/?documents?\b[^>]*>/gi, '')
34
+ // Remove self-closing document tags entirely.
35
+ .replace(/<documents?\b[^>]*\/>/gi, '')
36
+ // Remove attachment wrapper tags while keeping their inner content.
37
+ .replace(/<\/?attachments?\b[^>]*>/gi, '')
38
+ // Remove self-closing attachment tags entirely.
39
+ .replace(/<attachments?\b[^>]*\/>/gi, '')
40
+ .trim();
41
+
30
42
  const WhyThisAnswer = ({
31
43
  message,
32
44
  sessionID,
@@ -39,6 +51,9 @@ const WhyThisAnswer = ({
39
51
  const { t } = useTranslation();
40
52
 
41
53
  const searchMemory = client?.search.searchMemory;
54
+ const sanitizedQuestionAnswered = removeDocumentTags(
55
+ message.questionAnswered || ''
56
+ );
42
57
 
43
58
  const [matches, setMatches] = useState<SearchMatches[]>(initialMatches);
44
59
  const [loading, setLoading] = useState(_TEST_loading);
@@ -55,7 +70,7 @@ const WhyThisAnswer = ({
55
70
  const { matches, ...response } = await searchMemory(sessionID, {
56
71
  searchType: 'Semantic',
57
72
  numberOfResults: 3,
58
- text: message.questionAnswered,
73
+ text: sanitizedQuestionAnswered,
59
74
  date: message.date,
60
75
  placeName: message.placeName,
61
76
  placeLatitude: message.placeLatitude,
@@ -94,10 +109,10 @@ const WhyThisAnswer = ({
94
109
  >
95
110
  <p>{t('whyThisAnswerHelper')}</p>
96
111
 
97
- {message.questionAnswered && (
112
+ {sanitizedQuestionAnswered && (
98
113
  <p className="memori--whythisanswer-question-answered">
99
114
  <strong>{t('question') || 'Question'}:</strong>{' '}
100
- {message.questionAnswered}
115
+ {sanitizedQuestionAnswered}
101
116
  </p>
102
117
  )}
103
118
 
@@ -142,6 +142,7 @@
142
142
  "pageInstructExplanation": "Um mir neue Dinge beizubringen, klicken Sie auf die Schaltfläche \"ANLEITEN\", um zu beginnen",
143
143
  "pageTryMeExplanation": "Um mit mir zu sprechen, klicken Sie auf die Schaltfläche START, um zu beginnen",
144
144
  "pagePrivacyExplanation": "Die Konversationen sind sichtbar von dem Autor des Agenten",
145
+ "aiDisclaimer": "Der Agent kann Fehler machen. Bitte überprüfen Sie die Antworten.",
145
146
  "downloadChat": "Chat herunterladen",
146
147
  "pagePrivacyExplanationList": {
147
148
  "allConversations": "Alle Konversationen mit diesem Agenten sind sichtbar von dem Autor des Agenten",
@@ -194,7 +195,7 @@
194
195
  },
195
196
  "artifact": {
196
197
  "close": "Schließen",
197
- "size": "Größe",
198
+ "size": "Größe",
198
199
  "generated": "Generiert",
199
200
  "download": "Herunterladen",
200
201
  "print": "Drucken",
@@ -269,6 +270,7 @@
269
270
  "documentsNotAddedMaxAllowed": "{{count}} Dokument(e) nicht hinzugefügt (maximal {{max}} Dateien erlaubt).",
270
271
  "imagesNotAddedMaxAllowed": "{{count}} Bild(er) nicht hinzugefügt (maximal {{max}} Dateien erlaubt).",
271
272
  "documentsNotAddedContextSize": "{{count}} Dokument(e) nicht hinzugefügt (Kontextgrößen-Limit).",
273
+ "partialAssetUploadWarning": "Einige Dateilinks konnten nicht hochgeladen werden, aber das Dokument wurde trotzdem hinzugefügt.",
272
274
  "anonymousRetentionNotice": "Hinweis: Hochgeladene Dateien werden maximal 24 Stunden gespeichert."
273
275
  },
274
276
  "media": {
@@ -144,6 +144,7 @@
144
144
  "pageInstructExplanation": "To teach me new things click on the INSTRUCT ME button to get started",
145
145
  "pageTryMeExplanation": "To talk to me click on the START button to get started",
146
146
  "pagePrivacyExplanation": "The conversations are visible by the author of the agent",
147
+ "aiDisclaimer": "The agent may make mistakes. Please verify the answers.",
147
148
  "downloadChat": "Download chat",
148
149
  "pagePrivacyExplanationList": {
149
150
  "allConversations": "All conversations with this agent are visible to the author of the agent",
@@ -296,6 +297,7 @@
296
297
  "documentsNotAddedMaxAllowed": "{{count}} document(s) not added (maximum {{max}} files allowed).",
297
298
  "imagesNotAddedMaxAllowed": "{{count}} image(s) not added (maximum {{max}} files allowed).",
298
299
  "documentsNotAddedContextSize": "{{count}} document(s) not added (context size limit).",
300
+ "partialAssetUploadWarning": "Some file links could not be uploaded, but the document was added anyway.",
299
301
  "anonymousRetentionNotice": "Note: uploaded files are retained for a maximum of 24 hours."
300
302
  },
301
303
  "media": {
@@ -151,6 +151,7 @@
151
151
  "authorUsesInfo": "El autor utiliza estas informaciones para mejorar las funciones del agente y para ofrecerte un mejor servicio. Continuando la conversación, acepta estas condiciones."
152
152
  },
153
153
  "instructButton": "INSTRUÍME",
154
+ "aiDisclaimer": "El agente puede cometer errores. Por favor, verifica las respuestas.",
154
155
  "downloadChat": "Descargar chat",
155
156
  "tryMeButton": "COMENZAR",
156
157
  "resumeButton": "CONTINUAR",
@@ -269,6 +270,7 @@
269
270
  "documentsNotAddedMaxAllowed": "{{count}} documento(s) no añadido(s) (máximo {{max}} archivos permitidos).",
270
271
  "imagesNotAddedMaxAllowed": "{{count}} imagen(es) no añadida(s) (máximo {{max}} archivos permitidos).",
271
272
  "documentsNotAddedContextSize": "{{count}} documento(s) no añadido(s) (límite de tamaño de contexto).",
273
+ "partialAssetUploadWarning": "No se pudieron cargar algunos enlaces del archivo, pero el documento se agregó igualmente.",
272
274
  "anonymousRetentionNotice": "Nota: los archivos cargados se conservan durante un máximo de 24 horas."
273
275
  },
274
276
  "media": {
@@ -135,16 +135,7 @@
135
135
  "error": "Échec de l'exportation du chat en PDF. Veuillez réessayer."
136
136
  },
137
137
  "write_and_speak": {
138
- "loadingChatHistory": "Chargement de l'historique des discussions...",
139
- "noChatHistoryAvailable": "Aucun historique des discussions disponible",
140
- "noResultsFound": "Aucun résultat trouvé pour \"{{searchText}}\"",
141
- "searchInChatHistory": "Rechercher dans l'historique des chats...",
142
- "latestFirst": "Plus récents d'abord",
143
- "oldestFirst": "Plus anciens d'abord",
144
- "exportChat": "Exporter le Chat",
145
- "conversationStartedLabel": "Conversation démarrée"
146
- },
147
- "write_and_speak": {
138
+ "conversationStartedLabel": "Conversation démarrée",
148
139
  "micButtonPopover": "Cliquez sur le bouton pour parler",
149
140
  "micButtonPopoverListening": "Cliquez sur le bouton pour arrêter de parler",
150
141
  "pageInstructExplanation": "Pour m'apprendre de nouvelles choses, cliquez sur le bouton INSTRUCTEZ-MOI pour commencer",
@@ -159,6 +150,7 @@
159
150
  "contentAndIpAddress": "L'auteur peut voir le contenu et votre adresse IP",
160
151
  "authorUsesInfo": "L'auteur utilise ces informations pour améliorer les fonctionnalités de l'agent et pour vous fournir un meilleur service. En continuant la conversation, vous acceptez ces conditions."
161
152
  },
153
+ "aiDisclaimer": "L'agent peut commettre des erreurs. Veuillez vérifier les réponses.",
162
154
  "downloadChat": "Télécharger le chat",
163
155
  "instructButton": "INSTRUCTEZ-MOI",
164
156
  "tryMeButton": "COMMENCER",
@@ -277,6 +269,7 @@
277
269
  "documentsNotAddedMaxAllowed": "{{count}} document(s) non ajouté(s) (maximum {{max}} fichiers autorisés).",
278
270
  "imagesNotAddedMaxAllowed": "{{count}} image(s) non ajoutée(s) (maximum {{max}} fichiers autorisés).",
279
271
  "documentsNotAddedContextSize": "{{count}} document(s) non ajouté(s) (limite de taille du contexte).",
272
+ "partialAssetUploadWarning": "Certains liens de fichier n'ont pas pu etre televerses, mais le document a ete ajoute quand meme.",
280
273
  "anonymousRetentionNotice": "Remarque : les fichiers téléversés sont conservés pendant un maximum de 24 heures."
281
274
  },
282
275
  "media": {
@@ -144,6 +144,7 @@
144
144
  "pageInstructExplanation": "Per insegnarmi nuove cose clicca sul pulsante ISTRUISCIMI per cominciare",
145
145
  "pageTryMeExplanation": "Per parlare con me clicca sul pulsante INIZIAMO per cominciare",
146
146
  "pagePrivacyExplanation": "Le conversazioni sono visibili all'autore dell'agente",
147
+ "aiDisclaimer": "L'agente può commettere errori. Assicurati di verificare le risposte.",
147
148
  "downloadChat": "Scarica chat",
148
149
  "pagePrivacyExplanationList": {
149
150
  "allConversations": "Tutte le conversazioni con questo agente sono visibili all'autore dell'agente",
@@ -259,7 +260,6 @@
259
260
  "pdfExportNotSupported": "L'esportazione PDF non è supportata in questo browser",
260
261
  "popupBlocked": "Popup bloccato! Abilita i popup per stampare.",
261
262
  "safariPdfInstructions": "Esportazione PDF aperta in una nuova finestra. Usa Cmd+P (Mac) o Ctrl+P (Windows) per stampare e salvare come PDF."
262
-
263
263
  },
264
264
  "media": {
265
265
  "title": "Titolo",
@@ -316,6 +316,7 @@
316
316
  "documentsNotAddedMaxAllowed": "{{count}} documento/i non aggiunto/i (massimo {{max}} file consentiti).",
317
317
  "imagesNotAddedMaxAllowed": "{{count}} immagine/i non aggiunta/e (massimo {{max}} file consentiti).",
318
318
  "documentsNotAddedContextSize": "{{count}} documento/i non aggiunto/i (limite dimensione contesto).",
319
+ "partialAssetUploadWarning": "Alcuni link del file non sono stati caricati, ma il documento e stato aggiunto comunque.",
319
320
  "anonymousRetentionNotice": "Nota: i file caricati vengono conservati per massimo 24 ore."
320
321
  },
321
322
  "gamification": {
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  // This file is auto-generated. Do not edit manually.
2
- export const version = '8.36.0';
2
+ export const version = '8.38.0';