@memori.ai/memori-react 6.8.1 → 6.8.4

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 (1197) hide show
  1. package/CHANGELOG.md +1918 -0
  2. package/README.md +89 -48
  3. package/dist/I18nWrapper.js +3 -47
  4. package/dist/I18nWrapper.js.map +1 -1
  5. package/dist/components/AccountForm/AccountForm.d.ts +4 -2
  6. package/dist/components/AccountForm/AccountForm.js +2 -4
  7. package/dist/components/AccountForm/AccountForm.js.map +1 -1
  8. package/dist/components/AgeVerificationModal/AgeVerificationModal.css +1 -1
  9. package/dist/components/AgeVerificationModal/AgeVerificationModal.d.ts +1 -0
  10. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +1 -1
  11. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  12. package/dist/components/AttachmentLinkModal/AttachmentLinkModal.d.ts +1 -0
  13. package/dist/components/Auth/Auth.d.ts +1 -0
  14. package/dist/components/Avatar/Avatar.css +2 -2
  15. package/dist/components/Avatar/Avatar.d.ts +7 -0
  16. package/dist/components/Avatar/Avatar.js +70 -60
  17. package/dist/components/Avatar/Avatar.js.map +1 -1
  18. package/dist/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.d.ts +7 -0
  19. package/dist/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.js +62 -0
  20. package/dist/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.js.map +1 -0
  21. package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.d.ts +22 -0
  22. package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js +41 -0
  23. package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js.map +1 -0
  24. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.d.ts +18 -0
  25. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +185 -0
  26. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -0
  27. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/types.d.ts +39 -0
  28. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/types.js +10 -0
  29. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/types.js.map +1 -0
  30. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.d.ts +65 -0
  31. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.js +747 -0
  32. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.js.map +1 -0
  33. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarPositionController.d.ts +19 -0
  34. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarPositionController.js +60 -0
  35. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarPositionController.js.map +1 -0
  36. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.d.ts +24 -0
  37. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +133 -0
  38. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -0
  39. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controls.d.ts +26 -0
  40. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controls.js +59 -0
  41. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controls.js.map +1 -0
  42. package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.d.ts +15 -0
  43. package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js +83 -0
  44. package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js.map +1 -0
  45. package/dist/components/{AvatarView → Avatar/AvatarView/AvatarComponent}/components/loader.d.ts +1 -0
  46. package/dist/components/{AvatarView → Avatar/AvatarView/AvatarComponent}/components/loader.js +1 -1
  47. package/dist/components/Avatar/AvatarView/AvatarComponent/components/loader.js.map +1 -0
  48. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +35 -0
  49. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js +99 -0
  50. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -0
  51. package/dist/components/Avatar/AvatarView/AvatarComponent/lights/Lights.d.ts +27 -0
  52. package/dist/components/Avatar/AvatarView/AvatarComponent/lights/Lights.js +52 -0
  53. package/dist/components/Avatar/AvatarView/AvatarComponent/lights/Lights.js.map +1 -0
  54. package/dist/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.css +111 -0
  55. package/dist/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.d.ts +11 -0
  56. package/dist/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.js +110 -0
  57. package/dist/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.js.map +1 -0
  58. package/dist/components/Avatar/AvatarView/index.d.ts +30 -0
  59. package/dist/components/Avatar/AvatarView/index.js +68 -0
  60. package/dist/components/Avatar/AvatarView/index.js.map +1 -0
  61. package/dist/components/Avatar/AvatarView/utils/hideHands.d.ts +2 -0
  62. package/dist/components/Avatar/AvatarView/utils/hideHands.js +14 -0
  63. package/dist/components/Avatar/AvatarView/utils/hideHands.js.map +1 -0
  64. package/dist/components/Avatar/AvatarView/utils/useEyeBlink.d.ts +16 -0
  65. package/dist/components/Avatar/AvatarView/utils/useEyeBlink.js +71 -0
  66. package/dist/components/Avatar/AvatarView/utils/useEyeBlink.js.map +1 -0
  67. package/dist/components/Avatar/AvatarView/utils/useHeadMovement.js.map +1 -0
  68. package/dist/components/Avatar/AvatarView/utils/useLoadingMorphAnim.js.map +1 -0
  69. package/dist/components/Avatar/AvatarView/utils/useMouthAnimation.d.ts +16 -0
  70. package/dist/components/Avatar/AvatarView/utils/useMouthAnimation.js +59 -0
  71. package/dist/components/Avatar/AvatarView/utils/useMouthAnimation.js.map +1 -0
  72. package/dist/components/Avatar/AvatarView/utils/useSmile.js +28 -0
  73. package/dist/components/Avatar/AvatarView/utils/useSmile.js.map +1 -0
  74. package/dist/components/Avatar/AvatarView/utils/utils.js.map +1 -0
  75. package/dist/components/Blob/Blob.d.ts +1 -0
  76. package/dist/components/BlockedMemoriBadge/BlockedMemoriBadge.d.ts +1 -0
  77. package/dist/components/Chat/Chat.d.ts +15 -7
  78. package/dist/components/Chat/Chat.js +49 -30
  79. package/dist/components/Chat/Chat.js.map +1 -1
  80. package/dist/components/ChatBubble/ChatBubble.css +91 -14
  81. package/dist/components/ChatBubble/ChatBubble.d.ts +14 -0
  82. package/dist/components/ChatBubble/ChatBubble.js +92 -67
  83. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  84. package/dist/components/ChatHistoryDrawer/ChatHistory.css +414 -0
  85. package/dist/components/ChatHistoryDrawer/ChatHistory.d.ts +20 -0
  86. package/dist/components/ChatHistoryDrawer/ChatHistory.js +630 -0
  87. package/dist/components/ChatHistoryDrawer/ChatHistory.js.map +1 -0
  88. package/dist/components/ChatInputs/ChatInputs.d.ts +9 -3
  89. package/dist/components/ChatInputs/ChatInputs.js +47 -6
  90. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  91. package/dist/components/ChatTextArea/ChatTextArea.css +9 -5
  92. package/dist/components/ChatTextArea/ChatTextArea.js +1 -1
  93. package/dist/components/ChatTextArea/ChatTextArea.js.map +1 -1
  94. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.css +35 -17
  95. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.d.ts +5 -3
  96. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js +142 -28
  97. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  98. package/dist/components/CustomGLBModelViewer/ModelViewer.d.ts +1 -0
  99. package/dist/components/ExpertsDrawer/ExpertsDrawer.d.ts +1 -0
  100. package/dist/components/ExpertsDrawer/ExpertsDrawer.js +2 -2
  101. package/dist/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
  102. package/dist/components/FeedbackButtons/FeedbackButtons.d.ts +1 -0
  103. package/dist/components/FilePreview/FilePreview.css +184 -0
  104. package/dist/components/FilePreview/FilePreview.d.ts +9 -0
  105. package/dist/components/FilePreview/FilePreview.js +74 -0
  106. package/dist/components/FilePreview/FilePreview.js.map +1 -0
  107. package/dist/components/Header/Header.css +3 -3
  108. package/dist/components/Header/Header.d.ts +5 -1
  109. package/dist/components/Header/Header.js +27 -13
  110. package/dist/components/Header/Header.js.map +1 -1
  111. package/dist/components/KnownFacts/KnownFacts.d.ts +4 -2
  112. package/dist/components/KnownFacts/KnownFacts.js +3 -5
  113. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  114. package/dist/components/LoginDrawer/LoginDrawer.css +302 -0
  115. package/dist/components/LoginDrawer/LoginDrawer.d.ts +4 -2
  116. package/dist/components/LoginDrawer/LoginDrawer.js +9 -11
  117. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  118. package/dist/components/MediaWidget/LinkItemWidget.css +10 -0
  119. package/dist/components/MediaWidget/LinkItemWidget.d.ts +1 -0
  120. package/dist/components/MediaWidget/LinkItemWidget.js +5 -2
  121. package/dist/components/MediaWidget/LinkItemWidget.js.map +1 -1
  122. package/dist/components/MediaWidget/MediaItemWidget.css +153 -3
  123. package/dist/components/MediaWidget/MediaItemWidget.d.ts +7 -2
  124. package/dist/components/MediaWidget/MediaItemWidget.js +89 -37
  125. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  126. package/dist/components/MediaWidget/MediaWidget.d.ts +4 -1
  127. package/dist/components/MediaWidget/MediaWidget.js +2 -2
  128. package/dist/components/MediaWidget/MediaWidget.js.map +1 -1
  129. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.css +163 -0
  130. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.d.ts +12 -0
  131. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js +133 -0
  132. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js.map +1 -0
  133. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.d.ts +4 -0
  134. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js +286 -0
  135. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js.map +1 -0
  136. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.d.ts +6 -0
  137. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js +40 -0
  138. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js.map +1 -0
  139. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/hooks/useCopyArtifact.d.ts +6 -0
  140. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/hooks/useCopyArtifact.js +492 -0
  141. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/hooks/useCopyArtifact.js.map +1 -0
  142. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/index.d.ts +5 -0
  143. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/index.js +14 -0
  144. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/index.js.map +1 -0
  145. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +489 -0
  146. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/test/CopyButtonTest.d.ts +3 -0
  147. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/test/CopyButtonTest.js +64 -0
  148. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/test/CopyButtonTest.js.map +1 -0
  149. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/types.d.ts +61 -0
  150. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/types.js +3 -0
  151. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/types.js.map +1 -0
  152. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/utils/PDFExporter.d.ts +15 -0
  153. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/utils/PDFExporter.js +352 -0
  154. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/utils/PDFExporter.js.map +1 -0
  155. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +1059 -0
  156. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.d.ts +5 -0
  157. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +167 -0
  158. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -0
  159. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +150 -0
  160. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.d.ts +9 -0
  161. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.js +35 -0
  162. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.js.map +1 -0
  163. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.css +253 -0
  164. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.d.ts +8 -0
  165. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +104 -0
  166. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -0
  167. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +346 -0
  168. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.d.ts +7 -0
  169. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js +89 -0
  170. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js.map +1 -0
  171. package/dist/components/MemoriArtifactSystem/context/ArtifactContext.d.ts +13 -0
  172. package/dist/components/MemoriArtifactSystem/context/ArtifactContext.js +55 -0
  173. package/dist/components/MemoriArtifactSystem/context/ArtifactContext.js.map +1 -0
  174. package/dist/components/MemoriArtifactSystem/types/artifact.types.d.ts +14 -0
  175. package/dist/components/MemoriArtifactSystem/types/artifact.types.js +3 -0
  176. package/dist/components/MemoriArtifactSystem/types/artifact.types.js.map +1 -0
  177. package/dist/components/MemoriWidget/MemoriWidget.css +10 -4
  178. package/dist/components/MemoriWidget/MemoriWidget.d.ts +29 -11
  179. package/dist/components/MemoriWidget/MemoriWidget.js +763 -1051
  180. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  181. package/dist/components/MicrophoneButton/MicrophoneButton.d.ts +1 -0
  182. package/dist/components/MicrophoneButton/MicrophoneButton.js +1 -1
  183. package/dist/components/MicrophoneButton/MicrophoneButton.js.map +1 -1
  184. package/dist/components/PositionDrawer/PositionDrawer.d.ts +1 -0
  185. package/dist/components/PoweredBy/PoweredBy.d.ts +1 -0
  186. package/dist/components/SendOnEnterMenu/SendOnEnterMenu.css +3 -3
  187. package/dist/components/SettingsDrawer/SettingsDrawer.css +9 -2
  188. package/dist/components/SettingsDrawer/SettingsDrawer.d.ts +8 -1
  189. package/dist/components/SettingsDrawer/SettingsDrawer.js +15 -6
  190. package/dist/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  191. package/dist/components/ShareButton/ShareButton.css +6 -0
  192. package/dist/components/ShareButton/ShareButton.d.ts +3 -1
  193. package/dist/components/ShareButton/ShareButton.js +14 -3
  194. package/dist/components/ShareButton/ShareButton.js.map +1 -1
  195. package/dist/components/SignupForm/SignupForm.d.ts +4 -2
  196. package/dist/components/SignupForm/SignupForm.js +6 -8
  197. package/dist/components/SignupForm/SignupForm.js.map +1 -1
  198. package/dist/components/Snippet/Snippet.d.ts +2 -2
  199. package/dist/components/Snippet/Snippet.js +36 -25
  200. package/dist/components/Snippet/Snippet.js.map +1 -1
  201. package/dist/components/StartPanel/StartPanel.css +34 -8
  202. package/dist/components/StartPanel/StartPanel.d.ts +8 -3
  203. package/dist/components/StartPanel/StartPanel.js +26 -15
  204. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  205. package/dist/components/Typing/Typing.d.ts +1 -0
  206. package/dist/components/Typing/Typing.js +49 -47
  207. package/dist/components/Typing/Typing.js.map +1 -1
  208. package/dist/components/UploadButton/UploadButton.css +544 -0
  209. package/dist/components/UploadButton/UploadButton.d.ts +19 -0
  210. package/dist/components/UploadButton/UploadButton.js +226 -0
  211. package/dist/components/UploadButton/UploadButton.js.map +1 -0
  212. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.d.ts +31 -0
  213. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +244 -0
  214. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -0
  215. package/dist/components/UploadButton/UploadImages/UploadImages.d.ts +20 -0
  216. package/dist/components/UploadButton/UploadImages/UploadImages.js +172 -0
  217. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -0
  218. package/dist/components/UploadMenu/UploadMenu.css +3 -3
  219. package/dist/components/VenueWidget/VenueWidget.css +7 -0
  220. package/dist/components/VenueWidget/VenueWidget.d.ts +1 -0
  221. package/dist/components/VenueWidget/VenueWidget.js +1 -1
  222. package/dist/components/VenueWidget/VenueWidget.js.map +1 -1
  223. package/dist/components/WhyThisAnswer/WhyThisAnswer.css +43 -0
  224. package/dist/components/WhyThisAnswer/WhyThisAnswer.d.ts +4 -2
  225. package/dist/components/WhyThisAnswer/WhyThisAnswer.js +5 -6
  226. package/dist/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  227. package/dist/components/icons/AI.d.ts +1 -0
  228. package/dist/components/icons/Alert.d.ts +6 -0
  229. package/dist/components/icons/Alert.js +6 -0
  230. package/dist/components/icons/Alert.js.map +1 -0
  231. package/dist/components/icons/ArrowUp.d.ts +6 -0
  232. package/dist/components/icons/ArrowUp.js +6 -0
  233. package/dist/components/icons/ArrowUp.js.map +1 -0
  234. package/dist/components/icons/Bug.d.ts +6 -0
  235. package/dist/components/icons/Bug.js +6 -0
  236. package/dist/components/icons/Bug.js.map +1 -0
  237. package/dist/components/icons/Chat.d.ts +6 -0
  238. package/dist/components/icons/Chat.js +6 -0
  239. package/dist/components/icons/Chat.js.map +1 -0
  240. package/dist/components/icons/ChevronDown.d.ts +6 -0
  241. package/dist/components/icons/ChevronDown.js +6 -0
  242. package/dist/components/icons/ChevronDown.js.map +1 -0
  243. package/dist/components/icons/ChevronLeft.d.ts +1 -0
  244. package/dist/components/icons/ChevronRight.d.ts +1 -0
  245. package/dist/components/icons/ChevronUp.d.ts +6 -0
  246. package/dist/components/icons/ChevronUp.js +6 -0
  247. package/dist/components/icons/ChevronUp.js.map +1 -0
  248. package/dist/components/icons/Clear.d.ts +1 -0
  249. package/dist/components/icons/Close.d.ts +3 -1
  250. package/dist/components/icons/Close.js +1 -1
  251. package/dist/components/icons/Close.js.map +1 -1
  252. package/dist/components/icons/Code.d.ts +6 -0
  253. package/dist/components/icons/Code.js +6 -0
  254. package/dist/components/icons/Code.js.map +1 -0
  255. package/dist/components/icons/Copy.d.ts +1 -0
  256. package/dist/components/icons/Copy.js +1 -1
  257. package/dist/components/icons/Copy.js.map +1 -1
  258. package/dist/components/icons/DeepThought.d.ts +1 -0
  259. package/dist/components/icons/Delete.d.ts +1 -0
  260. package/dist/components/icons/Document.d.ts +5 -0
  261. package/dist/components/icons/Document.js +10 -0
  262. package/dist/components/icons/Document.js.map +1 -0
  263. package/dist/components/icons/Download.d.ts +1 -0
  264. package/dist/components/icons/Edit.d.ts +1 -0
  265. package/dist/components/icons/Expand.d.ts +1 -0
  266. package/dist/components/icons/Eye.d.ts +1 -0
  267. package/dist/components/icons/EyeInvisible.d.ts +1 -0
  268. package/dist/components/icons/Facebook.d.ts +1 -0
  269. package/dist/components/icons/Feedback.d.ts +1 -0
  270. package/dist/components/icons/File.d.ts +1 -0
  271. package/dist/components/icons/FileExcel.d.ts +1 -0
  272. package/dist/components/icons/FilePdf.d.ts +1 -0
  273. package/dist/components/icons/FileWord.d.ts +1 -0
  274. package/dist/components/icons/Fullscreen.d.ts +1 -0
  275. package/dist/components/icons/FullscreenExit.d.ts +1 -0
  276. package/dist/components/icons/Group.d.ts +1 -0
  277. package/dist/components/icons/History.d.ts +7 -0
  278. package/dist/components/icons/History.js +6 -0
  279. package/dist/components/icons/History.js.map +1 -0
  280. package/dist/components/icons/Image.d.ts +4 -0
  281. package/dist/components/icons/Image.js +9 -0
  282. package/dist/components/icons/Image.js.map +1 -0
  283. package/dist/components/icons/Info.d.ts +6 -0
  284. package/dist/components/icons/Info.js +6 -0
  285. package/dist/components/icons/Info.js.map +1 -0
  286. package/dist/components/icons/Link.d.ts +1 -0
  287. package/dist/components/icons/Linkedin.d.ts +1 -0
  288. package/dist/components/icons/Loading.d.ts +1 -0
  289. package/dist/components/icons/Mail.d.ts +1 -0
  290. package/dist/components/icons/MapMarker.d.ts +1 -0
  291. package/dist/components/icons/MenuHorizontal.d.ts +7 -0
  292. package/dist/components/icons/MenuHorizontal.js +6 -0
  293. package/dist/components/icons/MenuHorizontal.js.map +1 -0
  294. package/dist/components/icons/MenuVertical.d.ts +7 -0
  295. package/dist/components/icons/MenuVertical.js +6 -0
  296. package/dist/components/icons/MenuVertical.js.map +1 -0
  297. package/dist/components/icons/Message.d.ts +1 -0
  298. package/dist/components/icons/Microphone.d.ts +1 -0
  299. package/dist/components/icons/Minus.d.ts +1 -0
  300. package/dist/components/icons/MinusCircle.d.ts +1 -0
  301. package/dist/components/icons/PaperClip.d.ts +1 -0
  302. package/dist/components/icons/Picture.d.ts +1 -0
  303. package/dist/components/icons/Plus.d.ts +1 -0
  304. package/dist/components/icons/Preview.d.ts +4 -0
  305. package/dist/components/icons/Preview.js +9 -0
  306. package/dist/components/icons/Preview.js.map +1 -0
  307. package/dist/components/icons/Print.d.ts +6 -0
  308. package/dist/components/icons/Print.js +6 -0
  309. package/dist/components/icons/Print.js.map +1 -0
  310. package/dist/components/icons/QuestionHelp.d.ts +1 -0
  311. package/dist/components/icons/Refresh.d.ts +1 -0
  312. package/dist/components/icons/SelectIcon.d.ts +1 -0
  313. package/dist/components/icons/Send.d.ts +1 -0
  314. package/dist/components/icons/Setting.d.ts +1 -0
  315. package/dist/components/icons/Share.d.ts +1 -0
  316. package/dist/components/icons/Sound.d.ts +1 -0
  317. package/dist/components/icons/SoundDeactivated.d.ts +1 -0
  318. package/dist/components/icons/Telegram.d.ts +1 -0
  319. package/dist/components/icons/ThumbDown.d.ts +1 -0
  320. package/dist/components/icons/ThumbUp.d.ts +1 -0
  321. package/dist/components/icons/Translation.d.ts +1 -0
  322. package/dist/components/icons/Twitter.d.ts +1 -0
  323. package/dist/components/icons/Upload.d.ts +4 -0
  324. package/dist/components/icons/Upload.js +9 -0
  325. package/dist/components/icons/Upload.js.map +1 -0
  326. package/dist/components/icons/User.d.ts +1 -0
  327. package/dist/components/icons/Warning.d.ts +1 -0
  328. package/dist/components/icons/Warning.js +1 -1
  329. package/dist/components/icons/Warning.js.map +1 -1
  330. package/dist/components/icons/WhatsApp.d.ts +1 -0
  331. package/dist/components/layouts/Chat.js +9 -1
  332. package/dist/components/layouts/Chat.js.map +1 -1
  333. package/dist/components/layouts/FullPage.js +10 -1
  334. package/dist/components/layouts/FullPage.js.map +1 -1
  335. package/dist/components/layouts/HiddenChat.d.ts +4 -0
  336. package/dist/components/layouts/HiddenChat.js +147 -0
  337. package/dist/components/layouts/HiddenChat.js.map +1 -0
  338. package/dist/components/layouts/Totem.js +1 -1
  339. package/dist/components/layouts/Totem.js.map +1 -1
  340. package/dist/components/layouts/WebsiteAssistant.js +2 -2
  341. package/dist/components/layouts/WebsiteAssistant.js.map +1 -1
  342. package/dist/components/layouts/ZoomedFullBody.d.ts +4 -0
  343. package/dist/components/layouts/ZoomedFullBody.js +17 -0
  344. package/dist/components/layouts/ZoomedFullBody.js.map +1 -0
  345. package/dist/components/layouts/chat.css +358 -19
  346. package/dist/components/layouts/hidden-chat.css +254 -0
  347. package/dist/components/layouts/totem.css +19 -10
  348. package/dist/components/layouts/website-assistant.css +2 -2
  349. package/dist/components/layouts/zoomed-full-body.css +18 -0
  350. package/dist/components/ui/Alert.css +93 -0
  351. package/dist/components/ui/Alert.d.ts +18 -0
  352. package/dist/components/ui/Alert.js +42 -0
  353. package/dist/components/ui/Alert.js.map +1 -0
  354. package/dist/components/ui/Button.css +8 -2
  355. package/dist/components/ui/Button.d.ts +1 -0
  356. package/dist/components/ui/Button.js +2 -1
  357. package/dist/components/ui/Button.js.map +1 -1
  358. package/dist/components/ui/Card.css +5 -0
  359. package/dist/components/ui/Card.d.ts +1 -0
  360. package/dist/components/ui/Card.js +2 -1
  361. package/dist/components/ui/Card.js.map +1 -1
  362. package/dist/components/ui/ConfirmDialog.css +42 -0
  363. package/dist/components/ui/ConfirmDialog.d.ts +11 -0
  364. package/dist/components/ui/ConfirmDialog.js +12 -0
  365. package/dist/components/ui/ConfirmDialog.js.map +1 -0
  366. package/dist/components/ui/Drawer.css +121 -96
  367. package/dist/components/ui/Drawer.d.ts +17 -6
  368. package/dist/components/ui/Drawer.js +44 -13
  369. package/dist/components/ui/Drawer.js.map +1 -1
  370. package/dist/components/ui/Expandable.d.ts +3 -2
  371. package/dist/components/ui/Expandable.js +35 -20
  372. package/dist/components/ui/Expandable.js.map +1 -1
  373. package/dist/components/ui/Select.d.ts +1 -0
  374. package/dist/components/ui/Slider.css +192 -0
  375. package/dist/components/ui/Slider.d.ts +12 -0
  376. package/dist/components/ui/Slider.js +78 -0
  377. package/dist/components/ui/Slider.js.map +1 -0
  378. package/dist/components/ui/Table.css +15 -2
  379. package/dist/context/visemeContext.d.ts +24 -0
  380. package/dist/context/visemeContext.js +192 -0
  381. package/dist/context/visemeContext.js.map +1 -0
  382. package/dist/helpers/configuration.js +0 -1
  383. package/dist/helpers/configuration.js.map +1 -1
  384. package/dist/helpers/constants.d.ts +6 -0
  385. package/dist/helpers/constants.js +7 -1
  386. package/dist/helpers/constants.js.map +1 -1
  387. package/dist/helpers/error.js +53 -6
  388. package/dist/helpers/error.js.map +1 -1
  389. package/dist/helpers/markedExtendedTables.js +1 -1
  390. package/dist/helpers/markedExtendedTables.js.map +1 -1
  391. package/dist/helpers/message.d.ts +5 -0
  392. package/dist/helpers/message.js +98 -0
  393. package/dist/helpers/message.js.map +1 -0
  394. package/dist/helpers/sanitizer.d.ts +1 -0
  395. package/dist/helpers/sanitizer.js +9 -0
  396. package/dist/helpers/sanitizer.js.map +1 -0
  397. package/dist/helpers/statistics.d.ts +1 -12
  398. package/dist/helpers/statistics.js +1 -165
  399. package/dist/helpers/statistics.js.map +1 -1
  400. package/dist/helpers/stt/useSTT.d.ts +40 -0
  401. package/dist/helpers/stt/useSTT.js +527 -0
  402. package/dist/helpers/stt/useSTT.js.map +1 -0
  403. package/dist/helpers/translations.js +23 -4
  404. package/dist/helpers/translations.js.map +1 -1
  405. package/dist/helpers/tts/ttsVoiceUtility.d.ts +158 -0
  406. package/dist/helpers/tts/ttsVoiceUtility.js +192 -0
  407. package/dist/helpers/tts/ttsVoiceUtility.js.map +1 -0
  408. package/dist/helpers/tts/useTTS.d.ts +27 -0
  409. package/dist/helpers/tts/useTTS.js +297 -0
  410. package/dist/helpers/tts/useTTS.js.map +1 -0
  411. package/dist/helpers/utils.d.ts +40 -0
  412. package/dist/helpers/utils.js +157 -1
  413. package/dist/helpers/utils.js.map +1 -1
  414. package/dist/i18n.js +13 -1
  415. package/dist/i18n.js.map +1 -1
  416. package/dist/index.d.ts +14 -4
  417. package/dist/index.js +136 -84
  418. package/dist/index.js.map +1 -1
  419. package/dist/locales/de.json +593 -0
  420. package/dist/locales/en.json +250 -40
  421. package/dist/locales/es.json +593 -0
  422. package/dist/locales/fr.json +603 -0
  423. package/dist/locales/it.json +260 -48
  424. package/dist/styles.css +18 -2
  425. package/esm/I18nWrapper.js +4 -48
  426. package/esm/I18nWrapper.js.map +1 -1
  427. package/esm/components/AccountForm/AccountForm.d.ts +4 -2
  428. package/esm/components/AccountForm/AccountForm.js +2 -4
  429. package/esm/components/AccountForm/AccountForm.js.map +1 -1
  430. package/esm/components/AgeVerificationModal/AgeVerificationModal.css +1 -1
  431. package/esm/components/AgeVerificationModal/AgeVerificationModal.d.ts +1 -0
  432. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +1 -1
  433. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  434. package/esm/components/AttachmentLinkModal/AttachmentLinkModal.d.ts +1 -0
  435. package/esm/components/Auth/Auth.d.ts +1 -0
  436. package/esm/components/Avatar/Avatar.css +2 -2
  437. package/esm/components/Avatar/Avatar.d.ts +7 -0
  438. package/esm/components/Avatar/Avatar.js +72 -62
  439. package/esm/components/Avatar/Avatar.js.map +1 -1
  440. package/esm/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.d.ts +7 -0
  441. package/esm/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.js +60 -0
  442. package/esm/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.js.map +1 -0
  443. package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.d.ts +22 -0
  444. package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js +36 -0
  445. package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js.map +1 -0
  446. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.d.ts +18 -0
  447. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +180 -0
  448. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -0
  449. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/types.d.ts +39 -0
  450. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/types.js +7 -0
  451. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/types.js.map +1 -0
  452. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.d.ts +65 -0
  453. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.js +743 -0
  454. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.js.map +1 -0
  455. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarPositionController.d.ts +19 -0
  456. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarPositionController.js +56 -0
  457. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarPositionController.js.map +1 -0
  458. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.d.ts +24 -0
  459. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +129 -0
  460. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -0
  461. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controls.d.ts +26 -0
  462. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controls.js +56 -0
  463. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controls.js.map +1 -0
  464. package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.d.ts +15 -0
  465. package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js +79 -0
  466. package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js.map +1 -0
  467. package/esm/components/{AvatarView → Avatar/AvatarView/AvatarComponent}/components/loader.d.ts +1 -0
  468. package/esm/components/{AvatarView → Avatar/AvatarView/AvatarComponent}/components/loader.js +1 -1
  469. package/esm/components/Avatar/AvatarView/AvatarComponent/components/loader.js.map +1 -0
  470. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +35 -0
  471. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js +96 -0
  472. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -0
  473. package/esm/components/Avatar/AvatarView/AvatarComponent/lights/Lights.d.ts +27 -0
  474. package/esm/components/Avatar/AvatarView/AvatarComponent/lights/Lights.js +48 -0
  475. package/esm/components/Avatar/AvatarView/AvatarComponent/lights/Lights.js.map +1 -0
  476. package/esm/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.css +111 -0
  477. package/esm/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.d.ts +11 -0
  478. package/esm/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.js +107 -0
  479. package/esm/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.js.map +1 -0
  480. package/esm/components/Avatar/AvatarView/index.d.ts +30 -0
  481. package/esm/components/Avatar/AvatarView/index.js +64 -0
  482. package/esm/components/Avatar/AvatarView/index.js.map +1 -0
  483. package/esm/components/Avatar/AvatarView/utils/hideHands.d.ts +2 -0
  484. package/esm/components/Avatar/AvatarView/utils/hideHands.js +10 -0
  485. package/esm/components/Avatar/AvatarView/utils/hideHands.js.map +1 -0
  486. package/esm/components/Avatar/AvatarView/utils/useEyeBlink.d.ts +16 -0
  487. package/esm/components/Avatar/AvatarView/utils/useEyeBlink.js +67 -0
  488. package/esm/components/Avatar/AvatarView/utils/useEyeBlink.js.map +1 -0
  489. package/esm/components/Avatar/AvatarView/utils/useHeadMovement.js.map +1 -0
  490. package/esm/components/Avatar/AvatarView/utils/useLoadingMorphAnim.js.map +1 -0
  491. package/esm/components/Avatar/AvatarView/utils/useMouthAnimation.d.ts +16 -0
  492. package/esm/components/Avatar/AvatarView/utils/useMouthAnimation.js +55 -0
  493. package/esm/components/Avatar/AvatarView/utils/useMouthAnimation.js.map +1 -0
  494. package/esm/components/Avatar/AvatarView/utils/useSmile.js +25 -0
  495. package/esm/components/Avatar/AvatarView/utils/useSmile.js.map +1 -0
  496. package/esm/components/Avatar/AvatarView/utils/utils.js.map +1 -0
  497. package/esm/components/Blob/Blob.d.ts +1 -0
  498. package/esm/components/BlockedMemoriBadge/BlockedMemoriBadge.d.ts +1 -0
  499. package/esm/components/Chat/Chat.d.ts +15 -7
  500. package/esm/components/Chat/Chat.js +49 -30
  501. package/esm/components/Chat/Chat.js.map +1 -1
  502. package/esm/components/ChatBubble/ChatBubble.css +91 -14
  503. package/esm/components/ChatBubble/ChatBubble.d.ts +14 -0
  504. package/esm/components/ChatBubble/ChatBubble.js +93 -68
  505. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  506. package/esm/components/ChatHistoryDrawer/ChatHistory.css +414 -0
  507. package/esm/components/ChatHistoryDrawer/ChatHistory.d.ts +20 -0
  508. package/esm/components/ChatHistoryDrawer/ChatHistory.js +627 -0
  509. package/esm/components/ChatHistoryDrawer/ChatHistory.js.map +1 -0
  510. package/esm/components/ChatInputs/ChatInputs.d.ts +9 -3
  511. package/esm/components/ChatInputs/ChatInputs.js +48 -7
  512. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  513. package/esm/components/ChatTextArea/ChatTextArea.css +9 -5
  514. package/esm/components/ChatTextArea/ChatTextArea.js +1 -1
  515. package/esm/components/ChatTextArea/ChatTextArea.js.map +1 -1
  516. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.css +35 -17
  517. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.d.ts +5 -3
  518. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js +143 -29
  519. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  520. package/esm/components/CustomGLBModelViewer/ModelViewer.d.ts +1 -0
  521. package/esm/components/ExpertsDrawer/ExpertsDrawer.d.ts +1 -0
  522. package/esm/components/ExpertsDrawer/ExpertsDrawer.js +2 -2
  523. package/esm/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
  524. package/esm/components/FeedbackButtons/FeedbackButtons.d.ts +1 -0
  525. package/esm/components/FilePreview/FilePreview.css +184 -0
  526. package/esm/components/FilePreview/FilePreview.d.ts +9 -0
  527. package/esm/components/FilePreview/FilePreview.js +71 -0
  528. package/esm/components/FilePreview/FilePreview.js.map +1 -0
  529. package/esm/components/Header/Header.css +3 -3
  530. package/esm/components/Header/Header.d.ts +5 -1
  531. package/esm/components/Header/Header.js +27 -13
  532. package/esm/components/Header/Header.js.map +1 -1
  533. package/esm/components/KnownFacts/KnownFacts.d.ts +4 -2
  534. package/esm/components/KnownFacts/KnownFacts.js +3 -5
  535. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  536. package/esm/components/LoginDrawer/LoginDrawer.css +302 -0
  537. package/esm/components/LoginDrawer/LoginDrawer.d.ts +4 -2
  538. package/esm/components/LoginDrawer/LoginDrawer.js +9 -11
  539. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  540. package/esm/components/MediaWidget/LinkItemWidget.css +10 -0
  541. package/esm/components/MediaWidget/LinkItemWidget.d.ts +1 -0
  542. package/esm/components/MediaWidget/LinkItemWidget.js +5 -2
  543. package/esm/components/MediaWidget/LinkItemWidget.js.map +1 -1
  544. package/esm/components/MediaWidget/MediaItemWidget.css +153 -3
  545. package/esm/components/MediaWidget/MediaItemWidget.d.ts +7 -2
  546. package/esm/components/MediaWidget/MediaItemWidget.js +90 -38
  547. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  548. package/esm/components/MediaWidget/MediaWidget.d.ts +4 -1
  549. package/esm/components/MediaWidget/MediaWidget.js +2 -2
  550. package/esm/components/MediaWidget/MediaWidget.js.map +1 -1
  551. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.css +163 -0
  552. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.d.ts +12 -0
  553. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js +130 -0
  554. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js.map +1 -0
  555. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.d.ts +4 -0
  556. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js +283 -0
  557. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js.map +1 -0
  558. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.d.ts +6 -0
  559. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js +37 -0
  560. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.js.map +1 -0
  561. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/hooks/useCopyArtifact.d.ts +6 -0
  562. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/hooks/useCopyArtifact.js +487 -0
  563. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/hooks/useCopyArtifact.js.map +1 -0
  564. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/index.d.ts +5 -0
  565. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/index.js +6 -0
  566. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/index.js.map +1 -0
  567. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +489 -0
  568. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/test/CopyButtonTest.d.ts +3 -0
  569. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/test/CopyButtonTest.js +62 -0
  570. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/test/CopyButtonTest.js.map +1 -0
  571. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/types.d.ts +61 -0
  572. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/types.js +2 -0
  573. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/types.js.map +1 -0
  574. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/utils/PDFExporter.d.ts +15 -0
  575. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/utils/PDFExporter.js +348 -0
  576. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/utils/PDFExporter.js.map +1 -0
  577. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +1059 -0
  578. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.d.ts +5 -0
  579. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +164 -0
  580. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -0
  581. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +150 -0
  582. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.d.ts +9 -0
  583. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.js +32 -0
  584. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.js.map +1 -0
  585. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.css +253 -0
  586. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.d.ts +8 -0
  587. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +101 -0
  588. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -0
  589. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +346 -0
  590. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.d.ts +7 -0
  591. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js +86 -0
  592. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js.map +1 -0
  593. package/esm/components/MemoriArtifactSystem/context/ArtifactContext.d.ts +13 -0
  594. package/esm/components/MemoriArtifactSystem/context/ArtifactContext.js +50 -0
  595. package/esm/components/MemoriArtifactSystem/context/ArtifactContext.js.map +1 -0
  596. package/esm/components/MemoriArtifactSystem/types/artifact.types.d.ts +14 -0
  597. package/esm/components/MemoriArtifactSystem/types/artifact.types.js +2 -0
  598. package/esm/components/MemoriArtifactSystem/types/artifact.types.js.map +1 -0
  599. package/esm/components/MemoriWidget/MemoriWidget.css +10 -4
  600. package/esm/components/MemoriWidget/MemoriWidget.d.ts +29 -11
  601. package/esm/components/MemoriWidget/MemoriWidget.js +766 -1054
  602. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  603. package/esm/components/MicrophoneButton/MicrophoneButton.d.ts +1 -0
  604. package/esm/components/MicrophoneButton/MicrophoneButton.js +1 -1
  605. package/esm/components/MicrophoneButton/MicrophoneButton.js.map +1 -1
  606. package/esm/components/PositionDrawer/PositionDrawer.d.ts +1 -0
  607. package/esm/components/PoweredBy/PoweredBy.d.ts +1 -0
  608. package/esm/components/SendOnEnterMenu/SendOnEnterMenu.css +3 -3
  609. package/esm/components/SettingsDrawer/SettingsDrawer.css +9 -2
  610. package/esm/components/SettingsDrawer/SettingsDrawer.d.ts +8 -1
  611. package/esm/components/SettingsDrawer/SettingsDrawer.js +15 -6
  612. package/esm/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  613. package/esm/components/ShareButton/ShareButton.css +6 -0
  614. package/esm/components/ShareButton/ShareButton.d.ts +3 -1
  615. package/esm/components/ShareButton/ShareButton.js +14 -3
  616. package/esm/components/ShareButton/ShareButton.js.map +1 -1
  617. package/esm/components/SignupForm/SignupForm.d.ts +4 -2
  618. package/esm/components/SignupForm/SignupForm.js +6 -8
  619. package/esm/components/SignupForm/SignupForm.js.map +1 -1
  620. package/esm/components/Snippet/Snippet.d.ts +2 -2
  621. package/esm/components/Snippet/Snippet.js +36 -25
  622. package/esm/components/Snippet/Snippet.js.map +1 -1
  623. package/esm/components/StartPanel/StartPanel.css +34 -8
  624. package/esm/components/StartPanel/StartPanel.d.ts +8 -3
  625. package/esm/components/StartPanel/StartPanel.js +26 -15
  626. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  627. package/esm/components/Typing/Typing.d.ts +1 -0
  628. package/esm/components/Typing/Typing.js +49 -47
  629. package/esm/components/Typing/Typing.js.map +1 -1
  630. package/esm/components/UploadButton/UploadButton.css +544 -0
  631. package/esm/components/UploadButton/UploadButton.d.ts +19 -0
  632. package/esm/components/UploadButton/UploadButton.js +223 -0
  633. package/esm/components/UploadButton/UploadButton.js.map +1 -0
  634. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.d.ts +31 -0
  635. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +241 -0
  636. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -0
  637. package/esm/components/UploadButton/UploadImages/UploadImages.d.ts +20 -0
  638. package/esm/components/UploadButton/UploadImages/UploadImages.js +169 -0
  639. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -0
  640. package/esm/components/UploadMenu/UploadMenu.css +3 -3
  641. package/esm/components/VenueWidget/VenueWidget.css +7 -0
  642. package/esm/components/VenueWidget/VenueWidget.d.ts +1 -0
  643. package/esm/components/VenueWidget/VenueWidget.js +1 -1
  644. package/esm/components/VenueWidget/VenueWidget.js.map +1 -1
  645. package/esm/components/WhyThisAnswer/WhyThisAnswer.css +43 -0
  646. package/esm/components/WhyThisAnswer/WhyThisAnswer.d.ts +4 -2
  647. package/esm/components/WhyThisAnswer/WhyThisAnswer.js +5 -6
  648. package/esm/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  649. package/esm/components/icons/AI.d.ts +1 -0
  650. package/esm/components/icons/Alert.d.ts +6 -0
  651. package/esm/components/icons/Alert.js +4 -0
  652. package/esm/components/icons/Alert.js.map +1 -0
  653. package/esm/components/icons/ArrowUp.d.ts +6 -0
  654. package/esm/components/icons/ArrowUp.js +4 -0
  655. package/esm/components/icons/ArrowUp.js.map +1 -0
  656. package/esm/components/icons/Bug.d.ts +6 -0
  657. package/esm/components/icons/Bug.js +4 -0
  658. package/esm/components/icons/Bug.js.map +1 -0
  659. package/esm/components/icons/Chat.d.ts +6 -0
  660. package/esm/components/icons/Chat.js +4 -0
  661. package/esm/components/icons/Chat.js.map +1 -0
  662. package/esm/components/icons/ChevronDown.d.ts +6 -0
  663. package/esm/components/icons/ChevronDown.js +4 -0
  664. package/esm/components/icons/ChevronDown.js.map +1 -0
  665. package/esm/components/icons/ChevronLeft.d.ts +1 -0
  666. package/esm/components/icons/ChevronRight.d.ts +1 -0
  667. package/esm/components/icons/ChevronUp.d.ts +6 -0
  668. package/esm/components/icons/ChevronUp.js +4 -0
  669. package/esm/components/icons/ChevronUp.js.map +1 -0
  670. package/esm/components/icons/Clear.d.ts +1 -0
  671. package/esm/components/icons/Close.d.ts +3 -1
  672. package/esm/components/icons/Close.js +1 -1
  673. package/esm/components/icons/Close.js.map +1 -1
  674. package/esm/components/icons/Code.d.ts +6 -0
  675. package/esm/components/icons/Code.js +4 -0
  676. package/esm/components/icons/Code.js.map +1 -0
  677. package/esm/components/icons/Copy.d.ts +1 -0
  678. package/esm/components/icons/Copy.js +2 -2
  679. package/esm/components/icons/Copy.js.map +1 -1
  680. package/esm/components/icons/DeepThought.d.ts +1 -0
  681. package/esm/components/icons/Delete.d.ts +1 -0
  682. package/esm/components/icons/Document.d.ts +5 -0
  683. package/esm/components/icons/Document.js +6 -0
  684. package/esm/components/icons/Document.js.map +1 -0
  685. package/esm/components/icons/Download.d.ts +1 -0
  686. package/esm/components/icons/Edit.d.ts +1 -0
  687. package/esm/components/icons/Expand.d.ts +1 -0
  688. package/esm/components/icons/Eye.d.ts +1 -0
  689. package/esm/components/icons/EyeInvisible.d.ts +1 -0
  690. package/esm/components/icons/Facebook.d.ts +1 -0
  691. package/esm/components/icons/Feedback.d.ts +1 -0
  692. package/esm/components/icons/File.d.ts +1 -0
  693. package/esm/components/icons/FileExcel.d.ts +1 -0
  694. package/esm/components/icons/FilePdf.d.ts +1 -0
  695. package/esm/components/icons/FileWord.d.ts +1 -0
  696. package/esm/components/icons/Fullscreen.d.ts +1 -0
  697. package/esm/components/icons/FullscreenExit.d.ts +1 -0
  698. package/esm/components/icons/Group.d.ts +1 -0
  699. package/esm/components/icons/History.d.ts +7 -0
  700. package/esm/components/icons/History.js +4 -0
  701. package/esm/components/icons/History.js.map +1 -0
  702. package/esm/components/icons/Image.d.ts +4 -0
  703. package/esm/components/icons/Image.js +5 -0
  704. package/esm/components/icons/Image.js.map +1 -0
  705. package/esm/components/icons/Info.d.ts +6 -0
  706. package/esm/components/icons/Info.js +4 -0
  707. package/esm/components/icons/Info.js.map +1 -0
  708. package/esm/components/icons/Link.d.ts +1 -0
  709. package/esm/components/icons/Linkedin.d.ts +1 -0
  710. package/esm/components/icons/Loading.d.ts +1 -0
  711. package/esm/components/icons/Mail.d.ts +1 -0
  712. package/esm/components/icons/MapMarker.d.ts +1 -0
  713. package/esm/components/icons/MenuHorizontal.d.ts +7 -0
  714. package/esm/components/icons/MenuHorizontal.js +4 -0
  715. package/esm/components/icons/MenuHorizontal.js.map +1 -0
  716. package/esm/components/icons/MenuVertical.d.ts +7 -0
  717. package/esm/components/icons/MenuVertical.js +4 -0
  718. package/esm/components/icons/MenuVertical.js.map +1 -0
  719. package/esm/components/icons/Message.d.ts +1 -0
  720. package/esm/components/icons/Microphone.d.ts +1 -0
  721. package/esm/components/icons/Minus.d.ts +1 -0
  722. package/esm/components/icons/MinusCircle.d.ts +1 -0
  723. package/esm/components/icons/PaperClip.d.ts +1 -0
  724. package/esm/components/icons/Picture.d.ts +1 -0
  725. package/esm/components/icons/Plus.d.ts +1 -0
  726. package/esm/components/icons/Preview.d.ts +4 -0
  727. package/esm/components/icons/Preview.js +5 -0
  728. package/esm/components/icons/Preview.js.map +1 -0
  729. package/esm/components/icons/Print.d.ts +6 -0
  730. package/esm/components/icons/Print.js +4 -0
  731. package/esm/components/icons/Print.js.map +1 -0
  732. package/esm/components/icons/QuestionHelp.d.ts +1 -0
  733. package/esm/components/icons/Refresh.d.ts +1 -0
  734. package/esm/components/icons/SelectIcon.d.ts +1 -0
  735. package/esm/components/icons/Send.d.ts +1 -0
  736. package/esm/components/icons/Setting.d.ts +1 -0
  737. package/esm/components/icons/Share.d.ts +1 -0
  738. package/esm/components/icons/Sound.d.ts +1 -0
  739. package/esm/components/icons/SoundDeactivated.d.ts +1 -0
  740. package/esm/components/icons/Telegram.d.ts +1 -0
  741. package/esm/components/icons/ThumbDown.d.ts +1 -0
  742. package/esm/components/icons/ThumbUp.d.ts +1 -0
  743. package/esm/components/icons/Translation.d.ts +1 -0
  744. package/esm/components/icons/Twitter.d.ts +1 -0
  745. package/esm/components/icons/Upload.d.ts +4 -0
  746. package/esm/components/icons/Upload.js +5 -0
  747. package/esm/components/icons/Upload.js.map +1 -0
  748. package/esm/components/icons/User.d.ts +1 -0
  749. package/esm/components/icons/Warning.d.ts +1 -0
  750. package/esm/components/icons/Warning.js +1 -1
  751. package/esm/components/icons/Warning.js.map +1 -1
  752. package/esm/components/icons/WhatsApp.d.ts +1 -0
  753. package/esm/components/layouts/Chat.js +9 -1
  754. package/esm/components/layouts/Chat.js.map +1 -1
  755. package/esm/components/layouts/FullPage.js +10 -1
  756. package/esm/components/layouts/FullPage.js.map +1 -1
  757. package/esm/components/layouts/HiddenChat.d.ts +4 -0
  758. package/esm/components/layouts/HiddenChat.js +144 -0
  759. package/esm/components/layouts/HiddenChat.js.map +1 -0
  760. package/esm/components/layouts/Totem.js +1 -1
  761. package/esm/components/layouts/Totem.js.map +1 -1
  762. package/esm/components/layouts/WebsiteAssistant.js +2 -2
  763. package/esm/components/layouts/WebsiteAssistant.js.map +1 -1
  764. package/esm/components/layouts/ZoomedFullBody.d.ts +4 -0
  765. package/esm/components/layouts/ZoomedFullBody.js +14 -0
  766. package/esm/components/layouts/ZoomedFullBody.js.map +1 -0
  767. package/esm/components/layouts/chat.css +358 -19
  768. package/esm/components/layouts/hidden-chat.css +254 -0
  769. package/esm/components/layouts/totem.css +19 -10
  770. package/esm/components/layouts/website-assistant.css +2 -2
  771. package/esm/components/layouts/zoomed-full-body.css +18 -0
  772. package/esm/components/ui/Alert.css +93 -0
  773. package/esm/components/ui/Alert.d.ts +18 -0
  774. package/esm/components/ui/Alert.js +39 -0
  775. package/esm/components/ui/Alert.js.map +1 -0
  776. package/esm/components/ui/Button.css +8 -2
  777. package/esm/components/ui/Button.d.ts +1 -0
  778. package/esm/components/ui/Button.js +2 -1
  779. package/esm/components/ui/Button.js.map +1 -1
  780. package/esm/components/ui/Card.css +5 -0
  781. package/esm/components/ui/Card.d.ts +1 -0
  782. package/esm/components/ui/Card.js +2 -1
  783. package/esm/components/ui/Card.js.map +1 -1
  784. package/esm/components/ui/ConfirmDialog.css +42 -0
  785. package/esm/components/ui/ConfirmDialog.d.ts +11 -0
  786. package/esm/components/ui/ConfirmDialog.js +9 -0
  787. package/esm/components/ui/ConfirmDialog.js.map +1 -0
  788. package/esm/components/ui/Drawer.css +121 -96
  789. package/esm/components/ui/Drawer.d.ts +17 -6
  790. package/esm/components/ui/Drawer.js +45 -14
  791. package/esm/components/ui/Drawer.js.map +1 -1
  792. package/esm/components/ui/Expandable.d.ts +3 -2
  793. package/esm/components/ui/Expandable.js +35 -20
  794. package/esm/components/ui/Expandable.js.map +1 -1
  795. package/esm/components/ui/Select.d.ts +1 -0
  796. package/esm/components/ui/Slider.css +192 -0
  797. package/esm/components/ui/Slider.d.ts +12 -0
  798. package/esm/components/ui/Slider.js +75 -0
  799. package/esm/components/ui/Slider.js.map +1 -0
  800. package/esm/components/ui/Table.css +15 -2
  801. package/esm/context/visemeContext.d.ts +24 -0
  802. package/esm/context/visemeContext.js +187 -0
  803. package/esm/context/visemeContext.js.map +1 -0
  804. package/esm/helpers/configuration.js +0 -1
  805. package/esm/helpers/configuration.js.map +1 -1
  806. package/esm/helpers/constants.d.ts +6 -0
  807. package/esm/helpers/constants.js +6 -0
  808. package/esm/helpers/constants.js.map +1 -1
  809. package/esm/helpers/error.js +53 -6
  810. package/esm/helpers/error.js.map +1 -1
  811. package/esm/helpers/markedExtendedTables.js +1 -1
  812. package/esm/helpers/markedExtendedTables.js.map +1 -1
  813. package/esm/helpers/message.d.ts +5 -0
  814. package/esm/helpers/message.js +91 -0
  815. package/esm/helpers/message.js.map +1 -0
  816. package/esm/helpers/sanitizer.d.ts +1 -0
  817. package/esm/helpers/sanitizer.js +5 -0
  818. package/esm/helpers/sanitizer.js.map +1 -0
  819. package/esm/helpers/statistics.d.ts +1 -12
  820. package/esm/helpers/statistics.js +0 -156
  821. package/esm/helpers/statistics.js.map +1 -1
  822. package/esm/helpers/stt/useSTT.d.ts +40 -0
  823. package/esm/helpers/stt/useSTT.js +523 -0
  824. package/esm/helpers/stt/useSTT.js.map +1 -0
  825. package/esm/helpers/translations.js +23 -4
  826. package/esm/helpers/translations.js.map +1 -1
  827. package/esm/helpers/tts/ttsVoiceUtility.d.ts +158 -0
  828. package/esm/helpers/tts/ttsVoiceUtility.js +182 -0
  829. package/esm/helpers/tts/ttsVoiceUtility.js.map +1 -0
  830. package/esm/helpers/tts/useTTS.d.ts +27 -0
  831. package/esm/helpers/tts/useTTS.js +293 -0
  832. package/esm/helpers/tts/useTTS.js.map +1 -0
  833. package/esm/helpers/utils.d.ts +40 -0
  834. package/esm/helpers/utils.js +143 -0
  835. package/esm/helpers/utils.js.map +1 -1
  836. package/esm/i18n.js +13 -1
  837. package/esm/i18n.js.map +1 -1
  838. package/esm/index.d.ts +14 -4
  839. package/esm/index.js +137 -85
  840. package/esm/index.js.map +1 -1
  841. package/esm/locales/de.json +593 -0
  842. package/esm/locales/en.json +250 -40
  843. package/esm/locales/es.json +593 -0
  844. package/esm/locales/fr.json +603 -0
  845. package/esm/locales/it.json +260 -48
  846. package/esm/styles.css +18 -2
  847. package/package.json +12 -13
  848. package/src/I18nWrapper.tsx +3 -60
  849. package/src/__snapshots__/index.test.tsx.snap +60 -0
  850. package/src/components/AccountForm/AccountForm.test.tsx +2 -1
  851. package/src/components/AccountForm/AccountForm.tsx +3 -5
  852. package/src/components/AgeVerificationModal/AgeVerificationModal.css +1 -1
  853. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +1 -1
  854. package/src/components/Avatar/Avatar.css +2 -2
  855. package/src/components/Avatar/Avatar.test.tsx +39 -20
  856. package/src/components/Avatar/Avatar.tsx +175 -145
  857. package/src/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.tsx +103 -0
  858. package/src/components/Avatar/AvatarView/AvatarComponent/avatarComponent.tsx +106 -0
  859. package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx +348 -0
  860. package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/types.ts +44 -0
  861. package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.ts +1250 -0
  862. package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarPositionController.ts +83 -0
  863. package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.ts +301 -0
  864. package/src/components/Avatar/AvatarView/AvatarComponent/components/controls.tsx +100 -0
  865. package/src/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.tsx +152 -0
  866. package/src/components/{AvatarView → Avatar/AvatarView/AvatarComponent}/components/loader.tsx +1 -1
  867. package/src/components/Avatar/AvatarView/AvatarComponent/constants.ts +128 -0
  868. package/src/components/Avatar/AvatarView/AvatarComponent/lights/Lights.tsx +145 -0
  869. package/src/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.css +111 -0
  870. package/src/components/Avatar/AvatarView/AvatarComponent/positionControls/positionControls.tsx +201 -0
  871. package/src/components/{AvatarView → Avatar/AvatarView}/AvatarView.stories.tsx +41 -7
  872. package/src/components/Avatar/AvatarView/index.tsx +194 -0
  873. package/src/components/Avatar/AvatarView/utils/hideHands.ts +11 -0
  874. package/src/components/Avatar/AvatarView/utils/useEyeBlink.ts +100 -0
  875. package/src/components/Avatar/AvatarView/utils/useMouthAnimation.ts +93 -0
  876. package/src/components/Avatar/AvatarView/utils/useSmile.ts +39 -0
  877. package/src/components/Avatar/__snapshots__/Avatar.test.tsx.snap +32 -93
  878. package/src/components/BlockedMemoriBadge/__snapshots__/BlockedMemoriBadge.test.tsx.snap +10 -0
  879. package/src/components/Chat/Chat.stories.tsx +498 -2
  880. package/src/components/Chat/Chat.test.tsx +241 -301
  881. package/src/components/Chat/Chat.tsx +120 -58
  882. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +1756 -1222
  883. package/src/components/ChatBubble/ChatBubble.css +91 -14
  884. package/src/components/ChatBubble/ChatBubble.stories.tsx +759 -16
  885. package/src/components/ChatBubble/ChatBubble.test.tsx +217 -2
  886. package/src/components/ChatBubble/ChatBubble.tsx +242 -90
  887. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +7728 -254
  888. package/src/components/ChatHistoryDrawer/ChatHistory.css +414 -0
  889. package/src/components/ChatHistoryDrawer/ChatHistory.stories.tsx +361 -0
  890. package/src/components/ChatHistoryDrawer/ChatHistory.test.tsx +107 -0
  891. package/src/components/ChatHistoryDrawer/ChatHistory.tsx +1191 -0
  892. package/src/components/ChatHistoryDrawer/__snapshots__/ChatHistory.test.tsx.snap +27 -0
  893. package/src/components/ChatInputs/ChatInputs.stories.tsx +5 -0
  894. package/src/components/ChatInputs/ChatInputs.test.tsx +0 -6
  895. package/src/components/ChatInputs/ChatInputs.tsx +136 -25
  896. package/src/components/ChatInputs/__snapshots__/ChatInputs.test.tsx.snap +6 -138
  897. package/src/components/ChatTextArea/ChatTextArea.css +9 -5
  898. package/src/components/ChatTextArea/ChatTextArea.tsx +1 -0
  899. package/src/components/ChatTextArea/__snapshots__/ChatTextArea.test.tsx.snap +3 -0
  900. package/src/components/CompletionProviderStatus/CompletionProviderStatus.css +35 -17
  901. package/src/components/CompletionProviderStatus/CompletionProviderStatus.stories.tsx +275 -22
  902. package/src/components/CompletionProviderStatus/CompletionProviderStatus.test.tsx +6 -4
  903. package/src/components/CompletionProviderStatus/CompletionProviderStatus.tsx +192 -39
  904. package/src/components/CompletionProviderStatus/__snapshots__/CompletionProviderStatus.test.tsx.snap +83 -15
  905. package/src/components/ExpertsDrawer/ExpertsDrawer.tsx +4 -2
  906. package/src/components/FilePreview/FilePreview.css +184 -0
  907. package/src/components/FilePreview/FilePreview.stories.tsx +66 -0
  908. package/src/components/FilePreview/FilePreview.test.tsx +26 -0
  909. package/src/components/FilePreview/FilePreview.tsx +177 -0
  910. package/src/components/FilePreview/__snapshots__/FilePreview.test.tsx.snap +275 -0
  911. package/src/components/Header/Header.css +3 -3
  912. package/src/components/Header/Header.stories.tsx +21 -1
  913. package/src/components/Header/Header.test.tsx +38 -1
  914. package/src/components/Header/Header.tsx +56 -16
  915. package/src/components/Header/__snapshots__/Header.test.tsx.snap +127 -375
  916. package/src/components/KnownFacts/KnownFacts.stories.tsx +5 -4
  917. package/src/components/KnownFacts/KnownFacts.test.tsx +6 -3
  918. package/src/components/KnownFacts/KnownFacts.tsx +4 -5
  919. package/src/components/LoginDrawer/LoginDrawer.css +302 -0
  920. package/src/components/LoginDrawer/LoginDrawer.stories.tsx +27 -1
  921. package/src/components/LoginDrawer/LoginDrawer.test.tsx +65 -8
  922. package/src/components/LoginDrawer/LoginDrawer.tsx +12 -13
  923. package/src/components/LoginDrawer/__snapshots__/LoginDrawer.test.tsx.snap +32 -0
  924. package/src/components/MediaWidget/LinkItemWidget.css +10 -0
  925. package/src/components/MediaWidget/LinkItemWidget.tsx +6 -1
  926. package/src/components/MediaWidget/MediaItemWidget.css +153 -3
  927. package/src/components/MediaWidget/MediaItemWidget.stories.tsx +6 -0
  928. package/src/components/MediaWidget/MediaItemWidget.tsx +229 -161
  929. package/src/components/MediaWidget/MediaWidget.test.tsx +2 -1
  930. package/src/components/MediaWidget/MediaWidget.tsx +5 -2
  931. package/src/components/MediaWidget/__snapshots__/LinkItemWidget.test.tsx.snap +4 -4
  932. package/src/components/MediaWidget/__snapshots__/MediaItemWidget.test.tsx.snap +150 -249
  933. package/src/components/MediaWidget/__snapshots__/MediaWidget.test.tsx.snap +2 -2
  934. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +755 -0
  935. package/src/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.css +163 -0
  936. package/src/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.tsx +250 -0
  937. package/src/components/MemoriArtifactSystem/components/ArtifactActions/CopyButton.stories.tsx +30 -0
  938. package/src/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.tsx +467 -0
  939. package/src/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyMenuItem.tsx +86 -0
  940. package/src/components/MemoriArtifactSystem/components/ArtifactActions/hooks/useCopyArtifact.ts +619 -0
  941. package/src/components/MemoriArtifactSystem/components/ArtifactActions/index.ts +9 -0
  942. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +489 -0
  943. package/src/components/MemoriArtifactSystem/components/ArtifactActions/test/CopyButtonTest.tsx +90 -0
  944. package/src/components/MemoriArtifactSystem/components/ArtifactActions/types.ts +73 -0
  945. package/src/components/MemoriArtifactSystem/components/ArtifactActions/utils/PDFExporter.ts +454 -0
  946. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +1059 -0
  947. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +428 -0
  948. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +150 -0
  949. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.tsx +79 -0
  950. package/src/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.css +253 -0
  951. package/src/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.tsx +169 -0
  952. package/src/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +346 -0
  953. package/src/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.tsx +165 -0
  954. package/src/components/MemoriArtifactSystem/context/ArtifactContext.tsx +69 -0
  955. package/src/components/MemoriArtifactSystem/types/artifact.types.ts +16 -0
  956. package/src/components/MemoriWidget/MemoriWidget.css +10 -4
  957. package/src/components/MemoriWidget/MemoriWidget.stories.tsx +70 -11
  958. package/src/components/MemoriWidget/MemoriWidget.tsx +1344 -1349
  959. package/src/components/MicrophoneButton/MicrophoneButton.tsx +0 -1
  960. package/src/components/SendOnEnterMenu/SendOnEnterMenu.css +3 -3
  961. package/src/components/SettingsDrawer/SettingsDrawer.css +9 -2
  962. package/src/components/SettingsDrawer/SettingsDrawer.test.tsx +24 -0
  963. package/src/components/SettingsDrawer/SettingsDrawer.tsx +104 -14
  964. package/src/components/ShareButton/ShareButton.css +6 -0
  965. package/src/components/ShareButton/ShareButton.stories.tsx +18 -1
  966. package/src/components/ShareButton/ShareButton.test.tsx +8 -1
  967. package/src/components/ShareButton/ShareButton.tsx +49 -2
  968. package/src/components/ShareButton/__snapshots__/ShareButton.test.tsx.snap +35 -0
  969. package/src/components/SignupForm/SignupForm.test.tsx +3 -2
  970. package/src/components/SignupForm/SignupForm.tsx +8 -9
  971. package/src/components/Snippet/Snippet.stories.tsx +0 -8
  972. package/src/components/Snippet/Snippet.test.tsx +0 -1
  973. package/src/components/Snippet/Snippet.tsx +55 -36
  974. package/src/components/Snippet/__snapshots__/Snippet.test.tsx.snap +186 -2560
  975. package/src/components/StartPanel/StartPanel.css +34 -8
  976. package/src/components/StartPanel/StartPanel.stories.tsx +58 -23
  977. package/src/components/StartPanel/StartPanel.test.tsx +50 -17
  978. package/src/components/StartPanel/StartPanel.tsx +218 -152
  979. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +1340 -171
  980. package/src/components/Typing/Typing.tsx +52 -47
  981. package/src/components/UploadButton/UploadButton.css +544 -0
  982. package/src/components/UploadButton/UploadButton.stories.tsx +164 -0
  983. package/src/components/UploadButton/UploadButton.test.tsx +11 -0
  984. package/src/components/UploadButton/UploadButton.tsx +490 -0
  985. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +422 -0
  986. package/src/components/UploadButton/UploadImages/UploadImages.tsx +362 -0
  987. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +156 -0
  988. package/src/components/UploadMenu/UploadMenu.css +3 -3
  989. package/src/components/VenueWidget/VenueWidget.css +7 -0
  990. package/src/components/VenueWidget/VenueWidget.tsx +4 -4
  991. package/src/components/WhyThisAnswer/WhyThisAnswer.css +43 -0
  992. package/src/components/WhyThisAnswer/WhyThisAnswer.stories.tsx +46 -4
  993. package/src/components/WhyThisAnswer/WhyThisAnswer.test.tsx +132 -11
  994. package/src/components/WhyThisAnswer/WhyThisAnswer.tsx +36 -10
  995. package/src/components/WhyThisAnswer/__snapshots__/WhyThisAnswer.test.tsx.snap +15 -1
  996. package/src/components/icons/Alert.tsx +31 -0
  997. package/src/components/icons/ArrowUp.tsx +28 -0
  998. package/src/components/icons/Bug.tsx +81 -0
  999. package/src/components/icons/Chat.tsx +30 -0
  1000. package/src/components/icons/ChevronDown.tsx +26 -0
  1001. package/src/components/icons/ChevronUp.tsx +24 -0
  1002. package/src/components/icons/Close.tsx +8 -1
  1003. package/src/components/icons/Code.tsx +24 -0
  1004. package/src/components/icons/Copy.tsx +8 -2
  1005. package/src/components/icons/Document.tsx +50 -0
  1006. package/src/components/icons/History.tsx +33 -0
  1007. package/src/components/icons/Image.tsx +37 -0
  1008. package/src/components/icons/Info.tsx +31 -0
  1009. package/src/components/icons/MenuHorizontal.tsx +29 -0
  1010. package/src/components/icons/MenuVertical.tsx +29 -0
  1011. package/src/components/icons/Preview.tsx +29 -0
  1012. package/src/components/icons/Print.tsx +34 -0
  1013. package/src/components/icons/Upload.tsx +34 -0
  1014. package/src/components/icons/Warning.tsx +2 -1
  1015. package/src/components/icons/icons.stories.tsx +14 -6
  1016. package/src/components/layouts/Chat.test.tsx +18 -10
  1017. package/src/components/layouts/Chat.tsx +51 -31
  1018. package/src/components/layouts/FullPage.test.tsx +42 -9
  1019. package/src/components/layouts/FullPage.tsx +55 -30
  1020. package/src/components/layouts/HiddenChat.test.tsx +40 -0
  1021. package/src/components/layouts/HiddenChat.tsx +252 -0
  1022. package/src/components/layouts/Totem.test.tsx +18 -10
  1023. package/src/components/layouts/Totem.tsx +1 -7
  1024. package/src/components/layouts/WebsiteAssistant.test.tsx +18 -10
  1025. package/src/components/layouts/WebsiteAssistant.tsx +0 -7
  1026. package/src/components/layouts/ZoomedFullBody.test.tsx +40 -0
  1027. package/src/components/layouts/ZoomedFullBody.tsx +81 -0
  1028. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +287 -197
  1029. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +827 -201
  1030. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +470 -0
  1031. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +122 -36
  1032. package/src/components/layouts/__snapshots__/WebsiteAssistant.test.tsx.snap +1 -1
  1033. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +533 -0
  1034. package/src/components/layouts/chat.css +358 -19
  1035. package/src/components/layouts/hidden-chat.css +254 -0
  1036. package/src/components/layouts/layouts.stories.tsx +257 -57
  1037. package/src/components/layouts/totem.css +19 -10
  1038. package/src/components/layouts/website-assistant.css +2 -2
  1039. package/src/components/layouts/zoomed-full-body.css +18 -0
  1040. package/src/components/ui/Alert.css +93 -0
  1041. package/src/components/ui/Alert.stories.tsx +137 -0
  1042. package/src/components/ui/Alert.test.tsx +129 -0
  1043. package/src/components/ui/Alert.tsx +123 -0
  1044. package/src/components/ui/Button.css +8 -2
  1045. package/src/components/ui/Button.tsx +3 -0
  1046. package/src/components/ui/Card.css +5 -0
  1047. package/src/components/ui/Card.tsx +4 -0
  1048. package/src/components/ui/ConfirmDialog.css +42 -0
  1049. package/src/components/ui/ConfirmDialog.stories.tsx +216 -0
  1050. package/src/components/ui/ConfirmDialog.test.tsx +124 -0
  1051. package/src/components/ui/ConfirmDialog.tsx +58 -0
  1052. package/src/components/ui/Drawer.css +121 -96
  1053. package/src/components/ui/Drawer.stories.tsx +152 -67
  1054. package/src/components/ui/Drawer.test.tsx +6 -2
  1055. package/src/components/ui/Drawer.tsx +202 -90
  1056. package/src/components/ui/Expandable.stories.tsx +128 -1
  1057. package/src/components/ui/Expandable.tsx +44 -22
  1058. package/src/components/ui/Slider.css +192 -0
  1059. package/src/components/ui/Slider.stories.tsx +63 -0
  1060. package/src/components/ui/Slider.tsx +142 -0
  1061. package/src/components/ui/Table.css +15 -2
  1062. package/src/components/ui/__snapshots__/Alert.test.tsx.snap +59 -0
  1063. package/src/components/ui/__snapshots__/ConfirmDialog.test.tsx.snap +35 -0
  1064. package/src/context/visemeContext.tsx +391 -0
  1065. package/src/helpers/configuration.ts +0 -1
  1066. package/src/helpers/constants.ts +10 -0
  1067. package/src/helpers/error.ts +58 -6
  1068. package/src/helpers/markedExtendedTables.js +1 -1
  1069. package/src/helpers/message.ts +148 -0
  1070. package/src/helpers/sanitizer.ts +17 -0
  1071. package/src/helpers/statistics.ts +1 -195
  1072. package/src/helpers/stt/useSTT.ts +774 -0
  1073. package/src/helpers/translations.ts +29 -7
  1074. package/src/helpers/tts/ttsVoiceUtility.ts +275 -0
  1075. package/src/helpers/tts/useTTS.ts +464 -0
  1076. package/src/helpers/utils.test.ts +38 -1
  1077. package/src/helpers/utils.ts +200 -0
  1078. package/src/i18n.ts +13 -1
  1079. package/src/index.stories.tsx +266 -23
  1080. package/src/index.test.tsx +130 -0
  1081. package/src/index.tsx +245 -153
  1082. package/src/locales/de.json +621 -0
  1083. package/src/locales/en.json +251 -40
  1084. package/src/locales/es.json +593 -0
  1085. package/src/locales/fr.json +603 -0
  1086. package/src/locales/it.json +262 -48
  1087. package/src/mocks/data.ts +272 -9
  1088. package/src/styles.css +18 -2
  1089. package/dist/components/AttachmentMediaModal/AttachmentMediaModal.d.ts +0 -14
  1090. package/dist/components/AttachmentMediaModal/AttachmentMediaModal.js +0 -66
  1091. package/dist/components/AttachmentMediaModal/AttachmentMediaModal.js.map +0 -1
  1092. package/dist/components/AvatarView/components/avatar.d.ts +0 -9
  1093. package/dist/components/AvatarView/components/avatar.js +0 -35
  1094. package/dist/components/AvatarView/components/avatar.js.map +0 -1
  1095. package/dist/components/AvatarView/components/fullbodyAvatar.d.ts +0 -10
  1096. package/dist/components/AvatarView/components/fullbodyAvatar.js +0 -62
  1097. package/dist/components/AvatarView/components/fullbodyAvatar.js.map +0 -1
  1098. package/dist/components/AvatarView/components/loader.js.map +0 -1
  1099. package/dist/components/AvatarView/index.d.ts +0 -17
  1100. package/dist/components/AvatarView/index.js +0 -35
  1101. package/dist/components/AvatarView/index.js.map +0 -1
  1102. package/dist/components/AvatarView/utils/useEyeBlink.d.ts +0 -2
  1103. package/dist/components/AvatarView/utils/useEyeBlink.js +0 -40
  1104. package/dist/components/AvatarView/utils/useEyeBlink.js.map +0 -1
  1105. package/dist/components/AvatarView/utils/useHeadMovement.js.map +0 -1
  1106. package/dist/components/AvatarView/utils/useLoadingMorphAnim.js.map +0 -1
  1107. package/dist/components/AvatarView/utils/useMouthSpeaking.d.ts +0 -2
  1108. package/dist/components/AvatarView/utils/useMouthSpeaking.js +0 -60
  1109. package/dist/components/AvatarView/utils/useMouthSpeaking.js.map +0 -1
  1110. package/dist/components/AvatarView/utils/useSmile.js +0 -30
  1111. package/dist/components/AvatarView/utils/useSmile.js.map +0 -1
  1112. package/dist/components/AvatarView/utils/utils.js.map +0 -1
  1113. package/dist/components/ExportHistoryButton/ExportHistoryButton.d.ts +0 -14
  1114. package/dist/components/ExportHistoryButton/ExportHistoryButton.js +0 -38
  1115. package/dist/components/ExportHistoryButton/ExportHistoryButton.js.map +0 -1
  1116. package/dist/components/ImageUpload/ImageUpload.css +0 -168
  1117. package/dist/components/ImageUpload/ImageUpload.d.ts +0 -28
  1118. package/dist/components/ImageUpload/ImageUpload.js +0 -163
  1119. package/dist/components/ImageUpload/ImageUpload.js.map +0 -1
  1120. package/dist/components/layouts/Default.d.ts +0 -17
  1121. package/dist/components/layouts/Default.js +0 -8
  1122. package/dist/components/layouts/Default.js.map +0 -1
  1123. package/dist/components/ui/Message.d.ts +0 -17
  1124. package/dist/components/ui/Message.js +0 -13
  1125. package/dist/components/ui/Message.js.map +0 -1
  1126. package/dist/helpers/tenant.d.ts +0 -2
  1127. package/dist/helpers/tenant.js +0 -40
  1128. package/dist/helpers/tenant.js.map +0 -1
  1129. package/esm/components/AttachmentMediaModal/AttachmentMediaModal.d.ts +0 -14
  1130. package/esm/components/AttachmentMediaModal/AttachmentMediaModal.js +0 -63
  1131. package/esm/components/AttachmentMediaModal/AttachmentMediaModal.js.map +0 -1
  1132. package/esm/components/AvatarView/components/avatar.d.ts +0 -9
  1133. package/esm/components/AvatarView/components/avatar.js +0 -31
  1134. package/esm/components/AvatarView/components/avatar.js.map +0 -1
  1135. package/esm/components/AvatarView/components/fullbodyAvatar.d.ts +0 -10
  1136. package/esm/components/AvatarView/components/fullbodyAvatar.js +0 -58
  1137. package/esm/components/AvatarView/components/fullbodyAvatar.js.map +0 -1
  1138. package/esm/components/AvatarView/components/loader.js.map +0 -1
  1139. package/esm/components/AvatarView/index.d.ts +0 -17
  1140. package/esm/components/AvatarView/index.js +0 -31
  1141. package/esm/components/AvatarView/index.js.map +0 -1
  1142. package/esm/components/AvatarView/utils/useEyeBlink.d.ts +0 -2
  1143. package/esm/components/AvatarView/utils/useEyeBlink.js +0 -37
  1144. package/esm/components/AvatarView/utils/useEyeBlink.js.map +0 -1
  1145. package/esm/components/AvatarView/utils/useHeadMovement.js.map +0 -1
  1146. package/esm/components/AvatarView/utils/useLoadingMorphAnim.js.map +0 -1
  1147. package/esm/components/AvatarView/utils/useMouthSpeaking.d.ts +0 -2
  1148. package/esm/components/AvatarView/utils/useMouthSpeaking.js +0 -57
  1149. package/esm/components/AvatarView/utils/useMouthSpeaking.js.map +0 -1
  1150. package/esm/components/AvatarView/utils/useSmile.js +0 -27
  1151. package/esm/components/AvatarView/utils/useSmile.js.map +0 -1
  1152. package/esm/components/AvatarView/utils/utils.js.map +0 -1
  1153. package/esm/components/ExportHistoryButton/ExportHistoryButton.d.ts +0 -14
  1154. package/esm/components/ExportHistoryButton/ExportHistoryButton.js +0 -35
  1155. package/esm/components/ExportHistoryButton/ExportHistoryButton.js.map +0 -1
  1156. package/esm/components/ImageUpload/ImageUpload.css +0 -168
  1157. package/esm/components/ImageUpload/ImageUpload.d.ts +0 -28
  1158. package/esm/components/ImageUpload/ImageUpload.js +0 -160
  1159. package/esm/components/ImageUpload/ImageUpload.js.map +0 -1
  1160. package/esm/components/layouts/Default.d.ts +0 -17
  1161. package/esm/components/layouts/Default.js +0 -5
  1162. package/esm/components/layouts/Default.js.map +0 -1
  1163. package/esm/components/ui/Message.d.ts +0 -17
  1164. package/esm/components/ui/Message.js +0 -10
  1165. package/esm/components/ui/Message.js.map +0 -1
  1166. package/esm/helpers/tenant.d.ts +0 -2
  1167. package/esm/helpers/tenant.js +0 -36
  1168. package/esm/helpers/tenant.js.map +0 -1
  1169. package/src/components/AvatarView/components/avatar.tsx +0 -57
  1170. package/src/components/AvatarView/components/fullbodyAvatar.tsx +0 -99
  1171. package/src/components/AvatarView/index.tsx +0 -101
  1172. package/src/components/AvatarView/utils/useEyeBlink.ts +0 -48
  1173. package/src/components/AvatarView/utils/useMouthSpeaking.ts +0 -70
  1174. package/src/components/AvatarView/utils/useSmile.ts +0 -31
  1175. package/src/components/ExportHistoryButton/ExportHistoryButton.stories.tsx +0 -73
  1176. package/src/components/ExportHistoryButton/ExportHistoryButton.test.tsx +0 -69
  1177. package/src/components/ExportHistoryButton/ExportHistoryButton.tsx +0 -103
  1178. package/src/components/ExportHistoryButton/__snapshots__/ExportHistoryButton.test.tsx.snap +0 -239
  1179. package/src/helpers/statistics.test.ts +0 -213
  1180. package/src/helpers/tenant.ts +0 -47
  1181. /package/dist/components/{AvatarView → Avatar/AvatarView}/utils/useHeadMovement.d.ts +0 -0
  1182. /package/dist/components/{AvatarView → Avatar/AvatarView}/utils/useHeadMovement.js +0 -0
  1183. /package/dist/components/{AvatarView → Avatar/AvatarView}/utils/useLoadingMorphAnim.d.ts +0 -0
  1184. /package/dist/components/{AvatarView → Avatar/AvatarView}/utils/useLoadingMorphAnim.js +0 -0
  1185. /package/dist/components/{AvatarView → Avatar/AvatarView}/utils/useSmile.d.ts +0 -0
  1186. /package/dist/components/{AvatarView → Avatar/AvatarView}/utils/utils.d.ts +0 -0
  1187. /package/dist/components/{AvatarView → Avatar/AvatarView}/utils/utils.js +0 -0
  1188. /package/esm/components/{AvatarView → Avatar/AvatarView}/utils/useHeadMovement.d.ts +0 -0
  1189. /package/esm/components/{AvatarView → Avatar/AvatarView}/utils/useHeadMovement.js +0 -0
  1190. /package/esm/components/{AvatarView → Avatar/AvatarView}/utils/useLoadingMorphAnim.d.ts +0 -0
  1191. /package/esm/components/{AvatarView → Avatar/AvatarView}/utils/useLoadingMorphAnim.js +0 -0
  1192. /package/esm/components/{AvatarView → Avatar/AvatarView}/utils/useSmile.d.ts +0 -0
  1193. /package/esm/components/{AvatarView → Avatar/AvatarView}/utils/utils.d.ts +0 -0
  1194. /package/esm/components/{AvatarView → Avatar/AvatarView}/utils/utils.js +0 -0
  1195. /package/src/components/{AvatarView → Avatar/AvatarView}/utils/useHeadMovement.ts +0 -0
  1196. /package/src/components/{AvatarView → Avatar/AvatarView}/utils/useLoadingMorphAnim.ts +0 -0
  1197. /package/src/components/{AvatarView → Avatar/AvatarView}/utils/utils.ts +0 -0
