@memori.ai/memori-react 9.0.0-alpha.2 → 9.0.0-alpha.21

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 (1094) hide show
  1. package/CHANGELOG.md +1103 -0
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.css +9 -4
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +8 -3
  4. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  5. package/dist/components/Auth/Auth.js +3 -1
  6. package/dist/components/Auth/Auth.js.map +1 -1
  7. package/dist/components/Avatar/Avatar.js +5 -10
  8. package/dist/components/Avatar/Avatar.js.map +1 -1
  9. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +8 -1
  10. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  11. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +1 -1
  12. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
  13. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -0
  14. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js +14 -5
  15. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  16. package/dist/components/Chat/Chat.css +137 -34
  17. package/dist/components/Chat/Chat.d.ts +3 -0
  18. package/dist/components/Chat/Chat.js +68 -58
  19. package/dist/components/Chat/Chat.js.map +1 -1
  20. package/dist/components/ChatBubble/ChatBubble.css +150 -32
  21. package/dist/components/ChatBubble/ChatBubble.d.ts +1 -0
  22. package/dist/components/ChatBubble/ChatBubble.js +122 -95
  23. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  24. package/dist/components/ChatHistoryDrawer/ChatHistory.css +5 -0
  25. package/dist/components/ChatHistoryDrawer/ChatHistory.js +27 -10
  26. package/dist/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  27. package/dist/components/ChatHistoryDrawer/ChatResumeDrawer.css +6 -1
  28. package/dist/components/ChatInputs/ChatInputs.css +332 -149
  29. package/dist/components/ChatInputs/ChatInputs.d.ts +2 -0
  30. package/dist/components/ChatInputs/ChatInputs.js +5 -6
  31. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  32. package/dist/components/ChatTextArea/ChatTextArea.css +31 -27
  33. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js +6 -3
  34. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  35. package/dist/components/ContentPreviewModal/ContentPreviewModal.css +6 -22
  36. package/dist/components/ContentPreviewModal/ContentPreviewModal.js +3 -1
  37. package/dist/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  38. package/dist/components/DateSelector/DateSelector.css +25 -2
  39. package/dist/components/DateSelector/DateSelector.d.ts +2 -1
  40. package/dist/components/DateSelector/DateSelector.js +17 -7
  41. package/dist/components/DateSelector/DateSelector.js.map +1 -1
  42. package/dist/components/ExpertsDrawer/ExpertsDrawer.js +3 -1
  43. package/dist/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
  44. package/dist/components/FilePreview/FilePreview.css +42 -21
  45. package/dist/components/FilePreview/FilePreview.d.ts +2 -1
  46. package/dist/components/FilePreview/FilePreview.js +28 -7
  47. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  48. package/dist/components/Header/ChatConsumptionDropdown.d.ts +3 -1
  49. package/dist/components/Header/ChatConsumptionDropdown.js +5 -3
  50. package/dist/components/Header/ChatConsumptionDropdown.js.map +1 -1
  51. package/dist/components/Header/Header.css +210 -39
  52. package/dist/components/Header/Header.d.ts +1 -0
  53. package/dist/components/Header/Header.js +135 -51
  54. package/dist/components/Header/Header.js.map +1 -1
  55. package/dist/components/IconButton/IconButton.css +144 -0
  56. package/dist/components/IconButton/IconButton.d.ts +9 -0
  57. package/dist/components/IconButton/IconButton.js +36 -0
  58. package/dist/components/IconButton/IconButton.js.map +1 -0
  59. package/dist/components/KnownFacts/KnownFacts.css +22 -9
  60. package/dist/components/KnownFacts/KnownFacts.js +18 -7
  61. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  62. package/dist/components/LoginDrawer/LoginDrawer.css +42 -0
  63. package/dist/components/LoginDrawer/LoginDrawer.js +3 -1
  64. package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
  65. package/dist/components/MediaWidget/MediaItemWidget.js +14 -12
  66. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  67. package/dist/components/MediaWidget/MediaItemWidget.utils.d.ts +3 -2
  68. package/dist/components/MediaWidget/MediaItemWidget.utils.js +28 -6
  69. package/dist/components/MediaWidget/MediaItemWidget.utils.js.map +1 -1
  70. package/dist/components/MediaWidget/MediaPreviewModal.js +6 -7
  71. package/dist/components/MediaWidget/MediaPreviewModal.js.map +1 -1
  72. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.css +7 -2
  73. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js +1 -1
  74. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js.map +1 -1
  75. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js +14 -12
  76. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js.map +1 -1
  77. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +36 -124
  78. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +251 -170
  79. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.d.ts +1 -0
  80. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +25 -15
  81. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  82. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +18 -2
  83. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +210 -62
  84. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  85. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +1 -0
  86. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js +1 -1
  87. package/dist/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js.map +1 -1
  88. package/dist/components/MemoriArtifactSystem/context/ArtifactContext.d.ts +3 -1
  89. package/dist/components/MemoriArtifactSystem/context/ArtifactContext.js +65 -1
  90. package/dist/components/MemoriArtifactSystem/context/ArtifactContext.js.map +1 -1
  91. package/dist/components/MemoriArtifactSystem/types/artifact.types.d.ts +11 -0
  92. package/dist/components/MemoriArtifactSystem/utils/ArtifactAPI.js +18 -13
  93. package/dist/components/MemoriArtifactSystem/utils/ArtifactAPI.js.map +1 -1
  94. package/dist/components/MemoriArtifactSystem/utils/applyEdits.d.ts +8 -0
  95. package/dist/components/MemoriArtifactSystem/utils/applyEdits.js +117 -0
  96. package/dist/components/MemoriArtifactSystem/utils/applyEdits.js.map +1 -0
  97. package/dist/components/MemoriWidget/MemoriWidget.css +65 -5
  98. package/dist/components/MemoriWidget/MemoriWidget.d.ts +1 -0
  99. package/dist/components/MemoriWidget/MemoriWidget.js +820 -457
  100. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  101. package/dist/components/MicrophoneButton/MicrophoneButton.css +4 -131
  102. package/dist/components/MicrophoneButton/MicrophoneButton.js +3 -1
  103. package/dist/components/MicrophoneButton/MicrophoneButton.js.map +1 -1
  104. package/dist/components/MobileSessionPanel/MobileSessionPanel.css +29 -7
  105. package/dist/components/MobileSessionPanel/MobileSessionPanel.d.ts +6 -1
  106. package/dist/components/MobileSessionPanel/MobileSessionPanel.js +12 -9
  107. package/dist/components/MobileSessionPanel/MobileSessionPanel.js.map +1 -1
  108. package/dist/components/PositionPopover/PositionPopover.d.ts +2 -0
  109. package/dist/components/PositionPopover/PositionPopover.js +19 -11
  110. package/dist/components/PositionPopover/PositionPopover.js.map +1 -1
  111. package/dist/components/PoweredBy/PoweredBy.css +4 -3
  112. package/dist/components/SettingsDrawer/SettingsDrawer.js +4 -2
  113. package/dist/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  114. package/dist/components/ShareButton/ShareButton.css +3 -2
  115. package/dist/components/ShareButton/ShareButton.js +3 -4
  116. package/dist/components/ShareButton/ShareButton.js.map +1 -1
  117. package/dist/components/Snippet/Snippet.css +6 -36
  118. package/dist/components/Snippet/Snippet.js +3 -1
  119. package/dist/components/Snippet/Snippet.js.map +1 -1
  120. package/dist/components/StartPanel/StartPanel.css +114 -10
  121. package/dist/components/StartPanel/StartPanel.js +14 -9
  122. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  123. package/dist/components/UploadButton/UploadButton.css +3 -40
  124. package/dist/components/UploadButton/UploadButton.d.ts +1 -0
  125. package/dist/components/UploadButton/UploadButton.js +34 -25
  126. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  127. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.d.ts +1 -6
  128. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +47 -113
  129. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  130. package/dist/components/UploadButton/UploadImages/UploadImages.js +3 -1
  131. package/dist/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  132. package/dist/components/WhyThisAnswer/WhyThisAnswer.js +3 -1
  133. package/dist/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  134. package/dist/components/layouts/Chat.js +67 -79
  135. package/dist/components/layouts/Chat.js.map +1 -1
  136. package/dist/components/layouts/FullPage.js +90 -42
  137. package/dist/components/layouts/FullPage.js.map +1 -1
  138. package/dist/components/layouts/HiddenChat.js +11 -236
  139. package/dist/components/layouts/HiddenChat.js.map +1 -1
  140. package/dist/components/layouts/Totem.js +10 -1
  141. package/dist/components/layouts/Totem.js.map +1 -1
  142. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js +30 -3
  143. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  144. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +175 -61
  145. package/dist/components/layouts/ZoomedFullBody.js +90 -42
  146. package/dist/components/layouts/ZoomedFullBody.js.map +1 -1
  147. package/dist/components/layouts/chat.css +232 -85
  148. package/dist/components/layouts/fullpage.css +253 -93
  149. package/dist/components/layouts/hidden-chat.css +172 -62
  150. package/dist/components/layouts/totem.css +151 -50
  151. package/dist/components/layouts/zoomed-full-body.css +339 -34
  152. package/dist/context/widgetSurfaceContext.d.ts +3 -0
  153. package/dist/context/widgetSurfaceContext.js +11 -0
  154. package/dist/context/widgetSurfaceContext.js.map +1 -0
  155. package/dist/helpers/constants.d.ts +4 -0
  156. package/dist/helpers/constants.js +50 -1
  157. package/dist/helpers/constants.js.map +1 -1
  158. package/dist/helpers/convertDocument.d.ts +1 -0
  159. package/dist/helpers/convertDocument.js +24 -0
  160. package/dist/helpers/convertDocument.js.map +1 -0
  161. package/dist/helpers/credits.d.ts +5 -2
  162. package/dist/helpers/credits.js +5 -1
  163. package/dist/helpers/credits.js.map +1 -1
  164. package/dist/helpers/media.js +18 -3
  165. package/dist/helpers/media.js.map +1 -1
  166. package/dist/helpers/message.d.ts +1 -1
  167. package/dist/helpers/message.js +7 -4
  168. package/dist/helpers/message.js.map +1 -1
  169. package/dist/helpers/nats/getNatsConfig.d.ts +9 -0
  170. package/dist/helpers/nats/getNatsConfig.js +65 -0
  171. package/dist/helpers/nats/getNatsConfig.js.map +1 -0
  172. package/dist/helpers/nats/isSessionExpiredError.d.ts +3 -0
  173. package/dist/helpers/nats/isSessionExpiredError.js +36 -0
  174. package/dist/helpers/nats/isSessionExpiredError.js.map +1 -0
  175. package/dist/helpers/nats/useNats.d.ts +12 -0
  176. package/dist/helpers/nats/useNats.js +75 -0
  177. package/dist/helpers/nats/useNats.js.map +1 -0
  178. package/dist/helpers/nats/useNatsSession.d.ts +28 -0
  179. package/dist/helpers/nats/useNatsSession.js +212 -0
  180. package/dist/helpers/nats/useNatsSession.js.map +1 -0
  181. package/dist/helpers/positionPopover.d.ts +1 -0
  182. package/dist/helpers/positionPopover.js +7 -0
  183. package/dist/helpers/positionPopover.js.map +1 -0
  184. package/dist/helpers/tts/muteSpeaker.d.ts +13 -0
  185. package/dist/helpers/tts/muteSpeaker.js +26 -0
  186. package/dist/helpers/tts/muteSpeaker.js.map +1 -0
  187. package/dist/helpers/tts/useTTS.js +18 -9
  188. package/dist/helpers/tts/useTTS.js.map +1 -1
  189. package/dist/helpers/usePressTooltip.d.ts +13 -0
  190. package/dist/helpers/usePressTooltip.js +23 -0
  191. package/dist/helpers/usePressTooltip.js.map +1 -0
  192. package/dist/helpers/utils.d.ts +21 -0
  193. package/dist/helpers/utils.js +75 -4
  194. package/dist/helpers/utils.js.map +1 -1
  195. package/dist/index.js +16 -16
  196. package/dist/index.js.map +1 -1
  197. package/dist/locales/de.json +15 -1
  198. package/dist/locales/en.json +16 -2
  199. package/dist/locales/es.json +15 -1
  200. package/dist/locales/fr.json +15 -1
  201. package/dist/locales/it.json +16 -2
  202. package/dist/styles.css +1 -163
  203. package/dist/types/integration.d.ts +3 -0
  204. package/dist/types/integration.js +16 -0
  205. package/dist/types/integration.js.map +1 -0
  206. package/dist/version.d.ts +1 -1
  207. package/dist/version.js +1 -1
  208. package/dist/version.js.map +1 -1
  209. package/esm/components/AgeVerificationModal/AgeVerificationModal.css +9 -4
  210. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +8 -3
  211. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  212. package/esm/components/Auth/Auth.js +3 -1
  213. package/esm/components/Auth/Auth.js.map +1 -1
  214. package/esm/components/Avatar/Avatar.js +5 -10
  215. package/esm/components/Avatar/Avatar.js.map +1 -1
  216. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +9 -2
  217. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  218. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +2 -2
  219. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
  220. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -0
  221. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js +12 -4
  222. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  223. package/esm/components/Chat/Chat.css +137 -34
  224. package/esm/components/Chat/Chat.d.ts +3 -0
  225. package/esm/components/Chat/Chat.js +68 -58
  226. package/esm/components/Chat/Chat.js.map +1 -1
  227. package/esm/components/ChatBubble/ChatBubble.css +150 -32
  228. package/esm/components/ChatBubble/ChatBubble.d.ts +1 -0
  229. package/esm/components/ChatBubble/ChatBubble.js +123 -96
  230. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  231. package/esm/components/ChatHistoryDrawer/ChatHistory.css +5 -0
  232. package/esm/components/ChatHistoryDrawer/ChatHistory.js +27 -10
  233. package/esm/components/ChatHistoryDrawer/ChatHistory.js.map +1 -1
  234. package/esm/components/ChatHistoryDrawer/ChatResumeDrawer.css +6 -1
  235. package/esm/components/ChatInputs/ChatInputs.css +332 -149
  236. package/esm/components/ChatInputs/ChatInputs.d.ts +2 -0
  237. package/esm/components/ChatInputs/ChatInputs.js +5 -6
  238. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  239. package/esm/components/ChatTextArea/ChatTextArea.css +31 -27
  240. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js +6 -3
  241. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  242. package/esm/components/ContentPreviewModal/ContentPreviewModal.css +6 -22
  243. package/esm/components/ContentPreviewModal/ContentPreviewModal.js +3 -1
  244. package/esm/components/ContentPreviewModal/ContentPreviewModal.js.map +1 -1
  245. package/esm/components/DateSelector/DateSelector.css +25 -2
  246. package/esm/components/DateSelector/DateSelector.d.ts +2 -1
  247. package/esm/components/DateSelector/DateSelector.js +17 -7
  248. package/esm/components/DateSelector/DateSelector.js.map +1 -1
  249. package/esm/components/ExpertsDrawer/ExpertsDrawer.js +3 -1
  250. package/esm/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
  251. package/esm/components/FilePreview/FilePreview.css +42 -21
  252. package/esm/components/FilePreview/FilePreview.d.ts +2 -1
  253. package/esm/components/FilePreview/FilePreview.js +31 -10
  254. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  255. package/esm/components/Header/ChatConsumptionDropdown.d.ts +3 -1
  256. package/esm/components/Header/ChatConsumptionDropdown.js +7 -5
  257. package/esm/components/Header/ChatConsumptionDropdown.js.map +1 -1
  258. package/esm/components/Header/Header.css +210 -39
  259. package/esm/components/Header/Header.d.ts +1 -0
  260. package/esm/components/Header/Header.js +136 -52
  261. package/esm/components/Header/Header.js.map +1 -1
  262. package/esm/components/IconButton/IconButton.css +144 -0
  263. package/esm/components/IconButton/IconButton.d.ts +9 -0
  264. package/esm/components/IconButton/IconButton.js +33 -0
  265. package/esm/components/IconButton/IconButton.js.map +1 -0
  266. package/esm/components/KnownFacts/KnownFacts.css +22 -9
  267. package/esm/components/KnownFacts/KnownFacts.js +18 -7
  268. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  269. package/esm/components/LoginDrawer/LoginDrawer.css +42 -0
  270. package/esm/components/LoginDrawer/LoginDrawer.js +3 -1
  271. package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
  272. package/esm/components/MediaWidget/MediaItemWidget.js +16 -14
  273. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  274. package/esm/components/MediaWidget/MediaItemWidget.utils.d.ts +3 -2
  275. package/esm/components/MediaWidget/MediaItemWidget.utils.js +27 -6
  276. package/esm/components/MediaWidget/MediaItemWidget.utils.js.map +1 -1
  277. package/esm/components/MediaWidget/MediaPreviewModal.js +6 -7
  278. package/esm/components/MediaWidget/MediaPreviewModal.js.map +1 -1
  279. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.css +7 -2
  280. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js +1 -1
  281. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.js.map +1 -1
  282. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js +15 -13
  283. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.js.map +1 -1
  284. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +36 -124
  285. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +251 -170
  286. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.d.ts +1 -0
  287. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +26 -16
  288. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  289. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +18 -2
  290. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +211 -63
  291. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  292. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +1 -0
  293. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js +2 -2
  294. package/esm/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.js.map +1 -1
  295. package/esm/components/MemoriArtifactSystem/context/ArtifactContext.d.ts +3 -1
  296. package/esm/components/MemoriArtifactSystem/context/ArtifactContext.js +66 -2
  297. package/esm/components/MemoriArtifactSystem/context/ArtifactContext.js.map +1 -1
  298. package/esm/components/MemoriArtifactSystem/types/artifact.types.d.ts +11 -0
  299. package/esm/components/MemoriArtifactSystem/utils/ArtifactAPI.js +18 -13
  300. package/esm/components/MemoriArtifactSystem/utils/ArtifactAPI.js.map +1 -1
  301. package/esm/components/MemoriArtifactSystem/utils/applyEdits.d.ts +8 -0
  302. package/esm/components/MemoriArtifactSystem/utils/applyEdits.js +112 -0
  303. package/esm/components/MemoriArtifactSystem/utils/applyEdits.js.map +1 -0
  304. package/esm/components/MemoriWidget/MemoriWidget.css +65 -5
  305. package/esm/components/MemoriWidget/MemoriWidget.d.ts +1 -0
  306. package/esm/components/MemoriWidget/MemoriWidget.js +821 -458
  307. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  308. package/esm/components/MicrophoneButton/MicrophoneButton.css +4 -131
  309. package/esm/components/MicrophoneButton/MicrophoneButton.js +3 -2
  310. package/esm/components/MicrophoneButton/MicrophoneButton.js.map +1 -1
  311. package/esm/components/MobileSessionPanel/MobileSessionPanel.css +29 -7
  312. package/esm/components/MobileSessionPanel/MobileSessionPanel.d.ts +6 -1
  313. package/esm/components/MobileSessionPanel/MobileSessionPanel.js +12 -9
  314. package/esm/components/MobileSessionPanel/MobileSessionPanel.js.map +1 -1
  315. package/esm/components/PositionPopover/PositionPopover.d.ts +2 -0
  316. package/esm/components/PositionPopover/PositionPopover.js +20 -12
  317. package/esm/components/PositionPopover/PositionPopover.js.map +1 -1
  318. package/esm/components/PoweredBy/PoweredBy.css +4 -3
  319. package/esm/components/SettingsDrawer/SettingsDrawer.js +4 -2
  320. package/esm/components/SettingsDrawer/SettingsDrawer.js.map +1 -1
  321. package/esm/components/ShareButton/ShareButton.css +3 -2
  322. package/esm/components/ShareButton/ShareButton.js +4 -5
  323. package/esm/components/ShareButton/ShareButton.js.map +1 -1
  324. package/esm/components/Snippet/Snippet.css +6 -36
  325. package/esm/components/Snippet/Snippet.js +4 -2
  326. package/esm/components/Snippet/Snippet.js.map +1 -1
  327. package/esm/components/StartPanel/StartPanel.css +114 -10
  328. package/esm/components/StartPanel/StartPanel.js +15 -10
  329. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  330. package/esm/components/UploadButton/UploadButton.css +3 -40
  331. package/esm/components/UploadButton/UploadButton.d.ts +1 -0
  332. package/esm/components/UploadButton/UploadButton.js +34 -25
  333. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  334. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.d.ts +1 -6
  335. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +47 -113
  336. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  337. package/esm/components/UploadButton/UploadImages/UploadImages.js +3 -1
  338. package/esm/components/UploadButton/UploadImages/UploadImages.js.map +1 -1
  339. package/esm/components/WhyThisAnswer/WhyThisAnswer.js +3 -1
  340. package/esm/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
  341. package/esm/components/layouts/Chat.js +70 -82
  342. package/esm/components/layouts/Chat.js.map +1 -1
  343. package/esm/components/layouts/FullPage.js +91 -43
  344. package/esm/components/layouts/FullPage.js.map +1 -1
  345. package/esm/components/layouts/HiddenChat.js +13 -238
  346. package/esm/components/layouts/HiddenChat.js.map +1 -1
  347. package/esm/components/layouts/Totem.js +10 -1
  348. package/esm/components/layouts/Totem.js.map +1 -1
  349. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js +30 -3
  350. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  351. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +175 -61
  352. package/esm/components/layouts/ZoomedFullBody.js +91 -43
  353. package/esm/components/layouts/ZoomedFullBody.js.map +1 -1
  354. package/esm/components/layouts/chat.css +232 -85
  355. package/esm/components/layouts/fullpage.css +253 -93
  356. package/esm/components/layouts/hidden-chat.css +172 -62
  357. package/esm/components/layouts/totem.css +151 -50
  358. package/esm/components/layouts/zoomed-full-body.css +339 -34
  359. package/esm/context/widgetSurfaceContext.d.ts +3 -0
  360. package/esm/context/widgetSurfaceContext.js +7 -0
  361. package/esm/context/widgetSurfaceContext.js.map +1 -0
  362. package/esm/helpers/constants.d.ts +4 -0
  363. package/esm/helpers/constants.js +49 -0
  364. package/esm/helpers/constants.js.map +1 -1
  365. package/esm/helpers/convertDocument.d.ts +1 -0
  366. package/esm/helpers/convertDocument.js +20 -0
  367. package/esm/helpers/convertDocument.js.map +1 -0
  368. package/esm/helpers/credits.d.ts +5 -2
  369. package/esm/helpers/credits.js +5 -1
  370. package/esm/helpers/credits.js.map +1 -1
  371. package/esm/helpers/media.js +18 -3
  372. package/esm/helpers/media.js.map +1 -1
  373. package/esm/helpers/message.d.ts +1 -1
  374. package/esm/helpers/message.js +5 -2
  375. package/esm/helpers/message.js.map +1 -1
  376. package/esm/helpers/nats/getNatsConfig.d.ts +9 -0
  377. package/esm/helpers/nats/getNatsConfig.js +61 -0
  378. package/esm/helpers/nats/getNatsConfig.js.map +1 -0
  379. package/esm/helpers/nats/isSessionExpiredError.d.ts +3 -0
  380. package/esm/helpers/nats/isSessionExpiredError.js +32 -0
  381. package/esm/helpers/nats/isSessionExpiredError.js.map +1 -0
  382. package/esm/helpers/nats/useNats.d.ts +12 -0
  383. package/esm/helpers/nats/useNats.js +72 -0
  384. package/esm/helpers/nats/useNats.js.map +1 -0
  385. package/esm/helpers/nats/useNatsSession.d.ts +28 -0
  386. package/esm/helpers/nats/useNatsSession.js +208 -0
  387. package/esm/helpers/nats/useNatsSession.js.map +1 -0
  388. package/esm/helpers/positionPopover.d.ts +1 -0
  389. package/esm/helpers/positionPopover.js +4 -0
  390. package/esm/helpers/positionPopover.js.map +1 -0
  391. package/esm/helpers/tts/muteSpeaker.d.ts +13 -0
  392. package/esm/helpers/tts/muteSpeaker.js +21 -0
  393. package/esm/helpers/tts/muteSpeaker.js.map +1 -0
  394. package/esm/helpers/tts/useTTS.js +18 -9
  395. package/esm/helpers/tts/useTTS.js.map +1 -1
  396. package/esm/helpers/usePressTooltip.d.ts +13 -0
  397. package/esm/helpers/usePressTooltip.js +20 -0
  398. package/esm/helpers/usePressTooltip.js.map +1 -0
  399. package/esm/helpers/utils.d.ts +21 -0
  400. package/esm/helpers/utils.js +68 -3
  401. package/esm/helpers/utils.js.map +1 -1
  402. package/esm/index.js +17 -17
  403. package/esm/index.js.map +1 -1
  404. package/esm/locales/de.json +15 -1
  405. package/esm/locales/en.json +16 -2
  406. package/esm/locales/es.json +15 -1
  407. package/esm/locales/fr.json +15 -1
  408. package/esm/locales/it.json +16 -2
  409. package/esm/styles.css +1 -163
  410. package/esm/types/integration.d.ts +3 -0
  411. package/esm/types/integration.js +11 -0
  412. package/esm/types/integration.js.map +1 -0
  413. package/esm/version.d.ts +1 -1
  414. package/esm/version.js +1 -1
  415. package/esm/version.js.map +1 -1
  416. package/package.json +13 -6
  417. package/src/__snapshots__/index.test.tsx.snap +0 -50
  418. package/src/components/AgeVerificationModal/AgeVerificationModal.css +9 -4
  419. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +13 -2
  420. package/src/components/Auth/Auth.tsx +3 -0
  421. package/src/components/Avatar/Avatar.stories.tsx +45 -28
  422. package/src/components/Avatar/Avatar.test.tsx +54 -0
  423. package/src/components/Avatar/Avatar.tsx +8 -12
  424. package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx +12 -5
  425. package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.ts +2 -1
  426. package/src/components/Avatar/AvatarView/AvatarComponent/constants.test.ts +19 -0
  427. package/src/components/Avatar/AvatarView/AvatarComponent/constants.ts +19 -4
  428. package/src/components/Avatar/__snapshots__/Avatar.test.tsx.snap +164 -0
  429. package/src/components/BlockedMemoriBadge/__snapshots__/BlockedMemoriBadge.test.tsx.snap +10 -10
  430. package/src/components/Chat/Chat.css +137 -34
  431. package/src/components/Chat/Chat.tsx +43 -22
  432. package/src/components/Chat/__snapshots__/Chat.test.tsx.snap +7429 -7603
  433. package/src/components/ChatBubble/ChatBubble.css +150 -32
  434. package/src/components/ChatBubble/ChatBubble.test.tsx +65 -1
  435. package/src/components/ChatBubble/ChatBubble.tsx +168 -90
  436. package/src/components/ChatBubble/__snapshots__/ChatBubble.test.tsx.snap +6491 -6387
  437. package/src/components/ChatHistoryDrawer/ChatHistory.css +5 -0
  438. package/src/components/ChatHistoryDrawer/ChatHistory.test.tsx +77 -1
  439. package/src/components/ChatHistoryDrawer/ChatHistory.tsx +59 -27
  440. package/src/components/ChatHistoryDrawer/ChatResumeDrawer.css +6 -1
  441. package/src/components/ChatInputs/ChatInputs.css +332 -149
  442. package/src/components/ChatInputs/ChatInputs.tsx +25 -11
  443. package/src/components/ChatTextArea/ChatTextArea.css +31 -27
  444. package/src/components/CompletionProviderStatus/CompletionProviderStatus.tsx +8 -4
  445. package/src/components/CompletionProviderStatus/__snapshots__/CompletionProviderStatus.test.tsx.snap +6 -6
  446. package/src/components/ContentPreviewModal/ContentPreviewModal.css +6 -22
  447. package/src/components/ContentPreviewModal/ContentPreviewModal.tsx +3 -0
  448. package/src/components/DateSelector/DateSelector.css +25 -2
  449. package/src/components/DateSelector/DateSelector.stories.tsx +11 -2
  450. package/src/components/DateSelector/DateSelector.tsx +28 -9
  451. package/src/components/ExpertsDrawer/ExpertsDrawer.tsx +3 -0
  452. package/src/components/FeedbackButtons/__snapshots__/FeedbackButtons.test.tsx.snap +2 -2
  453. package/src/components/FilePreview/FilePreview.css +42 -21
  454. package/src/components/FilePreview/FilePreview.stories.tsx +0 -3
  455. package/src/components/FilePreview/FilePreview.tsx +42 -7
  456. package/src/components/FilePreview/__snapshots__/FilePreview.test.tsx.snap +14 -0
  457. package/src/components/Header/ChatConsumptionDropdown.tsx +18 -6
  458. package/src/components/Header/Header.css +210 -39
  459. package/src/components/Header/Header.test.tsx +55 -1
  460. package/src/components/Header/Header.tsx +456 -160
  461. package/src/components/Header/__snapshots__/Header.test.tsx.snap +194 -135
  462. package/src/components/IconButton/IconButton.css +144 -0
  463. package/src/components/IconButton/IconButton.tsx +89 -0
  464. package/src/components/KnownFacts/KnownFacts.css +22 -9
  465. package/src/components/KnownFacts/KnownFacts.tsx +18 -3
  466. package/src/components/LoginDrawer/LoginDrawer.css +42 -0
  467. package/src/components/LoginDrawer/LoginDrawer.tsx +3 -0
  468. package/src/components/MediaWidget/MediaItemWidget.tsx +26 -13
  469. package/src/components/MediaWidget/MediaItemWidget.utils.test.ts +45 -2
  470. package/src/components/MediaWidget/MediaItemWidget.utils.ts +39 -6
  471. package/src/components/MediaWidget/MediaPreviewModal.test.tsx +2 -3
  472. package/src/components/MediaWidget/MediaPreviewModal.tsx +9 -7
  473. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +218 -2252
  474. package/src/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.css +7 -2
  475. package/src/components/MemoriArtifactSystem/components/ArtifactActions/ArtifactActions.tsx +19 -33
  476. package/src/components/MemoriArtifactSystem/components/ArtifactActions/components/CopyButtonWithDropdown.tsx +44 -45
  477. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +36 -124
  478. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +251 -170
  479. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +110 -105
  480. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/components/TabSwitch.css +18 -2
  481. package/src/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.tsx +359 -149
  482. package/src/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.css +1 -0
  483. package/src/components/MemoriArtifactSystem/components/ArtifactPreview/ArtifactPreview.tsx +2 -2
  484. package/src/components/MemoriArtifactSystem/context/ArtifactContext.tsx +111 -9
  485. package/src/components/MemoriArtifactSystem/types/artifact.types.ts +20 -1
  486. package/src/components/MemoriArtifactSystem/utils/ArtifactAPI.test.tsx +1 -0
  487. package/src/components/MemoriArtifactSystem/utils/ArtifactAPI.tsx +19 -13
  488. package/src/components/MemoriArtifactSystem/utils/applyEdits.test.ts +85 -0
  489. package/src/components/MemoriArtifactSystem/utils/applyEdits.ts +173 -0
  490. package/src/components/MemoriWidget/MemoriWidget.css +65 -5
  491. package/src/components/MemoriWidget/MemoriWidget.tsx +1294 -764
  492. package/src/components/MicrophoneButton/MicrophoneButton.css +4 -131
  493. package/src/components/MicrophoneButton/MicrophoneButton.tsx +5 -5
  494. package/src/components/MobileSessionPanel/MobileSessionPanel.css +29 -7
  495. package/src/components/MobileSessionPanel/MobileSessionPanel.test.tsx +44 -0
  496. package/src/components/MobileSessionPanel/MobileSessionPanel.tsx +60 -38
  497. package/src/components/PositionPopover/PositionPopover.tsx +32 -20
  498. package/src/components/PoweredBy/PoweredBy.css +4 -3
  499. package/src/components/SettingsDrawer/SettingsDrawer.tsx +4 -1
  500. package/src/components/ShareButton/ShareButton.css +3 -2
  501. package/src/components/ShareButton/ShareButton.tsx +14 -12
  502. package/src/components/ShareButton/__snapshots__/ShareButton.test.tsx.snap +36 -27
  503. package/src/components/Snippet/Snippet.css +6 -36
  504. package/src/components/Snippet/Snippet.tsx +6 -7
  505. package/src/components/StartPanel/StartPanel.css +114 -10
  506. package/src/components/StartPanel/StartPanel.stories.tsx +43 -1
  507. package/src/components/StartPanel/StartPanel.test.tsx +64 -1
  508. package/src/components/StartPanel/StartPanel.tsx +38 -10
  509. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +287 -86
  510. package/src/components/UploadButton/UploadButton.css +3 -40
  511. package/src/components/UploadButton/UploadButton.stories.tsx +3 -3
  512. package/src/components/UploadButton/UploadButton.tsx +50 -44
  513. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +59 -143
  514. package/src/components/UploadButton/UploadImages/UploadImages.tsx +3 -0
  515. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +33 -29
  516. package/src/components/WhyThisAnswer/WhyThisAnswer.tsx +3 -0
  517. package/src/components/layouts/Chat.tsx +235 -239
  518. package/src/components/layouts/FullPage.tsx +160 -65
  519. package/src/components/layouts/HiddenChat.tsx +20 -413
  520. package/src/components/layouts/Totem.tsx +20 -3
  521. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.tsx +72 -16
  522. package/src/components/layouts/WebsiteAssistant/__snapshots__/WebsiteAssistant.test.tsx.snap +60 -44
  523. package/src/components/layouts/WebsiteAssistant/website-assistant.css +175 -61
  524. package/src/components/layouts/ZoomedFullBody.tsx +163 -67
  525. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +597 -583
  526. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +1186 -1146
  527. package/src/components/layouts/__snapshots__/HiddenChat.test.tsx.snap +409 -435
  528. package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +590 -602
  529. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +585 -565
  530. package/src/components/layouts/chat.css +232 -85
  531. package/src/components/layouts/fullpage.css +253 -93
  532. package/src/components/layouts/hidden-chat.css +172 -62
  533. package/src/components/layouts/layouts.stories.tsx +135 -15
  534. package/src/components/layouts/totem.css +151 -50
  535. package/src/components/layouts/zoomed-full-body.css +339 -34
  536. package/src/context/widgetSurfaceContext.tsx +14 -0
  537. package/src/helpers/constants.ts +56 -1
  538. package/src/helpers/convertDocument.test.ts +67 -0
  539. package/src/helpers/convertDocument.ts +35 -0
  540. package/src/helpers/credits.ts +16 -1
  541. package/src/helpers/media.test.ts +36 -0
  542. package/src/helpers/media.ts +39 -12
  543. package/src/helpers/message.test.ts +28 -1
  544. package/src/helpers/message.ts +19 -4
  545. package/src/helpers/nats/getNatsConfig.ts +145 -0
  546. package/src/helpers/nats/isSessionExpiredError.test.ts +38 -0
  547. package/src/helpers/nats/isSessionExpiredError.ts +51 -0
  548. package/src/helpers/nats/useNats.ts +124 -0
  549. package/src/helpers/nats/useNatsSession.ts +394 -0
  550. package/src/helpers/positionPopover.test.ts +39 -0
  551. package/src/helpers/positionPopover.ts +16 -0
  552. package/src/helpers/tts/muteSpeaker.test.ts +81 -0
  553. package/src/helpers/tts/muteSpeaker.ts +46 -0
  554. package/src/helpers/tts/useTTS.ts +32 -22
  555. package/src/helpers/usePressTooltip.ts +29 -0
  556. package/src/helpers/utils.test.ts +162 -0
  557. package/src/helpers/utils.ts +108 -3
  558. package/src/index.stories.tsx +32 -0
  559. package/src/index.tsx +1 -5
  560. package/src/locales/de.json +15 -1
  561. package/src/locales/en.json +16 -2
  562. package/src/locales/es.json +15 -1
  563. package/src/locales/fr.json +15 -1
  564. package/src/locales/it.json +16 -2
  565. package/src/styles.css +113 -15
  566. package/src/types/integration.test.ts +32 -0
  567. package/src/types/integration.ts +31 -0
  568. package/src/version.ts +1 -1
  569. package/dist/components/PositionDrawer/PositionDrawer.d.ts +0 -12
  570. package/dist/components/PositionDrawer/PositionDrawer.js +0 -17
  571. package/dist/components/PositionDrawer/PositionDrawer.js.map +0 -1
  572. package/dist/components/icons/AI.d.ts +0 -6
  573. package/dist/components/icons/AI.js +0 -6
  574. package/dist/components/icons/AI.js.map +0 -1
  575. package/dist/components/icons/Alert.d.ts +0 -6
  576. package/dist/components/icons/Alert.js +0 -6
  577. package/dist/components/icons/Alert.js.map +0 -1
  578. package/dist/components/icons/ArrowUp.d.ts +0 -6
  579. package/dist/components/icons/ArrowUp.js +0 -6
  580. package/dist/components/icons/ArrowUp.js.map +0 -1
  581. package/dist/components/icons/Bug.d.ts +0 -6
  582. package/dist/components/icons/Bug.js +0 -6
  583. package/dist/components/icons/Bug.js.map +0 -1
  584. package/dist/components/icons/Chat.d.ts +0 -6
  585. package/dist/components/icons/Chat.js +0 -6
  586. package/dist/components/icons/Chat.js.map +0 -1
  587. package/dist/components/icons/ChevronDown.d.ts +0 -6
  588. package/dist/components/icons/ChevronDown.js +0 -6
  589. package/dist/components/icons/ChevronDown.js.map +0 -1
  590. package/dist/components/icons/ChevronLeft.d.ts +0 -6
  591. package/dist/components/icons/ChevronLeft.js +0 -6
  592. package/dist/components/icons/ChevronLeft.js.map +0 -1
  593. package/dist/components/icons/ChevronRight.d.ts +0 -6
  594. package/dist/components/icons/ChevronRight.js +0 -6
  595. package/dist/components/icons/ChevronRight.js.map +0 -1
  596. package/dist/components/icons/ChevronUp.d.ts +0 -6
  597. package/dist/components/icons/ChevronUp.js +0 -6
  598. package/dist/components/icons/ChevronUp.js.map +0 -1
  599. package/dist/components/icons/Clear.d.ts +0 -6
  600. package/dist/components/icons/Clear.js +0 -6
  601. package/dist/components/icons/Clear.js.map +0 -1
  602. package/dist/components/icons/Close.d.ts +0 -7
  603. package/dist/components/icons/Close.js +0 -6
  604. package/dist/components/icons/Close.js.map +0 -1
  605. package/dist/components/icons/Code.d.ts +0 -6
  606. package/dist/components/icons/Code.js +0 -6
  607. package/dist/components/icons/Code.js.map +0 -1
  608. package/dist/components/icons/Copy.d.ts +0 -6
  609. package/dist/components/icons/Copy.js +0 -6
  610. package/dist/components/icons/Copy.js.map +0 -1
  611. package/dist/components/icons/DeepThought.d.ts +0 -6
  612. package/dist/components/icons/DeepThought.js +0 -6
  613. package/dist/components/icons/DeepThought.js.map +0 -1
  614. package/dist/components/icons/Delete.d.ts +0 -6
  615. package/dist/components/icons/Delete.js +0 -6
  616. package/dist/components/icons/Delete.js.map +0 -1
  617. package/dist/components/icons/Document.d.ts +0 -5
  618. package/dist/components/icons/Document.js +0 -10
  619. package/dist/components/icons/Document.js.map +0 -1
  620. package/dist/components/icons/Download.d.ts +0 -6
  621. package/dist/components/icons/Download.js +0 -6
  622. package/dist/components/icons/Download.js.map +0 -1
  623. package/dist/components/icons/Edit.d.ts +0 -6
  624. package/dist/components/icons/Edit.js +0 -6
  625. package/dist/components/icons/Edit.js.map +0 -1
  626. package/dist/components/icons/Expand.d.ts +0 -6
  627. package/dist/components/icons/Expand.js +0 -6
  628. package/dist/components/icons/Expand.js.map +0 -1
  629. package/dist/components/icons/Eye.d.ts +0 -6
  630. package/dist/components/icons/Eye.js +0 -6
  631. package/dist/components/icons/Eye.js.map +0 -1
  632. package/dist/components/icons/EyeInvisible.d.ts +0 -6
  633. package/dist/components/icons/EyeInvisible.js +0 -6
  634. package/dist/components/icons/EyeInvisible.js.map +0 -1
  635. package/dist/components/icons/Facebook.d.ts +0 -6
  636. package/dist/components/icons/Facebook.js +0 -6
  637. package/dist/components/icons/Facebook.js.map +0 -1
  638. package/dist/components/icons/Feedback.d.ts +0 -6
  639. package/dist/components/icons/Feedback.js +0 -6
  640. package/dist/components/icons/Feedback.js.map +0 -1
  641. package/dist/components/icons/File.d.ts +0 -6
  642. package/dist/components/icons/File.js +0 -6
  643. package/dist/components/icons/File.js.map +0 -1
  644. package/dist/components/icons/FileExcel.d.ts +0 -6
  645. package/dist/components/icons/FileExcel.js +0 -6
  646. package/dist/components/icons/FileExcel.js.map +0 -1
  647. package/dist/components/icons/FilePdf.d.ts +0 -6
  648. package/dist/components/icons/FilePdf.js +0 -6
  649. package/dist/components/icons/FilePdf.js.map +0 -1
  650. package/dist/components/icons/FileWord.d.ts +0 -6
  651. package/dist/components/icons/FileWord.js +0 -6
  652. package/dist/components/icons/FileWord.js.map +0 -1
  653. package/dist/components/icons/Fullscreen.d.ts +0 -6
  654. package/dist/components/icons/Fullscreen.js +0 -6
  655. package/dist/components/icons/Fullscreen.js.map +0 -1
  656. package/dist/components/icons/FullscreenExit.d.ts +0 -6
  657. package/dist/components/icons/FullscreenExit.js +0 -6
  658. package/dist/components/icons/FullscreenExit.js.map +0 -1
  659. package/dist/components/icons/Group.d.ts +0 -6
  660. package/dist/components/icons/Group.js +0 -6
  661. package/dist/components/icons/Group.js.map +0 -1
  662. package/dist/components/icons/History.d.ts +0 -7
  663. package/dist/components/icons/History.js +0 -6
  664. package/dist/components/icons/History.js.map +0 -1
  665. package/dist/components/icons/Image.d.ts +0 -4
  666. package/dist/components/icons/Image.js +0 -9
  667. package/dist/components/icons/Image.js.map +0 -1
  668. package/dist/components/icons/Info.d.ts +0 -6
  669. package/dist/components/icons/Info.js +0 -6
  670. package/dist/components/icons/Info.js.map +0 -1
  671. package/dist/components/icons/Link.d.ts +0 -6
  672. package/dist/components/icons/Link.js +0 -6
  673. package/dist/components/icons/Link.js.map +0 -1
  674. package/dist/components/icons/Linkedin.d.ts +0 -6
  675. package/dist/components/icons/Linkedin.js +0 -6
  676. package/dist/components/icons/Linkedin.js.map +0 -1
  677. package/dist/components/icons/Loading.d.ts +0 -7
  678. package/dist/components/icons/Loading.js +0 -10
  679. package/dist/components/icons/Loading.js.map +0 -1
  680. package/dist/components/icons/Logout.d.ts +0 -6
  681. package/dist/components/icons/Logout.js +0 -6
  682. package/dist/components/icons/Logout.js.map +0 -1
  683. package/dist/components/icons/Mail.d.ts +0 -6
  684. package/dist/components/icons/Mail.js +0 -6
  685. package/dist/components/icons/Mail.js.map +0 -1
  686. package/dist/components/icons/MapMarker.d.ts +0 -6
  687. package/dist/components/icons/MapMarker.js +0 -6
  688. package/dist/components/icons/MapMarker.js.map +0 -1
  689. package/dist/components/icons/MenuHorizontal.d.ts +0 -7
  690. package/dist/components/icons/MenuHorizontal.js +0 -6
  691. package/dist/components/icons/MenuHorizontal.js.map +0 -1
  692. package/dist/components/icons/MenuVertical.d.ts +0 -7
  693. package/dist/components/icons/MenuVertical.js +0 -6
  694. package/dist/components/icons/MenuVertical.js.map +0 -1
  695. package/dist/components/icons/Message.d.ts +0 -6
  696. package/dist/components/icons/Message.js +0 -6
  697. package/dist/components/icons/Message.js.map +0 -1
  698. package/dist/components/icons/Microphone.d.ts +0 -6
  699. package/dist/components/icons/Microphone.js +0 -6
  700. package/dist/components/icons/Microphone.js.map +0 -1
  701. package/dist/components/icons/Minus.d.ts +0 -6
  702. package/dist/components/icons/Minus.js +0 -6
  703. package/dist/components/icons/Minus.js.map +0 -1
  704. package/dist/components/icons/MinusCircle.d.ts +0 -6
  705. package/dist/components/icons/MinusCircle.js +0 -6
  706. package/dist/components/icons/MinusCircle.js.map +0 -1
  707. package/dist/components/icons/PaperClip.d.ts +0 -6
  708. package/dist/components/icons/PaperClip.js +0 -6
  709. package/dist/components/icons/PaperClip.js.map +0 -1
  710. package/dist/components/icons/Picture.d.ts +0 -6
  711. package/dist/components/icons/Picture.js +0 -6
  712. package/dist/components/icons/Picture.js.map +0 -1
  713. package/dist/components/icons/Plus.d.ts +0 -6
  714. package/dist/components/icons/Plus.js +0 -6
  715. package/dist/components/icons/Plus.js.map +0 -1
  716. package/dist/components/icons/Preview.d.ts +0 -4
  717. package/dist/components/icons/Preview.js +0 -9
  718. package/dist/components/icons/Preview.js.map +0 -1
  719. package/dist/components/icons/Print.d.ts +0 -6
  720. package/dist/components/icons/Print.js +0 -6
  721. package/dist/components/icons/Print.js.map +0 -1
  722. package/dist/components/icons/QuestionHelp.d.ts +0 -6
  723. package/dist/components/icons/QuestionHelp.js +0 -6
  724. package/dist/components/icons/QuestionHelp.js.map +0 -1
  725. package/dist/components/icons/Refresh.d.ts +0 -6
  726. package/dist/components/icons/Refresh.js +0 -6
  727. package/dist/components/icons/Refresh.js.map +0 -1
  728. package/dist/components/icons/SelectIcon.d.ts +0 -6
  729. package/dist/components/icons/SelectIcon.js +0 -6
  730. package/dist/components/icons/SelectIcon.js.map +0 -1
  731. package/dist/components/icons/Send.d.ts +0 -6
  732. package/dist/components/icons/Send.js +0 -6
  733. package/dist/components/icons/Send.js.map +0 -1
  734. package/dist/components/icons/Setting.d.ts +0 -6
  735. package/dist/components/icons/Setting.js +0 -6
  736. package/dist/components/icons/Setting.js.map +0 -1
  737. package/dist/components/icons/Share.d.ts +0 -6
  738. package/dist/components/icons/Share.js +0 -6
  739. package/dist/components/icons/Share.js.map +0 -1
  740. package/dist/components/icons/Sound.d.ts +0 -6
  741. package/dist/components/icons/Sound.js +0 -6
  742. package/dist/components/icons/Sound.js.map +0 -1
  743. package/dist/components/icons/SoundDeactivated.d.ts +0 -6
  744. package/dist/components/icons/SoundDeactivated.js +0 -6
  745. package/dist/components/icons/SoundDeactivated.js.map +0 -1
  746. package/dist/components/icons/Telegram.d.ts +0 -6
  747. package/dist/components/icons/Telegram.js +0 -6
  748. package/dist/components/icons/Telegram.js.map +0 -1
  749. package/dist/components/icons/ThumbDown.d.ts +0 -6
  750. package/dist/components/icons/ThumbDown.js +0 -6
  751. package/dist/components/icons/ThumbDown.js.map +0 -1
  752. package/dist/components/icons/ThumbUp.d.ts +0 -6
  753. package/dist/components/icons/ThumbUp.js +0 -6
  754. package/dist/components/icons/ThumbUp.js.map +0 -1
  755. package/dist/components/icons/Translation.d.ts +0 -6
  756. package/dist/components/icons/Translation.js +0 -6
  757. package/dist/components/icons/Translation.js.map +0 -1
  758. package/dist/components/icons/Twitter.d.ts +0 -6
  759. package/dist/components/icons/Twitter.js +0 -6
  760. package/dist/components/icons/Twitter.js.map +0 -1
  761. package/dist/components/icons/Upload.d.ts +0 -4
  762. package/dist/components/icons/Upload.js +0 -9
  763. package/dist/components/icons/Upload.js.map +0 -1
  764. package/dist/components/icons/User.d.ts +0 -6
  765. package/dist/components/icons/User.js +0 -6
  766. package/dist/components/icons/User.js.map +0 -1
  767. package/dist/components/icons/Warning.d.ts +0 -6
  768. package/dist/components/icons/Warning.js +0 -6
  769. package/dist/components/icons/Warning.js.map +0 -1
  770. package/dist/components/icons/WhatsApp.d.ts +0 -6
  771. package/dist/components/icons/WhatsApp.js +0 -6
  772. package/dist/components/icons/WhatsApp.js.map +0 -1
  773. package/dist/components/icons/loading.css +0 -14
  774. package/dist/components/layouts/WebsiteAssistant.d.ts +0 -4
  775. package/dist/components/layouts/WebsiteAssistant.js +0 -38
  776. package/dist/components/layouts/WebsiteAssistant.js.map +0 -1
  777. package/dist/components/layouts/website-assistant.css +0 -676
  778. package/dist/components/ui/Alert.css +0 -93
  779. package/dist/components/ui/Alert.d.ts +0 -18
  780. package/dist/components/ui/Alert.js +0 -42
  781. package/dist/components/ui/Alert.js.map +0 -1
  782. package/dist/components/ui/Button.css +0 -167
  783. package/dist/components/ui/Button.d.ts +0 -27
  784. package/dist/components/ui/Button.js +0 -23
  785. package/dist/components/ui/Button.js.map +0 -1
  786. package/dist/components/ui/Card.css +0 -65
  787. package/dist/components/ui/Card.d.ts +0 -13
  788. package/dist/components/ui/Card.js +0 -14
  789. package/dist/components/ui/Card.js.map +0 -1
  790. package/dist/components/ui/Checkbox.css +0 -116
  791. package/dist/components/ui/Checkbox.d.ts +0 -11
  792. package/dist/components/ui/Checkbox.js +0 -20
  793. package/dist/components/ui/Checkbox.js.map +0 -1
  794. package/dist/components/ui/ConfirmDialog.css +0 -42
  795. package/dist/components/ui/ConfirmDialog.d.ts +0 -11
  796. package/dist/components/ui/ConfirmDialog.js +0 -12
  797. package/dist/components/ui/ConfirmDialog.js.map +0 -1
  798. package/dist/components/ui/Details.css +0 -66
  799. package/dist/components/ui/Drawer.css +0 -270
  800. package/dist/components/ui/Drawer.d.ts +0 -46
  801. package/dist/components/ui/Drawer.js +0 -60
  802. package/dist/components/ui/Drawer.js.map +0 -1
  803. package/dist/components/ui/Dropdown.css +0 -173
  804. package/dist/components/ui/Dropdown.d.ts +0 -11
  805. package/dist/components/ui/Dropdown.js +0 -33
  806. package/dist/components/ui/Dropdown.js.map +0 -1
  807. package/dist/components/ui/Expandable.css +0 -15
  808. package/dist/components/ui/Expandable.d.ts +0 -15
  809. package/dist/components/ui/Expandable.js +0 -59
  810. package/dist/components/ui/Expandable.js.map +0 -1
  811. package/dist/components/ui/Modal.css +0 -98
  812. package/dist/components/ui/Modal.d.ts +0 -16
  813. package/dist/components/ui/Modal.js +0 -24
  814. package/dist/components/ui/Modal.js.map +0 -1
  815. package/dist/components/ui/Select.css +0 -138
  816. package/dist/components/ui/Select.d.ts +0 -17
  817. package/dist/components/ui/Select.js +0 -17
  818. package/dist/components/ui/Select.js.map +0 -1
  819. package/dist/components/ui/Slider.css +0 -192
  820. package/dist/components/ui/Slider.d.ts +0 -12
  821. package/dist/components/ui/Slider.js +0 -78
  822. package/dist/components/ui/Slider.js.map +0 -1
  823. package/dist/components/ui/Spin.css +0 -31
  824. package/dist/components/ui/Spin.d.ts +0 -9
  825. package/dist/components/ui/Spin.js +0 -12
  826. package/dist/components/ui/Spin.js.map +0 -1
  827. package/dist/components/ui/Table.css +0 -132
  828. package/dist/components/ui/Tooltip.css +0 -171
  829. package/dist/components/ui/Tooltip.d.ts +0 -11
  830. package/dist/components/ui/Tooltip.js +0 -90
  831. package/dist/components/ui/Tooltip.js.map +0 -1
  832. package/esm/components/PositionDrawer/PositionDrawer.d.ts +0 -12
  833. package/esm/components/PositionDrawer/PositionDrawer.js +0 -14
  834. package/esm/components/PositionDrawer/PositionDrawer.js.map +0 -1
  835. package/esm/components/icons/AI.d.ts +0 -6
  836. package/esm/components/icons/AI.js +0 -4
  837. package/esm/components/icons/AI.js.map +0 -1
  838. package/esm/components/icons/Alert.d.ts +0 -6
  839. package/esm/components/icons/Alert.js +0 -4
  840. package/esm/components/icons/Alert.js.map +0 -1
  841. package/esm/components/icons/ArrowUp.d.ts +0 -6
  842. package/esm/components/icons/ArrowUp.js +0 -4
  843. package/esm/components/icons/ArrowUp.js.map +0 -1
  844. package/esm/components/icons/Bug.d.ts +0 -6
  845. package/esm/components/icons/Bug.js +0 -4
  846. package/esm/components/icons/Bug.js.map +0 -1
  847. package/esm/components/icons/Chat.d.ts +0 -6
  848. package/esm/components/icons/Chat.js +0 -4
  849. package/esm/components/icons/Chat.js.map +0 -1
  850. package/esm/components/icons/ChevronDown.d.ts +0 -6
  851. package/esm/components/icons/ChevronDown.js +0 -4
  852. package/esm/components/icons/ChevronDown.js.map +0 -1
  853. package/esm/components/icons/ChevronLeft.d.ts +0 -6
  854. package/esm/components/icons/ChevronLeft.js +0 -4
  855. package/esm/components/icons/ChevronLeft.js.map +0 -1
  856. package/esm/components/icons/ChevronRight.d.ts +0 -6
  857. package/esm/components/icons/ChevronRight.js +0 -4
  858. package/esm/components/icons/ChevronRight.js.map +0 -1
  859. package/esm/components/icons/ChevronUp.d.ts +0 -6
  860. package/esm/components/icons/ChevronUp.js +0 -4
  861. package/esm/components/icons/ChevronUp.js.map +0 -1
  862. package/esm/components/icons/Clear.d.ts +0 -6
  863. package/esm/components/icons/Clear.js +0 -4
  864. package/esm/components/icons/Clear.js.map +0 -1
  865. package/esm/components/icons/Close.d.ts +0 -7
  866. package/esm/components/icons/Close.js +0 -4
  867. package/esm/components/icons/Close.js.map +0 -1
  868. package/esm/components/icons/Code.d.ts +0 -6
  869. package/esm/components/icons/Code.js +0 -4
  870. package/esm/components/icons/Code.js.map +0 -1
  871. package/esm/components/icons/Copy.d.ts +0 -6
  872. package/esm/components/icons/Copy.js +0 -4
  873. package/esm/components/icons/Copy.js.map +0 -1
  874. package/esm/components/icons/DeepThought.d.ts +0 -6
  875. package/esm/components/icons/DeepThought.js +0 -4
  876. package/esm/components/icons/DeepThought.js.map +0 -1
  877. package/esm/components/icons/Delete.d.ts +0 -6
  878. package/esm/components/icons/Delete.js +0 -4
  879. package/esm/components/icons/Delete.js.map +0 -1
  880. package/esm/components/icons/Document.d.ts +0 -5
  881. package/esm/components/icons/Document.js +0 -6
  882. package/esm/components/icons/Document.js.map +0 -1
  883. package/esm/components/icons/Download.d.ts +0 -6
  884. package/esm/components/icons/Download.js +0 -4
  885. package/esm/components/icons/Download.js.map +0 -1
  886. package/esm/components/icons/Edit.d.ts +0 -6
  887. package/esm/components/icons/Edit.js +0 -4
  888. package/esm/components/icons/Edit.js.map +0 -1
  889. package/esm/components/icons/Expand.d.ts +0 -6
  890. package/esm/components/icons/Expand.js +0 -4
  891. package/esm/components/icons/Expand.js.map +0 -1
  892. package/esm/components/icons/Eye.d.ts +0 -6
  893. package/esm/components/icons/Eye.js +0 -4
  894. package/esm/components/icons/Eye.js.map +0 -1
  895. package/esm/components/icons/EyeInvisible.d.ts +0 -6
  896. package/esm/components/icons/EyeInvisible.js +0 -4
  897. package/esm/components/icons/EyeInvisible.js.map +0 -1
  898. package/esm/components/icons/Facebook.d.ts +0 -6
  899. package/esm/components/icons/Facebook.js +0 -4
  900. package/esm/components/icons/Facebook.js.map +0 -1
  901. package/esm/components/icons/Feedback.d.ts +0 -6
  902. package/esm/components/icons/Feedback.js +0 -4
  903. package/esm/components/icons/Feedback.js.map +0 -1
  904. package/esm/components/icons/File.d.ts +0 -6
  905. package/esm/components/icons/File.js +0 -4
  906. package/esm/components/icons/File.js.map +0 -1
  907. package/esm/components/icons/FileExcel.d.ts +0 -6
  908. package/esm/components/icons/FileExcel.js +0 -4
  909. package/esm/components/icons/FileExcel.js.map +0 -1
  910. package/esm/components/icons/FilePdf.d.ts +0 -6
  911. package/esm/components/icons/FilePdf.js +0 -4
  912. package/esm/components/icons/FilePdf.js.map +0 -1
  913. package/esm/components/icons/FileWord.d.ts +0 -6
  914. package/esm/components/icons/FileWord.js +0 -4
  915. package/esm/components/icons/FileWord.js.map +0 -1
  916. package/esm/components/icons/Fullscreen.d.ts +0 -6
  917. package/esm/components/icons/Fullscreen.js +0 -4
  918. package/esm/components/icons/Fullscreen.js.map +0 -1
  919. package/esm/components/icons/FullscreenExit.d.ts +0 -6
  920. package/esm/components/icons/FullscreenExit.js +0 -4
  921. package/esm/components/icons/FullscreenExit.js.map +0 -1
  922. package/esm/components/icons/Group.d.ts +0 -6
  923. package/esm/components/icons/Group.js +0 -4
  924. package/esm/components/icons/Group.js.map +0 -1
  925. package/esm/components/icons/History.d.ts +0 -7
  926. package/esm/components/icons/History.js +0 -4
  927. package/esm/components/icons/History.js.map +0 -1
  928. package/esm/components/icons/Image.d.ts +0 -4
  929. package/esm/components/icons/Image.js +0 -5
  930. package/esm/components/icons/Image.js.map +0 -1
  931. package/esm/components/icons/Info.d.ts +0 -6
  932. package/esm/components/icons/Info.js +0 -4
  933. package/esm/components/icons/Info.js.map +0 -1
  934. package/esm/components/icons/Link.d.ts +0 -6
  935. package/esm/components/icons/Link.js +0 -4
  936. package/esm/components/icons/Link.js.map +0 -1
  937. package/esm/components/icons/Linkedin.d.ts +0 -6
  938. package/esm/components/icons/Linkedin.js +0 -4
  939. package/esm/components/icons/Linkedin.js.map +0 -1
  940. package/esm/components/icons/Loading.d.ts +0 -7
  941. package/esm/components/icons/Loading.js +0 -7
  942. package/esm/components/icons/Loading.js.map +0 -1
  943. package/esm/components/icons/Logout.d.ts +0 -6
  944. package/esm/components/icons/Logout.js +0 -4
  945. package/esm/components/icons/Logout.js.map +0 -1
  946. package/esm/components/icons/Mail.d.ts +0 -6
  947. package/esm/components/icons/Mail.js +0 -4
  948. package/esm/components/icons/Mail.js.map +0 -1
  949. package/esm/components/icons/MapMarker.d.ts +0 -6
  950. package/esm/components/icons/MapMarker.js +0 -4
  951. package/esm/components/icons/MapMarker.js.map +0 -1
  952. package/esm/components/icons/MenuHorizontal.d.ts +0 -7
  953. package/esm/components/icons/MenuHorizontal.js +0 -4
  954. package/esm/components/icons/MenuHorizontal.js.map +0 -1
  955. package/esm/components/icons/MenuVertical.d.ts +0 -7
  956. package/esm/components/icons/MenuVertical.js +0 -4
  957. package/esm/components/icons/MenuVertical.js.map +0 -1
  958. package/esm/components/icons/Message.d.ts +0 -6
  959. package/esm/components/icons/Message.js +0 -4
  960. package/esm/components/icons/Message.js.map +0 -1
  961. package/esm/components/icons/Microphone.d.ts +0 -6
  962. package/esm/components/icons/Microphone.js +0 -4
  963. package/esm/components/icons/Microphone.js.map +0 -1
  964. package/esm/components/icons/Minus.d.ts +0 -6
  965. package/esm/components/icons/Minus.js +0 -4
  966. package/esm/components/icons/Minus.js.map +0 -1
  967. package/esm/components/icons/MinusCircle.d.ts +0 -6
  968. package/esm/components/icons/MinusCircle.js +0 -4
  969. package/esm/components/icons/MinusCircle.js.map +0 -1
  970. package/esm/components/icons/PaperClip.d.ts +0 -6
  971. package/esm/components/icons/PaperClip.js +0 -4
  972. package/esm/components/icons/PaperClip.js.map +0 -1
  973. package/esm/components/icons/Picture.d.ts +0 -6
  974. package/esm/components/icons/Picture.js +0 -4
  975. package/esm/components/icons/Picture.js.map +0 -1
  976. package/esm/components/icons/Plus.d.ts +0 -6
  977. package/esm/components/icons/Plus.js +0 -4
  978. package/esm/components/icons/Plus.js.map +0 -1
  979. package/esm/components/icons/Preview.d.ts +0 -4
  980. package/esm/components/icons/Preview.js +0 -5
  981. package/esm/components/icons/Preview.js.map +0 -1
  982. package/esm/components/icons/Print.d.ts +0 -6
  983. package/esm/components/icons/Print.js +0 -4
  984. package/esm/components/icons/Print.js.map +0 -1
  985. package/esm/components/icons/QuestionHelp.d.ts +0 -6
  986. package/esm/components/icons/QuestionHelp.js +0 -4
  987. package/esm/components/icons/QuestionHelp.js.map +0 -1
  988. package/esm/components/icons/Refresh.d.ts +0 -6
  989. package/esm/components/icons/Refresh.js +0 -4
  990. package/esm/components/icons/Refresh.js.map +0 -1
  991. package/esm/components/icons/SelectIcon.d.ts +0 -6
  992. package/esm/components/icons/SelectIcon.js +0 -4
  993. package/esm/components/icons/SelectIcon.js.map +0 -1
  994. package/esm/components/icons/Send.d.ts +0 -6
  995. package/esm/components/icons/Send.js +0 -4
  996. package/esm/components/icons/Send.js.map +0 -1
  997. package/esm/components/icons/Setting.d.ts +0 -6
  998. package/esm/components/icons/Setting.js +0 -4
  999. package/esm/components/icons/Setting.js.map +0 -1
  1000. package/esm/components/icons/Share.d.ts +0 -6
  1001. package/esm/components/icons/Share.js +0 -4
  1002. package/esm/components/icons/Share.js.map +0 -1
  1003. package/esm/components/icons/Sound.d.ts +0 -6
  1004. package/esm/components/icons/Sound.js +0 -4
  1005. package/esm/components/icons/Sound.js.map +0 -1
  1006. package/esm/components/icons/SoundDeactivated.d.ts +0 -6
  1007. package/esm/components/icons/SoundDeactivated.js +0 -4
  1008. package/esm/components/icons/SoundDeactivated.js.map +0 -1
  1009. package/esm/components/icons/Telegram.d.ts +0 -6
  1010. package/esm/components/icons/Telegram.js +0 -4
  1011. package/esm/components/icons/Telegram.js.map +0 -1
  1012. package/esm/components/icons/ThumbDown.d.ts +0 -6
  1013. package/esm/components/icons/ThumbDown.js +0 -4
  1014. package/esm/components/icons/ThumbDown.js.map +0 -1
  1015. package/esm/components/icons/ThumbUp.d.ts +0 -6
  1016. package/esm/components/icons/ThumbUp.js +0 -4
  1017. package/esm/components/icons/ThumbUp.js.map +0 -1
  1018. package/esm/components/icons/Translation.d.ts +0 -6
  1019. package/esm/components/icons/Translation.js +0 -4
  1020. package/esm/components/icons/Translation.js.map +0 -1
  1021. package/esm/components/icons/Twitter.d.ts +0 -6
  1022. package/esm/components/icons/Twitter.js +0 -4
  1023. package/esm/components/icons/Twitter.js.map +0 -1
  1024. package/esm/components/icons/Upload.d.ts +0 -4
  1025. package/esm/components/icons/Upload.js +0 -5
  1026. package/esm/components/icons/Upload.js.map +0 -1
  1027. package/esm/components/icons/User.d.ts +0 -6
  1028. package/esm/components/icons/User.js +0 -4
  1029. package/esm/components/icons/User.js.map +0 -1
  1030. package/esm/components/icons/Warning.d.ts +0 -6
  1031. package/esm/components/icons/Warning.js +0 -4
  1032. package/esm/components/icons/Warning.js.map +0 -1
  1033. package/esm/components/icons/WhatsApp.d.ts +0 -6
  1034. package/esm/components/icons/WhatsApp.js +0 -4
  1035. package/esm/components/icons/WhatsApp.js.map +0 -1
  1036. package/esm/components/icons/loading.css +0 -14
  1037. package/esm/components/layouts/WebsiteAssistant.d.ts +0 -4
  1038. package/esm/components/layouts/WebsiteAssistant.js +0 -35
  1039. package/esm/components/layouts/WebsiteAssistant.js.map +0 -1
  1040. package/esm/components/layouts/website-assistant.css +0 -676
  1041. package/esm/components/ui/Alert.css +0 -93
  1042. package/esm/components/ui/Alert.d.ts +0 -18
  1043. package/esm/components/ui/Alert.js +0 -39
  1044. package/esm/components/ui/Alert.js.map +0 -1
  1045. package/esm/components/ui/Button.css +0 -167
  1046. package/esm/components/ui/Button.d.ts +0 -27
  1047. package/esm/components/ui/Button.js +0 -20
  1048. package/esm/components/ui/Button.js.map +0 -1
  1049. package/esm/components/ui/Card.css +0 -65
  1050. package/esm/components/ui/Card.d.ts +0 -13
  1051. package/esm/components/ui/Card.js +0 -11
  1052. package/esm/components/ui/Card.js.map +0 -1
  1053. package/esm/components/ui/Checkbox.css +0 -116
  1054. package/esm/components/ui/Checkbox.d.ts +0 -11
  1055. package/esm/components/ui/Checkbox.js +0 -17
  1056. package/esm/components/ui/Checkbox.js.map +0 -1
  1057. package/esm/components/ui/ConfirmDialog.css +0 -42
  1058. package/esm/components/ui/ConfirmDialog.d.ts +0 -11
  1059. package/esm/components/ui/ConfirmDialog.js +0 -9
  1060. package/esm/components/ui/ConfirmDialog.js.map +0 -1
  1061. package/esm/components/ui/Details.css +0 -66
  1062. package/esm/components/ui/Drawer.css +0 -270
  1063. package/esm/components/ui/Drawer.d.ts +0 -46
  1064. package/esm/components/ui/Drawer.js +0 -57
  1065. package/esm/components/ui/Drawer.js.map +0 -1
  1066. package/esm/components/ui/Dropdown.css +0 -173
  1067. package/esm/components/ui/Dropdown.d.ts +0 -11
  1068. package/esm/components/ui/Dropdown.js +0 -30
  1069. package/esm/components/ui/Dropdown.js.map +0 -1
  1070. package/esm/components/ui/Expandable.css +0 -15
  1071. package/esm/components/ui/Expandable.d.ts +0 -15
  1072. package/esm/components/ui/Expandable.js +0 -56
  1073. package/esm/components/ui/Expandable.js.map +0 -1
  1074. package/esm/components/ui/Modal.css +0 -98
  1075. package/esm/components/ui/Modal.d.ts +0 -16
  1076. package/esm/components/ui/Modal.js +0 -21
  1077. package/esm/components/ui/Modal.js.map +0 -1
  1078. package/esm/components/ui/Select.css +0 -138
  1079. package/esm/components/ui/Select.d.ts +0 -17
  1080. package/esm/components/ui/Select.js +0 -14
  1081. package/esm/components/ui/Select.js.map +0 -1
  1082. package/esm/components/ui/Slider.css +0 -192
  1083. package/esm/components/ui/Slider.d.ts +0 -12
  1084. package/esm/components/ui/Slider.js +0 -75
  1085. package/esm/components/ui/Slider.js.map +0 -1
  1086. package/esm/components/ui/Spin.css +0 -31
  1087. package/esm/components/ui/Spin.d.ts +0 -9
  1088. package/esm/components/ui/Spin.js +0 -9
  1089. package/esm/components/ui/Spin.js.map +0 -1
  1090. package/esm/components/ui/Table.css +0 -132
  1091. package/esm/components/ui/Tooltip.css +0 -171
  1092. package/esm/components/ui/Tooltip.d.ts +0 -11
  1093. package/esm/components/ui/Tooltip.js +0 -87
  1094. package/esm/components/ui/Tooltip.js.map +0 -1
