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