@memori.ai/memori-react 9.0.0-alpha.4 → 9.0.0-alpha.6

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 (268) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +5 -2
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  4. package/dist/components/Avatar/Avatar.js +5 -10
  5. package/dist/components/Avatar/Avatar.js.map +1 -1
  6. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +8 -1
  7. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  8. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +1 -1
  9. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
  10. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -0
  11. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js +14 -5
  12. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  13. package/dist/components/ChatBubble/ChatBubble.js +22 -16
  14. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  15. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js +6 -3
  16. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  17. package/dist/components/DateSelector/DateSelector.d.ts +2 -1
  18. package/dist/components/DateSelector/DateSelector.js +17 -7
  19. package/dist/components/DateSelector/DateSelector.js.map +1 -1
  20. package/dist/components/FilePreview/FilePreview.js +22 -5
  21. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  22. package/dist/components/Header/ChatConsumptionDropdown.js +1 -1
  23. package/dist/components/Header/ChatConsumptionDropdown.js.map +1 -1
  24. package/dist/components/Header/Header.css +2 -1
  25. package/dist/components/Header/Header.js +1 -1
  26. package/dist/components/Header/Header.js.map +1 -1
  27. package/dist/components/MediaWidget/MediaItemWidget.js +14 -12
  28. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  29. package/dist/components/MediaWidget/MediaItemWidget.utils.d.ts +3 -2
  30. package/dist/components/MediaWidget/MediaItemWidget.utils.js +28 -6
  31. package/dist/components/MediaWidget/MediaItemWidget.utils.js.map +1 -1
  32. package/dist/components/MediaWidget/MediaPreviewModal.js +6 -7
  33. package/dist/components/MediaWidget/MediaPreviewModal.js.map +1 -1
  34. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -4
  35. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +90 -38
  36. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.d.ts +1 -0
  37. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +14 -9
  38. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  39. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +2 -2
  40. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  41. package/dist/components/MemoriWidget/MemoriWidget.js +632 -280
  42. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  43. package/dist/components/StartPanel/StartPanel.js +10 -5
  44. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  45. package/dist/components/UploadButton/UploadButton.js +21 -5
  46. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  47. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +123 -59
  48. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  49. package/dist/components/layouts/Chat.js +25 -30
  50. package/dist/components/layouts/Chat.js.map +1 -1
  51. package/dist/components/layouts/FullPage.js +5 -8
  52. package/dist/components/layouts/FullPage.js.map +1 -1
  53. package/dist/components/layouts/HiddenChat.js +2 -1
  54. package/dist/components/layouts/HiddenChat.js.map +1 -1
  55. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js +5 -1
  56. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  57. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +3 -4
  58. package/dist/components/layouts/ZoomedFullBody.js +4 -7
  59. package/dist/components/layouts/ZoomedFullBody.js.map +1 -1
  60. package/dist/components/layouts/chat.css +19 -31
  61. package/dist/components/layouts/fullpage.css +52 -19
  62. package/dist/components/layouts/zoomed-full-body.css +40 -1
  63. package/dist/helpers/constants.d.ts +3 -0
  64. package/dist/helpers/constants.js +27 -1
  65. package/dist/helpers/constants.js.map +1 -1
  66. package/dist/helpers/credits.d.ts +5 -2
  67. package/dist/helpers/credits.js +5 -1
  68. package/dist/helpers/credits.js.map +1 -1
  69. package/dist/helpers/message.d.ts +1 -1
  70. package/dist/helpers/message.js +4 -4
  71. package/dist/helpers/message.js.map +1 -1
  72. package/dist/helpers/nats/getNatsConfig.d.ts +9 -0
  73. package/dist/helpers/nats/getNatsConfig.js +65 -0
  74. package/dist/helpers/nats/getNatsConfig.js.map +1 -0
  75. package/dist/helpers/nats/isSessionExpiredError.d.ts +3 -0
  76. package/dist/helpers/nats/isSessionExpiredError.js +36 -0
  77. package/dist/helpers/nats/isSessionExpiredError.js.map +1 -0
  78. package/dist/helpers/nats/useNats.d.ts +12 -0
  79. package/dist/helpers/nats/useNats.js +75 -0
  80. package/dist/helpers/nats/useNats.js.map +1 -0
  81. package/dist/helpers/nats/useNatsSession.d.ts +28 -0
  82. package/dist/helpers/nats/useNatsSession.js +212 -0
  83. package/dist/helpers/nats/useNatsSession.js.map +1 -0
  84. package/dist/helpers/usePressTooltip.d.ts +13 -0
  85. package/dist/helpers/usePressTooltip.js +23 -0
  86. package/dist/helpers/usePressTooltip.js.map +1 -0
  87. package/dist/helpers/utils.d.ts +21 -0
  88. package/dist/helpers/utils.js +75 -4
  89. package/dist/helpers/utils.js.map +1 -1
  90. package/dist/locales/de.json +1 -0
  91. package/dist/locales/en.json +1 -0
  92. package/dist/locales/es.json +1 -0
  93. package/dist/locales/fr.json +1 -0
  94. package/dist/locales/it.json +1 -0
  95. package/dist/styles.css +1 -1
  96. package/dist/types/integration.d.ts +3 -0
  97. package/dist/types/integration.js +16 -0
  98. package/dist/types/integration.js.map +1 -0
  99. package/dist/version.d.ts +1 -1
  100. package/dist/version.js +1 -1
  101. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +5 -2
  102. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  103. package/esm/components/Avatar/Avatar.js +5 -10
  104. package/esm/components/Avatar/Avatar.js.map +1 -1
  105. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +9 -2
  106. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  107. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +2 -2
  108. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
  109. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -0
  110. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js +13 -4
  111. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  112. package/esm/components/ChatBubble/ChatBubble.js +22 -16
  113. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  114. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js +6 -3
  115. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  116. package/esm/components/DateSelector/DateSelector.d.ts +2 -1
  117. package/esm/components/DateSelector/DateSelector.js +17 -7
  118. package/esm/components/DateSelector/DateSelector.js.map +1 -1
  119. package/esm/components/FilePreview/FilePreview.js +24 -7
  120. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  121. package/esm/components/Header/ChatConsumptionDropdown.js +1 -1
  122. package/esm/components/Header/ChatConsumptionDropdown.js.map +1 -1
  123. package/esm/components/Header/Header.css +2 -1
  124. package/esm/components/Header/Header.js +1 -1
  125. package/esm/components/Header/Header.js.map +1 -1
  126. package/esm/components/MediaWidget/MediaItemWidget.js +16 -14
  127. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  128. package/esm/components/MediaWidget/MediaItemWidget.utils.d.ts +3 -2
  129. package/esm/components/MediaWidget/MediaItemWidget.utils.js +27 -6
  130. package/esm/components/MediaWidget/MediaItemWidget.utils.js.map +1 -1
  131. package/esm/components/MediaWidget/MediaPreviewModal.js +6 -7
  132. package/esm/components/MediaWidget/MediaPreviewModal.js.map +1 -1
  133. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -4
  134. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +90 -38
  135. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.d.ts +1 -0
  136. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +14 -9
  137. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  138. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +2 -2
  139. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  140. package/esm/components/MemoriWidget/MemoriWidget.js +632 -280
  141. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  142. package/esm/components/StartPanel/StartPanel.js +10 -5
  143. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  144. package/esm/components/UploadButton/UploadButton.js +21 -5
  145. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  146. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +123 -59
  147. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  148. package/esm/components/layouts/Chat.js +25 -30
  149. package/esm/components/layouts/Chat.js.map +1 -1
  150. package/esm/components/layouts/FullPage.js +5 -8
  151. package/esm/components/layouts/FullPage.js.map +1 -1
  152. package/esm/components/layouts/HiddenChat.js +2 -1
  153. package/esm/components/layouts/HiddenChat.js.map +1 -1
  154. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js +5 -1
  155. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  156. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +3 -4
  157. package/esm/components/layouts/ZoomedFullBody.js +4 -7
  158. package/esm/components/layouts/ZoomedFullBody.js.map +1 -1
  159. package/esm/components/layouts/chat.css +19 -31
  160. package/esm/components/layouts/fullpage.css +52 -19
  161. package/esm/components/layouts/zoomed-full-body.css +40 -1
  162. package/esm/helpers/constants.d.ts +3 -0
  163. package/esm/helpers/constants.js +26 -0
  164. package/esm/helpers/constants.js.map +1 -1
  165. package/esm/helpers/credits.d.ts +5 -2
  166. package/esm/helpers/credits.js +5 -1
  167. package/esm/helpers/credits.js.map +1 -1
  168. package/esm/helpers/message.d.ts +1 -1
  169. package/esm/helpers/message.js +2 -2
  170. package/esm/helpers/message.js.map +1 -1
  171. package/esm/helpers/nats/getNatsConfig.d.ts +9 -0
  172. package/esm/helpers/nats/getNatsConfig.js +61 -0
  173. package/esm/helpers/nats/getNatsConfig.js.map +1 -0
  174. package/esm/helpers/nats/isSessionExpiredError.d.ts +3 -0
  175. package/esm/helpers/nats/isSessionExpiredError.js +32 -0
  176. package/esm/helpers/nats/isSessionExpiredError.js.map +1 -0
  177. package/esm/helpers/nats/useNats.d.ts +12 -0
  178. package/esm/helpers/nats/useNats.js +72 -0
  179. package/esm/helpers/nats/useNats.js.map +1 -0
  180. package/esm/helpers/nats/useNatsSession.d.ts +28 -0
  181. package/esm/helpers/nats/useNatsSession.js +208 -0
  182. package/esm/helpers/nats/useNatsSession.js.map +1 -0
  183. package/esm/helpers/usePressTooltip.d.ts +13 -0
  184. package/esm/helpers/usePressTooltip.js +20 -0
  185. package/esm/helpers/usePressTooltip.js.map +1 -0
  186. package/esm/helpers/utils.d.ts +21 -0
  187. package/esm/helpers/utils.js +68 -3
  188. package/esm/helpers/utils.js.map +1 -1
  189. package/esm/locales/de.json +1 -0
  190. package/esm/locales/en.json +1 -0
  191. package/esm/locales/es.json +1 -0
  192. package/esm/locales/fr.json +1 -0
  193. package/esm/locales/it.json +1 -0
  194. package/esm/styles.css +1 -1
  195. package/esm/types/integration.d.ts +3 -0
  196. package/esm/types/integration.js +11 -0
  197. package/esm/types/integration.js.map +1 -0
  198. package/esm/version.d.ts +1 -1
  199. package/esm/version.js +1 -1
  200. package/package.json +6 -4
  201. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +6 -1
  202. package/src/components/Avatar/Avatar.stories.tsx +45 -28
  203. package/src/components/Avatar/Avatar.test.tsx +54 -0
  204. package/src/components/Avatar/Avatar.tsx +8 -12
  205. package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx +12 -5
  206. package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.ts +2 -1
  207. package/src/components/Avatar/AvatarView/AvatarComponent/constants.ts +16 -4
  208. package/src/components/Avatar/__snapshots__/Avatar.test.tsx.snap +164 -0
  209. package/src/components/ChatBubble/ChatBubble.tsx +41 -12
  210. package/src/components/CompletionProviderStatus/CompletionProviderStatus.tsx +8 -4
  211. package/src/components/DateSelector/DateSelector.stories.tsx +11 -2
  212. package/src/components/DateSelector/DateSelector.tsx +28 -9
  213. package/src/components/FilePreview/FilePreview.tsx +28 -7
  214. package/src/components/Header/ChatConsumptionDropdown.tsx +5 -1
  215. package/src/components/Header/Header.css +2 -1
  216. package/src/components/Header/Header.tsx +1 -0
  217. package/src/components/MediaWidget/MediaItemWidget.tsx +26 -13
  218. package/src/components/MediaWidget/MediaItemWidget.utils.test.ts +45 -2
  219. package/src/components/MediaWidget/MediaItemWidget.utils.ts +39 -6
  220. package/src/components/MediaWidget/MediaPreviewModal.tsx +9 -7
  221. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +218 -2252
  222. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -4
  223. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +90 -38
  224. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +31 -14
  225. package/src/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.tsx +4 -3
  226. package/src/components/MemoriWidget/MemoriWidget.tsx +785 -331
  227. package/src/components/StartPanel/StartPanel.stories.tsx +22 -0
  228. package/src/components/StartPanel/StartPanel.test.tsx +64 -1
  229. package/src/components/StartPanel/StartPanel.tsx +26 -3
  230. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +261 -0
  231. package/src/components/UploadButton/UploadButton.tsx +30 -11
  232. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +148 -61
  233. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +2 -2
  234. package/src/components/layouts/Chat.tsx +16 -19
  235. package/src/components/layouts/FullPage.tsx +32 -25
  236. package/src/components/layouts/HiddenChat.tsx +4 -0
  237. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.tsx +8 -0
  238. package/src/components/layouts/WebsiteAssistant/website-assistant.css +3 -4
  239. package/src/components/layouts/ZoomedFullBody.tsx +30 -24
  240. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +6 -3
  241. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +824 -810
  242. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +280 -273
  243. package/src/components/layouts/chat.css +19 -31
  244. package/src/components/layouts/fullpage.css +52 -19
  245. package/src/components/layouts/layouts.stories.tsx +131 -12
  246. package/src/components/layouts/zoomed-full-body.css +40 -1
  247. package/src/helpers/constants.ts +32 -1
  248. package/src/helpers/credits.ts +16 -1
  249. package/src/helpers/message.test.ts +28 -1
  250. package/src/helpers/message.ts +4 -4
  251. package/src/helpers/nats/getNatsConfig.ts +145 -0
  252. package/src/helpers/nats/isSessionExpiredError.test.ts +38 -0
  253. package/src/helpers/nats/isSessionExpiredError.ts +51 -0
  254. package/src/helpers/nats/useNats.ts +124 -0
  255. package/src/helpers/nats/useNatsSession.ts +394 -0
  256. package/src/helpers/usePressTooltip.ts +29 -0
  257. package/src/helpers/utils.test.ts +162 -0
  258. package/src/helpers/utils.ts +108 -3
  259. package/src/index.stories.tsx +32 -0
  260. package/src/locales/de.json +1 -0
  261. package/src/locales/en.json +1 -0
  262. package/src/locales/es.json +1 -0
  263. package/src/locales/fr.json +1 -0
  264. package/src/locales/it.json +1 -0
  265. package/src/styles.css +4 -7
  266. package/src/types/integration.test.ts +32 -0
  267. package/src/types/integration.ts +31 -0
  268. package/src/version.ts +1 -1