@@ -24,6 +24,7 @@ import type {
24
24
  PiiDetectionConfig,
25
25
  } from '../../types/layout';
26
26
  import { checkPii } from '../../helpers/piiDetection'; // PII check when integrationConfig.layout has piiDetection.enabled
27
+ import { shouldRestartSessionOnPositionPopoverClose } from '../../helpers/positionPopover';
27
28
 
28
29
  // Libraries
29
30
  import React, {
@@ -39,7 +40,13 @@ import memoriApiClient from '@memori.ai/memori-api-client';
39
40
  import { IAudioContext } from 'standardized-audio-context';
40
41
  import cx from 'classnames';
41
42
  import { DateTime } from 'luxon';
42
- import { useAlertManager, createAlertOptions } from '@memori.ai/ui';
43
+ import {
44
+ useAlertManager,
45
+ createAlertOptions,
46
+ MemoriUIProvider,
47
+ AlertViewport,
48
+ } from '@memori.ai/ui';
49
+ import { WidgetSurfaceProvider } from '../../context/widgetSurfaceContext';
43
50
 
44
51
  // Components
45
52
  import MemoriAuth from '../Auth/Auth';
@@ -77,6 +84,10 @@ import {
77
84
  installMathJax,
78
85
  } from '../../helpers/utils';
79
86
  import { getTTSVoice } from '../../helpers/tts/ttsVoiceUtility';
87
+ import {
88
+ getMuteSpeakerFallback,
89
+ shouldPlayTtsAudio,
90
+ } from '../../helpers/tts/muteSpeaker';
80
91
  import {
81
92
  allowedMediaTypes,
82
93
  anonTag,
@@ -88,6 +99,16 @@ import { sanitizeText } from '../../helpers/sanitizer';
88
99
  import { TTSConfig, useTTS } from '../../helpers/tts/useTTS';
89
100
  import ChatHistoryDrawer from '../ChatHistoryDrawer/ChatHistory';
90
101
  import { STTConfig, useSTT } from '../../helpers/stt/useSTT';
102
+ import { useNats } from '../../helpers/nats/useNats';
103
+ import {
104
+ NatsProgressEvent,
105
+ NatsDialogResponseEvent,
106
+ NatsErrorEvent,
107
+ } from '../../helpers/nats/useNatsSession';
108
+ import {
109
+ isSessionExpiredNatsError,
110
+ isSessionExpiredNatsResponse,
111
+ } from '../../helpers/nats/isSessionExpiredError';
91
112
 
92
113
  // Widget utilities and helpers
93
114
  const getMemoriState = (integrationId?: string): object | null => {
@@ -118,7 +139,21 @@ const getMemoriState = (integrationId?: string): object | null => {
118
139
  };
119
140
  };
120
141
 
121
- /** Place spec with all nulls for postTextEnteredEvent when position is not set or user chose "I don't want to provide my position". */
142
+ /** Unified login token resolution: React state > ref > call-site override > props. */
143
+ const resolveLoginTokenValue = (
144
+ loginToken: string | undefined,
145
+ userTokenRef: string | undefined,
146
+ callAdditionalInfoLoginToken: string | undefined,
147
+ additionalInfoLoginToken: string | undefined,
148
+ authTokenProp: string | undefined
149
+ ): string | undefined =>
150
+ loginToken ??
151
+ userTokenRef ??
152
+ callAdditionalInfoLoginToken ??
153
+ additionalInfoLoginToken ??
154
+ authTokenProp;
155
+
156
+ /** Place spec with all nulls for postEnterTextAsync when position is not set or user chose "I don't want to provide my position". */
122
157
  const NULL_PLACE_SPEC = {
123
158
  placeName: null,
124
159
  latitude: null,
@@ -126,6 +161,18 @@ const NULL_PLACE_SPEC = {
126
161
  uncertaintyKm: null,
127
162
  } as const;
128
163
 
164
+ const logWidgetError = (context: string, detail?: unknown) => {
165
+ console.error(`[MemoriWidget] ${context}`, detail ?? '');
166
+ };
167
+
168
+ /** Reads correlation id from HTTP async response (supports camelCase / snake_case). */
169
+ function readCorrelationID(response: {
170
+ correlationID?: string;
171
+ }): string | undefined {
172
+ const value = response.correlationID;
173
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
174
+ }
175
+
129
176
  type MemoriTextEnteredEvent = CustomEvent<{
130
177
  text: string;
131
178
  waitForPrevious?: boolean;
@@ -359,7 +406,6 @@ window.typeBatchMessages = typeBatchMessages;
359
406
  let audioContext: IAudioContext;
360
407
 
361
408
  let memoriPassword: string | undefined;
362
- let userToken: string | undefined;
363
409
 
364
410
  export interface LayoutProps {
365
411
  Header?: typeof Header;
@@ -381,6 +427,9 @@ export interface LayoutProps {
381
427
  onSidebarToggle?: (isOpen: boolean) => void;
382
428
  /** When true or "true" (e.g. from integrationConfig or web component attribute), hide the 3D avatar. */
383
429
  avatar3dHidden?: boolean | string;
430
+ /** TOTEM only: max-width of the shared content axis (avatar + panel + status).
431
+ * Accepts a number (px) or a CSS length string; enables vertical-kiosk widths. */
432
+ totemContentMaxWidth?: number | string;
384
433
  }
385
434
 
386
435
  export interface Props {
@@ -474,20 +523,23 @@ export function getChatStyles(
474
523
 
475
524
  const primaryContent = config?.buttonTextColor ?? '#ffffff';
476
525
 
526
+ // Match @memori.ai/ui token semantics:
527
+ // --memori-surface-contrast = ink (#000 light / #fff dark)
528
+ // --memori-surface-contrast-inverse = surface (#fff light / #000 dark)
477
529
  return {
478
530
  '--memori-primary-color': primary,
479
531
  '--memori-primary': primary,
480
532
  '--memori-primary-content': primaryContent,
481
533
  '--memori-primary-hover':
482
- 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast-inverse, black) 15%)',
534
+ 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast, black) 15%)',
483
535
  '--memori-primary-active':
484
- 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast-inverse, black) 25%)',
536
+ 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast, black) 25%)',
485
537
  '--memori-primary-disabled':
