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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/components/AgeVerificationModal/AgeVerificationModal.js +5 -2
  3. package/dist/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  4. package/dist/components/Avatar/Avatar.js +5 -10
  5. package/dist/components/Avatar/Avatar.js.map +1 -1
  6. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +8 -1
  7. package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  8. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +1 -1
  9. package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
  10. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -0
  11. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js +14 -5
  12. package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  13. package/dist/components/ChatBubble/ChatBubble.js +22 -16
  14. package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
  15. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js +6 -3
  16. package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  17. package/dist/components/DateSelector/DateSelector.d.ts +2 -1
  18. package/dist/components/DateSelector/DateSelector.js +17 -7
  19. package/dist/components/DateSelector/DateSelector.js.map +1 -1
  20. package/dist/components/FilePreview/FilePreview.js +22 -5
  21. package/dist/components/FilePreview/FilePreview.js.map +1 -1
  22. package/dist/components/Header/ChatConsumptionDropdown.js +1 -1
  23. package/dist/components/Header/ChatConsumptionDropdown.js.map +1 -1
  24. package/dist/components/Header/Header.css +2 -1
  25. package/dist/components/Header/Header.js +1 -1
  26. package/dist/components/Header/Header.js.map +1 -1
  27. package/dist/components/MediaWidget/MediaItemWidget.js +14 -12
  28. package/dist/components/MediaWidget/MediaItemWidget.js.map +1 -1
  29. package/dist/components/MediaWidget/MediaItemWidget.utils.d.ts +3 -2
  30. package/dist/components/MediaWidget/MediaItemWidget.utils.js +28 -6
  31. package/dist/components/MediaWidget/MediaItemWidget.utils.js.map +1 -1
  32. package/dist/components/MediaWidget/MediaPreviewModal.js +6 -7
  33. package/dist/components/MediaWidget/MediaPreviewModal.js.map +1 -1
  34. package/dist/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -4
  35. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +90 -38
  36. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.d.ts +1 -0
  37. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +14 -9
  38. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  39. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +2 -2
  40. package/dist/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  41. package/dist/components/MemoriWidget/MemoriWidget.js +632 -280
  42. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  43. package/dist/components/StartPanel/StartPanel.js +10 -5
  44. package/dist/components/StartPanel/StartPanel.js.map +1 -1
  45. package/dist/components/UploadButton/UploadButton.js +21 -5
  46. package/dist/components/UploadButton/UploadButton.js.map +1 -1
  47. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js +123 -59
  48. package/dist/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  49. package/dist/components/layouts/Chat.js +25 -30
  50. package/dist/components/layouts/Chat.js.map +1 -1
  51. package/dist/components/layouts/FullPage.js +5 -8
  52. package/dist/components/layouts/FullPage.js.map +1 -1
  53. package/dist/components/layouts/HiddenChat.js +2 -1
  54. package/dist/components/layouts/HiddenChat.js.map +1 -1
  55. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js +5 -1
  56. package/dist/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  57. package/dist/components/layouts/WebsiteAssistant/website-assistant.css +3 -4
  58. package/dist/components/layouts/ZoomedFullBody.js +4 -7
  59. package/dist/components/layouts/ZoomedFullBody.js.map +1 -1
  60. package/dist/components/layouts/chat.css +19 -31
  61. package/dist/components/layouts/fullpage.css +52 -19
  62. package/dist/components/layouts/zoomed-full-body.css +40 -1
  63. package/dist/helpers/constants.d.ts +3 -0
  64. package/dist/helpers/constants.js +27 -1
  65. package/dist/helpers/constants.js.map +1 -1
  66. package/dist/helpers/credits.d.ts +5 -2
  67. package/dist/helpers/credits.js +5 -1
  68. package/dist/helpers/credits.js.map +1 -1
  69. package/dist/helpers/message.d.ts +1 -1
  70. package/dist/helpers/message.js +4 -4
  71. package/dist/helpers/message.js.map +1 -1
  72. package/dist/helpers/nats/getNatsConfig.d.ts +9 -0
  73. package/dist/helpers/nats/getNatsConfig.js +65 -0
  74. package/dist/helpers/nats/getNatsConfig.js.map +1 -0
  75. package/dist/helpers/nats/isSessionExpiredError.d.ts +3 -0
  76. package/dist/helpers/nats/isSessionExpiredError.js +36 -0
  77. package/dist/helpers/nats/isSessionExpiredError.js.map +1 -0
  78. package/dist/helpers/nats/useNats.d.ts +12 -0
  79. package/dist/helpers/nats/useNats.js +75 -0
  80. package/dist/helpers/nats/useNats.js.map +1 -0
  81. package/dist/helpers/nats/useNatsSession.d.ts +28 -0
  82. package/dist/helpers/nats/useNatsSession.js +212 -0
  83. package/dist/helpers/nats/useNatsSession.js.map +1 -0
  84. package/dist/helpers/usePressTooltip.d.ts +13 -0
  85. package/dist/helpers/usePressTooltip.js +23 -0
  86. package/dist/helpers/usePressTooltip.js.map +1 -0
  87. package/dist/helpers/utils.d.ts +21 -0
  88. package/dist/helpers/utils.js +75 -4
  89. package/dist/helpers/utils.js.map +1 -1
  90. package/dist/locales/de.json +1 -0
  91. package/dist/locales/en.json +1 -0
  92. package/dist/locales/es.json +1 -0
  93. package/dist/locales/fr.json +1 -0
  94. package/dist/locales/it.json +1 -0
  95. package/dist/styles.css +1 -1
  96. package/dist/types/integration.d.ts +3 -0
  97. package/dist/types/integration.js +16 -0
  98. package/dist/types/integration.js.map +1 -0
  99. package/dist/version.d.ts +1 -1
  100. package/dist/version.js +1 -1
  101. package/esm/components/AgeVerificationModal/AgeVerificationModal.js +5 -2
  102. package/esm/components/AgeVerificationModal/AgeVerificationModal.js.map +1 -1
  103. package/esm/components/Avatar/Avatar.js +5 -10
  104. package/esm/components/Avatar/Avatar.js.map +1 -1
  105. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +9 -2
  106. package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
  107. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +2 -2
  108. package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
  109. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +2 -0
  110. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js +13 -4
  111. package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
  112. package/esm/components/ChatBubble/ChatBubble.js +22 -16
  113. package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
  114. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js +6 -3
  115. package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
  116. package/esm/components/DateSelector/DateSelector.d.ts +2 -1
  117. package/esm/components/DateSelector/DateSelector.js +17 -7
  118. package/esm/components/DateSelector/DateSelector.js.map +1 -1
  119. package/esm/components/FilePreview/FilePreview.js +24 -7
  120. package/esm/components/FilePreview/FilePreview.js.map +1 -1
  121. package/esm/components/Header/ChatConsumptionDropdown.js +1 -1
  122. package/esm/components/Header/ChatConsumptionDropdown.js.map +1 -1
  123. package/esm/components/Header/Header.css +2 -1
  124. package/esm/components/Header/Header.js +1 -1
  125. package/esm/components/Header/Header.js.map +1 -1
  126. package/esm/components/MediaWidget/MediaItemWidget.js +16 -14
  127. package/esm/components/MediaWidget/MediaItemWidget.js.map +1 -1
  128. package/esm/components/MediaWidget/MediaItemWidget.utils.d.ts +3 -2
  129. package/esm/components/MediaWidget/MediaItemWidget.utils.js +27 -6
  130. package/esm/components/MediaWidget/MediaItemWidget.utils.js.map +1 -1
  131. package/esm/components/MediaWidget/MediaPreviewModal.js +6 -7
  132. package/esm/components/MediaWidget/MediaPreviewModal.js.map +1 -1
  133. package/esm/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -4
  134. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +90 -38
  135. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.d.ts +1 -0
  136. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js +14 -9
  137. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.js.map +1 -1
  138. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js +2 -2
  139. package/esm/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.js.map +1 -1
  140. package/esm/components/MemoriWidget/MemoriWidget.js +632 -280
  141. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  142. package/esm/components/StartPanel/StartPanel.js +10 -5
  143. package/esm/components/StartPanel/StartPanel.js.map +1 -1
  144. package/esm/components/UploadButton/UploadButton.js +21 -5
  145. package/esm/components/UploadButton/UploadButton.js.map +1 -1
  146. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js +123 -59
  147. package/esm/components/UploadButton/UploadDocuments/UploadDocuments.js.map +1 -1
  148. package/esm/components/layouts/Chat.js +25 -30
  149. package/esm/components/layouts/Chat.js.map +1 -1
  150. package/esm/components/layouts/FullPage.js +5 -8
  151. package/esm/components/layouts/FullPage.js.map +1 -1
  152. package/esm/components/layouts/HiddenChat.js +2 -1
  153. package/esm/components/layouts/HiddenChat.js.map +1 -1
  154. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js +5 -1
  155. package/esm/components/layouts/WebsiteAssistant/WebsiteAssistant.js.map +1 -1
  156. package/esm/components/layouts/WebsiteAssistant/website-assistant.css +3 -4
  157. package/esm/components/layouts/ZoomedFullBody.js +4 -7
  158. package/esm/components/layouts/ZoomedFullBody.js.map +1 -1
  159. package/esm/components/layouts/chat.css +19 -31
  160. package/esm/components/layouts/fullpage.css +52 -19
  161. package/esm/components/layouts/zoomed-full-body.css +40 -1
  162. package/esm/helpers/constants.d.ts +3 -0
  163. package/esm/helpers/constants.js +26 -0
  164. package/esm/helpers/constants.js.map +1 -1
  165. package/esm/helpers/credits.d.ts +5 -2
  166. package/esm/helpers/credits.js +5 -1
  167. package/esm/helpers/credits.js.map +1 -1
  168. package/esm/helpers/message.d.ts +1 -1
  169. package/esm/helpers/message.js +2 -2
  170. package/esm/helpers/message.js.map +1 -1
  171. package/esm/helpers/nats/getNatsConfig.d.ts +9 -0
  172. package/esm/helpers/nats/getNatsConfig.js +61 -0
  173. package/esm/helpers/nats/getNatsConfig.js.map +1 -0
  174. package/esm/helpers/nats/isSessionExpiredError.d.ts +3 -0
  175. package/esm/helpers/nats/isSessionExpiredError.js +32 -0
  176. package/esm/helpers/nats/isSessionExpiredError.js.map +1 -0
  177. package/esm/helpers/nats/useNats.d.ts +12 -0
  178. package/esm/helpers/nats/useNats.js +72 -0
  179. package/esm/helpers/nats/useNats.js.map +1 -0
  180. package/esm/helpers/nats/useNatsSession.d.ts +28 -0
  181. package/esm/helpers/nats/useNatsSession.js +208 -0
  182. package/esm/helpers/nats/useNatsSession.js.map +1 -0
  183. package/esm/helpers/usePressTooltip.d.ts +13 -0
  184. package/esm/helpers/usePressTooltip.js +20 -0
  185. package/esm/helpers/usePressTooltip.js.map +1 -0
  186. package/esm/helpers/utils.d.ts +21 -0
  187. package/esm/helpers/utils.js +68 -3
  188. package/esm/helpers/utils.js.map +1 -1
  189. package/esm/locales/de.json +1 -0
  190. package/esm/locales/en.json +1 -0
  191. package/esm/locales/es.json +1 -0
  192. package/esm/locales/fr.json +1 -0
  193. package/esm/locales/it.json +1 -0
  194. package/esm/styles.css +1 -1
  195. package/esm/types/integration.d.ts +3 -0
  196. package/esm/types/integration.js +11 -0
  197. package/esm/types/integration.js.map +1 -0
  198. package/esm/version.d.ts +1 -1
  199. package/esm/version.js +1 -1
  200. package/package.json +6 -4
  201. package/src/components/AgeVerificationModal/AgeVerificationModal.tsx +6 -1
  202. package/src/components/Avatar/Avatar.stories.tsx +45 -28
  203. package/src/components/Avatar/Avatar.test.tsx +54 -0
  204. package/src/components/Avatar/Avatar.tsx +8 -12
  205. package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx +12 -5
  206. package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.ts +2 -1
  207. package/src/components/Avatar/AvatarView/AvatarComponent/constants.ts +16 -4
  208. package/src/components/Avatar/__snapshots__/Avatar.test.tsx.snap +164 -0
  209. package/src/components/ChatBubble/ChatBubble.tsx +41 -12
  210. package/src/components/CompletionProviderStatus/CompletionProviderStatus.tsx +8 -4
  211. package/src/components/DateSelector/DateSelector.stories.tsx +11 -2
  212. package/src/components/DateSelector/DateSelector.tsx +28 -9
  213. package/src/components/FilePreview/FilePreview.tsx +28 -7
  214. package/src/components/Header/ChatConsumptionDropdown.tsx +5 -1
  215. package/src/components/Header/Header.css +2 -1
  216. package/src/components/Header/Header.tsx +1 -0
  217. package/src/components/MediaWidget/MediaItemWidget.tsx +26 -13
  218. package/src/components/MediaWidget/MediaItemWidget.utils.test.ts +45 -2
  219. package/src/components/MediaWidget/MediaItemWidget.utils.ts +39 -6
  220. package/src/components/MediaWidget/MediaPreviewModal.tsx +9 -7
  221. package/src/components/MemoriArtifactSystem/ArtifactDrawer.stories.tsx +218 -2252
  222. package/src/components/MemoriArtifactSystem/components/ArtifactActions/styles.css +5 -4
  223. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +90 -38
  224. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.tsx +31 -14
  225. package/src/components/MemoriArtifactSystem/components/ArtifactHandler/ArtifactHandler.tsx +4 -3
  226. package/src/components/MemoriWidget/MemoriWidget.tsx +785 -331
  227. package/src/components/StartPanel/StartPanel.stories.tsx +22 -0
  228. package/src/components/StartPanel/StartPanel.test.tsx +64 -1
  229. package/src/components/StartPanel/StartPanel.tsx +26 -3
  230. package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +261 -0
  231. package/src/components/UploadButton/UploadButton.tsx +30 -11
  232. package/src/components/UploadButton/UploadDocuments/UploadDocuments.tsx +148 -61
  233. package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +2 -2
  234. package/src/components/layouts/Chat.tsx +16 -19
  235. package/src/components/layouts/FullPage.tsx +32 -25
  236. package/src/components/layouts/HiddenChat.tsx +4 -0
  237. package/src/components/layouts/WebsiteAssistant/WebsiteAssistant.tsx +8 -0
  238. package/src/components/layouts/WebsiteAssistant/website-assistant.css +3 -4
  239. package/src/components/layouts/ZoomedFullBody.tsx +30 -24
  240. package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +6 -3
  241. package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +824 -810
  242. package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +280 -273
  243. package/src/components/layouts/chat.css +19 -31
  244. package/src/components/layouts/fullpage.css +52 -19
  245. package/src/components/layouts/layouts.stories.tsx +131 -12
  246. package/src/components/layouts/zoomed-full-body.css +40 -1
  247. package/src/helpers/constants.ts +32 -1
  248. package/src/helpers/credits.ts +16 -1
  249. package/src/helpers/message.test.ts +28 -1
  250. package/src/helpers/message.ts +4 -4
  251. package/src/helpers/nats/getNatsConfig.ts +145 -0
  252. package/src/helpers/nats/isSessionExpiredError.test.ts +38 -0
  253. package/src/helpers/nats/isSessionExpiredError.ts +51 -0
  254. package/src/helpers/nats/useNats.ts +124 -0
  255. package/src/helpers/nats/useNatsSession.ts +394 -0
  256. package/src/helpers/usePressTooltip.ts +29 -0
  257. package/src/helpers/utils.test.ts +162 -0
  258. package/src/helpers/utils.ts +108 -3
  259. package/src/index.stories.tsx +32 -0
  260. package/src/locales/de.json +1 -0
  261. package/src/locales/en.json +1 -0
  262. package/src/locales/es.json +1 -0
  263. package/src/locales/fr.json +1 -0
  264. package/src/locales/it.json +1 -0
  265. package/src/styles.css +4 -7
  266. package/src/types/integration.test.ts +32 -0
  267. package/src/types/integration.ts +31 -0
  268. package/src/version.ts +1 -1