@@ -1,6 +1,7 @@
1
1
  import { useState, useEffect, useRef, useMemo } from 'react';
2
2
  import { Material, MeshStandardMaterial, SkinnedMesh } from 'three';
3
3
  import * as THREE from 'three';
4
+ import { officeNativeExtensions } from './constants';
4
5
 
5
6
  export const hasTouchscreen = (): boolean => {
6
7
  let hasTouchScreen = false;
@@ -237,6 +238,67 @@ export const stripMarkdown = (text: string) => {
237
238
  return text;
238
239
  };
239
240
 
241
+ export const OFFICE_NATIVE_EXTENSIONS = officeNativeExtensions;
242
+
243
+ export const isOfficeNativeFilename = (filename: string): boolean => {
244
+ const ext = `.${filename.split('.').pop()?.toLowerCase() || ''}`;
245
+ return (officeNativeExtensions as readonly string[]).includes(ext);
246
+ };
247
+
248
+ export type ParsedDocumentAttachment = {
249
+ filename: string;
250
+ type: string;
251
+ content: string;
252
+ url: string;
253
+ };
254
+
255
+ const DOCUMENT_ATTACHMENT_REGEX =
256
+ /<document_attachment filename="([^"]+)" type="([^"]+)">([\s\S]*?)<\/document_attachment>/g;
257
+
258
+ const ATTACHMENT_LINK_AFTER_REGEX =
259
+ /<attachment_link>\s*([\s\S]*?)\s*<\/attachment_link>/;
260
+
261
+ export const parseDocumentAttachmentsFromMessage = (
262
+ text: string
263
+ ): ParsedDocumentAttachment[] => {
264
+ if (!text) return [];
265
+
266
+ const attachments: ParsedDocumentAttachment[] = [];
267
+ const regex = new RegExp(DOCUMENT_ATTACHMENT_REGEX.source, 'g');
268
+ let match;
269
+
270
+ while ((match = regex.exec(text)) !== null) {
271
+ const [, filename, type, content] = match;
272
+ const afterTag = text.slice(match.index + match[0].length);
273
+ const linkMatch = afterTag.match(ATTACHMENT_LINK_AFTER_REGEX);
274
+ const rawUrl = linkMatch?.[1]?.trim() || '';
275
+ const url = /^https?:\/\//.test(rawUrl) ? rawUrl : '';
276
+
277
+ attachments.push({
278
+ filename,
279
+ type,
280
+ content: content.trim(),
281
+ url,
282
+ });
283
+ }
284
+
285
+ return attachments;
286
+ };
287
+
288
+ export const extractAttachmentLinks = (content: string): string[] => {
289
+ return parseDocumentAttachmentsFromMessage(content).map(
290
+ attachment => attachment.url
291
+ );
292
+ };
293
+
294
+ export const extractAttachmentLink = (content: string): string | null => {
295
+ const match = content?.match(
296
+ /<attachment_link>\s*([\s\S]*?)\s*<\/attachment_link>/
297
+ );
298
+ const rawUrl = match?.[1]?.trim() || '';
299
+ return /^https?:\/\//.test(rawUrl) ? rawUrl : null;
300
+ };
301
+
240
302
  export const stripDocumentAttachmentTags = (text: string): string => {
241
303
  const documentAttachmentTagRegex = /<document_attachment filename="([^"]+)" type="([^"]+)">([\s\S]*?)<\/document_attachment>/g;
242
304
  return text
@@ -245,6 +307,36 @@ export const stripDocumentAttachmentTags = (text: string): string => {
245
307
  .replace(/<attachment_link>\s*[\s\S]*?\s*<\/attachment_link>/g, '');
246
308
  };
247
309
 
310
+ export const getDocumentAttachmentAssetUrl = (attachment: {
311
+ content?: string | null;
312
+ url?: string | null;
313
+ }): string =>
314
+ attachment.url?.trim() ||
315
+ extractAttachmentLink(attachment.content || '') ||
316
+ '';
317
+
318
+ export const isAssetOnlyDocumentAttachment = (attachment: {
319
+ title?: string;
320
+ name?: string;
321
+ content?: string | null;
322
+ url?: string | null;
323
+ }): boolean => {
324
+ const filename = attachment.title || attachment.name || '';
325
+ const assetUrl = getDocumentAttachmentAssetUrl(attachment);
326
+
327
+ if (!assetUrl) return false;
328
+
329
+ if (isOfficeNativeFilename(filename)) {
330
+ return true;
331
+ }
332
+
333
+ const strippedContent = attachment.content
334
+ ? stripDocumentAttachmentTags(attachment.content).trim()
335
+ : '';
336
+
337
+ return !strippedContent;
338
+ };
339
+
248
340
  export const stripOutputTags = (text: string): string => {
249
341
  const outputTagRegex = /<output.*?<\/output>/gs;
250
342
 
@@ -271,10 +363,23 @@ export const stripReasoningTags = (text: string) => {
271
363
  return strippedText;
272
364
  };
273
365
 
366
+ /**
367
+ * Strip HTML tags / decode entities without executing scripts or event handlers.
368
+ * Uses an inert DOMParser document (no resource loads / onerror), unlike live innerHTML.
369
+ */
274
370
  export const stripHTML = (text: string) => {
275
- const el = document.createElement('div');
276
- el.innerHTML = text;
277
- return el.textContent || '';
371
+ if (typeof DOMParser !== 'undefined') {
372
+ try {
373
+ return (
374
+ new DOMParser().parseFromString(text, 'text/html').body.textContent ||
375
+ ''
376
+ );
377
+ } catch {
378
+ // fall through
379
+ }
380
+ }
381
+ // Non-DOM / parse failure: strip tags only (does not decode entities)
382
+ return text.replace(/<[^>]*>/g, '');
278
383
  };
279
384
 
280
385
  /** Ensures all <a> tags in HTML open in a new tab (target="_blank" rel="noopener noreferrer"). */
@@ -192,3 +192,35 @@ WithPiiDetection.args = {
192
192
  }),
193
193
  },
194
194
  };
195
+
196
+ export const WithLocalNats = Template.bind({});
197
+ WithLocalNats.args = {
198
+ memoriName: 'test324',
199
+ ownerUserName: 'andrea.patini',
200
+ memoriID: 'd661a9ca-e907-4396-a986-5095ccd582d6',
201
+ ownerUserID: '69fcc557-9cb6-4e5e-b8ab-140cff975492',
202
+ tenantID: 'localhost:3000',
203
+ engineURL: 'http://localhost:7778/memori/v2',
204
+ apiURL: 'http://localhost:7778/api/v2',
205
+ baseURL: 'http://localhost:3000',
206
+ layout: 'FULLPAGE',
207
+ uiLang: 'IT',
208
+ spokenLang: 'IT',
209
+ integrationID: 'ee1c3d98-7819-4506-ba28-818e79ba86cb',
210
+ };
211
+
212
+ export const WithFunctionalities = Template.bind({});
213
+ WithFunctionalities.args = {
214
+ memoriName: 'test324',
215
+ ownerUserName: 'andrea.patini',
216
+ memoriID: 'd661a9ca-e907-4396-a986-5095ccd582d6',
217
+ ownerUserID: '69fcc557-9cb6-4e5e-b8ab-140cff975492',
218
+ tenantID: 'localhost:3000',
219
+ engineURL: 'http://localhost:7778/memori/v2',
220
+ apiURL: 'http://localhost:7778/api/v2',
221
+ baseURL: 'http://localhost:3000',
222
+ layout: 'FULLPAGE',
223
+ uiLang: 'IT',
224
+ spokenLang: 'IT',
225
+ integrationID: 'ee1c3d98-7819-4506-ba28-818e79ba86cb',
226
+ };
@@ -87,6 +87,7 @@
87
87
  "errorFetchingSession": "Fehler beim Laden der Sitzung",
88
88
  "errorGettingReferralURL": "Fehler beim Laden des Referrals",
89
89
  "errorReopeningSession": "Fehler beim erneuten Öffnen der Sitzung",
90
+ "sessionExpiredReopening": "Sitzung abgelaufen, Sitzung wird neu geöffnet",
90
91
  "ageVerification": "Altersüberprüfung",
91
92
  "ageVerificationText": "Um mit diesem Zwilling interagieren zu können, müssen Sie mindestens sein {{minAge}} Jahre alt.",
92
93
  "ageVerificationSuccess": "Altersprüfung bestanden mit Erfolg.",
@@ -89,6 +89,7 @@
89
89
  "errorFetchingSession": "Error during session loading",
90
90
  "errorGettingReferralURL": "Error during referral loading",
91
91
  "errorReopeningSession": "Error during session reopening",
92
+ "sessionExpiredReopening": "Session expired, reopening session",
92
93
  "ageVerification": "Age verification",
93
94
  "ageVerificationText": "To interact with this agent, you must be at least {{minAge}} years old.",
94
95
  "ageVerificationSuccess": "Age verified with success.",
@@ -87,6 +87,7 @@
87
87
  "errorFetchingSession": "Error durante el cargamento de la sesión",
88
88
  "errorGettingReferralURL": "Error durante el cargamento del référent",
89
89
  "errorReopeningSession": "Error durante el re-abrir la sesión",
90
+ "sessionExpiredReopening": "Sesión expirada, reabriendo sesión",
90
91
  "ageVerification": "Verificación de edad",
91
92
  "ageVerificationText": "Para interactuar con este Gemelo, debes tener al menos {{minAge}} años.",
92
93
  "ageVerificationSuccess": "Edad verificada con éxito.",
@@ -86,6 +86,7 @@
86
86
  "errorFetchingSession": "Erreur lors du chargement de la session",
87
87
  "errorGettingReferralURL": "Erreur lors du chargement du référent",
88
88
  "errorReopeningSession": "Erreur lors de la re-ouverture de la session",
89
+ "sessionExpiredReopening": "Session expirée, réouverture en cours",
89
90
  "ageVerification": "Vérification de l'âge",
90
91
  "ageVerificationText": "Pour interagir avec ce Agent, vous devez être au minimum {{minAge}} ans.",
91
92
  "ageVerificationSuccess": "Âge vérifié avec succès.",
@@ -90,6 +90,7 @@
90
90
  "errorFetchingSession": "Errore durante il caricamento della sessione",
91
91
  "errorGettingReferralURL": "Errore durante il caricamento del riferimento",
92
92
  "errorReopeningSession": "Errore durante il riapertura della sessione",
93
+ "sessionExpiredReopening": "Sessione scaduta, riapertura in corso",
93
94
  "ageVerification": "Verifica dell'età",
94
95
  "ageVerificationText": "Per interagire con questo agente, devi aver almeno {{minAge}} anni.",
95
96
  "ageVerificationSuccess": "Età verificata con successo.",
package/src/styles.css CHANGED
@@ -81,13 +81,10 @@
81
81
  clip: rect(0, 0, 0, 0);
82
82
  white-space: nowrap;
83
83
  }