486
538
  'color-mix(in oklch, var(--memori-primary), transparent 60%)',
487
539
  '--memori-primary-subtle':
488
- 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast, white) 60%)',
540
+ 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast-inverse, white) 60%)',
489
541
  '--memori-primary-subtle-hover':
490
- 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast, white) 50%)',
542
+ 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast-inverse, white) 50%)',
491
543
  '--memori-border-primary':
492
544
  'color-mix(in oklch, var(--memori-primary), transparent 70%)',
493
545
  '--memori-border-primary-hover':
@@ -498,9 +550,14 @@ export function getChatStyles(
498
550
  '--memori-shadow-primary':
499
551
  '0 8px 16px -4px color-mix(in oklch, var(--memori-primary), transparent 70%)',
500
552
  '--memori-skeleton-base':
501
- 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast, white) 85%)',
553
+ 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast-inverse, white) 85%)',
502
554
  '--memori-skeleton-highlight':
503
- 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast, white) 75%)',
555
+ 'color-mix(in oklch, var(--memori-primary), var(--memori-surface-contrast-inverse, white) 75%)',
556
+ /* Soft fills for secondary IconButton active / recording (never solid CTA) */
557
+ '--memori-icon-active-bg':
558
+ 'color-mix(in oklch, var(--memori-primary) 12%, transparent)',
559
+ '--memori-icon-recording-bg':
560
+ 'color-mix(in oklch, var(--memori-error, #dc2626) 12%, transparent)',
504
561
  } as CSSProperties;