@@ -9,19 +9,14 @@ import {
9
9
  OpenSession,
10
10
  MemoriConfig,
11
11
  TranslatedHint,
12
- Invitation,
13
- GamificationLevel,
14
12
  Tenant,
15
13
  MemoriSession,
16
14
  User,
17
15
  ExpertReference,
16
+ ResponseSpec,
17
+ ChatLog,
18
18
  } from '@memori.ai/memori-api-client/src/types';
19
- import {
20
- SpeakerAudioDestination,
21
- SpeechConfig,
22
- SpeechSynthesizer,
23
- SpeechRecognizer,
24
- } from 'microsoft-cognitiveservices-speech-sdk';
19
+ import { ArtifactData } from '../MemoriArtifactSystem/types/artifact.types';
25
20
 
26
21
  // Libraries
27
22
  import React, {
@@ -30,11 +25,11 @@ import React, {
30
25
  useCallback,
31
26
  CSSProperties,
32
27
  useRef,
28
+ useMemo,
33
29
  } from 'react';
34
30
  import { useTranslation } from 'react-i18next';
35
31
  import memoriApiClient from '@memori.ai/memori-api-client';
36
32
  import { AudioContext, IAudioContext } from 'standardized-audio-context';
37
- import * as speechSdk from 'microsoft-cognitiveservices-speech-sdk';
38
33
  import cx from 'classnames';
39
34
  import { DateTime } from 'luxon';
40
35
  import toast from 'react-hot-toast';
@@ -45,7 +40,6 @@ import MemoriAuth from '../Auth/Auth';
45
40
  import Chat, { Props as ChatProps } from '../Chat/Chat';
46
41
  import StartPanel, { Props as StartPanelProps } from '../StartPanel/StartPanel';
47
42
  import Avatar, { Props as AvatarProps } from '../Avatar/Avatar';
48
- import ChangeMode, { Props as ChangeModeProps } from '../ChangeMode/ChangeMode';
49
43
  import Header, { Props as HeaderProps } from '../Header/Header';
50
44
  import PoweredBy from '../PoweredBy/PoweredBy';
51
45
  import AgeVerificationModal from '../AgeVerificationModal/AgeVerificationModal';
@@ -53,12 +47,16 @@ import SettingsDrawer from '../SettingsDrawer/SettingsDrawer';
53
47
  import KnownFacts from '../KnownFacts/KnownFacts';
54
48
  import ExpertsDrawer from '../ExpertsDrawer/ExpertsDrawer';
55
49
  import LoginDrawer from '../LoginDrawer/LoginDrawer';
50
+ import Button from '../ui/Button';
51
+ import CloseIcon from '../icons/Close';
56
52
 
57
53
  // Layout
58
54
  import FullPageLayout from '../layouts/FullPage';
59
55
  import TotemLayout from '../layouts/Totem';
60
56
  import ChatLayout from '../layouts/Chat';
61
57
  import WebsiteAssistantLayout from '../layouts/WebsiteAssistant';
58
+ import HiddenChatLayout from '../layouts/HiddenChat';
59
+ import ZoomedFullBodyLayout from '../layouts/ZoomedFullBody';
62
60
 
63
61
  // Helpers / Utils
64
62
  import { getTranslation } from '../../helpers/translations';
@@ -70,14 +68,23 @@ import {
70
68
  import {
71
69
  hasTouchscreen,
72
70
  stripDuplicates,
73
- stripEmojis,
74
- escapeHTML,
75
- stripMarkdown,
71
+ installMathJax,
72
+ stripReasoningTags,
76
73
  } from '../../helpers/utils';
77
- import { anonTag } from '../../helpers/constants';
74
+ import { getTTSVoice } from '../../helpers/tts/ttsVoiceUtility';
75
+ import {
76
+ allowedMediaTypes,
77
+ anonTag,
78
+ uiLanguages,
79
+ } from '../../helpers/constants';
78
80
  import { getErrori18nKey } from '../../helpers/error';
79
- import { getGamificationLevel } from '../../helpers/statistics';
80
81
  import { getCredits } from '../../helpers/credits';
82
+ import { useViseme } from '../../context/visemeContext';
83
+ import { sanitizeText } from '../../helpers/sanitizer';
84
+ import { TTSConfig, useTTS } from '../../helpers/tts/useTTS';
85
+ import Alert from '../ui/Alert';
86
+ import ChatHistoryDrawer from '../ChatHistoryDrawer/ChatHistory';
87
+ import { STTConfig, useSTT } from '../../helpers/stt/useSTT';
81
88
 
82
89
  // Widget utilities and helpers
83
90
  const getMemoriState = (integrationId?: string): object | null => {
@@ -99,7 +106,13 @@ const getMemoriState = (integrationId?: string): object | null => {
99
106
  if (!engineState) return null;
100
107
 
101
108
  let dialogState = JSON.parse(engineState);
102
- return dialogState;
109
+
110
+ let loginToken = getLocalConfig<string | undefined>('loginToken', undefined);
111
+
112
+ return {
113
+ ...dialogState,
114
+ loginToken,
115
+ };
103
116
  };
104
117
 
105
118
  type MemoriTextEnteredEvent = CustomEvent<{
@@ -111,6 +124,15 @@ type MemoriTextEnteredEvent = CustomEvent<{
111
124
  hasBatchQueued?: boolean;
112
125
  }>;
113
126
 
127
+ /**
128
+ * Dispatches a MemoriTextEntered event to simulate a user typing a message
129
+ * @param message The text message to send
130
+ * @param waitForPrevious Whether to wait for previous message to finish before sending (default true)
131
+ * @param hidden Whether to hide the message from chat history (default false)
132
+ * @param typingText Optional custom typing indicator text
133
+ * @param useLoaderTextAsMsg Whether to use the loader text as the message (default false)
134
+ * @param hasBatchQueued Whether there are more messages queued to be sent (default false)
135
+ */
114
136
  const typeMessage = (
115
137
  message: string,
116
138
  waitForPrevious = true,
@@ -131,17 +153,24 @@ const typeMessage = (
131
153
  });
132
154
  document.dispatchEvent(e);
133
155
 
156
+ // Special handling for Safari on iOS devices
134
157
  const isSafariIOS =
135
158
  window.navigator.userAgent.includes('Safari') &&
136
159
  !window.navigator.userAgent.includes('Chrome') &&
137
160
  /iPad|iPhone|iPod/.test(navigator.userAgent);
138
161
 
139
162
  if (isSafariIOS) {
163
+ // Dispatch end speak event after short delay for iOS Safari
140
164
  setTimeout(() => {
141
165
  document.dispatchEvent(new CustomEvent('MemoriEndSpeak'));
142
166
  }, 300);
143
167
  }
144
168
  };
169
+
170
+ /**
171
+ * Helper function to send a hidden message
172
+ * Wraps typeMessage with hidden=true and passes through other params
173
+ */
145
174
  const typeMessageHidden = (
146
175
  message: string,
147
176
  waitForPrevious = true,
@@ -260,10 +289,19 @@ const typeBatchMessages = (
260
289
  submitNewMessage();
261
290
  };
262
291
 
292
+ type MemoriNewDialogStateEvent = CustomEvent<DialogState>;
293
+
294
+ type ArtifactCreatedEvent = CustomEvent<{
295
+ artifact: ArtifactData;
296
+ message: Message;
297
+ }>;
298
+
263
299
  interface CustomEventMap {
264
300
  MemoriTextEntered: MemoriTextEnteredEvent;
265
301
  MemoriEndSpeak: CustomEvent;
266
302
  MemoriResetUIEffects: CustomEvent;
303
+ MemoriNewDialogState: MemoriNewDialogStateEvent;
304
+ artifactCreated: ArtifactCreatedEvent;
267
305
  }
268
306
  declare global {
269
307
  interface Document {
@@ -290,16 +328,10 @@ window.typeMessage = typeMessage;
290
328
  window.typeMessageHidden = typeMessageHidden;
291
329
  window.typeBatchMessages = typeBatchMessages;
292
330
 
293
- // Global variables
294
- let recognizer: SpeechRecognizer | null;
295
- let speechConfig: SpeechConfig;
296
- let speechSynthesizer: SpeechSynthesizer | null;
297
- let audioDestination: SpeakerAudioDestination;
298
331
  let audioContext: IAudioContext;
299
332
 
300
333
  let memoriPassword: string | undefined;
301
334
  let speakerMuted: boolean = false;
302
- let memoriSpeaking: boolean = false;
303
335
  let userToken: string | undefined;
304
336
 
305
337
  export interface LayoutProps {
@@ -313,13 +345,13 @@ export interface LayoutProps {
313
345
  startPanelProps?: StartPanelProps;
314
346
  integrationStyle?: JSX.Element | null;
315
347
  integrationBackground?: JSX.Element | null;
316
- ChangeMode?: typeof ChangeMode;
317
- changeModeProps?: ChangeModeProps;
318
348
  poweredBy?: JSX.Element | null;
319
349
  sessionId?: string;
320
350
  hasUserActivatedSpeak?: boolean;
321
- showInstruct?: boolean;
351
+ showUpload?: boolean;
322
352
  loading?: boolean;
353
+ autoStart?: boolean;
354
+ onSidebarToggle?: (isOpen: boolean) => void;
323
355
  }
324
356
 
325
357
  export interface Props {
@@ -331,10 +363,18 @@ export interface Props {
331
363
  memoriLang?: string;
332
364
  multilingual?: boolean;
333
365
  integration?: Integration;
334
- layout?: 'DEFAULT' | 'FULLPAGE' | 'TOTEM' | 'CHAT' | 'WEBSITE_ASSISTANT';
366
+ layout?:
367
+ | 'DEFAULT'
368
+ | 'FULLPAGE'
369
+ | 'TOTEM'
370
+ | 'CHAT'
371
+ | 'WEBSITE_ASSISTANT'
372
+ | 'HIDDEN_CHAT'
373
+ | 'ZOOMED_FULL_BODY';
335
374
  customLayout?: React.FC<LayoutProps>;
336
375
  showShare?: boolean;
337
- showInstruct?: boolean;
376
+ showCopyButton?: boolean;
377
+ showTranslationOriginal?: boolean;
338
378
  showInputs?: boolean;
339
379
  showDates?: boolean;
340
380
  showContextPerLine?: boolean;
@@ -343,12 +383,16 @@ export interface Props {
343
383
  showOnlyLastMessages?: boolean;
344
384
  showTypingText?: boolean;
345
385
  showLogin?: boolean;
386
+ showUpload?: boolean;
387
+ showChatHistory?: boolean;
388
+ showReasoning?: boolean;
346
389
  preview?: boolean;
347
390
  embed?: boolean;
348
391
  height?: number | string;
349
392
  secret?: string;
350
393
  baseUrl?: string;
351
- apiUrl?: string;
394
+ apiURL?: string;
395
+ engineURL?: string;
352
396
  initialContextVars?: { [key: string]: string };
353
397
  initialQuestion?: string;
354
398
  ogImage?: string;
@@ -359,14 +403,20 @@ export interface Props {
359
403
  tag: string;
360
404
  pin: string;
361
405
  };
362
- authToken?: string;
363
- AZURE_COGNITIVE_SERVICES_TTS_KEY?: string;
406
+ ttsProvider?: 'azure' | 'openai';
407
+ enableAudio?: boolean;
364
408
  defaultSpeakerActive?: boolean;
409
+ disableTextEnteredEvents?: boolean;
365
410
  onStateChange?: (state?: DialogState) => void;
366
411
  additionalInfo?: OpenSession['additionalInfo'] & { [key: string]: string };
367
412
  customMediaRenderer?: ChatProps['customMediaRenderer'];
368
413
  additionalSettings?: JSX.Element | null;
369
414
  userAvatar?: string | JSX.Element;
415
+ useMathFormatting?: boolean;
416
+ autoStart?: boolean;
417
+ applyVarsToRoot?: boolean;
418
+ showFunctionCache?: boolean;
419
+ authToken?: string;
370
420
  }
371
421
 
372
422
  const MemoriWidget = ({
@@ -378,38 +428,49 @@ const MemoriWidget = ({
378
428
  memoriLang,
379
429
  multilingual,
380
430
  integration,
381
- layout = 'DEFAULT',
431
+ layout,
382
432
  customLayout,
383
- showInstruct = false,
384
433
  showShare,
385
434
  preview = false,
386
435
  embed = false,
436
+ showCopyButton = true,
437
+ showTranslationOriginal = false,
387
438
  showInputs = true,
388
439
  showDates = false,
389
440
  showContextPerLine = false,
390
- showSettings = true,
441
+ showSettings,
391
442
  showTypingText = false,
392
443
  showClear = false,
393
444
  showLogin = false,
445
+ showUpload,
394
446
  showOnlyLastMessages,
447
+ showChatHistory,
448
+ showReasoning,
395
449
  height = '100vh',
396
450
  secret,
397
- baseUrl = 'https://aisuru.com',
398
- apiUrl = 'https://backend.memori.ai',
451
+ baseUrl = 'https://aisuru-staging.aclambda.online',
452
+ apiURL = 'https://backend-staging.memori.ai',
453
+ engineURL = 'https://engine-staging.memori.ai',
399
454
  initialContextVars,
400
455
  initialQuestion,
456
+ ttsProvider,
401
457
  ogImage,
402
458
  sessionID: initialSessionID,
403
459
  tenant,
404
460
  personification,
405
461
  authToken,
406
- AZURE_COGNITIVE_SERVICES_TTS_KEY,
462
+ enableAudio,
407
463
  defaultSpeakerActive = true,
464
+ disableTextEnteredEvents = false,
408
465
  onStateChange,
409
466
  additionalInfo,
410
467
  additionalSettings,
411
468
  customMediaRenderer,
412
469
  userAvatar,
470
+ useMathFormatting = false,
471
+ autoStart = false,
472
+ applyVarsToRoot = false,
473
+ showFunctionCache = false,
413
474
  }: Props) => {
414
475
  const { t, i18n } = useTranslation();
415
476
 
@@ -419,20 +480,22 @@ const MemoriWidget = ({
419
480
  }, []);
420
481
 
421
482
  // API calls methods
422
- const client = memoriApiClient(apiUrl);
483
+ const client = memoriApiClient(apiURL, engineURL);
423
484
  const {
424
485
  initSession,
486
+ deleteSession,
425
487
  postTextEnteredEvent,
426
488
  postPlaceChangedEvent,
427
489
  postDateChangedEvent,
428
490
  postTimeoutEvent,
429
491
  postTagChangedEvent,
430
492
  getSession,
431
- getContentQualityIndexes,
432
493
  getExpertReferences,
494
+ getSessionChatLogs,
433
495
  } = client;
434
496
 
435
497
  const [instruct, setInstruct] = useState(false);
498
+ const [enableFocusChatInput, setEnableFocusChatInput] = useState(true);
436
499
 
437
500
  const [loginToken, setLoginToken] = useState<string | undefined>(
438
501
  additionalInfo?.loginToken ?? authToken
@@ -441,11 +504,20 @@ const MemoriWidget = ({
441
504
  avatarURL: typeof userAvatar === 'string' ? userAvatar : undefined,
442
505
  } as User);
443
506
  useEffect(() => {
444
- if (loginToken && !user?.userID && showLogin) {
507
+ if (
508
+ loginToken &&
509
+ !user?.userID &&
510
+ (showLogin || memori.requireLoginToken)
511
+ ) {
445
512
  client.backend.getCurrentUser(loginToken).then(({ user, resultCode }) => {
446
513
  if (user && resultCode === 0) {
447
514
  setUser(user);
448
515
  setLocalConfig('loginToken', loginToken);
516
+
517
+ if (!birthDate && user.birthDate) {
518
+ setBirthDate(user.birthDate);
519
+ setLocalConfig('birthDate', user.birthDate);
520
+ }
449
521
  } else {
450
522
  removeLocalConfig('loginToken');
451
523
  }
@@ -466,6 +538,7 @@ const MemoriWidget = ({
466
538
  const integrationConfig = integration?.customData
467
539
  ? JSON.parse(integration.customData)
468
540
  : null;
541
+
469
542
  const isMultilanguageEnabled =
470
543
  multilingual !== undefined
471
544
  ? multilingual
@@ -480,32 +553,62 @@ const MemoriWidget = ({
480
553
  'IT'
481
554
  );
482
555
 
556
+ const applyMathFormatting =
557
+ useMathFormatting !== undefined
558
+ ? useMathFormatting
559
+ : !!integrationConfig?.useMathFormatting;
560
+ useEffect(() => {
561
+ if (applyMathFormatting) installMathJax();
562
+ }, [applyMathFormatting]);
563
+
564
+ /**
565
+ * Sets the language in the i18n instance
566
+ */
567
+ useEffect(() => {
568
+ if (
569
+ isMultilanguageEnabled &&
570
+ userLang &&
571
+ uiLanguages.includes(userLang.toLowerCase())
572
+ ) {
573
+ // @ts-ignore
574
+ i18n.changeLanguage(userLang.toLowerCase());
575
+ }
576
+ }, [userLang]);
577
+
483
578
  const [loading, setLoading] = useState(false);
484
579
  const [memoriTyping, setMemoriTyping] = useState<boolean>(false);
485
580
  const [typingText, setTypingText] = useState<string>();
486
581
 
487
582
  const selectedLayout = layout || integrationConfig?.layout || 'DEFAULT';
488
583
 
489
- const [hasUserActivatedSpeak, setHasUserActivatedSpeak] = useState(false);
584
+ const defaultEnableAudio =
585
+ enableAudio ?? integrationConfig?.enableAudio ?? true;
586
+
490
587
  const [hasUserActivatedListening, setHasUserActivatedListening] =
491
588
  useState(false);
492
589
  const [showPositionDrawer, setShowPositionDrawer] = useState(false);
493
590
  const [showSettingsDrawer, setShowSettingsDrawer] = useState(false);
591
+ const [showChatHistoryDrawer, setShowChatHistoryDrawer] = useState(false);
494
592
  const [showKnownFactsDrawer, setShowKnownFactsDrawer] = useState(false);
495
593
  const [showExpertsDrawer, setShowExpertsDrawer] = useState(false);
496
- const [muteSpeaker, setMuteSpeaker] = useState(!defaultSpeakerActive);
497
594
  const [continuousSpeech, setContinuousSpeech] = useState(false);
498
595
  const [continuousSpeechTimeout, setContinuousSpeechTimeout] = useState(2);
499
- const [isPlayingAudio, setIsPlayingAudio] = useState(false);
500
596
  const [controlsPosition, setControlsPosition] = useState<'center' | 'bottom'>(
501
597
  'center'
502
598
  );
599
+
600
+ const [enablePositionControls, setEnablePositionControls] = useState(false);
601
+ const [avatarType, setAvatarType] = useState<'blob' | 'avatar3d' | null>(
602
+ null
603
+ );
503
604
  const [hideEmissions, setHideEmissions] = useState(false);
605
+
606
+ const speechSynthesizerRef = useRef<any | null>(null);
607
+ const [memoriSpeaking, setMemoriSpeaking] = useState(false);
608
+
504
609
  useEffect(() => {
505
- setIsPlayingAudio(!!speechSynthesizer);
506
- memoriSpeaking = !!speechSynthesizer;
507
- // eslint-disable-next-line react-hooks/exhaustive-deps
508
- }, [speechSynthesizer]);
610
+ setMemoriSpeaking(!!speechSynthesizerRef.current);
611
+ }, [speechSynthesizerRef.current]);
509
612
 
510
613
  useEffect(() => {
511
614
  let defaultControlsPosition: 'center' | 'bottom' = 'bottom';
@@ -530,21 +633,37 @@ const MemoriWidget = ({
530
633
  defaultControlsPosition = 'bottom';
531
634
  }
532
635
 
533
- setMuteSpeaker(getLocalConfig('muteSpeaker', !defaultSpeakerActive));
534
- speakerMuted = getLocalConfig('muteSpeaker', !defaultSpeakerActive);
535
- setContinuousSpeech(microphoneMode === 'CONTINUOUS');
636
+ setContinuousSpeech(speakerMuted ? false : microphoneMode === 'CONTINUOUS');
536
637
  setContinuousSpeechTimeout(getLocalConfig('continuousSpeechTimeout', 2));
537
638
  setControlsPosition(
538
639
  getLocalConfig('controlsPosition', defaultControlsPosition)
539
640
  );
641
+ setAvatarType(getLocalConfig('avatarType', 'avatar3d'));
540
642
  setHideEmissions(getLocalConfig('hideEmissions', false));
541
643
 
542
644
  if (!additionalInfo?.loginToken && !authToken) {
543
645
  setLoginToken(getLocalConfig<typeof loginToken>('loginToken', undefined));
544
646
  userToken = getLocalConfig<typeof loginToken>('loginToken', undefined);
647
+
648
+ setBirthDate(getLocalConfig<string | undefined>('birthDate', undefined));
649
+ }
650
+
651
+ // If audio is disabled, automatically mute the speaker
652
+ if (!(enableAudio ?? integrationConfig?.enableAudio ?? true)) {
653
+ setLocalConfig('muteSpeaker', true);
545
654
  }
546
655
  }, []);
547
656
 
657
+ // Effect to handle enableAudio changes
658
+ useEffect(() => {
659
+ const isAudioEnabled =
660
+ enableAudio ?? integrationConfig?.enableAudio ?? true;
661
+ if (!isAudioEnabled) {
662
+ // Force mute when audio is disabled
663
+ setLocalConfig('muteSpeaker', true);
664
+ }
665
+ }, [enableAudio, integrationConfig?.enableAudio]);
666
+
548
667
  /**
549
668
  * Auth for private and secret memori
550
669
  */
@@ -560,7 +679,8 @@ const MemoriWidget = ({
560
679
  const [position, _setPosition] = useState<Venue>();
561
680
  const applyPosition = async (venue?: Venue, sessionID?: string) => {
562
681
  const session = sessionID ?? sessionId;
563
- if (venue && session) {
682
+ // Only apply position if memori.needsPosition is true
683
+ if (venue && session && memori.needsPosition) {
564
684
  const { currentState, ...response } = await postPlaceChangedEvent({
565
685
  sessionId: session,
566
686
  placeName: venue.placeName,
@@ -583,19 +703,23 @@ const MemoriWidget = ({
583
703
  _setPosition(venue);
584
704
  applyPosition(venue);
585
705
 
586
- if (venue) {
706
+ // Only save position to local config if memori.needsPosition is true
707
+ if (venue && memori.needsPosition) {
587
708
  setLocalConfig('position', JSON.stringify(venue));
588
- } else {
709
+ } else if (!venue) {
589
710
  removeLocalConfig('position');
590
711
  }
591
712
  };
592
713
 
593
714
  useEffect(() => {
594
- const position = getLocalConfig<Venue | undefined>('position', undefined);
595
- if (position) {
596
- _setPosition(position);
715
+ // Only load position from local config if memori.needsPosition is true
716
+ if (memori.needsPosition) {
717
+ const position = getLocalConfig<Venue | undefined>('position', undefined);
718
+ if (position) {
719
+ _setPosition(position);
720
+ }
597
721
  }
598
- }, []);
722
+ }, [memori.needsPosition]);
599
723
 
600
724
  /**
601
725
  * History e gestione invio messaggi
@@ -604,7 +728,7 @@ const MemoriWidget = ({
604
728
  const onChangeUserMessage = (value: string) => {
605
729
  if (!value || value === '\n' || value.trim() === '') {
606
730
  setUserMessage('');
607
- resetInteractionTimeout();
731
+ // resetInteractionTimeout();
608
732
  return;
609
733
  }
610
734
  setUserMessage(value);
@@ -625,6 +749,21 @@ const MemoriWidget = ({
625
749
  },
626
750
  ]);
627
751
  };
752
+
753
+ // When a user resumes a chat, we need to set the chat reference link of the previous chat
754
+ const [chatLogID, setChatLogID] = useState<string | undefined>(undefined);
755
+ /**
756
+ * Sends a message to the Memori and handles the response
757
+ * @param text The text message to send
758
+ * @param media Optional media attachments
759
+ * @param newSessionId Optional new session ID to use
760
+ * @param translate Whether to translate the message before sending (default true)
761
+ * @param translatedText Optional pre-translated text
762
+ * @param hidden Whether to hide the message from chat history (default false)
763
+ * @param typingText Optional custom typing indicator text
764
+ * @param useLoaderTextAsMsg Whether to use the loader text as the message (default false)
765
+ * @param hasBatchQueued Whether there are more messages queued to be sent (default false)
766
+ */
628
767
  const sendMessage = async (
629
768
  text: string,
630
769
  media?: Medium[],
@@ -636,12 +775,14 @@ const MemoriWidget = ({
636
775
  useLoaderTextAsMsg = false,
637
776
  hasBatchQueued = false
638
777
  ) => {
778
+ // Get the session ID from params or global state
639
779
  const sessionID =
640
780
  newSessionId ||
641
781
  sessionId ||
642
782
  (window.getMemoriState() as MemoriSession)?.sessionID;
643
783
  if (!sessionID || !text?.length) return;
644
784
 
785
+ // Add user message to chat history if not hidden
645
786
  if (!hidden)
646
787
  pushMessage({
647
788
  text: text,
@@ -653,52 +794,98 @@ const MemoriWidget = ({
653
794
  : !!newSessionId,
654
795
  });
655
796
 
797
+ // Show typing indicator
656
798
  setMemoriTyping(true);
657
799
  setTypingText(typingText);
658
800
 
659
801
  let msg = text;
660
802
  let gotError = false;
661
803
 
662
- if (
663
- translate &&
664
- !instruct &&
665
- isMultilanguageEnabled &&
666
- userLang.toUpperCase() !== language.toUpperCase()
667
- ) {
668
- const translation = await getTranslation(
669
- text,
670
- language,
671
- userLang,
672
- baseUrl
804
+ try {
805
+ // Translate message if needed
806
+ if (
807
+ !hidden &&
808
+ translate &&
809
+ isMultilanguageEnabled &&
810
+ userLang.toUpperCase() !== language.toUpperCase()
811
+ ) {
812
+ const translation = await getTranslation(
813
+ text,
814
+ language,
815
+ userLang,
816
+ baseUrl
817
+ );
818
+ msg = translation.text;
819
+ }
820
+
821
+ const findMediaDocument = media?.find(
822
+ m => !m.mediumID && m.properties?.isAttachedFile
673
823
  );
674
- msg = translation.text;
675
- }
824
+ if (findMediaDocument) {
825
+ msg = msg + ' ' + findMediaDocument.content;
826
+ }
676
827
 
677
- const { currentState, ...response } = await postTextEnteredEvent({
678
- sessionId: sessionID,
679
- text: msg,
680
- });
681
- if (response.resultCode === 0 && currentState) {
682
- const emission =
683
- useLoaderTextAsMsg && typingText
684
- ? typingText
685
- : currentState.emission ?? currentDialogState?.emission;
686
- if (currentState.state === 'X4' && memori.giverTag) {
687
- const { currentState, ...resp } = await postTagChangedEvent(
688
- sessionID,
689
- memori.giverTag
690
- );
828
+ // Handle multiple documents
829
+ const mediaDocuments = media?.filter(
830
+ m => !m.mediumID && m.properties?.isAttachedFile
831
+ );
832
+ if (mediaDocuments && mediaDocuments.length > 0) {
833
+ const documentContents = mediaDocuments
834
+ .map(doc => doc.content)
835
+ .join(' ');
836
+ msg = msg + ' ' + documentContents;
837
+ }
691
838
 
692
- if (resp.resultCode === 0) {
693
- setCurrentDialogState(currentState);
839
+ // Add chat reference link to the message if it exists
840
+ // if (chatLogID) {
841
+ // msg =
842
+ // msg +
843
+ // ' \n\n' +
844
+ // '<chat-reference session-id="' +
845
+ // sessionID +
846
+ // '" event-log-id="' +
847
+ // chatLogID +
848
+ // '"></chat-reference>';
849
+ // }
850
+
851
+ const { currentState, ...response } = await postTextEnteredEvent({
852
+ sessionId: sessionID,
853
+ text: msg,
854
+ });
855
+ if (response.resultCode === 0 && currentState) {
856
+ setChatLogID(undefined);
857
+ const emission =
858
+ useLoaderTextAsMsg && typingText
859
+ ? typingText
860
+ : currentState.emission ?? currentDialogState?.emission;
861
+
862
+ if (
863
+ userLang.toLowerCase() !== language.toLowerCase() &&
864
+ emission &&
865
+ isMultilanguageEnabled
866
+ ) {
867
+ currentState.emission = emission;
868
+
869
+ translateDialogState(currentState, userLang, msg).then(ts => {
870
+ let text = ts.translatedEmission || ts.emission;
871
+ if (text && text.trim() && !speakerMuted) {
872
+ handleSpeak(text);
873
+ }
874
+ });
875
+ } else {
876
+ setCurrentDialogState({
877
+ ...currentState,
878
+ emission,
879
+ });
694
880
 
695
881
  if (emission) {
696
882
  pushMessage({
697
883
  text: emission,
698
884
  emitter: currentState.emitter,
699
- media: currentState.media,
885
+ media: currentState.emittedMedia ?? currentState.media,
700
886
  fromUser: false,
701
887
  questionAnswered: msg,
888
+ generatedByAI: !!currentState.completion,
702
889
  contextVars: currentState.contextVars,
703
890
  date: currentState.currentDate,
704
891
  placeName: currentState.currentPlaceName,
@@ -708,118 +895,43 @@ const MemoriWidget = ({
708
895
  tag: currentState.currentTag,
709
896
  memoryTags: currentState.memoryTags,
710
897
  });
711
- speak(emission);
712
- }
713
- } else {
714
- console.error(response, resp);
715
- toast.error(t(getErrori18nKey(resp.resultCode)));
716
- gotError = true;
717
- }
718
- } else if (currentState.state === 'X2d' && memori.giverTag) {
719
- const { currentState, ...resp } = await postTextEnteredEvent({
720
- sessionId: sessionID,
721
- text: Math.random().toString().substring(2, 8),
722
- });
723
-
724
- if (resp.resultCode === 0) {
725
- const { currentState, ...resp } = await postTagChangedEvent(
726
- sessionID,
727
- memori.giverTag
728
- );
729
-
730
- if (resp.resultCode === 0) {
731
- setCurrentDialogState(currentState);
732
-
733
- if (emission) {
734
- pushMessage({
735
- text: emission,
736
- emitter: currentState.emitter,
737
- media: currentState.media,
738
- fromUser: false,
739
- questionAnswered: msg,
740
- contextVars: currentState.contextVars,
741
- date: currentState.currentDate,
742
- placeName: currentState.currentPlaceName,
743
- placeLatitude: currentState.currentLatitude,
744
- placeLongitude: currentState.currentLongitude,
745
- placeUncertaintyKm: currentState.currentUncertaintyKm,
746
- tag: currentState.currentTag,
747
- memoryTags: currentState.memoryTags,
748
- });
749
- speak(emission);
898
+ if (emission && emission.trim()) {
899
+ handleSpeak(emission);
750
900
  }
751
- } else {
752
- console.error(response, resp);
753
- toast.error(t(getErrori18nKey(resp.resultCode)));
754
- gotError = true;
755
901
  }
756
- } else {
757
- console.error(response, resp);
758
- toast.error(t(getErrori18nKey(resp.resultCode)));
759
- gotError = true;
760
902
  }
761
- } else if (
762
- userLang.toLowerCase() !== language.toLowerCase() &&
763
- emission &&
764
- !instruct &&
765
- isMultilanguageEnabled
766
- ) {
767
- translateDialogState(currentState, userLang, msg).then(ts => {
768
- if (ts.emission) {
769
- speak(ts.emission);
903
+ } else if (response.resultCode === 404) {
904
+ // Handle expired session
905
+ // remove last sent message, will set it as initial
906
+ setHistory(h => [...h.slice(0, h.length - 1)]);
907
+
908
+ reopenSession(
909
+ false,
910
+ memoriPwd || memori.secretToken,
911
+ memoriTokens,
912
+ undefined,
913
+ undefined,
914
+ {
915
+ PATHNAME: window.location.pathname,
916
+ ROUTE: window.location.pathname?.split('/')?.pop() || '',
917
+ ...(initialContextVars || {}),
918
+ },
919
+ initialQuestion
920
+ ).then(state => {
921
+ console.info('session timeout');
922
+ if (state?.sessionID) {
923
+ setTimeout(() => {
924
+ sendMessage(text, media, state?.sessionID);
925
+ }, 500);
770
926
  }
771
927
  });
772
- } else {
773
- setCurrentDialogState({
774
- ...currentState,
775
- emission,
776
- });
777
-
778
- if (emission) {
779
- pushMessage({
780
- text: emission,
781
- emitter: currentState.emitter,
782
- media: currentState.media,
783
- fromUser: false,
784
- questionAnswered: msg,
785
- generatedByAI: !!currentState.completion,
786
- contextVars: currentState.contextVars,
787
- date: currentState.currentDate,
788
- placeName: currentState.currentPlaceName,
789
- placeLatitude: currentState.currentLatitude,
790
- placeLongitude: currentState.currentLongitude,
791
- placeUncertaintyKm: currentState.currentUncertaintyKm,
792
- tag: currentState.currentTag,
793
- memoryTags: currentState.memoryTags,
794
- });
795
- speak(emission);
796
- }
797
928
  }
798
- } else if (response.resultCode === 404) {
799
- // remove last sent message, will set it as initial
800
- setHistory(h => [...h.slice(0, h.length - 1)]);
801
-
802
- // post session timeout -> Z0/A0 -> restart session and re-send msg
803
- reopenSession(
804
- false,
805
- memoriPwd || memori.secretToken,
806
- memoriTokens,
807
- instruct && memori.giverTag ? memori.giverTag : undefined,
808
- instruct && memori.giverPIN ? memori.giverPIN : undefined,
809
- {
810
- PATHNAME: window.location.pathname,
811
- ROUTE: window.location.pathname?.split('/')?.pop() || '',
812
- ...(initialContextVars || {}),
813
- },
814
- initialQuestion
815
- ).then(state => {
816
- console.info('session timeout');
817
- if (state?.sessionID) {
818
- setTimeout(() => {
819
- sendMessage(text, media, state?.sessionID);
820
- }, 500);
821
- }
822
- });
929
+ } catch (error) {
930
+ console.error(error);
931
+ gotError = true;
932
+
933
+ setTypingText(undefined);
934
+ setMemoriTyping(false);
823
935
  }
824
936
 
825
937
  if (!hasBatchQueued) {
@@ -829,30 +941,40 @@ const MemoriWidget = ({
829
941
  };
830
942
 
831
943
  /**
832
- * Traduzioni istantanee
944
+ * An enhanced version of translateDialogState that integrates smooth speaking
945
+ * This preserves all your existing logic while improving speech reliability
833
946
  */
834
947
  const translateDialogState = async (
835
948
  state: DialogState,
836
949
  userLang: string,
837
- msg?: string
950
+ msg?: string,
951
+ avoidPushingMessage: boolean = false
838
952
  ) => {
839
- const emission = state.emission ?? currentDialogState?.emission;
953
+ // console.log('[TRANSLATE] Starting translation with params:', {
954
+ // state,
955
+ // userLang,
956
+ // msg
957
+ // });
958
+
959
+ const emission = state?.emission ?? currentDialogState?.emission;
840
960
 
841
961
  let translatedState = { ...state };
842
962
  let translatedMsg = null;
843
963
 
964
+ // Skip translation if not needed
844
965
  if (
845
966
  !emission ||
846
- instruct ||
847
967
  language.toUpperCase() === userLang.toUpperCase() ||
848
- !isMultilanguageEnabled
968
+ !isMultilanguageEnabled ||
969
+ avoidPushingMessage
849
970
  ) {
971
+ // console.log('[TRANSLATE] Skipping translation - using original emission');
850
972
  translatedState = { ...state, emission };
851
973
  if (emission) {
852
974
  translatedMsg = {
853
975
  text: emission,
854
976
  emitter: state.emitter,
855
- media: state.media,
977
+ media: state.emittedMedia ?? state.media,
856
978
  fromUser: false,
857
979
  questionAnswered: msg,
858
980
  contextVars: state.contextVars,
@@ -866,45 +988,72 @@ const MemoriWidget = ({
866
988
  };
867
989
  }
868
990
  } else {
869
- const t = await getTranslation(emission, userLang, language, baseUrl);
870
- if (state.hints && state.hints.length > 0) {
871
- const translatedHints = await Promise.all(
872
- (state.hints ?? []).map(async hint => {
873
- const tHint = await getTranslation(
874
- hint,
875
- userLang,
876
- language,
877
- baseUrl
878
- );
879
- return {
880
- text: tHint?.text ?? hint,
881
- originalText: hint,
882
- } as TranslatedHint;
883
- })
884
- );
885
- translatedState = {
886
- ...state,
887
- emission: t.text,
888
- translatedHints,
889
- };
890
- } else {
891
- translatedState = {
892
- ...state,
893
- emission: t.text,
894
- hints:
895
- state.hints ??
896
- (state.state === 'G1' ? currentDialogState?.hints : []),
897
- };
898
- }
991
+ try {
992
+ // console.log('[TRANSLATE] Translating emission');
993
+ const t = await getTranslation(emission, userLang, language, baseUrl);
994
+
995
+ // Handle hints translation if present
996
+ if (state.hints && state.hints.length > 0) {
997
+ // console.log('[TRANSLATE] Translating hints');
998
+ const translatedHints = await Promise.all(
999
+ (state.hints ?? []).map(async hint => {
1000
+ const tHint = await getTranslation(
1001
+ hint,
1002
+ userLang,
1003
+ language,
1004
+ baseUrl
1005
+ );
1006
+ return {
1007
+ text: tHint?.text ?? hint,
1008
+ originalText: hint,
1009
+ } as TranslatedHint;
1010
+ })
1011
+ );
1012
+ translatedState = {
1013
+ ...state,
1014
+ emission: t.text,
1015
+ translatedHints,
1016
+ };
1017
+ } else {
1018
+ translatedState = {
1019
+ ...state,
1020
+ emission: emission,
1021
+ translatedEmission: t.text,
1022
+ hints:
1023
+ state.hints ??
1024
+ (state.state === 'G1' ? currentDialogState?.hints : []),
1025
+ };
1026
+ }
899
1027
 
900
- if (t.text.length > 0)
1028
+ if (t.text.length > 0) {
1029
+ // console.log('[TRANSLATE] Creating translated message');
1030
+ translatedMsg = {
1031
+ text: emission,
1032
+ translatedText: t.text,
1033
+ emitter: state.emitter,
1034
+ media: state.emittedMedia ?? state.media,
1035
+ fromUser: false,
1036
+ questionAnswered: msg,
1037
+ generatedByAI: !!state.completion,
1038
+ contextVars: state.contextVars,
1039
+ date: state.currentDate,
1040
+ placeName: state.currentPlaceName,
1041
+ placeLatitude: state.currentLatitude,
1042
+ placeLongitude: state.currentLongitude,
1043
+ placeUncertaintyKm: state.currentUncertaintyKm,
1044
+ tag: state.currentTag,
1045
+ memoryTags: state.memoryTags,
1046
+ };
1047
+ }
1048
+ } catch (error) {
1049
+ console.error('[TRANSLATE] Error during translation:', error);
1050
+ translatedState = { ...state, emission };
901
1051
  translatedMsg = {
902
- text: t.text,
1052
+ text: emission,
903
1053
  emitter: state.emitter,
904
- media: state.media,
1054
+ media: state.emittedMedia ?? state.media,
905
1055
  fromUser: false,
906
1056
  questionAnswered: msg,
907
- generatedByAI: !!state.completion,
908
1057
  contextVars: state.contextVars,
909
1058
  date: state.currentDate,
910
1059
  placeName: state.currentPlaceName,
@@ -914,10 +1063,13 @@ const MemoriWidget = ({
914
1063
  tag: state.currentTag,
915
1064
  memoryTags: state.memoryTags,
916
1065
  };
1066
+ }
917
1067
  }
918
1068
 
1069
+ // console.log('[TRANSLATE] Setting translated state and message');
919
1070
  setCurrentDialogState(translatedState);
920
- if (translatedMsg) {
1071
+ if (!avoidPushingMessage && translatedMsg) {
1072
+ // console.log('[TRANSLATE] Pushing translated message', translatedMsg);
921
1073
  pushMessage(translatedMsg);
922
1074
  }
923
1075
 
@@ -938,6 +1090,64 @@ const MemoriWidget = ({
938
1090
  const [birthDate, setBirthDate] = useState<string | undefined>();
939
1091
  const [showAgeVerification, setShowAgeVerification] = useState(false);
940
1092
 
1093
+ const getCultureCodeByLanguage = (lang?: string): string => {
1094
+ let voice = '';
1095
+ let voiceLang = (
1096
+ lang ||
1097
+ memori.culture?.split('-')?.[0] ||
1098
+ i18n.language ||
1099
+ 'IT'
1100
+ ).toUpperCase();
1101
+ switch (voiceLang) {
1102
+ case 'IT':
1103
+ voice = 'it-IT';
1104
+ break;
1105
+ case 'DE':
1106
+ voice = 'de-DE';
1107
+ break;
1108
+ case 'EN':
1109
+ voice = 'en-GB';
1110
+ break;
1111
+ case 'ES':
1112
+ voice = 'es-ES';
1113
+ break;
1114
+ case 'FR':
1115
+ voice = 'fr-FR';
1116
+ break;
1117
+ case 'PT':
1118
+ voice = 'pt-PT';
1119
+ break;
1120
+ case 'UK':
1121
+ voice = 'uk-UK';
1122
+ break;
1123
+ case 'RU':
1124
+ voice = 'ru-RU';
1125
+ break;
1126
+ case 'PL':
1127
+ voice = 'pl-PL';
1128
+ break;
1129
+ case 'FI':
1130
+ voice = 'fi-FI';
1131
+ break;
1132
+ case 'EL':
1133
+ voice = 'el-GR';
1134
+ break;
1135
+ case 'AR':
1136
+ voice = 'ar-SA';
1137
+ break;
1138
+ case 'ZH':
1139
+ voice = 'zh-CN';
1140
+ break;
1141
+ case 'JA':
1142
+ voice = 'ja-JP';
1143
+ break;
1144
+ default:
1145
+ voice = 'it-IT';
1146
+ break;
1147
+ }
1148
+ return voice;
1149
+ };
1150
+
941
1151
  /**
942
1152
  * Sessione
943
1153
  */
@@ -951,7 +1161,15 @@ const MemoriWidget = ({
951
1161
  onStateChange(state);
952
1162
  }
953
1163
 
954
- const executableSnippets = state?.media?.filter(
1164
+ const e: MemoriNewDialogStateEvent = new CustomEvent(
1165
+ 'MemoriNewDialogState',
1166
+ {
1167
+ detail: state,
1168
+ }
1169
+ );
1170
+ document.dispatchEvent(e);
1171
+
1172
+ const executableSnippets = (state?.emittedMedia ?? state?.media)?.filter(
955
1173
  m => m.mimeType === 'text/javascript' && !!m.properties?.executable
956
1174
  );
957
1175
  executableSnippets?.forEach(s => {
@@ -972,25 +1190,40 @@ const MemoriWidget = ({
972
1190
  }, 400);
973
1191
  }, 1000);
974
1192
  } catch (e) {
975
- console.error(e);
1193
+ console.warn(e);
976
1194
  }
977
1195
  });
978
1196
  };
1197
+
1198
+ /**
1199
+ * Opening Session
1200
+ */
1201
+ /**
1202
+ * Fetches a new session with the given parameters
1203
+ * @param params OpenSession parameters
1204
+ * @returns Promise resolving to dialog state and session ID if successful, void otherwise
1205
+ */
979
1206
  const fetchSession = async (
980
1207
  params: OpenSession
981
- ): Promise<{
982
- dialogState: DialogState;
983
- sessionID: string;
984
- } | void> => {
1208
+ ): Promise<
1209
+ | (ResponseSpec & {
1210
+ dialogState?: DialogState;
1211
+ sessionID: string;
1212
+ })
1213
+ | undefined
1214
+ | void
1215
+ > => {
985
1216
  let storageBirthDate = getLocalConfig<string | undefined>(
986
1217
  'birthDate',
987
1218
  undefined
988
1219
  );
989
- if (!(birthDate || storageBirthDate) && !!minAge) {
1220
+ let userBirthDate = birthDate ?? params.birthDate ?? storageBirthDate;
1221
+ if (!userBirthDate && !!minAge) {
990
1222
  setShowAgeVerification(true);
991
1223
  return;
992
1224
  }
993
1225
 
1226
+ // Check if authentication is needed for private Memori
994
1227
  if (
995
1228
  memori.privacyType !== 'PUBLIC' &&
996
1229
  !memori.secretToken &&
@@ -1000,30 +1233,36 @@ const MemoriWidget = ({
1000
1233
  setAuthModalState('password');
1001
1234
  return;
1002
1235
  }
1003
- setLoading(true);
1004
- try {
1005
- if (!memori.giverTag && !!memori.receivedInvitations?.length) {
1006
- let giverInvitation = memori.receivedInvitations.find(
1007
- (i: Invitation) => i.type === 'GIVER' && i.state === 'ACCEPTED'
1008
- );
1009
1236
 
1010
- if (giverInvitation) {
1011
- memori.giverTag = giverInvitation.tag;
1012
- memori.giverPIN = giverInvitation.pin;
1013
- }
1014
- }
1237
+ setLoading(true);
1015
1238
 
1239
+ try {
1240
+ // Check for and set giver invitation if available
1241
+ // if (!memori.giverTag && !!memori.receivedInvitations?.length) {
1242
+ // let giverInvitation = memori.receivedInvitations.find(
1243
+ // (i: Invitation) => i.type === 'GIVER' && i.state === 'ACCEPTED'
1244
+ // );
1245
+
1246
+ // if (giverInvitation) {
1247
+ // memori.giverTag = giverInvitation.tag;
1248
+ // memori.giverPIN = giverInvitation.pin;
1249
+ // }
1250
+ // }
1251
+
1252
+ // Get referral URL
1016
1253
  let referral;
1017
1254
  try {
1018
1255
  referral = (() => {
1019
1256
  return window.location.href;
1020
1257
  })();
1021
1258
  } catch (err) {
1022
- console.error(err);
1259
+ console.debug(err);
1023
1260
  }
1024
1261
 
1262
+ // Initialize session with parameters
1025
1263
  const session = await initSession({
1026
1264
  ...params,
1265
+ birthDate: userBirthDate,
1027
1266
  tag: params.tag ?? personification?.tag,
1028
1267
  pin: params.pin ?? personification?.pin,
1029
1268
  additionalInfo: {
@@ -1032,8 +1271,11 @@ const MemoriWidget = ({
1032
1271
  userToken ?? loginToken ?? additionalInfo?.loginToken ?? authToken,
1033
1272
  language: getCultureCodeByLanguage(userLang),
1034
1273
  referral: referral,
1274
+ timeZoneOffset: new Date().getTimezoneOffset().toString(),
1035
1275
  },
1036
1276
  });
1277
+
1278
+ // Handle successful session creation
1037
1279
  if (
1038
1280
  session?.sessionID &&
1039
1281
  session?.currentState &&
@@ -1041,32 +1283,77 @@ const MemoriWidget = ({
1041
1283
  ) {
1042
1284
  setSessionId(session.sessionID);
1043
1285
 
1044
- if (position) applyPosition(position, session.sessionID);
1286
+ // save giver state
1287
+ if (currentDialogState?.currentTag && memori.giverTag) {
1288
+ setInstruct(currentDialogState?.currentTag === memori.giverTag);
1289
+ } else {
1290
+ setInstruct(false);
1291
+ }
1292
+
1293
+ if (position && memori.needsPosition)
1294
+ applyPosition(position, session.sessionID);
1045
1295
 
1046
1296
  setLoading(false);
1047
1297
  return {
1048
1298
  dialogState: session.currentState,
1049
1299
  sessionID: session.sessionID,
1050
- } as { dialogState: DialogState; sessionID: string };
1051
- } else if (
1300
+ } as any;
1301
+ }
1302
+ // Handle age restriction error
1303
+ else if (
1052
1304
  session?.resultMessage.startsWith('This Memori is aged restricted')
1053
1305
  ) {
1054
- console.error(session);
1306
+ console.warn(session);
1055
1307
  toast.error(t('underageTwinSession', { age: minAge }));
1056
1308
  setGotErrorInOpening(true);
1057
- } else if (session?.resultCode === 403) {
1309
+ }
1310
+ // Handle authentication error
1311
+ else if (session?.resultCode === 403) {
1058
1312
  setMemoriPwd(undefined);
1059
1313
  setAuthModalState('password');
1060
- } else {
1061
- console.error(session);
1062
- toast.error(t(getErrori18nKey(session?.resultCode)));
1314
+ return session;
1315
+ }
1316
+ // Handle other errors
1317
+ else {
1318
+ console.warn(session);
1319
+ toast.error(
1320
+ tst => (
1321
+ <div>
1322
+ <p>{t(getErrori18nKey(session?.resultCode))}</p>
1323
+ <Button
1324
+ outlined
1325
+ padded={false}
1326
+ onClick={() => toast.dismiss(tst.id)}
1327
+ icon={<CloseIcon />}
1328
+ >
1329
+ {t('close')}
1330
+ </Button>
1331
+ </div>
1332
+ ),
1333
+ {
1334
+ duration: Infinity,
1335
+ }
1336
+ );
1063
1337
  setGotErrorInOpening(true);
1338
+ return session;
1064
1339
  }
1065
1340
  } catch (err) {
1066
1341
  console.error(err);
1067
- new Error('Error fetching session');
1068
1342
  }
1069
1343
  };
1344
+
1345
+ /**
1346
+ * Reopens an existing session with optional parameters
1347
+ * @param updateDialogState Whether to update dialog state
1348
+ * @param password Optional password for authentication
1349
+ * @param recoveryTokens Optional recovery tokens
1350
+ * @param tag Optional tag
1351
+ * @param pin Optional PIN
1352
+ * @param initialContextVars Optional initial context variables
1353
+ * @param initialQuestion Optional initial question
1354
+ * @param birthDate Optional birth date for age verification
1355
+ * @returns Promise resolving to dialog state and session ID if successful, null otherwise
1356
+ */
1070
1357
  const reopenSession = async (
1071
1358
  updateDialogState: boolean = false,
1072
1359
  password?: string,
@@ -1077,17 +1364,37 @@ const MemoriWidget = ({
1077
1364
  initialQuestion?: string,
1078
1365
  birthDate?: string
1079
1366
  ) => {
1367
+ // console.log('[REOPEN_SESSION] Starting reopenSession with params:', {
1368
+ // updateDialogState,
1369
+ // hasPassword: !!password,
1370
+ // hasRecoveryTokens: !!recoveryTokens,
1371
+ // tag,
1372
+ // hasPin: !!pin,
1373
+ // initialContextVars,
1374
+ // initialQuestion,
1375
+ // hasBirthDate: !!birthDate
1376
+ // });
1377
+
1378
+ // Set loading state while reopening session
1080
1379
  setLoading(true);
1380
+
1381
+ // Get birth date from local storage if not provided
1382
+ let storageBirthDate = getLocalConfig<string | undefined>(
1383
+ 'birthDate',
1384
+ undefined
1385
+ );
1386
+ let userBirthDate = birthDate ?? storageBirthDate;
1387
+ // console.log('[REOPEN_SESSION] Using birth date:', userBirthDate);
1388
+
1081
1389
  try {
1082
- let storageBirthDate = getLocalConfig<string | undefined>(
1083
- 'birthDate',
1084
- undefined
1085
- );
1086
- if (!(birthDate || storageBirthDate) && !!minAge) {
1390
+ // Show age verification if required and birth date not provided
1391
+ if (!userBirthDate && !!minAge) {
1392
+ // console.log('[REOPEN_SESSION] Age verification required, showing modal');
1087
1393
  setShowAgeVerification(true);
1088
1394
  return;
1089
1395
  }
1090
1396
 
1397
+ // Check if authentication is needed based on privacy type and credentials
1091
1398
  if (
1092
1399
  memori.privacyType !== 'PUBLIC' &&
1093
1400
  !password &&
@@ -1096,53 +1403,66 @@ const MemoriWidget = ({
1096
1403
  !recoveryTokens &&
1097
1404
  !memoriTokens
1098
1405
  ) {
1406
+ // console.log('[REOPEN_SESSION] Authentication required, showing modal');
1099
1407
  setAuthModalState('password');
1100
1408
  return;
1101
1409
  }
1102
1410
 
1411
+ // Get current URL as referral
1103
1412
  let referral;
1104
1413
  try {
1105
1414
  referral = (() => {
1106
1415
  return window.location.href;
1107
1416
  })();
1417
+ console.log('[REOPEN_SESSION] Got referral:', referral);
1108
1418
  } catch (err) {
1109
- console.error(err);
1419
+ console.debug('[REOPEN_SESSION] Error getting referral:', err);
1110
1420
  }
1111
1421
 
1422
+ // Initialize session with provided parameters
1423
+ // console.log('[REOPEN_SESSION] Initializing session...');
1112
1424
  const { sessionID, currentState, ...response } = await initSession({
1113
1425
  memoriID: memori.engineMemoriID ?? '',
1114
1426
  password: password || memoriPwd || memori.secretToken,
1115
1427
  recoveryTokens: recoveryTokens || memoriTokens,
1116
- tag,
1117
- pin,
1428
+ tag: tag ?? personification?.tag,
1429
+ pin: pin ?? personification?.pin,
1118
1430
  initialContextVars: {
1119
1431
  PATHNAME: window.location.pathname,
1120
1432
  ROUTE: window.location.pathname?.split('/')?.pop() || '',
1121
1433
  ...(initialContextVars || {}),
1122
1434
  },
1123
1435
  initialQuestion,
1124
- birthDate: birthDate || storageBirthDate || undefined,
1436
+ birthDate: userBirthDate,
1125
1437
  additionalInfo: {
1126
1438
  ...(additionalInfo || {}),
1127
1439
  loginToken:
1128
1440
  userToken ?? loginToken ?? additionalInfo?.loginToken ?? authToken,
1129
1441
  language: getCultureCodeByLanguage(userLang),
1130
1442
  referral: referral,
1443
+ timeZoneOffset: new Date().getTimezoneOffset().toString(),
1131
1444
  },
1132
1445
  });
1133
1446
 
1447
+ // Handle successful session initialization
1134
1448
  if (sessionID && currentState && response.resultCode === 0) {
1449
+ // console.log('[REOPEN_SESSION] Session initialized successfully:', sessionID);
1135
1450
  setSessionId(sessionID);
1136
1451
 
1452
+ // Update dialog state and history if requested
1137
1453
  if (updateDialogState) {
1454
+ // console.log('[REOPEN_SESSION] Updating dialog state');
1138
1455
  setCurrentDialogState(currentState);
1456
+
1139
1457
  if (currentState.emission) {
1458
+ // console.log('[REOPEN_SESSION] Processing emission:', currentState.emission);
1459
+ // Set initial message or append to existing history
1140
1460
  history.length <= 1
1141
1461
  ? setHistory([
1142
1462
  {
1143
1463
  text: currentState.emission,
1144
1464
  emitter: currentState.emitter,
1145
- media: currentState.media,
1465
+ media: currentState.emittedMedia ?? currentState.media,
1146
1466
  fromUser: false,
1147
1467
  initial: true,
1148
1468
  contextVars: currentState.contextVars,
@@ -1158,7 +1478,7 @@ const MemoriWidget = ({
1158
1478
  : pushMessage({
1159
1479
  text: currentState.emission,
1160
1480
  emitter: currentState.emitter,
1161
- media: currentState.media,
1481
+ media: currentState.emittedMedia ?? currentState.media,
1162
1482
  fromUser: false,
1163
1483
  initial: true,
1164
1484
  contextVars: currentState.contextVars,
@@ -1173,49 +1493,193 @@ const MemoriWidget = ({
1173
1493
  }
1174
1494
  }
1175
1495
 
1176
- if (position) applyPosition(position, sessionID);
1177
- if (memori.needsDateTime)
1496
+ // Apply position and date settings if needed
1497
+ if (position && memori.needsPosition) {
1498
+ // console.log('[REOPEN_SESSION] Applying position');
1499
+ applyPosition(position, sessionID);
1500
+ }
1501
+ if (memori.needsDateTime) {
1502
+ // console.log('[REOPEN_SESSION] Sending date changed event');
1178
1503
  sendDateChangedEvent({ sessionID: sessionID, state: currentState });
1504
+ }
1179
1505
 
1180
1506
  setLoading(false);
1181
1507
  return {
1182
1508
  dialogState: currentState,
1183
1509
  sessionID,
1184
1510
  };
1185
- } else if (
1511
+ }
1512
+ // Handle age restriction error
1513
+ else if (
1186
1514
  response?.resultMessage.startsWith('This Memori is aged restricted')
1187
1515
  ) {
1188
- console.error(response);
1516
+ console.error('[REOPEN_SESSION] Age restriction error:', response);
1189
1517
  toast.error(t('underageTwinSession', { age: minAge }));
1190
1518
  setGotErrorInOpening(true);
1191
- } else if (response?.resultCode === 403) {
1519
+ }
1520
+ // Handle authentication error
1521
+ else if (response?.resultCode === 403) {
1522
+ console.error('[REOPEN_SESSION] Authentication error');
1192
1523
  setMemoriPwd(undefined);
1193
1524
  setAuthModalState('password');
1194
- } else {
1195
- console.error(response);
1525
+ }
1526
+ // Handle other errors
1527
+ else {
1528
+ console.error('[REOPEN_SESSION] Other error:', response);
1196
1529
  toast.error(t(getErrori18nKey(response.resultCode)));
1197
1530
  setGotErrorInOpening(true);
1198
1531
  }
1199
1532
  } catch (err) {
1200
- console.error(err);
1533
+ console.error('[REOPEN_SESSION] Caught error:', err);
1201
1534
  }
1535
+ // Reset loading state
1202
1536
  setLoading(false);
1203
1537
 
1204
1538
  return null;
1205
1539
  };
1206
1540
 
1207
- const changeTag = async (
1208
- memoriId: string,
1209
- sessionId: string,
1210
- tag?: string,
1211
- pin?: string
1541
+ const [chatLogs, setChatLogs] = useState<any[]>([]);
1542
+ const resumeSession = async (
1543
+ chatLog: ChatLog,
1544
+ questionsAndAnswers: { question: string; answer: string }[],
1545
+ initialContextVars?: { [key: string]: string },
1546
+ initialQuestion?: string,
1547
+ birthDate?: string
1212
1548
  ) => {
1213
- if (!memoriId || !sessionId) {
1214
- console.error('CHANGETAG/Session not found');
1215
- return Promise.reject('Session not found');
1216
- }
1549
+ // Set loading state while reopening session
1550
+ setLoading(true);
1217
1551
 
1218
- try {
1552
+ // Get birth date from local storage if not provided
1553
+ let storageBirthDate = getLocalConfig<string | undefined>(
1554
+ 'birthDate',
1555
+ undefined
1556
+ );
1557
+ let userBirthDate = birthDate ?? storageBirthDate;
1558
+ // console.log('[REOPEN_SESSION] Using birth date:', userBirthDate);
1559
+
1560
+ try {
1561
+ // Show age verification if required and birth date not provided
1562
+ if (!userBirthDate && !!minAge) {
1563
+ // console.log('[REOPEN_SESSION] Age verification required, showing modal');
1564
+ setShowAgeVerification(true);
1565
+ return;
1566
+ }
1567
+
1568
+ // Check if authentication is needed based on privacy type and credentials
1569
+ if (
1570
+ memori.privacyType !== 'PUBLIC' &&
1571
+ !memoriPassword &&
1572
+ !memori.secretToken &&
1573
+ !memoriPwd &&
1574
+ !memoriTokens
1575
+ ) {
1576
+ // console.log('[REOPEN_SESSION] Authentication required, showing modal');
1577
+ setAuthModalState('password');
1578
+ return;
1579
+ }
1580
+
1581
+ // Get current URL as referral
1582
+ let referral;
1583
+ try {
1584
+ referral = (() => {
1585
+ return window.location.href;
1586
+ })();
1587
+ console.log('[REOPEN_SESSION] Got referral:', referral);
1588
+ } catch (err) {
1589
+ console.debug('[REOPEN_SESSION] Error getting referral:', err);
1590
+ }
1591
+
1592
+ // Initialize session with provided parameters
1593
+ // console.log('[REOPEN_SESSION] Initializing session...');
1594
+ const { sessionID, currentState, ...response } = await initSession({
1595
+ memoriID: memori.engineMemoriID ?? '',
1596
+ password: memoriPassword || memoriPwd || memori.secretToken,
1597
+ recoveryTokens: memoriTokens,
1598
+ tag: personification?.tag,
1599
+ pin: personification?.pin,
1600
+ continueFromChatLogID: chatLog.chatLogID,
1601
+ initialContextVars: {
1602
+ PATHNAME: window.location.pathname,
1603
+ ROUTE: window.location.pathname?.split('/')?.pop() || '',
1604
+ ...(initialContextVars || {}),
1605
+ },
1606
+ initialQuestion,
1607
+ birthDate: userBirthDate,
1608
+ additionalInfo: {
1609
+ ...(additionalInfo || {}),
1610
+ loginToken:
1611
+ userToken ?? loginToken ?? additionalInfo?.loginToken ?? authToken,
1612
+ language: getCultureCodeByLanguage(userLang),
1613
+ referral: referral,
1614
+ timeZoneOffset: new Date().getTimezoneOffset().toString(),
1615
+ },
1616
+ });
1617
+
1618
+ // Handle successful session initialization
1619
+ if (sessionID) {
1620
+ // console.log('[REOPEN_SESSION] Session initialized successfully:', sessionID);
1621
+ setSessionId(sessionID);
1622
+
1623
+ // console.log('[REOPEN_SESSION] Processing emission:', currentState.emission);
1624
+ // Set initial message or append to existing history
1625
+ setHistory(
1626
+ chatLog.lines.map(log => ({
1627
+ text: log.text,
1628
+ emitter: log.emitter,
1629
+ media: log.media?.map(m => ({
1630
+ ...m,
1631
+ mediumID:
1632
+ 'mediumID' in m ? String(m.mediumID) : crypto.randomUUID(),
1633
+ })),
1634
+ fromUser: log.inbound,
1635
+ initial: false,
1636
+ contextVars: log.contextVars,
1637
+ date: log.timestamp,
1638
+ }))
1639
+ );
1640
+
1641
+ setChatLogs(questionsAndAnswers);
1642
+ }
1643
+
1644
+ // Handle age restriction error
1645
+ else if (
1646
+ response?.resultMessage.startsWith('This Memori is aged restricted')
1647
+ ) {
1648
+ console.error('[REOPEN_SESSION] Age restriction error:', response);
1649
+ toast.error(t('underageTwinSession', { age: minAge }));
1650
+ setGotErrorInOpening(true);
1651
+ }
1652
+ // Handle authentication error
1653
+ else if (response?.resultCode === 403) {
1654
+ console.error('[REOPEN_SESSION] Authentication error');
1655
+ setMemoriPwd(undefined);
1656
+ setAuthModalState('password');
1657
+ }
1658
+ // Handle other errors
1659
+ else {
1660
+ console.error('[REOPEN_SESSION] Other error:', response);
1661
+ toast.error(t(getErrori18nKey(response.resultCode)));
1662
+ setGotErrorInOpening(true);
1663
+ }
1664
+ } catch (err) {
1665
+ console.error('[RESUME_SESSION] Caught error:', err);
1666
+ }
1667
+
1668
+ setLoading(false);
1669
+ };
1670
+
1671
+ const changeTag = async (
1672
+ memoriId: string,
1673
+ sessionId: string,
1674
+ tag?: string,
1675
+ pin?: string
1676
+ ) => {
1677
+ if (!memoriId || !sessionId) {
1678
+ console.error('CHANGETAG/Session not found');
1679
+ return Promise.reject('Session not found');
1680
+ }
1681
+
1682
+ try {
1219
1683
  const { currentState, resultCode } = await postTagChangedEvent(
1220
1684
  sessionId,
1221
1685
  tag ?? anonTag
@@ -1258,14 +1722,14 @@ const MemoriWidget = ({
1258
1722
  return window.location.href;
1259
1723
  })();
1260
1724
  } catch (err) {
1261
- console.error(err);
1725
+ console.debug(err);
1262
1726
  }
1263
1727
 
1264
1728
  fetchSession({
1265
1729
  memoriID: memori.engineMemoriID ?? '',
1266
1730
  password: secret || memoriPwd || memori.secretToken,
1267
- tag: memori.giverTag,
1268
- pin: memori.giverPIN,
1731
+ tag: tag ?? personification?.tag,
1732
+ pin: pin ?? personification?.pin,
1269
1733
  initialContextVars: {
1270
1734
  PATHNAME: window.location.pathname,
1271
1735
  ROUTE: window.location.pathname?.split('/')?.pop() || '',
@@ -1282,6 +1746,7 @@ const MemoriWidget = ({
1282
1746
  authToken,
1283
1747
  language: getCultureCodeByLanguage(userLang),
1284
1748
  referral: referral,
1749
+ timeZoneOffset: new Date().getTimezoneOffset().toString(),
1285
1750
  },
1286
1751
  });
1287
1752
  } else if (!!currentState) {
@@ -1294,33 +1759,12 @@ const MemoriWidget = ({
1294
1759
  }
1295
1760
  } catch (_e) {
1296
1761
  let err = _e as Error;
1297
- console.error('[APPCONTEXT/CHANGETAG]', err);
1762
+ console.warn('[APPCONTEXT/CHANGETAG]', err);
1298
1763
  return Promise.reject(err);
1299
1764
  }
1300
1765
 
1301
1766
  return null;
1302
1767
  };
1303
- const restoreGiverTag = async () => {
1304
- if (sessionId && memori.giverTag && memori.giverPIN) {
1305
- setHistory([]);
1306
- await changeTag(
1307
- memori.engineMemoriID!,
1308
- sessionId,
1309
- memori.giverTag,
1310
- memori.giverPIN
1311
- );
1312
- }
1313
- };
1314
- useEffect(() => {
1315
- return () => {
1316
- if (
1317
- !currentDialogState ||
1318
- currentDialogState?.currentTag !== memori.giverTag
1319
- )
1320
- restoreGiverTag();
1321
- };
1322
- // eslint-disable-next-line react-hooks/exhaustive-deps
1323
- }, []);
1324
1768
 
1325
1769
  /**
1326
1770
  * Polling dates
@@ -1396,117 +1840,6 @@ const MemoriWidget = ({
1396
1840
  timeoutRef.current = undefined;
1397
1841
  }
1398
1842
  };
1399
- const resetInteractionTimeout = () => {
1400
- clearInteractionTimeout();
1401
- if (!isPlayingAudio && !userMessage.length && !memoriTyping && !listening)
1402
- setInteractionTimeout();
1403
- };
1404
- const handleTimeout = async () => {
1405
- if (
1406
- !hasUserActivatedSpeak ||
1407
- isPlayingAudio ||
1408
- !!userMessage.length ||
1409
- !!memoriTyping ||
1410
- listening
1411
- ) {
1412
- resetInteractionTimeout();
1413
- return;
1414
- } else if (
1415
- sessionId &&
1416
- hasUserActivatedSpeak &&
1417
- currentDialogState?.acceptsTimeout
1418
- ) {
1419
- const { currentState, ...response } = await postTimeoutEvent(sessionId);
1420
- if (response.resultCode === 0 && currentState) {
1421
- const emission = currentState.emission;
1422
- if (
1423
- !instruct &&
1424
- isMultilanguageEnabled &&
1425
- userLang !== i18n?.language &&
1426
- emission &&
1427
- emission.length > 0
1428
- ) {
1429
- translateDialogState(
1430
- { ...currentState, emission: emission },
1431
- userLang
1432
- ).then(ts => {
1433
- if (ts.emission) {
1434
- speak(ts.emission);
1435
- }
1436
- });
1437
- } else if (emission && emission.length > 0) {
1438
- pushMessage({
1439
- text: emission,
1440
- emitter: currentState.emitter,
1441
- media: currentState.media,
1442
- fromUser: false,
1443
- generatedByAI: !!currentState.completion,
1444
- contextVars: currentState.contextVars,
1445
- date: currentState.currentDate,
1446
- placeName: currentState.currentPlaceName,
1447
- placeLatitude: currentState.currentLatitude,
1448
- placeLongitude: currentState.currentLongitude,
1449
- placeUncertaintyKm: currentState.currentUncertaintyKm,
1450
- tag: currentState.currentTag,
1451
- memoryTags: currentState.memoryTags,
1452
- });
1453
- speak(emission);
1454
- setCurrentDialogState({
1455
- ...currentState,
1456
- hints:
1457
- currentState.hints ??
1458
- (currentState.state === 'G1' ? currentDialogState?.hints : []),
1459
- });
1460
- } else {
1461
- resetInteractionTimeout();
1462
- return;
1463
- }
1464
- }
1465
- }
1466
- };
1467
- const setInteractionTimeout = () => {
1468
- let timeout = currentDialogState?.timeout;
1469
- if (!timeout) {
1470
- let timeoutLimit = 40;
1471
- let timeoutMinLimit = 25;
1472
- timeout =
1473
- Math.floor(Math.random() * (timeoutLimit - timeoutMinLimit)) +
1474
- timeoutMinLimit;
1475
-
1476
- if (currentDialogState?.emission) {
1477
- let readTime = currentDialogState.emission.length / 26.5;
1478
- timeout = timeout + readTime;
1479
- }
1480
- }
1481
- if (forcedTimeout) {
1482
- timeout = forcedTimeout;
1483
-
1484
- if (currentDialogState?.emission) {
1485
- let readTime = currentDialogState.emission.length / 26.5;
1486
- timeout = timeout + readTime;
1487
- }
1488
- }
1489
-
1490
- let uiTimeout = setTimeout(handleTimeout, timeout * 1000);
1491
- setUserInteractionTimeout(uiTimeout);
1492
- timeoutRef.current = uiTimeout;
1493
- };
1494
- useEffect(() => {
1495
- if (!!userMessage.length || isPlayingAudio || !!memoriTyping)
1496
- clearInteractionTimeout();
1497
- if (sessionId && !!!userMessage.length) resetInteractionTimeout();
1498
- // eslint-disable-next-line react-hooks/exhaustive-deps
1499
- }, [
1500
- currentDialogState?.acceptsTimeout,
1501
- currentDialogState?.timeout,
1502
- currentDialogState?.state,
1503
- isPlayingAudio,
1504
- sessionId,
1505
- history,
1506
- userMessage,
1507
- memoriTyping,
1508
- hasUserActivatedSpeak,
1509
- ]);
1510
1843
  useEffect(() => {
1511
1844
  return () => {
1512
1845
  setHasUserActivatedSpeak(false);
@@ -1517,593 +1850,216 @@ const MemoriWidget = ({
1517
1850
  // eslint-disable-next-line react-hooks/exhaustive-deps
1518
1851
  }, []);
1519
1852
 
1520
- const initializeTTS = () => {
1521
- if (!AZURE_COGNITIVE_SERVICES_TTS_KEY) return;
1522
-
1523
- speechConfig = speechSdk.SpeechConfig.fromSubscription(
1524
- AZURE_COGNITIVE_SERVICES_TTS_KEY,
1525
- 'eastus'
1526
- );
1527
-
1528
- speechConfig.speechSynthesisLanguage = getCultureCodeByLanguage(userLang);
1529
- speechConfig.speechSynthesisVoiceName = getTTSVoice(userLang); // https://docs.microsoft.com/it-it/azure/cognitive-services/speech-service/language-support#text-to-speech
1530
- speechConfig.speechRecognitionLanguage = getCultureCodeByLanguage(userLang);
1531
-
1532
- if (hasTouchscreen())
1533
- speechConfig.speechSynthesisOutputFormat =
1534
- speechSdk.SpeechSynthesisOutputFormat.Audio16Khz32KBitRateMonoMp3;
1535
-
1536
- audioContext = new AudioContext();
1537
- let buffer = audioContext.createBuffer(1, 10000, 22050);
1538
- let source = audioContext.createBufferSource();
1539
- source.buffer = buffer;
1540
- source.connect(audioContext.destination);
1541
-
1542
- audioDestination = new speechSdk.SpeakerAudioDestination();
1543
- let audioConfig = speechSdk.AudioConfig.fromSpeakerOutput(audioDestination);
1544
- speechSynthesizer = new speechSdk.SpeechSynthesizer(
1545
- speechConfig,
1546
- audioConfig
1547
- );
1548
- };
1853
+ /**
1854
+ * Speech recognition event handlers
1855
+ */
1856
+ const [requestedListening, setRequestedListening] = useState(false);
1857
+ const startListeningRef = useRef<(() => Promise<void>) | null>(null);
1858
+
1859
+ console.log('tenantID', tenantID);
1860
+
1861
+ // Define TTS configuration
1862
+ const ttsConfig = useMemo(
1863
+ () => ({
1864
+ provider: ttsProvider,
1865
+ voice: getTTSVoice(
1866
+ userLang || memori.culture?.split('-')?.[0] || 'EN',
1867
+ ttsProvider,
1868
+ memori.voiceType as 'MALE' | 'FEMALE' | 'NEUTRAL'
1869
+ ),
1870
+ tenant: tenantID,
1871
+ region: 'westeurope',
1872
+ voiceType: memori.voiceType,
1873
+ layout: selectedLayout,
1874
+ }),
1875
+ [ttsProvider, userLang, memori.culture, memori.voiceType]
1876
+ );
1549
1877
 
1550
- const getTTSVoice = useCallback(
1551
- (lang?: string): string => {
1552
- let voice = '';
1553
- let voiceLang = (
1554
- lang ??
1555
- memori.culture?.split('-')?.[0] ??
1556
- i18n.language ??
1557
- 'IT'
1558
- ).toUpperCase();
1559
-
1560
- let voiceType = memori.voiceType;
1561
- if (memori.enableBoardOfExperts && currentDialogState?.emitter) {
1562
- let expert = experts?.find(e => e.name === currentDialogState?.emitter);
1563
-
1564
- // TODO: once got info from backend, select voice from expert
1565
- // if (expert?.voiceType) {
1566
- // voiceType = expert.voiceType;
1567
- // }
1568
- }
1878
+ const sttConfig = useMemo(
1879
+ () => ({
1880
+ provider: ttsProvider,
1881
+ language: getCultureCodeByLanguage(userLang),
1882
+ tenant: tenantID,
1883
+ }),
1884
+ [ttsProvider, userLang]
1885
+ );
1569
1886
 
1570
- // https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=tts
1571
- switch (voiceLang) {
1572
- case 'IT':
1573
- voice = `${
1574
- voiceType === 'MALE' ? 'it-IT-DiegoNeural' : 'it-IT-ElsaNeural'
1575
- }`;
1576
- break;
1577
- case 'DE':
1578
- voice = `${
1579
- voiceType === 'MALE' ? 'de-DE-ConradNeural' : 'de-DE-KatjaNeural'
1580
- }`;
1581
- break;
1582
- case 'EN':
1583
- voice = `${
1584
- voiceType === 'MALE' ? 'en-GB-RyanNeural' : 'en-GB-SoniaNeural'
1585
- }`;
1586
- break;
1587
- case 'ES':
1588
- voice = `${
1589
- voiceType === 'MALE' ? 'es-ES-AlvaroNeural' : 'es-ES-ElviraNeural'
1590
- }`;
1591
- break;
1592
- case 'FR':
1593
- voice = `${
1594
- voiceType === 'MALE' ? 'fr-FR-HenriNeural' : 'fr-FR-DeniseNeural'
1595
- }`;
1596
- break;
1597
- case 'PT':
1598
- voice = `${
1599
- voiceType === 'MALE' ? 'pt-PT-DuarteNeural' : 'pt-PT-RaquelNeural'
1600
- }`;
1601
- break;
1602
- case 'UK':
1603
- voice = `${
1604
- voiceType === 'MALE' ? 'uk-UA-OstapNeural' : 'uk-UA-PolinaNeural'
1605
- }`;
1606
- break;
1607
- case 'RU':
1608
- voice = `${
1609
- voiceType === 'MALE' ? 'ru-RU-DmitryNeural' : 'ru-RU-SvetlanaNeural'
1610
- }`;
1611
- break;
1612
- case 'PL':
1613
- voice = `${
1614
- voiceType === 'MALE' ? 'pl-PL-MarekNeural' : 'pl-PL-AgnieszkaNeural'
1615
- }`;
1616
- break;
1617
- case 'FI':
1618
- voice = `${
1619
- voiceType === 'MALE' ? 'fi-FI-HarriNeural' : 'fi-FI-SelmaNeural'
1620
- }`;
1621
- break;
1622
- case 'EL':
1623
- voice = `${
1624
- voiceType === 'MALE' ? 'el-GR-NestorasNeural' : 'el-GR-AthinaNeural'
1625
- }`;
1626
- break;
1627
- case 'AR':
1628
- voice = `${
1629
- voiceType === 'MALE' ? 'ar-SA-HamedNeural' : 'ar-SA-ZariyahNeural'
1630
- }`;
1631
- break;
1632
- case 'ZH':
1633
- voice = `${
1634
- voiceType === 'MALE' ? 'zh-CN-YunxiNeural' : 'zh-CN-XiaoxiaoNeural'
1635
- }`;
1636
- break;
1637
- case 'JA':
1638
- voice = `${
1639
- voiceType === 'MALE' ? 'ja-JP-KeitaNeural' : 'ja-JP-NanamiNeural'
1640
- }`;
1641
- break;
1642
- default:
1643
- voice = `${
1644
- voiceType === 'MALE' ? 'it-IT-DiegoNeural' : 'it-IT-IsabellaNeural'
1645
- }`;
1646
- break;
1647
- }
1648
- return voice;
1887
+ // Initialize TTS hook with basic options first
1888
+ const {
1889
+ speak: ttsSpeak,
1890
+ stop: ttsStop,
1891
+ isPlaying: isPlayingAudio,
1892
+ speakerMuted,
1893
+ toggleMute,
1894
+ hasUserActivatedSpeak,
1895
+ setHasUserActivatedSpeak,
1896
+ error,
1897
+ setError,
1898
+ } = useTTS(
1899
+ ttsConfig as TTSConfig,
1900
+ {
1901
+ apiUrl: `${baseUrl}/api/tts`,
1902
+ continuousSpeech: continuousSpeech,
1903
+ preview: preview,
1649
1904
  },
1650
- [
1651
- memori.voiceType,
1652
- memori.enableBoardOfExperts,
1653
- currentDialogState?.emitter,
1654
- i18n.language,
1655
- memori.culture,
1656
- ]
1905
+ autoStart,
1906
+ defaultEnableAudio,
1907
+ defaultSpeakerActive
1657
1908
  );
1658
1909
 
1659
- const getCultureCodeByLanguage = (lang?: string): string => {
1660
- let voice = '';
1661
- let voiceLang = (
1662
- lang ||
1663
- memori.culture?.split('-')?.[0] ||
1664
- i18n.language ||
1665
- 'IT'
1666
- ).toUpperCase();
1667
- switch (voiceLang) {
1668
- case 'IT':
1669
- voice = 'it-IT';
1670
- break;
1671
- case 'DE':
1672
- voice = 'de-DE';
1673
- break;
1674
- case 'EN':
1675
- voice = 'en-GB';
1676
- break;
1677
- case 'ES':
1678
- voice = 'es-ES';
1679
- break;
1680
- case 'FR':
1681
- voice = 'fr-FR';
1682
- break;
1683
- case 'PT':
1684
- voice = 'pt-PT';
1685
- break;
1686
- case 'UK':
1687
- voice = 'uk-UK';
1688
- break;
1689
- case 'RU':
1690
- voice = 'ru-RU';
1691
- break;
1692
- case 'PL':
1693
- voice = 'pl-PL';
1694
- break;
1695
- case 'FI':
1696
- voice = 'fi-FI';
1697
- break;
1698
- case 'EL':
1699
- voice = 'el-GR';
1700
- break;
1701
- case 'AR':
1702
- voice = 'ar-SA';
1703
- break;
1704
- case 'ZH':
1705
- voice = 'zh-CN';
1706
- break;
1707
- case 'JA':
1708
- voice = 'ja-JP';
1709
- break;
1710
- default:
1711
- voice = 'it-IT';
1712
- break;
1713
- }
1714
- return voice;
1715
- };
1716
-
1717
- const [phonemesMap, setPhonemesMap] = useState<{
1718
- [ns: 'common' | string]: {
1719
- [word: string]: {
1720
- caseSensitive: boolean;
1721
- default: string;
1722
- it?: string;
1723
- en?: string;
1724
- fr?: string;
1725
- };
1726
- };
1727
- }>();
1728
- const fetchLexiconJSON = async () => {
1729
- try {
1730
- const lexiconReq = await fetch(
1731
- `${baseUrl || 'https://aisuru.com'}/api/lexiconmap`
1732
- );
1733
- const lexicon = await lexiconReq.json();
1734
- return lexicon;
1735
- } catch (err) {
1736
- console.error(err);
1737
- }
1738
- };
1739
- useEffect(() => {
1740
- fetchLexiconJSON().then(lexicon => {
1741
- setPhonemesMap(lexicon);
1742
- });
1743
- // eslint-disable-next-line react-hooks/exhaustive-deps
1744
- }, []);
1745
-
1746
- const replaceTextWithPhonemes = (text: string, lang: string) => {
1747
- if (!phonemesMap) return text;
1748
-
1749
- const phonemes = {
1750
- ...(phonemesMap.common ?? {}),
1751
- ...(tenant?.id && phonemesMap[tenant.id] ? phonemesMap[tenant.id] : {}),
1752
- };
1753
- const phonemesPairs = Object.keys(phonemes).map(word => {
1754
- const phoneme =
1755
- phonemes[word][lang.toLowerCase() as 'it' | 'en' | 'fr'] ??
1756
- phonemes[word].default;
1757
- return { word, phoneme, caseSensitive: phonemes[word].caseSensitive };
1758
- });
1759
- const ssmlText = phonemesPairs.reduce(
1760
- (acc, { word, phoneme, caseSensitive }) => {
1761
- return acc.replace(
1762
- new RegExp(`\\b${word}\\b`, caseSensitive ? 'g' : 'gi'),
1763
- `<phoneme alphabet="ipa" ph="${phoneme}">${word}</phoneme>`
1764
- );
1765
- },
1766
- text
1767
- );
1768
-
1769
- return ssmlText;
1770
-
1771
- // E.g.:
1772
- // return text.replace(
1773
- // /martius/gi,
1774
- // `<phoneme alphabet="ipa" ph="ˈmaːrːtzius">Martius</phoneme>`,
1775
- // )
1776
- // .replace(
1777
- // /rawmaterial/gi,
1778
- // `<phoneme alphabet="ipa" ph="ˈpippo">RawMaterial</phoneme>`,
1779
- // )
1780
- // .replace(/qfe/gi, `<sub alias="Quota Filo Erba">QFE</sub>`)
1781
- };
1782
-
1783
- const emitEndSpeakEvent = () => {
1784
- const e = new CustomEvent('MemoriEndSpeak');
1785
- document.dispatchEvent(e);
1786
- };
1787
-
1788
- const speak = (text: string): void => {
1789
- if (!AZURE_COGNITIVE_SERVICES_TTS_KEY || preview) {
1790
- emitEndSpeakEvent();
1791
- return;
1792
- }
1793
- stopListening();
1794
- // stopAudio();
1795
-
1796
- if (preview) return;
1797
-
1798
- if (muteSpeaker || speakerMuted) {
1799
- memoriSpeaking = false;
1800
- setMemoriTyping(false);
1910
+ // Create a single, centralized function to process and send messages
1911
+ const processSpeechAndSendMessage = (text: string) => {
1801
1912
 
1802
- emitEndSpeakEvent();
1803
-
1804
- // trigger start continuous listening if set, see MemoriChat
1805
- if (continuousSpeech) {
1806
- setListeningTimeout();
1807
- }
1808
- return;
1809
- }
1810
-
1811
- if (audioDestination) audioDestination.pause();
1812
-
1813
- let isSafari =
1814
- window.navigator.userAgent.includes('Safari') &&
1815
- !window.navigator.userAgent.includes('Chrome');
1816
- let isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
1817
- if ((audioContext.state as string) === 'interrupted') {
1818
- audioContext.resume().then(() => speak(text));
1819
- return;
1820
- }
1821
- if (audioContext.state === 'closed') {
1822
- audioContext = new AudioContext();
1823
- let buffer = audioContext.createBuffer(1, 10000, 22050);
1824
- let source = audioContext.createBufferSource();
1825
- source.buffer = buffer;
1826
- source.connect(audioContext.destination);
1827
- } else if (audioContext.state === 'suspended') {
1828
- stopAudio();
1829
-
1830
- audioContext = new AudioContext();
1831
- let buffer = audioContext.createBuffer(1, 10000, 22050);
1832
- let source = audioContext.createBufferSource();
1833
- source.buffer = buffer;
1834
- source.connect(audioContext.destination);
1835
- }
1836
-
1837
- if (!speechSynthesizer) {
1838
- if (!isIOS) {
1839
- audioDestination = new speechSdk.SpeakerAudioDestination();
1913
+ console.log('processSpeechAndSendMessage', text);
1914
+ // Skip if already processing or no text
1915
+ if (!text || text.trim().length === 0) {
1916
+ return;
1840
1917
  }
1841
- let audioConfig =
1842
- speechSdk.AudioConfig.fromSpeakerOutput(audioDestination);
1843
- speechSynthesizer = new speechSdk.SpeechSynthesizer(
1844
- speechConfig,
1845
- audioConfig
1846
- );
1847
- }
1848
-
1849
- const source = audioContext.createBufferSource();
1850
- source.addEventListener('ended', () => {
1851
- setIsPlayingAudio(false);
1852
- memoriSpeaking = false;
1853
- });
1854
- audioDestination.onAudioEnd = () => {
1855
- setIsPlayingAudio(false);
1856
- memoriSpeaking = false;
1857
- source.disconnect();
1858
-
1859
- emitEndSpeakEvent();
1860
-
1861
- // trigger start continuous listening if set
1862
- onEndSpeakStartListen();
1863
- };
1864
-
1865
- speechSynthesizer.speakSsmlAsync(
1866
- `<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xmlns:emo="http://www.w3.org/2009/10/emotionml" xml:lang="${getCultureCodeByLanguage(
1867
- userLang
1868
- )}"><voice name="${getTTSVoice(userLang)}"><s>${replaceTextWithPhonemes(
1869
- escapeHTML(stripMarkdown(stripEmojis(text))),
1870
- userLang.toLowerCase()
1871
- )}</s></voice></speak>`,
1872
- result => {
1873
- if (result) {
1874
- setIsPlayingAudio(true);
1875
- memoriSpeaking = true;
1876
-
1877
- try {
1878
- audioContext.decodeAudioData(result.audioData, function (buffer) {
1879
- source.buffer = buffer;
1880
- source.connect(audioContext.destination);
1881
-
1882
- if (history.length < 1 || (isSafari && isIOS)) {
1883
- source.start(0);
1884
- }
1885
- });
1886
-
1887
- audioContext.onstatechange = () => {
1888
- if (
1889
- audioContext.state === 'suspended' ||
1890
- audioContext.state === 'closed'
1891
- ) {
1892
- source.disconnect();
1893
- setIsPlayingAudio(false);
1894
- memoriSpeaking = false;
1895
- } else if ((audioContext.state as string) === 'interrupted') {
1896
- audioContext.resume();
1897
- }
1898
- };
1899
-
1900
- audioContext.resume();
1901
-
1902
- if (speechSynthesizer) {
1903
- speechSynthesizer.close();
1904
- speechSynthesizer = null;
1905
- }
1906
- } catch (e) {
1907
- console.error('speak error: ', e);
1908
- window.speechSynthesis.speak(new SpeechSynthesisUtterance(text));
1909
- setIsPlayingAudio(false);
1910
- memoriSpeaking = false;
1911
-
1912
- if (speechSynthesizer) {
1913
- speechSynthesizer.close();
1914
- speechSynthesizer = null;
1915
- }
1916
- emitEndSpeakEvent();
1917
- }
1918
- } else {
1919
- audioContext.resume();
1920
- setIsPlayingAudio(false);
1921
- memoriSpeaking = false;
1922
- emitEndSpeakEvent();
1918
+
1919
+ try {
1920
+ // Process the text
1921
+ const message = stripDuplicates(text);
1922
+ console.debug('Processing speech message:', message);
1923
+
1924
+ if (message.length > 0) {
1925
+ setUserMessage('');
1926
+
1927
+ // Send the message
1928
+ console.debug('Sending message:', message);
1929
+ sendMessage(message);
1923
1930
  }
1924
- },
1925
- error => {
1926
- console.error('speak:', error);
1927
- window.speechSynthesis.speak(new SpeechSynthesisUtterance(text));
1928
- setIsPlayingAudio(false);
1929
- memoriSpeaking = false;
1930
- emitEndSpeakEvent();
1931
+ } catch (error) {
1932
+ console.error('Error in processSpeechAndSendMessage:', error);
1931
1933
  }
1932
- );
1934
+ };
1933
1935
 
1934
- setMemoriTyping(false);
1935
- };
1936
- const stopAudio = () => {
1937
- setIsPlayingAudio(false);
1938
- memoriSpeaking = false;
1939
- try {
1940
- if (speechSynthesizer) {
1941
- speechSynthesizer.close();
1942
- speechSynthesizer = null;
1943
- }
1944
- if (audioContext.state !== 'closed') {
1945
- audioContext.close();
1946
- }
1947
- if (audioDestination) {
1948
- audioDestination.pause();
1949
- audioDestination.close();
1950
- }
1951
- } catch (e) {
1952
- console.error('stopAudio error: ', e);
1953
- }
1954
- };
1936
+ const {
1937
+ isListening,
1938
+
1939
+ // Actions
1940
+ startRecording,
1941
+ stopRecording,
1942
+ } = useSTT(
1943
+ sttConfig as STTConfig,
1944
+ processSpeechAndSendMessage,
1945
+ {
1946
+ apiUrl: `${baseUrl}/api/stt`,
1947
+ continuousRecording: continuousSpeech,
1948
+ silenceTimeout: continuousSpeechTimeout,
1949
+ autoStart: autoStart,
1950
+ },
1951
+ defaultEnableAudio
1952
+ );
1955
1953
 
1956
1954
  /**
1957
- * Focus on the chat input on mount
1955
+ * Enhanced handleSpeak that integrates with the improved useTTS hook
1956
+ * Uses promise-based approach for better reliability
1958
1957
  */
1959
- useEffect(() => {
1960
- let textarea = document.querySelector(
1961
- '#chat-fieldset textarea'
1962
- ) as HTMLTextAreaElement | null;
1963
- if (textarea) textarea.focus();
1964
- // eslint-disable-next-line react-hooks/exhaustive-deps
1965
- }, [currentDialogState?.emission]);
1958
+ const handleSpeak = async (text: string) => {
1959
+ if (!text || !text.trim() || preview || speakerMuted || !defaultEnableAudio) {
1960
+ const e = new CustomEvent('MemoriEndSpeak');
1961
+ document.dispatchEvent(e);
1966
1962
 
1967
- /**
1968
- * Speech recognition and transcript management
1969
- */
1970
- const [transcript, setTranscript] = useState('');
1971
- const resetTranscript = () => setTranscript('');
1963
+ return Promise.resolve();
1964
+ }
1972
1965
 
1973
- /**
1974
- * Listening transcript timeout
1975
- */
1976
- const [transcriptTimeout, setTranscriptTimeout] =
1977
- useState<NodeJS.Timeout | null>(null);
1978
- const setListeningTimeout = () => {
1979
- let timeout = setTimeout(async () => {
1980
- clearListening();
1981
- const message = stripDuplicates(transcript);
1982
- if (message.length > 0 && listening) {
1983
- sendMessage(message);
1984
- resetTranscript();
1985
- setUserMessage('');
1986
- } else if (listening) {
1987
- resetInteractionTimeout();
1988
- }
1989
- }, continuousSpeechTimeout * 1000);
1990
- setTranscriptTimeout(timeout);
1991
- };
1992
- const clearListeningTimeout = () => {
1993
- if (transcriptTimeout) {
1994
- clearTimeout(transcriptTimeout);
1995
- setTranscriptTimeout(null);
1966
+ if (typeof stopRecording === 'function') {
1967
+ stopRecording();
1996
1968
  }
1997
- };
1998
- const resetListeningTimeout = () => {
1999
- clearListeningTimeout();
2000
- if (continuousSpeech) setListeningTimeout();
2001
- };
2002
- useEffect(() => {
2003
- resetListeningTimeout();
2004
- resetInteractionTimeout();
2005
1969
 
2006
- // eslint-disable-next-line react-hooks/exhaustive-deps
2007
- }, [transcript]);
1970
+ const processedText = sanitizeText(text);
2008
1971
 
1972
+ return ttsSpeak(processedText)
1973
+ };
2009
1974
  /**
2010
- * Listening methods
1975
+ * Integrated solution for translating dialog state and speaking
1976
+ * This uses promise chaining for reliable sequencing without timeouts
2011
1977
  */
2012
- const startListening = () => {
2013
- if (!AZURE_COGNITIVE_SERVICES_TTS_KEY) return;
1978
+ const translateAndSpeak = useCallback(
1979
+ async (
1980
+ dialogState: DialogState,
1981
+ language: string,
1982
+ msg?: string,
1983
+ skipEmission: boolean = false
1984
+ ) => {
1985
+ try {
1986
+ // First ensure we have a valid dialog state
1987
+ if (!dialogState) {
1988
+ console.warn('translateAndSpeak called with empty dialog state');
1989
+ return null;
1990
+ }
2014
1991
 
2015
- clearListening();
2016
- setTranscript('');
2017
- resetTranscript();
1992
+ // Then translate the dialog state
1993
+ const translatedState = await translateDialogState(
1994
+ dialogState,
1995
+ language,
1996
+ msg,
1997
+ skipEmission
1998
+ );
2018
1999
 
2019
- try {
2020
- navigator.mediaDevices
2021
- .getUserMedia({ audio: true })
2022
- .then(function (_stream) {
2023
- setHasUserActivatedListening(true);
2024
-
2025
- if (!speechConfig) {
2026
- speechConfig = speechSdk.SpeechConfig.fromSubscription(
2027
- AZURE_COGNITIVE_SERVICES_TTS_KEY,
2028
- 'eastus'
2029
- );
2030
- speechConfig.speechRecognitionLanguage =
2031
- getCultureCodeByLanguage(userLang);
2032
- speechConfig.speechSynthesisLanguage =
2033
- getCultureCodeByLanguage(userLang);
2034
- speechConfig.speechSynthesisVoiceName = getTTSVoice(userLang); // https://docs.microsoft.com/it-it/azure/cognitive-services/speech-service/language-support#text-to-speech
2035
- }
2000
+ // If we're not skipping emission and there's something to speak, speak it
2001
+ const textToSpeak =
2002
+ translatedState.translatedEmission || translatedState.emission;
2036
2003
 
2037
- const audioConfig =
2038
- speechSdk.AudioConfig.fromDefaultMicrophoneInput();
2039
- recognizer = new speechSdk.SpeechRecognizer(
2040
- speechConfig,
2041
- audioConfig
2042
- );
2004
+ if (textToSpeak && textToSpeak.trim() && !skipEmission && !speakerMuted) {
2005
+ // Update activation state before speaking for better browser interaction
2006
+ if (!hasUserActivatedSpeak) {
2007
+ setHasUserActivatedSpeak(true);
2008
+ }
2043
2009
 
2044
- setListening(true);
2045
- recognizer.recognized = (_s, e) => {
2046
- if (!e.result.text) return;
2047
- if (e.result.reason === speechSdk.ResultReason.RecognizedSpeech) {
2048
- let transcript = e.result.text;
2049
- setTranscript(transcript || '');
2050
- if (transcript?.length > 0) {
2051
- const transcriptMessage = stripDuplicates(transcript);
2052
- if (transcriptMessage.length > 0)
2053
- setUserMessage(msg => `${msg} ${transcriptMessage}`);
2054
- }
2055
- } else if (e.result.reason === speechSdk.ResultReason.NoMatch) {
2056
- console.debug('NOMATCH: Speech could not be recognized.');
2057
- }
2058
- };
2059
- recognizer.canceled = (_s, e) => {
2060
- if (e.reason === speechSdk.CancellationReason.Error) {
2061
- console.debug(`"CANCELED: ErrorCode=${e.errorCode}`);
2062
- console.debug(`"CANCELED: ErrorDetails=${e.errorDetails}`);
2063
- console.debug(
2064
- 'CANCELED: Did you set the speech resource key and region values?'
2065
- );
2066
- }
2010
+ // Note: now using the Promise-based speak function to ensure proper sequencing
2011
+ await handleSpeak(textToSpeak);
2012
+ }
2067
2013
 
2068
- stopListening();
2069
- };
2014
+ return translatedState;
2015
+ } catch (error) {
2016
+ console.error('Error in translateAndSpeak:', error);
2017
+ // Still update activation state even if there's an error
2018
+ if (!hasUserActivatedSpeak) {
2019
+ setHasUserActivatedSpeak(true);
2020
+ }
2021
+ return dialogState;
2022
+ }
2023
+ },
2024
+ [
2025
+ translateDialogState,
2026
+ handleSpeak,
2027
+ hasUserActivatedSpeak,
2028
+ setHasUserActivatedSpeak,
2029
+ ]
2030
+ );
2070
2031
 
2071
- recognizer.sessionStopped = (_s, _e) => {
2072
- stopListening();
2073
- };
2032
+ /**
2033
+ * Funzione stopAudio che sostituisce quella originale
2034
+ */
2035
+ const stopAudio = useCallback(async () => {
2036
+ ttsStop();
2037
+ }, [ttsStop]);
2074
2038
 
2075
- resetTranscript();
2076
- recognizer.startContinuousRecognitionAsync();
2077
- })
2078
- .catch(console.error);
2079
- } catch (error) {
2080
- console.error(error);
2081
- }
2082
- };
2083
- const stopListening = () => {
2084
- if (recognizer) {
2085
- recognizer.stopContinuousRecognitionAsync();
2086
- recognizer.close();
2087
- recognizer = null;
2039
+ const focusChatInput = () => {
2040
+ let textarea = document.querySelector(
2041
+ '#chat-fieldset textarea'
2042
+ ) as HTMLTextAreaElement | null;
2043
+ if (textarea && enableFocusChatInput) {
2044
+ textarea.focus();
2045
+ } else {
2046
+ textarea?.blur();
2088
2047
  }
2089
- setListening(false);
2090
- };
2091
- const clearListening = () => {
2092
- setHasUserActivatedListening(false);
2093
- stopListening();
2094
- clearListeningTimeout();
2095
2048
  };
2096
- const resetListening = () => {
2097
- if (listening) {
2098
- clearListening();
2099
- resetTranscript();
2100
- setUserMessage('');
2101
- startListening();
2049
+
2050
+ /**
2051
+ * Focus on the chat input on mount
2052
+ */
2053
+ useEffect(() => {
2054
+ // focus on chat input disabled for totem layout
2055
+ if (selectedLayout !== 'TOTEM') {
2056
+ focusChatInput();
2102
2057
  }
2103
- };
2058
+ // eslint-disable-next-line react-hooks/exhaustive-deps
2059
+ }, [currentDialogState?.emission]);
2060
+
2104
2061
  const resetUIEffects = () => {
2105
2062
  try {
2106
- clearListening();
2107
2063
  clearInteractionTimeout();
2108
2064
  setClickedStart(false);
2109
2065
  timeoutRef.current = undefined;
@@ -2125,47 +2081,24 @@ const MemoriWidget = ({
2125
2081
  document.removeEventListener('MemoriResetUIEffects', resetUIEffects);
2126
2082
  };
2127
2083
  }, []);
2128
- useEffect(() => {
2129
- if (currentDialogState?.state === 'Z0') clearListening();
2130
- // eslint-disable-next-line react-hooks/exhaustive-deps
2131
- }, [currentDialogState?.state]);
2132
2084
 
2133
- /**
2134
- * Speech recognition event handlers
2135
- */
2136
- const [requestedListening, setRequestedListening] = useState(false);
2137
- const onEndSpeakStartListen = useCallback(
2138
- (_e?: Event) => {
2139
- if (isPlayingAudio && speechSynthesizer) {
2140
- speechSynthesizer.close();
2141
- speechSynthesizer = null;
2142
- }
2143
- if (
2144
- continuousSpeech &&
2145
- (hasUserActivatedListening || !requestedListening)
2146
- ) {
2147
- setRequestedListening(true);
2148
- startListening();
2149
- }
2150
- },
2151
- // eslint-disable-next-line react-hooks/exhaustive-deps
2152
- [continuousSpeech, hasUserActivatedListening]
2153
- );
2154
2085
  useEffect(() => {
2086
+ // if memori is speaking, don't start listening
2155
2087
  if (
2156
- history.length > 1 &&
2157
2088
  !isPlayingAudio &&
2158
2089
  continuousSpeech &&
2159
- (hasUserActivatedListening || !requestedListening)
2160
- )
2161
- startListening();
2162
- else if (isPlayingAudio && listening) {
2163
- stopListening();
2090
+ (hasUserActivatedListening || !requestedListening) &&
2091
+ sessionId
2092
+ ) {
2093
+ startRecording();
2094
+ } else if (isPlayingAudio && isListening) {
2095
+ stopRecording();
2164
2096
  }
2165
2097
  // eslint-disable-next-line react-hooks/exhaustive-deps
2166
- }, [isPlayingAudio]);
2098
+ }, [isPlayingAudio, hasUserActivatedListening]);
2099
+
2167
2100
  useEffect(() => {
2168
- resetListening();
2101
+ stopRecording();
2169
2102
  // eslint-disable-next-line react-hooks/exhaustive-deps
2170
2103
  }, [language]);
2171
2104
 
@@ -2176,16 +2109,9 @@ const MemoriWidget = ({
2176
2109
  'keypress'
2177
2110
  );
2178
2111
  useEffect(() => {
2179
- const stored = getLocalConfig<'keypress' | 'click'>(
2180
- 'sendOnEnter',
2181
- 'keypress'
2182
- );
2183
- if (window.innerWidth <= 768) setSendOnEnter('click');
2184
- else setSendOnEnter(stored);
2112
+ if (window.innerWidth <= 768 && hasTouchscreen()) setSendOnEnter('click');
2113
+ else setSendOnEnter('keypress');
2185
2114
  }, []);
2186
- useEffect(() => {
2187
- setLocalConfig('sendOnEnter', sendOnEnter);
2188
- }, [sendOnEnter]);
2189
2115
 
2190
2116
  /**
2191
2117
  * Attachments
@@ -2203,7 +2129,7 @@ const MemoriWidget = ({
2203
2129
  integration
2204
2130
  ? {
2205
2131
  '--memori-chat-bubble-bg': '#fff',
2206
- ...(integrationConfig && !showInstruct
2132
+ ...(integrationConfig && !instruct
2207
2133
  ? { '--memori-text-color': integrationConfig.textColor ?? '#000' }
2208
2134
  : {}),
2209
2135
  ...(integrationConfig?.buttonBgColor
@@ -2248,12 +2174,8 @@ const MemoriWidget = ({
2248
2174
 
2249
2175
  const integrationStylesheet = `
2250
2176
  ${
2251
- preview
2252
- ? '#preview,'
2253
- : selectedLayout === 'WEBSITE_ASSISTANT'
2254
- ? ''
2255
- : ':root,'
2256
- } .memori-widget, .memori-drawer, .memori-modal {
2177
+ preview ? '#preview, ' : applyVarsToRoot ? ':root, ' : ''
2178
+ }memori-client, .memori-widget, .memori-drawer, .memori-modal {
2257
2179
  ${Object.entries(integrationProperties)
2258
2180
  .map(([key, value]) => `${key}: ${value};`)
2259
2181
  .join('\n')}
@@ -2265,6 +2187,10 @@ const MemoriWidget = ({
2265
2187
  ? true
2266
2188
  : integrationConfig?.showAIicon;
2267
2189
 
2190
+ const enableUpload = !!(showUpload ?? integrationConfig?.showUpload);
2191
+
2192
+ const enableReasoning = !!(showReasoning ?? integrationConfig?.showReasoning);
2193
+
2268
2194
  const showWhyThisAnswer =
2269
2195
  integrationConfig?.showWhyThisAnswer === undefined
2270
2196
  ? true
@@ -2281,48 +2207,6 @@ const MemoriWidget = ({
2281
2207
  }
2282
2208
  }, []);
2283
2209
 
2284
- const [gamificationLevel, setGamificationLevel] =
2285
- useState<GamificationLevel>();
2286
- const getGamificationPoints = async (
2287
- memoriID: string
2288
- ): Promise<{
2289
- points: number;
2290
- unansweredQuestions: number;
2291
- }> => {
2292
- let gamificationPoints: number | undefined;
2293
- let unansQuestions: number | undefined;
2294
- try {
2295
- const {
2296
- contentQualityIndex,
2297
- answerQualityIndex,
2298
- unansweredQuestions,
2299
- ...cqResp
2300
- } = await getContentQualityIndexes(memoriID);
2301
- if (cqResp.resultCode === 0) {
2302
- gamificationPoints = contentQualityIndex;
2303
- unansQuestions = unansweredQuestions;
2304
- }
2305
- } catch (_e) {
2306
- let err = _e as Error;
2307
- console.error('[APPCONTEXT/QUERYGAMIFICATIONPOINTS]', err);
2308
- }
2309
-
2310
- return {
2311
- points: gamificationPoints ?? 0,
2312
- unansweredQuestions: unansQuestions ?? 0,
2313
- };
2314
- };
2315
- useEffect(() => {
2316
- if (memori.engineMemoriID) {
2317
- getGamificationPoints(memori.engineMemoriID)
2318
- .then(value => {
2319
- setGamificationLevel(getGamificationLevel(value.points));
2320
- })
2321
- .catch(console.error);
2322
- }
2323
- // eslint-disable-next-line react-hooks/exhaustive-deps
2324
- }, [memori.engineMemoriID]);
2325
-
2326
2210
  // Put SEO tags in head
2327
2211
  useEffect(() => {
2328
2212
  if (integrationConfig?.seoTitle) {
@@ -2352,83 +2236,7 @@ const MemoriWidget = ({
2352
2236
  }
2353
2237
  }, [integrationConfig, memori.avatarURL, ogImage]);
2354
2238
 
2355
- // X3 state - tag change
2356
- const selectReceiverTag = async (tag: string) => {
2357
- if (!sessionId) return;
2358
-
2359
- try {
2360
- const { currentState, ...resp } = await postTagChangedEvent(
2361
- sessionId,
2362
- tag
2363
- );
2364
-
2365
- if (resp.resultCode === 0) {
2366
- pushMessage({
2367
- text: tag,
2368
- fromUser: true,
2369
- });
2370
-
2371
- if (currentState.state === 'X4' && memori.giverTag) {
2372
- const { currentState, ...resp } = await client.postTagChangedEvent(
2373
- sessionId,
2374
- memori.giverTag
2375
- );
2376
-
2377
- if (resp.resultCode === 0) {
2378
- setCurrentDialogState(currentState);
2379
-
2380
- if (currentState.emission) {
2381
- pushMessage({
2382
- text: currentState.emission,
2383
- emitter: currentState.emitter,
2384
- media: currentState.media,
2385
- fromUser: false,
2386
- contextVars: currentState.contextVars,
2387
- date: currentState.currentDate,
2388
- placeName: currentState.currentPlaceName,
2389
- placeLatitude: currentState.currentLatitude,
2390
- placeLongitude: currentState.currentLongitude,
2391
- placeUncertaintyKm: currentState.currentUncertaintyKm,
2392
- tag: currentState.currentTag,
2393
- memoryTags: currentState.memoryTags,
2394
- });
2395
- }
2396
- } else {
2397
- console.error(resp);
2398
- toast.error(t(getErrori18nKey(resp.resultCode)));
2399
- }
2400
- } else {
2401
- setCurrentDialogState(currentState);
2402
- if (currentState.emission) {
2403
- pushMessage({
2404
- text: currentState.emission,
2405
- emitter: currentState.emitter,
2406
- media: currentState.media,
2407
- fromUser: false,
2408
- contextVars: currentState.contextVars,
2409
- date: currentState.currentDate,
2410
- placeName: currentState.currentPlaceName,
2411
- placeLatitude: currentState.currentLatitude,
2412
- placeLongitude: currentState.currentLongitude,
2413
- placeUncertaintyKm: currentState.currentUncertaintyKm,
2414
- tag: currentState.currentTag,
2415
- memoryTags: currentState.memoryTags,
2416
- });
2417
- }
2418
- }
2419
- } else {
2420
- console.error(resp, tag, currentDialogState?.knownTags?.[tag]);
2421
- toast.error(t(getErrori18nKey(resp.resultCode)));
2422
- }
2423
- } catch (e) {
2424
- let err = e as Error;
2425
- console.error(err);
2426
- toast.error(err.message);
2427
- }
2428
- };
2429
-
2430
2239
  const simulateUserPrompt = (text: string, translatedText?: string) => {
2431
- stopListening();
2432
2240
  stopAudio();
2433
2241
  sendMessage(text, undefined, undefined, false, translatedText);
2434
2242
  };
@@ -2437,6 +2245,8 @@ const MemoriWidget = ({
2437
2245
  // to use in integrations or snippets
2438
2246
  const memoriTextEnteredHandler = useCallback(
2439
2247
  (e: MemoriTextEnteredEvent) => {
2248
+ if (disableTextEnteredEvents) return;
2249
+
2440
2250
  const {
2441
2251
  text,
2442
2252
  waitForPrevious,
@@ -2457,7 +2267,6 @@ const MemoriWidget = ({
2457
2267
  memoriTextEnteredHandler(e);
2458
2268
  }, 1000);
2459
2269
  } else {
2460
- stopListening();
2461
2270
  stopAudio();
2462
2271
  sendMessage(
2463
2272
  text,
@@ -2473,10 +2282,23 @@ const MemoriWidget = ({
2473
2282
  }
2474
2283
  }
2475
2284
  },
2476
- [sessionId, isPlayingAudio, memoriTyping, userLang]
2285
+ [
2286
+ sessionId,
2287
+ isPlayingAudio,
2288
+ memoriTyping,
2289
+ userLang,
2290
+ disableTextEnteredEvents,
2291
+ ]
2477
2292
  );
2478
2293
  useEffect(() => {
2479
- document.addEventListener('MemoriTextEntered', memoriTextEnteredHandler);
2294
+ if (!disableTextEnteredEvents) {
2295
+ document.addEventListener('MemoriTextEntered', memoriTextEnteredHandler);
2296
+ } else {
2297
+ document.removeEventListener(
2298
+ 'MemoriTextEntered',
2299
+ memoriTextEnteredHandler
2300
+ );
2301
+ }
2480
2302
 
2481
2303
  return () => {
2482
2304
  document.removeEventListener(
@@ -2484,37 +2306,53 @@ const MemoriWidget = ({
2484
2306
  memoriTextEnteredHandler
2485
2307
  );
2486
2308
  };
2487
- }, [sessionId, userLang]);
2309
+ }, [sessionId, userLang, disableTextEnteredEvents]);
2488
2310
 
2311
+ /**
2312
+ * Handles clicking the start button to begin or resume a session
2313
+ * @param session Optional existing session with dialog state and ID
2314
+ * @param initialSessionExpired Whether the initial session has expired
2315
+ */
2489
2316
  const onClickStart = useCallback(
2490
- async (session?: { dialogState: DialogState; sessionID: string }) => {
2491
- const sessionID = session?.sessionID || sessionId;
2492
- const dialogState = session?.dialogState || currentDialogState;
2317
+ async (
2318
+ session?: { dialogState: DialogState; sessionID: string },
2319
+ initialSessionExpired = false,
2320
+ chatLog?: ChatLog
2321
+ ) => {
2322
+ const sessionID = chatLog ? undefined : session?.sessionID || sessionId;
2323
+ const dialogState = chatLog
2324
+ ? undefined
2325
+ : session?.dialogState || currentDialogState;
2493
2326
  setClickedStart(true);
2494
2327
 
2495
- let memoriAudioElement = document.getElementById(
2496
- 'memori-audio'
2497
- ) as HTMLAudioElement;
2498
- let isSafari =
2499
- window.navigator.userAgent.includes('Safari') &&
2500
- !window.navigator.userAgent.includes('Chrome');
2501
- if (memoriAudioElement && isSafari) {
2502
- memoriAudioElement.muted = false;
2503
- memoriAudioElement.play().catch((e: any) => {
2504
- console.error('error playing intro audio', e);
2505
- });
2506
- }
2328
+ let translatedMessages: Message[] = [];
2507
2329
 
2330
+ // Get birth date from storage or props
2508
2331
  let storageBirthDate = getLocalConfig<string | undefined>(
2509
2332
  'birthDate',
2510
2333
  undefined
2511
2334
  );
2512
- let birth = birthDate || storageBirthDate || undefined;
2335
+ let birth = birthDate || storageBirthDate || user?.birthDate;
2336
+ if (!birth && autoStart && initialSessionID)
2337
+ birth = '1970-01-01T10:24:03.845Z';
2338
+
2339
+ const localPosition = getLocalConfig<Venue | undefined>(
2340
+ 'position',
2341
+ undefined
2342
+ );
2343
+ // Only check for position requirement if memori.needsPosition is true
2344
+ if (autoStart && !localPosition && memori.needsPosition) {
2345
+ setShowPositionDrawer(true);
2346
+ return;
2347
+ }
2513
2348
 
2349
+ // Handle age verification
2514
2350
  if (!sessionID && !!minAge && !birth) {
2515
2351
  setShowAgeVerification(true);
2516
2352
  setClickedStart(false);
2517
- } else if (
2353
+ }
2354
+ // Handle authentication
2355
+ else if (
2518
2356
  (!sessionID &&
2519
2357
  memori.privacyType !== 'PUBLIC' &&
2520
2358
  !memori.secretToken &&
@@ -2525,7 +2363,9 @@ const MemoriWidget = ({
2525
2363
  setAuthModalState('password');
2526
2364
  setClickedStart(false);
2527
2365
  return;
2528
- } else if (!sessionID) {
2366
+ }
2367
+ // Create new session if needed
2368
+ else if (!sessionID || initialSessionExpired) {
2529
2369
  setClickedStart(false);
2530
2370
  setGotErrorInOpening(false);
2531
2371
  const session = await fetchSession({
@@ -2533,13 +2373,16 @@ const MemoriWidget = ({
2533
2373
  password: secret || memoriPwd || memori.secretToken,
2534
2374
  tag: personification?.tag,
2535
2375
  pin: personification?.pin,
2376
+ continueFromChatLogID: chatLog?.chatLogID,
2536
2377
  initialContextVars: {
2537
2378
  PATHNAME: window.location.pathname?.toUpperCase(),
2538
2379
  ROUTE:
2539
2380
  window.location.pathname?.split('/')?.pop()?.toUpperCase() || '',
2540
- ...(initialContextVars || {}),
2381
+ ...((!chatLog
2382
+ ? initialContextVars
2383
+ : chatLog.lines[chatLog.lines.length - 1].contextVars) || {}),
2541
2384
  },
2542
- initialQuestion,
2385
+ initialQuestion: chatLog ? undefined : initialQuestion,
2543
2386
  birthDate: birth,
2544
2387
  additionalInfo: {
2545
2388
  ...(additionalInfo || {}),
@@ -2549,36 +2392,94 @@ const MemoriWidget = ({
2549
2392
  additionalInfo?.loginToken ??
2550
2393
  authToken,
2551
2394
  language: getCultureCodeByLanguage(userLang),
2395
+ timeZoneOffset: new Date().getTimezoneOffset().toString(),
2552
2396
  },
2553
2397
  });
2554
2398
 
2555
2399
  if (session?.dialogState) {
2556
2400
  // reset history
2557
- setHistory([]);
2401
+ if (!chatLog) {
2402
+ setHistory([]);
2403
+
2404
+ // Use translateAndSpeak which already handles the speaking
2405
+ await translateAndSpeak(session.dialogState, userLang);
2406
+ // No need for additional handleSpeak call since translateAndSpeak already handles it
2407
+ setHasUserActivatedSpeak(true);
2408
+ } else {
2409
+ const messages = chatLog.lines.map(
2410
+ (l, i) =>
2411
+ ({
2412
+ text: l.text,
2413
+ media: l.media
2414
+ ?.filter(m => allowedMediaTypes.includes(m.mimeType))
2415
+ ?.map(m => ({
2416
+ mediumID: `${i}-${m.mimeType}`,
2417
+ ...m,
2418
+ })),
2419
+ fromUser: l.inbound,
2420
+ timestamp: l.timestamp,
2421
+ emitter: l.emitter,
2422
+ initial: i === 0,
2423
+ } as Message)
2424
+ );
2558
2425
 
2559
- translateDialogState(session.dialogState, userLang)
2560
- .then(ts => {
2561
- if (ts.emission) {
2562
- speak(ts.emission);
2426
+ // we dont remove the last one as it is the current state
2427
+ translatedMessages = messages ?? [];
2428
+ if (
2429
+ language.toUpperCase() !== userLang.toUpperCase() &&
2430
+ isMultilanguageEnabled
2431
+ ) {
2432
+ try {
2433
+ translatedMessages = await Promise.all(
2434
+ messages.map(async m => {
2435
+ // If original text is present, the message is already translated
2436
+ if ('originalText' in m && m.originalText) {
2437
+ return m;
2438
+ }
2439
+ // Otherwise translate the message
2440
+ return {
2441
+ ...m,
2442
+ originalText: m.text,
2443
+ text: (
2444
+ await getTranslation(m.text, userLang, language, baseUrl)
2445
+ ).text,
2446
+ };
2447
+ })
2448
+ );
2449
+ } catch (e) {
2450
+ console.error('[CLICK_START] Error translating messages:', e);
2563
2451
  }
2564
- })
2565
- .finally(() => {
2452
+ }
2453
+
2454
+ setHistory(translatedMessages);
2455
+
2456
+ translateDialogState(
2457
+ session.dialogState,
2458
+ userLang,
2459
+ undefined,
2460
+ true
2461
+ ).finally(() => {
2566
2462
  setHasUserActivatedSpeak(true);
2567
2463
  });
2464
+ }
2465
+ } else if (session?.resultCode === 0) {
2466
+ await onClickStart((session as any) || undefined);
2568
2467
  } else {
2569
- await onClickStart(session || undefined);
2468
+ setLoading(false);
2570
2469
  }
2571
2470
 
2572
2471
  return;
2573
- } else if (initialSessionID) {
2472
+ }
2473
+ // Handle initial session
2474
+ else if (initialSessionID) {
2574
2475
  // check if session is valid and not expired
2575
2476
  const { currentState, ...response } = await getSession(sessionID);
2477
+
2576
2478
  if (response.resultCode !== 0 || !currentState) {
2577
- console.debug('session expired, opening new session');
2578
2479
  setGotErrorInOpening(true);
2579
2480
  setSessionId(undefined);
2580
2481
  setClickedStart(false);
2581
- await onClickStart();
2482
+ await onClickStart(undefined, true);
2582
2483
  return;
2583
2484
  }
2584
2485
 
@@ -2586,75 +2487,19 @@ const MemoriWidget = ({
2586
2487
  setHistory([]);
2587
2488
 
2588
2489
  // date and place events
2589
- if (position) applyPosition(position, sessionID);
2590
- if (memori.needsDateTime)
2490
+ if (position && memori.needsPosition) {
2491
+ applyPosition(position, sessionID);
2492
+ }
2493
+ if (memori.needsDateTime) {
2591
2494
  sendDateChangedEvent({ sessionID: sessionID, state: currentState });
2495
+ }
2592
2496
 
2593
- // checks engine state for current tag
2594
- // opening session would have already correct tag
2595
- // otherwise change tag to anonymous for test, giver for instruct, receiver if set
2596
-
2597
- // test if current tag is giver on instruct
2497
+ // Handle personification tag changes
2598
2498
  if (
2599
- instruct &&
2600
- memori.giverTag &&
2601
- currentDialogState?.currentTag !== memori.giverTag
2602
- ) {
2603
- try {
2604
- console.debug('change tag #0');
2605
- // reset tag
2606
- await changeTag(memori.engineMemoriID!, sessionID, '-');
2607
- // change tag to giver
2608
- const session = await changeTag(
2609
- memori.engineMemoriID!,
2610
- sessionID,
2611
- memori.giverTag,
2612
- memori.giverPIN
2613
- );
2614
-
2615
- if (session && session.resultCode === 0) {
2616
- translateDialogState(session.currentState, userLang)
2617
- .then(ts => {
2618
- if (ts.emission) {
2619
- speak(ts.emission);
2620
- }
2621
- })
2622
- .finally(() => {
2623
- setHasUserActivatedSpeak(true);
2624
- });
2625
- } else {
2626
- console.error('session #1', session);
2627
- throw new Error('No session');
2628
- }
2629
- } catch (e) {
2630
- console.error('session #2', e);
2631
- reopenSession(
2632
- true,
2633
- memori?.secretToken,
2634
- undefined,
2635
- memori?.giverTag,
2636
- memori?.giverPIN,
2637
- {
2638
- PATHNAME: window.location.pathname?.toUpperCase(),
2639
- ROUTE:
2640
- window.location.pathname?.split('/')?.pop()?.toUpperCase() ||
2641
- '',
2642
- ...(initialContextVars || {}),
2643
- },
2644
- initialQuestion,
2645
- birth
2646
- ).then(() => {
2647
- setHasUserActivatedSpeak(true);
2648
- });
2649
- }
2650
- } else if (
2651
- // test if current tag is receiver on test as it is requested
2652
- !instruct &&
2653
2499
  personification &&
2654
- currentDialogState?.currentTag !== personification.tag
2500
+ currentState.currentTag !== personification.tag
2655
2501
  ) {
2656
2502
  try {
2657
- console.debug('change tag #3');
2658
2503
  // reset tag
2659
2504
  await changeTag(memori.engineMemoriID!, sessionID, '-');
2660
2505
  // change tag to receiver
@@ -2666,21 +2511,11 @@ const MemoriWidget = ({
2666
2511
  );
2667
2512
 
2668
2513
  if (session && session.resultCode === 0) {
2669
- translateDialogState(session.currentState, userLang)
2670
- .then(ts => {
2671
- if (ts.emission) {
2672
- speak(ts.emission);
2673
- }
2674
- })
2675
- .finally(() => {
2676
- setHasUserActivatedSpeak(true);
2677
- });
2514
+ await translateAndSpeak(session.currentState, userLang);
2678
2515
  } else {
2679
- console.error('session #4', session);
2680
2516
  throw new Error('No session');
2681
2517
  }
2682
2518
  } catch (e) {
2683
- console.error('session #5', e);
2684
2519
  reopenSession(
2685
2520
  true,
2686
2521
  memori?.secretToken,
@@ -2700,15 +2535,15 @@ const MemoriWidget = ({
2700
2535
  setHasUserActivatedSpeak(true);
2701
2536
  });
2702
2537
  }
2703
- } else if (
2704
- // test if current tag is anonymous on test without personification
2705
- // this is the default case with anonymous tag
2706
- !instruct &&
2538
+ }
2539
+ // Handle anonymous tag changes
2540
+ else if (
2707
2541
  !personification &&
2708
- currentDialogState?.currentTag !== anonTag
2542
+ currentState?.currentTag &&
2543
+ currentState?.currentTag !== anonTag &&
2544
+ currentState?.currentTag !== '-'
2709
2545
  ) {
2710
2546
  try {
2711
- console.debug('change tag #6');
2712
2547
  // reset tag
2713
2548
  await changeTag(memori.engineMemoriID!, sessionID, '-');
2714
2549
  // change tag to anonymous
@@ -2719,21 +2554,11 @@ const MemoriWidget = ({
2719
2554
  );
2720
2555
 
2721
2556
  if (session && session.resultCode === 0) {
2722
- translateDialogState(session.currentState, userLang)
2723
- .then(ts => {
2724
- if (ts.emission) {
2725
- speak(ts.emission);
2726
- }
2727
- })
2728
- .finally(() => {
2729
- setHasUserActivatedSpeak(true);
2730
- });
2557
+ await translateAndSpeak(session.currentState, userLang);
2731
2558
  } else {
2732
- console.error('session #7', session);
2733
2559
  throw new Error('No session');
2734
2560
  }
2735
2561
  } catch (e) {
2736
- console.error('session #8', e);
2737
2562
  reopenSession(
2738
2563
  true,
2739
2564
  memori?.secretToken,
@@ -2753,41 +2578,120 @@ const MemoriWidget = ({
2753
2578
  setHasUserActivatedSpeak(true);
2754
2579
  });
2755
2580
  }
2756
- } else {
2757
- // no need to change tag
2758
- translateDialogState(currentState, userLang)
2759
- .then(ts => {
2760
- if (ts.emission) {
2761
- speak(ts.emission);
2581
+ }
2582
+ // No tag changes needed
2583
+ else {
2584
+ try {
2585
+ const { chatLogs } = await getSessionChatLogs(sessionID, sessionID);
2586
+
2587
+ const messages = chatLogs?.[0]?.lines.map(
2588
+ (l, i) =>
2589
+ ({
2590
+ text: l.text,
2591
+ media: l.media
2592
+ ?.filter(m => allowedMediaTypes.includes(m.mimeType))
2593
+ ?.map(m => ({
2594
+ mediumID: `${i}-${m.mimeType}`,
2595
+ ...m,
2596
+ })),
2597
+ fromUser: l.inbound,
2598
+ timestamp: l.timestamp,
2599
+ emitter: l.emitter,
2600
+ initial: i === 0,
2601
+ } as Message)
2602
+ );
2603
+
2604
+ // we dont remove the last one as it is the current state
2605
+ translatedMessages = messages ?? [];
2606
+ if (
2607
+ language.toUpperCase() !== userLang.toUpperCase() &&
2608
+ isMultilanguageEnabled
2609
+ ) {
2610
+ try {
2611
+ translatedMessages = await Promise.all(
2612
+ messages.map(async m => ({
2613
+ ...m,
2614
+ originalText: m.text,
2615
+ text: (
2616
+ await getTranslation(m.text, userLang, language, baseUrl)
2617
+ ).text,
2618
+ }))
2619
+ );
2620
+ } catch (e) {
2621
+ console.error('[CLICK_START] Error translating messages:', e);
2762
2622
  }
2763
- })
2764
- .finally(() => {
2765
- setHasUserActivatedSpeak(true);
2623
+ }
2624
+
2625
+ setHistory(translatedMessages);
2626
+ } catch (e) {
2627
+ console.error('[CLICK_START] Error retrieving chat logs:', e);
2628
+ }
2629
+
2630
+ if (
2631
+ (!!translatedMessages?.length && translatedMessages.length > 1) ||
2632
+ !initialQuestion
2633
+ ) {
2634
+ // we have a history, don't push message
2635
+ await translateAndSpeak(
2636
+ currentState,
2637
+ userLang,
2638
+ undefined,
2639
+ // if empty history, pick current state emission
2640
+ // otherwise, don't push message
2641
+ !!translatedMessages?.length
2642
+ );
2643
+ } else {
2644
+ // remove default initial message
2645
+ translatedMessages = [];
2646
+ setHistory([]);
2647
+
2648
+ setMemoriTyping(true);
2649
+
2650
+ // we have no chat history, we start by initial question
2651
+ const response = await postTextEnteredEvent({
2652
+ sessionId: sessionID,
2653
+ text: initialQuestion,
2766
2654
  });
2655
+
2656
+ await translateAndSpeak(
2657
+ response.currentState ?? currentState,
2658
+ userLang,
2659
+ undefined,
2660
+ false
2661
+ );
2662
+ }
2767
2663
  }
2768
2664
 
2769
2665
  // date and place events
2770
- if (position) applyPosition(position, sessionID);
2771
- if (memori.needsDateTime)
2666
+ if (position && memori.needsPosition) {
2667
+ applyPosition(position, sessionID);
2668
+ }
2669
+ if (memori.needsDateTime) {
2772
2670
  sendDateChangedEvent({ sessionID: sessionID, state: currentState });
2773
- } else {
2671
+ }
2672
+ }
2673
+ // Default case - just translate and activate
2674
+ else {
2774
2675
  // reset history
2775
2676
  setHistory([]);
2776
2677
 
2777
2678
  // everything is fine, just translate dialog state and activate chat
2778
- translateDialogState(dialogState!, userLang)
2779
- .then(ts => {
2780
- if (ts.emission) {
2781
- speak(ts.emission);
2782
- }
2783
- })
2784
- .finally(() => {
2785
- setHasUserActivatedSpeak(true);
2786
- });
2679
+ await translateAndSpeak(dialogState!, userLang);
2787
2680
  }
2788
2681
  },
2789
2682
  [memoriPwd, memori, memoriTokens, birthDate, sessionId, userLang, position]
2790
2683
  );
2684
+
2685
+ useEffect(() => {
2686
+ // Don't auto-start for HIDDEN_CHAT layout - let the layout handle it
2687
+ console.log('clickedStart', clickedStart);
2688
+ console.log('autoStart', autoStart);
2689
+ console.log('selectedLayout', selectedLayout);
2690
+ if (!clickedStart && autoStart && selectedLayout !== 'HIDDEN_CHAT') {
2691
+ onClickStart();
2692
+ }
2693
+ }, [clickedStart, autoStart, selectedLayout]);
2694
+
2791
2695
  useEffect(() => {
2792
2696
  const targetNode =
2793
2697
  document.querySelector(`memori-client[memoriname="${memori.name}"]`) ||
@@ -2885,7 +2789,7 @@ const MemoriWidget = ({
2885
2789
  }
2886
2790
  } catch (e) {
2887
2791
  let err = e as Error;
2888
- console.error(err);
2792
+ console.debug(err);
2889
2793
  }
2890
2794
  }, [tenant?.billingDelegation, deepThoughtEnabled]);
2891
2795
  useEffect(() => {
@@ -2894,13 +2798,34 @@ const MemoriWidget = ({
2894
2798
  }
2895
2799
  }, [tenant?.billingDelegation, deepThoughtEnabled]);
2896
2800
 
2801
+ useEffect(() => {
2802
+ const closeSession = () => {
2803
+ if (sessionId) {
2804
+ deleteSession(sessionId);
2805
+ }
2806
+ };
2807
+
2808
+ // delete session when the user closes the browser tab
2809
+ window.addEventListener('beforeunload', closeSession);
2810
+
2811
+ return () => {
2812
+ window.removeEventListener('beforeunload', closeSession);
2813
+ closeSession();
2814
+ };
2815
+ }, [sessionId]);
2816
+
2897
2817
  const showFullHistory =
2898
2818
  showOnlyLastMessages === undefined
2899
- ? layout !== 'TOTEM' && layout !== 'WEBSITE_ASSISTANT'
2819
+ ? selectedLayout !== 'TOTEM' &&
2820
+ selectedLayout !== 'WEBSITE_ASSISTANT' &&
2821
+ selectedLayout !== 'HIDDEN_CHAT'
2900
2822
  : !showOnlyLastMessages;
2901
2823
 
2902
2824
  const headerProps: HeaderProps = {
2903
- memori,
2825
+ memori: {
2826
+ ...memori,
2827
+ ownerUserID: memori.ownerUserID ?? ownerUserID ?? undefined,
2828
+ },
2904
2829
  tenant,
2905
2830
  history,
2906
2831
  showShare: showShare ?? integrationConfig?.showShare ?? true,
@@ -2909,11 +2834,23 @@ const MemoriWidget = ({
2909
2834
  setShowSettingsDrawer,
2910
2835
  setShowKnownFactsDrawer,
2911
2836
  setShowExpertsDrawer,
2912
- showSpeaker: !!AZURE_COGNITIVE_SERVICES_TTS_KEY,
2913
- speakerMuted: muteSpeaker || speakerMuted,
2837
+ enableAudio: defaultEnableAudio,
2838
+ speakerMuted: speakerMuted ?? false,
2914
2839
  setSpeakerMuted: mute => {
2915
- speakerMuted = !!mute;
2916
- setMuteSpeaker(mute);
2840
+ // If audio is disabled, force mute and don't allow unmuting
2841
+ if (!(enableAudio ?? integrationConfig?.enableAudio ?? true)) {
2842
+ mute = true;
2843
+ }
2844
+
2845
+ toggleMute(mute);
2846
+ let microphoneMode = getLocalConfig<string>(
2847
+ 'microphoneMode',
2848
+ 'HOLD_TO_TALK'
2849
+ );
2850
+ if (microphoneMode === 'CONTINUOUS' && mute) {
2851
+ setContinuousSpeech(false);
2852
+ setLocalConfig('microphoneMode', 'HOLD_TO_TALK');
2853
+ }
2917
2854
  setLocalConfig('muteSpeaker', !!mute);
2918
2855
  if (mute) {
2919
2856
  stopAudio();
@@ -2925,16 +2862,20 @@ const MemoriWidget = ({
2925
2862
  source.connect(audioContext.destination);
2926
2863
  }
2927
2864
  },
2928
- showSettings,
2865
+ setShowChatHistoryDrawer,
2866
+ showSettings: showSettings ?? integrationConfig?.showSettings ?? true,
2867
+ showChatHistory:
2868
+ showChatHistory ?? integrationConfig?.showChatHistory ?? true,
2929
2869
  hasUserActivatedSpeak,
2930
2870
  showReload: selectedLayout === 'TOTEM',
2931
2871
  showClear,
2932
2872
  clearHistory: () => setHistory(h => h.slice(-1)),
2933
- showLogin,
2873
+ showLogin: showLogin ?? memori.requireLoginToken,
2934
2874
  setShowLoginDrawer,
2935
2875
  loginToken,
2936
2876
  user,
2937
2877
  sessionID: sessionId,
2878
+ baseUrl,
2938
2879
  };
2939
2880
 
2940
2881
  const avatarProps: AvatarProps = {
@@ -2946,32 +2887,38 @@ const MemoriWidget = ({
2946
2887
  avatar3dVisible,
2947
2888
  setAvatar3dVisible,
2948
2889
  hasUserActivatedSpeak,
2949
- isPlayingAudio: isPlayingAudio && !muteSpeaker,
2890
+ isPlayingAudio:
2891
+ isPlayingAudio &&
2892
+ !speakerMuted &&
2893
+ (enableAudio ?? integrationConfig?.enableAudio ?? true),
2950
2894
  loading: !!memoriTyping,
2951
2895
  baseUrl,
2952
- apiUrl,
2896
+ apiUrl: client.constants.BACKEND_URL,
2897
+ enablePositionControls,
2898
+ setEnablePositionControls,
2899
+ avatarType,
2953
2900
  };
2954
2901
 
2955
2902
  const startPanelProps: StartPanelProps = {
2956
2903
  memori,
2957
2904
  tenant: tenant,
2958
- gamificationLevel: gamificationLevel,
2959
2905
  language: language,
2960
2906
  userLang: userLang,
2961
2907
  setUserLang: setUserLang,
2962
2908
  baseUrl: baseUrl,
2963
- apiUrl: apiUrl,
2909
+ apiUrl: client.constants.BACKEND_URL,
2964
2910
  position: position,
2965
2911
  openPositionDrawer: () => setShowPositionDrawer(true),
2966
2912
  integrationConfig: integrationConfig,
2967
2913
  instruct: instruct,
2968
2914
  sessionId: sessionId,
2969
2915
  clickedStart: clickedStart,
2916
+ isMultilanguageEnabled: isMultilanguageEnabled,
2970
2917
  onClickStart: onClickStart,
2971
- initializeTTS: initializeTTS,
2972
2918
  isUserLoggedIn: !!loginToken && !!user?.userID,
2919
+ hasInitialSession: !!initialSessionID,
2973
2920
  notEnoughCredits: needsCredits && !hasEnoughCredits,
2974
- showLogin,
2921
+ showLogin: showLogin ?? memori.requireLoginToken,
2975
2922
  setShowLoginDrawer,
2976
2923
  user,
2977
2924
  };
@@ -2991,7 +2938,7 @@ const MemoriWidget = ({
2991
2938
  ? userLang
2992
2939
  : undefined,
2993
2940
  baseUrl,
2994
- apiUrl,
2941
+ apiUrl: client.constants.BACKEND_URL,
2995
2942
  layout,
2996
2943
  memoriTyping,
2997
2944
  typingText,
@@ -3000,43 +2947,47 @@ const MemoriWidget = ({
3000
2947
  authToken:
3001
2948
  loginToken ?? userToken ?? additionalInfo?.loginToken ?? authToken,
3002
2949
  dialogState: currentDialogState,
3003
- setDialogState: setCurrentDialogState,
3004
2950
  pushMessage,
3005
2951
  simulateUserPrompt,
3006
2952
  showDates,
3007
2953
  showContextPerLine,
3008
2954
  showAIicon,
2955
+ showUpload: enableUpload,
2956
+ showReasoning: enableReasoning,
3009
2957
  showWhyThisAnswer,
2958
+ showCopyButton,
2959
+ showTranslationOriginal,
3010
2960
  client,
3011
- selectReceiverTag,
2961
+ instruct,
3012
2962
  preview,
3013
2963
  sendOnEnter,
3014
2964
  setSendOnEnter,
3015
2965
  microphoneMode: continuousSpeech ? 'CONTINUOUS' : 'HOLD_TO_TALK',
3016
2966
  attachmentsMenuOpen,
3017
2967
  setAttachmentsMenuOpen,
3018
- instruct,
3019
2968
  showInputs,
3020
- showMicrophone: !!AZURE_COGNITIVE_SERVICES_TTS_KEY,
2969
+ showMicrophone:
2970
+ !!ttsProvider && (enableAudio ?? integrationConfig?.enableAudio ?? true),
2971
+ showFunctionCache,
3021
2972
  userMessage,
3022
2973
  onChangeUserMessage,
3023
- sendMessage: (msg: string) => {
2974
+ sendMessage: (msg: string, media?: (Medium & { type: string })[]) => {
3024
2975
  stopAudio();
3025
- stopListening();
3026
- sendMessage(msg);
2976
+ stopRecording();
2977
+ sendMessage(msg, media);
3027
2978
  setUserMessage('');
3028
- resetTranscript();
3029
2979
  },
3030
- stopListening: clearListening,
3031
- startListening,
2980
+ stopListening: stopRecording,
2981
+ startListening: startRecording,
3032
2982
  stopAudio,
3033
- resetTranscript,
3034
- listening,
2983
+ listening: isListening,
2984
+ setEnableFocusChatInput,
3035
2985
  isPlayingAudio,
3036
2986
  customMediaRenderer,
3037
2987
  user,
3038
2988
  userAvatar,
3039
2989
  experts,
2990
+ useMathFormatting: applyMathFormatting,
3040
2991
  };
3041
2992
 
3042
2993
  const integrationBackground =
@@ -3055,17 +3006,6 @@ const MemoriWidget = ({
3055
3006
  <style dangerouslySetInnerHTML={{ __html: integrationStylesheet }} />
3056
3007
  ) : null;
3057
3008
 
3058
- const onChangeMode = (mode: 'instruct' | 'test') => {
3059
- setInstruct(mode === 'instruct');
3060
- setHasUserActivatedSpeak(false);
3061
- setClickedStart(false);
3062
- };
3063
- const changeModeProps: ChangeModeProps = {
3064
- canInstruct: !!memori.giverTag,
3065
- instruct: !!instruct,
3066
- onChangeMode,
3067
- };
3068
-
3069
3009
  const poweredBy = (
3070
3010
  <PoweredBy
3071
3011
  tenant={tenant}
@@ -3085,6 +3025,10 @@ const MemoriWidget = ({
3085
3025
  ? FullPageLayout
3086
3026
  : selectedLayout === 'WEBSITE_ASSISTANT'
3087
3027
  ? WebsiteAssistantLayout
3028
+ : selectedLayout === 'HIDDEN_CHAT'
3029
+ ? HiddenChatLayout
3030
+ : selectedLayout === 'ZOOMED_FULL_BODY'
3031
+ ? ZoomedFullBodyLayout
3088
3032
  : FullPageLayout;
3089
3033
 
3090
3034
  return (
@@ -3092,14 +3036,15 @@ const MemoriWidget = ({
3092
3036
  className={cx(
3093
3037
  'memori',
3094
3038
  'memori-widget',
3095
- `memori-layout-${layout.toLowerCase()}`,
3039
+ `memori-layout-${selectedLayout.toLowerCase()}`,
3096
3040
  `memori-controls-${controlsPosition.toLowerCase()}`,
3097
3041
  `memori--avatar-${integrationConfig?.avatar || 'default'}`,
3098
3042
  {
3043
+ 'memori--auto-start': autoStart,
3099
3044
  'memori--preview': preview,
3100
3045
  'memori--embed': embed,
3101
3046
  'memori--with-integration': integration,
3102
- 'memori--with-speechkey': !!AZURE_COGNITIVE_SERVICES_TTS_KEY,
3047
+ 'memori--with-speechkey': !!ttsProvider,
3103
3048
  'memori--active': hasUserActivatedSpeak,
3104
3049
  'memori--hide-emissions': hideEmissions,
3105
3050
  'memori--has-active-session': !!sessionId,
@@ -3127,12 +3072,10 @@ const MemoriWidget = ({
3127
3072
  startPanelProps={startPanelProps}
3128
3073
  integrationStyle={integrationStyle}
3129
3074
  integrationBackground={integrationBackground}
3130
- ChangeMode={ChangeMode}
3131
- changeModeProps={changeModeProps}
3132
3075
  poweredBy={poweredBy}
3076
+ autoStart={autoStart}
3133
3077
  sessionId={sessionId}
3134
3078
  hasUserActivatedSpeak={hasUserActivatedSpeak}
3135
- showInstruct={showInstruct}
3136
3079
  loading={loading}
3137
3080
  />
3138
3081
 
@@ -3158,8 +3101,8 @@ const MemoriWidget = ({
3158
3101
  !sessionId,
3159
3102
  values['password'],
3160
3103
  values['tokens'],
3161
- instruct ? memori.giverTag : personification?.tag,
3162
- instruct ? memori.giverPIN : personification?.pin,
3104
+ personification?.tag,
3105
+ personification?.pin,
3163
3106
  {
3164
3107
  PATHNAME: window.location.pathname?.toUpperCase(),
3165
3108
  ROUTE:
@@ -3172,7 +3115,14 @@ const MemoriWidget = ({
3172
3115
  )
3173
3116
  .then(state => {
3174
3117
  setAuthModalState(null);
3175
- onClickStart(state || undefined);
3118
+ // If we got a valid state from reopenSession, don't call onClickStart again
3119
+ // to avoid duplicate snippet execution
3120
+ if (state?.dialogState) {
3121
+ setHasUserActivatedSpeak(true);
3122
+ } else {
3123
+ // Only call onClickStart if reopenSession didn't return a valid state
3124
+ onClickStart(state || undefined);
3125
+ }
3176
3126
  })
3177
3127
  .catch(() => {
3178
3128
  setAuthModalState(null);
@@ -3199,8 +3149,8 @@ const MemoriWidget = ({
3199
3149
  !sessionId,
3200
3150
  memoriPassword || memoriPwd || memori?.secretToken,
3201
3151
  memoriTokens,
3202
- instruct ? memori.giverTag : personification?.tag,
3203
- instruct ? memori.giverPIN : personification?.pin,
3152
+ personification?.tag,
3153
+ personification?.pin,
3204
3154
  {
3205
3155
  PATHNAME: window.location.pathname?.toUpperCase(),
3206
3156
  ROUTE:
@@ -3243,7 +3193,35 @@ const MemoriWidget = ({
3243
3193
  setControlsPosition={setControlsPosition}
3244
3194
  hideEmissions={hideEmissions}
3245
3195
  setHideEmissions={setHideEmissions}
3196
+ avatarType={avatarType}
3197
+ setAvatarType={setAvatarType}
3198
+ enablePositionControls={enablePositionControls}
3199
+ setEnablePositionControls={setEnablePositionControls}
3200
+ isAvatar3d={!!integrationConfig?.avatarURL}
3246
3201
  additionalSettings={additionalSettings}
3202
+ speakerMuted={speakerMuted}
3203
+ />
3204
+ )}
3205
+
3206
+ {showChatHistoryDrawer && (
3207
+ <ChatHistoryDrawer
3208
+ open={!!showChatHistoryDrawer}
3209
+ onClose={() => setShowChatHistoryDrawer(false)}
3210
+ resumeSession={chatLog => {
3211
+ setChatLogID(chatLog.chatLogID);
3212
+ onClickStart(undefined, false, chatLog);
3213
+ setShowChatHistoryDrawer(false);
3214
+ }}
3215
+ apiClient={client}
3216
+ sessionId={sessionId || ''}
3217
+ memori={memori}
3218
+ baseUrl={baseUrl}
3219
+ history={history}
3220
+ apiUrl={client.constants.BACKEND_URL}
3221
+ loginToken={loginToken}
3222
+ language={language}
3223
+ userLang={userLang}
3224
+ isMultilanguageEnabled={isMultilanguageEnabled}
3247
3225
  />
3248
3226
  )}
3249
3227
 
@@ -3256,13 +3234,16 @@ const MemoriWidget = ({
3256
3234
  onClose={position => {
3257
3235
  if (position) applyPosition(position);
3258
3236
  setShowPositionDrawer(false);
3237
+ if (autoStart) {
3238
+ onClickStart();
3239
+ }
3259
3240
  }}
3260
3241
  />
3261
3242
  )}
3262
3243
 
3263
3244
  {showKnownFactsDrawer && sessionId && (
3264
3245
  <KnownFacts
3265
- apiURL={apiUrl}
3246
+ apiClient={client}
3266
3247
  memori={memori}
3267
3248
  sessionID={sessionId}
3268
3249
  visible={showKnownFactsDrawer}
@@ -3272,7 +3253,7 @@ const MemoriWidget = ({
3272
3253
 
3273
3254
  {showExpertsDrawer && !!experts && (
3274
3255
  <ExpertsDrawer
3275
- apiUrl={apiUrl}
3256
+ apiUrl={client.constants.BACKEND_URL}
3276
3257
  baseUrl={baseUrl}
3277
3258
  tenant={tenant}
3278
3259
  experts={experts}
@@ -3281,10 +3262,10 @@ const MemoriWidget = ({
3281
3262
  />
3282
3263
  )}
3283
3264
 
3284
- {showLoginDrawer && tenant?.id && (
3265
+ {showLoginDrawer && tenant?.name && (
3285
3266
  <LoginDrawer
3286
3267
  tenant={tenant}
3287
- apiUrl={apiUrl}
3268
+ apiClient={client}
3288
3269
  open={!!showLoginDrawer}
3289
3270
  user={user}
3290
3271
  loginToken={loginToken}
@@ -3309,6 +3290,20 @@ const MemoriWidget = ({
3309
3290
  }}
3310
3291
  />
3311
3292
  )}
3293
+
3294
+ {error && (
3295
+ <Alert
3296
+ open={!!error}
3297
+ onClose={() => {
3298
+ setError(null);
3299
+ //opens up the allow media of the browser
3300
+ window.open('chrome://settings/content/autoplay', '_blank');
3301
+ }}
3302
+ title="Error"
3303
+ description={error.message}
3304
+ type="error"
3305
+ />
3306
+ )}
3312
3307
  </div>
3313
3308
  );
3314
3309
  };