@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
@@ -41,6 +41,8 @@ const sanitizer_1 = require("../../helpers/sanitizer");
41
41
  const useTTS_1 = require("../../helpers/tts/useTTS");
42
42
  const ChatHistory_1 = tslib_1.__importDefault(require("../ChatHistoryDrawer/ChatHistory"));
43
43
  const useSTT_1 = require("../../helpers/stt/useSTT");
44
+ const useNats_1 = require("../../helpers/nats/useNats");
45
+ const isSessionExpiredError_1 = require("../../helpers/nats/isSessionExpiredError");
44
46
  const getMemoriState = (integrationId) => {
45
47
  var _a, _b, _c, _d, _f;
46
48
  let widget = integrationId
@@ -62,12 +64,23 @@ const getMemoriState = (integrationId) => {
62
64
  loginToken,
63
65
  };
64
66
  };
67
+ const resolveLoginTokenValue = (loginToken, userTokenRef, callAdditionalInfoLoginToken, additionalInfoLoginToken, authTokenProp) => {
68
+ var _a, _b, _c;
69
+ 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;
70
+ };
65
71
  const NULL_PLACE_SPEC = {
66
72
  placeName: null,
67
73
  latitude: null,
68
74
  longitude: null,
69
75
  uncertaintyKm: null,
70
76
  };