@@ -37,6 +37,8 @@ import { sanitizeText } from '../../helpers/sanitizer';
37
37
  import { useTTS } from '../../helpers/tts/useTTS';
38
38
  import ChatHistoryDrawer from '../ChatHistoryDrawer/ChatHistory';
39
39
  import { useSTT } from '../../helpers/stt/useSTT';
40
+ import { useNats } from '../../helpers/nats/useNats';
41
+ import { isSessionExpiredNatsError, isSessionExpiredNatsResponse, } from '../../helpers/nats/isSessionExpiredError';
40
42
  const getMemoriState = (integrationId) => {
41
43
  var _a, _b, _c, _d, _f;
42
44
  let widget = integrationId
@@ -58,12 +60,23 @@ const getMemoriState = (integrationId) => {
58
60
  loginToken,
59
61
  };
60
62
  };
63
+ const resolveLoginTokenValue = (loginToken, userTokenRef, callAdditionalInfoLoginToken, additionalInfoLoginToken, authTokenProp) => {
64
+ var _a, _b, _c;
65
+ return (_c = (_b = (_a = loginToken !== null && loginToken !== void 0 ? loginToken : userTokenRef) !== null && _a !== void 0 ? _a : callAdditionalInfoLoginToken) !== null && _b !== void 0 ? _b : additionalInfoLoginToken) !== null && _c !== void 0 ? _c : authTokenProp;
66
+ };
61
67
  const NULL_PLACE_SPEC = {
62
68
  placeName: null,
63
69
  latitude: null,
64
70
  longitude: null,
65
71
  uncertaintyKm: null,
66
72
  };