505
562
  }
506
563
 
@@ -576,6 +633,7 @@ const MemoriWidget = ({
576
633
  const {
577
634
  initSession,
578
635
  deleteSession,
636
+ postEnterTextAsync,
579
637
  postTextEnteredEvent,
580
638
  postPlaceChangedEvent,
581
639
  postDateChangedEvent,
@@ -588,58 +646,98 @@ const MemoriWidget = ({
588
646
  const [instruct, setInstruct] = useState(false);
589
647
  const [enableFocusChatInput, setEnableFocusChatInput] = useState(true);
590
648
 
591
- const widgetRootRef = useRef<HTMLDivElement>(null);
592
- const [isDarkTheme, setIsDarkTheme] = useState(false);
593
- useEffect(() => {
594
- const el = widgetRootRef.current;
595
- if (!el) return;
596
- const check = () => {
597
- setIsDarkTheme(!!el.closest('[data-theme="dark"]'));
598
- };
599
- check();
600
- const observer = new MutationObserver(check);
601
- const parent = el.parentElement ?? document.body;
602
- observer.observe(parent, {
603
- attributes: true,
604
- attributeFilter: ['data-theme'],
605
- subtree: true,
606
- });
607
- return () => observer.disconnect();
608
- }, []);
609
-
649
+ // Capture the widget root via a callback ref so the value is non-null on
650
+ // the first render that matters (used as the `container` for portal-based
651
+ // UI primitives via `MemoriUIProvider`). `useRef` would not trigger a
652
+ // re-render and would leave the value `null` on the first pass.
653
+ const [widgetRootEl, setWidgetRootEl] = useState<HTMLDivElement | null>(null);
654
+ // Inner surface establishes `contain: layout` for Drawers/Modals. Kept separate
655
+ // from widgetRootEl so Floating UI menus can portal outside containment.
656
+ const [widgetSurfaceEl, setWidgetSurfaceEl] = useState<HTMLDivElement | null>(
657
+ null
658
+ );
610
659
  const [loginToken, setLoginToken] = useState<string | undefined>(
611
660
  additionalInfo?.loginToken ?? authToken
612
661
  );
662
+ const userTokenRef = useRef<string | undefined>(
663
+ additionalInfo?.loginToken ?? authToken
664
+ );
665
+ const prevPropsLoginTokenRef = useRef<string | undefined>(
666
+ additionalInfo?.loginToken ?? authToken
667
+ );
668
+
613
669
  const [user, setUser] = useState<User | undefined>({
614
670
  avatarURL: typeof userAvatar === 'string' ? userAvatar : undefined,
615
671
  } as User);
672
+
673
+ const resolveLoginToken = useCallback(
674
+ (callAdditionalInfoLoginToken?: string) =>
675
+ resolveLoginTokenValue(
676
+ loginToken,
677
+ userTokenRef.current,
678
+ callAdditionalInfoLoginToken,
679
+ additionalInfo?.loginToken,
680
+ authToken
681
+ ),
682
+ [loginToken, additionalInfo?.loginToken, authToken]
683
+ );
684
+
685
+ // Sync loginToken when props change (including explicit removal from parent)
616
686
  useEffect(() => {
617
- if (
618
- loginToken &&
619
- !user?.userID &&
620
- (showLogin || memori.requireLoginToken)
621
- ) {
622
- client.backend
623
- .pwlGetCurrentUser(loginToken)
624
- .then(({ user, resultCode }) => {
625
- if (user && resultCode === 0) {
626
- setUser(user);
627
- setLocalConfig('loginToken', loginToken);
628
-
629
- if (!birthDate && user.birthDate) {
630
- setBirthDate(user.birthDate);
631
- setLocalConfig('birthDate', user.birthDate);
632
- }
633
- } else {
634
- removeLocalConfig('loginToken');
635
- }
636
- });
687
+ const incomingToken = additionalInfo?.loginToken ?? authToken;
688
+ const prevPropsToken = prevPropsLoginTokenRef.current;
689
+ prevPropsLoginTokenRef.current = incomingToken;
690
+
691
+ if (incomingToken !== prevPropsToken) {
692
+ setLoginToken(incomingToken);
693
+ userTokenRef.current = incomingToken;
694
+ if (!incomingToken) {
695
+ removeLocalConfig('loginToken');
696
+ setUser(undefined);
697
+ }
698
+ }
699
+ }, [additionalInfo?.loginToken, authToken]);
700
+
701
+ useEffect(() => {
702
+ if (!loginToken || !(showLogin || memori.requireLoginToken)) {
703
+ return;
637
704
  }
638
- }, [loginToken, user?.userID]);
705
+
706
+ let cancelled = false;
707
+
708
+ client.backend
709
+ .pwlGetCurrentUser(loginToken)
710
+ .then(({ user: fetchedUser, resultCode }) => {
711
+ if (cancelled) return;
712
+
713
+ if (fetchedUser && resultCode === 0) {
714
+ setUser(fetchedUser);
715
+ setLocalConfig('loginToken', loginToken);
716
+ userTokenRef.current = loginToken;
717
+
718
+ if (!birthDate && fetchedUser.birthDate) {
719
+ setBirthDate(fetchedUser.birthDate);
720
+ setLocalConfig('birthDate', fetchedUser.birthDate);
721
+ }
722
+ } else {
723
+ setLoginToken(undefined);
724
+ userTokenRef.current = undefined;
725
+ setUser(undefined);
726
+ removeLocalConfig('loginToken');
727
+ }
728
+ });
729
+
730
+ return () => {
731
+ cancelled = true;
732
+ };
733
+ }, [loginToken, showLogin, memori.requireLoginToken]);
639
734
  const [showLoginDrawer, setShowLoginDrawer] = useState(false);
640
735
 
641
736
  const [clickedStart, setClickedStart] = useState(false);
642
737
  const [gotErrorInOpening, setGotErrorInOpening] = useState(false);
738
+ const sessionStartingRef = useRef(false);
739
+ const needsCredits = tenant?.billingDelegation;
740
+ const [hasEnoughCredits, setHasEnoughCredits] = useState<boolean>(true);
643
741
 
644
742
  const language =
645
743
  memori.culture?.split('-')?.[0]?.toUpperCase()! ||
@@ -701,7 +799,34 @@ const MemoriWidget = ({
701
799
  const [memoriTyping, setMemoriTyping] = useState<boolean>(false);
702
800
  const [typingText, setTypingText] = useState<string>();
703
801
 
704
- // Layout: prop can be string or object { name, piiDetection } (e.g. from integration customData when PII is enabled).
802
+ type EnterTextRetryParams = {
803
+ text?: string;
804
+ media?: Medium[];
805
+ translate?: boolean;
806
+ translatedText?: string;
807
+ hidden?: boolean;
808
+ typingText?: string;
809
+ useLoaderTextAsMsg?: boolean;
810
+ hasBatchQueued?: boolean;
811
+ expiredSessionID?: string;
812
+ continueFromChatLogID?: string;
813
+ };
814
+
815
+ type PendingEnterText = EnterTextRetryParams & {
816
+ msg?: string;
817
+ waitForResponse?: {
818
+ resolve: (event: NatsDialogResponseEvent) => void;
819
+ reject: (error: Error) => void;
820
+ timeoutId: ReturnType<typeof setTimeout>;
821
+ };
822
+ };
823
+ const pendingEnterTextRef = useRef<Map<string, PendingEnterText>>(new Map());
824
+ const bufferedNatsResponsesRef = useRef<Map<string, NatsDialogResponseEvent>>(
825
+ new Map()
826
+ );
827
+
828
+ // Layout: from prop (string only) or integrationConfig; when neither is set, default to FULLPAGE.
829
+ // PII detection is only from integrationConfig (customData.layout as object with piiDetection).
705
830
  const layoutName =
706
831
  typeof layout === 'string'
707
832
  ? layout
@@ -729,7 +854,7 @@ const MemoriWidget = ({
729
854
  return layoutName as LayoutName;
730
855
  }
731
856
  if (layoutName === 2 || layoutName === '2') return 'FULLPAGE';
732
- return 'DEFAULT';
857
+ return 'FULLPAGE';
733
858
  })();
734
859
  // PII: from layout prop when object with piiDetection, or from integrationConfig.layout
735
860
  const piiDetection: PiiDetectionConfig | undefined =
@@ -752,6 +877,8 @@ const MemoriWidget = ({
752
877
  useState(false);
753
878
  const [hasUserTypedMessage, setHasUserTypedMessage] = useState(false);
754
879
  const [positionPopoverOpen, setPositionPopoverOpenState] = useState(false);
880
+ const [autoStartPositionGeolocation, setAutoStartPositionGeolocation] =
881
+ useState(false);
755
882
  const [showSettingsDrawer, setShowSettingsDrawer] = useState(false);
756
883
  const [showChatHistoryDrawer, setShowChatHistoryDrawer] = useState(false);
757
884
  const [showKnownFactsDrawer, setShowKnownFactsDrawer] = useState(false);
@@ -818,7 +945,10 @@ const MemoriWidget = ({
818
945
 
819
946
  if (!additionalInfo?.loginToken && !authToken) {
820
947
  setLoginToken(getLocalConfig<typeof loginToken>('loginToken', undefined));
821
- userToken = getLocalConfig<typeof loginToken>('loginToken', undefined);
948
+ userTokenRef.current = getLocalConfig<typeof loginToken>(
949
+ 'loginToken',
950
+ undefined
951
+ );
822
952
 
823
953
  setBirthDate(getLocalConfig<string | undefined>('birthDate', undefined));
824
954
  }
@@ -893,7 +1023,7 @@ const MemoriWidget = ({
893
1023
  return Object.keys(place).length > 0 ? place : undefined;
894
1024
  }, []);
895
1025
 
896
- /** Place to send with postTextEnteredEvent: real place, nulls when no/declined position, or undefined when position not needed. */
1026
+ /** Place to send with postEnterTextAsync: real place, nulls when no/declined position, or undefined when position not needed. */
897
1027
  const getPlaceSpecForEnterText = useCallback(
898
1028
  (venue: Venue | undefined) => {
899
1029
  if (!memori.needsPosition) return undefined;
@@ -967,6 +1097,7 @@ const MemoriWidget = ({
967
1097
  * @param typingText Optional custom typing indicator text
968
1098
  * @param useLoaderTextAsMsg Whether to use the loader text as the message (default false)
969
1099
  * @param hasBatchQueued Whether there are more messages queued to be sent (default false)
1100
+ * @param skipHistoryPush Skip adding the user message to history (e.g. session-expired retry)
970
1101
  */
971
1102
  const sendMessage = async (
972
1103
  text: string,
@@ -977,7 +1108,8 @@ const MemoriWidget = ({
977
1108
  hidden: boolean = false,
978
1109
  typingText?: string,
979
1110
  useLoaderTextAsMsg = false,
980
- hasBatchQueued = false
1111
+ hasBatchQueued = false,
1112
+ skipHistoryPush = false
981
1113
  ) => {
982
1114
  // Get the session ID from params or global state
983
1115
  const sessionID =
@@ -1044,7 +1176,7 @@ const MemoriWidget = ({
1044
1176
  }
1045
1177
 
1046
1178
  // Add user message to chat history if not hidden
1047
- if (!hidden)
1179
+ if (!hidden && !skipHistoryPush)
1048
1180
  pushMessage({
1049
1181
  text: text,
1050
1182
  translatedText,
@@ -1055,27 +1187,12 @@ const MemoriWidget = ({
1055
1187
  : !!newSessionId,
1056
1188
  });
1057
1189
 
1058
- // Show typing indicator
1059
- setMemoriTyping(true);
1060
- setTypingText(typingText);
1061
-
1190
+ // Show typing indicator after the async enter-text request is accepted (HTTP 200).
1062
1191
  let gotError = false;
1063
1192
 
1064
1193
  try {
1065
- // Add chat reference link to the message if it exists
1066
- // if (chatLogID) {
1067
- // msg =
1068
- // msg +
1069
- // ' \n\n' +
1070
- // '<chat-reference session-id="' +
1071
- // sessionID +
1072
- // '" event-log-id="' +
1073
- // chatLogID +
1074
- // '"></chat-reference>';
1075
- // }
1076
-
1077
1194
  const placeSpec = getPlaceSpecForEnterText(position);
1078
- const { currentState, ...response } = await postTextEnteredEvent({
1195
+ const response = await postEnterTextAsync({
1079
1196
  sessionId: sessionID,
1080
1197
  text: msg,
1081
1198
  ...(memori.needsDateTime && {
@@ -1083,85 +1200,35 @@ const MemoriWidget = ({
1083
1200
  }),
1084
1201
  ...(placeSpec !== undefined && { place: placeSpec }),
1085
1202
  });
1086
- if (response.resultCode === 0 && currentState) {
1087
- setChatLogID(undefined);
1088
- const emission =
1089
- useLoaderTextAsMsg && typingText
1090
- ? typingText
1091
- : currentState.emission ?? currentDialogState?.emission;
1092
-
1093
- if (
1094
- userLang.toLowerCase() !== language.toLowerCase() &&
1095
- emission &&
1096
- isMultilanguageEnabled
1097
- ) {
1098
- currentState.emission = emission;
1099
-
1100
- translateDialogState(currentState, userLang, msg).then(ts => {
1101
- let text = ts.translatedEmission || ts.emission;
1102
- if (text && shouldPlayAudio(text)) {
1103
- handleSpeak(text);
1104
- }
1105
- });
1106
- } else {
1107
- setCurrentDialogState({
1108
- ...currentState,
1109
- emission,
1110
- });
1111
-
1112
- if (emission) {
1113
- pushMessage({
1114
- text: emission,
1115
- emitter: currentState.emitter,
1116
- media: currentState.emittedMedia ?? currentState.media,
1117
- llmUsage: (currentState as any).llmUsage,
1118
- fromUser: false,
1119
- questionAnswered: msg,
1120
- generatedByAI: !!currentState.completion,
1121
- contextVars: currentState.contextVars,
1122
- date: currentState.currentDate,
1123
- placeName: currentState.currentPlaceName,
1124
- placeLatitude: currentState.currentLatitude,
1125
- placeLongitude: currentState.currentLongitude,
1126
- placeUncertaintyKm: currentState.currentUncertaintyKm,
1127
- tag: currentState.currentTag,
1128
- memoryTags: currentState.memoryTags,
1129
- } as any);
1130
- if (emission && shouldPlayAudio(emission)) {
1131
- handleSpeak(emission);
1132
- }
1133
- }
1134
- }
1203
+ const correlationID = readCorrelationID(response);
1204
+ if (response.resultCode === 0 && correlationID) {
1205
+ registerPendingEnterText(correlationID, {
1206
+ msg,
1207
+ text,
1208
+ media,
1209
+ translate,
1210
+ translatedText,
1211
+ hidden,
1212
+ typingText,
1213
+ useLoaderTextAsMsg,
1214
+ hasBatchQueued,
1215
+ });
1216
+ setMemoriTyping(true);
1217
+ setTypingText(typingText);
1218
+ } else if (response.resultCode === 0) {
1219
+ logWidgetError('enter-text missing correlationID', response);
1135
1220
  } else if (response.resultCode === 404) {
1136
- // Handle expired session
1137
- // remove last sent message, will set it as initial
1138
- setHistory(h => [...h.slice(0, h.length - 1)]);
1139
-
1140
- reopenSession(
1141
- true,
1142
- memoriPwd || memori.secretToken,
1143
- memoriTokens,
1144
- undefined,
1145
- undefined,
1146
- {
1147
- LANG: userLang,
1148
- PATHNAME: window.location.pathname,
1149
- ROUTE: window.location.pathname?.split('/')?.pop() || '',
1150
- ...(initialContextVars || {}),
1151
- },
1152
- initialQuestion,
1153
- undefined,
1154
- undefined,
1155
- undefined,
1156
- undefined,
1157
- true // isSessionExpired
1158
- ).then(state => {
1159
- console.info('session timeout');
1160
- if (state?.sessionID) {
1161
- setTimeout(() => {
1162
- sendMessage(text, media, state?.sessionID);
1163
- }, 500);
1164
- }
1221
+ retryAfterExpiredSessionRef.current({
1222
+ text,
1223
+ media,
1224
+ translate,
1225
+ translatedText,
1226
+ hidden,
1227
+ typingText,
1228
+ useLoaderTextAsMsg,
1229
+ hasBatchQueued,
1230
+ expiredSessionID: sessionID,
1231
+ continueFromChatLogID: chatLogID,
1165
1232
  });
1166
1233
  } else if (response.resultCode === 500 && response.resultMessage) {
1167
1234
  setHistory(h => [
@@ -1176,22 +1243,15 @@ const MemoriWidget = ({
1176
1243
  },
1177
1244
  ]);
1178
1245
  } else {
1179
- console.warn('[SEND_MESSAGE]', response);
1180
1246
  return Promise.reject(response);
1181
1247
  }
1182
1248
  } catch (error) {
1183
- console.log('error', error);
1184
- console.error(error);
1185
1249
  gotError = true;
1250
+ logWidgetError('sendMessage failed', error);
1186
1251
 
1187
1252
  setTypingText(undefined);
1188
1253
  setMemoriTyping(false);
1189
1254
  }
1190
-
1191
- if (!hasBatchQueued) {
1192
- setTypingText(undefined);
1193
- setMemoriTyping(false);
1194
- }
1195
1255
  };
1196
1256
 
1197
1257
  /**
@@ -1204,12 +1264,6 @@ const MemoriWidget = ({
1204
1264
  msg?: string,
1205
1265
  avoidPushingMessage: boolean = false
1206
1266
  ) => {
1207
- // console.log('[TRANSLATE] Starting translation with params:', {
1208
- // state,
1209
- // userLang,
1210
- // msg
1211
- // });
1212
-
1213
1267
  const emission = state?.emission ?? currentDialogState?.emission;
1214
1268
 
1215
1269
  let translatedState = { ...state };
@@ -1222,7 +1276,6 @@ const MemoriWidget = ({
1222
1276
  !isMultilanguageEnabled ||
1223
1277
  avoidPushingMessage
1224
1278
  ) {
1225
- // console.log('[TRANSLATE] Skipping translation - using original emission');
1226
1279
  translatedState = { ...state, emission };
1227
1280
  if (emission) {
1228
1281
  translatedMsg = {
@@ -1244,12 +1297,10 @@ const MemoriWidget = ({
1244
1297
  }
1245
1298
  } else {
1246
1299
  try {
1247
- // console.log('[TRANSLATE] Translating emission');
1248
1300
  const t = await getTranslation(emission, userLang, language, baseUrl);
1249
1301
 
1250
1302
  // Handle hints translation if present
1251
1303
  if (state.hints && state.hints.length > 0) {
1252
- // console.log('[TRANSLATE] Translating hints');
1253
1304
  const translatedHints = await Promise.all(
1254
1305
  (state.hints ?? []).map(async hint => {
1255
1306
  const tHint = await getTranslation(
@@ -1281,7 +1332,6 @@ const MemoriWidget = ({
1281
1332
  }
1282
1333
 
1283
1334
  if (t.text.length > 0) {
1284
- // console.log('[TRANSLATE] Creating translated message');
1285
1335
  translatedMsg = {
1286
1336
  text: emission,
1287
1337
  translatedText: t.text,
@@ -1302,7 +1352,6 @@ const MemoriWidget = ({
1302
1352
  };
1303
1353
  }
1304
1354
  } catch (error) {
1305
- console.error('[TRANSLATE] Error during translation:', error);
1306
1355
  translatedState = { ...state, emission };
1307
1356
  translatedMsg = {
1308
1357
  text: emission,
@@ -1323,10 +1372,8 @@ const MemoriWidget = ({
1323
1372
  }
1324
1373
  }
1325
1374
 
1326
- // console.log('[TRANSLATE] Setting translated state and message');
1327
1375
  setCurrentDialogState(translatedState);
1328
1376
  if (!avoidPushingMessage && translatedMsg) {
1329
- // console.log('[TRANSLATE] Pushing translated message', translatedMsg);
1330
1377
  pushMessage(translatedMsg);
1331
1378
  }
1332
1379
 
@@ -1432,7 +1479,6 @@ const MemoriWidget = ({
1432
1479
  executableSnippets?.forEach(s => {
1433
1480
  try {
1434
1481
  setTimeout(() => {
1435
- console.log('snippet', s);
1436
1482
  // eslint-disable-next-line no-new-func
1437
1483
  new Function(s.content ?? '')();
1438
1484
 
@@ -1446,8 +1492,8 @@ const MemoriWidget = ({
1446
1492
  );
1447
1493
  }, 400);
1448
1494
  }, 1000);
1449
- } catch (e) {
1450
- console.warn(e);
1495
+ } catch {
1496
+ // ignore snippet execution errors
1451
1497
  }
1452
1498
  });
1453
1499
  };
@@ -1498,6 +1544,10 @@ const MemoriWidget = ({
1498
1544
  return;
1499
1545
  }
1500
1546
 
1547
+ if (!(await checkCredits({ notify: true }))) {
1548
+ return;
1549
+ }
1550
+
1501
1551
  setLoading(true);
1502
1552
 
1503
1553
  try {
@@ -1519,8 +1569,8 @@ const MemoriWidget = ({
1519
1569
  referral = (() => {
1520
1570
  return window.location.href;
1521
1571
  })();
1522
- } catch (err) {
1523
- console.debug(err);
1572
+ } catch {
1573
+ // ignore referral URL errors
1524
1574
  }
1525
1575
 
1526
1576
  // Initialize session with parameters
@@ -1531,12 +1581,7 @@ const MemoriWidget = ({
1531
1581
  pin: params.pin ?? personification?.pin,
1532
1582
  additionalInfo: {
1533
1583
  ...(params.additionalInfo || additionalInfo || {}),
1534
- loginToken:
1535
- userToken ??
1536
- loginToken ??
1537
- params.additionalInfo?.loginToken ??
1538
- additionalInfo?.loginToken ??
1539
- authToken,
1584
+ loginToken: resolveLoginToken(params.additionalInfo?.loginToken),
1540
1585
  language: (
1541
1586
  userLang ??
1542
1587
  memori.culture?.split('-')?.[0] ??
@@ -1582,7 +1627,7 @@ const MemoriWidget = ({
1582
1627
  setGotErrorInOpening(true);
1583
1628
  }
1584
1629
  // Handle authentication error
1585
- else if (session?.resultCode === 403) {
1630
+ else if (session?.resultCode === 403 && memori.privacyType !== 'PUBLIC') {
1586
1631
  setMemoriPwd(undefined);
1587
1632
  setAuthModalState('password');
1588
1633
  return session;
@@ -1607,11 +1652,10 @@ const MemoriWidget = ({
1607
1652
  duration: 0,
1608
1653
  })
1609
1654
  );
1610
- setGotErrorInOpening(true);
1611
1655
  return session;
1612
1656
  }
1613
1657
  } catch (err) {
1614
- console.error(err);
1658
+ logWidgetError('fetchSession failed', err);
1615
1659
  }
1616
1660
  };
1617
1661
 
@@ -1639,7 +1683,8 @@ const MemoriWidget = ({
1639
1683
  additionalInfoProp?: { [key: string]: string | undefined },
1640
1684
  continueFromChatLogID?: string,
1641
1685
  continueFromSessionID?: string,
1642
- isSessionExpired?: boolean
1686
+ isSessionExpired?: boolean,
1687
+ suppressHistoryUpdate?: boolean
1643
1688
  ) => {
1644
1689
  // Set loading state while reopening session
1645
1690
  setLoading(true);
@@ -1650,12 +1695,10 @@ const MemoriWidget = ({
1650
1695
  undefined
1651
1696
  );
1652
1697
  let userBirthDate = birthDate ?? storageBirthDate;
1653
- // console.log('[REOPEN_SESSION] Using birth date:', userBirthDate);
1654
1698
 
1655
1699
  try {
1656
1700
  // Show age verification if required and birth date not provided
1657
1701
  if (!userBirthDate && !!minAge) {
1658
- // console.log('[REOPEN_SESSION] Age verification required, showing modal');
1659
1702
  setShowAgeVerification(true);
1660
1703
  return;
1661
1704
  }
@@ -1669,24 +1712,26 @@ const MemoriWidget = ({
1669
1712
  !recoveryTokens &&
1670
1713
  !memoriTokens
1671
1714
  ) {
1672
- // console.log('[REOPEN_SESSION] Authentication required, showing modal');
1673
1715
  setAuthModalState('password');
1674
1716
  return;
1675
1717
  }
1676
1718
 
1719
+ if (!(await checkCredits({ notify: true }))) {
1720
+ setLoading(false);
1721
+ return null;
1722
+ }
1723
+
1677
1724
  // Get current URL as referral
1678
1725
  let referral;
1679
1726
  try {
1680
1727
  referral = (() => {
1681
1728
  return window.location.href;
1682
1729
  })();
1683
- // console.log('[REOPEN_SESSION] Got referral:', referral);
1684
- } catch (err) {
1685
- console.debug('[REOPEN_SESSION] Error getting referral:', err);
1730
+ } catch {
1731
+ // ignore referral URL errors
1686
1732
  }
1687
1733
 
1688
1734
  // Initialize session with provided parameters
1689
- // console.log('[REOPEN_SESSION] Initializing session...');
1690
1735
  const { sessionID, currentState, ...response } = await initSession({
1691
1736
  memoriID: memori.engineMemoriID ?? '',
1692
1737
  password: password || memoriPwd || memori.secretToken,
@@ -1705,12 +1750,7 @@ const MemoriWidget = ({
1705
1750
  birthDate: userBirthDate,
1706
1751
  additionalInfo: {
1707
1752
  ...(additionalInfoProp || additionalInfo || {}),
1708
- loginToken:
1709
- userToken ??
1710
- loginToken ??
1711
- additionalInfoProp?.loginToken ??
1712
- additionalInfo?.loginToken ??
1713
- authToken,
1753
+ loginToken: resolveLoginToken(additionalInfoProp?.loginToken),
1714
1754
  language: (
1715
1755
  userLang ??
1716
1756
  memori.culture?.split('-')?.[0] ??
@@ -1723,30 +1763,36 @@ const MemoriWidget = ({
1723
1763
 
1724
1764
  // Handle successful session initialization
1725
1765
  if (sessionID && currentState && response.resultCode === 0) {
1726
- console.log(
1727
- '[REOPEN_SESSION] Session initialized successfully:',
1728
- sessionID
1729
- );
1730
1766
  setSessionId(sessionID);
1731
1767
 
1732
1768
  // Update dialog state and history if requested
1733
1769
  if (updateDialogState) {
1734
- // console.log('[REOPEN_SESSION] Updating dialog state');
1735
1770
  setCurrentDialogState(currentState);
1736
1771
 
1737
- if (currentState.emission) {
1738
- console.log(
1739
- '[REOPEN_SESSION] Processing emission:',
1740
- currentState.emission
1741
- );
1772
+ const sessionExpiredStatus =
1773
+ isSessionExpired && history.length > 1
1774
+ ? t('sessionExpiredReopening')
1775
+ : null;
1776
+
1777
+ if (sessionExpiredStatus && suppressHistoryUpdate) {
1778
+ pushMessage({
1779
+ text: '',
1780
+ emitter: 'system',
1781
+ fromUser: false,
1782
+ initial: sessionExpiredStatus as any,
1783
+ contextVars: {},
1784
+ date: new Date().toISOString(),
1785
+ });
1786
+ }
1787
+
1788
+ if (currentState.emission && !suppressHistoryUpdate) {
1742
1789
  // Determine initial status message based on context
1743
1790
  // Show status message only if session expired and there's existing history
1744
- const initialStatus =
1745
- isSessionExpired && history.length > 1
1746
- ? 'Session Expired, reopening session'
1747
- : history.length <= 1
1748
- ? true
1749
- : undefined;
1791
+ const initialStatus = sessionExpiredStatus
1792
+ ? sessionExpiredStatus
1793
+ : history.length <= 1
1794
+ ? true
1795
+ : undefined;
1750
1796
 
1751
1797
  // Set initial message or append to existing history
1752
1798
  history.length <= 1
@@ -1809,8 +1855,10 @@ const MemoriWidget = ({
1809
1855
  setGotErrorInOpening(true);
1810
1856
  }
1811
1857
  // Handle authentication error
1812
- else if (response?.resultCode === 403) {
1813
- console.error('[REOPEN_SESSION] Authentication error');
1858
+ else if (
1859
+ response?.resultCode === 403 &&
1860
+ memori.privacyType !== 'PUBLIC'
1861
+ ) {
1814
1862
  setMemoriPwd(undefined);
1815
1863
  setAuthModalState('password');
1816
1864
  }
@@ -1826,7 +1874,7 @@ const MemoriWidget = ({
1826
1874
  setGotErrorInOpening(true);
1827
1875
  }
1828
1876
  } catch (err) {
1829
- console.error('[REOPEN_SESSION] Caught error:', err);
1877
+ logWidgetError('reopenSession failed', err);
1830
1878
  }
1831
1879
  // Reset loading state
1832
1880
  setLoading(false);
@@ -1834,6 +1882,101 @@ const MemoriWidget = ({
1834
1882
  return null;
1835
1883
  };
1836
1884
 
1885
+ const retryAfterExpiredSessionRef = useRef<
1886
+ (params: EnterTextRetryParams) => ReturnType<typeof reopenSession>
1887
+ >(() => Promise.resolve(null));
1888
+
1889
+ retryAfterExpiredSessionRef.current = (params: EnterTextRetryParams) => {
1890
+ const {
1891
+ text,
1892
+ media,
1893
+ translate = true,
1894
+ translatedText,
1895
+ hidden = false,
1896
+ typingText,
1897
+ useLoaderTextAsMsg = false,
1898
+ hasBatchQueued = false,
1899
+ expiredSessionID,
1900
+ continueFromChatLogID: continueFromChatLogIDParam,
1901
+ } = params;
1902
+
1903
+ const continueFromSessionID = expiredSessionID ?? sessionId;
1904
+ const continueFromChatLogID = continueFromChatLogIDParam ?? chatLogID;
1905
+
1906
+ const reopenAfterExpiry = () =>
1907
+ reopenSession(
1908
+ true,
1909
+ memoriPwd || memori.secretToken,
1910
+ memoriTokens,
1911
+ undefined,
1912
+ undefined,
1913
+ {
1914
+ LANG: userLang,
1915
+ PATHNAME: window.location.pathname,
1916
+ ROUTE: window.location.pathname?.split('/')?.pop() || '',
1917
+ ...(initialContextVars || {}),
1918
+ },
1919
+ initialQuestion,
1920
+ undefined,
1921
+ undefined,
1922
+ continueFromChatLogID,
1923
+ continueFromSessionID,
1924
+ true,
1925
+ true
1926
+ );
1927
+
1928
+ const scheduleRetry = (newSessionID: string) => {
1929
+ setTimeout(() => {
1930
+ sendMessage(
1931
+ text!,
1932
+ media,
1933
+ newSessionID,
1934
+ translate,
1935
+ translatedText,
1936
+ hidden,
1937
+ typingText,
1938
+ useLoaderTextAsMsg,
1939
+ hasBatchQueued,
1940
+ true
1941
+ );
1942
+ }, 500);
1943
+ };
1944
+
1945
+ const handleReopenFailure = (
1946
+ state: Awaited<ReturnType<typeof reopenSession>>
1947
+ ) => {
1948
+ setMemoriTyping(false);
1949
+ setTypingText(undefined);
1950
+ // `null` = explicit failure; `undefined` = auth/age modal opened (message kept in history)
1951
+ if (state === null && text && !hidden) {
1952
+ add(
1953
+ createAlertOptions({
1954
+ description: t('errors.SESSION_EXPIRED'),
1955
+ severity: 'error',
1956
+ })
1957
+ );
1958
+ }
1959
+ };
1960
+
1961
+ if (!text) {
1962
+ return reopenAfterExpiry().then(state => {
1963
+ if (!state?.sessionID) {
1964
+ handleReopenFailure(state);
1965
+ }
1966
+ return state;
1967
+ });
1968
+ }
1969
+
1970
+ return reopenAfterExpiry().then(state => {
1971
+ if (state?.sessionID) {
1972
+ scheduleRetry(state.sessionID);
1973
+ } else {
1974
+ handleReopenFailure(state);
1975
+ }
1976
+ return state;
1977
+ });
1978
+ };
1979
+
1837
1980
  const changeTag = async (
1838
1981
  memoriId: string,
1839
1982
  sessionId: string,
@@ -1841,7 +1984,6 @@ const MemoriWidget = ({
1841
1984
  pin?: string
1842
1985
  ) => {
1843
1986
  if (!memoriId || !sessionId) {
1844
- console.error('CHANGETAG/Session not found');
1845
1987
  return Promise.reject('Session not found');
1846
1988
  }
1847
1989
 
@@ -1881,7 +2023,6 @@ const MemoriWidget = ({
1881
2023
  };
1882
2024
  }
1883
2025
  } else if ([400, 401, 403, 404, 500].includes(resultCode)) {
1884
- console.warn('[APPCONTEXT/CHANGETAG]', resultCode);
1885
2026
  let storageBirthDate = getLocalConfig<string | undefined>(
1886
2027
  'birthDate',
1887
2028
  undefined
@@ -1892,8 +2033,8 @@ const MemoriWidget = ({
1892
2033
  referral = (() => {
1893
2034
  return window.location.href;
1894
2035
  })();
1895
- } catch (err) {
1896
- console.debug(err);
2036
+ } catch {
2037
+ // ignore referral URL errors
1897
2038
  }
1898
2039
 
1899
2040
  fetchSession({
@@ -1911,11 +2052,7 @@ const MemoriWidget = ({
1911
2052
  birthDate: birthDate || storageBirthDate || undefined,
1912
2053
  additionalInfo: {
1913
2054
  ...(additionalInfo || {}),
1914
- loginToken:
1915
- userToken ??
1916
- loginToken ??
1917
- additionalInfo?.loginToken ??
1918
- authToken,
2055
+ loginToken: resolveLoginToken(),
1919
2056
  language: (
1920
2057
  userLang ??
1921
2058
  memori.culture?.split('-')?.[0] ??
@@ -1935,7 +2072,6 @@ const MemoriWidget = ({
1935
2072
  }
1936
2073
  } catch (_e) {
1937
2074
  let err = _e as Error;
1938
- console.warn('[APPCONTEXT/CHANGETAG]', err);
1939
2075
  return Promise.reject(err);
1940
2076
  }
1941
2077
 
@@ -1962,6 +2098,7 @@ const MemoriWidget = ({
1962
2098
  return () => {
1963
2099
  setHasUserActivatedSpeak(false);
1964
2100
  setClickedStart(false);
2101
+ sessionStartingRef.current = false;
1965
2102
  clearInteractionTimeout();
1966
2103
  timeoutRef.current = undefined;
1967
2104
  };
@@ -1974,8 +2111,6 @@ const MemoriWidget = ({
1974
2111
  const [requestedListening, setRequestedListening] = useState(false);
1975
2112
  const startListeningRef = useRef<(() => Promise<void>) | null>(null);
1976
2113
 
1977
- // console.log('tenantID', tenantID);
1978
-
1979
2114
  // Define TTS configuration
1980
2115
  const ttsConfig = useMemo(
1981
2116
  () => ({
@@ -2002,6 +2137,9 @@ const MemoriWidget = ({
2002
2137
  [ttsProvider, userLang]
2003
2138
  );
2004
2139
 
2140
+ const resolvedDefaultSpeakerActive =
2141
+ defaultSpeakerActive ?? integrationConfig?.defaultSpeakerActive ?? true;
2142
+
2005
2143
  // Initialize TTS hook with basic options first
2006
2144
  const {
2007
2145
  speak: ttsSpeak,
@@ -2020,29 +2158,30 @@ const MemoriWidget = ({
2020
2158
  },
2021
2159
  autoStart,
2022
2160
  defaultEnableAudio,
2023
- defaultSpeakerActive ?? integrationConfig?.defaultSpeakerActive ?? true
2161
+ resolvedDefaultSpeakerActive
2162
+ );
2163
+
2164
+ const muteSpeakerFallback = getMuteSpeakerFallback(
2165
+ defaultEnableAudio,
2166
+ resolvedDefaultSpeakerActive,
2167
+ autoStart
2024
2168
  );
2025
2169
 
2026
2170
  // Helper function to check if audio should be played.
2027
- // When defaultEnableAudio is false, default to muted so we never play before the sync effect runs (avoids audio on first conversation start when audio is disabled).
2028
- const shouldPlayAudio = (text?: string) => {
2029
- const currentSpeakerMuted = getLocalConfig(
2030
- 'muteSpeaker',
2031
- !defaultEnableAudio
2032
- );
2033
- console.log('[MemoriWidget] shouldPlayAudio', currentSpeakerMuted);
2034
- return (
2035
- text &&
2036
- text.trim() &&
2037
- !preview &&
2038
- !currentSpeakerMuted &&
2039
- defaultEnableAudio
2040
- );
2041
- };
2171
+ // Align mute fallback with UI state so autostart + muted speaker never speaks.
2172
+ const shouldPlayAudio = (text?: string) =>
2173
+ shouldPlayTtsAudio({
2174
+ text,
2175
+ preview,
2176
+ defaultEnableAudio,
2177
+ defaultSpeakerActive: resolvedDefaultSpeakerActive,
2178
+ autoStart,
2179
+ speakerMuted,
2180
+ storedMute: getLocalConfig('muteSpeaker', muteSpeakerFallback),
2181
+ });
2042
2182
 
2043
2183
  // Create a single, centralized function to process and send messages
2044
2184
  const processSpeechAndSendMessage = (text: string) => {
2045
- // console.log('processSpeechAndSendMessage', text);
2046
2185
  // Skip if already processing or no text
2047
2186
  if (!text || text.trim().length === 0) {
2048
2187
  return;
@@ -2051,17 +2190,15 @@ const MemoriWidget = ({
2051
2190
  try {
2052
2191
  // Process the text
2053
2192
  const message = stripDuplicates(text);
2054
- console.debug('Processing speech message:', message);
2055
2193
 
2056
2194
  if (message.length > 0) {
2057
2195
  setUserMessage('');
2058
2196
 
2059
2197
  // Send the message
2060
- console.debug('Sending message:', message);
2061
2198
  sendMessage(message);
2062
2199
  }
2063
- } catch (error) {
2064
- console.error('Error in processSpeechAndSendMessage:', error);
2200
+ } catch {
2201
+ // ignore speech processing errors
2065
2202
  }
2066
2203
  };
2067
2204
 
@@ -2141,8 +2278,7 @@ const MemoriWidget = ({
2141
2278
  }
2142
2279
 
2143
2280
  return translatedState;
2144
- } catch (error) {
2145
- console.error('Error in translateAndSpeak:', error);
2281
+ } catch {
2146
2282
  // Still update activation state even if there's an error
2147
2283
  if (!hasUserActivatedSpeak) {
2148
2284
  setHasUserActivatedSpeak(true);
@@ -2159,6 +2295,277 @@ const MemoriWidget = ({
2159
2295
  ]
2160
2296
  );
2161
2297
 
2298
+ const processEnterTextDialogResponse = useCallback(
2299
+ (event: NatsDialogResponseEvent, pending: PendingEnterText) => {
2300
+ const {
2301
+ msg,
2302
+ typingText: pendingTypingText,
2303
+ useLoaderTextAsMsg,
2304
+ } = pending;
2305
+ const currentState = event.currentState;
2306
+
2307
+ if (event.resultCode !== 0 || !currentState) {
2308
+ if (isSessionExpiredNatsResponse(event) && pending.text) {
2309
+ setMemoriTyping(false);
2310
+ setTypingText(undefined);
2311
+ retryAfterExpiredSessionRef.current({
2312
+ text: pending.text,
2313
+ media: pending.media,
2314
+ translate: pending.translate,
2315
+ translatedText: pending.translatedText,
2316
+ hidden: pending.hidden,
2317
+ typingText: pending.typingText,
2318
+ useLoaderTextAsMsg: pending.useLoaderTextAsMsg,
2319
+ hasBatchQueued: pending.hasBatchQueued,
2320
+ expiredSessionID: sessionId,
2321
+ continueFromChatLogID: chatLogID,
2322
+ });
2323
+ return;
2324
+ }
2325
+
2326
+ if (event.resultCode === 500 && event.resultMessage) {
2327
+ setHistory(h => [
2328
+ ...h,
2329
+ {
2330
+ text: 'Error: ' + event.resultMessage,
2331
+ emitter: 'system',
2332
+ fromUser: false,
2333
+ initial: false,
2334
+ contextVars: {},
2335
+ date: new Date().toISOString(),
2336
+ },
2337
+ ]);
2338
+ }
2339
+ return;
2340
+ }
2341
+
2342
+ if (!msg) {
2343
+ return;
2344
+ }
2345
+
2346
+ setChatLogID(undefined);
2347
+ const emission =
2348
+ useLoaderTextAsMsg && pendingTypingText
2349
+ ? pendingTypingText
2350
+ : currentState.emission ?? currentDialogState?.emission;
2351
+
2352
+ if (
2353
+ userLang.toLowerCase() !== language.toLowerCase() &&
2354
+ emission &&
2355
+ isMultilanguageEnabled
2356
+ ) {
2357
+ currentState.emission = emission;
2358
+
2359
+ translateDialogState(currentState, userLang, msg).then(ts => {
2360
+ const text = ts.translatedEmission || ts.emission;
2361
+ if (text && shouldPlayAudio(text)) {
2362
+ handleSpeak(text);
2363
+ }
2364
+ });
2365
+ } else {
2366
+ setCurrentDialogState({
2367
+ ...currentState,
2368
+ emission,
2369
+ });
2370
+
2371
+ if (emission) {
2372
+ pushMessage({
2373
+ text: emission,
2374
+ emitter: currentState.emitter,
2375
+ media: currentState.emittedMedia ?? currentState.media,
2376
+ llmUsage: (currentState as any).llmUsage,
2377
+ fromUser: false,
2378
+ questionAnswered: msg,
2379
+ generatedByAI: !!currentState.completion,
2380
+ contextVars: currentState.contextVars,
2381
+ date: currentState.currentDate,
2382
+ placeName: currentState.currentPlaceName,
2383
+ placeLatitude: currentState.currentLatitude,
2384
+ placeLongitude: currentState.currentLongitude,
2385
+ placeUncertaintyKm: currentState.currentUncertaintyKm,
2386
+ tag: currentState.currentTag,
2387
+ memoryTags: currentState.memoryTags,
2388
+ } as any);
2389
+ if (emission && shouldPlayAudio(emission)) {
2390
+ handleSpeak(emission);
2391
+ }
2392
+ }
2393
+ }
2394
+ },
2395
+ [
2396
+ userLang,
2397
+ language,
2398
+ isMultilanguageEnabled,
2399
+ currentDialogState?.emission,
2400
+ translateDialogState,
2401
+ handleSpeak,
2402
+ shouldPlayAudio,
2403
+ ]
2404
+ );
2405
+
2406
+ const clearEnterTextPending = useCallback(
2407
+ (correlationID: string, pending: PendingEnterText) => {
2408
+ if (pending.waitForResponse?.timeoutId) {
2409
+ clearTimeout(pending.waitForResponse.timeoutId);
2410
+ }
2411
+ pendingEnterTextRef.current.delete(correlationID);
2412
+ },
2413
+ []
2414
+ );
2415
+
2416
+ const deliverEnterTextNatsError = useCallback(
2417
+ (event: NatsErrorEvent) => {
2418
+ const correlationID = event.correlationID;
2419
+ let pending: PendingEnterText | undefined;
2420
+
2421
+ if (correlationID) {
2422
+ pending = pendingEnterTextRef.current.get(correlationID);
2423
+ if (pending) {
2424
+ clearEnterTextPending(correlationID, pending);
2425
+ pending.waitForResponse?.reject(
2426
+ new Error(
2427
+ event.errorMessage ?? String(event.errorCode ?? 'NATS error')
2428
+ )
2429
+ );
2430
+ }
2431
+ }
2432
+
2433
+ if (isSessionExpiredNatsError(event) && pending?.text) {
2434
+ setMemoriTyping(false);
2435
+ setTypingText(undefined);
2436
+ retryAfterExpiredSessionRef.current({
2437
+ text: pending.text,
2438
+ media: pending.media,
2439
+ translate: pending.translate,
2440
+ translatedText: pending.translatedText,
2441
+ hidden: pending.hidden,
2442
+ typingText: pending.typingText,
2443
+ useLoaderTextAsMsg: pending.useLoaderTextAsMsg,
2444
+ hasBatchQueued: pending.hasBatchQueued,
2445
+ expiredSessionID: sessionId,
2446
+ continueFromChatLogID: chatLogID,
2447
+ });
2448
+ return;
2449
+ }
2450
+
2451
+ const errorText = event.errorMessage
2452
+ ? `Error: ${event.errorMessage}`
2453
+ : event.errorCode
2454
+ ? `Error: ${event.errorCode}`
2455
+ : 'Error: An unexpected error occurred';
2456
+
2457
+ pushMessage({
2458
+ text: errorText,
2459
+ emitter: 'system',
2460
+ fromUser: false,
2461
+ initial: false,
2462
+ contextVars: {},
2463
+ date: new Date().toISOString(),
2464
+ });
2465
+
2466
+ setMemoriTyping(false);
2467
+ setTypingText(undefined);
2468
+ },
2469
+ [clearEnterTextPending]
2470
+ );
2471
+
2472
+ const deliverEnterTextNatsResponse = useCallback(
2473
+ (correlationID: string, event: NatsDialogResponseEvent) => {
2474
+ const pending = pendingEnterTextRef.current.get(correlationID);
2475
+ if (!pending) {
2476
+ bufferedNatsResponsesRef.current.set(correlationID, event);
2477
+ return;
2478
+ }
2479
+
2480
+ clearEnterTextPending(correlationID, pending);
2481
+
2482
+ if (pending.waitForResponse) {
2483
+ pending.waitForResponse.resolve(event);
2484
+ setMemoriTyping(false);
2485
+ setTypingText(undefined);
2486
+ return;
2487
+ }
2488
+
2489
+ processEnterTextDialogResponse(event, pending);
2490
+
2491
+ if (!pending.hasBatchQueued) {
2492
+ setMemoriTyping(false);
2493
+ setTypingText(undefined);
2494
+ }
2495
+ },
2496
+ [processEnterTextDialogResponse, clearEnterTextPending]
2497
+ );
2498
+
2499
+ const registerPendingEnterText = useCallback(
2500
+ (correlationID: string, pending: PendingEnterText) => {
2501
+ const buffered = bufferedNatsResponsesRef.current.get(correlationID);
2502
+ if (buffered) {
2503
+ bufferedNatsResponsesRef.current.delete(correlationID);
2504
+ pendingEnterTextRef.current.set(correlationID, pending);
2505
+ deliverEnterTextNatsResponse(correlationID, buffered);
2506
+ return;
2507
+ }
2508
+
2509
+ pendingEnterTextRef.current.set(correlationID, pending);
2510
+ },
2511
+ [deliverEnterTextNatsResponse]
2512
+ );
2513
+
2514
+ const waitForEnterTextNatsResponse = useCallback(
2515
+ (correlationID: string, timeoutMs = 120000) =>
2516
+ new Promise<NatsDialogResponseEvent>((resolve, reject) => {
2517
+ const timeoutId = setTimeout(() => {
2518
+ const current = pendingEnterTextRef.current.get(correlationID);
2519
+ if (current) {
2520
+ clearEnterTextPending(correlationID, current);
2521
+ }
2522
+ logWidgetError('NATS timeout', { correlationID, timeoutMs });
2523
+ reject(new Error('NATS enter-text response timeout'));
2524
+ }, timeoutMs);
2525
+
2526
+ registerPendingEnterText(correlationID, {
2527
+ waitForResponse: {
2528
+ resolve: event => {
2529
+ clearTimeout(timeoutId);
2530
+ resolve(event);
2531
+ },
2532
+ reject: error => {
2533
+ clearTimeout(timeoutId);
2534
+ reject(error);
2535
+ },
2536
+ timeoutId,
2537
+ },
2538
+ });
2539
+ }),
2540
+ [registerPendingEnterText, clearEnterTextPending]
2541
+ );
2542
+
2543
+ // NATS subscription: receives progress updates and the async enter-text response.
2544
+ useNats({
2545
+ baseUrl,
2546
+ sessionId,
2547
+ onProgress: useCallback((event: NatsProgressEvent) => {
2548
+ if (event.message) {
2549
+ setTypingText(event.message);
2550
+ }
2551
+ }, []),
2552
+ onDialogResponse: useCallback(
2553
+ (event: NatsDialogResponseEvent) => {
2554
+ const correlationID = event.correlationID;
2555
+ if (!correlationID) {
2556
+ logWidgetError('NATS dialog response missing correlationID', event);
2557
+ setMemoriTyping(false);
2558
+ setTypingText(undefined);
2559
+ return;
2560
+ }
2561
+
2562
+ deliverEnterTextNatsResponse(correlationID, event);
2563
+ },
2564
+ [deliverEnterTextNatsResponse]
2565
+ ),
2566
+ onError: deliverEnterTextNatsError,
2567
+ });
2568
+
2162
2569
  const focusChatInput = () => {
2163
2570
  let textarea = document.querySelector(
2164
2571
  '#chat-fieldset textarea'
@@ -2187,8 +2594,8 @@ const MemoriWidget = ({
2187
2594
  setClickedStart(false);
2188
2595
  timeoutRef.current = undefined;
2189
2596
  ttsStop();
2190
- } catch (e) {
2191
- // console.log('Error: resetUIEffects', e);
2597
+ } catch {
2598
+ // ignore reset errors
2192
2599
  }
2193
2600
  };
2194
2601
  useEffect(() => {
@@ -2245,9 +2652,6 @@ const MemoriWidget = ({
2245
2652
  >();
2246
2653
 
2247
2654
  const globalBackground = integrationConfig?.globalBackground;
2248
- const globalBackgroundUrl = globalBackground
2249
- ? `url(${globalBackground})`
2250
- : null;
2251
2655
 
2252
2656
  const integrationProperties = (
2253
2657
  integration ? getChatStyles(integrationConfig) : {}
@@ -2288,9 +2692,13 @@ const MemoriWidget = ({
2288
2692
  }`
2289
2693
  );
2290
2694
  }
2291
- if (integrationConfig?.blurBackground) {
2695
+ if (integrationConfig?.blurBackground === false) {
2292
2696
  integrationStylesheetParts.push(
2293
- '.memori-widget .memori--global-background { filter: blur(5px); }'
2697
+ `.memori-widget .memori-chat--history--has-global-background::before,
2698
+ .memori-widget .memori-chat-layout--main--has-background::before {
2699
+ filter: none;
2700
+ transform: none;
2701
+ }`
2294
2702
  );
2295
2703
  }
2296
2704
  const integrationStylesheet = `@layer integration {
@@ -2444,12 +2852,6 @@ const MemoriWidget = ({
2444
2852
  chatLog?: ChatLog,
2445
2853
  targetSessionID?: string
2446
2854
  ) => {
2447
- // console.log('[onClickStart] Starting with params:', {
2448
- // session,
2449
- // initialSessionExpired,
2450
- // chatLog
2451
- // });
2452
-
2453
2855
  const sessionID = chatLog ? undefined : session?.sessionID || sessionId;
2454
2856
  const dialogState = chatLog
2455
2857
  ? undefined
@@ -2478,10 +2880,17 @@ const MemoriWidget = ({
2478
2880
  return;
2479
2881
  }
2480
2882
 
2883
+ if (!(await checkCredits({ notify: true }))) {
2884
+ setClickedStart(false);
2885
+ setLoading(false);
2886
+ return;
2887
+ }
2888
+
2481
2889
  // Handle age verification
2482
2890
  if (!sessionID && !!minAge && !birth) {
2483
2891
  setShowAgeVerification(true);
2484
2892
  setClickedStart(false);
2893
+ return;
2485
2894
  }
2486
2895
  // Handle authentication
2487
2896
  else if (
@@ -2498,117 +2907,125 @@ const MemoriWidget = ({
2498
2907
  }
2499
2908
  // Create new session if needed
2500
2909
  else if (!sessionID || initialSessionExpired) {
2501
- setClickedStart(false);
2502
2910
  setGotErrorInOpening(false);
2503
- const session = await fetchSession({
2504
- memoriID: memori.engineMemoriID!,
2505
- password: secret || memoriPwd || memori.secretToken,
2506
- tag: personification?.tag,
2507
- pin: personification?.pin,
2508
- continueFromChatLogID: chatLog?.chatLogID,
2509
- initialContextVars: {
2510
- LANG: userLang,
2511
- PATHNAME: window.location.pathname?.toUpperCase(),
2512
- ROUTE:
2513
- window.location.pathname?.split('/')?.pop()?.toUpperCase() || '',
2514
- ...((!chatLog
2515
- ? initialContextVars
2516
- : chatLog.lines[chatLog.lines.length - 1].contextVars) || {}),
2517
- },
2518
- initialQuestion: chatLog ? undefined : initialQuestion,
2519
- birthDate: birth,
2520
- additionalInfo: {
2521
- ...(additionalInfo || {}),
2522
- loginToken:
2523
- userToken ??
2524
- loginToken ??
2525
- additionalInfo?.loginToken ??
2526
- authToken,
2527
- language: (
2528
- userLang ??
2529
- memori.culture?.split('-')?.[0] ??
2530
- 'IT'
2531
- ).toLowerCase(),
2532
- timeZoneOffset: new Date().getTimezoneOffset().toString(),
2533
- },
2534
- });
2911
+ if (sessionStartingRef.current) {
2912
+ return;
2913
+ }
2914
+ sessionStartingRef.current = true;
2915
+ try {
2916
+ const session = await fetchSession({
2917
+ memoriID: memori.engineMemoriID!,
2918
+ password: secret || memoriPwd || memori.secretToken,
2919
+ tag: personification?.tag,
2920
+ pin: personification?.pin,
2921
+ continueFromChatLogID: chatLog?.chatLogID,
2922
+ initialContextVars: {
2923
+ LANG: userLang,
2924
+ PATHNAME: window.location.pathname?.toUpperCase(),
2925
+ ROUTE:
2926
+ window.location.pathname?.split('/')?.pop()?.toUpperCase() ||
2927
+ '',
2928
+ ...((!chatLog
2929
+ ? initialContextVars
2930
+ : chatLog.lines[chatLog.lines.length - 1].contextVars) || {}),
2931
+ },
2932
+ initialQuestion: chatLog ? undefined : initialQuestion,
2933
+ birthDate: birth,
2934
+ additionalInfo: {
2935
+ ...(additionalInfo || {}),
2936
+ loginToken: resolveLoginToken(),
2937
+ language: (
2938
+ userLang ??
2939
+ memori.culture?.split('-')?.[0] ??
2940
+ 'IT'
2941
+ ).toLowerCase(),
2942
+ timeZoneOffset: new Date().getTimezoneOffset().toString(),
2943
+ },
2944
+ });
2535
2945
 
2536
- if (session?.dialogState) {
2537
- // reset history
2538
- if (!chatLog) {
2539
- setHistory([]);
2946
+ if (session?.dialogState) {
2947
+ // reset history
2948
+ if (!chatLog) {
2949
+ setHistory([]);
2540
2950
 
2541
- // Use translateAndSpeak which already handles the speaking
2542
- await translateAndSpeak(session.dialogState, userLang);
2543
- // No need for additional handleSpeak call since translateAndSpeak already handles it
2544
- setHasUserActivatedSpeak(true);
2545
- } else {
2546
- const messages = chatLog.lines.map(
2547
- (l, i) =>
2548
- ({
2549
- text: l.text,
2550
- media: l.media
2551
- ?.filter(m => allowedMediaTypes.includes(m.mimeType))
2552
- ?.map(m => ({
2553
- mediumID: `${i}-${m.mimeType}`,
2554
- ...m,
2555
- })),
2556
- fromUser: l.inbound,
2557
- llmUsage: (l as any).llmUsage,
2558
- timestamp: l.timestamp,
2559
- emitter: l.emitter,
2560
- initial: i === 0,
2561
- } as Message)
2562
- );
2951
+ // Use translateAndSpeak which already handles the speaking
2952
+ await translateAndSpeak(session.dialogState, userLang);
2953
+ // No need for additional handleSpeak call since translateAndSpeak already handles it
2954
+ setHasUserActivatedSpeak(true);
2955
+ setClickedStart(false);
2956
+ } else {
2957
+ const messages = chatLog.lines.map(
2958
+ (l, i) =>
2959
+ ({
2960
+ text: l.text,
2961
+ media: l.media
2962
+ ?.filter(m => allowedMediaTypes.includes(m.mimeType))
2963
+ ?.map(m => ({
2964
+ mediumID: `${i}-${m.mimeType}`,
2965
+ ...m,
2966
+ })),
2967
+ fromUser: l.inbound,
2968
+ llmUsage: (l as any).llmUsage,
2969
+ timestamp: l.timestamp,
2970
+ emitter: l.emitter,
2971
+ initial: i === 0,
2972
+ } as Message)
2973
+ );
2563
2974
 
2564
- // we dont remove the last one as it is the current state
2565
- translatedMessages = messages ?? [];
2566
- if (
2567
- language.toUpperCase() !== userLang.toUpperCase() &&
2568
- isMultilanguageEnabled
2569
- ) {
2570
- try {
2571
- translatedMessages = await Promise.all(
2572
- messages.map(async m => {
2573
- // If original text is present, the message is already translated
2574
- if ('originalText' in m && m.originalText) {
2575
- return m;
2576
- }
2577
- // Otherwise translate the message
2578
- return {
2579
- ...m,
2580
- originalText: m.text,
2581
- text: (
2582
- await getTranslation(
2583
- m.text,
2584
- userLang,
2585
- language,
2586
- baseUrl
2587
- )
2588
- ).text,
2589
- };
2590
- })
2591
- );
2592
- } catch (e) {
2593
- console.error('[onClickStart] Error translating messages:', e);
2975
+ // we dont remove the last one as it is the current state
2976
+ translatedMessages = messages ?? [];
2977
+ if (
2978
+ language.toUpperCase() !== userLang.toUpperCase() &&
2979
+ isMultilanguageEnabled
2980
+ ) {
2981
+ try {
2982
+ translatedMessages = await Promise.all(
2983
+ messages.map(async m => {
2984
+ // If original text is present, the message is already translated
2985
+ if ('originalText' in m && m.originalText) {
2986
+ return m;
2987
+ }
2988
+ // Otherwise translate the message
2989
+ return {
2990
+ ...m,
2991
+ originalText: m.text,
2992
+ text: (
2993
+ await getTranslation(
2994
+ m.text,
2995
+ userLang,
2996
+ language,
2997
+ baseUrl
2998
+ )
2999
+ ).text,
3000
+ };
3001
+ })
3002
+ );
3003
+ } catch {
3004
+ // ignore translation errors
3005
+ }
2594
3006
  }
2595
- }
2596
3007
 
2597
- setHistory(translatedMessages);
3008
+ setHistory(translatedMessages);
2598
3009
 
2599
- translateDialogState(
2600
- session.dialogState,
2601
- userLang,
2602
- undefined,
2603
- true
2604
- ).finally(() => {
2605
- setHasUserActivatedSpeak(true);
2606
- });
3010
+ translateDialogState(
3011
+ session.dialogState,
3012
+ userLang,
3013
+ undefined,
3014
+ true
3015
+ ).finally(() => {
3016
+ setHasUserActivatedSpeak(true);
3017
+ setClickedStart(false);
3018
+ });
3019
+ }
3020
+ } else if (session?.resultCode === 0) {
3021
+ sessionStartingRef.current = false;
3022
+ await onClickStart((session as any) || undefined);
3023
+ } else {
3024
+ setLoading(false);
3025
+ setClickedStart(false);
2607
3026
  }
2608
- } else if (session?.resultCode === 0) {
2609
- await onClickStart((session as any) || undefined);
2610
- } else {
2611
- setLoading(false);
3027
+ } finally {
3028
+ sessionStartingRef.current = false;
2612
3029
  }
2613
3030
 
2614
3031
  return;
@@ -2621,9 +3038,7 @@ const MemoriWidget = ({
2621
3038
 
2622
3039
  if (response.resultCode !== 0 || !currentState) {
2623
3040
  const { chatLogs } = await getSessionChatLogs(sessionID!, sessionID!);
2624
- setGotErrorInOpening(true);
2625
3041
  setSessionId(undefined);
2626
- setClickedStart(false);
2627
3042
  await onClickStart(undefined, true, chatLogs?.[0]);
2628
3043
  return;
2629
3044
  }
@@ -2649,11 +3064,11 @@ const MemoriWidget = ({
2649
3064
 
2650
3065
  if (session && session.resultCode === 0) {
2651
3066
  await translateAndSpeak(session.currentState, userLang);
3067
+ setClickedStart(false);
2652
3068
  } else {
2653
3069
  throw new Error('No session');
2654
3070
  }
2655
- } catch (e) {
2656
- console.error('[onClickStart] Error changing tag:', e);
3071
+ } catch {
2657
3072
  reopenSession(
2658
3073
  true,
2659
3074
  memori?.secretToken,
@@ -2672,6 +3087,7 @@ const MemoriWidget = ({
2672
3087
  birth
2673
3088
  ).then(() => {
2674
3089
  setHasUserActivatedSpeak(true);
3090
+ setClickedStart(false);
2675
3091
  });
2676
3092
  }
2677
3093
  }
@@ -2694,6 +3110,7 @@ const MemoriWidget = ({
2694
3110
 
2695
3111
  if (session && session.resultCode === 0) {
2696
3112
  await translateAndSpeak(session.currentState, userLang);
3113
+ setClickedStart(false);
2697
3114
  } else {
2698
3115
  throw new Error('No session');
2699
3116
  }
@@ -2716,6 +3133,7 @@ const MemoriWidget = ({
2716
3133
  birth
2717
3134
  ).then(() => {
2718
3135
  setHasUserActivatedSpeak(true);
3136
+ setClickedStart(false);
2719
3137
  });
2720
3138
  }
2721
3139
  }
@@ -2762,14 +3180,14 @@ const MemoriWidget = ({
2762
3180
  ).text,
2763
3181
  }))
2764
3182
  );
2765
- } catch (e) {
2766
- console.error('[onClickStart] Error translating messages:', e);
3183
+ } catch {
3184
+ // ignore translation errors
2767
3185
  }
2768
3186
  }
2769
3187
 
2770
3188
  setHistory(translatedMessages);
2771
- } catch (e) {
2772
- console.error('[onClickStart] Error retrieving chat logs:', e);
3189
+ } catch {
3190
+ // ignore chat log retrieval errors
2773
3191
  }
2774
3192
 
2775
3193
  if (
@@ -2778,6 +3196,7 @@ const MemoriWidget = ({
2778
3196
  ) {
2779
3197
  // we have a history, don't push message
2780
3198
  setHasUserActivatedSpeak(true);
3199
+ setClickedStart(false);
2781
3200
  await translateAndSpeak(
2782
3201
  currentState,
2783
3202
  userLang,
@@ -2787,16 +3206,13 @@ const MemoriWidget = ({
2787
3206
  !!translatedMessages?.length
2788
3207
  );
2789
3208
  } else {
2790
- console.log('[onClickStart] Starting with initial question');
2791
3209
  // remove default initial message
2792
3210
  translatedMessages = [];
2793
3211
  setHistory([]);
2794
3212
 
2795
- setMemoriTyping(true);
2796
-
2797
3213
  // we have no chat history, we start by initial question
2798
3214
  const placeSpec = getPlaceSpecForEnterText(position);
2799
- const response = await postTextEnteredEvent({
3215
+ const response = await postEnterTextAsync({
2800
3216
  sessionId: sessionID!,
2801
3217
  text: initialQuestion,
2802
3218
  ...(memori.needsDateTime && {
@@ -2804,8 +3220,7 @@ const MemoriWidget = ({
2804
3220
  }),
2805
3221
  ...(placeSpec !== undefined && { place: placeSpec }),
2806
3222
  });
2807
-
2808
- // Handle 500 error from TextEnteredEvent
3223
+ // Handle 500 error from EnterTextAsync
2809
3224
  if (response.resultCode === 500 && response.resultMessage) {
2810
3225
  setHistory(h => [
2811
3226
  ...h,
@@ -2818,16 +3233,36 @@ const MemoriWidget = ({
2818
3233
  date: new Date().toISOString(),
2819
3234
  },
2820
3235
  ]);
2821
- setMemoriTyping(false);
2822
3236
  return;
2823
3237
  }
2824
3238
 
2825
- await translateAndSpeak(
2826
- response.currentState ?? currentState,
2827
- userLang,
2828
- undefined,
2829
- false
2830
- );
3239
+ const onClickStartCorrelationID = readCorrelationID(response);
3240
+ if (response.resultCode === 0 && onClickStartCorrelationID) {
3241
+ setMemoriTyping(true);
3242
+ try {
3243
+ const natsEvent = await waitForEnterTextNatsResponse(
3244
+ onClickStartCorrelationID
3245
+ );
3246
+ if (natsEvent.resultCode === 0 && natsEvent.currentState) {
3247
+ await translateAndSpeak(
3248
+ natsEvent.currentState,
3249
+ userLang,
3250
+ undefined,
3251
+ false
3252
+ );
3253
+ setClickedStart(false);
3254
+ }
3255
+ } catch (err) {
3256
+ logWidgetError('onClickStart NATS wait failed', err);
3257
+ setMemoriTyping(false);
3258
+ setTypingText(undefined);
3259
+ }
3260
+ } else if (response.resultCode === 0) {
3261
+ logWidgetError(
3262
+ 'onClickStart enter-text missing correlationID',
3263
+ response
3264
+ );
3265
+ }
2831
3266
  }
2832
3267
  }
2833
3268
  }
@@ -2838,6 +3273,7 @@ const MemoriWidget = ({
2838
3273
 
2839
3274
  // everything is fine, just translate dialog state and activate chat
2840
3275
  await translateAndSpeak(dialogState!, userLang);
3276
+ setClickedStart(false);
2841
3277
  }
2842
3278
  },
2843
3279
  [memoriPwd, memori, memoriTokens, birthDate, sessionId, userLang, position]
@@ -2845,19 +3281,51 @@ const MemoriWidget = ({
2845
3281
 
2846
3282
  const setPositionPopoverOpen = useCallback(
2847
3283
  (open: boolean) => {
2848
- setPositionPopoverOpenState(open);
2849
- if (!open && autoStart) {
2850
- onClickStart();
2851
- }
3284
+ const sessionAlreadyStarted = !!(sessionId && hasUserActivatedSpeak);
3285
+ setPositionPopoverOpenState(wasOpen => {
3286
+ if (
3287
+ shouldRestartSessionOnPositionPopoverClose(
3288
+ wasOpen,
3289
+ open,
3290
+ autoStart,
3291
+ sessionAlreadyStarted
3292
+ )
3293
+ ) {
3294
+ // Defer: React setState updaters must stay pure.
3295
+ queueMicrotask(() => {
3296
+ onClickStart();
3297
+ });
3298
+ }
3299
+ if (!open) {
3300
+ queueMicrotask(() => {
3301
+ setAutoStartPositionGeolocation(false);
3302
+ });
3303
+ }
3304
+ return open;
3305
+ });
2852
3306
  },
2853
- [autoStart, onClickStart]
3307
+ [autoStart, onClickStart, sessionId, hasUserActivatedSpeak]
2854
3308
  );
2855
3309
 
2856
3310
  useEffect(() => {
2857
- if (!clickedStart && autoStart && selectedLayout !== 'HIDDEN_CHAT') {
3311
+ if (
3312
+ !clickedStart &&
3313
+ !sessionStartingRef.current &&
3314
+ !sessionId &&
3315
+ autoStart &&
3316
+ selectedLayout !== 'HIDDEN_CHAT' &&
3317
+ (!needsCredits || hasEnoughCredits)
3318
+ ) {
2858
3319
  onClickStart();
2859
3320
  }
2860
- }, [clickedStart, autoStart, selectedLayout]);
3321
+ }, [
3322
+ clickedStart,
3323
+ autoStart,
3324
+ selectedLayout,
3325
+ sessionId,
3326
+ needsCredits,
3327
+ hasEnoughCredits,
3328
+ ]);
2861
3329
 
2862
3330
  useEffect(() => {
2863
3331
  const targetNode =
@@ -2868,29 +3336,31 @@ const MemoriWidget = ({
2868
3336
  return;
2869
3337
  }
2870
3338
 
3339
+ const propsToken = additionalInfo?.loginToken ?? authToken;
3340
+ const initialDomToken = targetNode.getAttribute('authtoken') || undefined;
3341
+ if (initialDomToken && !propsToken) {
3342
+ setLoginToken(initialDomToken);
3343
+ userTokenRef.current = initialDomToken;
3344
+ }
3345
+
3346
+ const applyAuthTokenFromElement = (element: Element) => {
3347
+ const clientNode =
3348
+ element.nodeName === 'MEMORI-CLIENT'
3349
+ ? element
3350
+ : element.closest('memori-client') ?? element.parentElement;
3351
+ const token = clientNode?.getAttribute('authtoken') || undefined;
3352
+ setLoginToken(token);
3353
+ userTokenRef.current = token;
3354
+ };
3355
+
2871
3356
  const config = { attributes: true, childList: false, subtree: false };
2872
- const callback: MutationCallback = (mutationList, _observer) => {
3357
+ const callback: MutationCallback = mutationList => {
2873
3358
  for (const mutation of mutationList) {
2874
3359
  if (
2875
3360
  mutation.type === 'attributes' &&
2876
3361
  mutation.attributeName?.toLowerCase() === 'authtoken'
2877
3362
  ) {
2878
- if (mutation.target.nodeName === 'MEMORI-CLIENT') {
2879
- setLoginToken(
2880
- // @ts-ignore
2881
- mutation.target.getAttribute('authtoken') || undefined
2882
- );
2883
- // @ts-ignore
2884
- userToken = mutation.target.getAttribute('authtoken') || undefined;
2885
- } else {
2886
- // @ts-ignore
2887
- setLoginToken(
2888
- mutation.target?.parentElement?.getAttribute('authtoken') ||
2889
- undefined
2890
- );
2891
- // @ts-ignore
2892
- userToken = mutation.target.getAttribute('authtoken') || undefined;
2893
- }
3363
+ applyAuthTokenFromElement(mutation.target as Element);
2894
3364
  }
2895
3365
  }
2896
3366
  };
@@ -2900,7 +3370,7 @@ const MemoriWidget = ({
2900
3370
  return () => {
2901
3371
  observer.disconnect();
2902
3372
  };
2903
- }, []);
3373
+ }, [memori.name, memori.memoriID, additionalInfo?.loginToken, authToken]);
2904
3374
 
2905
3375
  /**
2906
3376
  * Experts references
@@ -2914,11 +3384,9 @@ const MemoriWidget = ({
2914
3384
 
2915
3385
  if (resp.resultCode === 0) {
2916
3386
  setExperts(experts);
2917
- } else {
2918
- console.warn('Error fetching experts', resp);
2919
3387
  }
2920
- } catch (err) {
2921
- console.warn(err);
3388
+ } catch {
3389
+ // ignore expert fetch errors
2922
3390
  }
2923
3391
  }, [sessionId, memori?.enableBoardOfExperts]);
2924
3392
  useEffect(() => {
@@ -2931,39 +3399,74 @@ const MemoriWidget = ({
2931
3399
  !!user?.userID &&
2932
3400
  user?.pAndCUAccepted;
2933
3401
 
2934
- // check if owner has enough credits
2935
- const needsCredits = tenant?.billingDelegation;
2936
- const [hasEnoughCredits, setHasEnoughCredits] = useState<boolean>(true);
2937
- const checkCredits = useCallback(async () => {
2938
- if (!tenant?.billingDelegation) return;
3402
+ const handleNotEnoughCredits = useCallback(() => {
3403
+ setHasEnoughCredits(false);
3404
+ setAuthModalState(null);
3405
+ add(
3406
+ createAlertOptions({
3407
+ description: t('notEnoughCredits'),
3408
+ severity: 'error',
3409
+ })
3410
+ );
3411
+ }, [add, t]);
3412
+ const checkCredits = useCallback(
3413
+ async (options?: { notify?: boolean }) => {
3414
+ if (!tenant?.billingDelegation) return true;
3415
+
3416
+ // Billing delegation is active: credits MUST be verified.
3417
+ // Without either owner identifier we cannot call the API, so we fail closed
3418
+ // instead of silently letting the session start unverified.
3419
+ if (!ownerUserID && !ownerUserName) {
3420
+ if (options?.notify) {
3421
+ handleNotEnoughCredits();
3422
+ } else {
3423
+ setHasEnoughCredits(false);
3424
+ }
3425
+ return false;
3426
+ }
2939
3427
 
2940
- try {
2941
- const resp = await getCredits({
2942
- operation: deepThoughtEnabled
2943
- ? 'dt_session_creation'
2944
- : 'session_creation',
2945
- baseUrl: baseUrl,
2946
- userID: ownerUserID,
2947
- userName: ownerUserName,
2948
- tenant: tenantID,
2949
- });
3428
+ try {
3429
+ const resp = await getCredits({
3430
+ operation: deepThoughtEnabled
3431
+ ? 'dt_session_creation'
3432
+ : 'session_creation',
3433
+ baseUrl: baseUrl,
3434
+ userID: ownerUserID,
3435
+ userName: ownerUserName,
3436
+ tenant: tenantID,
3437
+ });
2950
3438
 
2951
- if (resp.enough) {
2952
- setHasEnoughCredits(true);
2953
- } else {
2954
- setHasEnoughCredits(false);
2955
- console.warn('Not enough credits. Required:', resp.required);
3439
+ if (resp.enough) {
3440
+ setHasEnoughCredits(true);
3441
+ return true;
3442
+ } else {
3443
+ if (options?.notify) {
3444
+ handleNotEnoughCredits();
3445
+ } else {
3446
+ setHasEnoughCredits(false);
3447
+ }
3448
+ return false;
3449
+ }
3450
+ } catch (err) {
3451
+ logWidgetError('checkCredits failed', err);
3452
+ return true;
2956
3453
  }
2957
- } catch (e) {
2958
- let err = e as Error;
2959
- console.debug(err);
2960
- }
2961
- }, [tenant?.billingDelegation, deepThoughtEnabled]);
3454
+ },
3455
+ [
3456
+ baseUrl,
3457
+ deepThoughtEnabled,
3458
+ handleNotEnoughCredits,
3459
+ ownerUserID,
3460
+ ownerUserName,
3461
+ tenant?.billingDelegation,
3462
+ tenantID,
3463
+ ]
3464
+ );
2962
3465
  useEffect(() => {
2963
3466
  if (tenant?.billingDelegation) {
2964
3467
  checkCredits();
2965
3468
  }
2966
- }, [tenant?.billingDelegation, deepThoughtEnabled]);
3469
+ }, [tenant?.billingDelegation, deepThoughtEnabled, checkCredits]);
2967
3470
 
2968
3471
  useEffect(() => {
2969
3472
  if (__WEBCOMPONENT__) return;
@@ -3006,6 +3509,7 @@ const MemoriWidget = ({
3006
3509
  setVenue: setPosition,
3007
3510
  positionPopoverOpen,
3008
3511
  setPositionPopoverOpen,
3512
+ autoStartPositionGeolocation,
3009
3513
  setShowSettingsDrawer,
3010
3514
  setShowKnownFactsDrawer,
3011
3515
  setShowExpertsDrawer,
@@ -3017,7 +3521,9 @@ const MemoriWidget = ({
3017
3521
  setShowChatHistoryDrawer,
3018
3522
  showSettings: showSettings ?? integrationConfig?.showSettings ?? true,
3019
3523
  showChatHistory:
3020
- showChatHistory ?? integrationConfig?.showChatHistory ?? true,
3524
+ selectedLayout === 'WEBSITE_ASSISTANT'
3525
+ ? false
3526
+ : showChatHistory ?? integrationConfig?.showChatHistory ?? true,
3021
3527
  showMessageConsumption: enableMessageConsumption,
3022
3528
  hasUserActivatedSpeak,
3023
3529
  showReload: selectedLayout === 'TOTEM',
@@ -3036,7 +3542,7 @@ const MemoriWidget = ({
3036
3542
  setShowLoginDrawer(false);
3037
3543
  setUser(undefined);
3038
3544
  setLoginToken(undefined);
3039
- userToken = undefined;
3545
+ userTokenRef.current = undefined;
3040
3546
  removeLocalConfig('loginToken');
3041
3547
  });
3042
3548
  },
@@ -3073,7 +3579,10 @@ const MemoriWidget = ({
3073
3579
  apiUrl: client.constants.BACKEND_URL,
3074
3580
  position: position,
3075
3581
  setVenue: setPosition,
3076
- openPositionPopover: () => setPositionPopoverOpen(true),
3582
+ openPositionPopover: () => {
3583
+ setAutoStartPositionGeolocation(true);
3584
+ setPositionPopoverOpen(true);
3585
+ },
3077
3586
  integrationConfig: integrationConfig,
3078
3587
  instruct: instruct,
3079
3588
  sessionId: sessionId,
@@ -3086,7 +3595,9 @@ const MemoriWidget = ({
3086
3595
  showLogin: canShowLoginButton,
3087
3596
  setShowLoginDrawer,
3088
3597
  showChatHistory:
3089
- showChatHistory ?? integrationConfig?.showChatHistory ?? true,
3598
+ selectedLayout === 'WEBSITE_ASSISTANT'
3599
+ ? false
3600
+ : showChatHistory ?? integrationConfig?.showChatHistory ?? true,
3090
3601
  setShowChatHistoryDrawer,
3091
3602
  user,
3092
3603
  };
@@ -3113,8 +3624,7 @@ const MemoriWidget = ({
3113
3624
  showTypingText:
3114
3625
  showTypingText ?? integrationConfig?.showTypingText ?? false,
3115
3626
  history: showFullHistory ? history : history.slice(-2),
3116
- authToken:
3117
- loginToken ?? userToken ?? additionalInfo?.loginToken ?? authToken,
3627
+ authToken: resolveLoginToken(),
3118
3628
  dialogState: currentDialogState,
3119
3629
  pushMessage,
3120
3630
  simulateUserPrompt,
@@ -3170,24 +3680,19 @@ const MemoriWidget = ({
3170
3680
  isChatlogPanel:
3171
3681
  (integrationConfig as { artifactChatLogPanel?: boolean } | undefined)
3172
3682
  ?.artifactChatLogPanel === true,
3683
+ globalBackground: globalBackground || undefined,
3173
3684
  };
3174
3685
 
3175
- const integrationBackground =
3176
- integration && globalBackgroundUrl ? (
3177
- <div className="memori--global-background">
3178
- <div
3179
- className="memori--global-background-image"
3180
- style={{ backgroundImage: globalBackgroundUrl }}
3181
- />
3182
- </div>
3183
- ) : (
3184
- <div className="memori--global-background no-background-image" />
3185
- );
3686
+ // Layout chrome placeholder (e.g. Totem gradient when no image). The actual
3687
+ // integration background image is applied on `.memori-chat--content` via chatProps.
3688
+ const integrationBackground = (
3689
+ <div className="memori--global-background no-background-image" />
3690
+ );
3186
3691
 
3187
3692
  const integrationStyle =
3188
3693
  integration &&
3189
3694
  (Object.keys(integrationProperties).length > 0 ||
3190
- integrationConfig?.blurBackground) ? (
3695
+ integrationConfig?.blurBackground === false) ? (
3191
3696
  <style dangerouslySetInnerHTML={{ __html: integrationStylesheet }} />
3192
3697
  ) : null;
3193
3698
 
@@ -3216,9 +3721,17 @@ const MemoriWidget = ({
3216
3721
  ? ZoomedFullBodyLayout
3217
3722
  : FullPageLayout;
3218
3723
 
3724
+ // Resolve the widget theme once so both `data-theme` on the root and the
3725
+ // `MemoriUIProvider` (which stamps portaled popups) stay in sync.
3726
+ // Prefer integration config; default to light when unset.
3727
+ const widgetTheme: 'light' | 'dark' =
3728
+ integrationConfig?.theme === 'light' || integrationConfig?.theme === 'dark'
3729
+ ? integrationConfig.theme
3730
+ : 'light';
3731
+
3219
3732
  return (
3220
3733
  <div
3221
- ref={widgetRootRef}
3734
+ ref={setWidgetRootEl}
3222
3735
  className={cx(
3223
3736
  'memori',
3224
3737
  'memori-widget',
@@ -3236,12 +3749,7 @@ const MemoriWidget = ({
3236
3749
  'memori--has-active-session': !!sessionId,
3237
3750
  }
3238
3751
  )}
3239
- data-theme={
3240
- integrationConfig?.theme === 'light' ||
3241
- integrationConfig?.theme === 'dark'
3242
- ? integrationConfig.theme
3243
- : undefined
3244
- }
3752
+ data-theme={widgetTheme}
3245
3753
  data-memori-name={memori?.name}
3246
3754
  data-memori-id={memori?.engineMemoriID}
3247
3755
  data-memori-secondary-id={memori?.memoriID}
@@ -3253,304 +3761,326 @@ const MemoriWidget = ({
3253
3761
  })}
3254
3762
  style={{ height }}
3255
3763
  >
3256
- <Layout
3257
- Header={Header}
3258
- headerProps={headerProps}
3259
- Avatar={Avatar}
3260
- avatarProps={avatarProps}
3261
- Chat={Chat}
3262
- chatProps={chatProps}
3263
- StartPanel={StartPanel}
3264
- startPanelProps={startPanelProps}
3265
- integrationStyle={integrationStyle}
3266
- integrationBackground={integrationBackground}
3267
- poweredBy={poweredBy}
3268
- autoStart={autoStart}
3269
- sessionId={sessionId}
3270
- hasUserActivatedSpeak={hasUserActivatedSpeak}
3271
- loading={loading}
3272
- avatar3dHidden={avatar3dHidden ?? integrationConfig?.avatar_3d_hidden}
3273
- />
3274
-
3275
- <ArtifactAPIBridge
3276
- pushMessage={(message: Message) => {
3277
- setHistory(history => {
3278
- if (!history.length) return history;
3279
- const lastMessage = history[history.length - 1];
3280
- if (!lastMessage || lastMessage.fromUser) return history;
3281
- // Create a new message object with the updated text
3282
- const updatedLastMessage = {
3283
- ...lastMessage,
3284
- text: lastMessage.text + message.text,
3285
- };
3286
- return [...history.slice(0, -1), updatedLastMessage];
3287
- });
3288
- }}
3289
- />
3290
-
3291
- <audio
3292
- id="memori-audio"
3293
- style={{ display: 'none' }}
3294
- src="https://aisuru.com/intro.mp3"
3295
- />
3296
-
3297
- {isClient && (
3298
- <MemoriAuth
3299
- withModal
3300
- pwdOrTokens={authModalState}
3301
- openModal={!!authModalState}
3302
- setPwdOrTokens={setAuthModalState}
3303
- showTokens={memori.privacyType === 'SECRET'}
3304
- onFinish={(values: any) => {
3305
- if (values['password']) setMemoriPwd(values['password']);
3306
- if (values['password']) memoriPassword = values['password'];
3307
- if (values['tokens']) setMemoriTokens(values['tokens']);
3308
-
3309
- return reopenSession(
3310
- !sessionId,
3311
- values['password'],
3312
- values['tokens'],
3313
- personification?.tag,
3314
- personification?.pin,
3315
- {
3316
- LANG: userLang,
3317
- PATHNAME: window.location.pathname?.toUpperCase(),
3318
- ROUTE:
3319
- window.location.pathname?.split('/')?.pop()?.toUpperCase() ||
3320
- '',
3321
- ...(initialContextVars || {}),
3322
- },
3323
- initialQuestion,
3324
- birthDate
3325
- )
3326
- .then(state => {
3327
- if (!state?.sessionID) {
3328
- throw new Error('AUTH_FAILED');
3764
+ <MemoriUIProvider container={widgetRootEl} theme={widgetTheme}>
3765
+ {/* Inside themed root so alert text uses dark-theme tokens (white). */}
3766
+ <AlertViewport placement="top-end" style={{ zIndex: 10002 }} />
3767
+ <WidgetSurfaceProvider value={widgetSurfaceEl}>
3768
+ <div ref={setWidgetSurfaceEl} className="memori-widget__surface">
3769
+ <Layout
3770
+ Header={Header}
3771
+ headerProps={headerProps}
3772
+ Avatar={Avatar}
3773
+ avatarProps={avatarProps}
3774
+ Chat={Chat}
3775
+ chatProps={chatProps}
3776
+ StartPanel={StartPanel}
3777
+ startPanelProps={startPanelProps}
3778
+ integrationStyle={integrationStyle}
3779
+ integrationBackground={integrationBackground}
3780
+ poweredBy={poweredBy}
3781
+ autoStart={autoStart}
3782
+ sessionId={sessionId}
3783
+ hasUserActivatedSpeak={hasUserActivatedSpeak}
3784
+ loading={loading}
3785
+ avatar3dHidden={
3786
+ avatar3dHidden ?? integrationConfig?.avatar_3d_hidden
3787
+ }
3788
+ totemContentMaxWidth={integrationConfig?.totemContentMaxWidth}
3789
+ />
3790
+
3791
+ <ArtifactAPIBridge
3792
+ pushMessage={(message: Message) => {
3793
+ setHistory(history => {
3794
+ if (!history.length) return history;
3795
+ const lastMessage = history[history.length - 1];
3796
+ if (!lastMessage || lastMessage.fromUser) return history;
3797
+ // Create a new message object with the updated text
3798
+ const updatedLastMessage = {
3799
+ ...lastMessage,
3800
+ text: lastMessage.text + message.text,
3801
+ };
3802
+ return [...history.slice(0, -1), updatedLastMessage];
3803
+ });
3804
+ }}
3805
+ />
3806
+
3807
+ <audio
3808
+ id="memori-audio"
3809
+ style={{ display: 'none' }}
3810
+ src="https://aisuru.com/intro.mp3"
3811
+ />
3812
+
3813
+ {isClient && (
3814
+ <MemoriAuth
3815
+ withModal
3816
+ pwdOrTokens={authModalState}
3817
+ openModal={!!authModalState}
3818
+ setPwdOrTokens={setAuthModalState}
3819
+ showTokens={memori.privacyType === 'SECRET'}
3820
+ onFinish={(values: any) => {
3821
+ if (values['password']) setMemoriPwd(values['password']);
3822
+ if (values['password']) memoriPassword = values['password'];
3823
+ if (values['tokens']) setMemoriTokens(values['tokens']);
3824
+
3825
+ return reopenSession(
3826
+ !sessionId,
3827
+ values['password'],
3828
+ values['tokens'],
3829
+ personification?.tag,
3830
+ personification?.pin,
3831
+ {
3832
+ LANG: userLang,
3833
+ PATHNAME: window.location.pathname?.toUpperCase(),
3834
+ ROUTE:
3835
+ window.location.pathname
3836
+ ?.split('/')
3837
+ ?.pop()
3838
+ ?.toUpperCase() || '',
3839
+ ...(initialContextVars || {}),
3840
+ },
3841
+ initialQuestion,
3842
+ birthDate
3843
+ )
3844
+ .then(state => {
3845
+ if (!state?.sessionID) {
3846
+ throw new Error('AUTH_FAILED');
3847
+ }
3848
+
3849
+ setAuthModalState(null);
3850
+ // If we got a valid state from reopenSession, don't call onClickStart again
3851
+ // to avoid duplicate snippet execution
3852
+ if (state?.dialogState) {
3853
+ setHasUserActivatedSpeak(true);
3854
+ } else {
3855
+ // Only call onClickStart if reopenSession didn't return a valid state
3856
+ onClickStart(state);
3857
+ }
3858
+ })
3859
+ .catch(error => {
3860
+ if (
3861
+ !(error instanceof Error) ||
3862
+ error.message !== 'AUTH_FAILED'
3863
+ ) {
3864
+ setGotErrorInOpening(true);
3865
+ }
3866
+ throw error;
3867
+ });
3868
+ }}
3869
+ minimumNumberOfRecoveryTokens={
3870
+ memori?.minimumNumberOfRecoveryTokens ?? 1
3329
3871
  }
3330
-
3331
- setAuthModalState(null);
3332
- // If we got a valid state from reopenSession, don't call onClickStart again
3333
- // to avoid duplicate snippet execution
3334
- if (state?.dialogState) {
3335
- setHasUserActivatedSpeak(true);
3336
- } else {
3337
- // Only call onClickStart if reopenSession didn't return a valid state
3338
- onClickStart(state);
3872
+ />
3873
+ )}
3874
+
3875
+ {isClient && (
3876
+ <AgeVerificationModal
3877
+ visible={showAgeVerification}
3878
+ minAge={minAge}
3879
+ onClose={birthDate => {
3880
+ if (birthDate) {
3881
+ setBirthDate(birthDate);
3882
+
3883
+ setLocalConfig('birthDate', birthDate);
3884
+
3885
+ reopenSession(
3886
+ !sessionId,
3887
+ memoriPassword || memoriPwd || memori?.secretToken,
3888
+ memoriTokens,
3889
+ personification?.tag,
3890
+ personification?.pin,
3891
+ {
3892
+ LANG: userLang,
3893
+ PATHNAME: window.location.pathname?.toUpperCase(),
3894
+ ROUTE:
3895
+ window.location.pathname
3896
+ ?.split('/')
3897
+ ?.pop()
3898
+ ?.toUpperCase() || '',
3899
+ ...(initialContextVars || {}),
3900
+ },
3901
+ initialQuestion,
3902
+ birthDate
3903
+ )
3904
+ .then(state => {
3905
+ setShowAgeVerification(false);
3906
+ setAuthModalState(null);
3907
+ onClickStart(state || undefined);
3908
+ })
3909
+ .catch(() => {
3910
+ setShowAgeVerification(false);
3911
+ setGotErrorInOpening(true);
3912
+ });
3913
+ } else {
3914
+ setShowAgeVerification(false);
3915
+ setClickedStart(false);
3916
+ }
3917
+ }}
3918
+ />
3919
+ )}
3920
+
3921
+ {showSettingsDrawer && (
3922
+ <SettingsDrawer
3923
+ layout={selectedLayout}
3924
+ open={!!showSettingsDrawer}
3925
+ onClose={() => setShowSettingsDrawer(false)}
3926
+ microphoneMode={
3927
+ continuousSpeech ? 'CONTINUOUS' : 'HOLD_TO_TALK'
3339
3928
  }
3340
- })
3341
- .catch(error => {
3342
- if (
3343
- !(error instanceof Error) ||
3344
- error.message !== 'AUTH_FAILED'
3345
- ) {
3346
- setGotErrorInOpening(true);
3929
+ continuousSpeechTimeout={continuousSpeechTimeout}
3930
+ setMicrophoneMode={mode =>
3931
+ setContinuousSpeech(mode === 'CONTINUOUS')
3347
3932
  }
3348
- throw error;
3349
- });
3350
- }}
3351
- minimumNumberOfRecoveryTokens={
3352
- memori?.minimumNumberOfRecoveryTokens ?? 1
3353
- }
3354
- />
3355
- )}
3356
-
3357
- {isClient && (
3358
- <AgeVerificationModal
3359
- visible={showAgeVerification}
3360
- minAge={minAge}
3361
- onClose={birthDate => {
3362
- if (birthDate) {
3363
- setBirthDate(birthDate);
3364
-
3365
- setLocalConfig('birthDate', birthDate);
3366
-
3367
- reopenSession(
3368
- !sessionId,
3369
- memoriPassword || memoriPwd || memori?.secretToken,
3370
- memoriTokens,
3371
- personification?.tag,
3372
- personification?.pin,
3373
- {
3374
- LANG: userLang,
3375
- PATHNAME: window.location.pathname?.toUpperCase(),
3376
- ROUTE:
3377
- window.location.pathname
3378
- ?.split('/')
3379
- ?.pop()
3380
- ?.toUpperCase() || '',
3381
- ...(initialContextVars || {}),
3382
- },
3383
- initialQuestion,
3384
- birthDate
3385
- )
3386
- .then(state => {
3387
- setShowAgeVerification(false);
3388
- setAuthModalState(null);
3389
- onClickStart(state || undefined);
3390
- })
3391
- .catch(() => {
3392
- setShowAgeVerification(false);
3393
- setGotErrorInOpening(true);
3394
- });
3395
- } else {
3396
- setShowAgeVerification(false);
3397
- setClickedStart(false);
3398
- }
3399
- }}
3400
- />
3401
- )}
3402
-
3403
- {showSettingsDrawer && (
3404
- <SettingsDrawer
3405
- layout={selectedLayout}
3406
- open={!!showSettingsDrawer}
3407
- onClose={() => setShowSettingsDrawer(false)}
3408
- microphoneMode={continuousSpeech ? 'CONTINUOUS' : 'HOLD_TO_TALK'}
3409
- continuousSpeechTimeout={continuousSpeechTimeout}
3410
- setMicrophoneMode={mode => setContinuousSpeech(mode === 'CONTINUOUS')}
3411
- setContinuousSpeechTimeout={setContinuousSpeechTimeout}
3412
- controlsPosition={controlsPosition}
3413
- setControlsPosition={setControlsPosition}
3414
- hideEmissions={hideEmissions}
3415
- setHideEmissions={setHideEmissions}
3416
- avatarType={avatarType}
3417
- setAvatarType={setAvatarType}
3418
- enablePositionControls={enablePositionControls}
3419
- setEnablePositionControls={setEnablePositionControls}
3420
- isAvatar3d={!!integrationConfig?.avatarURL}
3421
- additionalSettings={additionalSettings}
3422
- speakerMuted={speakerMuted}
3423
- />
3424
- )}
3425
-
3426
- {showChatHistoryDrawer && (
3427
- <ChatHistoryDrawer
3428
- open={!!showChatHistoryDrawer}
3429
- onClose={() => setShowChatHistoryDrawer(false)}
3430
- resumeSession={chatLog => {
3431
- setChatLogID(chatLog.chatLogID);
3432
- onClickStart(undefined, false, chatLog);
3433
- setShowChatHistoryDrawer(false);
3434
- }}
3435
- apiClient={client}
3436
- sessionId={sessionId || ''}
3437
- memori={memori}
3438
- baseUrl={baseUrl}
3439
- history={history}
3440
- apiUrl={client.constants.BACKEND_URL}
3441
- loginToken={loginToken}
3442
- language={language}
3443
- userLang={userLang}
3444
- isMultilanguageEnabled={isMultilanguageEnabled}
3445
- />
3446
- )}
3447
-
3448
- {showKnownFactsDrawer && sessionId && (
3449
- <KnownFacts
3450
- apiClient={client}
3451
- memori={memori}
3452
- sessionID={sessionId}
3453
- visible={showKnownFactsDrawer}
3454
- closeDrawer={() => setShowKnownFactsDrawer(false)}
3455
- />
3456
- )}
3457
-
3458
- {showExpertsDrawer && !!experts && (
3459
- <ExpertsDrawer
3460
- apiUrl={client.constants.BACKEND_URL}
3461
- baseUrl={baseUrl}
3462
- tenant={tenant}
3463
- experts={experts}
3464
- open={showExpertsDrawer}
3465
- onClose={() => setShowExpertsDrawer(false)}
3466
- />
3467
- )}
3468
-
3469
- {showLoginDrawer && tenant?.name && (
3470
- <LoginDrawer
3471
- tenant={tenant}
3472
- apiClient={client}
3473
- open={!!showLoginDrawer}
3474
- user={user}
3475
- loginToken={loginToken}
3476
- onClose={() => setShowLoginDrawer(false)}
3477
- drawerClassName={
3478
- selectedLayout === 'WEBSITE_ASSISTANT'
3479
- ? 'memori-drawer--above-website-assistant'
3480
- : undefined
3481
- }
3482
- onLogin={(user, token) => {
3483
- //The user is logged in, so we need to set open a new session with the new token
3484
- reopenSession(
3485
- false,
3486
- memoriPassword || memoriPwd || memori?.secretToken,
3487
- [],
3488
- personification?.tag,
3489
- personification?.pin,
3490
- {
3491
- LANG: userLang,
3492
- PATHNAME: window.location.pathname?.toUpperCase(),
3493
- ROUTE:
3494
- window.location.pathname?.split('/')?.pop()?.toUpperCase() ||
3495
- '',
3496
- ...(initialContextVars || {}),
3497
- },
3498
- undefined, // Don't send initialQuestion after login, only show the login status chip
3499
- birthDate,
3500
- { loginToken: token } as any,
3501
- undefined,
3502
- sessionId
3503
- ).then(state => {
3504
- setShowLoginDrawer(false);
3505
- setUser(user);
3506
- setLoginToken(token);
3507
- userToken = token;
3508
- setLocalConfig('loginToken', token);
3509
- // Push a message with initial status to show status message when a new session is created after login
3510
- if (
3511
- state?.sessionID &&
3512
- state.sessionID !== sessionId &&
3513
- state?.dialogState
3514
- ) {
3515
- // Push a message with initial status message showing successful login
3516
- // Only show the chip component, not the emission text
3517
- const username = user?.userName || t('login.user');
3518
- pushMessage({
3519
- text: '', // Empty text so only the chip is visible
3520
- emitter: state.dialogState.emitter,
3521
- media:
3522
- state.dialogState.emittedMedia ??
3523
- state.dialogState.media ??
3933
+ setContinuousSpeechTimeout={setContinuousSpeechTimeout}
3934
+ controlsPosition={controlsPosition}
3935
+ setControlsPosition={setControlsPosition}
3936
+ hideEmissions={hideEmissions}
3937
+ setHideEmissions={setHideEmissions}
3938
+ avatarType={avatarType}
3939
+ setAvatarType={setAvatarType}
3940
+ enablePositionControls={enablePositionControls}
3941
+ setEnablePositionControls={setEnablePositionControls}
3942
+ isAvatar3d={!!integrationConfig?.avatarURL}
3943
+ additionalSettings={additionalSettings}
3944
+ speakerMuted={speakerMuted}
3945
+ />
3946
+ )}
3947
+
3948
+ {showChatHistoryDrawer && (
3949
+ <ChatHistoryDrawer
3950
+ open={!!showChatHistoryDrawer}
3951
+ onClose={() => setShowChatHistoryDrawer(false)}
3952
+ resumeSession={chatLog => {
3953
+ setChatLogID(chatLog.chatLogID);
3954
+ onClickStart(undefined, false, chatLog);
3955
+ setShowChatHistoryDrawer(false);
3956
+ }}
3957
+ apiClient={client}
3958
+ sessionId={sessionId || ''}
3959
+ memori={memori}
3960
+ baseUrl={baseUrl}
3961
+ history={history}
3962
+ apiUrl={client.constants.BACKEND_URL}
3963
+ loginToken={loginToken}
3964
+ language={language}
3965
+ userLang={userLang}
3966
+ isMultilanguageEnabled={isMultilanguageEnabled}
3967
+ />
3968
+ )}
3969
+
3970
+ {showKnownFactsDrawer && sessionId && (
3971
+ <KnownFacts
3972
+ apiClient={client}
3973
+ memori={memori}
3974
+ sessionID={sessionId}
3975
+ visible={showKnownFactsDrawer}
3976
+ closeDrawer={() => setShowKnownFactsDrawer(false)}
3977
+ />
3978
+ )}
3979
+
3980
+ {showExpertsDrawer && !!experts && (
3981
+ <ExpertsDrawer
3982
+ apiUrl={client.constants.BACKEND_URL}
3983
+ baseUrl={baseUrl}
3984
+ tenant={tenant}
3985
+ experts={experts}
3986
+ open={showExpertsDrawer}
3987
+ onClose={() => setShowExpertsDrawer(false)}
3988
+ />
3989
+ )}
3990
+
3991
+ {showLoginDrawer && tenant?.name && (
3992
+ <LoginDrawer
3993
+ tenant={tenant}
3994
+ apiClient={client}
3995
+ open={!!showLoginDrawer}
3996
+ user={user}
3997
+ loginToken={loginToken}
3998
+ onClose={() => setShowLoginDrawer(false)}
3999
+ drawerClassName={
4000
+ selectedLayout === 'WEBSITE_ASSISTANT'
4001
+ ? 'memori-drawer--above-website-assistant'
4002
+ : undefined
4003
+ }
4004
+ onLogin={(user, token) => {
4005
+ //The user is logged in, so we need to set open a new session with the new token
4006
+ reopenSession(
4007
+ false,
4008
+ memoriPassword || memoriPwd || memori?.secretToken,
3524
4009
  [],
3525
- fromUser: false,
3526
- initial: t('login.successfullyLoggedIn', { username }) as any,
3527
- contextVars: state.dialogState.contextVars,
3528
- date: state.dialogState.currentDate,
3529
- placeName: state.dialogState.currentPlaceName,
3530
- placeLatitude: state.dialogState.currentLatitude,
3531
- placeLongitude: state.dialogState.currentLongitude,
3532
- placeUncertaintyKm: state.dialogState.currentUncertaintyKm,
3533
- tag: state.dialogState.currentTag,
3534
- memoryTags: state.dialogState.memoryTags,
3535
- });
3536
- // Update the dialog state so the UI reflects the new session
3537
- setCurrentDialogState(state.dialogState);
3538
- }
3539
- });
3540
- }}
3541
- setUser={setUser}
3542
- onLogout={() => {
3543
- if (!loginToken) return;
3544
- client.backend.pwlUserLogout(loginToken).then(() => {
3545
- setShowLoginDrawer(false);
3546
- setUser(undefined);
3547
- setLoginToken(undefined);
3548
- userToken = undefined;
3549
- removeLocalConfig('loginToken');
3550
- });
3551
- }}
3552
- />
3553
- )}
4010
+ personification?.tag,
4011
+ personification?.pin,
4012
+ {
4013
+ LANG: userLang,
4014
+ PATHNAME: window.location.pathname?.toUpperCase(),
4015
+ ROUTE:
4016
+ window.location.pathname
4017
+ ?.split('/')
4018
+ ?.pop()
4019
+ ?.toUpperCase() || '',
4020
+ ...(initialContextVars || {}),
4021
+ },
4022
+ undefined, // Don't send initialQuestion after login, only show the login status chip
4023
+ birthDate,
4024
+ { loginToken: token } as any,
4025
+ undefined,
4026
+ sessionId
4027
+ ).then(state => {
4028
+ setShowLoginDrawer(false);
4029
+ setUser(user);
4030
+ setLoginToken(token);
4031
+ userTokenRef.current = token;
4032
+ setLocalConfig('loginToken', token);
4033
+ // Push a message with initial status to show status message when a new session is created after login
4034
+ if (
4035
+ state?.sessionID &&
4036
+ state.sessionID !== sessionId &&
4037
+ state?.dialogState
4038
+ ) {
4039
+ // Push a message with initial status message showing successful login
4040
+ // Only show the chip component, not the emission text
4041
+ const username = user?.userName || t('login.user');
4042
+ pushMessage({
4043
+ text: '', // Empty text so only the chip is visible
4044
+ emitter: state.dialogState.emitter,
4045
+ media:
4046
+ state.dialogState.emittedMedia ??
4047
+ state.dialogState.media ??
4048
+ [],
4049
+ fromUser: false,
4050
+ initial: t('login.successfullyLoggedIn', {
4051
+ username,
4052
+ }) as any,
4053
+ contextVars: state.dialogState.contextVars,
4054
+ date: state.dialogState.currentDate,
4055
+ placeName: state.dialogState.currentPlaceName,
4056
+ placeLatitude: state.dialogState.currentLatitude,
4057
+ placeLongitude: state.dialogState.currentLongitude,
4058
+ placeUncertaintyKm:
4059
+ state.dialogState.currentUncertaintyKm,
4060
+ tag: state.dialogState.currentTag,
4061
+ memoryTags: state.dialogState.memoryTags,
4062
+ });
4063
+ // Update the dialog state so the UI reflects the new session
4064
+ setCurrentDialogState(state.dialogState);
4065
+ }
4066
+ });
4067
+ }}
4068
+ setUser={setUser}
4069
+ onLogout={() => {
4070
+ if (!loginToken) return;
4071
+ client.backend.pwlUserLogout(loginToken).then(() => {
4072
+ setShowLoginDrawer(false);
4073
+ setUser(undefined);
4074
+ setLoginToken(undefined);
4075
+ userTokenRef.current = undefined;
4076
+ removeLocalConfig('loginToken');
4077
+ });
4078
+ }}
4079
+ />
4080
+ )}
4081
+ </div>
4082
+ </WidgetSurfaceProvider>
4083
+ </MemoriUIProvider>
3554
4084
  </div>
3555
4085
  );
3556
4086
  };