84
-
85
- /* --- 5. Light mode: colori superficie (prima del base così memori-client #root < body.sb-show-main #root) --- */
86
- memori-client,
87
- memori-client #root,
88
- .memori-widget {
89
- --memori-surface-contrast: white;
90
- --memori-surface-contrast-inverse: black;
84
+ .memori.memori-widget.memori-layout-chat,
85
+ .memori.memori-widget.memori-layout-fullpage,
86
+ .memori.memori-widget.memori-layout-zoomed-full-body {
87
+ contain: layout;
91
88
  }
92
89
 
93
90
  /* --- 6. Base: brand e tema di default (in layer così integration può sovrascrivere --memori-primary) --- */
@@ -0,0 +1,32 @@
1
+ import {
2
+ is3dAvatarWithUrl,
3
+ usesRpmAvatarView,
4
+ } from './integration';
5
+
6
+ describe('integration avatar helpers', () => {
7
+ const avatarURL = 'https://example.com/avatar.glb';
8
+
9
+ describe('is3dAvatarWithUrl', () => {
10
+ it('returns true for avatar-configurator with avatarURL', () => {
11
+ expect(is3dAvatarWithUrl('avatar-configurator', avatarURL)).toBe(true);
12
+ });
13
+
14
+ it('returns false for avatar-configurator without avatarURL', () => {
15
+ expect(is3dAvatarWithUrl('avatar-configurator', undefined)).toBe(false);
16
+ });
17
+ });
18
+
19
+ describe('usesRpmAvatarView', () => {
20
+ it('returns true for avatar-configurator', () => {
21
+ expect(usesRpmAvatarView('avatar-configurator')).toBe(true);
22
+ });
23
+
24
+ it('returns true for readyplayerme-full', () => {
25
+ expect(usesRpmAvatarView('readyplayerme-full')).toBe(true);
26
+ });
27
+
28
+ it('returns false for customglb', () => {
29
+ expect(usesRpmAvatarView('customglb')).toBe(false);
30
+ });
31
+ });
32
+ });
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Avatar mode stored in integration.customData.avatar.
3
+ * `avatar-configurator` is used in admin/editor UI; at runtime it renders like `readyplayerme-full`.
4
+ */
5
+ export type AvatarMode =
6
+ | 'readyplayerme'
7
+ | 'readyplayerme-full'
8
+ | 'customglb'
9
+ | 'customrpm'
10
+ | 'userAvatar'
11
+ | 'avatar-configurator';
12
+
13
+ export const is3dAvatarWithUrl = (
14
+ avatar: AvatarMode | string | undefined,
15
+ avatarURL: string | undefined
16
+ ): boolean =>
17
+ !!avatarURL &&
18
+ (avatar === 'readyplayerme' ||
19
+ avatar === 'readyplayerme-full' ||
20
+ avatar === 'customglb' ||
21
+ avatar === 'customrpm' ||
22
+ avatar === 'avatar-configurator');
23
+
24
+ /** RPM-based 3D avatar view (ContainerAvatarView), including avatar-configurator exports. */
25
+ export const usesRpmAvatarView = (
26
+ avatar: AvatarMode | string | undefined
27
+ ): boolean =>
28
+ avatar === 'readyplayerme' ||
29
+ avatar === 'readyplayerme-full' ||
30
+ avatar === 'customrpm' ||
31
+ avatar === 'avatar-configurator';
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  // This file is auto-generated. Do not edit manually.
2
- export const version = '9.0.0-alpha.4';
2
+ export const version = '9.0.0-alpha.6';