77
+ const logWidgetError = (context, detail) => {
78
+ console.error(`[MemoriWidget] ${context}`, detail !== null && detail !== void 0 ? detail : '');
79
+ };
80
+ function readCorrelationID(response) {
81
+ const value = response.correlationID;
82
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
83
+ }
71
84
  const typeMessage = (message, waitForPrevious = true, hidden = false, typingText, useLoaderTextAsMsg = false, hasBatchQueued = false) => {
72
85
  const e = new CustomEvent('MemoriTextEntered', {
73
86
  detail: {
@@ -163,7 +176,6 @@ window.typeMessageHidden = typeMessageHidden;
163
176
  window.typeBatchMessages = typeBatchMessages;
164
177
  let audioContext;
165
178
  let memoriPassword;
166
- let userToken;
167
179
  function getChatStyles(config) {
168
180
  var _a;
169
181
  const primary = config === null || config === void 0 ? void 0 : config.buttonBgColor;
@@ -197,7 +209,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
197
209
  setIsClient(true);
198
210
  }, []);
199
211
  const client = (0, memori_api_client_1.default)(apiURL, engineURL);
200
- const { initSession, deleteSession, postTextEnteredEvent, postPlaceChangedEvent, postDateChangedEvent, postTagChangedEvent, getSession, getExpertReferences, getSessionChatLogs, } = client;
212
+ const { initSession, deleteSession, postEnterTextAsync, postTextEnteredEvent, postPlaceChangedEvent, postDateChangedEvent, postTagChangedEvent, getSession, getExpertReferences, getSessionChatLogs, } = client;
201
213
  const [instruct, setInstruct] = (0, react_1.useState)(false);
202
214
  const [enableFocusChatInput, setEnableFocusChatInput] = (0, react_1.useState)(true);
203
215
  const [widgetRootEl, setWidgetRootEl] = (0, react_1.useState)(null);
@@ -220,35 +232,64 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
220
232
  return () => observer.disconnect();
221
233
  }, [widgetRootEl]);
222
234
  const [loginToken, setLoginToken] = (0, react_1.useState)((_a = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _a !== void 0 ? _a : authToken);
235
+ const userTokenRef = (0, react_1.useRef)((_b = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _b !== void 0 ? _b : authToken);
236
+ const prevPropsLoginTokenRef = (0, react_1.useRef)((_c = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _c !== void 0 ? _c : authToken);
223
237
  const [user, setUser] = (0, react_1.useState)({
224
238
  avatarURL: typeof userAvatar === 'string' ? userAvatar : undefined,
225
239
  });
240
+ const resolveLoginToken = (0, react_1.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]);
226
241
  (0, react_1.useEffect)(() => {
227
- if (loginToken &&
228
- !(user === null || user === void 0 ? void 0 : user.userID) &&
229
- (showLogin || memori.requireLoginToken)) {
230
- client.backend
231
- .pwlGetCurrentUser(loginToken)
232
- .then(({ user, resultCode }) => {
233
- if (user && resultCode === 0) {
234
- setUser(user);
235
- (0, configuration_1.setLocalConfig)('loginToken', loginToken);
236
- if (!birthDate && user.birthDate) {
237
- setBirthDate(user.birthDate);
238
- (0, configuration_1.setLocalConfig)('birthDate', user.birthDate);
239
- }
240
- }
241
- else {
242
- (0, configuration_1.removeLocalConfig)('loginToken');
243
- }
244
- });
242
+ var _a;
243
+ const incomingToken = (_a = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _a !== void 0 ? _a : authToken;
244
+ const prevPropsToken = prevPropsLoginTokenRef.current;
245
+ prevPropsLoginTokenRef.current = incomingToken;
246
+ if (incomingToken !== prevPropsToken) {
247
+ setLoginToken(incomingToken);
248
+ userTokenRef.current = incomingToken;
249
+ if (!incomingToken) {
250
+ (0, configuration_1.removeLocalConfig)('loginToken');
251
+ setUser(undefined);
252
+ }
245
253
  }
246
- }, [loginToken, user === null || user === void 0 ? void 0 : user.userID]);
254
+ }, [additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken, authToken]);
255
+ (0, react_1.useEffect)(() => {
256
+ if (!loginToken || !(showLogin || memori.requireLoginToken)) {
257
+ return;
258
+ }
259
+ let cancelled = false;
260
+ client.backend
261
+ .pwlGetCurrentUser(loginToken)
262
+ .then(({ user: fetchedUser, resultCode }) => {
263
+ if (cancelled)
264
+ return;
265
+ if (fetchedUser && resultCode === 0) {
266
+ setUser(fetchedUser);
267
+ (0, configuration_1.setLocalConfig)('loginToken', loginToken);
268
+ userTokenRef.current = loginToken;
269
+ if (!birthDate && fetchedUser.birthDate) {
270
+ setBirthDate(fetchedUser.birthDate);
271
+ (0, configuration_1.setLocalConfig)('birthDate', fetchedUser.birthDate);
272
+ }
273
+ }
274
+ else {
275
+ setLoginToken(undefined);
276
+ userTokenRef.current = undefined;
277
+ setUser(undefined);
278
+ (0, configuration_1.removeLocalConfig)('loginToken');
279
+ }
280
+ });
281
+ return () => {
282
+ cancelled = true;
283
+ };
284
+ }, [loginToken, showLogin, memori.requireLoginToken]);
247
285
  const [showLoginDrawer, setShowLoginDrawer] = (0, react_1.useState)(false);
248
286
  const [clickedStart, setClickedStart] = (0, react_1.useState)(false);
249
287
  const [gotErrorInOpening, setGotErrorInOpening] = (0, react_1.useState)(false);
250
- 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()) ||
251
- ((_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());
288
+ const sessionStartingRef = (0, react_1.useRef)(false);
289
+ const needsCredits = tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation;
290
+ const [hasEnoughCredits, setHasEnoughCredits] = (0, react_1.useState)(true);
291
+ 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()) ||
292
+ ((_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());
252
293
  const integrationConfig = (integration === null || integration === void 0 ? void 0 : integration.customData)
253
294
  ? JSON.parse(integration.customData)
254
295
  : null;
@@ -256,7 +297,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
256
297
  ? multilingual
257
298
  : !!(integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.multilanguage);
258
299
  const forcedTimeout = integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.forcedTimeout;
259
- const [userLang, setUserLang] = (0, react_1.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');
300
+ const [userLang, setUserLang] = (0, react_1.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');
260
301
  (0, react_1.useEffect)(() => {
261
302
  if (spokenLang != null) {
262
303
  setUserLang(spokenLang);
@@ -282,6 +323,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
282
323
  const [loading, setLoading] = (0, react_1.useState)(false);
283
324
  const [memoriTyping, setMemoriTyping] = (0, react_1.useState)(false);
284
325
  const [typingText, setTypingText] = (0, react_1.useState)();
326
+ const pendingEnterTextRef = (0, react_1.useRef)(new Map());
327
+ const bufferedNatsResponsesRef = (0, react_1.useRef)(new Map());
285
328
  const layoutName = typeof layout === 'string'
286
329
  ? layout
287
330
  : layout &&
@@ -292,7 +335,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
292
335
  ? layout.name
293
336
  : typeof (integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === 'string'
294
337
  ? integrationConfig.layout
295
- : (_q = integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === null || _q === void 0 ? void 0 : _q.name;
338
+ : (_s = integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === null || _s === void 0 ? void 0 : _s.name;
296
339
  const selectedLayout = (() => {
297
340
  if (typeof layoutName === 'string') {
298
341
  const lower = layoutName.toLowerCase();
@@ -320,14 +363,14 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
320
363
  typeof layout === 'object' &&
321
364
  layout !== null &&
322
365
  'piiDetection' in layout &&
323
- ((_r = layout.piiDetection) === null || _r === void 0 ? void 0 : _r.enabled)
366
+ ((_t = layout.piiDetection) === null || _t === void 0 ? void 0 : _t.enabled)
324
367
  ? layout.piiDetection
325
368
  : typeof (integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) === 'object' &&
326
369
  (integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.layout) !== null &&
327
- ((_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)
370
+ ((_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)
328
371
  ? integrationConfig.layout.piiDetection
329
372
  : undefined;
330
- const defaultEnableAudio = (_u = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _u !== void 0 ? _u : true;
373
+ const defaultEnableAudio = (_w = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _w !== void 0 ? _w : true;
331
374
  const [hasUserActivatedListening, setHasUserActivatedListening] = (0, react_1.useState)(false);
332
375
  const [hasUserTypedMessage, setHasUserTypedMessage] = (0, react_1.useState)(false);
333
376
  const [positionPopoverOpen, setPositionPopoverOpenState] = (0, react_1.useState)(false);
@@ -370,7 +413,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
370
413
  setRuntimeShowMessageConsumption((0, configuration_1.getLocalConfig)('showMessageConsumption', (_a = showMessageConsumption !== null && showMessageConsumption !== void 0 ? showMessageConsumption : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showMessageConsumption) !== null && _a !== void 0 ? _a : false));
371
414
  if (!(additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) && !authToken) {
372
415
  setLoginToken((0, configuration_1.getLocalConfig)('loginToken', undefined));
373
- userToken = (0, configuration_1.getLocalConfig)('loginToken', undefined);
416
+ userTokenRef.current = (0, configuration_1.getLocalConfig)('loginToken', undefined);
374
417
  setBirthDate((0, configuration_1.getLocalConfig)('birthDate', undefined));
375
418
  }
376
419
  if (!((_b = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _b !== void 0 ? _b : true)) {
@@ -468,8 +511,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
468
511
  });
469
512
  };
470
513
  const [chatLogID, setChatLogID] = (0, react_1.useState)(undefined);
471
- const sendMessage = async (text, media, newSessionId, translate = true, translatedText, hidden = false, typingText, useLoaderTextAsMsg = false, hasBatchQueued = false) => {
472
- var _a, _b, _c, _d, _f, _g;
514
+ const sendMessage = async (text, media, newSessionId, translate = true, translatedText, hidden = false, typingText, useLoaderTextAsMsg = false, hasBatchQueued = false, skipHistoryPush = false) => {
515
+ var _a, _b;
473
516
  const sessionID = newSessionId ||
474
517
  sessionId ||
475
518
  ((_a = window.getMemoriState()) === null || _a === void 0 ? void 0 : _a.sessionID);
@@ -513,7 +556,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
513
556
  return;
514
557
  }
515
558
  }
516
- if (!hidden)
559
+ if (!hidden && !skipHistoryPush)
517
560
  pushMessage({
518
561
  text: text,
519
562
  translatedText,
@@ -523,12 +566,10 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
523
566
  ? !!newSessionId && newSessionId !== sessionId
524
567
  : !!newSessionId,
525
568
  });
526
- setMemoriTyping(true);
527
- setTypingText(typingText);
528
569
  let gotError = false;
529
570
  try {
530
571
  const placeSpec = getPlaceSpecForEnterText(position);
531
- const { currentState, ...response } = await postTextEnteredEvent({
572
+ const response = await postEnterTextAsync({
532
573
  sessionId: sessionID,
533
574
  text: msg,
534
575
  ...(memori.needsDateTime && {
@@ -536,65 +577,37 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
536
577
  }),
537
578
  ...(placeSpec !== undefined && { place: placeSpec }),
538
579
  });
539
- if (response.resultCode === 0 && currentState) {
540
- setChatLogID(undefined);
541
- const emission = useLoaderTextAsMsg && typingText
542
- ? typingText
543
- : (_c = currentState.emission) !== null && _c !== void 0 ? _c : currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.emission;
544
- if (userLang.toLowerCase() !== language.toLowerCase() &&
545
- emission &&
546
- isMultilanguageEnabled) {
547
- currentState.emission = emission;
548
- translateDialogState(currentState, userLang, msg).then(ts => {
549
- let text = ts.translatedEmission || ts.emission;
550
- if (text && shouldPlayAudio(text)) {
551
- handleSpeak(text);
552
- }
553
- });
554
- }
555
- else {
556
- setCurrentDialogState({
557
- ...currentState,
558
- emission,
559
- });
560
- if (emission) {
561
- pushMessage({
562
- text: emission,
563
- emitter: currentState.emitter,
564
- media: (_d = currentState.emittedMedia) !== null && _d !== void 0 ? _d : currentState.media,
565
- llmUsage: currentState.llmUsage,
566
- fromUser: false,
567
- questionAnswered: msg,
568
- generatedByAI: !!currentState.completion,
569
- contextVars: currentState.contextVars,
570
- date: currentState.currentDate,
571
- placeName: currentState.currentPlaceName,
572
- placeLatitude: currentState.currentLatitude,
573
- placeLongitude: currentState.currentLongitude,
574
- placeUncertaintyKm: currentState.currentUncertaintyKm,
575
- tag: currentState.currentTag,
576
- memoryTags: currentState.memoryTags,
577
- });
578
- if (emission && shouldPlayAudio(emission)) {
579
- handleSpeak(emission);
580
- }
581
- }
582
- }
580
+ const correlationID = readCorrelationID(response);
581
+ if (response.resultCode === 0 && correlationID) {
582
+ registerPendingEnterText(correlationID, {
583
+ msg,
584
+ text,
585
+ media,
586
+ translate,
587
+ translatedText,
588
+ hidden,
589
+ typingText,
590
+ useLoaderTextAsMsg,
591
+ hasBatchQueued,
592
+ });
593
+ setMemoriTyping(true);
594
+ setTypingText(typingText);
595
+ }
596
+ else if (response.resultCode === 0) {
597
+ logWidgetError('enter-text missing correlationID', response);
583
598
  }
584
599
  else if (response.resultCode === 404) {
585
- setHistory(h => [...h.slice(0, h.length - 1)]);
586
- reopenSession(true, memoriPwd || memori.secretToken, memoriTokens, undefined, undefined, {
587
- LANG: userLang,
588
- PATHNAME: window.location.pathname,
589
- ROUTE: ((_g = (_f = window.location.pathname) === null || _f === void 0 ? void 0 : _f.split('/')) === null || _g === void 0 ? void 0 : _g.pop()) || '',
590
- ...(initialContextVars || {}),
591
- }, initialQuestion, undefined, undefined, undefined, undefined, true).then(state => {
592
- console.info('session timeout');
593
- if (state === null || state === void 0 ? void 0 : state.sessionID) {
594
- setTimeout(() => {
595
- sendMessage(text, media, state === null || state === void 0 ? void 0 : state.sessionID);
596
- }, 500);
597
- }
600
+ retryAfterExpiredSessionRef.current({
601
+ text,
602
+ media,
603
+ translate,
604
+ translatedText,
605
+ hidden,
606
+ typingText,
607
+ useLoaderTextAsMsg,
608
+ hasBatchQueued,
609
+ expiredSessionID: sessionID,
610
+ continueFromChatLogID: chatLogID,
598
611
  });
599
612
  }
600
613
  else if (response.resultCode === 500 && response.resultMessage) {
@@ -611,18 +624,12 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
611
624
  ]);
612
625
  }
613
626
  else {
614
- console.warn('[SEND_MESSAGE]', response);
615
627
  return Promise.reject(response);
616
628
  }
617
629
  }
618
630
  catch (error) {
619
- console.log('error', error);
620
- console.error(error);
621
631
  gotError = true;
622
- setTypingText(undefined);
623
- setMemoriTyping(false);
624
- }
625
- if (!hasBatchQueued) {
632
+ logWidgetError('sendMessage failed', error);
626
633
  setTypingText(undefined);
627
634
  setMemoriTyping(false);
628
635
  }
@@ -704,7 +711,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
704
711
  }
705
712
  }
706
713
  catch (error) {
707
- console.error('[TRANSLATE] Error during translation:', error);
708
714
  translatedState = { ...state, emission };
709
715
  translatedMsg = {
710
716
  text: emission,
@@ -812,7 +818,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
812
818
  try {
813
819
  setTimeout(() => {
814
820
  var _a;
815
- console.log('snippet', s);
816
821
  new Function((_a = s.content) !== null && _a !== void 0 ? _a : '')();
817
822
  setTimeout(() => {
818
823
  var _a, _b, _c;
@@ -821,8 +826,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
821
826
  }, 400);
822
827
  }, 1000);
823
828
  }
824
- catch (e) {
825
- console.warn(e);
829
+ catch (_a) {
826
830
  }
827
831
  });
828
832
  };
@@ -833,7 +837,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
833
837
  }
834
838
  }, [initialSessionID]);
835
839
  const fetchSession = async (params) => {
836
- var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l;
840
+ var _a, _b, _c, _d, _f, _g, _h;
837
841
  let storageBirthDate = (0, configuration_1.getLocalConfig)('birthDate', undefined);
838
842
  let userBirthDate = (_a = birthDate !== null && birthDate !== void 0 ? birthDate : params.birthDate) !== null && _a !== void 0 ? _a : storageBirthDate;
839
843
  if (!userBirthDate && !!minAge) {
@@ -847,6 +851,9 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
847
851
  setAuthModalState('password');
848
852
  return;
849
853
  }
854
+ if (!(await checkCredits({ notify: true }))) {
855
+ return;
856
+ }
850
857
  setLoading(true);
851
858
  try {
852
859
  let referral;
@@ -855,8 +862,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
855
862
  return window.location.href;
856
863
  })();
857
864
  }
858
- catch (err) {
859
- console.debug(err);
865
+ catch (_j) {
860
866
  }
861
867
  const session = await initSession({
862
868
  ...params,
@@ -865,8 +871,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
865
871
  pin: (_c = params.pin) !== null && _c !== void 0 ? _c : personification === null || personification === void 0 ? void 0 : personification.pin,
866
872
  additionalInfo: {
867
873
  ...(params.additionalInfo || additionalInfo || {}),
868
- 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,
869
- 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(),
874
+ loginToken: resolveLoginToken((_d = params.additionalInfo) === null || _d === void 0 ? void 0 : _d.loginToken),
875
+ 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(),
870
876
  referral: referral,
871
877
  timeZoneOffset: new Date().getTimezoneOffset().toString(),
872
878
  },
@@ -895,7 +901,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
895
901
  }));
896
902
  setGotErrorInOpening(true);
897
903
  }
898
- else if ((session === null || session === void 0 ? void 0 : session.resultCode) === 403) {
904
+ else if ((session === null || session === void 0 ? void 0 : session.resultCode) === 403 && memori.privacyType !== 'PUBLIC') {
899
905
  setMemoriPwd(undefined);
900
906
  setAuthModalState('password');
901
907
  return session;
@@ -907,16 +913,15 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
907
913
  severity: 'error',
908
914
  duration: 0,
909
915
  }));
910
- setGotErrorInOpening(true);
911
916
  return session;
912
917
  }
913
918
  }
914
919
  catch (err) {
915
- console.error(err);
920
+ logWidgetError('fetchSession failed', err);
916
921
  }
917
922
  };
918
- const reopenSession = async (updateDialogState = false, password, recoveryTokens, tag, pin, initialContextVars, initialQuestion, birthDate, additionalInfoProp, continueFromChatLogID, continueFromSessionID, isSessionExpired) => {
919
- var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l, _m;
923
+ const reopenSession = async (updateDialogState = false, password, recoveryTokens, tag, pin, initialContextVars, initialQuestion, birthDate, additionalInfoProp, continueFromChatLogID, continueFromSessionID, isSessionExpired, suppressHistoryUpdate) => {
924
+ var _a, _b, _c, _d, _f, _g, _h, _j;
920
925
  setLoading(true);
921
926
  let storageBirthDate = (0, configuration_1.getLocalConfig)('birthDate', undefined);
922
927
  let userBirthDate = birthDate !== null && birthDate !== void 0 ? birthDate : storageBirthDate;
@@ -934,14 +939,17 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
934
939
  setAuthModalState('password');
935
940
  return;
936
941
  }
942
+ if (!(await checkCredits({ notify: true }))) {
943
+ setLoading(false);
944
+ return null;
945
+ }
937
946
  let referral;
938
947
  try {
939
948
  referral = (() => {
940
949
  return window.location.href;
941
950
  })();
942
951
  }
943
- catch (err) {
944
- console.debug('[REOPEN_SESSION] Error getting referral:', err);
952
+ catch (_k) {
945
953
  }
946
954
  const { sessionID, currentState, ...response } = await initSession({
947
955
  memoriID: (_a = memori.engineMemoriID) !== null && _a !== void 0 ? _a : '',
@@ -961,21 +969,32 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
961
969
  birthDate: userBirthDate,
962
970
  additionalInfo: {
963
971
  ...(additionalInfoProp || additionalInfo || {}),
964
- 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,
965
- 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(),
972
+ loginToken: resolveLoginToken(additionalInfoProp === null || additionalInfoProp === void 0 ? void 0 : additionalInfoProp.loginToken),
973
+ 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(),
966
974
  referral: referral,
967
975
  timeZoneOffset: new Date().getTimezoneOffset().toString(),
968
976
  },
969
977
  });
970
978
  if (sessionID && currentState && response.resultCode === 0) {
971
- console.log('[REOPEN_SESSION] Session initialized successfully:', sessionID);
972
979
  setSessionId(sessionID);
973
980
  if (updateDialogState) {
974
981
  setCurrentDialogState(currentState);
975
- if (currentState.emission) {
976
- console.log('[REOPEN_SESSION] Processing emission:', currentState.emission);
977
- const initialStatus = isSessionExpired && history.length > 1
978
- ? 'Session Expired, reopening session'
982
+ const sessionExpiredStatus = isSessionExpired && history.length > 1
983
+ ? t('sessionExpiredReopening')
984
+ : null;
985
+ if (sessionExpiredStatus && suppressHistoryUpdate) {
986
+ pushMessage({
987
+ text: '',
988
+ emitter: 'system',
989
+ fromUser: false,
990
+ initial: sessionExpiredStatus,
991
+ contextVars: {},
992
+ date: new Date().toISOString(),
993
+ });
994
+ }
995
+ if (currentState.emission && !suppressHistoryUpdate) {
996
+ const initialStatus = sessionExpiredStatus
997
+ ? sessionExpiredStatus
979
998
  : history.length <= 1
980
999
  ? true
981
1000
  : undefined;
@@ -984,7 +1003,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
984
1003
  {
985
1004
  text: currentState.emission,
986
1005
  emitter: currentState.emitter,
987
- media: (_l = currentState.emittedMedia) !== null && _l !== void 0 ? _l : currentState.media,
1006
+ media: (_h = currentState.emittedMedia) !== null && _h !== void 0 ? _h : currentState.media,
988
1007
  fromUser: false,
989
1008
  initial: (initialStatus === true
990
1009
  ? true
@@ -1002,7 +1021,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1002
1021
  : pushMessage({
1003
1022
  text: currentState.emission,
1004
1023
  emitter: currentState.emitter,
1005
- media: (_m = currentState.emittedMedia) !== null && _m !== void 0 ? _m : currentState.media,
1024
+ media: (_j = currentState.emittedMedia) !== null && _j !== void 0 ? _j : currentState.media,
1006
1025
  fromUser: false,
1007
1026
  initial: (initialStatus === true
1008
1027
  ? true
@@ -1032,8 +1051,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1032
1051
  }));
1033
1052
  setGotErrorInOpening(true);
1034
1053
  }
1035
- else if ((response === null || response === void 0 ? void 0 : response.resultCode) === 403) {
1036
- console.error('[REOPEN_SESSION] Authentication error');
1054
+ else if ((response === null || response === void 0 ? void 0 : response.resultCode) === 403 &&
1055
+ memori.privacyType !== 'PUBLIC') {
1037
1056
  setMemoriPwd(undefined);
1038
1057
  setAuthModalState('password');
1039
1058
  }
@@ -1047,15 +1066,61 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1047
1066
  }
1048
1067
  }
1049
1068
  catch (err) {
1050
- console.error('[REOPEN_SESSION] Caught error:', err);
1069
+ logWidgetError('reopenSession failed', err);
1051
1070
  }
1052
1071
  setLoading(false);
1053
1072
  return null;
1054
1073
  };
1074
+ const retryAfterExpiredSessionRef = (0, react_1.useRef)(() => Promise.resolve(null));
1075
+ retryAfterExpiredSessionRef.current = (params) => {
1076
+ const { text, media, translate = true, translatedText, hidden = false, typingText, useLoaderTextAsMsg = false, hasBatchQueued = false, expiredSessionID, continueFromChatLogID: continueFromChatLogIDParam, } = params;
1077
+ const continueFromSessionID = expiredSessionID !== null && expiredSessionID !== void 0 ? expiredSessionID : sessionId;
1078
+ const continueFromChatLogID = continueFromChatLogIDParam !== null && continueFromChatLogIDParam !== void 0 ? continueFromChatLogIDParam : chatLogID;
1079
+ const reopenAfterExpiry = () => {
1080
+ var _a, _b;
1081
+ return reopenSession(true, memoriPwd || memori.secretToken, memoriTokens, undefined, undefined, {
1082
+ LANG: userLang,
1083
+ PATHNAME: window.location.pathname,
1084
+ ROUTE: ((_b = (_a = window.location.pathname) === null || _a === void 0 ? void 0 : _a.split('/')) === null || _b === void 0 ? void 0 : _b.pop()) || '',
1085
+ ...(initialContextVars || {}),
1086
+ }, initialQuestion, undefined, undefined, continueFromChatLogID, continueFromSessionID, true, true);
1087
+ };
1088
+ const scheduleRetry = (newSessionID) => {
1089
+ setTimeout(() => {
1090
+ sendMessage(text, media, newSessionID, translate, translatedText, hidden, typingText, useLoaderTextAsMsg, hasBatchQueued, true);
1091
+ }, 500);
1092
+ };
1093
+ const handleReopenFailure = (state) => {
1094
+ setMemoriTyping(false);
1095
+ setTypingText(undefined);
1096
+ if (state === null && text && !hidden) {
1097
+ add((0, ui_1.createAlertOptions)({
1098
+ description: t('errors.SESSION_EXPIRED'),
1099
+ severity: 'error',
1100
+ }));
1101
+ }
1102
+ };
1103
+ if (!text) {
1104
+ return reopenAfterExpiry().then(state => {
1105
+ if (!(state === null || state === void 0 ? void 0 : state.sessionID)) {
1106
+ handleReopenFailure(state);
1107
+ }
1108
+ return state;
1109
+ });
1110
+ }
1111
+ return reopenAfterExpiry().then(state => {
1112
+ if (state === null || state === void 0 ? void 0 : state.sessionID) {
1113
+ scheduleRetry(state.sessionID);
1114
+ }
1115
+ else {
1116
+ handleReopenFailure(state);
1117
+ }
1118
+ return state;
1119
+ });
1120
+ };
1055
1121
  const changeTag = async (memoriId, sessionId, tag, pin) => {
1056
- var _a, _b, _c, _d, _f, _g, _h, _j, _k;
1122
+ var _a, _b, _c, _d, _f, _g, _h;
1057
1123
  if (!memoriId || !sessionId) {
1058
- console.error('CHANGETAG/Session not found');
1059
1124
  return Promise.reject('Session not found');
1060
1125
  }
1061
1126
  try {
@@ -1087,7 +1152,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1087
1152
  }
1088
1153
  }
1089
1154
  else if ([400, 401, 403, 404, 500].includes(resultCode)) {
1090
- console.warn('[APPCONTEXT/CHANGETAG]', resultCode);
1091
1155
  let storageBirthDate = (0, configuration_1.getLocalConfig)('birthDate', undefined);
1092
1156
  let referral;
1093
1157
  try {
@@ -1095,8 +1159,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1095
1159
  return window.location.href;
1096
1160
  })();
1097
1161
  }
1098
- catch (err) {
1099
- console.debug(err);
1162
+ catch (_j) {
1100
1163
  }
1101
1164
  fetchSession({
1102
1165
  memoriID: (_b = memori.engineMemoriID) !== null && _b !== void 0 ? _b : '',
@@ -1113,8 +1176,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1113
1176
  birthDate: birthDate || storageBirthDate || undefined,
1114
1177
  additionalInfo: {
1115
1178
  ...(additionalInfo || {}),
1116
- 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,
1117
- 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(),
1179
+ loginToken: resolveLoginToken(),
1180
+ 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(),
1118
1181
  referral: referral,
1119
1182
  timeZoneOffset: new Date().getTimezoneOffset().toString(),
1120
1183
  },
@@ -1131,7 +1194,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1131
1194
  }
1132
1195
  catch (_e) {
1133
1196
  let err = _e;
1134
- console.warn('[APPCONTEXT/CHANGETAG]', err);
1135
1197
  return Promise.reject(err);
1136
1198
  }
1137
1199
  return null;
@@ -1152,6 +1214,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1152
1214
  return () => {
1153
1215
  setHasUserActivatedSpeak(false);
1154
1216
  setClickedStart(false);
1217
+ sessionStartingRef.current = false;
1155
1218
  clearInteractionTimeout();
1156
1219
  timeoutRef.current = undefined;
1157
1220
  };
@@ -1178,10 +1241,9 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1178
1241
  apiUrl: `${baseUrl}/api/tts`,
1179
1242
  continuousSpeech: continuousSpeech,
1180
1243
  preview: preview,
1181
- }, autoStart, defaultEnableAudio, (_v = defaultSpeakerActive !== null && defaultSpeakerActive !== void 0 ? defaultSpeakerActive : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.defaultSpeakerActive) !== null && _v !== void 0 ? _v : true);
1244
+ }, autoStart, defaultEnableAudio, (_x = defaultSpeakerActive !== null && defaultSpeakerActive !== void 0 ? defaultSpeakerActive : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.defaultSpeakerActive) !== null && _x !== void 0 ? _x : true);
1182
1245
  const shouldPlayAudio = (text) => {
1183
1246
  const currentSpeakerMuted = (0, configuration_1.getLocalConfig)('muteSpeaker', !defaultEnableAudio);
1184
- console.log('[MemoriWidget] shouldPlayAudio', currentSpeakerMuted);
1185
1247
  return (text &&
1186
1248
  text.trim() &&
1187
1249
  !preview &&
@@ -1194,15 +1256,12 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1194
1256
  }
1195
1257
  try {
1196
1258
  const message = (0, utils_1.stripDuplicates)(text);
1197
- console.debug('Processing speech message:', message);
1198
1259
  if (message.length > 0) {
1199
1260
  setUserMessage('');
1200
- console.debug('Sending message:', message);
1201
1261
  sendMessage(message);
1202
1262
  }
1203
1263
  }
1204
- catch (error) {
1205
- console.error('Error in processSpeechAndSendMessage:', error);
1264
+ catch (_a) {
1206
1265
  }
1207
1266
  };
1208
1267
  const { isListening, startRecording, stopRecording, } = (0, useSTT_1.useSTT)(sttConfig, processSpeechAndSendMessage, {
@@ -1236,8 +1295,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1236
1295
  }
1237
1296
  return translatedState;
1238
1297
  }
1239
- catch (error) {
1240
- console.error('Error in translateAndSpeak:', error);
1298
+ catch (_a) {
1241
1299
  if (!hasUserActivatedSpeak) {
1242
1300
  setHasUserActivatedSpeak(true);
1243
1301
  }
@@ -1250,6 +1308,221 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1250
1308
  setHasUserActivatedSpeak,
1251
1309
  speakerMuted,
1252
1310
  ]);
1311
+ const processEnterTextDialogResponse = (0, react_1.useCallback)((event, pending) => {
1312
+ var _a, _b;
1313
+ const { msg, typingText: pendingTypingText, useLoaderTextAsMsg, } = pending;
1314
+ const currentState = event.currentState;
1315
+ if (event.resultCode !== 0 || !currentState) {
1316
+ if ((0, isSessionExpiredError_1.isSessionExpiredNatsResponse)(event) && pending.text) {
1317
+ setMemoriTyping(false);
1318
+ setTypingText(undefined);
1319
+ retryAfterExpiredSessionRef.current({
1320
+ text: pending.text,
1321
+ media: pending.media,
1322
+ translate: pending.translate,
1323
+ translatedText: pending.translatedText,
1324
+ hidden: pending.hidden,
1325
+ typingText: pending.typingText,
1326
+ useLoaderTextAsMsg: pending.useLoaderTextAsMsg,
1327
+ hasBatchQueued: pending.hasBatchQueued,
1328
+ expiredSessionID: sessionId,
1329
+ continueFromChatLogID: chatLogID,
1330
+ });
1331
+ return;
1332
+ }
1333
+ if (event.resultCode === 500 && event.resultMessage) {
1334
+ setHistory(h => [
1335
+ ...h,
1336
+ {
1337
+ text: 'Error: ' + event.resultMessage,
1338
+ emitter: 'system',
1339
+ fromUser: false,
1340
+ initial: false,
1341
+ contextVars: {},
1342
+ date: new Date().toISOString(),
1343
+ },
1344
+ ]);
1345
+ }
1346
+ return;
1347
+ }
1348
+ if (!msg) {
1349
+ return;
1350
+ }
1351
+ setChatLogID(undefined);
1352
+ const emission = useLoaderTextAsMsg && pendingTypingText
1353
+ ? pendingTypingText
1354
+ : (_a = currentState.emission) !== null && _a !== void 0 ? _a : currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.emission;
1355
+ if (userLang.toLowerCase() !== language.toLowerCase() &&
1356
+ emission &&
1357
+ isMultilanguageEnabled) {
1358
+ currentState.emission = emission;
1359
+ translateDialogState(currentState, userLang, msg).then(ts => {
1360
+ const text = ts.translatedEmission || ts.emission;
1361
+ if (text && shouldPlayAudio(text)) {
1362
+ handleSpeak(text);
1363
+ }
1364
+ });
1365
+ }
1366
+ else {
1367
+ setCurrentDialogState({
1368
+ ...currentState,
1369
+ emission,
1370
+ });
1371
+ if (emission) {
1372
+ pushMessage({
1373
+ text: emission,
1374
+ emitter: currentState.emitter,
1375
+ media: (_b = currentState.emittedMedia) !== null && _b !== void 0 ? _b : currentState.media,
1376
+ llmUsage: currentState.llmUsage,
1377
+ fromUser: false,
1378
+ questionAnswered: msg,
1379
+ generatedByAI: !!currentState.completion,
1380
+ contextVars: currentState.contextVars,
1381
+ date: currentState.currentDate,
1382
+ placeName: currentState.currentPlaceName,
1383
+ placeLatitude: currentState.currentLatitude,
1384
+ placeLongitude: currentState.currentLongitude,
1385
+ placeUncertaintyKm: currentState.currentUncertaintyKm,
1386
+ tag: currentState.currentTag,
1387
+ memoryTags: currentState.memoryTags,
1388
+ });
1389
+ if (emission && shouldPlayAudio(emission)) {
1390
+ handleSpeak(emission);
1391
+ }
1392
+ }
1393
+ }
1394
+ }, [
1395
+ userLang,
1396
+ language,
1397
+ isMultilanguageEnabled,
1398
+ currentDialogState === null || currentDialogState === void 0 ? void 0 : currentDialogState.emission,
1399
+ translateDialogState,
1400
+ handleSpeak,
1401
+ shouldPlayAudio,
1402
+ ]);
1403
+ const clearEnterTextPending = (0, react_1.useCallback)((correlationID, pending) => {
1404
+ var _a;
1405
+ if ((_a = pending.waitForResponse) === null || _a === void 0 ? void 0 : _a.timeoutId) {
1406
+ clearTimeout(pending.waitForResponse.timeoutId);
1407
+ }
1408
+ pendingEnterTextRef.current.delete(correlationID);
1409
+ }, []);
1410
+ const deliverEnterTextNatsError = (0, react_1.useCallback)((event) => {
1411
+ var _a, _b, _c;
1412
+ const correlationID = event.correlationID;
1413
+ let pending;
1414
+ if (correlationID) {
1415
+ pending = pendingEnterTextRef.current.get(correlationID);
1416
+ if (pending) {
1417
+ clearEnterTextPending(correlationID, pending);
1418
+ (_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')));
1419
+ }
1420
+ }
1421
+ if ((0, isSessionExpiredError_1.isSessionExpiredNatsError)(event) && (pending === null || pending === void 0 ? void 0 : pending.text)) {
1422
+ setMemoriTyping(false);
1423
+ setTypingText(undefined);
1424
+ retryAfterExpiredSessionRef.current({
1425
+ text: pending.text,
1426
+ media: pending.media,
1427
+ translate: pending.translate,
1428
+ translatedText: pending.translatedText,
1429
+ hidden: pending.hidden,
1430
+ typingText: pending.typingText,
1431
+ useLoaderTextAsMsg: pending.useLoaderTextAsMsg,
1432
+ hasBatchQueued: pending.hasBatchQueued,
1433
+ expiredSessionID: sessionId,
1434
+ continueFromChatLogID: chatLogID,
1435
+ });
1436
+ return;
1437
+ }
1438
+ const errorText = event.errorMessage
1439
+ ? `Error: ${event.errorMessage}`
1440
+ : event.errorCode
1441
+ ? `Error: ${event.errorCode}`
1442
+ : 'Error: An unexpected error occurred';
1443
+ pushMessage({
1444
+ text: errorText,
1445
+ emitter: 'system',
1446
+ fromUser: false,
1447
+ initial: false,
1448
+ contextVars: {},
1449
+ date: new Date().toISOString(),
1450
+ });
1451
+ setMemoriTyping(false);
1452
+ setTypingText(undefined);
1453
+ }, [clearEnterTextPending]);
1454
+ const deliverEnterTextNatsResponse = (0, react_1.useCallback)((correlationID, event) => {
1455
+ const pending = pendingEnterTextRef.current.get(correlationID);
1456
+ if (!pending) {
1457
+ bufferedNatsResponsesRef.current.set(correlationID, event);
1458
+ return;
1459
+ }
1460
+ clearEnterTextPending(correlationID, pending);
1461
+ if (pending.waitForResponse) {
1462
+ pending.waitForResponse.resolve(event);
1463
+ setMemoriTyping(false);
1464
+ setTypingText(undefined);
1465
+ return;
1466
+ }
1467
+ processEnterTextDialogResponse(event, pending);
1468
+ if (!pending.hasBatchQueued) {
1469
+ setMemoriTyping(false);
1470
+ setTypingText(undefined);
1471
+ }
1472
+ }, [processEnterTextDialogResponse, clearEnterTextPending]);
1473
+ const registerPendingEnterText = (0, react_1.useCallback)((correlationID, pending) => {
1474
+ const buffered = bufferedNatsResponsesRef.current.get(correlationID);
1475
+ if (buffered) {
1476
+ bufferedNatsResponsesRef.current.delete(correlationID);
1477
+ pendingEnterTextRef.current.set(correlationID, pending);
1478
+ deliverEnterTextNatsResponse(correlationID, buffered);
1479
+ return;
1480
+ }
1481
+ pendingEnterTextRef.current.set(correlationID, pending);
1482
+ }, [deliverEnterTextNatsResponse]);
1483
+ const waitForEnterTextNatsResponse = (0, react_1.useCallback)((correlationID, timeoutMs = 120000) => new Promise((resolve, reject) => {
1484
+ const timeoutId = setTimeout(() => {
1485
+ const current = pendingEnterTextRef.current.get(correlationID);
1486
+ if (current) {
1487
+ clearEnterTextPending(correlationID, current);
1488
+ }
1489
+ logWidgetError('NATS timeout', { correlationID, timeoutMs });
1490
+ reject(new Error('NATS enter-text response timeout'));
1491
+ }, timeoutMs);
1492
+ registerPendingEnterText(correlationID, {
1493
+ waitForResponse: {
1494
+ resolve: event => {
1495
+ clearTimeout(timeoutId);
1496
+ resolve(event);
1497
+ },
1498
+ reject: error => {
1499
+ clearTimeout(timeoutId);
1500
+ reject(error);
1501
+ },
1502
+ timeoutId,
1503
+ },
1504
+ });
1505
+ }), [registerPendingEnterText, clearEnterTextPending]);
1506
+ (0, useNats_1.useNats)({
1507
+ baseUrl,
1508
+ sessionId,
1509
+ onProgress: (0, react_1.useCallback)((event) => {
1510
+ if (event.message) {
1511
+ setTypingText(event.message);
1512
+ }
1513
+ }, []),
1514
+ onDialogResponse: (0, react_1.useCallback)((event) => {
1515
+ const correlationID = event.correlationID;
1516
+ if (!correlationID) {
1517
+ logWidgetError('NATS dialog response missing correlationID', event);
1518
+ setMemoriTyping(false);
1519
+ setTypingText(undefined);
1520
+ return;
1521
+ }
1522
+ deliverEnterTextNatsResponse(correlationID, event);
1523
+ }, [deliverEnterTextNatsResponse]),
1524
+ onError: deliverEnterTextNatsError,
1525
+ });
1253
1526
  const focusChatInput = () => {
1254
1527
  let textarea = document.querySelector('#chat-fieldset textarea');
1255
1528
  if (textarea && enableFocusChatInput) {
@@ -1271,7 +1544,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1271
1544
  timeoutRef.current = undefined;
1272
1545
  ttsStop();
1273
1546
  }
1274
- catch (e) {
1547
+ catch (_a) {
1275
1548
  }
1276
1549
  };
1277
1550
  (0, react_1.useEffect)(() => {
@@ -1434,7 +1707,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1434
1707
  };
1435
1708
  }, [sessionId, userLang, disableTextEnteredEvents]);
1436
1709
  const onClickStart = (0, react_1.useCallback)(async (session, initialSessionExpired = false, chatLog, targetSessionID) => {
1437
- var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
1710
+ var _a, _b, _c, _d, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
1438
1711
  const sessionID = chatLog ? undefined : (session === null || session === void 0 ? void 0 : session.sessionID) || sessionId;
1439
1712
  const dialogState = chatLog
1440
1713
  ? undefined
@@ -1451,9 +1724,15 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1451
1724
  setPositionPopoverOpenState(true);
1452
1725
  return;
1453
1726
  }
1727
+ if (!(await checkCredits({ notify: true }))) {
1728
+ setClickedStart(false);
1729
+ setLoading(false);
1730
+ return;
1731
+ }
1454
1732
  if (!sessionID && !!minAge && !birth) {
1455
1733
  setShowAgeVerification(true);
1456
1734
  setClickedStart(false);
1735
+ return;
1457
1736
  }
1458
1737
  else if ((!sessionID &&
1459
1738
  memori.privacyType !== 'PUBLIC' &&
@@ -1466,83 +1745,95 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1466
1745
  return;
1467
1746
  }
1468
1747
  else if (!sessionID || initialSessionExpired) {
1469
- setClickedStart(false);
1470
1748
  setGotErrorInOpening(false);
1471
- const session = await fetchSession({
1472
- memoriID: memori.engineMemoriID,
1473
- password: secret || memoriPwd || memori.secretToken,
1474
- tag: personification === null || personification === void 0 ? void 0 : personification.tag,
1475
- pin: personification === null || personification === void 0 ? void 0 : personification.pin,
1476
- continueFromChatLogID: chatLog === null || chatLog === void 0 ? void 0 : chatLog.chatLogID,
1477
- initialContextVars: {
1478
- LANG: userLang,
1479
- PATHNAME: (_a = window.location.pathname) === null || _a === void 0 ? void 0 : _a.toUpperCase(),
1480
- 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()) || '',
1481
- ...((!chatLog
1482
- ? initialContextVars
1483
- : chatLog.lines[chatLog.lines.length - 1].contextVars) || {}),
1484
- },
1485
- initialQuestion: chatLog ? undefined : initialQuestion,
1486
- birthDate: birth,
1487
- additionalInfo: {
1488
- ...(additionalInfo || {}),
1489
- 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,
1490
- 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(),
1491
- timeZoneOffset: new Date().getTimezoneOffset().toString(),
1492
- },
1493
- });
1494
- if (session === null || session === void 0 ? void 0 : session.dialogState) {
1495
- if (!chatLog) {
1496
- setHistory([]);
1497
- await translateAndSpeak(session.dialogState, userLang);
1498
- setHasUserActivatedSpeak(true);
1499
- }
1500
- else {
1501
- const messages = chatLog.lines.map((l, i) => {
1502
- var _a, _b;
1503
- return ({
1504
- text: l.text,
1505
- media: (_b = (_a = l.media) === null || _a === void 0 ? void 0 : _a.filter(m => constants_1.allowedMediaTypes.includes(m.mimeType))) === null || _b === void 0 ? void 0 : _b.map(m => ({
1506
- mediumID: `${i}-${m.mimeType}`,
1507
- ...m,
1508
- })),
1509
- fromUser: l.inbound,
1510
- llmUsage: l.llmUsage,
1511
- timestamp: l.timestamp,
1512
- emitter: l.emitter,
1513
- initial: i === 0,
1514
- });
1515
- });
1516
- translatedMessages = messages !== null && messages !== void 0 ? messages : [];
1517
- if (language.toUpperCase() !== userLang.toUpperCase() &&
1518
- isMultilanguageEnabled) {
1519
- try {
1520
- translatedMessages = await Promise.all(messages.map(async (m) => {
1521
- if ('originalText' in m && m.originalText) {
1522
- return m;
1523
- }
1524
- return {
1749
+ if (sessionStartingRef.current) {
1750
+ return;
1751
+ }
1752
+ sessionStartingRef.current = true;
1753
+ try {
1754
+ const session = await fetchSession({
1755
+ memoriID: memori.engineMemoriID,
1756
+ password: secret || memoriPwd || memori.secretToken,
1757
+ tag: personification === null || personification === void 0 ? void 0 : personification.tag,
1758
+ pin: personification === null || personification === void 0 ? void 0 : personification.pin,
1759
+ continueFromChatLogID: chatLog === null || chatLog === void 0 ? void 0 : chatLog.chatLogID,
1760
+ initialContextVars: {
1761
+ LANG: userLang,
1762
+ PATHNAME: (_a = window.location.pathname) === null || _a === void 0 ? void 0 : _a.toUpperCase(),
1763
+ 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()) ||
1764
+ '',
1765
+ ...((!chatLog
1766
+ ? initialContextVars
1767
+ : chatLog.lines[chatLog.lines.length - 1].contextVars) || {}),
1768
+ },
1769
+ initialQuestion: chatLog ? undefined : initialQuestion,
1770
+ birthDate: birth,
1771
+ additionalInfo: {
1772
+ ...(additionalInfo || {}),
1773
+ loginToken: resolveLoginToken(),
1774
+ 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(),
1775
+ timeZoneOffset: new Date().getTimezoneOffset().toString(),
1776
+ },
1777
+ });
1778
+ if (session === null || session === void 0 ? void 0 : session.dialogState) {
1779
+ if (!chatLog) {
1780
+ setHistory([]);
1781
+ await translateAndSpeak(session.dialogState, userLang);
1782
+ setHasUserActivatedSpeak(true);
1783
+ setClickedStart(false);
1784
+ }
1785
+ else {
1786
+ const messages = chatLog.lines.map((l, i) => {
1787
+ var _a, _b;
1788
+ return ({
1789
+ text: l.text,
1790
+ media: (_b = (_a = l.media) === null || _a === void 0 ? void 0 : _a.filter(m => constants_1.allowedMediaTypes.includes(m.mimeType))) === null || _b === void 0 ? void 0 : _b.map(m => ({
1791
+ mediumID: `${i}-${m.mimeType}`,
1525
1792
  ...m,
1526
- originalText: m.text,
1527
- text: (await (0, translations_1.getTranslation)(m.text, userLang, language, baseUrl)).text,
1528
- };
1529
- }));
1530
- }
1531
- catch (e) {
1532
- console.error('[onClickStart] Error translating messages:', e);
1793
+ })),
1794
+ fromUser: l.inbound,
1795
+ llmUsage: l.llmUsage,
1796
+ timestamp: l.timestamp,
1797
+ emitter: l.emitter,
1798
+ initial: i === 0,
1799
+ });
1800
+ });
1801
+ translatedMessages = messages !== null && messages !== void 0 ? messages : [];
1802
+ if (language.toUpperCase() !== userLang.toUpperCase() &&
1803
+ isMultilanguageEnabled) {
1804
+ try {
1805
+ translatedMessages = await Promise.all(messages.map(async (m) => {
1806
+ if ('originalText' in m && m.originalText) {
1807
+ return m;
1808
+ }
1809
+ return {
1810
+ ...m,
1811
+ originalText: m.text,
1812
+ text: (await (0, translations_1.getTranslation)(m.text, userLang, language, baseUrl)).text,
1813
+ };
1814
+ }));
1815
+ }
1816
+ catch (_u) {
1817
+ }
1533
1818
  }
1819
+ setHistory(translatedMessages);
1820
+ translateDialogState(session.dialogState, userLang, undefined, true).finally(() => {
1821
+ setHasUserActivatedSpeak(true);
1822
+ setClickedStart(false);
1823
+ });
1534
1824
  }
1535
- setHistory(translatedMessages);
1536
- translateDialogState(session.dialogState, userLang, undefined, true).finally(() => {
1537
- setHasUserActivatedSpeak(true);
1538
- });
1825
+ }
1826
+ else if ((session === null || session === void 0 ? void 0 : session.resultCode) === 0) {
1827
+ sessionStartingRef.current = false;
1828
+ await onClickStart(session || undefined);
1829
+ }
1830
+ else {
1831
+ setLoading(false);
1832
+ setClickedStart(false);
1539
1833
  }
1540
1834
  }
1541
- else if ((session === null || session === void 0 ? void 0 : session.resultCode) === 0) {
1542
- await onClickStart(session || undefined);
1543
- }
1544
- else {
1545
- setLoading(false);
1835
+ finally {
1836
+ sessionStartingRef.current = false;
1546
1837
  }
1547
1838
  return;
1548
1839
  }
@@ -1551,9 +1842,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1551
1842
  const { currentState, ...response } = await getSession(sessionID);
1552
1843
  if (response.resultCode !== 0 || !currentState) {
1553
1844
  const { chatLogs } = await getSessionChatLogs(sessionID, sessionID);
1554
- setGotErrorInOpening(true);
1555
1845
  setSessionId(undefined);
1556
- setClickedStart(false);
1557
1846
  await onClickStart(undefined, true, chatLogs === null || chatLogs === void 0 ? void 0 : chatLogs[0]);
1558
1847
  return;
1559
1848
  }
@@ -1565,21 +1854,22 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1565
1854
  const session = await changeTag(memori.engineMemoriID, sessionID, personification.tag, personification.pin);
1566
1855
  if (session && session.resultCode === 0) {
1567
1856
  await translateAndSpeak(session.currentState, userLang);
1857
+ setClickedStart(false);
1568
1858
  }
1569
1859
  else {
1570
1860
  throw new Error('No session');
1571
1861
  }
1572
1862
  }
1573
- catch (e) {
1574
- console.error('[onClickStart] Error changing tag:', e);
1863
+ catch (_v) {
1575
1864
  reopenSession(true, memori === null || memori === void 0 ? void 0 : memori.secretToken, undefined, personification.tag, personification.pin, {
1576
1865
  LANG: userLang,
1577
- PATHNAME: (_l = window.location.pathname) === null || _l === void 0 ? void 0 : _l.toUpperCase(),
1578
- 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()) ||
1866
+ PATHNAME: (_j = window.location.pathname) === null || _j === void 0 ? void 0 : _j.toUpperCase(),
1867
+ 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()) ||
1579
1868
  '',
1580
1869
  ...(initialContextVars || {}),
1581
1870
  }, initialQuestion, birth).then(() => {
1582
1871
  setHasUserActivatedSpeak(true);
1872
+ setClickedStart(false);
1583
1873
  });
1584
1874
  }
1585
1875
  }
@@ -1592,6 +1882,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1592
1882
  const session = await changeTag(memori.engineMemoriID, sessionID, constants_1.anonTag);
1593
1883
  if (session && session.resultCode === 0) {
1594
1884
  await translateAndSpeak(session.currentState, userLang);
1885
+ setClickedStart(false);
1595
1886
  }
1596
1887
  else {
1597
1888
  throw new Error('No session');
@@ -1600,19 +1891,20 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1600
1891
  catch (e) {
1601
1892
  reopenSession(true, memori === null || memori === void 0 ? void 0 : memori.secretToken, undefined, undefined, undefined, {
1602
1893
  LANG: userLang,
1603
- PATHNAME: (_q = window.location.pathname) === null || _q === void 0 ? void 0 : _q.toUpperCase(),
1604
- 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()) ||
1894
+ PATHNAME: (_o = window.location.pathname) === null || _o === void 0 ? void 0 : _o.toUpperCase(),
1895
+ 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()) ||
1605
1896
  '',
1606
1897
  ...(initialContextVars || {}),
1607
1898
  }, initialQuestion, birth).then(() => {
1608
1899
  setHasUserActivatedSpeak(true);
1900
+ setClickedStart(false);
1609
1901
  });
1610
1902
  }
1611
1903
  }
1612
1904
  else {
1613
1905
  try {
1614
1906
  const { chatLogs } = await getSessionChatLogs(sessionID, sessionID);
1615
- const messages = (_u = chatLogs === null || chatLogs === void 0 ? void 0 : chatLogs[0]) === null || _u === void 0 ? void 0 : _u.lines.map((l, i) => {
1907
+ const messages = (_s = chatLogs === null || chatLogs === void 0 ? void 0 : chatLogs[0]) === null || _s === void 0 ? void 0 : _s.lines.map((l, i) => {
1616
1908
  var _a, _b;
1617
1909
  return ({
1618
1910
  text: l.text,
@@ -1637,31 +1929,28 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1637
1929
  text: (await (0, translations_1.getTranslation)(m.text, userLang, language, baseUrl)).text,
1638
1930
  })));
1639
1931
  }
1640
- catch (e) {
1641
- console.error('[onClickStart] Error translating messages:', e);
1932
+ catch (_w) {
1642
1933
  }
1643
1934
  }
1644
1935
  setHistory(translatedMessages);
1645
1936
  }
1646
- catch (e) {
1647
- console.error('[onClickStart] Error retrieving chat logs:', e);
1937
+ catch (_x) {
1648
1938
  }
1649
1939
  if ((!!(translatedMessages === null || translatedMessages === void 0 ? void 0 : translatedMessages.length) && translatedMessages.length > 1) ||
1650
1940
  !initialQuestion) {
1651
1941
  setHasUserActivatedSpeak(true);
1942
+ setClickedStart(false);
1652
1943
  await translateAndSpeak(currentState, userLang, undefined, !!(translatedMessages === null || translatedMessages === void 0 ? void 0 : translatedMessages.length));
1653
1944
  }
1654
1945
  else {
1655
- console.log('[onClickStart] Starting with initial question');
1656
1946
  translatedMessages = [];
1657
1947
  setHistory([]);
1658
- setMemoriTyping(true);
1659
1948
  const placeSpec = getPlaceSpecForEnterText(position);
1660
- const response = await postTextEnteredEvent({
1949
+ const response = await postEnterTextAsync({
1661
1950
  sessionId: sessionID,
1662
1951
  text: initialQuestion,
1663
1952
  ...(memori.needsDateTime && {
1664
- dateUTC: (_v = luxon_1.DateTime.utc().toISO()) !== null && _v !== void 0 ? _v : undefined,
1953
+ dateUTC: (_t = luxon_1.DateTime.utc().toISO()) !== null && _t !== void 0 ? _t : undefined,
1665
1954
  }),
1666
1955
  ...(placeSpec !== undefined && { place: placeSpec }),
1667
1956
  });
@@ -1677,16 +1966,34 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1677
1966
  date: new Date().toISOString(),
1678
1967
  },
1679
1968
  ]);
1680
- setMemoriTyping(false);
1681
1969
  return;
1682
1970
  }
1683
- await translateAndSpeak((_w = response.currentState) !== null && _w !== void 0 ? _w : currentState, userLang, undefined, false);
1971
+ const onClickStartCorrelationID = readCorrelationID(response);
1972
+ if (response.resultCode === 0 && onClickStartCorrelationID) {
1973
+ setMemoriTyping(true);
1974
+ try {
1975
+ const natsEvent = await waitForEnterTextNatsResponse(onClickStartCorrelationID);
1976
+ if (natsEvent.resultCode === 0 && natsEvent.currentState) {
1977
+ await translateAndSpeak(natsEvent.currentState, userLang, undefined, false);
1978
+ setClickedStart(false);
1979
+ }
1980
+ }
1981
+ catch (err) {
1982
+ logWidgetError('onClickStart NATS wait failed', err);
1983
+ setMemoriTyping(false);
1984
+ setTypingText(undefined);
1985
+ }
1986
+ }
1987
+ else if (response.resultCode === 0) {
1988
+ logWidgetError('onClickStart enter-text missing correlationID', response);
1989
+ }
1684
1990
  }
1685
1991
  }
1686
1992
  }
1687
1993
  else {
1688
1994
  setHistory([]);
1689
1995
  await translateAndSpeak(dialogState, userLang);
1996
+ setClickedStart(false);
1690
1997
  }
1691
1998
  }, [memoriPwd, memori, memoriTokens, birthDate, sessionId, userLang, position]);
1692
1999
  const setPositionPopoverOpen = (0, react_1.useCallback)((open) => {
@@ -1696,32 +2003,52 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1696
2003
  }
1697
2004
  }, [autoStart, onClickStart]);
1698
2005
  (0, react_1.useEffect)(() => {
1699
- if (!clickedStart && autoStart && selectedLayout !== 'HIDDEN_CHAT') {
2006
+ if (!clickedStart &&
2007
+ !sessionStartingRef.current &&
2008
+ !sessionId &&
2009
+ autoStart &&
2010
+ selectedLayout !== 'HIDDEN_CHAT' &&
2011
+ (!needsCredits || hasEnoughCredits)) {
1700
2012
  onClickStart();
1701
2013
  }
1702
- }, [clickedStart, autoStart, selectedLayout]);
2014
+ }, [
2015
+ clickedStart,
2016
+ autoStart,
2017
+ selectedLayout,
2018
+ sessionId,
2019
+ needsCredits,
2020
+ hasEnoughCredits,
2021
+ ]);
1703
2022
  (0, react_1.useEffect)(() => {
2023
+ var _a;
1704
2024
  const targetNode = document.querySelector(`memori-client[memoriname="${memori.name}"]`) ||
1705
2025
  document.querySelector(`memori-client[memoriid="${memori.memoriID}"]`) ||
1706
2026
  document.querySelector('memori-client');
1707
2027
  if (!targetNode) {
1708
2028
  return;
1709
2029
  }
2030
+ const propsToken = (_a = additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken) !== null && _a !== void 0 ? _a : authToken;
2031
+ const initialDomToken = targetNode.getAttribute('authtoken') || undefined;
2032
+ if (initialDomToken && !propsToken) {
2033
+ setLoginToken(initialDomToken);
2034
+ userTokenRef.current = initialDomToken;
2035
+ }
2036
+ const applyAuthTokenFromElement = (element) => {
2037
+ var _a;
2038
+ const clientNode = element.nodeName === 'MEMORI-CLIENT'
2039
+ ? element
2040
+ : (_a = element.closest('memori-client')) !== null && _a !== void 0 ? _a : element.parentElement;
2041
+ const token = (clientNode === null || clientNode === void 0 ? void 0 : clientNode.getAttribute('authtoken')) || undefined;
2042
+ setLoginToken(token);
2043
+ userTokenRef.current = token;
2044
+ };
1710
2045
  const config = { attributes: true, childList: false, subtree: false };
1711
- const callback = (mutationList, _observer) => {
1712
- var _a, _b, _c;
2046
+ const callback = mutationList => {
2047
+ var _a;
1713
2048
  for (const mutation of mutationList) {
1714
2049
  if (mutation.type === 'attributes' &&
1715
2050
  ((_a = mutation.attributeName) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === 'authtoken') {
1716
- if (mutation.target.nodeName === 'MEMORI-CLIENT') {
1717
- setLoginToken(mutation.target.getAttribute('authtoken') || undefined);
1718
- userToken = mutation.target.getAttribute('authtoken') || undefined;
1719
- }
1720
- else {
1721
- setLoginToken(((_c = (_b = mutation.target) === null || _b === void 0 ? void 0 : _b.parentElement) === null || _c === void 0 ? void 0 : _c.getAttribute('authtoken')) ||
1722
- undefined);
1723
- userToken = mutation.target.getAttribute('authtoken') || undefined;
1724
- }
2051
+ applyAuthTokenFromElement(mutation.target);
1725
2052
  }
1726
2053
  }
1727
2054
  };
@@ -1730,7 +2057,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1730
2057
  return () => {
1731
2058
  observer.disconnect();
1732
2059
  };
1733
- }, []);
2060
+ }, [memori.name, memori.memoriID, additionalInfo === null || additionalInfo === void 0 ? void 0 : additionalInfo.loginToken, authToken]);
1734
2061
  const [experts, setExperts] = (0, react_1.useState)();
1735
2062
  const fetchExperts = (0, react_1.useCallback)(async () => {
1736
2063
  if (!sessionId || !(memori === null || memori === void 0 ? void 0 : memori.enableBoardOfExperts))
@@ -1740,12 +2067,8 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1740
2067
  if (resp.resultCode === 0) {
1741
2068
  setExperts(experts);
1742
2069
  }
1743
- else {
1744
- console.warn('Error fetching experts', resp);
1745
- }
1746
2070
  }
1747
- catch (err) {
1748
- console.warn(err);
2071
+ catch (_a) {
1749
2072
  }
1750
2073
  }, [sessionId, memori === null || memori === void 0 ? void 0 : memori.enableBoardOfExperts]);
1751
2074
  (0, react_1.useEffect)(() => {
@@ -1755,11 +2078,26 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1755
2078
  !!loginToken &&
1756
2079
  !!(user === null || user === void 0 ? void 0 : user.userID) &&
1757
2080
  (user === null || user === void 0 ? void 0 : user.pAndCUAccepted);
1758
- const needsCredits = tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation;
1759
- const [hasEnoughCredits, setHasEnoughCredits] = (0, react_1.useState)(true);
1760
- const checkCredits = (0, react_1.useCallback)(async () => {
2081
+ const handleNotEnoughCredits = (0, react_1.useCallback)(() => {
2082
+ setHasEnoughCredits(false);
2083
+ setAuthModalState(null);
2084
+ add((0, ui_1.createAlertOptions)({
2085
+ description: t('notEnoughCredits'),
2086
+ severity: 'error',
2087
+ }));
2088
+ }, [add, t]);
2089
+ const checkCredits = (0, react_1.useCallback)(async (options) => {
1761
2090
  if (!(tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation))
1762
- return;
2091
+ return true;
2092
+ if (!ownerUserID && !ownerUserName) {
2093
+ if (options === null || options === void 0 ? void 0 : options.notify) {
2094
+ handleNotEnoughCredits();
2095
+ }
2096
+ else {
2097
+ setHasEnoughCredits(false);
2098
+ }
2099
+ return false;
2100
+ }
1763
2101
  try {
1764
2102
  const resp = await (0, credits_1.getCredits)({
1765
2103
  operation: deepThoughtEnabled
@@ -1772,22 +2110,36 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1772
2110
  });
1773
2111
  if (resp.enough) {
1774
2112
  setHasEnoughCredits(true);
2113
+ return true;
1775
2114
  }
1776
2115
  else {
1777
- setHasEnoughCredits(false);
1778
- console.warn('Not enough credits. Required:', resp.required);
2116
+ if (options === null || options === void 0 ? void 0 : options.notify) {
2117
+ handleNotEnoughCredits();
2118
+ }
2119
+ else {
2120
+ setHasEnoughCredits(false);
2121
+ }
2122
+ return false;
1779
2123
  }
1780
2124
  }
1781
- catch (e) {
1782
- let err = e;
1783
- console.debug(err);
2125
+ catch (err) {
2126
+ logWidgetError('checkCredits failed', err);
2127
+ return true;
1784
2128
  }
1785
- }, [tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation, deepThoughtEnabled]);
2129
+ }, [
2130
+ baseUrl,
2131
+ deepThoughtEnabled,
2132
+ handleNotEnoughCredits,
2133
+ ownerUserID,
2134
+ ownerUserName,
2135
+ tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation,
2136
+ tenantID,
2137
+ ]);
1786
2138
  (0, react_1.useEffect)(() => {
1787
2139
  if (tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation) {
1788
2140
  checkCredits();
1789
2141
  }
1790
- }, [tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation, deepThoughtEnabled]);
2142
+ }, [tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation, deepThoughtEnabled, checkCredits]);
1791
2143
  (0, react_1.useEffect)(() => {
1792
2144
  if (__WEBCOMPONENT__)
1793
2145
  return;
@@ -1806,16 +2158,16 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1806
2158
  ? selectedLayout !== 'TOTEM' && selectedLayout !== 'WEBSITE_ASSISTANT'
1807
2159
  : !showOnlyLastMessages;
1808
2160
  const canShowLoginButton = !(tenant === null || tenant === void 0 ? void 0 : tenant.ssoLogin) &&
1809
- ((_w = showLogin !== null && showLogin !== void 0 ? showLogin : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showLogin) !== null && _w !== void 0 ? _w : memori.requireLoginToken);
2161
+ ((_y = showLogin !== null && showLogin !== void 0 ? showLogin : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showLogin) !== null && _y !== void 0 ? _y : memori.requireLoginToken);
1810
2162
  const headerProps = {
1811
2163
  memori: {
1812
2164
  ...memori,
1813
- ownerUserID: (_y = (_x = memori.ownerUserID) !== null && _x !== void 0 ? _x : ownerUserID) !== null && _y !== void 0 ? _y : undefined,
2165
+ ownerUserID: (_0 = (_z = memori.ownerUserID) !== null && _z !== void 0 ? _z : ownerUserID) !== null && _0 !== void 0 ? _0 : undefined,
1814
2166
  },
1815
2167
  apiClient: client,
1816
2168
  tenant,
1817
2169
  history,
1818
- showShare: (_z = showShare !== null && showShare !== void 0 ? showShare : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showShare) !== null && _z !== void 0 ? _z : true,
2170
+ showShare: (_1 = showShare !== null && showShare !== void 0 ? showShare : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showShare) !== null && _1 !== void 0 ? _1 : true,
1819
2171
  position,
1820
2172
  layout: selectedLayout,
1821
2173
  additionalSettings,
@@ -1825,18 +2177,18 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1825
2177
  setShowSettingsDrawer,
1826
2178
  setShowKnownFactsDrawer,
1827
2179
  setShowExpertsDrawer,
1828
- enableAudio: (_0 = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _0 !== void 0 ? _0 : true,
2180
+ enableAudio: (_2 = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _2 !== void 0 ? _2 : true,
1829
2181
  speakerMuted: speakerMuted !== null && speakerMuted !== void 0 ? speakerMuted : false,
1830
2182
  setSpeakerMuted: (mute) => {
1831
2183
  toggleMute(mute);
1832
2184
  },
1833
2185
  setShowChatHistoryDrawer,
1834
- showSettings: (_1 = showSettings !== null && showSettings !== void 0 ? showSettings : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showSettings) !== null && _1 !== void 0 ? _1 : true,
1835
- showChatHistory: (_2 = showChatHistory !== null && showChatHistory !== void 0 ? showChatHistory : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showChatHistory) !== null && _2 !== void 0 ? _2 : true,
2186
+ showSettings: (_3 = showSettings !== null && showSettings !== void 0 ? showSettings : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showSettings) !== null && _3 !== void 0 ? _3 : true,
2187
+ showChatHistory: (_4 = showChatHistory !== null && showChatHistory !== void 0 ? showChatHistory : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showChatHistory) !== null && _4 !== void 0 ? _4 : true,
1836
2188
  showMessageConsumption: enableMessageConsumption,
1837
2189
  hasUserActivatedSpeak,
1838
2190
  showReload: selectedLayout === 'TOTEM',
1839
- showClear: (_3 = showClear !== null && showClear !== void 0 ? showClear : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showClear) !== null && _3 !== void 0 ? _3 : false,
2191
+ showClear: (_5 = showClear !== null && showClear !== void 0 ? showClear : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showClear) !== null && _5 !== void 0 ? _5 : false,
1840
2192
  clearHistory: () => setHistory(h => h.slice(-1)),
1841
2193
  showLogin: canShowLoginButton,
1842
2194
  setShowLoginDrawer,
@@ -1851,7 +2203,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1851
2203
  setShowLoginDrawer(false);
1852
2204
  setUser(undefined);
1853
2205
  setLoginToken(undefined);
1854
- userToken = undefined;
2206
+ userTokenRef.current = undefined;
1855
2207
  (0, configuration_1.removeLocalConfig)('loginToken');
1856
2208
  });
1857
2209
  },
@@ -1867,7 +2219,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1867
2219
  hasUserActivatedSpeak,
1868
2220
  isPlayingAudio: isPlayingAudio &&
1869
2221
  !speakerMuted &&
1870
- ((_4 = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _4 !== void 0 ? _4 : true),
2222
+ ((_6 = enableAudio !== null && enableAudio !== void 0 ? enableAudio : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.enableAudio) !== null && _6 !== void 0 ? _6 : true),
1871
2223
  loading: !!memoriTyping,
1872
2224
  baseUrl,
1873
2225
  apiUrl: client.constants.BACKEND_URL,
@@ -1897,7 +2249,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1897
2249
  notEnoughCredits: needsCredits && !hasEnoughCredits,
1898
2250
  showLogin: canShowLoginButton,
1899
2251
  setShowLoginDrawer,
1900
- showChatHistory: (_5 = showChatHistory !== null && showChatHistory !== void 0 ? showChatHistory : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showChatHistory) !== null && _5 !== void 0 ? _5 : true,
2252
+ showChatHistory: (_7 = showChatHistory !== null && showChatHistory !== void 0 ? showChatHistory : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showChatHistory) !== null && _7 !== void 0 ? _7 : true,
1901
2253
  setShowChatHistoryDrawer,
1902
2254
  user,
1903
2255
  };
@@ -1907,7 +2259,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1907
2259
  tenant,
1908
2260
  translateTo: isMultilanguageEnabled &&
1909
2261
  userLang.toUpperCase() !==
1910
- ((_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())
2262
+ ((_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())
1911
2263
  ? userLang
1912
2264
  : undefined,
1913
2265
  baseUrl,
@@ -1915,9 +2267,9 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1915
2267
  layout,
1916
2268
  memoriTyping,
1917
2269
  typingText,
1918
- showTypingText: (_11 = showTypingText !== null && showTypingText !== void 0 ? showTypingText : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showTypingText) !== null && _11 !== void 0 ? _11 : false,
2270
+ showTypingText: (_13 = showTypingText !== null && showTypingText !== void 0 ? showTypingText : integrationConfig === null || integrationConfig === void 0 ? void 0 : integrationConfig.showTypingText) !== null && _13 !== void 0 ? _13 : false,
1919
2271
  history: showFullHistory ? history : history.slice(-2),
1920
- 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,
2272
+ authToken: resolveLoginToken(),
1921
2273
  dialogState: currentDialogState,
1922
2274
  pushMessage,
1923
2275
  simulateUserPrompt,
@@ -2092,7 +2444,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
2092
2444
  setShowLoginDrawer(false);
2093
2445
  setUser(user);
2094
2446
  setLoginToken(token);
2095
- userToken = token;
2447
+ userTokenRef.current = token;
2096
2448
  (0, configuration_1.setLocalConfig)('loginToken', token);
2097
2449
  if ((state === null || state === void 0 ? void 0 : state.sessionID) &&
2098
2450
  state.sessionID !== sessionId &&
@@ -2125,7 +2477,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
2125
2477
  setShowLoginDrawer(false);
2126
2478
  setUser(undefined);
2127
2479
  setLoginToken(undefined);
2128
- userToken = undefined;
2480
+ userTokenRef.current = undefined;
2129
2481
  (0, configuration_1.removeLocalConfig)('loginToken');
2130
2482
  });
2131
2483
  } }))] }) }));