73
+ const logWidgetError = (context, detail) => {
74
+ console.error(`[MemoriWidget] ${context}`, detail !== null && detail !== void 0 ? detail : '');
75
+ };
76
+ function readCorrelationID(response) {
77
+ const value = response.correlationID;
78
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
79
+ }
67
80
  const typeMessage = (message, waitForPrevious = true, hidden = false, typingText, useLoaderTextAsMsg = false, hasBatchQueued = false) => {
68
81
  const e = new CustomEvent('MemoriTextEntered', {
69
82
  detail: {
@@ -159,7 +172,6 @@ window.typeMessageHidden = typeMessageHidden;
159
172
  window.typeBatchMessages = typeBatchMessages;
160
173
  let audioContext;
161
174
  let memoriPassword;
162
- let userToken;
163
175
  export function getChatStyles(config) {
164
176
  var _a;
165
177
  const primary = config === null || config === void 0 ? void 0 : config.buttonBgColor;
@@ -193,7 +205,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
193
205
  setIsClient(true);
194
206
  }, []);
195
207
  const client = memoriApiClient(apiURL, engineURL);
196
- const { initSession, deleteSession, postTextEnteredEvent, postPlaceChangedEvent, postDateChangedEvent, postTagChangedEvent, getSession, getExpertReferences, getSessionChatLogs, } = client;
208
+ const { initSession, deleteSession, postEnterTextAsync, postTextEnteredEvent, postPlaceChangedEvent, postDateChangedEvent, postTagChangedEvent, getSession, getExpertReferences, getSessionChatLogs, } = client;
197
209
  const [instruct, setInstruct] = useState(false);
198
210
  const [enableFocusChatInput, setEnableFocusChatInput] = useState(true);
199
211
  const [widgetRootEl, setWidgetRootEl] = useState(null);
@@ -216,35 +228,64 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
216
228
  return () => observer.disconnect();
217
229
  }, [widgetRootEl]);
218
230
  const [loginToken, setLoginToken] = useState((_a = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _a !== void 0 ? _a : authToken);
231
+ const userTokenRef = useRef((_b = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _b !== void 0 ? _b : authToken);
232
+ const prevPropsLoginTokenRef = useRef((_c = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _c !== void 0 ? _c : authToken);
219
233
  const [user, setUser] = useState({
220
234
  avatarURL: typeof userAvatar === 'string' ? userAvatar : undefined,
221
235
  });
236
+ const resolveLoginToken = useCallback((callAdditionalInfoLoginToken) => resolveLoginTokenValue(loginToken, userTokenRef.current, callAdditionalInfoLoginToken, additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken, authToken), [loginToken, additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken, authToken]);
222
237
  useEffect(() => {
223
- if (loginToken &&
224
- !(user === null || user === void 0 ? void 0 : user.userID) &&
225
- (showLogin || memori.requireLoginToken)) {
226
- client.backend
227
- .pwlGetCurrentUser(loginToken)
228
- .then(({ user, resultCode }) => {
229
- if (user && resultCode === 0) {
230
- setUser(user);
231
- setLocalConfig('loginToken', loginToken);
232
- if (!birthDate && user.birthDate) {
233
- setBirthDate(user.birthDate);
234
- setLocalConfig('birthDate', user.birthDate);
235
- }
236
- }
237
- else {
238
- removeLocalConfig('loginToken');
239
- }
240
- });
238
+ var _a;
239
+ const incomingToken = (_a = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _a !== void 0 ? _a : authToken;
240
+ const prevPropsToken = prevPropsLoginTokenRef.current;
241
+ prevPropsLoginTokenRef.current = incomingToken;
242
+ if (incomingToken !== prevPropsToken) {
243
+ setLoginToken(incomingToken);
244
+ userTokenRef.current = incomingToken;
245
+ if (!incomingToken) {
246
+ removeLocalConfig('loginToken');
247
+ setUser(undefined);
248
+ }
241
249
  }
242
- }, [loginToken, user === null || user === void 0 ? void 0 : user.userID]);
250
+ }, [additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken, authToken]);
251
+ useEffect(() => {
252
+ if (!loginToken || !(showLogin || memori.requireLoginToken)) {
253
+ return;
254
+ }
255
+ let cancelled = false;
256
+ client.backend
257
+ .pwlGetCurrentUser(loginToken)
258
+ .then(({ user: fetchedUser, resultCode }) => {
259
+ if (cancelled)
260
+ return;
261
+ if (fetchedUser && resultCode === 0) {
262
+ setUser(fetchedUser);
263
+ setLocalConfig('loginToken', loginToken);
264
+ userTokenRef.current = loginToken;
265
+ if (!birthDate && fetchedUser.birthDate) {
266
+ setBirthDate(fetchedUser.birthDate);
267
+ setLocalConfig('birthDate', fetchedUser.birthDate);
268
+ }
269
+ }
270
+ else {
271
+ setLoginToken(undefined);
272
+ userTokenRef.current = undefined;
273
+ setUser(undefined);
274
+ removeLocalConfig('loginToken');
275
+ }
276
+ });
277
+ return () => {
278
+ cancelled = true;
279
+ };
280
+ }, [loginToken, showLogin, memori.requireLoginToken]);
243
281
  const [showLoginDrawer, setShowLoginDrawer] = useState(false);
244
282
  const [clickedStart, setClickedStart] = useState(false);
245
283
  const [gotErrorInOpening, setGotErrorInOpening] = useState(false);
246
- const language = ((_d = (_c = (_b = memori.culture) === null || _b === void 0 ? void 0 : _b.split('-')) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.toUpperCase()) ||
247
- ((_j = (_h = (_g = (_f = memoriConfigs === null || memoriConfigs === void 0 ? void 0 : memoriConfigs.find(c => c.memoriConfigID === memori.memoriConfigurationID)) === null || _f === void 0 ? void 0 : _f.culture) === null || _g === void 0 ? void 0 : _g.split('-')) === null || _h === void 0 ? void 0 : _h[0]) === null || _j === void 0 ? void 0 : _j.toUpperCase());
284
+ const sessionStartingRef = useRef(false);
285
+ const needsCredits = tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation;
286
+ const [hasEnoughCredits, setHasEnoughCredits] = useState(true);
287
+ const language = ((_g = (_f = (_d = memori.culture) === null || _d === void 0 ? void 0 : _d.split('-')) === null || _f === void 0 ? void 0 : _f[0]) === null || _g === void 0 ? void 0 : _g.toUpperCase()) ||
288
+ ((_l = (_k = (_j = (_h = memoriConfigs === null || memoriConfigs === void 0 ? void 0 : memoriConfigs.find(c => c.memoriConfigID === memori.memoriConfigurationID)) === null || _h === void 0 ? void 0 : _h.culture) === null || _j === void 0 ? void 0 : _j.split('-')) === null || _k === void 0 ? void 0 : _k[0]) === null || _l === void 0 ? void 0 : _l.toUpperCase());
248
289
  const integrationConfig = (integration === null || integration === void 0 ? void 0 : integration.customData)
249
290
  ? JSON.parse(integration.customData)
250
291
  : null;
@@ -252,7 +293,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
252
293
  ? multilingual
253
294
  : !!(integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.multilanguage);
254
295
  const forcedTimeout = integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.forcedTimeout;
255
- const [userLang, setUserLang] = useState((_p = (_o = (_m = (_l = (_k = spokenLang !== null && spokenLang !== void 0 ? spokenLang : memoriLang) !== null && _k !== void 0 ? _k : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.lang) !== null && _l !== void 0 ? _l : language) !== null && _m !== void 0 ? _m : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.uiLang) !== null && _o !== void 0 ? _o : i18n.language) !== null && _p !== void 0 ? _p : 'IT');
296
+ const [userLang, setUserLang] = useState((_r = (_q = (_p = (_o = (_m = spokenLang !== null && spokenLang !== void 0 ? spokenLang : memoriLang) !== null && _m !== void 0 ? _m : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.lang) !== null && _o !== void 0 ? _o : language) !== null && _p !== void 0 ? _p : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.uiLang) !== null && _q !== void 0 ? _q : i18n.language) !== null && _r !== void 0 ? _r : 'IT');
256
297
  useEffect(() => {
257
298
  if (spokenLang != null) {
258
299
  setUserLang(spokenLang);
@@ -278,6 +319,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
278
319
  const [loading, setLoading] = useState(false);
279
320
  const [memoriTyping, setMemoriTyping] = useState(false);
280
321
  const [typingText, setTypingText] = useState();
322
+ const pendingEnterTextRef = useRef(new Map());
323
+ const bufferedNatsResponsesRef = useRef(new Map());
281
324
  const layoutName = typeof layout === 'string'
282
325
  ? layout
283
326
  : layout &&
@@ -288,7 +331,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
288
331
  ? layout.name
289
332
  : typeof (integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === 'string'
290
333
  ? integrationConfig.layout
291
- : (_q = integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === null || _q === void 0 ? void 0 : _q.name;
334
+ : (_s = integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === null || _s === void 0 ? void 0 : _s.name;
292
335
  const selectedLayout = (() => {
293
336
  if (typeof layoutName === 'string') {
294
337
  const lower = layoutName.toLowerCase();
@@ -316,14 +359,14 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
316
359
  typeof layout === 'object' &&
317
360
  layout !== null &&
318
361
  'piiDetection' in layout &&
319
- ((_r = layout.piiDetection) === null || _r === void 0 ? void 0 : _r.enabled)
362
+ ((_t = layout.piiDetection) === null || _t === void 0 ? void 0 : _t.enabled)
320
363
  ? layout.piiDetection
321
364
  : typeof (integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === 'object' &&
322
365
  (integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) !== null &&
323
- ((_t = (_s = integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === null || _s === void 0 ? void 0 : _s.piiDetection) === null || _t === void 0 ? void 0 : _t.enabled)
366
+ ((_v = (_u = integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === null || _u === void 0 ? void 0 : _u.piiDetection) === null || _v === void 0 ? void 0 : _v.enabled)
324
367
  ? integrationConfig.layout.piiDetection
325
368
  : undefined;
326
- const defaultEnableAudio = (_u = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _u !== void 0 ? _u : true;
369
+ const defaultEnableAudio = (_w = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _w !== void 0 ? _w : true;
327
370
  const [hasUserActivatedListening, setHasUserActivatedListening] = useState(false);
328
371
  const [hasUserTypedMessage, setHasUserTypedMessage] = useState(false);
329
372
  const [positionPopoverOpen, setPositionPopoverOpenState] = useState(false);
@@ -366,7 +409,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
366
409
  setRuntimeShowMessageConsumption(getLocalConfig('showMessageConsumption', (_a = showMessageConsumption !== null && showMessageConsumption !== void 0 ? showMessageConsumption : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showMessageConsumption) !== null && _a !== void 0 ? _a : false));
367
410
  if (!(additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) && !authToken) {
368
411
  setLoginToken(getLocalConfig('loginToken', undefined));
369
- userToken = getLocalConfig('loginToken', undefined);
412
+ userTokenRef.current = getLocalConfig('loginToken', undefined);
370
413
  setBirthDate(getLocalConfig('birthDate', undefined));
371
414
  }
372
415
  if (!((_b = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _b !== void 0 ? _b : true)) {
@@ -464,8 +507,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
464
507
  });
465
508
  };
466
509
  const [chatLogID, setChatLogID] = useState(undefined);
467
- const sendMessage = async (text, media, newSessionId, translate = true, translatedText, hidden = false, typingText, useLoaderTextAsMsg = false, hasBatchQueued = false) => {
468
- var _a, _b, _c, _d, _f, _g;
510
+ const sendMessage = async (text, media, newSessionId, translate = true, translatedText, hidden = false, typingText, useLoaderTextAsMsg = false, hasBatchQueued = false, skipHistoryPush = false) => {
511
+ var _a, _b;
469
512
  const sessionID = newSessionId ||
470
513
  sessionId ||
471
514
  ((_a = window.getMemoriState()) === null || _a === void 0 ? void 0 : _a.sessionID);
@@ -509,7 +552,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
509
552
  return;
510
553
  }
511
554
  }
512
- if (!hidden)
555
+ if (!hidden && !skipHistoryPush)
513
556
  pushMessage({
514
557
  text: text,
515
558
  translatedText,
@@ -519,12 +562,10 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
519
562
  ? !!newSessionId && newSessionId !== sessionId
520
563
  : !!newSessionId,
521
564
  });
522
- setMemoriTyping(true);
523
- setTypingText(typingText);
524
565
  let gotError = false;
525
566
  try {
526
567
  const placeSpec = getPlaceSpecForEnterText(position);
527
- const { currentState, ...response } = await postTextEnteredEvent({
568
+ const response = await postEnterTextAsync({
528
569
  sessionId: sessionID,
529
570
  text: msg,
530
571
  ...(memori.needsDateTime && {
@@ -532,65 +573,37 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
532
573
  }),
533
574
  ...(placeSpec !== undefined && { place: placeSpec }),
534
575
  });
535
- if (response.resultCode === 0 && currentState) {
536
- setChatLogID(undefined);
537
- const emission = useLoaderTextAsMsg && typingText
538
- ? typingText
539
- : (_c = currentState.emission) !== null && _c !== void 0 ? _c : currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.emission;
540
- if (userLang.toLowerCase() !== language.toLowerCase() &&
541
- emission &&
542
- isMultilanguageEnabled) {
543
- currentState.emission = emission;
544
- translateDialogState(currentState, userLang, msg).then(ts => {
545
- let text = ts.translatedEmission || ts.emission;
546
- if (text && shouldPlayAudio(text)) {
547
- handleSpeak(text);
548
- }
549
- });
550
- }
551
- else {
552
- setCurrentDialogState({
553
- ...currentState,
554
- emission,
555
- });
556
- if (emission) {
557
- pushMessage({
558
- text: emission,
559
- emitter: currentState.emitter,
560
- media: (_d = currentState.emittedMedia) !== null && _d !== void 0 ? _d : currentState.media,
561
- llmUsage: currentState.llmUsage,
562
- fromUser: false,
563
- questionAnswered: msg,
564
- generatedByAI: !!currentState.completion,
565
- contextVars: currentState.contextVars,
566
- date: currentState.currentDate,
567
- placeName: currentState.currentPlaceName,
568
- placeLatitude: currentState.currentLatitude,
569
- placeLongitude: currentState.currentLongitude,
570
- placeUncertaintyKm: currentState.currentUncertaintyKm,
571
- tag: currentState.currentTag,
572
- memoryTags: currentState.memoryTags,
573
- });
574
- if (emission && shouldPlayAudio(emission)) {
575
- handleSpeak(emission);
576
- }
577
- }
578
- }
576
+ const correlationID = readCorrelationID(response);
577
+ if (response.resultCode === 0 && correlationID) {
578
+ registerPendingEnterText(correlationID, {
579
+ msg,
580
+ text,
581
+ media,
582
+ translate,
583
+ translatedText,
584
+ hidden,
585
+ typingText,
586
+ useLoaderTextAsMsg,
587
+ hasBatchQueued,
588
+ });
589
+ setMemoriTyping(true);
590
+ setTypingText(typingText);
591
+ }
592
+ else if (response.resultCode === 0) {
593
+ logWidgetError('enter-text missing correlationID', response);
579
594
  }
580
595
  else if (response.resultCode === 404) {
581
- setHistory(h => [...h.slice(0, h.length - 1)]);
582
- reopenSession(true, memoriPwd || memori.secretToken, memoriTokens, undefined, undefined, {
583
- LANG: userLang,
584
- PATHNAME: window.location.pathname,
585
- ROUTE: ((_g = (_f = window.location.pathname) === null || _f === void 0 ? void 0 : _f.split('/')) === null || _g === void 0 ? void 0 : _g.pop()) || '',
586
- ...(initialContextVars || {}),
587
- }, initialQuestion, undefined, undefined, undefined, undefined, true).then(state => {
588
- console.info('session timeout');
589
- if (state === null || state === void 0 ? void 0 : state.sessionID) {
590
- setTimeout(() => {
591
- sendMessage(text, media, state === null || state === void 0 ? void 0 : state.sessionID);
592
- }, 500);
593
- }
596
+ retryAfterExpiredSessionRef.current({
597
+ text,
598
+ media,
599
+ translate,
600
+ translatedText,
601
+ hidden,
602
+ typingText,
603
+ useLoaderTextAsMsg,
604
+ hasBatchQueued,
605
+ expiredSessionID: sessionID,
606
+ continueFromChatLogID: chatLogID,
594
607
  });
595
608
  }
596
609
  else if (response.resultCode === 500 && response.resultMessage) {
@@ -607,18 +620,12 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
607
620
  ]);
608
621
  }
609
622
  else {
610
- console.warn('[SEND_MESSAGE]', response);
611
623
  return Promise.reject(response);
612
624
  }
613
625
  }
614
626
  catch (error) {
615
- console.log('error', error);
616
- console.error(error);
617
627
  gotError = true;
618
- setTypingText(undefined);
619
- setMemoriTyping(false);
620
- }
621
- if (!hasBatchQueued) {
628
+ logWidgetError('sendMessage failed', error);
622
629
  setTypingText(undefined);
623
630
  setMemoriTyping(false);
624
631
  }
@@ -700,7 +707,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
700
707
  }
701
708
  }
702
709
  catch (error) {
703
- console.error('[TRANSLATE] Error during translation:', error);
704
710
  translatedState = { ...state, emission };
705
711
  translatedMsg = {
706
712
  text: emission,
@@ -808,7 +814,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
808
814
  try {
809
815
  setTimeout(() => {
810
816
  var _a;
811
- console.log('snippet', s);
812
817
  new Function((_a = s.content) !== null && _a !== void 0 ? _a : '')();
813
818
  setTimeout(() => {
814
819
  var _a, _b, _c;
@@ -817,8 +822,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
817
822
  }, 400);
818
823
  }, 1000);
819
824
  }
820
- catch (e) {
821
- console.warn(e);
825
+ catch (_a) {
822
826
  }
823
827
  });
824
828
  };
@@ -829,7 +833,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
829
833
  }
830
834
  }, [initialSessionID]);
831
835
  const fetchSession = async (params) => {
832
- var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l;
836
+ var _a, _b, _c, _d, _f, _g, _h;
833
837
  let storageBirthDate = getLocalConfig('birthDate', undefined);
834
838
  let userBirthDate = (_a = birthDate !== null && birthDate !== void 0 ? birthDate : params.birthDate) !== null && _a !== void 0 ? _a : storageBirthDate;
835
839
  if (!userBirthDate && !!minAge) {
@@ -843,6 +847,9 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
843
847
  setAuthModalState('password');
844
848
  return;
845
849
  }
850
+ if (!(await checkCredits({ notify: true }))) {
851
+ return;
852
+ }
846
853
  setLoading(true);
847
854
  try {
848
855
  let referral;
@@ -851,8 +858,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
851
858
  return window.location.href;
852
859
  })();
853
860
  }
854
- catch (err) {
855
- console.debug(err);
861
+ catch (_j) {
856
862
  }
857
863
  const session = await initSession({
858
864
  ...params,
@@ -861,8 +867,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
861
867
  pin: (_c = params.pin) !== null && _c !== void 0 ? _c : personification === null || personification === void 0 ? void 0 : personification.pin,
862
868
  additionalInfo: {
863
869
  ...(params.additionalInfo || additionalInfo || {}),
864
- loginToken: (_h = (_g = (_d = userToken !== null && userToken !== void 0 ? userToken : loginToken) !== null && _d !== void 0 ? _d : (_f = params.additionalInfo) === null || _f === void 0 ? void 0 : _f.loginToken) !== null && _g !== void 0 ? _g : additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _h !== void 0 ? _h : authToken,
865
- language: ((_l = userLang !== null && userLang !== void 0 ? userLang : (_k = (_j = memori.culture) === null || _j === void 0 ? void 0 : _j.split('-')) === null || _k === void 0 ? void 0 : _k[0]) !== null && _l !== void 0 ? _l : 'IT').toLowerCase(),
870
+ loginToken: resolveLoginToken((_d = params.additionalInfo) === null || _d === void 0 ? void 0 : _d.loginToken),
871
+ language: ((_h = userLang !== null && userLang !== void 0 ? userLang : (_g = (_f = memori.culture) === null || _f === void 0 ? void 0 : _f.split('-')) === null || _g === void 0 ? void 0 : _g[0]) !== null && _h !== void 0 ? _h : 'IT').toLowerCase(),
866
872
  referral: referral,
867
873
  timeZoneOffset: new Date().getTimezoneOffset().toString(),
868
874
  },
@@ -891,7 +897,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
891
897
  }));
892
898
  setGotErrorInOpening(true);
893
899
  }
894
- else if ((session === null || session === void 0 ? void 0 : session.resultCode) === 403) {
900
+ else if ((session === null || session === void 0 ? void 0 : session.resultCode) === 403 && memori.privacyType !== 'PUBLIC') {
895
901
  setMemoriPwd(undefined);
896
902
  setAuthModalState('password');
897
903
  return session;
@@ -903,16 +909,15 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
903
909
  severity: 'error',
904
910
  duration: 0,
905
911
  }));
906
- setGotErrorInOpening(true);
907
912
  return session;
908
913
  }
909
914
  }
910
915
  catch (err) {
911
- console.error(err);
916
+ logWidgetError('fetchSession failed', err);
912
917
  }
913
918
  };
914
- const reopenSession = async (updateDialogState = false, password, recoveryTokens, tag, pin, initialContextVars, initialQuestion, birthDate, additionalInfoProp, continueFromChatLogID, continueFromSessionID, isSessionExpired) => {
915
- var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l, _m;
919
+ const reopenSession = async (updateDialogState = false, password, recoveryTokens, tag, pin, initialContextVars, initialQuestion, birthDate, additionalInfoProp, continueFromChatLogID, continueFromSessionID, isSessionExpired, suppressHistoryUpdate) => {
920
+ var _a, _b, _c, _d, _f, _g, _h, _j;
916
921
  setLoading(true);
917
922
  let storageBirthDate = getLocalConfig('birthDate', undefined);
918
923
  let userBirthDate = birthDate !== null && birthDate !== void 0 ? birthDate : storageBirthDate;
@@ -930,14 +935,17 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
930
935
  setAuthModalState('password');
931
936
  return;
932
937
  }
938
+ if (!(await checkCredits({ notify: true }))) {
939
+ setLoading(false);
940
+ return null;
941
+ }
933
942
  let referral;
934
943
  try {
935
944
  referral = (() => {
936
945
  return window.location.href;
937
946
  })();
938
947
  }
939
- catch (err) {
940
- console.debug('[REOPEN_SESSION] Error getting referral:', err);
948
+ catch (_k) {
941
949
  }
942
950
  const { sessionID, currentState, ...response } = await initSession({
943
951
  memoriID: (_a = memori.engineMemoriID) !== null && _a !== void 0 ? _a : '',
@@ -957,21 +965,32 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
957
965
  birthDate: userBirthDate,
958
966
  additionalInfo: {
959
967
  ...(additionalInfoProp || additionalInfo || {}),
960
- loginToken: (_g = (_f = (_d = userToken !== null && userToken !== void 0 ? userToken : loginToken) !== null && _d !== void 0 ? _d : additionalInfoProp === null || additionalInfoProp === void 0 ? void 0 : additionalInfoProp.loginToken) !== null && _f !== void 0 ? _f : additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _g !== void 0 ? _g : authToken,
961
- language: ((_k = userLang !== null && userLang !== void 0 ? userLang : (_j = (_h = memori.culture) === null || _h === void 0 ? void 0 : _h.split('-')) === null || _j === void 0 ? void 0 : _j[0]) !== null && _k !== void 0 ? _k : 'IT').toLowerCase(),
968
+ loginToken: resolveLoginToken(additionalInfoProp === null || additionalInfoProp === void 0 ? void 0 : additionalInfoProp.loginToken),
969
+ language: ((_g = userLang !== null && userLang !== void 0 ? userLang : (_f = (_d = memori.culture) === null || _d === void 0 ? void 0 : _d.split('-')) === null || _f === void 0 ? void 0 : _f[0]) !== null && _g !== void 0 ? _g : 'IT').toLowerCase(),
962
970
  referral: referral,
963
971
  timeZoneOffset: new Date().getTimezoneOffset().toString(),
964
972
  },
965
973
  });
966
974
  if (sessionID && currentState && response.resultCode === 0) {
967
- console.log('[REOPEN_SESSION] Session initialized successfully:', sessionID);
968
975
  setSessionId(sessionID);
969
976
  if (updateDialogState) {
970
977
  setCurrentDialogState(currentState);
971
- if (currentState.emission) {
972
- console.log('[REOPEN_SESSION] Processing emission:', currentState.emission);
973
- const initialStatus = isSessionExpired && history.length > 1
974
- ? 'Session Expired, reopening session'
978
+ const sessionExpiredStatus = isSessionExpired && history.length > 1
979
+ ? t('sessionExpiredReopening')
980
+ : null;
981
+ if (sessionExpiredStatus && suppressHistoryUpdate) {
982
+ pushMessage({
983
+ text: '',
984
+ emitter: 'system',
985
+ fromUser: false,
986
+ initial: sessionExpiredStatus,
987
+ contextVars: {},
988
+ date: new Date().toISOString(),
989
+ });
990
+ }
991
+ if (currentState.emission && !suppressHistoryUpdate) {
992
+ const initialStatus = sessionExpiredStatus
993
+ ? sessionExpiredStatus
975
994
  : history.length <= 1
976
995
  ? true
977
996
  : undefined;
@@ -980,7 +999,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
980
999
  {
981
1000
  text: currentState.emission,
982
1001
  emitter: currentState.emitter,
983
- media: (_l = currentState.emittedMedia) !== null && _l !== void 0 ? _l : currentState.media,
1002
+ media: (_h = currentState.emittedMedia) !== null && _h !== void 0 ? _h : currentState.media,
984
1003
  fromUser: false,
985
1004
  initial: (initialStatus === true
986
1005
  ? true
@@ -998,7 +1017,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
998
1017
  : pushMessage({
999
1018
  text: currentState.emission,
1000
1019
  emitter: currentState.emitter,
1001
- media: (_m = currentState.emittedMedia) !== null && _m !== void 0 ? _m : currentState.media,
1020
+ media: (_j = currentState.emittedMedia) !== null && _j !== void 0 ? _j : currentState.media,
1002
1021
  fromUser: false,
1003
1022
  initial: (initialStatus === true
1004
1023
  ? true
@@ -1028,8 +1047,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1028
1047
  }));
1029
1048
  setGotErrorInOpening(true);
1030
1049
  }
1031
- else if ((response === null || response === void 0 ? void 0 : response.resultCode) === 403) {
1032
- console.error('[REOPEN_SESSION] Authentication error');
1050
+ else if ((response === null || response === void 0 ? void 0 : response.resultCode) === 403 &&
1051
+ memori.privacyType !== 'PUBLIC') {
1033
1052
  setMemoriPwd(undefined);
1034
1053
  setAuthModalState('password');
1035
1054
  }
@@ -1043,15 +1062,61 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1043
1062
  }
1044
1063
  }
1045
1064
  catch (err) {
1046
- console.error('[REOPEN_SESSION] Caught error:', err);
1065
+ logWidgetError('reopenSession failed', err);
1047
1066
  }
1048
1067
  setLoading(false);
1049
1068
  return null;
1050
1069
  };
1070
+ const retryAfterExpiredSessionRef = useRef(() => Promise.resolve(null));
1071
+ retryAfterExpiredSessionRef.current = (params) => {
1072
+ const { text, media, translate = true, translatedText, hidden = false, typingText, useLoaderTextAsMsg = false, hasBatchQueued = false, expiredSessionID, continueFromChatLogID: continueFromChatLogIDParam, } = params;
1073
+ const continueFromSessionID = expiredSessionID !== null && expiredSessionID !== void 0 ? expiredSessionID : sessionId;
1074
+ const continueFromChatLogID = continueFromChatLogIDParam !== null && continueFromChatLogIDParam !== void 0 ? continueFromChatLogIDParam : chatLogID;
1075
+ const reopenAfterExpiry = () => {
1076
+ var _a, _b;
1077
+ return reopenSession(true, memoriPwd || memori.secretToken, memoriTokens, undefined, undefined, {
1078
+ LANG: userLang,
1079
+ PATHNAME: window.location.pathname,
1080
+ ROUTE: ((_b = (_a = window.location.pathname) === null || _a === void 0 ? void 0 : _a.split('/')) === null || _b === void 0 ? void 0 : _b.pop()) || '',
1081
+ ...(initialContextVars || {}),
1082
+ }, initialQuestion, undefined, undefined, continueFromChatLogID, continueFromSessionID, true, true);
1083
+ };
1084
+ const scheduleRetry = (newSessionID) => {
1085
+ setTimeout(() => {
1086
+ sendMessage(text, media, newSessionID, translate, translatedText, hidden, typingText, useLoaderTextAsMsg, hasBatchQueued, true);
1087
+ }, 500);
1088
+ };
1089
+ const handleReopenFailure = (state) => {
1090
+ setMemoriTyping(false);
1091
+ setTypingText(undefined);
1092
+ if (state === null && text && !hidden) {
1093
+ add(createAlertOptions({
1094
+ description: t('errors.SESSION_EXPIRED'),
1095
+ severity: 'error',
1096
+ }));
1097
+ }
1098
+ };
1099
+ if (!text) {
1100
+ return reopenAfterExpiry().then(state => {
1101
+ if (!(state === null || state === void 0 ? void 0 : state.sessionID)) {
1102
+ handleReopenFailure(state);
1103
+ }
1104
+ return state;
1105
+ });
1106
+ }
1107
+ return reopenAfterExpiry().then(state => {
1108
+ if (state === null || state === void 0 ? void 0 : state.sessionID) {
1109
+ scheduleRetry(state.sessionID);
1110
+ }
1111
+ else {
1112
+ handleReopenFailure(state);
1113
+ }
1114
+ return state;
1115
+ });
1116
+ };
1051
1117
  const changeTag = async (memoriId, sessionId, tag, pin) => {
1052
- var _a, _b, _c, _d, _f, _g, _h, _j, _k;
1118
+ var _a, _b, _c, _d, _f, _g, _h;
1053
1119
  if (!memoriId || !sessionId) {
1054
- console.error('CHANGETAG/Session not found');
1055
1120
  return Promise.reject('Session not found');
1056
1121
  }
1057
1122
  try {
@@ -1083,7 +1148,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1083
1148
  }
1084
1149
  }
1085
1150
  else if ([400, 401, 403, 404, 500].includes(resultCode)) {
1086
- console.warn('[APPCONTEXT/CHANGETAG]', resultCode);
1087
1151
  let storageBirthDate = getLocalConfig('birthDate', undefined);
1088
1152
  let referral;
1089
1153
  try {
@@ -1091,8 +1155,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1091
1155
  return window.location.href;
1092
1156
  })();
1093
1157
  }
1094
- catch (err) {
1095
- console.debug(err);
1158
+ catch (_j) {
1096
1159
  }
1097
1160
  fetchSession({
1098
1161
  memoriID: (_b = memori.engineMemoriID) !== null && _b !== void 0 ? _b : '',
@@ -1109,8 +1172,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1109
1172
  birthDate: birthDate || storageBirthDate || undefined,
1110
1173
  additionalInfo: {
1111
1174
  ...(additionalInfo || {}),
1112
- loginToken: (_g = (_f = userToken !== null && userToken !== void 0 ? userToken : loginToken) !== null && _f !== void 0 ? _f : additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _g !== void 0 ? _g : authToken,
1113
- language: ((_k = userLang !== null && userLang !== void 0 ? userLang : (_j = (_h = memori.culture) === null || _h === void 0 ? void 0 : _h.split('-')) === null || _j === void 0 ? void 0 : _j[0]) !== null && _k !== void 0 ? _k : 'IT').toLowerCase(),
1175
+ loginToken: resolveLoginToken(),
1176
+ language: ((_h = userLang !== null && userLang !== void 0 ? userLang : (_g = (_f = memori.culture) === null || _f === void 0 ? void 0 : _f.split('-')) === null || _g === void 0 ? void 0 : _g[0]) !== null && _h !== void 0 ? _h : 'IT').toLowerCase(),
1114
1177
  referral: referral,
1115
1178
  timeZoneOffset: new Date().getTimezoneOffset().toString(),
1116
1179
  },
@@ -1127,7 +1190,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1127
1190
  }
1128
1191
  catch (_e) {
1129
1192
  let err = _e;
1130
- console.warn('[APPCONTEXT/CHANGETAG]', err);
1131
1193
  return Promise.reject(err);
1132
1194
  }
1133
1195
  return null;
@@ -1148,6 +1210,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1148
1210
  return () => {
1149
1211
  setHasUserActivatedSpeak(false);
1150
1212
  setClickedStart(false);
1213
+ sessionStartingRef.current = false;
1151
1214
  clearInteractionTimeout();
1152
1215
  timeoutRef.current = undefined;
1153
1216
  };
@@ -1174,10 +1237,9 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1174
1237
  apiUrl: `${baseUrl}/api/tts`,
1175
1238
  continuousSpeech: continuousSpeech,
1176
1239
  preview: preview,
1177
- }, autoStart, defaultEnableAudio, (_v = defaultSpeakerActive !== null && defaultSpeakerActive !== void 0 ? defaultSpeakerActive : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.defaultSpeakerActive) !== null && _v !== void 0 ? _v : true);
1240
+ }, autoStart, defaultEnableAudio, (_x = defaultSpeakerActive !== null && defaultSpeakerActive !== void 0 ? defaultSpeakerActive : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.defaultSpeakerActive) !== null && _x !== void 0 ? _x : true);
1178
1241
  const shouldPlayAudio = (text) => {
1179
1242
  const currentSpeakerMuted = getLocalConfig('muteSpeaker', !defaultEnableAudio);
1180
- console.log('[MemoriWidget] shouldPlayAudio', currentSpeakerMuted);
1181
1243
  return (text &&
1182
1244
  text.trim() &&
1183
1245
  !preview &&
@@ -1190,15 +1252,12 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1190
1252
  }
1191
1253
  try {
1192
1254
  const message = stripDuplicates(text);
1193
- console.debug('Processing speech message:', message);
1194
1255
  if (message.length > 0) {
1195
1256
  setUserMessage('');
1196
- console.debug('Sending message:', message);
1197
1257
  sendMessage(message);
1198
1258
  }
1199
1259
  }
1200
- catch (error) {
1201
- console.error('Error in processSpeechAndSendMessage:', error);
1260
+ catch (_a) {
1202
1261
  }
1203
1262
  };
1204
1263
  const { isListening, startRecording, stopRecording, } = useSTT(sttConfig, processSpeechAndSendMessage, {
@@ -1232,8 +1291,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1232
1291
  }
1233
1292
  return translatedState;
1234
1293
  }
1235
- catch (error) {
1236
- console.error('Error in translateAndSpeak:', error);
1294
+ catch (_a) {
1237
1295
  if (!hasUserActivatedSpeak) {
1238
1296
  setHasUserActivatedSpeak(true);
1239
1297
  }
@@ -1246,6 +1304,221 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1246
1304
  setHasUserActivatedSpeak,
1247
1305
  speakerMuted,
1248
1306
  ]);
1307
+ const processEnterTextDialogResponse = useCallback((event, pending) => {
1308
+ var _a, _b;
1309
+ const { msg, typingText: pendingTypingText, useLoaderTextAsMsg, } = pending;
1310
+ const currentState = event.currentState;
1311
+ if (event.resultCode !== 0 || !currentState) {
1312
+ if (isSessionExpiredNatsResponse(event) && pending.text) {
1313
+ setMemoriTyping(false);
1314
+ setTypingText(undefined);
1315
+ retryAfterExpiredSessionRef.current({
1316
+ text: pending.text,
1317
+ media: pending.media,
1318
+ translate: pending.translate,
1319
+ translatedText: pending.translatedText,
1320
+ hidden: pending.hidden,
1321
+ typingText: pending.typingText,
1322
+ useLoaderTextAsMsg: pending.useLoaderTextAsMsg,
1323
+ hasBatchQueued: pending.hasBatchQueued,
1324
+ expiredSessionID: sessionId,
1325
+ continueFromChatLogID: chatLogID,
1326
+ });
1327
+ return;
1328
+ }
1329
+ if (event.resultCode === 500 && event.resultMessage) {
1330
+ setHistory(h => [
1331
+ ...h,
1332
+ {
1333
+ text: 'Error: ' + event.resultMessage,
1334
+ emitter: 'system',
1335
+ fromUser: false,
1336
+ initial: false,
1337
+ contextVars: {},
1338
+ date: new Date().toISOString(),
1339
+ },
1340
+ ]);
1341
+ }
1342
+ return;
1343
+ }
1344
+ if (!msg) {
1345
+ return;
1346
+ }
1347
+ setChatLogID(undefined);
1348
+ const emission = useLoaderTextAsMsg && pendingTypingText
1349
+ ? pendingTypingText
1350
+ : (_a = currentState.emission) !== null && _a !== void 0 ? _a : currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.emission;
1351
+ if (userLang.toLowerCase() !== language.toLowerCase() &&
1352
+ emission &&
1353
+ isMultilanguageEnabled) {
1354
+ currentState.emission = emission;
1355
+ translateDialogState(currentState, userLang, msg).then(ts => {
1356
+ const text = ts.translatedEmission || ts.emission;
1357
+ if (text && shouldPlayAudio(text)) {
1358
+ handleSpeak(text);
1359
+ }
1360
+ });
1361
+ }
1362
+ else {
1363
+ setCurrentDialogState({
1364
+ ...currentState,
1365
+ emission,
1366
+ });
1367
+ if (emission) {
1368
+ pushMessage({
1369
+ text: emission,
1370
+ emitter: currentState.emitter,
1371
+ media: (_b = currentState.emittedMedia) !== null && _b !== void 0 ? _b : currentState.media,
1372
+ llmUsage: currentState.llmUsage,
1373
+ fromUser: false,
1374
+ questionAnswered: msg,
1375
+ generatedByAI: !!currentState.completion,
1376
+ contextVars: currentState.contextVars,
1377
+ date: currentState.currentDate,
1378
+ placeName: currentState.currentPlaceName,
1379
+ placeLatitude: currentState.currentLatitude,
1380
+ placeLongitude: currentState.currentLongitude,
1381
+ placeUncertaintyKm: currentState.currentUncertaintyKm,
1382
+ tag: currentState.currentTag,
1383
+ memoryTags: currentState.memoryTags,
1384
+ });
1385
+ if (emission && shouldPlayAudio(emission)) {
1386
+ handleSpeak(emission);
1387
+ }
1388
+ }
1389
+ }
1390
+ }, [
1391
+ userLang,
1392
+ language,
1393
+ isMultilanguageEnabled,
1394
+ currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.emission,
1395
+ translateDialogState,
1396
+ handleSpeak,
1397
+ shouldPlayAudio,
1398
+ ]);
1399
+ const clearEnterTextPending = useCallback((correlationID, pending) => {
1400
+ var _a;
1401
+ if ((_a = pending.waitForResponse) === null || _a === void 0 ? void 0 : _a.timeoutId) {
1402
+ clearTimeout(pending.waitForResponse.timeoutId);
1403
+ }
1404
+ pendingEnterTextRef.current.delete(correlationID);
1405
+ }, []);
1406
+ const deliverEnterTextNatsError = useCallback((event) => {
1407
+ var _a, _b, _c;
1408
+ const correlationID = event.correlationID;
1409
+ let pending;
1410
+ if (correlationID) {
1411
+ pending = pendingEnterTextRef.current.get(correlationID);
1412
+ if (pending) {
1413
+ clearEnterTextPending(correlationID, pending);
1414
+ (_a = pending.waitForResponse) === null || _a === void 0 ? void 0 : _a.reject(new Error((_b = event.errorMessage) !== null && _b !== void 0 ? _b : String((_c = event.errorCode) !== null && _c !== void 0 ? _c : 'NATS error')));
1415
+ }
1416
+ }
1417
+ if (isSessionExpiredNatsError(event) && (pending === null || pending === void 0 ? void 0 : pending.text)) {
1418
+ setMemoriTyping(false);
1419
+ setTypingText(undefined);
1420
+ retryAfterExpiredSessionRef.current({
1421
+ text: pending.text,
1422
+ media: pending.media,
1423
+ translate: pending.translate,
1424
+ translatedText: pending.translatedText,
1425
+ hidden: pending.hidden,
1426
+ typingText: pending.typingText,
1427
+ useLoaderTextAsMsg: pending.useLoaderTextAsMsg,
1428
+ hasBatchQueued: pending.hasBatchQueued,
1429
+ expiredSessionID: sessionId,
1430
+ continueFromChatLogID: chatLogID,
1431
+ });
1432
+ return;
1433
+ }
1434
+ const errorText = event.errorMessage
1435
+ ? `Error: ${event.errorMessage}`
1436
+ : event.errorCode
1437
+ ? `Error: ${event.errorCode}`
1438
+ : 'Error: An unexpected error occurred';
1439
+ pushMessage({
1440
+ text: errorText,
1441
+ emitter: 'system',
1442
+ fromUser: false,
1443
+ initial: false,
1444
+ contextVars: {},
1445
+ date: new Date().toISOString(),
1446
+ });
1447
+ setMemoriTyping(false);
1448
+ setTypingText(undefined);
1449
+ }, [clearEnterTextPending]);
1450
+ const deliverEnterTextNatsResponse = useCallback((correlationID, event) => {
1451
+ const pending = pendingEnterTextRef.current.get(correlationID);
1452
+ if (!pending) {
1453
+ bufferedNatsResponsesRef.current.set(correlationID, event);
1454
+ return;
1455
+ }
1456
+ clearEnterTextPending(correlationID, pending);
1457
+ if (pending.waitForResponse) {
1458
+ pending.waitForResponse.resolve(event);
1459
+ setMemoriTyping(false);
1460
+ setTypingText(undefined);
1461
+ return;
1462
+ }
1463
+ processEnterTextDialogResponse(event, pending);
1464
+ if (!pending.hasBatchQueued) {
1465
+ setMemoriTyping(false);
1466
+ setTypingText(undefined);
1467
+ }
1468
+ }, [processEnterTextDialogResponse, clearEnterTextPending]);
1469
+ const registerPendingEnterText = useCallback((correlationID, pending) => {
1470
+ const buffered = bufferedNatsResponsesRef.current.get(correlationID);
1471
+ if (buffered) {
1472
+ bufferedNatsResponsesRef.current.delete(correlationID);
1473
+ pendingEnterTextRef.current.set(correlationID, pending);
1474
+ deliverEnterTextNatsResponse(correlationID, buffered);
1475
+ return;
1476
+ }
1477
+ pendingEnterTextRef.current.set(correlationID, pending);
1478
+ }, [deliverEnterTextNatsResponse]);
1479
+ const waitForEnterTextNatsResponse = useCallback((correlationID, timeoutMs = 120000) => new Promise((resolve, reject) => {
1480
+ const timeoutId = setTimeout(() => {
1481
+ const current = pendingEnterTextRef.current.get(correlationID);
1482
+ if (current) {
1483
+ clearEnterTextPending(correlationID, current);
1484
+ }
1485
+ logWidgetError('NATS timeout', { correlationID, timeoutMs });
1486
+ reject(new Error('NATS enter-text response timeout'));
1487
+ }, timeoutMs);
1488
+ registerPendingEnterText(correlationID, {
1489
+ waitForResponse: {
1490
+ resolve: event => {
1491
+ clearTimeout(timeoutId);
1492
+ resolve(event);
1493
+ },
1494
+ reject: error => {
1495
+ clearTimeout(timeoutId);
1496
+ reject(error);
1497
+ },
1498
+ timeoutId,
1499
+ },
1500
+ });
1501
+ }), [registerPendingEnterText, clearEnterTextPending]);
1502
+ useNats({
1503
+ baseUrl,
1504
+ sessionId,
1505
+ onProgress: useCallback((event) => {
1506
+ if (event.message) {
1507
+ setTypingText(event.message);
1508
+ }
1509
+ }, []),
1510
+ onDialogResponse: useCallback((event) => {
1511
+ const correlationID = event.correlationID;
1512
+ if (!correlationID) {
1513
+ logWidgetError('NATS dialog response missing correlationID', event);
1514
+ setMemoriTyping(false);
1515
+ setTypingText(undefined);
1516
+ return;
1517
+ }
1518
+ deliverEnterTextNatsResponse(correlationID, event);
1519
+ }, [deliverEnterTextNatsResponse]),
1520
+ onError: deliverEnterTextNatsError,
1521
+ });
1249
1522
  const focusChatInput = () => {
1250
1523
  let textarea = document.querySelector('#chat-fieldset textarea');
1251
1524
  if (textarea && enableFocusChatInput) {
@@ -1267,7 +1540,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1267
1540
  timeoutRef.current = undefined;
1268
1541
  ttsStop();
1269
1542
  }
1270
- catch (e) {
1543
+ catch (_a) {
1271
1544
  }
1272
1545
  };
1273
1546
  useEffect(() => {
@@ -1430,7 +1703,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1430
1703
  };
1431
1704
  }, [sessionId, userLang, disableTextEnteredEvents]);
1432
1705
  const onClickStart = useCallback(async (session, initialSessionExpired = false, chatLog, targetSessionID) => {
1433
- var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
1706
+ var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
1434
1707
  const sessionID = chatLog ? undefined : (session === null || session === void 0 ? void 0 : session.sessionID) || sessionId;
1435
1708
  const dialogState = chatLog
1436
1709
  ? undefined
@@ -1447,9 +1720,15 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1447
1720
  setPositionPopoverOpenState(true);
1448
1721
  return;
1449
1722
  }
1723
+ if (!(await checkCredits({ notify: true }))) {
1724
+ setClickedStart(false);
1725
+ setLoading(false);
1726
+ return;
1727
+ }
1450
1728
  if (!sessionID && !!minAge && !birth) {
1451
1729
  setShowAgeVerification(true);
1452
1730
  setClickedStart(false);
1731
+ return;
1453
1732
  }
1454
1733
  else if ((!sessionID &&
1455
1734
  memori.privacyType !== 'PUBLIC' &&
@@ -1462,83 +1741,95 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1462
1741
  return;
1463
1742
  }
1464
1743
  else if (!sessionID || initialSessionExpired) {
1465
- setClickedStart(false);
1466
1744
  setGotErrorInOpening(false);
1467
- const session = await fetchSession({
1468
- memoriID: memori.engineMemoriID,
1469
- password: secret || memoriPwd || memori.secretToken,
1470
- tag: personification === null || personification === void 0 ? void 0 : personification.tag,
1471
- pin: personification === null || personification === void 0 ? void 0 : personification.pin,
1472
- continueFromChatLogID: chatLog === null || chatLog === void 0 ? void 0 : chatLog.chatLogID,
1473
- initialContextVars: {
1474
- LANG: userLang,
1475
- PATHNAME: (_a = window.location.pathname) === null || _a === void 0 ? void 0 : _a.toUpperCase(),
1476
- ROUTE: ((_d = (_c = (_b = window.location.pathname) === null || _b === void 0 ? void 0 : _b.split('/')) === null || _c === void 0 ? void 0 : _c.pop()) === null || _d === void 0 ? void 0 : _d.toUpperCase()) || '',
1477
- ...((!chatLog
1478
- ? initialContextVars
1479
- : chatLog.lines[chatLog.lines.length - 1].contextVars) || {}),
1480
- },
1481
- initialQuestion: chatLog ? undefined : initialQuestion,
1482
- birthDate: birth,
1483
- additionalInfo: {
1484
- ...(additionalInfo || {}),
1485
- loginToken: (_g = (_f = userToken !== null && userToken !== void 0 ? userToken : loginToken) !== null && _f !== void 0 ? _f : additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _g !== void 0 ? _g : authToken,
1486
- language: ((_k = userLang !== null && userLang !== void 0 ? userLang : (_j = (_h = memori.culture) === null || _h === void 0 ? void 0 : _h.split('-')) === null || _j === void 0 ? void 0 : _j[0]) !== null && _k !== void 0 ? _k : 'IT').toLowerCase(),
1487
- timeZoneOffset: new Date().getTimezoneOffset().toString(),
1488
- },
1489
- });
1490
- if (session === null || session === void 0 ? void 0 : session.dialogState) {
1491
- if (!chatLog) {
1492
- setHistory([]);
1493
- await translateAndSpeak(session.dialogState, userLang);
1494
- setHasUserActivatedSpeak(true);
1495
- }
1496
- else {
1497
- const messages = chatLog.lines.map((l, i) => {
1498
- var _a, _b;
1499
- return ({
1500
- text: l.text,
1501
- media: (_b = (_a = l.media) === null || _a === void 0 ? void 0 : _a.filter(m => allowedMediaTypes.includes(m.mimeType))) === null || _b === void 0 ? void 0 : _b.map(m => ({
1502
- mediumID: `${i}-${m.mimeType}`,
1503
- ...m,
1504
- })),
1505
- fromUser: l.inbound,
1506
- llmUsage: l.llmUsage,
1507
- timestamp: l.timestamp,
1508
- emitter: l.emitter,
1509
- initial: i === 0,
1510
- });
1511
- });
1512
- translatedMessages = messages !== null && messages !== void 0 ? messages : [];
1513
- if (language.toUpperCase() !== userLang.toUpperCase() &&
1514
- isMultilanguageEnabled) {
1515
- try {
1516
- translatedMessages = await Promise.all(messages.map(async (m) => {
1517
- if ('originalText' in m && m.originalText) {
1518
- return m;
1519
- }
1520
- return {
1745
+ if (sessionStartingRef.current) {
1746
+ return;
1747
+ }
1748
+ sessionStartingRef.current = true;
1749
+ try {
1750
+ const session = await fetchSession({
1751
+ memoriID: memori.engineMemoriID,
1752
+ password: secret || memoriPwd || memori.secretToken,
1753
+ tag: personification === null || personification === void 0 ? void 0 : personification.tag,
1754
+ pin: personification === null || personification === void 0 ? void 0 : personification.pin,
1755
+ continueFromChatLogID: chatLog === null || chatLog === void 0 ? void 0 : chatLog.chatLogID,
1756
+ initialContextVars: {
1757
+ LANG: userLang,
1758
+ PATHNAME: (_a = window.location.pathname) === null || _a === void 0 ? void 0 : _a.toUpperCase(),
1759
+ ROUTE: ((_d = (_c = (_b = window.location.pathname) === null || _b === void 0 ? void 0 : _b.split('/')) === null || _c === void 0 ? void 0 : _c.pop()) === null || _d === void 0 ? void 0 : _d.toUpperCase()) ||
1760
+ '',
1761
+ ...((!chatLog
1762
+ ? initialContextVars
1763
+ : chatLog.lines[chatLog.lines.length - 1].contextVars) || {}),
1764
+ },
1765
+ initialQuestion: chatLog ? undefined : initialQuestion,
1766
+ birthDate: birth,
1767
+ additionalInfo: {
1768
+ ...(additionalInfo || {}),
1769
+ loginToken: resolveLoginToken(),
1770
+ language: ((_h = userLang !== null && userLang !== void 0 ? userLang : (_g = (_f = memori.culture) === null || _f === void 0 ? void 0 : _f.split('-')) === null || _g === void 0 ? void 0 : _g[0]) !== null && _h !== void 0 ? _h : 'IT').toLowerCase(),
1771
+ timeZoneOffset: new Date().getTimezoneOffset().toString(),
1772
+ },
1773
+ });
1774
+ if (session === null || session === void 0 ? void 0 : session.dialogState) {
1775
+ if (!chatLog) {
1776
+ setHistory([]);
1777
+ await translateAndSpeak(session.dialogState, userLang);
1778
+ setHasUserActivatedSpeak(true);
1779
+ setClickedStart(false);
1780
+ }
1781
+ else {
1782
+ const messages = chatLog.lines.map((l, i) => {
1783
+ var _a, _b;
1784
+ return ({
1785
+ text: l.text,
1786
+ media: (_b = (_a = l.media) === null || _a === void 0 ? void 0 : _a.filter(m => allowedMediaTypes.includes(m.mimeType))) === null || _b === void 0 ? void 0 : _b.map(m => ({
1787
+ mediumID: `${i}-${m.mimeType}`,
1521
1788
  ...m,
1522
- originalText: m.text,
1523
- text: (await getTranslation(m.text, userLang, language, baseUrl)).text,
1524
- };
1525
- }));
1526
- }
1527
- catch (e) {
1528
- console.error('[onClickStart] Error translating messages:', e);
1789
+ })),
1790
+ fromUser: l.inbound,
1791
+ llmUsage: l.llmUsage,
1792
+ timestamp: l.timestamp,
1793
+ emitter: l.emitter,
1794
+ initial: i === 0,
1795
+ });
1796
+ });
1797
+ translatedMessages = messages !== null && messages !== void 0 ? messages : [];
1798
+ if (language.toUpperCase() !== userLang.toUpperCase() &&
1799
+ isMultilanguageEnabled) {
1800
+ try {
1801
+ translatedMessages = await Promise.all(messages.map(async (m) => {
1802
+ if ('originalText' in m && m.originalText) {
1803
+ return m;
1804
+ }
1805
+ return {
1806
+ ...m,
1807
+ originalText: m.text,
1808
+ text: (await getTranslation(m.text, userLang, language, baseUrl)).text,
1809
+ };
1810
+ }));
1811
+ }
1812
+ catch (_u) {
1813
+ }
1529
1814
  }
1815
+ setHistory(translatedMessages);
1816
+ translateDialogState(session.dialogState, userLang, undefined, true).finally(() => {
1817
+ setHasUserActivatedSpeak(true);
1818
+ setClickedStart(false);
1819
+ });
1530
1820
  }
1531
- setHistory(translatedMessages);
1532
- translateDialogState(session.dialogState, userLang, undefined, true).finally(() => {
1533
- setHasUserActivatedSpeak(true);
1534
- });
1821
+ }
1822
+ else if ((session === null || session === void 0 ? void 0 : session.resultCode) === 0) {
1823
+ sessionStartingRef.current = false;
1824
+ await onClickStart(session || undefined);
1825
+ }
1826
+ else {
1827
+ setLoading(false);
1828
+ setClickedStart(false);
1535
1829
  }
1536
1830
  }
1537
- else if ((session === null || session === void 0 ? void 0 : session.resultCode) === 0) {
1538
- await onClickStart(session || undefined);
1539
- }
1540
- else {
1541
- setLoading(false);
1831
+ finally {
1832
+ sessionStartingRef.current = false;
1542
1833
  }
1543
1834
  return;
1544
1835
  }
@@ -1547,9 +1838,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1547
1838
  const { currentState, ...response } = await getSession(sessionID);
1548
1839
  if (response.resultCode !== 0 || !currentState) {
1549
1840
  const { chatLogs } = await getSessionChatLogs(sessionID, sessionID);
1550
- setGotErrorInOpening(true);
1551
1841
  setSessionId(undefined);
1552
- setClickedStart(false);
1553
1842
  await onClickStart(undefined, true, chatLogs === null || chatLogs === void 0 ? void 0 : chatLogs[0]);
1554
1843
  return;
1555
1844
  }
@@ -1561,21 +1850,22 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1561
1850
  const session = await changeTag(memori.engineMemoriID, sessionID, personification.tag, personification.pin);
1562
1851
  if (session && session.resultCode === 0) {
1563
1852
  await translateAndSpeak(session.currentState, userLang);
1853
+ setClickedStart(false);
1564
1854
  }
1565
1855
  else {
1566
1856
  throw new Error('No session');
1567
1857
  }
1568
1858
  }
1569
- catch (e) {
1570
- console.error('[onClickStart] Error changing tag:', e);
1859
+ catch (_v) {
1571
1860
  reopenSession(true, memori === null || memori === void 0 ? void 0 : memori.secretToken, undefined, personification.tag, personification.pin, {
1572
1861
  LANG: userLang,
1573
- PATHNAME: (_l = window.location.pathname) === null || _l === void 0 ? void 0 : _l.toUpperCase(),
1574
- ROUTE: ((_p = (_o = (_m = window.location.pathname) === null || _m === void 0 ? void 0 : _m.split('/')) === null || _o === void 0 ? void 0 : _o.pop()) === null || _p === void 0 ? void 0 : _p.toUpperCase()) ||
1862
+ PATHNAME: (_j = window.location.pathname) === null || _j === void 0 ? void 0 : _j.toUpperCase(),
1863
+ ROUTE: ((_m = (_l = (_k = window.location.pathname) === null || _k === void 0 ? void 0 : _k.split('/')) === null || _l === void 0 ? void 0 : _l.pop()) === null || _m === void 0 ? void 0 : _m.toUpperCase()) ||
1575
1864
  '',
1576
1865
  ...(initialContextVars || {}),
1577
1866
  }, initialQuestion, birth).then(() => {
1578
1867
  setHasUserActivatedSpeak(true);
1868
+ setClickedStart(false);
1579
1869
  });
1580
1870
  }
1581
1871
  }
@@ -1588,6 +1878,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1588
1878
  const session = await changeTag(memori.engineMemoriID, sessionID, anonTag);
1589
1879
  if (session && session.resultCode === 0) {
1590
1880
  await translateAndSpeak(session.currentState, userLang);
1881
+ setClickedStart(false);
1591
1882
  }
1592
1883
  else {
1593
1884
  throw new Error('No session');
@@ -1596,19 +1887,20 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1596
1887
  catch (e) {
1597
1888
  reopenSession(true, memori === null || memori === void 0 ? void 0 : memori.secretToken, undefined, undefined, undefined, {
1598
1889
  LANG: userLang,
1599
- PATHNAME: (_q = window.location.pathname) === null || _q === void 0 ? void 0 : _q.toUpperCase(),
1600
- ROUTE: ((_t = (_s = (_r = window.location.pathname) === null || _r === void 0 ? void 0 : _r.split('/')) === null || _s === void 0 ? void 0 : _s.pop()) === null || _t === void 0 ? void 0 : _t.toUpperCase()) ||
1890
+ PATHNAME: (_o = window.location.pathname) === null || _o === void 0 ? void 0 : _o.toUpperCase(),
1891
+ ROUTE: ((_r = (_q = (_p = window.location.pathname) === null || _p === void 0 ? void 0 : _p.split('/')) === null || _q === void 0 ? void 0 : _q.pop()) === null || _r === void 0 ? void 0 : _r.toUpperCase()) ||
1601
1892
  '',
1602
1893
  ...(initialContextVars || {}),
1603
1894
  }, initialQuestion, birth).then(() => {
1604
1895
  setHasUserActivatedSpeak(true);
1896
+ setClickedStart(false);
1605
1897
  });
1606
1898
  }
1607
1899
  }
1608
1900
  else {
1609
1901
  try {
1610
1902
  const { chatLogs } = await getSessionChatLogs(sessionID, sessionID);
1611
- const messages = (_u = chatLogs === null || chatLogs === void 0 ? void 0 : chatLogs[0]) === null || _u === void 0 ? void 0 : _u.lines.map((l, i) => {
1903
+ const messages = (_s = chatLogs === null || chatLogs === void 0 ? void 0 : chatLogs[0]) === null || _s === void 0 ? void 0 : _s.lines.map((l, i) => {
1612
1904
  var _a, _b;
1613
1905
  return ({
1614
1906
  text: l.text,
@@ -1633,31 +1925,28 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1633
1925
  text: (await getTranslation(m.text, userLang, language, baseUrl)).text,
1634
1926
  })));
1635
1927
  }
1636
- catch (e) {
1637
- console.error('[onClickStart] Error translating messages:', e);
1928
+ catch (_w) {
1638
1929
  }
1639
1930
  }
1640
1931
  setHistory(translatedMessages);
1641
1932
  }
1642
- catch (e) {
1643
- console.error('[onClickStart] Error retrieving chat logs:', e);
1933
+ catch (_x) {
1644
1934
  }
1645
1935
  if ((!!(translatedMessages === null || translatedMessages === void 0 ? void 0 : translatedMessages.length) && translatedMessages.length > 1) ||
1646
1936
  !initialQuestion) {
1647
1937
  setHasUserActivatedSpeak(true);
1938
+ setClickedStart(false);
1648
1939
  await translateAndSpeak(currentState, userLang, undefined, !!(translatedMessages === null || translatedMessages === void 0 ? void 0 : translatedMessages.length));
1649
1940
  }
1650
1941
  else {
1651
- console.log('[onClickStart] Starting with initial question');
1652
1942
  translatedMessages = [];
1653
1943
  setHistory([]);
1654
- setMemoriTyping(true);
1655
1944
  const placeSpec = getPlaceSpecForEnterText(position);
1656
- const response = await postTextEnteredEvent({
1945
+ const response = await postEnterTextAsync({
1657
1946
  sessionId: sessionID,
1658
1947
  text: initialQuestion,
1659
1948
  ...(memori.needsDateTime && {
1660
- dateUTC: (_v = DateTime.utc().toISO()) !== null && _v !== void 0 ? _v : undefined,
1949
+ dateUTC: (_t = DateTime.utc().toISO()) !== null && _t !== void 0 ? _t : undefined,
1661
1950
  }),
1662
1951
  ...(placeSpec !== undefined && { place: placeSpec }),
1663
1952
  });
@@ -1673,16 +1962,34 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1673
1962
  date: new Date().toISOString(),
1674
1963
  },
1675
1964
  ]);
1676
- setMemoriTyping(false);
1677
1965
  return;
1678
1966
  }
1679
- await translateAndSpeak((_w = response.currentState) !== null && _w !== void 0 ? _w : currentState, userLang, undefined, false);
1967
+ const onClickStartCorrelationID = readCorrelationID(response);
1968
+ if (response.resultCode === 0 && onClickStartCorrelationID) {
1969
+ setMemoriTyping(true);
1970
+ try {
1971
+ const natsEvent = await waitForEnterTextNatsResponse(onClickStartCorrelationID);
1972
+ if (natsEvent.resultCode === 0 && natsEvent.currentState) {
1973
+ await translateAndSpeak(natsEvent.currentState, userLang, undefined, false);
1974
+ setClickedStart(false);
1975
+ }
1976
+ }
1977
+ catch (err) {
1978
+ logWidgetError('onClickStart NATS wait failed', err);
1979
+ setMemoriTyping(false);
1980
+ setTypingText(undefined);
1981
+ }
1982
+ }
1983
+ else if (response.resultCode === 0) {
1984
+ logWidgetError('onClickStart enter-text missing correlationID', response);
1985
+ }
1680
1986
  }
1681
1987
  }
1682
1988
  }
1683
1989
  else {
1684
1990
  setHistory([]);
1685
1991
  await translateAndSpeak(dialogState, userLang);
1992
+ setClickedStart(false);
1686
1993
  }
1687
1994
  }, [memoriPwd, memori, memoriTokens, birthDate, sessionId, userLang, position]);
1688
1995
  const setPositionPopoverOpen = useCallback((open) => {
@@ -1692,32 +1999,52 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1692
1999
  }
1693
2000
  }, [autoStart, onClickStart]);
1694
2001
  useEffect(() => {
1695
- if (!clickedStart && autoStart && selectedLayout !== 'HIDDEN_CHAT') {
2002
+ if (!clickedStart &&
2003
+ !sessionStartingRef.current &&
2004
+ !sessionId &&
2005
+ autoStart &&
2006
+ selectedLayout !== 'HIDDEN_CHAT' &&
2007
+ (!needsCredits || hasEnoughCredits)) {
1696
2008
  onClickStart();
1697
2009
  }
1698
- }, [clickedStart, autoStart, selectedLayout]);
2010
+ }, [
2011
+ clickedStart,
2012
+ autoStart,
2013
+ selectedLayout,
2014
+ sessionId,
2015
+ needsCredits,
2016
+ hasEnoughCredits,
2017
+ ]);
1699
2018
  useEffect(() => {
2019
+ var _a;
1700
2020
  const targetNode = document.querySelector(`memori-client[memoriname="${memori.name}"]`) ||
1701
2021
  document.querySelector(`memori-client[memoriid="${memori.memoriID}"]`) ||
1702
2022
  document.querySelector('memori-client');
1703
2023
  if (!targetNode) {
1704
2024
  return;
1705
2025
  }
2026
+ const propsToken = (_a = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _a !== void 0 ? _a : authToken;
2027
+ const initialDomToken = targetNode.getAttribute('authtoken') || undefined;
2028
+ if (initialDomToken && !propsToken) {
2029
+ setLoginToken(initialDomToken);
2030
+ userTokenRef.current = initialDomToken;
2031
+ }
2032
+ const applyAuthTokenFromElement = (element) => {
2033
+ var _a;
2034
+ const clientNode = element.nodeName === 'MEMORI-CLIENT'
2035
+ ? element
2036
+ : (_a = element.closest('memori-client')) !== null && _a !== void 0 ? _a : element.parentElement;
2037
+ const token = (clientNode === null || clientNode === void 0 ? void 0 : clientNode.getAttribute('authtoken')) || undefined;
2038
+ setLoginToken(token);
2039
+ userTokenRef.current = token;
2040
+ };
1706
2041
  const config = { attributes: true, childList: false, subtree: false };
1707
- const callback = (mutationList, _observer) => {
1708
- var _a, _b, _c;
2042
+ const callback = mutationList => {
2043
+ var _a;
1709
2044
  for (const mutation of mutationList) {
1710
2045
  if (mutation.type === 'attributes' &&
1711
2046
  ((_a = mutation.attributeName) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'authtoken') {
1712
- if (mutation.target.nodeName === 'MEMORI-CLIENT') {
1713
- setLoginToken(mutation.target.getAttribute('authtoken') || undefined);
1714
- userToken = mutation.target.getAttribute('authtoken') || undefined;
1715
- }
1716
- else {
1717
- setLoginToken(((_c = (_b = mutation.target) === null || _b === void 0 ? void 0 : _b.parentElement) === null || _c === void 0 ? void 0 : _c.getAttribute('authtoken')) ||
1718
- undefined);
1719
- userToken = mutation.target.getAttribute('authtoken') || undefined;
1720
- }
2047
+ applyAuthTokenFromElement(mutation.target);
1721
2048
  }
1722
2049
  }
1723
2050
  };
@@ -1726,7 +2053,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1726
2053
  return () => {
1727
2054
  observer.disconnect();
1728
2055
  };
1729
- }, []);
2056
+ }, [memori.name, memori.memoriID, additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken, authToken]);
1730
2057
  const [experts, setExperts] = useState();
1731
2058
  const fetchExperts = useCallback(async () => {
1732
2059
  if (!sessionId || !(memori === null || memori === void 0 ? void 0 : memori.enableBoardOfExperts))
@@ -1736,12 +2063,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1736
2063
  if (resp.resultCode === 0) {
1737
2064
  setExperts(experts);
1738
2065
  }
1739
- else {
1740
- console.warn('Error fetching experts', resp);
1741
- }
1742
2066
  }
1743
- catch (err) {
1744
- console.warn(err);
2067
+ catch (_a) {
1745
2068
  }
1746
2069
  }, [sessionId, memori === null || memori === void 0 ? void 0 : memori.enableBoardOfExperts]);
1747
2070
  useEffect(() => {
@@ -1751,11 +2074,26 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1751
2074
  !!loginToken &&
1752
2075
  !!(user === null || user === void 0 ? void 0 : user.userID) &&
1753
2076
  (user === null || user === void 0 ? void 0 : user.pAndCUAccepted);
1754
- const needsCredits = tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation;
1755
- const [hasEnoughCredits, setHasEnoughCredits] = useState(true);
1756
- const checkCredits = useCallback(async () => {
2077
+ const handleNotEnoughCredits = useCallback(() => {
2078
+ setHasEnoughCredits(false);
2079
+ setAuthModalState(null);
2080
+ add(createAlertOptions({
2081
+ description: t('notEnoughCredits'),
2082
+ severity: 'error',
2083
+ }));
2084
+ }, [add, t]);
2085
+ const checkCredits = useCallback(async (options) => {
1757
2086
  if (!(tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation))
1758
- return;
2087
+ return true;
2088
+ if (!ownerUserID && !ownerUserName) {
2089
+ if (options === null || options === void 0 ? void 0 : options.notify) {
2090
+ handleNotEnoughCredits();
2091
+ }
2092
+ else {
2093
+ setHasEnoughCredits(false);
2094
+ }
2095
+ return false;
2096
+ }
1759
2097
  try {
1760
2098
  const resp = await getCredits({
1761
2099
  operation: deepThoughtEnabled
@@ -1768,22 +2106,36 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1768
2106
  });
1769
2107
  if (resp.enough) {
1770
2108
  setHasEnoughCredits(true);
2109
+ return true;
1771
2110
  }
1772
2111
  else {
1773
- setHasEnoughCredits(false);
1774
- console.warn('Not enough credits. Required:', resp.required);
2112
+ if (options === null || options === void 0 ? void 0 : options.notify) {
2113
+ handleNotEnoughCredits();
2114
+ }
2115
+ else {
2116
+ setHasEnoughCredits(false);
2117
+ }
2118
+ return false;
1775
2119
  }
1776
2120
  }
1777
- catch (e) {
1778
- let err = e;
1779
- console.debug(err);
2121
+ catch (err) {
2122
+ logWidgetError('checkCredits failed', err);
2123
+ return true;
1780
2124
  }
1781
- }, [tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation, deepThoughtEnabled]);
2125
+ }, [
2126
+ baseUrl,
2127
+ deepThoughtEnabled,
2128
+ handleNotEnoughCredits,
2129
+ ownerUserID,
2130
+ ownerUserName,
2131
+ tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation,
2132
+ tenantID,
2133
+ ]);
1782
2134
  useEffect(() => {
1783
2135
  if (tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation) {
1784
2136
  checkCredits();
1785
2137
  }
1786
- }, [tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation, deepThoughtEnabled]);
2138
+ }, [tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation, deepThoughtEnabled, checkCredits]);
1787
2139
  useEffect(() => {
1788
2140
  if (__WEBCOMPONENT__)
1789
2141
  return;
@@ -1802,16 +2154,16 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1802
2154
  ? selectedLayout !== 'TOTEM' && selectedLayout !== 'WEBSITE_ASSISTANT'
1803
2155
  : !showOnlyLastMessages;
1804
2156
  const canShowLoginButton = !(tenant === null || tenant === void 0 ? void 0 : tenant.ssoLogin) &&
1805
- ((_w = showLogin !== null && showLogin !== void 0 ? showLogin : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showLogin) !== null && _w !== void 0 ? _w : memori.requireLoginToken);
2157
+ ((_y = showLogin !== null && showLogin !== void 0 ? showLogin : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showLogin) !== null && _y !== void 0 ? _y : memori.requireLoginToken);
1806
2158
  const headerProps = {
1807
2159
  memori: {
1808
2160
  ...memori,
1809
- ownerUserID: (_y = (_x = memori.ownerUserID) !== null && _x !== void 0 ? _x : ownerUserID) !== null && _y !== void 0 ? _y : undefined,
2161
+ ownerUserID: (_0 = (_z = memori.ownerUserID) !== null && _z !== void 0 ? _z : ownerUserID) !== null && _0 !== void 0 ? _0 : undefined,
1810
2162
  },
1811
2163
  apiClient: client,
1812
2164
  tenant,
1813
2165
  history,
1814
- showShare: (_z = showShare !== null && showShare !== void 0 ? showShare : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showShare) !== null && _z !== void 0 ? _z : true,
2166
+ showShare: (_1 = showShare !== null && showShare !== void 0 ? showShare : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showShare) !== null && _1 !== void 0 ? _1 : true,
1815
2167
  position,
1816
2168
  layout: selectedLayout,
1817
2169
  additionalSettings,
@@ -1821,18 +2173,18 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1821
2173
  setShowSettingsDrawer,
1822
2174
  setShowKnownFactsDrawer,
1823
2175
  setShowExpertsDrawer,
1824
- enableAudio: (_0 = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _0 !== void 0 ? _0 : true,
2176
+ enableAudio: (_2 = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _2 !== void 0 ? _2 : true,
1825
2177
  speakerMuted: speakerMuted !== null && speakerMuted !== void 0 ? speakerMuted : false,
1826
2178
  setSpeakerMuted: (mute) => {
1827
2179
  toggleMute(mute);
1828
2180
  },
1829
2181
  setShowChatHistoryDrawer,
1830
- showSettings: (_1 = showSettings !== null && showSettings !== void 0 ? showSettings : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showSettings) !== null && _1 !== void 0 ? _1 : true,
1831
- showChatHistory: (_2 = showChatHistory !== null && showChatHistory !== void 0 ? showChatHistory : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showChatHistory) !== null && _2 !== void 0 ? _2 : true,
2182
+ showSettings: (_3 = showSettings !== null && showSettings !== void 0 ? showSettings : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showSettings) !== null && _3 !== void 0 ? _3 : true,
2183
+ showChatHistory: (_4 = showChatHistory !== null && showChatHistory !== void 0 ? showChatHistory : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showChatHistory) !== null && _4 !== void 0 ? _4 : true,
1832
2184
  showMessageConsumption: enableMessageConsumption,
1833
2185
  hasUserActivatedSpeak,
1834
2186
  showReload: selectedLayout === 'TOTEM',
1835
- showClear: (_3 = showClear !== null && showClear !== void 0 ? showClear : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showClear) !== null && _3 !== void 0 ? _3 : false,
2187
+ showClear: (_5 = showClear !== null && showClear !== void 0 ? showClear : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showClear) !== null && _5 !== void 0 ? _5 : false,
1836
2188
  clearHistory: () => setHistory(h => h.slice(-1)),
1837
2189
  showLogin: canShowLoginButton,
1838
2190
  setShowLoginDrawer,
@@ -1847,7 +2199,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1847
2199
  setShowLoginDrawer(false);
1848
2200
  setUser(undefined);
1849
2201
  setLoginToken(undefined);
1850
- userToken = undefined;
2202
+ userTokenRef.current = undefined;
1851
2203
  removeLocalConfig('loginToken');
1852
2204
  });
1853
2205
  },
@@ -1863,7 +2215,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1863
2215
  hasUserActivatedSpeak,
1864
2216
  isPlayingAudio: isPlayingAudio &&
1865
2217
  !speakerMuted &&
1866
- ((_4 = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _4 !== void 0 ? _4 : true),
2218
+ ((_6 = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _6 !== void 0 ? _6 : true),
1867
2219
  loading: !!memoriTyping,
1868
2220
  baseUrl,
1869
2221
  apiUrl: client.constants.BACKEND_URL,
@@ -1893,7 +2245,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1893
2245
  notEnoughCredits: needsCredits && !hasEnoughCredits,
1894
2246
  showLogin: canShowLoginButton,
1895
2247
  setShowLoginDrawer,
1896
- showChatHistory: (_5 = showChatHistory !== null && showChatHistory !== void 0 ? showChatHistory : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showChatHistory) !== null && _5 !== void 0 ? _5 : true,
2248
+ showChatHistory: (_7 = showChatHistory !== null && showChatHistory !== void 0 ? showChatHistory : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showChatHistory) !== null && _7 !== void 0 ? _7 : true,
1897
2249
  setShowChatHistoryDrawer,
1898
2250
  user,
1899
2251
  };
@@ -1903,7 +2255,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1903
2255
  tenant,
1904
2256
  translateTo: isMultilanguageEnabled &&
1905
2257
  userLang.toUpperCase() !==
1906
- ((_10 = ((_9 = (_8 = (_7 = (_6 = memori.culture) === null || _6 === void 0 ? void 0 : _6.split('-')) === null || _7 === void 0 ? void 0 : _7[0]) !== null && _8 !== void 0 ? _8 : i18n.language) !== null && _9 !== void 0 ? _9 : 'IT')) === null || _10 === void 0 ? void 0 : _10.toUpperCase())
2258
+ ((_12 = ((_11 = (_10 = (_9 = (_8 = memori.culture) === null || _8 === void 0 ? void 0 : _8.split('-')) === null || _9 === void 0 ? void 0 : _9[0]) !== null && _10 !== void 0 ? _10 : i18n.language) !== null && _11 !== void 0 ? _11 : 'IT')) === null || _12 === void 0 ? void 0 : _12.toUpperCase())
1907
2259
  ? userLang
1908
2260
  : undefined,
1909
2261
  baseUrl,
@@ -1911,9 +2263,9 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1911
2263
  layout,
1912
2264
  memoriTyping,
1913
2265
  typingText,
1914
- showTypingText: (_11 = showTypingText !== null && showTypingText !== void 0 ? showTypingText : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showTypingText) !== null && _11 !== void 0 ? _11 : false,
2266
+ showTypingText: (_13 = showTypingText !== null && showTypingText !== void 0 ? showTypingText : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showTypingText) !== null && _13 !== void 0 ? _13 : false,
1915
2267
  history: showFullHistory ? history : history.slice(-2),
1916
- authToken: (_13 = (_12 = loginToken !== null && loginToken !== void 0 ? loginToken : userToken) !== null && _12 !== void 0 ? _12 : additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _13 !== void 0 ? _13 : authToken,
2268
+ authToken: resolveLoginToken(),
1917
2269
  dialogState: currentDialogState,
1918
2270
  pushMessage,
1919
2271
  simulateUserPrompt,
@@ -2088,7 +2440,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
2088
2440
  setShowLoginDrawer(false);
2089
2441
  setUser(user);
2090
2442
  setLoginToken(token);
2091
- userToken = token;
2443
+ userTokenRef.current = token;
2092
2444
  setLocalConfig('loginToken', token);
2093
2445
  if ((state === null || state === void 0 ? void 0 : state.sessionID) &&
2094
2446
  state.sessionID !== sessionId &&
@@ -2121,7 +2473,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
2121
2473
  setShowLoginDrawer(false);
2122
2474
  setUser(undefined);
2123
2475
  setLoginToken(undefined);
2124
- userToken = undefined;
2476
+ userTokenRef.current = undefined;
2125
2477
  removeLocalConfig('loginToken');
2126
2478
  });
2127
2479
  } }))] }) }));