@hivegpt/hiveai-angular 0.0.558 → 0.0.559

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.
@@ -1 +1 @@
1
- {"version":3,"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","_","label","sent","trys","ops","g","Iterator","verb","Symbol","iterator","n","v","op","pop","length","push","__values","o","s","m","i","__read","r","ar","error","__spreadArray","to","from","pack","arguments","l","slice","concat","SuppressedError","TranslationService","eventId","translationsData","Key","DefaultValue","Translations","en","fr","it","es","de","zh","ru","setEventId","id","getTranslation","key","console","log","lang","localStorage","getItem","replace","entry","find","item","getLang","storageKey","type","Injectable","args","providedIn","formatHoursAndMinutes","date","hours","getHours","minutes","getMinutes","formatNow","timezone","now","Date","options","hour12","hour","minute","timeZone","toLocaleString","formatTimeStamps","timestamps","trim","prod_environment","USERS_API","BASE_URL","AGENTS_API","API_KEY","SocketUrl","dev_environment","ConversationService","conversationStorageKeyPrefix","sessionStorageKeyPrefix","userSpecificNotification","Subject","generateKey","Math","floor","getTime","toString","random","getKey","botId","resetKey","setItem","getSessionKey","sessionId","sendValidatedUserData","message","getUserSpecificNotification","asObservable","NotificationSocket","_super","_this","socketConfig","on","warn","err","Socket","url","transports","reconnection","autoConnect","upgrade","reconnectionDelay","reconnectionDelayMax","reconnectionAttempts","Infinity","SocketService","conversationService","notificationSocket","isCommonSocketInitialized","isUserSpecificSocketInitialized","isUserSpecificEventReleased","messageQueue","releaseInterval","intervalSetup","startReleasingMessages","isSocketInitialized","isCommon","disconnectSocketConnection","disconnect","connectSocketConnection","connect","registerUserSpecificHiveSocket","conversation_id","org_id","groupId","groupId_org","emit","fromEvent","subscribe","res","hasOtherFields","_a","OtherFields","messageId","_c","_b","message_id","hasAnswer","_e","_d","answer","isWorkflow","_g","_f","workflow_id","raw","setInterval","shift","BotsService","http","eventDescription","bot_api","fetchSpeechAuthorizationToken","apiKey","domain","headers","HttpHeaders","get","pipe","map","resp","token","getWorkflowsByOrgId","orgId","getWorkflowExecutionById","executionId","apiUrl","HttpClient","AudioAnalyzerService","audioContext","analyserNode","dataArray","animationFrameId","isRunning","audioLevelsSubject","BehaviorSubject","isUserSpeakingSubject","noiseFloor","noiseFloorSamples","NOISE_FLOOR_SAMPLE_COUNT","SPEAKING_THRESHOLD_MULTIPLIER","WAVEFORM_BAR_COUNT","audioLevels$","isUserSpeaking$","start","stream","stop","window","AudioContext","webkitAudioContext","source","createMediaStreamSource","createAnalyser","fftSize","smoothingTimeConstant","bufferLength","frequencyBinCount","Uint8Array","analyze","cancelAnimationFrame","state","close","catch","getByteTimeDomainData","rms","calculateRMS","sum","reduce","a","isSpeaking","bars","generateWaveformBars","requestAnimationFrame","data","normalized","sqrt","abs","min","max","WebSocketVoiceClientService","ws","roomCreatedSubject","userTranscriptSubject","botTranscriptSubject","roomCreated$","userTranscript$","botTranscript$","wsUrl","readyState","WebSocket","OPEN","onmessage","event","msg","JSON","parse","roomUrl","room_url","text","final","onerror","onclose","defineProperty","DailyVoiceClientService","ngZone","callObject","localStream","localSessionId","remoteAudioElement","remoteAudioContext","remoteSpeakingRAF","speakingSubject","userSpeakingSubject","micMutedSubject","localStreamSubject","speaking$","userSpeaking$","micMuted$","localStream$","navigator","mediaDevices","getUserMedia","audio","audioTrack","getAudioTracks","getTracks","forEach","Error","Daily","createCallObject","videoSource","audioSource","setupEventHandlers","joinOptions","join","toISOString","participants","local","session_id","localAudio","cleanup","err_1","run","peerId","activeSpeaker","isLocal","participant","track","kind","muted","tracks","playRemoteTrack","monitorRemoteAudio","stopRemoteAudioMonitor","stopRemoteAudio","errorMsg","onunmute","MediaStream","Audio","autoplay","srcObject","onplaying","firstTimeUpdate_1","ontimeupdate","play","ctx","analyser_1","dataArray_1","lastSoundTime_1","isSpeaking_1","poll_1","getByteFrequencyData","avg","toFixed","pause","setMuted","setLocalAudio","leave","destroy","NgZone","VoiceAgentService","audioAnalyzer","wsClient","dailyClient","callStateSubject","statusTextSubject","durationSubject","isMicMutedSubject","callStartTime","durationInterval","subscriptions","Subscription","destroy$","callState$","statusText$","duration$","isMicMuted$","add","levels","ngOnDestroy","unsubscribe","resetToIdle","stopDurationTimer","conversationId","eventToken","eventUrl","domainAuthority","baseUrl","fetch","method","Authorization","eventtoken","eventurl","stringify","bot_id","voice","ok","status","json","rn_ws_url","take","takeUntil","onRoomCreated","error_1","filter","combineLatest","bot","user","current","startDurationTimer","toggleMic","updateDuration","elapsed","seconds","padStart","clearInterval","eClassificationType","VOICE_MODAL_CONFIG","InjectionToken","VOICE_MODAL_CLOSE_CALLBACK","VoiceAgentModalComponent","voiceAgentService","injector","EventEmitter","agentName","agentRole","injectedConfig","onCloseCallback","displayAvatarUrl","callState","statusText","duration","isMicMuted","isUserSpeaking","audioLevels","hasLeftConnectedOnce","isConnecting","ngOnInit","agentAvatar","speaking","startCall","sub","getWaveformHeight","level","callAgain","backToChat","endCall","hangUp","Component","selector","template","Injector","Output","Input","ChatDrawerComponent","fb","botService","cdr","sanitizer","elementRef","renderer","socketService","translationService","overlay","viewContainerRef","bodyOverflowClass","isCollapsedTrue","copilotName","autoScrollOnNewMessage","connectionsList","pendingSentRequestUserIds","isConnectionsEnabled","isUnEvent","feedbackEvent","onCloseEvent","openPage","sessionActions","sessionActionBlocked","closeBot","connectWithUser","viewSpeakerProfile","viewBooth","scheduleMeeting","refreshToken","openSupport","autogenKey","addToMyAgendaAction","myUpcomingSessionAction","connectOrFollowAction","aiResponse","chatLog","decoder","TextDecoder","feedbackDone","greetingMsg","hasBackdropValue","input","listenerAdded","loading","mode","quickPrompts","thumbsDownMsgIndex","userName","showStartAgain","isIOSDevice","showFeedBackIconsIndex","temperature","speakers","requestedSpeakerIds","Set","conSessionKey","currentWorkflowActionProgress","currentWorkflowAction","recognizedText","authorizationToken","region","isVoiceModalOpen","voiceModalOverlayRef","voiceTranscriptSubscriptions","domainAuthorityValue","chatSocketInitialized","SESSION_CARDS_INITIAL","ATTENDEE_CARDS_INITIAL","SPEAKER_CARDS_INITIAL","SPONSOR_CARDS_INITIAL","BOOTH_REP_CARDS_INITIAL","expandedSessionCardIds","expandedAttendeeCardIds","expandedSpeakerCardIds","expandedSponsorCardIds","expandedBoothRepCardIds","expandedAttendeeDescriptionIds","attendeeVideoPlayingIds","attendeeVideoMutedIds","isChatingWithAi","readAllChunks","reader","getReader","allSuggestions","closed","scrollToBottom","ReadableStream","controller","pump","currentMessageForEditor","currentIndexForEditor","isDropdownOpen","selectedAgents","allSelected","isDocInEditMode","isContentLoaded","isCollapsed","isCollapsedForGraph","isCollapsedForFGraph","dateTime","currentSourcesList","isShowEditorButton","isDrawerOpen","voiceModalConversationId","chatMain","ElementRef","getLoadingTime","getUserIdInitials","first","firstName","last","lastName","toUpperCase","getAttendeeInitials","name","parts","split","Boolean","ngOnChanges","changes","currentValue","s27Token","previousValue","isFetchDataFor","chat","is401","fetchDataFor","fetchData","environment","applyBaseUrlOverride","defaultEnv","isDev","assign","location","hostname","includes","changeTemperature","fetchBotConfig","markForCheck","fetchChatHistory","response","mapChatHistory","initializeSpeechRecognizer","ensureChatSocket","initializeSocket","setTimeout","listenSockets","stripHtml","html","DOMParser","parseFromString","textContent","getAttendeeDescription","attendee","description","interests","jobTitle","str","test","shouldShowAttendeeReadMore","getAttendeeDescKey","msgId","_id","attendeeId","userId","isAttendeeDescriptionExpanded","toggleAttendeeDescription","ev","stopPropagation","_14","getAttendeeVideoUrl","userVideosModel","getAttendeeVideoPoster","poster","thumbnail","getAttendeeMediaKey","isAttendeeVideoMuted","isAttendeeVideoPlaying","toggleAttendeeVideoMute","videoEl","volume","toggleAttendeeVideoPlay","onAttendeeVideoPlayState","isPlaying","formatSessionWhen","dateTimeRange","displayTimeZone","localeOpts","end","startDt","endDt","toLocaleDateString","month","day","year","toLocaleTimeString","startMatch","match","endMatch","startStr","endStr","getSessionDateBadge","isNaN","formatSessionTimeRange","startTime","endTime","getTimezoneAbbreviation","tz","tzId","startsWith","winMap","WINDOWS_TZ_ABBR_MAP","winKey","keys","k","toLowerCase","TZ_ABBR_MAP","mapped","keyLower_1","entries","tzPart","Intl","DateTimeFormat","timeZoneName","formatToParts","getStatusTextFromSessionRoles","sessionRoles","isArray","mapSessionsToCardData","sessions","userTimezone","undefined","whenRaw","actualDateTimeRange","whenFormatted","some","sessionRoleName","sessionTimeZone","tzAbbr","whenWithTz","whenDisplay","dateBadge","timeRange","abstract","meetingType","_j","_h","sessionType","sessionTypeLabel","timeZoneDisplay","timeRangeWithTz","title","_k","organizer","_l","room","_m","roomName","when","dateDay","dateMonth","session","collectSpeakerIdsFromSessionCards","sessionCards","ids","sessionCards_1","sessionCards_1_1","card","raw_1","e_2","raw_1_1","sid","attachSpeakersToSessionCards","sessionCards_2","sessionCards_2_1","speakersList","x","ensureSpeakersForSessionCards","missing","has","getSpeakersByStaffIds","getSpeakerPhotoUrl","speaker","photo","photoPath","avatarUrl","profileImageUrl","profileImage","profilePicture","imageUrl","image","hasSessionCardSpeakers","sessionCard","list","getSpeakerDisplayName","getSpeakerInitials","mapAttendeesToCardData","attendees","company","mapSpeakersToCardData","rawDesc","rawTitle","speakerId","mapSponsorsToCardData","sponsors","boothDescription","urlSlug","boothUrl","boothID","boothId","logoUrl","website","category","boothTitle","mapBoothsToCardData","booths","mapBoothRepsToCardData","representatives","parseSessionContentV2","content","block","lines","j","line","timeMatch","tzMatch","roomMatch","typeMatch","tzLineMatch","getVisibleSessionCards","total","expanded","getVisibleAttendeeCards","attendeeCards","getVisibleSpeakerCards","speakerCards","getVisibleSponsorCards","sponsorCards","getVisibleBoothRepCards","boothRepCards","expandSessionCards","expandAttendeeCards","expandSpeakerCards","expandSponsorCards","expandBoothRepCards","getSessionTypeLabel","getSessionRoleButtons","action","roles","raw_2","raw_2_1","isSessionOndemand","classificationId","OnDemand","canPerformSessionAction","isButtonActivated","getMeetingDelayMinutes","startDate","actualStart","diffMs","isMeetingDelayed","delay","onSessionCardAction","role","eventSubscription","percentage","output","action_name","current_action_name_1","current_action_name","workflow_execution_id","time_stamp","actionIndex","workflowExecutionDetails","Actions","findIndex","Name","currentWorkflowExecutionDetails","executingWorkflow","focusOnTextarea","detectChanges","otherFields","serializable","serializable_to_return","tool_name","contentStr","_o","tool_result","messages","answerText","pushed","_p","parsed","msgId_1","cardEntry","processMessageForDisplay","time","existingIdx","_s","_r","_q","_t","msgId_2","_w","_v","_u","_y","_x","msgId_3","_1","_0","_z","_2","msgId_4","_5","_4","_3","_6","msgId_5","_9","_8","_7","_10","msgId_6","message_id_1","web_results","search_results","graphs","execution_graphs","suggestions","answerLength","webResultsCount","_11","searchResultsCount","_12","currentChatMessage","chatLogLength","searchTerms","sourcesList","displayedSources","remainingSources","answerPreview","_13","substring","executionGraphs","relatedListItems","initializeSocketAndListen","handleEvent","newTemperature","wrapper","document","querySelector","classList","remove","onStartAgain","archieveMessages","post","switchMap","of","catchError","triggerSupport","botName","botIcon","Icon","botSkills","Skills","Greeting","thumbsDownMessages","NegativeResponses","QuickPrompts","conversationKey","accept","handleError","operation","pushAiMessageFromHistory","WebLinks","Text","ExecutionGraphs","Graphs","SearchTerms","InsertTimestamp","copied","chats","Messages","Type","WorkflowExecutionId","toolName","toolresults","processMessage","markdownLinkRegex","urlRegex","sanitizeHtml","hashes","ngAfterViewChecked","nativeElement","querySelectorAll","link","addEventListener","onFeedbackClick","bind","bypassSecurityTrustHtml","onClose","removeClass","sendMessageWithTile","prompt","textarea","myInput","style","height","makeAskRequest","agents","inputMsg","fetchSmallTalk","smallTalk","isFeedbackMsg","read","lastItem","decodedChunk","decode","suggestionsMatch","aiFormattedData","section_id","fetchMyConnections","fetchPendingRequests","speakerIds","sectionId","sessionIds","usersLen","search","connetUserIds","is_open_page","isMobileBrowser","addCloseBotClickEvent","enqueue","submitFeedback","flag","isHelpful","thumbsUpMessage","supportLink","getElementById","handleKeydown","shiftKey","preventDefault","handleSubmit","handleUpClick","idx","liked","unliked","handleDownClick","copyText","index","textElement","tempTextArea","createElement","innerText","appendChild","select","execCommand","removeChild","handleCopyClick","sanitizeHTML","doc","fragment","createDocumentFragment","childNodes","node","cloneNode","simplifiedDiv","script","innerHTML","handleEditorClick","isEditor","editorsDrawer","open","button","display","counter","interval","scrollTop","scrollHeight","focus","handleAction","info","ngAfterViewInit","drawer","opened","setBodyOverflow","openedChange","removeBodyOverflow","addClass","cleanIds","tap","performSessionAction","element","listen","userAgent","connectToUser","canDisconnect","scheduleMeetingWithUser","checkPendingSentRequest","pending","pendingRequests","canFollowUser","uid","canUnfollowUser","myConnections","c","canConnect","conn","toggleDropdown","fetchAgents","onSelectAll","agent","selected","onAgentChange","agentFound","areAllSelected","every","getDropdownHeaderText","fetchAgents_http","fetchContent_http","documentContent","fetchEditorContent","markdown","marked","Renderer","href","markdownContent","prepareHtml","code","escapedCode","escapeHtml","language","copyToClipboard","clipboard","writeText","alert","toggleCollapse","toggleCollapseGraph","toggleCollapseFGraph","getDomainName","URL","getFaviconUrl","onCardClick","sources","sourcesDrawer","openOuterEditor","onCloseEditor","onDrawerClosed","onCloseSource","toggleDrawer","todo","updateButtonVisibility","openLinkInNewTab","adjustTextareaHeight","target","overflowY","toggleWorkflows","checkForCop29BotId","orgWorkflows","isWorkflowOpen","selectedWorkflow","openWorkflowInput","initializeForm","formControls","Trigger","InputSchema","InputId","Value","Required","Validators","required","workflowForm","group","onWorkflowSelected","workflow","onWorkflowSubmit","valid","generateMarkdown","showWorkflowExecutionLoader","Inputs","workflowInputs","WorkflowName","workflowId","workflow_inputs","user_question","user_id","first_name","last_name","workspaceToken","makeAskRequestold","obj","key_label","_loop_1","this_1","Label","_15","_16","_17","showWorkflowHistoryDetails","showWorkflowExecutionDetails","InsertTimeStamp","closeModal","objectToArray","startNewConversation","speechConfig","SpeechSDK","SpeechConfig","fromAuthorizationToken","audioConfig","AudioConfig","fromDefaultMicrophoneInput","recognizer","SpeechRecognizer","recognizing","reason","ResultReason","RecognizingSpeech","recognized","RecognizedSpeech","toggleRecording","canceled","errorDetails","sessionStopped","stopContinuousRecognitionAsync","isRecording","startRecognition","stopRecognition","startContinuousRecognitionAsync","getLatestTime","openVoiceModal","setupVoiceTranscripts","detach","dispose","config","provide","useValue","closeVoiceModal","overlayRef","hasBackdrop","scrollStrategy","scrollStrategies","positionStrategy","position","global","bottom","right","left","top","portal","ComponentPortal","attach","userSub","transcript","botSub","lastMessage","changeDetection","ChangeDetectionStrategy","OnPush","FormBuilder","ChangeDetectorRef","DomSanitizer","Renderer2","Overlay","ViewContainerRef","ViewChild","static","closePlaygroundButtons","ViewChildren","ChatBotComponent","visible","toggle","VoiceAgentModule","NgModule","declarations","imports","CommonModule","providers","exports","SafeHtmlPipe","transform","Pipe","VideoPlayerComponent","el","isMuted","isFullscreen","isFullscreenvideoPlaying","toggleSound","video","togglePlay","playState","videoObj","innerWidth","observer","IntersectionObserver","isIntersecting","threshold","observe","toggleFullscreen","fullscreenvideo","toggleFullscreenPlay","followUser","myPendingSentRequests","getIniNames","charAt","decorators","Inject","DOCUMENT","BotHtmlEditorComponent","documentName","quillConfig","toolbar","header","font","filldataInForm","editorContent","saveContent","saveContent_http","updateContent_http","put","HiveGptModule","OverlayModule","MatIconModule","MatSidenavModule","FormsModule","ReactiveFormsModule","QuillModule"],"sources":["../../../../node_modules/tslib/tslib.es6.js","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/translations/translation.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/utils/utils.ts","../../../../projects/hivegpt/eventsgpt-angular/src/environments/environment.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/conversation.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/NotificationSocket.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/socket-service.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/bot.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/services/audio-analyzer.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/services/websocket-voice-client.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/services/daily-voice-client.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/services/voice-agent.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/chat-drawer/chat-drawer.component.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/voice-modal-tokens.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/chatbot/chatbot.component.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/voice-agent.module.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/pipes/safe-html.pipe.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/video-player/video-player.component.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/bot-html-editor/bot-html-editor.component.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/hivegpt.module.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TranslationService {\n private eventId: string | null = null;\n\n setEventId(id: string) {\n this.eventId = id;\n }\n\n getTranslation(key: string): string {\n console.log('eventId', this.eventId);\n // let lang = String(this.getLang(this.eventId)).replace(/^\"|\"$/g, '');\n const lang = (\n localStorage.getItem('defaultLanguage-' + this.eventId) || 'en'\n ).replace(/^\"|\"$/g, '');\n\n const entry = this.translationsData.find((item) => item.Key === key);\n\n if (!entry) {\n return key; // fallback\n }\n\n return entry.Translations[lang] || entry.DefaultValue || key;\n }\n\n private getLang(eventId?: string | null): string {\n const suffix = eventId ? `-${eventId}` : '';\n const storageKey = `defaultLanguage${suffix}`;\n\n return localStorage.getItem(storageKey) || 'en';\n }\n\n private translationsData: any[] = [\n { \n Key: \"Copy\",\n DefaultValue: \"Copy\",\n Translations: {\n en: \"Copy\",\n fr: \"Copier\",\n it: \"Copia\",\n es: \"Copiar\",\n de: \"Kopieren\",\n \"pt-br\": \"Copiar\",\n ar: \"نسخ\",\n zh: \"复制\",\n ru: \"Копировать\"\n }\n}\n,\n {\n \n Key: \"May I assist you with anything else\",\n DefaultValue: \"Great. May I assist you with anything else?\",\n Translations: {\n en: \"Great. May I assist you with anything else?\",\n fr: \"Parfait. Puis-je vous aider avec autre chose ?\",\n it: \"Perfetto. Posso aiutarti con qualcos'altro?\",\n es: \"Genial. ¿Puedo ayudarte con algo más?\",\n de: \"Super. Kann ich Ihnen noch bei etwas anderem helfen?\",\n \"pt-br\": \"Ótimo. Posso ajudar com mais alguma coisa?\",\n ar: \"رائع. هل يمكنني مساعدتك في أي شيء آخر؟\",\n zh: \"太好了。还有什么我可以帮您的吗?\",\n ru: \"Отлично. Могу ли я помочь вам с чем-то ещё?\"\n }\n},\n {\n Key: \"We are sorry we've not been able to answer your question\",\n DefaultValue: \"We are sorry we've not been able to answer your question. However, our dedicated support team is happy to help. Please <a href=\\\"mailto:support@social27.com\\\">click here</a> and a human agent will assist you as soon as possible.\",\n Translations: {\n en: \"We are sorry we've not been able to answer your question. However, our dedicated support team is happy to help. Please <a href=\\\"mailto:support@social27.com\\\">click here</a> and a human agent will assist you as soon as possible.\",\n fr: \"Nous sommes désolés de ne pas avoir pu répondre à votre question. Cependant, notre équipe d'assistance se fera un plaisir de vous aider. Veuillez <a href=\\\"mailto:support@social27.com\\\">cliquer ici</a> et un agent humain vous assistera dès que possible.\",\n it: \"Ci dispiace di non essere riusciti a rispondere alla tua domanda. Tuttavia, il nostro team di supporto dedicato sarà lieto di aiutarti. Ti preghiamo di <a href=\\\"mailto:support@social27.com\\\">fare clic qui</a> e un operatore umano ti assisterà al più presto.\",\n es: \"Lamentamos no haber podido responder a tu pregunta. Sin embargo, nuestro equipo de soporte estará encantado de ayudarte. Por favor, <a href=\\\"mailto:support@social27.com\\\">haz clic aquí</a> y un agente humano te asistirá lo antes posible.\",\n de: \"Es tut uns leid, dass wir Ihre Frage nicht beantworten konnten. Unser engagiertes Support-Team hilft Ihnen jedoch gerne weiter. Bitte <a href=\\\"mailto:support@social27.com\\\">klicken Sie hier</a>, und ein menschlicher Mitarbeiter wird Ihnen so bald wie möglich helfen.\",\n \"pt-br\": \"Lamentamos não ter conseguido responder à sua pergunta. No entanto, nossa equipe de suporte dedicada ficará feliz em ajudar. Por favor, <a href=\\\"mailto:support@social27.com\\\">clique aqui</a> e um agente humano o ajudará o mais rápido possível.\",\n ar: \"نأسف لعدم تمكننا من الإجابة على سؤالك. ومع ذلك، يسعد فريق الدعم المخصص لدينا بمساعدتك. يرجى <a href=\\\"mailto:support@social27.com\\\">النقر هنا</a> وسيساعدك أحد الوكلاء البشريين في أقرب وقت ممكن.\",\n zh: \"很抱歉我们未能回答您的问题。不过,我们的专属支持团队很乐意为您提供帮助。请<a href=\\\"mailto:support@social27.com\\\">点击这里</a>,人工客服将尽快为您提供协助。\",\n ru: \"К сожалению, мы не смогли ответить на ваш вопрос. Однако наша служба поддержки с радостью вам поможет. Пожалуйста, <a href=\\\"mailto:support@social27.com\\\">нажмите здесь</a>, и наш оператор свяжется с вами как можно скорее.\"\n }\n},\n {\n Key: 'Ask anything',\n DefaultValue: 'Ask anything',\n Translations: {\n en: 'Ask anything',\n fr: 'Demandez ce que vous voulez',\n it: 'Chiedi qualsiasi cosa',\n es: 'Pregunta lo que quieras',\n de: 'Frag alles',\n 'pt-br': 'Pergunte qualquer coisa',\n ar: 'اسأل أي شيء',\n zh: '随便问',\n ru: 'Спросите что угодно',\n },\n },\n {\n Key: 'Assistant',\n DefaultValue: 'Assistant',\n Translations: {\n en: 'Assistant',\n fr: 'Assistant',\n it: 'Assistente',\n es: 'Asistente',\n de: 'Assistent',\n 'pt-br': 'Assistente',\n ar: 'مساعد',\n zh: '助手',\n ru: 'Ассистент',\n },\n },\n {\n Key: 'Your personal or company information is kept private and secure within this chat.',\n DefaultValue:\n 'Your personal or company information is kept private and secure within this chat.',\n Translations: {\n en: 'Your personal or company information is kept private and secure within this chat.',\n fr: 'Vos informations personnelles ou celles de votre entreprise sont conservées privées et sécurisées dans cette conversation.',\n it: \"Le tue informazioni personali o aziendali sono mantenute private e sicure all'interno di questa chat.\",\n es: 'Tu información personal o de la empresa se mantiene privada y segura dentro de este chat.',\n de: 'Ihre persönlichen oder geschäftlichen Informationen bleiben in diesem Chat privat und sicher.',\n 'pt-br':\n 'Suas informações pessoais ou da empresa são mantidas privadas e seguras dentro deste chat.',\n ar: 'تظل معلوماتك الشخصية أو معلومات شركتك خاصة وآمنة داخل هذه المحادثة.',\n zh: '您的个人或公司信息在此聊天中保持私密和安全。',\n ru: 'Ваша личная или корпоративная информация остается конфиденциальной и защищенной в этом чате.',\n },\n },\n {\n Key: 'Send message',\n DefaultValue: 'Send message',\n Translations: {\n en: 'Send message',\n fr: 'Envoyer un message',\n it: 'Invia messaggio',\n es: 'Enviar mensaje',\n de: 'Nachricht senden',\n 'pt-br': 'Enviar mensagem',\n ar: 'إرسال رسالة',\n zh: '发送消息',\n ru: 'Отправить сообщение',\n },\n },\n {\n Key: 'Platform GPT',\n DefaultValue: 'Platform GPT',\n Translations: {\n en: 'Platform GPT',\n fr: 'Plateforme GPT',\n it: 'Piattaforma GPT',\n es: 'Plataforma GPT',\n de: 'Plattform GPT',\n 'pt-br': 'Plataforma GPT',\n ar: 'منصة GPT',\n zh: '平台 GPT',\n ru: 'Платформа GPT',\n },\n },\n {\n Key: 'New Chat',\n DefaultValue: 'New Chat',\n Translations: {\n en: 'New Chat',\n fr: 'Nouvelle conversation',\n it: 'Nuova chat',\n es: 'Nuevo chat',\n de: 'Neuer Chat',\n 'pt-br': 'Novo chat',\n ar: 'محادثة جديدة',\n zh: '新聊天',\n ru: 'Новый чат',\n },\n },\n {\n Key: 'You',\n DefaultValue: 'You',\n Translations: {\n en: 'You',\n fr: 'Vous',\n it: 'Tu',\n es: 'Tú',\n de: 'Du',\n 'pt-br': 'Você',\n ar: 'أنت',\n zh: '您',\n ru: 'Вы',\n },\n },\n {\n Key: 'Write your message',\n DefaultValue: 'Write your message',\n Translations: {\n en: 'Write your message',\n fr: 'Écrivez votre message',\n it: 'Scrivi il tuo messaggio',\n es: 'Escribe tu mensaje',\n de: 'Schreiben Sie Ihre Nachricht',\n 'pt-br': 'Escreva sua mensagem',\n ar: 'اكتب رسالتك',\n zh: '写下您的消息',\n ru: 'Напишите ваше сообщение',\n },\n },\n {\n Key: 'Send',\n DefaultValue: 'Send',\n Translations: {\n en: 'Send',\n fr: 'Envoyer',\n it: 'Invia',\n es: 'Enviar',\n de: 'Senden',\n 'pt-br': 'Enviar',\n ar: 'إرسال',\n zh: '发送',\n ru: 'Отправить',\n },\n },\n \n {\n Key: 'Call Interface',\n DefaultValue: 'Call Interface',\n Translations: {\n en: 'Call Interface',\n fr: \"Interface d'appel\",\n it: 'Interfaccia chiamata',\n es: 'Interfaz de llamada',\n de: 'Anrufoberfläche',\n 'pt-br': 'Interface de chamada',\n ar: 'واجهة الاتصال',\n zh: '呼叫界面',\n ru: 'Интерфейс звонка',\n },\n },\n {\n Key: 'Close',\n DefaultValue: 'Close',\n Translations: {\n en: 'Close',\n fr: 'Fermer',\n it: 'Chiudi',\n es: 'Cerrar',\n de: 'Schließen',\n 'pt-br': 'Fechar',\n ar: 'إغلاق',\n zh: '关闭',\n ru: 'Закрыть',\n },\n },\n ];\n}\n","const formatHoursAndMinutes = (date: Date) => {\n let hours = date.getHours() % 12;\n const minutes = date.getMinutes();\n const amPm = date.getHours() < 12 ? 'AM' : 'PM';\n if(hours === 0) hours = 12;\n\n const formattedHours = hours < 10 ? `0${hours}` : hours;\n const formattedMinutes = minutes < 10 ? `0${minutes}` : minutes;\n\n return `${formattedHours}:${formattedMinutes} ${amPm}`;\n};\n\nexport const formatNow = (timezone?: string) => {\n const now = new Date();\n if (timezone) {\n const options: any = {\n hour12: true,\n hour: 'numeric',\n minute: 'numeric',\n timeZone: timezone,\n };\n return now.toLocaleString('en-US', options);\n }\n return formatHoursAndMinutes(now);\n};\n\nexport const formatTimeStamps = (timezone: string | undefined, timestamps: any) => {\n const date = new Date(timestamps + 'Z');\n const options: any = {\n hour12: true,\n hour: 'numeric',\n minute: 'numeric',\n };\n if (timezone && timezone.trim()) {\n options.timeZone = timezone.trim();\n }\n return date.toLocaleString('en-US', options);\n};\n","\n\nexport const prod_environment = {\n USERS_API: 'https://es-user.social27.com/api',\n BASE_URL: 'https://agent-api.hivegpt.ai',\n AGENTS_API: 'https://hive-ai.social27.com/api',\n API_KEY: '82595783-dc9c-4513-8204-709818d51be3',\n SocketUrl: 'https://notif-v2-ws.social27.com/'\n}\n\n\nexport const dev_environment = {\n USERS_API: 'https://pre-user.social27.com/api',\n BASE_URL: 'https://pre-agent-api.hivegpt.ai',\n AGENTS_API: 'https://hive-pre-ai.social27.com/api',\n API_KEY: '66d59244c50b8fb597a101t1',\n SocketUrl: 'https://notif-ws-staging.social27.com/',\n};\n\n","import { Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConversationService {\n private conversationStorageKeyPrefix = 'conversationKey_';\n private sessionStorageKeyPrefix = 'sessionKey_';\n\n private userSpecificNotification: Subject<any> = new Subject<any>();\n\n constructor() { }\n\n generateKey(): string {\n const timestamp = Math.floor(new Date().getTime() / 1000).toString(16);\n const randomHex = 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, () => {\n return Math.floor(Math.random() * 16).toString(16);\n });\n return timestamp + randomHex;\n }\n\n getKey(botId: string, resetKey: boolean = false): string {\n const storageKey = `${this.conversationStorageKeyPrefix}${botId}`;\n let value = localStorage.getItem(storageKey);\n\n if (!value || resetKey) {\n value = this.generateKey();\n localStorage.setItem(storageKey, value);\n }\n\n return value;\n }\n\n getSessionKey(sessionId: string, resetKey: boolean = false): string {\n const storageKey = `${this.sessionStorageKeyPrefix}${sessionId}`;\n let value = localStorage.getItem(storageKey);\n\n if (!value || resetKey) {\n value = this.generateKey();\n localStorage.setItem(storageKey, value);\n }\n\n return value;\n }\n\n sendValidatedUserData(message: any) {\n this.userSpecificNotification.next(message);\n }\n\n getUserSpecificNotification(): Observable<any> {\n return this.userSpecificNotification.asObservable();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Socket, SocketIoConfig } from 'ngx-socket-io';\nimport { prod_environment } from '../../environments/environment';\n\n@Injectable({\n providedIn: 'root' // This ensures the service is available across the application\n})\nexport class NotificationSocket extends Socket {\n constructor() {\n super(socketConfig);\n\n // Log connection status\n this.on('connect', () => {\n console.log('Socket connected');\n });\n\n this.on('disconnect', () => {\n console.warn('Socket disconnected');\n });\n\n this.on('connect_error', (err) => {\n console.error('Socket connection error:', err);\n });\n }\n}\n\nconst socketConfig: SocketIoConfig = {\n url: prod_environment.SocketUrl,\n options: {\n transports: ['websocket', 'polling'],\n reconnection: true,\n autoConnect: true,\n upgrade: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 5000,\n reconnectionAttempts: Infinity\n }\n};","import { Injectable } from '@angular/core';\n\nimport { Observable, Subject } from 'rxjs';\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\nimport { ConversationService } from './conversation.service';\nimport { NotificationSocket } from './NotificationSocket';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SocketService {\n public testMessage: string;\n private isCommonSocketInitialized = false;\n private isUserSpecificSocketInitialized = false;\n private isUserSpecificEventReleased = true;\n private messageQueue: any[] = [];\n private releaseInterval = 1000;\n private intervalSetup: boolean = false;\n\n constructor(\n private conversationService: ConversationService,\n private notificationSocket: NotificationSocket\n ) {\n this.startReleasingMessages();\n }\n\n isSocketInitialized(isCommon: boolean) {\n return isCommon\n ? this.isCommonSocketInitialized\n : this.isUserSpecificSocketInitialized &&\n !this.isUserSpecificEventReleased;\n }\n\n disconnectSocketConnection() {\n this.notificationSocket.disconnect();\n }\n connectSocketConnection() {\n this.notificationSocket.connect();\n }\n registerUserSpecificHiveSocket(botId: string, conversation_id: string, org_id: string) {\n const commonNotification = 'commonNotification';\n const groupId = `Hive_AI_Notifs_${botId}_${conversation_id}`;\n const groupId_org = `Hive_AI_Notifs_${org_id}`;\n\n // Remove any pre-existing listeners for commonNotification\n // this.notificationSocket.removeAllListeners(commonNotification);\n\n // Join the group again with updated botId and conversation_id\n this.notificationSocket.emit('joinData', { groupId });\n this.notificationSocket.emit('joinData', { groupId: groupId_org });\n\n // Re-register for common notifications\n this.notificationSocket.fromEvent(commonNotification).subscribe(\n (res: any) => {\n console.log('[Socket Chat] Received commonNotification', {\n hasOtherFields: !!res?.m?.OtherFields,\n messageId: res?.m?.OtherFields?.message_id,\n hasAnswer: !!res?.m?.OtherFields?.answer,\n isWorkflow: !!res?.m?.OtherFields?.workflow_id,\n raw: res,\n });\n this.conversationService.sendValidatedUserData(res);\n },\n (error) => {\n console.error('Error receiving commonNotification:', error);\n }\n );\n }\n\n private startReleasingMessages() {\n if (!this.intervalSetup) {\n setInterval(() => {\n if (this.messageQueue.length > 0) {const message = this.messageQueue.shift(); // Remove the first message from the queue\n // Handle the message here, e.g., send it to the server or process it\n console.log('Releasing message from queue:', message);\n // this.campaignService.sendValidatedUserData(message);\n }\n }, this.releaseInterval);\n this.intervalSetup = true; // Prevents multiple intervals\n }\n }\n}\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { catchError, map } from 'rxjs/operators';\n\nimport { HttpHeaders } from '@angular/common/http';\nimport { Observable, Subject, throwError } from 'rxjs';\nimport { AnyRecord } from 'dns';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BotsService {\n eventDescription = new Subject();\n bot_api = 'https://agent-api.hivegpt.ai/';\n constructor(private http: HttpClient) { }\n\n fetchSpeechAuthorizationToken(botId, apiKey, domain) {\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'hive-bot-id': botId,\n 'domain-authority': domain\n });\n\n const apiUrl = `${this.bot_api}speech/issue_token`;\n const url = `${apiUrl}`;\n return this.http.get(url, { headers }).pipe(\n map((resp: any) => {\n return resp.token;\n })\n );\n }\n\n getWorkflowsByOrgId(orgId: string): Observable<any> {\n const apiUrl = `${this.bot_api}workflows`;\n const url = `${apiUrl}?org_id=${orgId}`;\n return this.http.get(url).pipe(\n map((resp: any) => {\n return resp;\n })\n );\n }\n\n getWorkflowExecutionById(executionId: string): Observable<any> {\n const apiUrl = `${this.bot_api}workflows/execution/${executionId}`;\n return this.http.get(apiUrl).pipe(\n map((resp: any) => {\n return resp;\n })\n );\n }\n}","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/**\n * Audio analyzer for waveform visualization only.\n * Do NOT use isUserSpeaking$ for call state; speaking state must come from Daily.js.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AudioAnalyzerService {\n private audioContext: AudioContext | null = null;\n private analyserNode: AnalyserNode | null = null;\n private dataArray: Uint8Array | null = null;\n private animationFrameId: number | null = null;\n private isRunning = false;\n\n private audioLevelsSubject = new BehaviorSubject<number[]>([]);\n private isUserSpeakingSubject = new BehaviorSubject<boolean>(false);\n\n // Adaptive noise floor detection\n private noiseFloor = 0;\n private noiseFloorSamples: number[] = [];\n private readonly NOISE_FLOOR_SAMPLE_COUNT = 30;\n private readonly SPEAKING_THRESHOLD_MULTIPLIER = 2.5;\n private readonly WAVEFORM_BAR_COUNT = 40;\n\n audioLevels$: Observable<number[]> = this.audioLevelsSubject.asObservable();\n isUserSpeaking$: Observable<boolean> = this.isUserSpeakingSubject.asObservable();\n\n start(stream: MediaStream): void {\n if (this.isRunning) {\n this.stop();\n }\n\n try {\n this.audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const source = this.audioContext.createMediaStreamSource(stream);\n \n this.analyserNode = this.audioContext.createAnalyser();\n this.analyserNode.fftSize = 2048;\n this.analyserNode.smoothingTimeConstant = 0.8;\n \n const bufferLength = this.analyserNode.frequencyBinCount;\n this.dataArray = new Uint8Array(bufferLength);\n \n source.connect(this.analyserNode);\n \n this.isRunning = true;\n this.noiseFloorSamples = [];\n this.noiseFloor = 0;\n \n this.analyze();\n } catch (error) {\n console.error('Error starting audio analyzer:', error);\n this.stop();\n }\n }\n\n stop(): void {\n this.isRunning = false;\n \n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n\n if (this.analyserNode) {\n this.analyserNode.disconnect();\n this.analyserNode = null;\n }\n\n if (this.audioContext && this.audioContext.state !== 'closed') {\n this.audioContext.close().catch(console.error);\n this.audioContext = null;\n }\n\n this.dataArray = null;\n this.audioLevelsSubject.next([]);\n this.isUserSpeakingSubject.next(false);\n }\n\n private analyze(): void {\n if (!this.isRunning || !this.analyserNode || !this.dataArray) {\n return;\n }\n\n this.analyserNode.getByteTimeDomainData(this.dataArray);\n \n // Calculate RMS (Root Mean Square) volume\n const rms = this.calculateRMS(this.dataArray);\n \n // Learn noise floor during initial samples\n if (this.noiseFloorSamples.length < this.NOISE_FLOOR_SAMPLE_COUNT) {\n this.noiseFloorSamples.push(rms);\n if (this.noiseFloorSamples.length === this.NOISE_FLOOR_SAMPLE_COUNT) {\n // Calculate average noise floor\n const sum = this.noiseFloorSamples.reduce((a, b) => a + b, 0);\n this.noiseFloor = sum / this.NOISE_FLOOR_SAMPLE_COUNT;\n }\n } else {\n // Update noise floor adaptively (moving average)\n this.noiseFloor = this.noiseFloor * 0.99 + rms * 0.01;\n }\n\n // Detect if user is speaking\n const threshold = this.noiseFloor * this.SPEAKING_THRESHOLD_MULTIPLIER;\n const isSpeaking = rms > threshold;\n this.isUserSpeakingSubject.next(isSpeaking);\n\n // Generate waveform bars\n const bars = this.generateWaveformBars(this.dataArray);\n this.audioLevelsSubject.next(bars);\n\n this.animationFrameId = requestAnimationFrame(() => this.analyze());\n }\n\n private calculateRMS(data: Uint8Array): number {\n let sum = 0;\n for (let i = 0; i < data.length; i++) {\n const normalized = (data[i] - 128) / 128;\n sum += normalized * normalized;\n }\n return Math.sqrt(sum / data.length);\n }\n\n private generateWaveformBars(data: Uint8Array): number[] {\n const bars: number[] = [];\n const step = Math.floor(data.length / this.WAVEFORM_BAR_COUNT);\n \n for (let i = 0; i < this.WAVEFORM_BAR_COUNT; i++) {\n const index = i * step;\n const value = data[index];\n // Normalize to 0-100\n const normalized = Math.abs((value - 128) / 128) * 100;\n bars.push(Math.min(100, Math.max(0, normalized)));\n }\n \n return bars;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\n/** WebSocket message types from backend signaling. */\nexport interface WsMessageRoomCreated {\n type: 'room_created';\n room_url: string;\n}\n\nexport interface WsMessageUserTranscript {\n type: 'user_transcript';\n text: string;\n final?: boolean;\n}\n\nexport interface WsMessageBotTranscript {\n type: 'bot_transcript';\n text: string;\n}\n\nexport type WsMessage =\n | WsMessageRoomCreated\n | WsMessageUserTranscript\n | WsMessageBotTranscript;\n\nexport interface TranscriptData {\n text: string;\n final: boolean;\n}\n\n/**\n * WebSocket-only client for voice agent signaling.\n * CRITICAL: Uses native WebSocket only. NO Socket.IO, NO ngx-socket-io.\n *\n * Responsibilities:\n * - Connect to ws_url (from POST /ai/ask-voice response)\n * - Parse JSON messages (room_created, user_transcript, bot_transcript)\n * - Emit roomCreated$, userTranscript$, botTranscript$\n * - NO audio logic, NO mic logic. Audio is handled by Daily.js (WebRTC).\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class WebSocketVoiceClientService {\n private ws: WebSocket | null = null;\n private roomCreatedSubject = new Subject<string>();\n private userTranscriptSubject = new Subject<TranscriptData>();\n private botTranscriptSubject = new Subject<string>();\n\n /** Emits room_url when backend sends room_created. */\n roomCreated$: Observable<string> = this.roomCreatedSubject.asObservable();\n\n /** Emits user transcript updates. */\n userTranscript$: Observable<TranscriptData> =\n this.userTranscriptSubject.asObservable();\n\n /** Emits bot transcript updates. */\n botTranscript$: Observable<string> =\n this.botTranscriptSubject.asObservable();\n\n /** Connect to signaling WebSocket. No audio over this connection. */\n connect(wsUrl: string): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n return;\n }\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n try {\n this.ws = new WebSocket(wsUrl);\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data) as Record<string, unknown>;\n if (msg?.type === 'room_created') {\n const roomUrl = (msg.room_url ?? msg.roomUrl) as string | undefined;\n if (typeof roomUrl === 'string') {\n this.roomCreatedSubject.next(roomUrl);\n }\n } else if (msg?.type === 'user_transcript' && typeof msg.text === 'string') {\n this.userTranscriptSubject.next({\n text: msg.text,\n final: msg.final === true,\n });\n } else if (msg?.type === 'bot_transcript' && typeof msg.text === 'string') {\n this.botTranscriptSubject.next(msg.text);\n }\n } catch {\n // Ignore non-JSON or unknown messages\n }\n };\n this.ws.onerror = () => {\n this.disconnect();\n };\n this.ws.onclose = () => {\n this.ws = null;\n };\n } catch (err) {\n console.error('WebSocketVoiceClient: connect failed', err);\n this.ws = null;\n throw err;\n }\n }\n\n /** Disconnect and cleanup. */\n disconnect(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /** Whether the WebSocket is open. */\n get isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport Daily from '@daily-co/daily-js';\nimport type { DailyCall, DailyParticipant } from '@daily-co/daily-js';\n\n/**\n * Daily.js WebRTC client for voice agent audio.\n * Responsibilities:\n * - Create and manage Daily CallObject\n * - Join Daily room using room_url\n * - Handle mic capture + speaker playback\n * - Bot speaking detection via AnalyserNode on remote track (instant)\n * - User speaking detection via active-speaker-change\n * - Expose speaking$ (bot speaking), userSpeaking$ (user speaking), micMuted$\n * - Expose localStream$ for waveform visualization (AudioAnalyzerService)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DailyVoiceClientService {\n private callObject: DailyCall | null = null;\n private localStream: MediaStream | null = null;\n private localSessionId: string | null = null;\n /** Explicit playback of remote (bot) audio; required in some browsers. */\n private remoteAudioElement: HTMLAudioElement | null = null;\n\n /** AnalyserNode-based remote audio monitor for instant bot speaking detection. */\n private remoteAudioContext: AudioContext | null = null;\n private remoteSpeakingRAF: number | null = null;\n\n private speakingSubject = new BehaviorSubject<boolean>(false);\n private userSpeakingSubject = new BehaviorSubject<boolean>(false);\n private micMutedSubject = new BehaviorSubject<boolean>(false);\n private localStreamSubject = new BehaviorSubject<MediaStream | null>(null);\n\n /** True when bot (remote participant) is the active speaker. */\n speaking$: Observable<boolean> = this.speakingSubject.asObservable();\n\n /** True when user (local participant) is the active speaker. */\n userSpeaking$: Observable<boolean> = this.userSpeakingSubject.asObservable();\n\n /** True when mic is muted. */\n micMuted$: Observable<boolean> = this.micMutedSubject.asObservable();\n\n /** Emits local mic stream for waveform visualization. */\n localStream$: Observable<MediaStream | null> =\n this.localStreamSubject.asObservable();\n\n constructor(private ngZone: NgZone) {}\n\n /**\n * Connect to Daily room. Acquires mic first for waveform, then joins with audio.\n * @param roomUrl Daily room URL (from room_created)\n * @param token Optional meeting token\n */\n async connect(roomUrl: string, token?: string): Promise<void> {\n if (this.callObject) {\n await this.disconnect();\n }\n\n try {\n // Get mic stream for both Daily and waveform (single capture)\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const audioTrack = stream.getAudioTracks()[0];\n if (!audioTrack) {\n stream.getTracks().forEach((t) => t.stop());\n throw new Error('No audio track');\n }\n\n this.localStream = stream;\n this.localStreamSubject.next(stream);\n\n // Create audio-only call object\n // videoSource: false = no camera, audioSource = our mic track\n const callObject = Daily.createCallObject({\n videoSource: false,\n audioSource: audioTrack,\n });\n\n this.callObject = callObject;\n\n this.setupEventHandlers(callObject);\n\n // Join room; Daily handles playback of remote (bot) audio automatically.\n // Only pass token when it's a non-empty string (Daily rejects undefined/non-string).\n const joinOptions: { url: string; token?: string } = { url: roomUrl };\n if (typeof token === 'string' && token.trim() !== '') {\n joinOptions.token = token;\n }\n await callObject.join(joinOptions);\n console.log(`[VoiceDebug] Room connected (Daily join complete) — ${new Date().toISOString()}`);\n\n const participants = callObject.participants();\n if (participants?.local) {\n this.localSessionId = participants.local.session_id;\n }\n\n // Initial mute state: Daily starts with audio on\n this.micMutedSubject.next(!callObject.localAudio());\n } catch (err) {\n this.cleanup();\n throw err;\n }\n }\n\n private setupEventHandlers(call: DailyCall): void {\n // active-speaker-change: used ONLY for user speaking detection.\n // Bot speaking is detected by our own AnalyserNode (instant, no debounce).\n call.on('active-speaker-change', (event: { activeSpeaker?: { peerId?: string } }) => {\n this.ngZone.run(() => {\n const peerId = event?.activeSpeaker?.peerId;\n if (!peerId || !this.localSessionId) {\n this.userSpeakingSubject.next(false);\n return;\n }\n const isLocal = peerId === this.localSessionId;\n this.userSpeakingSubject.next(isLocal);\n });\n });\n\n // track-started / track-stopped: set up remote audio playback + AnalyserNode monitor.\n call.on('track-started', (event: { participant?: DailyParticipant | null; type?: string; track?: MediaStreamTrack }) => {\n this.ngZone.run(() => {\n const p = event?.participant;\n const type = event?.type ?? event?.track?.kind;\n const track = event?.track;\n if (p && !p.local && type === 'audio') {\n console.log(`[VoiceDebug] Got audio track from backend (track-started) — readyState=${track?.readyState}, muted=${track?.muted} — ${new Date().toISOString()}`);\n const audioTrack = track ?? (p as { tracks?: { audio?: { track?: MediaStreamTrack } } }).tracks?.audio?.track;\n if (audioTrack && typeof audioTrack === 'object') {\n this.playRemoteTrack(audioTrack);\n this.monitorRemoteAudio(audioTrack);\n }\n }\n });\n });\n\n call.on('track-stopped', (event: { participant?: DailyParticipant | null; type?: string; track?: MediaStreamTrack }) => {\n this.ngZone.run(() => {\n const p = event?.participant;\n const type = event?.type ?? event?.track?.kind;\n if (p && !p.local && type === 'audio') {\n this.stopRemoteAudioMonitor();\n this.stopRemoteAudio();\n }\n });\n });\n\n call.on('left-meeting', () => {\n this.ngZone.run(() => this.cleanup());\n });\n\n call.on('error', (event?: { errorMsg?: string }) => {\n this.ngZone.run(() => {\n console.error('DailyVoiceClient: Daily error', event?.errorMsg ?? event);\n this.cleanup();\n });\n });\n }\n\n /**\n * Play remote (bot) audio track via a dedicated audio element.\n * Required in many browsers where Daily's internal playback does not output to speakers.\n */\n private playRemoteTrack(track: MediaStreamTrack): void {\n this.stopRemoteAudio();\n try {\n console.log(`[VoiceDebug] playRemoteTrack called — track.readyState=${track.readyState}, track.muted=${track.muted} — ${new Date().toISOString()}`);\n\n track.onunmute = () => {\n console.log(`[VoiceDebug] Remote audio track UNMUTED (audio data arriving) — ${new Date().toISOString()}`);\n };\n\n const stream = new MediaStream([track]);\n const audio = new Audio();\n audio.autoplay = true;\n audio.srcObject = stream;\n this.remoteAudioElement = audio;\n\n audio.onplaying = () => {\n console.log(`[VoiceDebug] Audio element PLAYING (browser started playback) — ${new Date().toISOString()}`);\n };\n\n let firstTimeUpdate = true;\n audio.ontimeupdate = () => {\n if (firstTimeUpdate) {\n firstTimeUpdate = false;\n console.log(`[VoiceDebug] Audio element first TIMEUPDATE (actual audio output) — ${new Date().toISOString()}`);\n }\n };\n\n const p = audio.play();\n if (p && typeof p.then === 'function') {\n p.then(() => {\n console.log(`[VoiceDebug] audio.play() resolved — ${new Date().toISOString()}`);\n }).catch((err) => {\n console.warn('DailyVoiceClient: remote audio play failed (may need user gesture)', err);\n });\n }\n } catch (err) {\n console.warn('DailyVoiceClient: failed to create remote audio element', err);\n }\n }\n\n /**\n * Monitor remote audio track energy via AnalyserNode.\n * Polls at ~60fps and flips speakingSubject based on actual audio energy.\n */\n private monitorRemoteAudio(track: MediaStreamTrack): void {\n this.stopRemoteAudioMonitor();\n try {\n const ctx = new AudioContext();\n const source = ctx.createMediaStreamSource(new MediaStream([track]));\n const analyser = ctx.createAnalyser();\n analyser.fftSize = 256;\n source.connect(analyser);\n this.remoteAudioContext = ctx;\n\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n const THRESHOLD = 5;\n const SILENCE_MS = 1500;\n let lastSoundTime = 0;\n let isSpeaking = false;\n\n const poll = () => {\n if (!this.remoteAudioContext) return;\n analyser.getByteFrequencyData(dataArray);\n\n let sum = 0;\n for (let i = 0; i < dataArray.length; i++) {\n sum += dataArray[i];\n }\n const avg = sum / dataArray.length;\n\n const now = Date.now();\n if (avg > THRESHOLD) {\n lastSoundTime = now;\n if (!isSpeaking) {\n isSpeaking = true;\n console.log(`[VoiceDebug] Bot audio energy detected (speaking=true) — avg=${avg.toFixed(1)} — ${new Date().toISOString()}`);\n this.ngZone.run(() => {\n this.userSpeakingSubject.next(false);\n this.speakingSubject.next(true);\n });\n }\n } else if (isSpeaking && now - lastSoundTime > SILENCE_MS) {\n isSpeaking = false;\n console.log(`[VoiceDebug] Bot audio silence detected (speaking=false) — ${new Date().toISOString()}`);\n this.ngZone.run(() => this.speakingSubject.next(false));\n }\n\n this.remoteSpeakingRAF = requestAnimationFrame(poll);\n };\n\n this.remoteSpeakingRAF = requestAnimationFrame(poll);\n } catch (err) {\n console.warn('DailyVoiceClient: failed to create remote audio monitor', err);\n }\n }\n\n private stopRemoteAudioMonitor(): void {\n if (this.remoteSpeakingRAF) {\n cancelAnimationFrame(this.remoteSpeakingRAF);\n this.remoteSpeakingRAF = null;\n }\n if (this.remoteAudioContext) {\n this.remoteAudioContext.close().catch(() => {});\n this.remoteAudioContext = null;\n }\n }\n\n private stopRemoteAudio(): void {\n if (this.remoteAudioElement) {\n try {\n this.remoteAudioElement.pause();\n this.remoteAudioElement.srcObject = null;\n } catch (_) {}\n this.remoteAudioElement = null;\n }\n }\n\n /** Set mic muted state. */\n setMuted(muted: boolean): void {\n if (!this.callObject) return;\n this.callObject.setLocalAudio(!muted);\n this.micMutedSubject.next(muted);\n }\n\n /** Disconnect and cleanup. */\n async disconnect(): Promise<void> {\n if (!this.callObject) {\n this.cleanup();\n return;\n }\n try {\n await this.callObject.leave();\n } catch (e) {\n // ignore\n }\n this.cleanup();\n }\n\n private cleanup(): void {\n this.stopRemoteAudioMonitor();\n this.stopRemoteAudio();\n if (this.callObject) {\n this.callObject.destroy().catch(() => {});\n this.callObject = null;\n }\n if (this.localStream) {\n this.localStream.getTracks().forEach((t) => t.stop());\n this.localStream = null;\n }\n this.localSessionId = null;\n this.speakingSubject.next(false);\n this.userSpeakingSubject.next(false);\n this.localStreamSubject.next(null);\n // Keep last micMuted state; will reset on next connect\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, combineLatest, Observable, Subject, Subscription } from 'rxjs';\nimport { filter, take, takeUntil } from 'rxjs/operators';\nimport { AudioAnalyzerService } from './audio-analyzer.service';\nimport { WebSocketVoiceClientService } from './websocket-voice-client.service';\nimport { DailyVoiceClientService } from './daily-voice-client.service';\n\nexport type CallState =\n | 'idle'\n | 'connecting'\n | 'connected'\n | 'listening'\n | 'talking'\n | 'ended';\n\nexport interface TranscriptData {\n text: string;\n final: boolean;\n}\n\n/**\n * Voice agent orchestrator. Coordinates WebSocket (signaling) and Daily.js (WebRTC audio).\n *\n * CRITICAL: This service must NEVER use Socket.IO or ngx-socket-io. Voice flow uses only:\n * - Native WebSocket (WebSocketVoiceClientService) for signaling (room_created, transcripts)\n * - Daily.js (DailyVoiceClientService) for WebRTC audio. Audio does NOT flow over WebSocket.\n *\n * - Maintains callState, statusText, duration, isMicMuted, isUserSpeaking, audioLevels\n * - Uses WebSocket for room_created and transcripts only (no audio)\n * - Uses Daily.js for all audio, mic, and real-time speaking detection\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class VoiceAgentService implements OnDestroy {\n private callStateSubject = new BehaviorSubject<CallState>('idle');\n private statusTextSubject = new BehaviorSubject<string>('');\n private durationSubject = new BehaviorSubject<string>('00:00');\n private isMicMutedSubject = new BehaviorSubject<boolean>(false);\n private isUserSpeakingSubject = new BehaviorSubject<boolean>(false);\n private audioLevelsSubject = new BehaviorSubject<number[]>([]);\n private userTranscriptSubject = new Subject<TranscriptData>();\n private botTranscriptSubject = new Subject<string>();\n\n private callStartTime = 0;\n private durationInterval: ReturnType<typeof setInterval> | null = null;\n\n private subscriptions = new Subscription();\n private destroy$ = new Subject<void>();\n\n callState$: Observable<CallState> = this.callStateSubject.asObservable();\n statusText$: Observable<string> = this.statusTextSubject.asObservable();\n duration$: Observable<string> = this.durationSubject.asObservable();\n isMicMuted$: Observable<boolean> = this.isMicMutedSubject.asObservable();\n isUserSpeaking$: Observable<boolean> = this.isUserSpeakingSubject.asObservable();\n audioLevels$: Observable<number[]> = this.audioLevelsSubject.asObservable();\n userTranscript$: Observable<TranscriptData> =\n this.userTranscriptSubject.asObservable();\n botTranscript$: Observable<string> = this.botTranscriptSubject.asObservable();\n\n constructor(\n private audioAnalyzer: AudioAnalyzerService,\n private wsClient: WebSocketVoiceClientService,\n private dailyClient: DailyVoiceClientService\n ) {\n // Waveform visualization only - do NOT use for speaking state\n this.subscriptions.add(\n this.audioAnalyzer.audioLevels$.subscribe((levels) =>\n this.audioLevelsSubject.next(levels)\n )\n );\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.subscriptions.unsubscribe();\n this.disconnect();\n }\n\n /** Reset to idle state (e.g. when modal opens so user can click Start Call). */\n resetToIdle(): void {\n if (this.callStateSubject.value === 'idle') return;\n this.stopDurationTimer();\n this.audioAnalyzer.stop();\n this.wsClient.disconnect();\n // Fire-and-forget: Daily disconnect is async; connect() will await if needed\n void this.dailyClient.disconnect();\n this.callStateSubject.next('idle');\n this.statusTextSubject.next('');\n this.durationSubject.next('0:00');\n }\n\n async connect(\n apiUrl: string,\n token: string,\n botId: string,\n conversationId: string,\n apiKey: string,\n eventToken: string,\n eventUrl: string,\n domainAuthority: string\n ): Promise<void> {\n if (this.callStateSubject.value !== 'idle') {\n console.warn('Call already in progress');\n return;\n }\n\n try {\n this.callStateSubject.next('connecting');\n this.statusTextSubject.next('Connecting...');\n\n const baseUrl = apiUrl.replace(/\\/$/, '');\n const postUrl = `${baseUrl}/ai/ask-voice`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'domain-authority': domainAuthority,\n 'eventtoken': eventToken,\n 'eventurl': eventUrl,\n 'hive-bot-id': botId,\n 'x-api-key': apiKey,\n 'ngrok-skip-browser-warning': 'true',\n };\n\n // POST to get ws_url for signaling\n const res = await fetch(postUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n bot_id: botId,\n conversation_id: conversationId,\n voice: 'alloy',\n }),\n });\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n\n const json = await res.json();\n const wsUrl = json?.rn_ws_url;\n if (!wsUrl || typeof wsUrl !== 'string') {\n throw new Error('No ws_url in response');\n }\n\n // Subscribe to room_created BEFORE connecting to avoid race\n this.wsClient.roomCreated$\n .pipe(take(1), takeUntil(this.destroy$))\n .subscribe(async (roomUrl) => {\n try {\n await this.onRoomCreated(roomUrl);\n } catch (err) {\n console.error('Daily join failed:', err);\n this.callStateSubject.next('ended');\n this.statusTextSubject.next('Connection failed');\n await this.disconnect();\n throw err;\n }\n });\n\n // Forward transcripts from WebSocket\n this.subscriptions.add(\n this.wsClient.userTranscript$\n .pipe(takeUntil(this.destroy$))\n .subscribe((t) => this.userTranscriptSubject.next(t))\n );\n this.subscriptions.add(\n this.wsClient.botTranscript$\n .pipe(takeUntil(this.destroy$))\n .subscribe((t) => this.botTranscriptSubject.next(t))\n );\n\n // Connect signaling WebSocket (no audio over WS)\n this.wsClient.connect(wsUrl);\n } catch (error) {\n console.error('Error connecting voice agent:', error);\n this.callStateSubject.next('ended');\n await this.disconnect();\n this.statusTextSubject.next('Connection failed');\n throw error;\n }\n }\n\n private async onRoomCreated(roomUrl: string): Promise<void> {\n // Connect Daily.js for WebRTC audio\n await this.dailyClient.connect(roomUrl);\n\n // Waveform: use local mic stream from Daily client\n this.dailyClient.localStream$\n .pipe(filter((s): s is MediaStream => s != null), take(1))\n .subscribe((stream) => {\n this.audioAnalyzer.start(stream);\n });\n\n this.subscriptions.add(\n this.dailyClient.userSpeaking$.subscribe((s) =>\n this.isUserSpeakingSubject.next(s)\n )\n );\n this.subscriptions.add(\n combineLatest([\n this.dailyClient.speaking$,\n this.dailyClient.userSpeaking$,\n ]).subscribe(([bot, user]) => {\n const current = this.callStateSubject.value;\n if (current === 'connecting' && !bot) {\n return;\n }\n if (current === 'connecting' && bot) {\n this.callStartTime = Date.now();\n this.startDurationTimer();\n this.callStateSubject.next('talking');\n return;\n }\n if (user) {\n this.callStateSubject.next('listening');\n } else if (bot) {\n this.callStateSubject.next('talking');\n } else if (current === 'talking' || current === 'listening') {\n this.callStateSubject.next('connected');\n }\n })\n );\n\n this.subscriptions.add(\n this.dailyClient.micMuted$.subscribe((muted) =>\n this.isMicMutedSubject.next(muted)\n )\n );\n\n this.statusTextSubject.next('Connecting...');\n }\n\n async disconnect(): Promise<void> {\n this.stopDurationTimer();\n this.audioAnalyzer.stop();\n\n // Daily first, then WebSocket\n await this.dailyClient.disconnect();\n this.wsClient.disconnect();\n\n this.callStateSubject.next('ended');\n this.statusTextSubject.next('Call Ended');\n }\n\n toggleMic(): void {\n const current = this.isMicMutedSubject.value;\n this.dailyClient.setMuted(!current);\n }\n\n private startDurationTimer(): void {\n const updateDuration = () => {\n if (this.callStartTime > 0) {\n const elapsed = Math.floor((Date.now() - this.callStartTime) / 1000);\n const minutes = Math.floor(elapsed / 60);\n const seconds = elapsed % 60;\n this.durationSubject.next(\n `${minutes}:${String(seconds).padStart(2, '0')}`\n );\n }\n };\n updateDuration();\n this.durationInterval = setInterval(updateDuration, 1000);\n }\n\n private stopDurationTimer(): void {\n if (this.durationInterval) {\n clearInterval(this.durationInterval);\n this.durationInterval = null;\n }\n }\n}\n","// import { Platform } from '@angular/cdk/platform';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { TranslationService } from '../translations/translation.service';\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Injector,\n Input,\n OnChanges,\n OnInit,\n Output,\n QueryList,\n Renderer2,\n SimpleChanges,\n ViewChild,\n ViewChildren,\n ViewContainerRef,\n} from '@angular/core';\nimport { MatDrawer } from '@angular/material/sidenav';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { of, Subscription } from 'rxjs';\nimport { catchError, switchMap, tap } from 'rxjs/operators';\nimport { formatNow, formatTimeStamps } from '../../utils/utils';\nimport {\n dev_environment,\n prod_environment,\n} from '../../../environments/environment';\nimport { ConversationService } from '../conversation.service';\nimport { Observable } from 'rxjs';\nimport { SocketService } from '../socket-service.service';\n\nimport { FormBuilder, Validators } from '@angular/forms';\nimport * as SpeechSDK from 'microsoft-cognitiveservices-speech-sdk';\nimport { BotsService } from '../bot.service';\nimport * as marked from 'marked'; // Import marked\nimport { VoiceAgentService } from '../voice-agent/services/voice-agent.service';\nimport { VoiceAgentModalComponent } from '../voice-agent/components/voice-agent-modal/voice-agent-modal.component';\nimport {\n VOICE_MODAL_CONFIG,\n VOICE_MODAL_CLOSE_CALLBACK,\n VoiceModalConfig,\n} from '../voice-agent/voice-modal-tokens';\n\nexport enum eClassificationType {\n Live = '6040dce57615f0770af14256',\n OnDemand = '6040dce57615f0770af14257',\n Breakout = '6040dce57615f0770af14258',\n}\n\n@Component({\n selector: 'hivegpt-chat-drawer-package',\n templateUrl: './chat-drawer.component.html',\n styleUrls: ['./chat-drawer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatDrawerComponent implements OnInit, OnChanges {\n @ViewChild('chatMain') private chatMain: ElementRef;\n @ViewChild('myInput', { static: false })\n myInput!: ElementRef<HTMLTextAreaElement>; // Reference to the textarea\n @ViewChildren('closeplaygroundbutton')\n closePlaygroundButtons: QueryList<ElementRef>;\n @ViewChild('drawer') drawer!: MatDrawer;\n @ViewChild('sourcesDrawer') sourcesDrawer!: MatDrawer;\n @ViewChild('editorsDrawer') editorsDrawer!: MatDrawer;\n private bodyOverflowClass = 'body-overflow-hidden';\n isCollapsedTrue = false;\n @Input() copilotName: string = 'HiveXGPT';\n @Input() firstName!: string;\n @Input() lastName!: string;\n @Input() apiKey!: string;\n @Input() bgBubbleAi!: string;\n @Input() bgBubbleUser!: string;\n @Input() bgGradient!: string[];\n @Input() botName!: string;\n @Input() botSkills!: string;\n @Input() botId!: string;\n @Input() orgId!: string;\n @Input() closeButtonColor!: string;\n @Input() closeButtonbgColor!: string;\n @Input() credentials!: [];\n @Input() dateTimeColor!: string;\n @Input() dateTextColor!: string;\n @Input() eventId!: string;\n @Input() eventUrl!: string;\n @Input() eventToken!: string;\n @Input() workspaceToken!: string;\n @Input() s27Token!: string;\n @Input() eventName!: string;\n @Input() botIcon!: string;\n readonly displayAvatarUrl =\n 'https://www.jotform.com/uploads/mehmetkarakasli/form_files/1564593667676a8e85f23758.86945537_icon.png';\n /** User profile image URL. Falls back to initials (getUserIdInitials()) if not set. */\n @Input() userAvatarUrl?: string;\n @Input() formFieldBgColor!: string;\n @Input() formFieldTextColor!: string;\n @Input() fullView!: boolean;\n @Input() gradientColors!: string[];\n @Input() greeting!: string;\n @Input() messageTextColorAi!: string;\n @Input() messageTextColorUser!: string;\n @Input() rules!: string;\n @Input() sendButtonColor!: string;\n @Input() sendButtonTextColor!: string;\n @Input() showClose!: boolean;\n @Input() thumbsDownMessages!: string[];\n @Input() thumbsUpMessage!: string;\n /** User's selected timezone (e.g. 'America/New_York'); used for timestamps and session card times. When not set, session data or local time is used. */\n @Input() timezone?: string;\n @Input() unknownResponses!: [];\n @Input() useOpenAi!: boolean;\n @Input() userId!: string;\n @Input() isDev!: boolean;\n /** When true, chat auto-scrolls to bottom when new content is added. Default: false (no auto scroll). */\n @Input() autoScrollOnNewMessage: boolean = false;\n /** Optional API base URL (e.g. ngrok tunnel). When set, all chat/voice requests use this instead of dev/prod default. */\n @Input() baseUrl?: string;\n /** Connections list from host (e.g. from store selectConnectionsList). Each item has userId. When set, used for Connect/Request Sent/Disconnect button state. */\n @Input() connectionsList: any[] = [];\n /** Pending sent request user IDs from host (e.g. from store selectPendingConnectionsSentList). When set, used for Request Sent state. */\n @Input() pendingSentRequestUserIds: any[] = [];\n /** Whether to show Connect / Request Sent / Disconnect buttons on attendee cards (e.g. from userSettings?.isConnectionsEnabled). */\n @Input() isConnectionsEnabled: boolean = true;\n /** When true (UN/COP events): session card shows \"Session type\" label and Join/Watch buttons. When false: shows \"Meeting type\" label and single Play button (same as template2). */\n @Input() isUnEvent: boolean = false;\n\n @Input() againButtonColor!: string[];\n @Input() againButtonTextColor!: string[];\n @Output() feedbackEvent = new EventEmitter<string>();\n @Output() onCloseEvent = new EventEmitter<void>();\n @Output() openPage = new EventEmitter<any>();\n @Output() sessionActions = new EventEmitter<any>();\n /** Emitted when user clicks Join/Watch but action is not yet available (e.g. session not started). Host can show toaster with the message. */\n @Output() sessionActionBlocked = new EventEmitter<string>();\n @Output() closeBot = new EventEmitter<any>();\n @Output() connectWithUser = new EventEmitter<any>();\n /** Emitted when user clicks View profile on a speaker card (get_event_speakers). Host should open speaker detail drawer same as /events/:id/speakers. */\n @Output() viewSpeakerProfile = new EventEmitter<{ speaker: any; speakers: any[] }>();\n /** Emitted when user clicks View Booth on a sponsor/booth card (get_event_sponsors, get_event_booths). Host should navigate to events/:eventUrl/sponsors/booths/:boothUrl. */\n @Output() viewBooth = new EventEmitter<{ boothId?: string; boothUrl?: string; sponsor?: any }>();\n @Output() scheduleMeeting = new EventEmitter<string>();\n @Output() refreshToken = new EventEmitter<any>();\n @Output() openSupport = new EventEmitter<any>();\n\n autogenKey = 'Autogen_eDJTtEU-NB0RtIpzq1w';\n addToMyAgendaAction = 'add_to_my_agenda';\n myUpcomingSessionAction = 'my_upcomming_session';\n connectOrFollowAction = 'connect_or_follow';\n aiResponse: string = '';\n chatLog: any[] = [];\n decoder = new TextDecoder();\n feedbackDone: boolean = false;\n greetingMsg: string = '';\n hasBackdropValue: boolean = false;\n input: string = '';\n listenerAdded = false;\n loading: boolean = false;\n mode: string = 'over';\n quickPrompts: any[] = [];\n thumbsDownMsgIndex = 0;\n userName: string = '';\n showStartAgain: boolean = false;\n isIOSDevice: boolean = false;\n showFeedBackIconsIndex: number | null = null;\n temperature: number = 1;\n /** Speaker cache by staff id (filled via get-by-staff-ids). */\n speakers: Record<string, any> = {};\n /** Prevent duplicate speaker fetches across messages. */\n private requestedSpeakerIds = new Set<string>();\n environment: {\n USERS_API;\n BASE_URL;\n AGENTS_API;\n };\n pendingRequests: any;\n myConnections: any;\n conversationKey: string;\n conSessionKey: string = '';\n isFetchDataFor: boolean;\n is401: boolean;\n msg: any;\n chat: any;\n isWorkflowOpen: boolean;\n orgWorkflows: any;\n openWorkflowInput: boolean;\n selectedWorkflow: any;\n workflowForm: any;\n currentWorkflowActionProgress: number = 0;\n currentWorkflowAction: string = '';\n executingWorkflow: boolean;\n workflowExecutionDetails: any;\n showWorkflowExecutionDetails: any;\n currentWorkflowExecutionDetails: any;\n\n speechConfig: SpeechSDK.SpeechConfig;\n recognizer: SpeechSDK.SpeechRecognizer;\n recognizedText: string = '';\n authorizationToken: string = '';\n region: string = 'westeurope'; // Set your Azure region here\n isRecording: boolean;\n isVoiceModalOpen: boolean = false;\n private voiceModalOverlayRef: OverlayRef | null = null;\n private voiceTranscriptSubscriptions: Subscription[] = [];\n\n constructor(\n private fb: FormBuilder,\n private botService: BotsService,\n private cdr: ChangeDetectorRef,\n private http: HttpClient,\n private sanitizer: DomSanitizer,\n private elementRef: ElementRef,\n private renderer: Renderer2,\n private socketService: SocketService,\n private conversationService: ConversationService, // private platform: Platform\n private translationService: TranslationService,\n private voiceAgentService: VoiceAgentService,\n private overlay: Overlay,\n private viewContainerRef: ViewContainerRef,\n private injector: Injector,\n ) {\n this.chatMain = new ElementRef(null);\n\n // if (this.platform.IOS) {\n // this.isIOSDevice = true;\n // }\n }\n getTranslation(key: string) {\n return this.translationService.getTranslation(key);\n }\n\n /** Time shown next to \"Assistant\" when in thinking/loading state. */\n getLoadingTime(): string {\n return formatNow(this.timezone);\n }\n\n /** User initials for avatar fallback (e.g. \"JD\" from firstName + lastName). */\n getUserIdInitials(): string {\n const first = (this.firstName || '').trim();\n const last = (this.lastName || '').trim();\n if (first && last) return (first[0] + last[0]).toUpperCase();\n if (first) return first.slice(0, 2).toUpperCase();\n if (last) return last.slice(0, 2).toUpperCase();\n return 'U';\n }\n\n /** Attendee initials for card when no photo (e.g. \"Vijay Paliwal\" -> \"VP\", \"Jim\" -> \"J\"). */\n getAttendeeInitials(name: string | null | undefined): string {\n if (!name || typeof name !== 'string') return '?';\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length >= 2)\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return '?';\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Handle eventId changes to update translation service\n if (changes.eventId && changes.eventId.currentValue) {\n this.translationService.setEventId(changes.eventId.currentValue);\n }\n\n if (changes.s27Token) {\n if (changes.s27Token.currentValue != changes.s27Token.previousValue) {\n this.s27Token = changes.s27Token.currentValue;\n\n console.log('isFetchDataFor: ', this.isFetchDataFor);\n console.log('msg: ', this.msg);\n console.log('chat: ', this.chat);\n if (this.is401) {\n if (this.isFetchDataFor) {\n this.fetchDataFor(this.msg, this.chat);\n } else {\n this.fetchData(this.msg);\n }\n }\n }\n }\n\n // Do NOT call initializeSocket() here. Socket.IO is for chat only; we defer\n // until the user actually uses chat (send message or start new conversation)\n // so that voice-only usage never triggers Socket.IO (avoids v2/v3 mismatch error).\n if (\n changes.orgId &&\n changes.orgId.currentValue != changes.orgId.previousValue\n ) {\n this.chatSocketInitialized = false;\n }\n if (changes.baseUrl && this.environment) {\n this.applyBaseUrlOverride();\n }\n }\n\n /** When baseUrl input is set, override environment.BASE_URL so all chat/voice services use it (supports ngrok etc.). */\n private applyBaseUrlOverride(): void {\n const defaultEnv = this.isDev ? dev_environment : prod_environment;\n if (this.baseUrl && typeof this.baseUrl === 'string') {\n const url = this.baseUrl.trim().replace(/\\/+$/, '');\n if (url) {\n this.environment = { ...defaultEnv, BASE_URL: url };\n return;\n }\n }\n this.environment = defaultEnv;\n }\n\n domainAuthorityValue: any = 'prod-lite';\n\n ngOnInit(): void {\n // Set the eventId in translation service to get the correct language from localStorage\n if (this.eventId) {\n this.translationService.setEventId(this.eventId);\n }\n\n this.applyBaseUrlOverride();\n\n const domain = window.location.hostname;\n\n // Determine the header value based on the domain\n\n if (domain.includes('pre-app.social27.com')) {\n this.domainAuthorityValue = 'pre-prod-lite';\n } else if (domain.includes('app.social27.com')) {\n this.domainAuthorityValue = 'prod-lite';\n } else if (domain.includes('hivegpt.io')) {\n this.domainAuthorityValue = 'hivegpt';\n }\n\n // this.fetchMyConnections().subscribe();\n // this.fetchPendingRequests().subscribe();\n\n this.changeTemperature(this.temperature);\n this.fetchBotConfig().subscribe(\n (res) => {\n this.cdr.markForCheck();\n\n this.fetchChatHistory().subscribe(\n (response) => {\n this.loading = false;\n this.mapChatHistory(response);\n this.cdr.markForCheck();\n },\n (err) => {\n console.error('Error fetching chat history:', err);\n },\n );\n },\n (err) => {\n console.error('Error fetching chat history:', err);\n },\n );\n // this.fetchAgents();\n // this.fetchEditorContent();\n this.cdr.markForCheck();\n // this.initializeSocket();\n this.botService\n .fetchSpeechAuthorizationToken(\n this.botId,\n this.apiKey,\n this.domainAuthorityValue,\n )\n .subscribe((token) => {\n this.authorizationToken = token;\n this.initializeSpeechRecognizer(token);\n });\n }\n\n private eventSubscription: Subscription;\n /** True after Socket has been initialized for chat (avoids connecting on voice-only usage). */\n private chatSocketInitialized = false;\n\n /**\n * Call before chat actions so Socket.IO is used only for chat, not for voice.\n * Voice agent uses native WebSocket + Daily.js only; Socket.IO must not run during voice flow.\n */\n private ensureChatSocket(): void {\n if (this.chatSocketInitialized || !this.orgId) return;\n this.chatSocketInitialized = true;\n this.initializeSocket();\n }\n\n initializeSocket() {\n try {\n this.socketService.disconnectSocketConnection();\n } catch (error) {}\n setTimeout(() => {\n this.socketService.connectSocketConnection();\n setTimeout(() => {\n console.log('YES INIT');\n const conversation_id = this.conversationService.getKey(this.botId);\n\n this.socketService.registerUserSpecificHiveSocket(\n this.botId,\n conversation_id,\n this.orgId,\n );\n setTimeout(() => {\n this.listenSockets();\n }, 300);\n }, 200);\n }, 300);\n }\n\n subscriptionNew: any;\n socketData: any;\n\n /** Initial number of session/attendee cards shown before \"Show X more\". */\n readonly SESSION_CARDS_INITIAL = 6;\n readonly ATTENDEE_CARDS_INITIAL = 9;\n readonly SPEAKER_CARDS_INITIAL = 9;\n readonly SPONSOR_CARDS_INITIAL = 9;\n readonly BOOTH_REP_CARDS_INITIAL = 9;\n /** Message id -> true when user expanded \"Show more\" for sessions/attendees. */\n expandedSessionCardIds: Record<string, boolean> = {};\n expandedAttendeeCardIds: Record<string, boolean> = {};\n expandedSpeakerCardIds: Record<string, boolean> = {};\n expandedSponsorCardIds: Record<string, boolean> = {};\n expandedBoothRepCardIds: Record<string, boolean> = {};\n /** key: `${messageId}:${attendeeId}` -> true when description expanded */\n expandedAttendeeDescriptionIds: Record<string, boolean> = {};\n /** key: `${messageId}:${attendeeId}` -> true when video is playing */\n attendeeVideoPlayingIds: Record<string, boolean> = {};\n /** key: `${messageId}:${attendeeId}` -> true when video is muted (default true) */\n attendeeVideoMutedIds: Record<string, boolean> = {};\n\n /** Strip HTML tags to plain text (e.g. for speaker/attendee description from API). */\n stripHtml(html: string): string {\n if (!html || typeof html !== 'string') return '';\n const doc = new DOMParser().parseFromString(html, 'text/html');\n const text = doc.body?.textContent ?? '';\n return text.replace(/\\s+/g, ' ').trim();\n }\n\n getAttendeeDescription(attendee: any): string {\n const raw =\n attendee?.description ?? attendee?.interests ?? attendee?.jobTitle ?? '';\n const str = typeof raw === 'string' ? raw.trim() : String(raw ?? '').trim();\n // If it looks like HTML, strip tags so card shows plain text\n if (str && /<[a-z][\\s\\S]*>/i.test(str)) return this.stripHtml(str);\n return str;\n }\n\n shouldShowAttendeeReadMore(attendee: any): boolean {\n // heuristic: only show toggle for reasonably long text\n return this.getAttendeeDescription(attendee).length > 90;\n }\n\n private getAttendeeDescKey(chat: any, attendee: any): string | null {\n const msgId = chat?._id;\n const attendeeId = attendee?.id ?? attendee?._id ?? attendee?.userId;\n if (!msgId || !attendeeId) return null;\n return `${msgId}:${attendeeId}`;\n }\n\n isAttendeeDescriptionExpanded(chat: any, attendee: any): boolean {\n const key = this.getAttendeeDescKey(chat, attendee);\n if (!key) return false;\n return !!this.expandedAttendeeDescriptionIds[key];\n }\n\n toggleAttendeeDescription(chat: any, attendee: any, ev?: Event): void {\n ev?.stopPropagation?.();\n const key = this.getAttendeeDescKey(chat, attendee);\n if (!key) return;\n const next = !this.expandedAttendeeDescriptionIds[key];\n this.expandedAttendeeDescriptionIds = {\n ...this.expandedAttendeeDescriptionIds,\n [key]: next,\n };\n this.cdr.markForCheck();\n }\n\n getAttendeeVideoUrl(attendee: any): string {\n const url = attendee?.userVideosModel?.url;\n return typeof url === 'string' ? url.trim() : '';\n }\n\n getAttendeeVideoPoster(attendee: any): string {\n const poster = attendee?.userVideosModel?.thumbnail;\n return typeof poster === 'string' ? poster.trim() : '';\n }\n\n private getAttendeeMediaKey(chat: any, attendee: any): string | null {\n const msgId = chat?._id;\n const attendeeId = attendee?.id ?? attendee?._id ?? attendee?.userId;\n if (!msgId || !attendeeId) return null;\n return `${msgId}:${attendeeId}`;\n }\n\n isAttendeeVideoMuted(chat: any, attendee: any): boolean {\n const key = this.getAttendeeMediaKey(chat, attendee);\n if (!key) return true;\n // default true (muted) unless explicitly set to false\n return this.attendeeVideoMutedIds[key] !== false;\n }\n\n isAttendeeVideoPlaying(chat: any, attendee: any): boolean {\n const key = this.getAttendeeMediaKey(chat, attendee);\n if (!key) return false;\n return !!this.attendeeVideoPlayingIds[key];\n }\n\n toggleAttendeeVideoMute(\n chat: any,\n attendee: any,\n videoEl?: HTMLVideoElement | null,\n ev?: Event,\n ): void {\n ev?.stopPropagation?.();\n const key = this.getAttendeeMediaKey(chat, attendee);\n if (!key) return;\n const next = !this.isAttendeeVideoMuted(chat, attendee);\n this.attendeeVideoMutedIds = { ...this.attendeeVideoMutedIds, [key]: next };\n if (videoEl) {\n videoEl.muted = next;\n // Some browsers require volume to be >0 when unmuting\n if (!next && (videoEl.volume == null || videoEl.volume === 0)) {\n videoEl.volume = 1;\n }\n }\n this.cdr.markForCheck();\n }\n\n toggleAttendeeVideoPlay(\n chat: any,\n attendee: any,\n videoEl?: HTMLVideoElement | null,\n ev?: Event,\n ): void {\n ev?.stopPropagation?.();\n const key = this.getAttendeeMediaKey(chat, attendee);\n if (!key) return;\n const next = !this.isAttendeeVideoPlaying(chat, attendee);\n this.attendeeVideoPlayingIds = {\n ...this.attendeeVideoPlayingIds,\n [key]: next,\n };\n if (videoEl) {\n try {\n if (next) {\n const p = videoEl.play();\n if (p && typeof (p as any).catch === 'function') {\n (p as any).catch(() => {\n // If play fails, reflect paused state\n this.attendeeVideoPlayingIds = {\n ...this.attendeeVideoPlayingIds,\n [key]: false,\n };\n this.cdr.markForCheck();\n });\n }\n } else {\n videoEl.pause();\n }\n } catch {\n // ignore\n }\n }\n this.cdr.markForCheck();\n }\n\n onAttendeeVideoPlayState(chat: any, attendee: any, isPlaying: boolean): void {\n const key = this.getAttendeeMediaKey(chat, attendee);\n if (!key) return;\n if (this.attendeeVideoPlayingIds[key] === isPlaying) return;\n this.attendeeVideoPlayingIds = {\n ...this.attendeeVideoPlayingIds,\n [key]: isPlaying,\n };\n this.cdr.markForCheck();\n }\n\n /**\n * Format session date/time for display.\n * @param dateTimeRange Session start/end (object with start/end or string with \"Start: ... End: ...\")\n * @param displayTimeZone Optional user-selected timezone (e.g. 'America/New_York'); when set, times are shown in this zone.\n */\n formatSessionWhen(\n dateTimeRange: string | { start?: string; end?: string } | null,\n displayTimeZone?: string,\n ): string {\n const localeOpts = displayTimeZone ? { timeZone: displayTimeZone } : {};\n if (!dateTimeRange) return '';\n if (\n typeof dateTimeRange === 'object' &&\n dateTimeRange?.start &&\n dateTimeRange?.end\n ) {\n try {\n const startDt = new Date(dateTimeRange.start);\n const endDt = new Date(dateTimeRange.end);\n const dateFormatted = startDt.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n ...localeOpts,\n });\n const startTime = startDt.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n ...localeOpts,\n });\n const endTime = endDt.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n ...localeOpts,\n });\n return `${dateFormatted} | ${startTime} - ${endTime}`;\n } catch {\n return '';\n }\n }\n if (typeof dateTimeRange !== 'string') return '';\n const startMatch = dateTimeRange.match(\n /Start:\\s*(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})/,\n );\n const endMatch = dateTimeRange.match(\n /End:\\s*(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})/,\n );\n if (!startMatch || !endMatch) return dateTimeRange;\n try {\n const startStr = startMatch[1];\n const endStr = endMatch[1];\n const startDt = new Date(startStr.replace(' ', 'T') + 'Z');\n const endDt = new Date(endStr.replace(' ', 'T') + 'Z');\n const dateFormatted = startDt.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n ...localeOpts,\n });\n const startTimeShort = startDt.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n ...localeOpts,\n });\n const endTimeShort = endDt.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n ...localeOpts,\n });\n return `${dateFormatted} | ${startTimeShort} - ${endTimeShort}`;\n } catch {\n return dateTimeRange;\n }\n }\n\n /**\n * Get date badge (day + month) for session card from dateTimeRange.\n * Handles dateTimeRange as string (\"Start: 2026-02-20 01:05:00, End: ...\") or object { start, end }.\n * Uses displayTimeZone only when it is a valid IANA identifier; otherwise formats in local time.\n */\n getSessionDateBadge(\n dateTimeRange: string | { start?: string; end?: string } | null,\n displayTimeZone?: string,\n ): { day: string; month: string } {\n if (!dateTimeRange) return { day: '', month: '' };\n try {\n let startDt: Date | null = null;\n if (typeof dateTimeRange === 'object' && dateTimeRange?.start) {\n startDt = new Date(dateTimeRange.start);\n } else if (typeof dateTimeRange === 'string') {\n const startMatch = dateTimeRange.match(\n /Start:\\s*(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})/,\n );\n if (startMatch)\n startDt = new Date(startMatch[1].replace(' ', 'T') + 'Z');\n }\n if (!startDt || isNaN(startDt.getTime())) return { day: '', month: '' };\n const localeOpts = displayTimeZone ? { timeZone: displayTimeZone } : {};\n try {\n const day = startDt.toLocaleDateString('en-US', {\n day: 'numeric',\n ...localeOpts,\n });\n const month = startDt.toLocaleDateString('en-US', {\n month: 'short',\n ...localeOpts,\n });\n return { day, month };\n } catch {\n // displayTimeZone may be non-IANA (e.g. \"(UTC-03:00) Brasilia\"); format without timeZone\n const day = startDt.toLocaleDateString('en-US', { day: 'numeric' });\n const month = startDt.toLocaleDateString('en-US', { month: 'short' });\n return { day, month };\n }\n } catch {\n return { day: '', month: '' };\n }\n }\n\n /**\n * Get time range only (e.g. \"9:00 AM - 10:30 AM\") for session card.\n * Falls back to formatting without timeZone when displayTimeZone is not a valid IANA identifier.\n */\n formatSessionTimeRange(\n dateTimeRange: string | { start?: string; end?: string } | null,\n displayTimeZone?: string,\n ): string {\n if (!dateTimeRange) return '';\n try {\n let startDt: Date | null = null;\n let endDt: Date | null = null;\n if (\n typeof dateTimeRange === 'object' &&\n dateTimeRange?.start &&\n dateTimeRange?.end\n ) {\n startDt = new Date(dateTimeRange.start);\n endDt = new Date(dateTimeRange.end);\n } else if (typeof dateTimeRange === 'string') {\n const startMatch = dateTimeRange.match(\n /Start:\\s*(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})/,\n );\n const endMatch = dateTimeRange.match(\n /End:\\s*(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})/,\n );\n if (startMatch)\n startDt = new Date(startMatch[1].replace(' ', 'T') + 'Z');\n if (endMatch) endDt = new Date(endMatch[1].replace(' ', 'T') + 'Z');\n }\n if (!startDt || isNaN(startDt.getTime())) return '';\n const localeOpts = displayTimeZone ? { timeZone: displayTimeZone } : {};\n try {\n const startTime = startDt.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n ...localeOpts,\n });\n const endTime =\n endDt && !isNaN(endDt.getTime())\n ? endDt.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n ...localeOpts,\n })\n : '';\n return endTime ? `${startTime} - ${endTime}` : startTime;\n } catch {\n const startTime = startDt.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n const endTime =\n endDt && !isNaN(endDt.getTime())\n ? endDt.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n })\n : '';\n return endTime ? `${startTime} - ${endTime}` : startTime;\n }\n } catch {\n return '';\n }\n }\n\n /**\n * IANA timezone ID -> abbreviation map (matches parent app session-layouts / timezones.enum TimeZones).\n * Used so session cards show SAST, EEST, SAWST, ESAST, etc. instead of GMT+1, GMT+2.\n */\n private static readonly TZ_ABBR_MAP: Record<string, string> = {\n 'Pacific/Kiritimati': 'LINT',\n 'Pacific/Apia': 'SST',\n 'Pacific/Tongatapu': 'TST',\n 'Etc/GMT-13': 'UTC',\n 'Pacific/Chatham': 'CHADT',\n 'Asia/Kamchatka': 'ANAT',\n 'Pacific/Fiji': 'FJT',\n 'Etc/GMT-12': 'U',\n 'Pacific/Auckland': 'NZST',\n 'Pacific/Guadalcanal': 'CPST',\n 'Asia/Sakhalin': 'SAKT',\n 'Pacific/Norfolk': 'NFT',\n 'Asia/Magadan': 'MAGT',\n 'Asia/Srednekolymsk': 'SRET',\n 'Pacific/Bougainville': 'BST',\n 'Australia/Lord_Howe': 'LHST',\n 'Asia/Vladivostok': 'VLAT',\n 'Australia/Hobart': 'AEST',\n 'Pacific/Port_Moresby': 'ChST',\n 'Australia/Sydney': 'AEST',\n 'Australia/Brisbane': 'AWST',\n 'Australia/Darwin': 'ACST',\n 'Australia/Adelaide': 'ACST',\n 'Asia/Yakutsk': 'YAKT',\n 'Asia/Seoul': 'KST',\n 'Asia/Pyongyang': 'KST',\n 'Asia/Tokyo': 'TST',\n 'Asia/Chita': 'YAKT',\n 'Australia/Eucla': 'ACWST',\n 'Asia/Ulaanbaatar': 'FST',\n 'Asia/Taipei': 'ULAT',\n 'Australia/Perth': 'AWST',\n 'Asia/Singapore': 'SNST',\n 'Asia/Irkutsk': 'IRKT',\n 'Asia/Shanghai': 'CST',\n 'Asia/Tomsk': 'MSD',\n 'Asia/Novosibirsk': 'NOVT',\n 'Asia/Krasnoyarsk': 'KRAT',\n 'Asia/Hovd': 'SAST',\n 'Asia/Barnaul': 'MSK',\n 'Asia/Bangkok': 'THA',\n 'Asia/Yangon': 'MYST',\n 'Asia/Omsk': 'OMST',\n 'Asia/Dhaka': 'BST',\n 'Asia/Almaty': 'NCAST',\n 'Asia/Kathmandu': 'NPT',\n 'Asia/Colombo': 'SLT',\n 'Asia/Kolkata': 'IST',\n 'Asia/Calcutta': 'IST',\n 'Asia/Qyzylorda': 'CAST',\n 'Asia/Karachi': 'PKT',\n 'Asia/Yekaterinburg': 'YEKT',\n 'Asia/Tashkent': 'WAST',\n 'Asia/Kabul': 'AFT',\n 'Asia/Yerevan': 'AMT',\n 'Europe/Volgograd': 'VST',\n 'Asia/Tbilisi': 'GET',\n 'Europe/Saratov': 'SLT',\n 'Indian/Mauritius': 'MUT',\n 'Europe/Samara': 'SAMT',\n 'Asia/Baku': 'AZT',\n 'Europe/Astrakhan': 'SAMT',\n 'Asia/Dubai': 'ARBST',\n 'Asia/Tehran': 'IDT',\n 'Africa/Nairobi': 'EAST',\n 'Europe/Moscow': 'MSK',\n 'Europe/Minsk': 'MSK',\n 'Asia/Riyadh': 'AST',\n 'Europe/Istanbul': 'TDT',\n 'Asia/Baghdad': 'AST',\n 'Africa/Windhoek': 'NST',\n 'Africa/Tripoli': 'LST',\n 'Africa/Khartoum': 'EAST',\n 'Europe/Kaliningrad': 'KST',\n 'Asia/Jerusalem': 'JDT',\n 'Europe/Kiev': 'EEDT',\n 'Africa/Johannesburg': 'SAST',\n 'Asia/Hebron': 'EET',\n 'Asia/Damascus': 'SDT',\n 'Europe/Chisinau': 'GDT',\n 'Africa/Cairo': 'EST',\n 'Asia/Beirut': 'MEDT',\n 'Europe/Bucharest': 'GDT',\n 'Asia/Amman': 'JST',\n 'Africa/Lagos': 'ECT',\n 'Europe/Warsaw': 'CEDT',\n 'Africa/Casablanca': 'MDT',\n 'Europe/Paris': 'CEST',\n 'Europe/Budapest': 'CEDT',\n 'Europe/Berlin': 'WEDT',\n 'Africa/Sao_Tome': 'GST',\n 'Atlantic/Reykjavik': 'GST',\n 'Europe/London': 'GDT',\n 'Etc/UTC': 'UTC',\n 'Atlantic/Azores': 'ADT',\n 'Atlantic/Cape_Verde': 'CVST',\n 'Etc/GMT+2': 'MST',\n 'America/Araguaina': 'SEST',\n 'America/Sao_Paulo': 'ESAST',\n 'America/Cayenne': 'SEST',\n 'America/Argentina/Buenos_Aires': 'AST',\n 'America/Nuuk': 'WGT',\n 'America/Montevideo': 'MST',\n 'America/Punta_Arenas': 'CLST',\n 'America/Miquelon': 'PMST',\n 'America/Bahia': 'BST',\n 'America/St_Johns': 'NST',\n 'America/Asuncion': 'PRST',\n 'America/Halifax': 'AST',\n 'America/Caracas': 'VST',\n 'America/Cuiaba': 'CBST',\n 'America/La_Paz': 'SAWST',\n 'America/Santiago': 'PSST',\n 'America/Bogota': 'SPST',\n 'America/Cancun': 'EST',\n 'America/New_York': 'ET',\n 'America/Port-au-Prince': 'EDT',\n 'America/Havana': 'EDT',\n 'America/Indiana/Indianapolis': 'EST',\n 'America/Grand_Turk': 'EST',\n 'America/Guatemala': 'CAST',\n 'America/Chicago': 'CT',\n 'Pacific/Easter': 'EAST',\n 'America/Mexico_City': 'CST',\n 'America/Regina': 'CCST',\n 'America/Phoenix': 'MT',\n 'America/Chihuahua': 'MDT',\n 'America/Denver': 'MT',\n 'America/Whitehorse': 'YST',\n 'America/Tijuana': 'PST',\n 'Etc/GMT+8': 'UTC-08',\n 'America/Los_Angeles': 'PT',\n 'America/Anchorage': 'AK',\n 'Etc/GMT+9': 'UTC-09',\n 'Pacific/Marquesas': 'MST',\n 'America/Adak': 'HST',\n 'Pacific/Honolulu': 'HAST',\n 'Etc/GMT+11': 'UTC-11',\n 'Etc/GMT+12': 'BIT',\n };\n\n /**\n * Windows-style \"(UTC±HH:MM) Place\" -> short name (IST, BRT, etc.) so we show \"IST\" not \"((UTC+05:30) India)\".\n */\n private static readonly WINDOWS_TZ_ABBR_MAP: Record<string, string> = {\n '(UTC-03:00) Brasilia': 'BRT',\n '(UTC-03:00) Buenos Aires': 'ART',\n '(UTC+05:30) India': 'IST',\n '(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi': 'IST',\n '(UTC+00:00) Dublin, Edinburgh, London': 'GMT',\n '(UTC+00:00) Monrovia, Reykjavik': 'GMT',\n '(UTC+01:00) Amsterdam, Berlin, Rome, Stockholm': 'CET',\n '(UTC+01:00) Brussels, Copenhagen, Madrid, Paris': 'CET',\n '(UTC+02:00) Athens, Istanbul, Minsk': 'EET',\n '(UTC+02:00) Cairo': 'EET',\n '(UTC+02:00) Jerusalem': 'IST',\n '(UTC+03:00) Moscow, St. Petersburg': 'MSK',\n '(UTC+03:00) Nairobi': 'EAT',\n '(UTC+04:00) Dubai': 'GST',\n '(UTC+05:00) Islamabad, Karachi': 'PKT',\n '(UTC+05:45) Kathmandu': 'NPT',\n '(UTC+06:00) Dhaka': 'BST',\n '(UTC+06:30) Yangon (Rangoon)': 'MMT',\n '(UTC+07:00) Bangkok, Hanoi, Jakarta': 'ICT',\n '(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi': 'CST',\n '(UTC+08:00) Kuala Lumpur, Singapore': 'SGT',\n '(UTC+09:00) Osaka, Sapporo, Tokyo': 'JST',\n '(UTC+09:30) Adelaide': 'ACST',\n '(UTC+10:00) Brisbane': 'AEST',\n '(UTC+10:00) Canberra, Melbourne, Sydney': 'AEST',\n '(UTC+12:00) Auckland, Wellington': 'NZST',\n '(UTC-05:00) Eastern Time (US & Canada)': 'ET',\n '(UTC-06:00) Central Time (US & Canada)': 'CT',\n '(UTC-07:00) Mountain Time (US & Canada)': 'MT',\n '(UTC-08:00) Pacific Time (US & Canada)': 'PT',\n };\n\n /**\n * Get timezone abbreviation (e.g. IST, BRT, SAST) for display after the time.\n * Uses IANA map and Windows-style map so we show \"BRT\" / \"IST\" instead of \"((UTC-03:00) Brasilia)\".\n * Only consults Windows map when input looks like \"(UTC...)\" so existing IANA/Intl behavior is unchanged.\n */\n getTimezoneAbbreviation(tz: string): string {\n if (!tz || !String(tz).trim()) return '';\n const tzId = String(tz).trim();\n if (tzId.startsWith('(UTC') || tzId.startsWith('(utc')) {\n const winMap = (this.constructor as typeof ChatDrawerComponent)\n .WINDOWS_TZ_ABBR_MAP;\n const winKey = Object.keys(winMap).find(\n (k) => k.toLowerCase() === tzId.toLowerCase(),\n );\n if (winKey) return winMap[winKey];\n }\n const map = (this.constructor as typeof ChatDrawerComponent).TZ_ABBR_MAP;\n let mapped = map[tzId];\n if (!mapped) {\n const keyLower = tzId.toLowerCase();\n const entry = Object.entries(map).find(\n ([k]) => k.toLowerCase() === keyLower,\n );\n if (entry) mapped = entry[1];\n }\n if (mapped) return mapped;\n try {\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: tzId,\n timeZoneName: 'short',\n });\n const parts = formatter.formatToParts(new Date());\n const tzPart = parts.find((p) => p.type === 'timeZoneName');\n const value = (tzPart?.value ?? '').trim();\n if (value && /^GMT[+-]\\d/.test(value)) return '';\n return value;\n } catch {\n return '';\n }\n }\n\n getStatusTextFromSessionRoles(sessionRoles: any): string {\n if (!Array.isArray(sessionRoles) || sessionRoles.length === 0) {\n return (\n this.getTranslation('You can join this meeting') ||\n 'You can join this meeting'\n );\n }\n const first = sessionRoles[0];\n if (typeof first === 'string') {\n return String(first)\n .replace(/^\\s*-\\s*/, '')\n .trim();\n }\n if (first && typeof first === 'object' && (first as any).description) {\n return String((first as any).description).trim();\n }\n return (\n this.getTranslation('You can join this meeting') ||\n 'You can join this meeting'\n );\n }\n\n mapSessionsToCardData(sessions: any[]): any[] {\n if (!Array.isArray(sessions)) return [];\n const userTimezone =\n this.timezone && String(this.timezone).trim()\n ? String(this.timezone).trim()\n : undefined;\n return sessions.map((s: any) => {\n // Support both dateTimeRange (string) and actualDateTimeRange (object with start/end)\n const whenRaw = s.dateTimeRange ?? s.actualDateTimeRange ?? '';\n const whenFormatted = this.formatSessionWhen(whenRaw, userTimezone);\n // Only set statusText when session has join/watch roles (so we don't show \"You can join this meeting\" when there are no buttons)\n const hasJoinWatchRole =\n Array.isArray(s.sessionRoles) &&\n s.sessionRoles.some((r: any) => {\n const name =\n r && typeof r === 'object' && r.sessionRoleName\n ? String(r.sessionRoleName).trim().toLowerCase()\n : String(r ?? '')\n .trim()\n .toLowerCase();\n return name === 'join' || name === 'watch';\n });\n const statusText = hasJoinWatchRole\n ? this.getStatusTextFromSessionRoles(s.sessionRoles)\n : '';\n const sessionTimeZone =\n s.timeZone != null\n ? typeof s.timeZone === 'object'\n ? (s.timeZone.id ?? s.timeZone.name ?? '')\n : String(s.timeZone)\n : '';\n // Show user's selected timezone when set, otherwise session's timezone from data\n const displayTimeZone = (userTimezone || sessionTimeZone || '').trim();\n const tzAbbr = displayTimeZone\n ? this.getTimezoneAbbreviation(displayTimeZone)\n : '';\n const whenWithTz =\n whenFormatted || (typeof whenRaw === 'object' ? '' : String(whenRaw));\n const whenDisplay = tzAbbr\n ? `${whenWithTz} (${tzAbbr})`.trim()\n : whenWithTz;\n const dateBadge = this.getSessionDateBadge(whenRaw, displayTimeZone);\n let timeRange = this.formatSessionTimeRange(whenRaw, displayTimeZone);\n const description = String(s.description ?? s.abstract ?? '').trim();\n const meetingType = String(\n s.sessionType ?? s.type ?? s.meetingType ?? '',\n ).trim();\n const sessionTypeLabel = this.isUnEvent\n ? this.getTranslation('Meeting type') || 'Meeting type'\n : this.getTranslation('Session type') || 'Session type';\n // Same logic as before design update: prefer tz abbreviation (e.g. EST), else show display timezone string (e.g. \"(UTC-03:00) Brasilia)\")\n const timeZoneDisplay = tzAbbr || displayTimeZone || '';\n // When API returns \"Start: N/A, End: N/A, TimeZone: ...\" (string), show at least timezone\n if (!timeRange && displayTimeZone) {\n timeRange = this.getTranslation('Not specified') || 'Not specified';\n }\n // Time range with timezone in parentheses when available (same as old whenDisplay format)\n const timeRangeWithTz = timeZoneDisplay\n ? `${timeRange} (${timeZoneDisplay})`.trim()\n : timeRange;\n return {\n title: String(s.title ?? '').trim(),\n organizer: String(s.organizer ?? '').trim(),\n room: String(s.roomName ?? '').trim(),\n when: whenDisplay,\n timeRange,\n timeRangeWithTz: timeRange ? timeRangeWithTz : timeZoneDisplay || '',\n dateDay: dateBadge.day,\n dateMonth: dateBadge.month,\n description,\n timeZone: displayTimeZone,\n timeZoneDisplay,\n meetingType,\n sessionTypeLabel,\n statusText,\n session: s,\n };\n });\n }\n\n private collectSpeakerIdsFromSessionCards(sessionCards: any[]): string[] {\n if (!Array.isArray(sessionCards)) return [];\n const ids: string[] = [];\n for (const card of sessionCards) {\n const raw = card?.session?.speakers;\n if (Array.isArray(raw)) {\n for (const id of raw) {\n const sid = String(id ?? '').trim();\n if (sid) ids.push(sid);\n }\n }\n }\n return Array.from(new Set(ids));\n }\n\n private attachSpeakersToSessionCards(sessionCards: any[]): void {\n if (!Array.isArray(sessionCards)) return;\n for (const card of sessionCards) {\n const speakerIds: string[] = Array.isArray(card?.session?.speakers)\n ? card.session.speakers\n .map((x: any) => String(x ?? '').trim())\n .filter(Boolean)\n : [];\n const speakersList = speakerIds\n .map((id) => this.speakers[id])\n .filter(Boolean);\n card.speakersList = speakersList;\n if (card?.session && typeof card.session === 'object') {\n card.session.speakersList = speakersList;\n }\n }\n }\n\n private ensureSpeakersForSessionCards(sessionCards: any[]): void {\n const ids = this.collectSpeakerIdsFromSessionCards(sessionCards);\n if (ids.length === 0) return;\n\n const missing = ids.filter(\n (id) => !this.speakers[id] && !this.requestedSpeakerIds.has(id),\n );\n if (missing.length === 0) {\n this.attachSpeakersToSessionCards(sessionCards);\n return;\n }\n missing.forEach((id) => this.requestedSpeakerIds.add(id));\n this.getSpeakersByStaffIds(missing).subscribe({\n next: () => {\n this.attachSpeakersToSessionCards(sessionCards);\n this.cdr.markForCheck();\n },\n error: () => {\n // Best effort: still attach what we have cached\n this.attachSpeakersToSessionCards(sessionCards);\n this.cdr.markForCheck();\n },\n });\n }\n\n getSpeakerPhotoUrl(speaker: any): string | null {\n if (!speaker) return null;\n const candidates = [\n speaker.photo,\n speaker.photoPath,\n speaker.avatarUrl,\n speaker.profileImageUrl,\n speaker.profileImage,\n speaker.profilePicture,\n speaker.imageUrl,\n speaker.image,\n ];\n const url = candidates.find((v) => v != null && String(v).trim() !== '');\n return url ? String(url).trim() : null;\n }\n\n hasSessionCardSpeakers(sessionCard: any): boolean {\n const list =\n sessionCard?.speakersList || sessionCard?.session?.speakersList;\n if (Array.isArray(list) && list.length > 0) return true;\n const ids = sessionCard?.session?.speakers;\n return Array.isArray(ids) && ids.length > 0;\n }\n\n getSpeakerDisplayName(speaker: any): string {\n if (!speaker) return '';\n if (speaker.name != null && String(speaker.name).trim() !== '')\n return String(speaker.name).trim();\n const first =\n speaker.firstName != null ? String(speaker.firstName).trim() : '';\n const last =\n speaker.lastName != null ? String(speaker.lastName).trim() : '';\n return `${first} ${last}`.trim();\n }\n\n getSpeakerInitials(speaker: any): string {\n const name = this.getSpeakerDisplayName(speaker);\n if (name) return this.getAttendeeInitials(name);\n const id = speaker?.id != null ? String(speaker.id) : '';\n return id ? id.slice(0, 2).toUpperCase() : '?';\n }\n\n mapAttendeesToCardData(attendees: any[]): any[] {\n if (!Array.isArray(attendees)) return [];\n return attendees.map((a: any) => ({\n name: String(a.name ?? '').trim(),\n company:\n a.company != null && String(a.company).trim() !== ''\n ? String(a.company).trim()\n : null,\n jobTitle:\n a.jobTitle != null && String(a.jobTitle).trim() !== ''\n ? String(a.jobTitle).trim()\n : null,\n photo:\n a.photo != null && String(a.photo).trim() !== ''\n ? String(a.photo).trim()\n : null,\n id: a.id ?? a.userId ?? a._id ?? a.attendeeId ?? undefined,\n interests:\n a.interests != null && String(a.interests).trim() !== ''\n ? String(a.interests).trim()\n : null,\n description:\n a.description != null && String(a.description).trim() !== ''\n ? String(a.description).trim()\n : null,\n userVideosModel: a.userVideosModel\n ? {\n url:\n a.userVideosModel?.url != null &&\n String(a.userVideosModel.url).trim() !== ''\n ? String(a.userVideosModel.url).trim()\n : null,\n thumbnail:\n a.userVideosModel?.thumbnail != null &&\n String(a.userVideosModel.thumbnail).trim() !== ''\n ? String(a.userVideosModel.thumbnail).trim()\n : null,\n }\n : null,\n }));\n }\n\n mapSpeakersToCardData(speakers: any[]): any[] {\n if (!Array.isArray(speakers)) return [];\n return speakers.map((s: any) => {\n const rawDesc =\n s.description != null && String(s.description).trim() !== ''\n ? String(s.description).trim()\n : null;\n const description = rawDesc\n ? /<[a-z][\\s\\S]*>/i.test(rawDesc)\n ? this.stripHtml(rawDesc)\n : rawDesc\n : null;\n const rawTitle = s.title ?? s.jobTitle;\n const jobTitle =\n rawTitle != null && String(rawTitle).trim() !== ''\n ? String(rawTitle).trim()\n : null;\n return {\n name: this.getSpeakerDisplayName(s),\n company:\n s.company != null && String(s.company).trim() !== ''\n ? String(s.company).trim()\n : null,\n jobTitle,\n photo: this.getSpeakerPhotoUrl(s),\n id: s.id ?? s.userId ?? s._id ?? s.speakerId ?? undefined,\n interests:\n s.interests != null && String(s.interests).trim() !== ''\n ? String(s.interests).trim()\n : null,\n description,\n userVideosModel: s.userVideosModel\n ? {\n url:\n s.userVideosModel?.url != null &&\n String(s.userVideosModel.url).trim() !== ''\n ? String(s.userVideosModel.url).trim()\n : null,\n thumbnail:\n s.userVideosModel?.thumbnail != null &&\n String(s.userVideosModel.thumbnail).trim() !== ''\n ? String(s.userVideosModel.thumbnail).trim()\n : null,\n }\n : null,\n };\n });\n }\n\n mapSponsorsToCardData(sponsors: any[]): any[] {\n if (!Array.isArray(sponsors)) return [];\n return sponsors.map((s: any) => {\n const rawDesc =\n s.boothDescription != null && String(s.boothDescription).trim() !== ''\n ? String(s.boothDescription).trim()\n : null;\n const description = rawDesc\n ? /<[a-z][\\s\\S]*>/i.test(rawDesc)\n ? this.stripHtml(rawDesc)\n : rawDesc\n : null;\n const urlSlug = s.url ?? s.boothUrl ?? (s.boothID != null ? String(s.boothID) : null) ?? (s.boothId != null ? String(s.boothId) : null);\n const logoUrl =\n s.logoUrl != null && String(s.logoUrl).trim() !== ''\n ? String(s.logoUrl).trim()\n : null;\n return {\n name: s.name != null ? String(s.name).trim() : '',\n website: s.website != null && String(s.website).trim() !== '' ? String(s.website).trim() : null,\n category: s.category != null ? String(s.category).trim() : null,\n boothID: s.boothID ?? s.boothId ?? null,\n boothTitle: s.boothTitle != null ? String(s.boothTitle).trim() : '',\n description: description ?? null,\n /** Booth URL slug for routing to detail page (e.g. events/:eventUrl/sponsors/booths/:url). */\n url: urlSlug != null ? String(urlSlug).trim() : null,\n logoUrl,\n };\n });\n }\n\n /**\n * Map get_event_booths results into the same shape used by sponsor cards.\n */\n mapBoothsToCardData(booths: any[]): any[] {\n if (!Array.isArray(booths)) return [];\n return booths.map((b: any) => {\n const rawDesc =\n b.description != null && String(b.description).trim() !== ''\n ? String(b.description).trim()\n : null;\n const description = rawDesc\n ? /<[a-z][\\s\\S]*>/i.test(rawDesc)\n ? this.stripHtml(rawDesc)\n : rawDesc\n : null;\n const urlSlug = b.url ?? b.boothUrl ?? (b.boothId != null ? String(b.boothId) : null) ?? (b.boothID != null ? String(b.boothID) : null);\n const logoUrl =\n b.logoUrl != null && String(b.logoUrl).trim() !== ''\n ? String(b.logoUrl).trim()\n : null;\n return {\n name: b.company != null ? String(b.company).trim() : '',\n website:\n b.website != null && String(b.website).trim() !== ''\n ? String(b.website).trim()\n : null,\n category: null,\n boothID: b.boothId ?? b.boothID ?? null,\n boothTitle: b.boothTitle != null ? String(b.boothTitle).trim() : '',\n description: description ?? null,\n /** Booth URL slug for routing to detail page (e.g. events/:eventUrl/sponsors/booths/:url). */\n url: urlSlug != null ? String(urlSlug).trim() : null,\n logoUrl,\n };\n });\n }\n\n /**\n * Map get_booth_representatives results into the same shape as attendee cards (for reuse of attendee design).\n */\n mapBoothRepsToCardData(representatives: any[]): any[] {\n if (!Array.isArray(representatives)) return [];\n return representatives.map((r: any) => {\n const first = r.firstName != null ? String(r.firstName).trim() : '';\n const last = r.lastName != null ? String(r.lastName).trim() : '';\n const name = [first, last].filter(Boolean).join(' ') || '';\n const userId = r.userId != null && String(r.userId).trim() !== '' ? String(r.userId).trim() : undefined;\n return {\n name,\n company:\n r.company != null && String(r.company).trim() !== ''\n ? String(r.company).trim()\n : null,\n jobTitle:\n r.jobTitle != null && String(r.jobTitle).trim() !== ''\n ? String(r.jobTitle).trim()\n : null,\n photo:\n r.photoPath != null && String(r.photoPath).trim() !== ''\n ? String(r.photoPath).trim()\n : null,\n id: userId,\n interests: null,\n description:\n r.description != null && String(r.description).trim() !== ''\n ? String(r.description).trim()\n : null,\n userVideosModel: null,\n };\n });\n }\n\n /**\n * Parse get_event_sessions_v2 plain-text content into session objects for cards.\n * Format: \"Found N sessions:\\n1. <title>\\n - Time: Start: ..., End: ..., TimeZone: ...\\n - Room: ...\\n - Type: ...\\n2. ...\"\n */\n parseSessionContentV2(content: string): any[] {\n if (!content || typeof content !== 'string') return [];\n const sessions: any[] = [];\n // Split into blocks by \"1. \", \"2. \", etc. (number + dot + space at line start)\n const blockRegex = /\\n\\d+\\.\\s+/;\n const parts = content.split(blockRegex);\n // First part may be \"Found N sessions:\" or similar; skip if it doesn't look like a session title\n for (let i = 0; i < parts.length; i++) {\n const block = parts[i].trim();\n if (!block) continue;\n const lines = block\n .split(/\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n const title = lines[0] || '';\n if (!title || /^Found\\s+\\d+\\s+sessions/i.test(title)) continue;\n let dateTimeRange = '';\n let roomName = '';\n let sessionType = '';\n let timeZone = '';\n for (let j = 1; j < lines.length; j++) {\n const line = lines[j];\n const timeMatch = line.match(/Time:\\s*(.+)/i);\n if (timeMatch) {\n dateTimeRange = timeMatch[1].trim();\n const tzMatch = dateTimeRange.match(/TimeZone:\\s*([^,\\n]+)/i);\n if (tzMatch) timeZone = tzMatch[1].trim();\n }\n const roomMatch = line.match(/Room:\\s*(.+)/i);\n if (roomMatch) {\n roomName = roomMatch[1].trim();\n }\n const typeMatch = line.match(/Type:\\s*(.+)/i);\n if (typeMatch) {\n sessionType = typeMatch[1].trim();\n }\n const tzLineMatch = line.match(/TimeZone:\\s*(.+)/i);\n if (tzLineMatch && !timeZone) timeZone = tzLineMatch[1].trim();\n }\n sessions.push({\n title,\n roomName: roomName || undefined,\n dateTimeRange: dateTimeRange || undefined,\n sessionType: sessionType || undefined,\n timeZone: timeZone || undefined,\n sessionRoles: [],\n });\n }\n return sessions;\n }\n\n getVisibleSessionCards(chat: any): any[] {\n const list = chat?.sessionCards ?? [];\n const total = list.length;\n const expanded = this.expandedSessionCardIds[chat?._id];\n const remaining = total - this.SESSION_CARDS_INITIAL;\n if (remaining > 4 && !expanded) {\n return list.slice(0, this.SESSION_CARDS_INITIAL);\n }\n return list;\n }\n\n getVisibleAttendeeCards(chat: any): any[] {\n const list = chat?.attendeeCards ?? [];\n const total = list.length;\n const expanded = this.expandedAttendeeCardIds[chat?._id];\n const remaining = total - this.ATTENDEE_CARDS_INITIAL;\n if (remaining > 4 && !expanded) {\n return list.slice(0, this.ATTENDEE_CARDS_INITIAL);\n }\n return list;\n }\n\n getVisibleSpeakerCards(chat: any): any[] {\n const list = chat?.speakerCards ?? [];\n const total = list.length;\n const expanded = this.expandedSpeakerCardIds[chat?._id];\n const remaining = total - this.SPEAKER_CARDS_INITIAL;\n if (remaining > 4 && !expanded) {\n return list.slice(0, this.SPEAKER_CARDS_INITIAL);\n }\n return list;\n }\n\n getVisibleSponsorCards(chat: any): any[] {\n const list = chat?.sponsorCards ?? [];\n const total = list.length;\n const expanded = this.expandedSponsorCardIds[chat?._id];\n const remaining = total - this.SPONSOR_CARDS_INITIAL;\n if (remaining > 4 && !expanded) {\n return list.slice(0, this.SPONSOR_CARDS_INITIAL);\n }\n return list;\n }\n\n getVisibleBoothRepCards(chat: any): any[] {\n const list = chat?.boothRepCards ?? [];\n const total = list.length;\n const expanded = this.expandedBoothRepCardIds[chat?._id];\n const remaining = total - this.BOOTH_REP_CARDS_INITIAL;\n if (remaining > 4 && !expanded) {\n return list.slice(0, this.BOOTH_REP_CARDS_INITIAL);\n }\n return list;\n }\n\n expandSessionCards(chat: any): void {\n if (chat?._id) {\n this.expandedSessionCardIds = {\n ...this.expandedSessionCardIds,\n [chat._id]: true,\n };\n this.cdr.markForCheck();\n }\n }\n\n expandAttendeeCards(chat: any): void {\n if (chat?._id) {\n this.expandedAttendeeCardIds = {\n ...this.expandedAttendeeCardIds,\n [chat._id]: true,\n };\n this.cdr.markForCheck();\n }\n }\n\n expandSpeakerCards(chat: any): void {\n if (chat?._id) {\n this.expandedSpeakerCardIds = {\n ...this.expandedSpeakerCardIds,\n [chat._id]: true,\n };\n this.cdr.markForCheck();\n }\n }\n\n expandSponsorCards(chat: any): void {\n if (chat?._id) {\n this.expandedSponsorCardIds = {\n ...this.expandedSponsorCardIds,\n [chat._id]: true,\n };\n this.cdr.markForCheck();\n }\n }\n\n expandBoothRepCards(chat: any): void {\n if (chat?._id) {\n this.expandedBoothRepCardIds = {\n ...this.expandedBoothRepCardIds,\n [chat._id]: true,\n };\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Label for session type on cards: \"Session type\" when isUnEvent, else \"Meeting type\".\n */\n getSessionTypeLabel(): string {\n return this.isUnEvent\n ? this.getTranslation('Meeting type') || 'Meeting type'\n : this.getTranslation('Session type') || 'Session type'\n }\n\n /**\n * Get Join/Watch role buttons from session.sessionRoles for session cards.\n * When isUnEvent is false, returns single \"Watch\" button (same as template2). When true, returns Join/Watch from sessionRoles.\n */\n getSessionRoleButtons(sessionCard: any): { action: string; label: string }[] {\n if (this.isUnEvent === false && sessionCard?.session) {\n return [\n {\n action: 'join',\n label: this.getTranslation('Watch') || 'Watch',\n },\n ];\n }\n const raw = sessionCard?.session?.sessionRoles;\n if (!Array.isArray(raw) || raw.length === 0) return [];\n const roles: { action: string; label: string }[] = [];\n for (const r of raw) {\n const name =\n typeof r === 'object' && r != null && r.sessionRoleName\n ? String(r.sessionRoleName).trim().toLowerCase()\n : String(r).trim().toLowerCase();\n if (name === 'join' || name === 'watch') {\n const label =\n name === 'join'\n ? this.getTranslation('Join') || 'Join'\n : this.getTranslation('Watch') || 'Watch';\n roles.push({ action: name, label });\n }\n }\n return roles;\n }\n\n /**\n * Check if session is on-demand (classificationId === eClassificationType.OnDemand).\n * When true, Join/Watch are always actionable and card uses OnDemand design.\n */\n isSessionOndemand(sessionCard: any): boolean {\n const id =\n sessionCard?.session?.classificationId ?? sessionCard?.classificationId;\n if (id == null || id === '') return false;\n return String(id) === eClassificationType.OnDemand;\n }\n\n /**\n * Whether Join/Watch action is possible (same logic as app template8).\n * Action is allowed when: on-demand session OR isButtonActivated (session has started).\n */\n canPerformSessionAction(sessionCard: any): boolean {\n if (!sessionCard?.session) return false;\n const s = sessionCard.session;\n if (this.isSessionOndemand(sessionCard)) return true;\n return !!s.isButtonActivated;\n }\n\n /**\n * Same logic as app template8: delay in minutes (scheduled start - actual start).\n * Returns undefined if either date missing; > 0 when meeting is delayed.\n */\n getMeetingDelayMinutes(sessionCard: any): number | undefined {\n const s = sessionCard?.session;\n if (!s) return undefined;\n const startDate = s.dateTimeRange?.start;\n const actualStart = s.actualDateTimeRange?.start;\n if (!startDate || !actualStart) return undefined;\n try {\n const diffMs =\n new Date(startDate).getTime() - new Date(actualStart).getTime();\n return Math.floor(diffMs / (1000 * 60));\n } catch {\n return undefined;\n }\n }\n\n /** True when meeting is delayed (same condition as template8: delay minutes > 0, not on-demand, button not activated). */\n isMeetingDelayed(sessionCard: any): boolean {\n const delay = this.getMeetingDelayMinutes(sessionCard);\n if (delay == null || delay <= 0) return false;\n if (this.isSessionOndemand(sessionCard)) return false;\n if (sessionCard?.session?.isButtonActivated) return false;\n return true;\n }\n\n onSessionCardAction(\n sessionCard: any,\n role: { action: string; label: string },\n ): void {\n if (!sessionCard?.session) return;\n if (this.isUnEvent === false) {\n this.sessionActions.emit({\n type: 'session',\n action: role.action,\n session: sessionCard.session,\n sessionCard,\n });\n return;\n }\n if (!this.canPerformSessionAction(sessionCard)) {\n const message =\n this.getTranslation('You can join/watch at the starting time') ||\n 'You can join/watch at the starting time';\n this.sessionActionBlocked.emit(message);\n return;\n }\n this.sessionActions.emit({\n type: 'session',\n action: role.action,\n session: sessionCard.session,\n sessionCard,\n });\n }\n\n listenSockets() {\n if (this.eventSubscription) {\n this.eventSubscription.unsubscribe();\n }\n console.log('Listen Socket');\n this.eventSubscription = this.conversationService\n .getUserSpecificNotification()\n .subscribe(\n (res) => {\n console.log('[Socket Chat] listenSockets received', {\n hasOtherFields: !!res?.m?.OtherFields,\n messageId: res?.m?.OtherFields?.message_id,\n hasAnswer: !!res?.m?.OtherFields?.answer,\n });\n // Check if OtherFields exists in the response\n if (res?.m?.OtherFields?.workflow_id) {\n console.log(\n '[Socket Chat] Workflow progress update',\n res?.m?.OtherFields,\n );\n const {\n percentage,\n output,\n action_name,\n current_action_name,\n workflow_execution_id,\n time_stamp,\n } = res?.m?.OtherFields;\n\n this.currentWorkflowActionProgress = percentage;\n this.currentWorkflowAction = action_name;\n\n const actionIndex = this.workflowExecutionDetails.Actions.findIndex(\n (a) => a.Name == current_action_name,\n );\n\n if (actionIndex !== -1) {\n this.workflowExecutionDetails.Actions[actionIndex]['Output'] =\n output;\n this.workflowExecutionDetails.Actions[actionIndex][\n 'InsertTimeStamp'\n ] = formatTimeStamps(this.timezone, time_stamp);\n } else {\n console.error(`Action with name ${action_name} not found`);\n }\n\n this.currentWorkflowExecutionDetails =\n this.workflowExecutionDetails;\n\n if (this.currentWorkflowActionProgress == 100) {\n this.chatLog[this.chatLog.length - 1]['WorkflowExecutionId'] =\n workflow_execution_id;\n this.isChatingWithAi = false;\n this.executingWorkflow = false;\n this.focusOnTextarea();\n }\n\n this.cdr.detectChanges();\n } else if (res?.m?.OtherFields) {\n const otherFields = res.m.OtherFields;\n const serializable = otherFields.serializable_to_return;\n\n // Session cards: event sessions tools (JSON or plain text)\n const isSessionTool =\n serializable?.tool_name === 'get_event_sessions' ||\n serializable?.tool_name === 'get_event_sessions_v2' ||\n serializable?.tool_name === 'get_sessions_by_interest' ||\n serializable?.tool_name === 'get_sessions_by_track' ||\n serializable?.tool_name === 'get_speaker_sessions' ||\n serializable?.tool_name === 'get_upcoming_sessions';\n if (isSessionTool) {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr && typeof contentStr === 'string') {\n let sessions: any[] = [];\n try {\n const parsed = JSON.parse(contentStr);\n sessions = parsed?.sessions ?? [];\n } catch (e) {\n // v2 plain text: \"Found 2 sessions:\\n1. Title\\n - Time: Start: ... End: ...\\n - Room: ...\\n - Type: ...\"\n sessions = this.parseSessionContentV2(contentStr);\n }\n const mapped = this.mapSessionsToCardData(sessions);\n this.ensureSpeakersForSessionCards(mapped);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `session_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'session_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n sessionCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n this.isChatingWithAi = false;\n this.scrollToBottom();\n pushed = true;\n }\n }\n if (pushed) {\n this.cdr.markForCheck();\n return;\n }\n // No session cards pushed: fall through to normal OtherFields handling so answer is displayed\n }\n\n // Attendee cards: tool get_event_attendees (only push when we have attendees; else fall through so answer is shown as normal AI message)\n if (serializable?.tool_name === 'get_event_attendees') {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr) {\n try {\n const parsed = JSON.parse(contentStr);\n const attendees = parsed?.attendees ?? [];\n const mapped = this.mapAttendeesToCardData(attendees);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `attendee_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'attendee_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n attendeeCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n pushed = true;\n }\n } catch (e) {\n console.error(\n '[Socket Chat] Error parsing get_event_attendees content:',\n e,\n );\n }\n }\n if (pushed) {\n this.isChatingWithAi = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n return;\n }\n /* attendees empty (e.g. totalCount: 0): fall through so answer like \"I couldn't find any attendees...\" is shown as normal AI message */\n }\n\n // Speaker cards: tool get_event_speakers (same handling as attendees; only push when we have speakers)\n if (serializable?.tool_name === 'get_event_speakers') {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr) {\n try {\n const parsed = JSON.parse(contentStr);\n const speakers = parsed?.speakers ?? parsed?.speaker ?? [];\n const mapped = this.mapSpeakersToCardData(speakers);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `speaker_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'speaker_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n speakerCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n pushed = true;\n }\n } catch (e) {\n console.error(\n '[Socket Chat] Error parsing get_event_speakers content:',\n e,\n );\n }\n }\n if (pushed) {\n this.isChatingWithAi = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n return;\n }\n /* speakers empty: fall through so answer is shown as normal AI message */\n }\n\n // Sponsor cards: tool get_event_sponsors (only push when we have sponsors)\n if (serializable?.tool_name === 'get_event_sponsors') {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr) {\n try {\n const parsed = JSON.parse(contentStr);\n const sponsors = parsed?.sponsors ?? [];\n const mapped = this.mapSponsorsToCardData(sponsors);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `sponsor_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'sponsor_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n sponsorCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n pushed = true;\n }\n } catch (e) {\n console.error(\n '[Socket Chat] Error parsing get_event_sponsors content:',\n e,\n );\n }\n }\n if (pushed) {\n this.isChatingWithAi = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n return;\n }\n }\n\n // Booth cards: tool get_event_booths (reuse sponsor card design; only push when we have booths)\n if (serializable?.tool_name === 'get_event_booths') {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr) {\n try {\n const parsed = JSON.parse(contentStr);\n const booths = parsed?.booths ?? [];\n const mapped = this.mapBoothsToCardData(booths);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `sponsor_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'sponsor_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n sponsorCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n pushed = true;\n }\n } catch (e) {\n console.error(\n '[Socket Chat] Error parsing get_event_booths content:',\n e,\n );\n }\n }\n if (pushed) {\n this.isChatingWithAi = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n return;\n }\n }\n\n // Booth representative cards: tool get_booth_representatives (same design as attendee cards)\n if (serializable?.tool_name === 'get_booth_representatives') {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr) {\n try {\n const parsed = JSON.parse(contentStr);\n const representatives = parsed?.representatives ?? [];\n const mapped = this.mapBoothRepsToCardData(representatives);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `booth_rep_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'booth_rep_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n boothRepCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n pushed = true;\n }\n } catch (e) {\n console.error(\n '[Socket Chat] Error parsing get_booth_representatives content:',\n e,\n );\n }\n }\n if (pushed) {\n this.isChatingWithAi = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n return;\n }\n }\n\n if (serializable?.tool_name === 'get_event_details') {\n this.isChatingWithAi = false;\n this.cdr.markForCheck();\n return;\n }\n\n const {\n conversation_id,\n bot_id,\n message_id,\n answer,\n web_results,\n search_results,\n graphs,\n execution_graphs,\n suggestions,\n } = otherFields;\n console.log('[Socket Chat] Processing OtherFields', {\n message_id,\n conversation_id,\n bot_id,\n hasAnswer: !!answer,\n answerLength: answer?.length,\n webResultsCount: web_results?.length ?? 0,\n searchResultsCount: search_results?.length ?? 0,\n });\n var currentChatMessage = this.chatLog.find(\n (p) => p._id == message_id,\n );\n if (!currentChatMessage) {\n console.log('[Socket Chat] New AI message from socket', {\n message_id,\n chatLogLength: this.chatLog.length,\n });\n currentChatMessage = {\n _id: message_id,\n type: 'ai',\n time: formatNow(this.timezone),\n };\n\n this.chatLog.push(currentChatMessage);\n\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n this.cdr.detectChanges();\n } else {\n console.log('[Socket Chat] Updating existing message', {\n message_id,\n });\n }\n\n // Handle the fields based on their presence\n if (search_results && Array.isArray(search_results)) {\n console.log('[Socket Chat] search_results', search_results);\n currentChatMessage.searchTerms = search_results;\n this.cdr.detectChanges();\n }\n\n if (web_results && Array.isArray(web_results)) {\n console.log(\n '[Socket Chat] web_results',\n web_results?.length,\n web_results,\n );\n currentChatMessage.sourcesList = web_results;\n currentChatMessage.displayedSources = web_results?.slice(0, 3); // First 3 cards\n currentChatMessage.remainingSources = web_results?.slice(3); // Remaining items\n this.cdr.detectChanges();\n }\n\n if (answer) {\n this.isChatingWithAi = false;\n console.log('[Socket Chat] Received answer, updating message', {\n message_id,\n answerLength: answer?.length,\n answerPreview: answer?.substring?.(0, 100),\n });\n\n currentChatMessage.message =\n this.processMessageForDisplay(answer);\n this.cdr.detectChanges();\n this.scrollToBottom();\n this.focusOnTextarea();\n }\n\n if (graphs && Array.isArray(graphs)) {\n console.log('[Socket Chat] graphs', graphs?.length, graphs);\n currentChatMessage.graphs = graphs;\n this.cdr.detectChanges();\n }\n\n if (execution_graphs && Array.isArray(execution_graphs)) {\n console.log(\n '[Socket Chat] execution_graphs',\n execution_graphs?.length,\n execution_graphs,\n );\n currentChatMessage.executionGraphs = execution_graphs;\n this.cdr.detectChanges();\n }\n\n if (suggestions && Array.isArray(suggestions)) {\n console.log(\n '[Socket Chat] suggestions',\n suggestions?.length,\n suggestions,\n );\n currentChatMessage.relatedListItems = suggestions;\n this.cdr.detectChanges();\n // Process online search terms as needed\n }\n\n // Add any other fields and their processing here\n } else {\n console.warn('OtherFields is missing in the response');\n }\n },\n (err) => {\n this.eventSubscription.unsubscribe();\n console.error('Error in fetching data from socket', err);\n },\n );\n }\n\n initializeSocketAndListen() {}\n handleEvent(data: any, type: string) {\n switch (type) {\n case 'webresult':\n break;\n case 'answer':\n break;\n case 'graph':\n break;\n default:\n break;\n }\n }\n ngOnDestroy(): void {\n if (this.eventSubscription) {\n this.eventSubscription.unsubscribe();\n }\n this.voiceTranscriptSubscriptions.forEach((sub) => sub.unsubscribe());\n this.socketService.disconnectSocketConnection();\n //this.socketService.close();\n }\n changeTemperature(newTemperature: number) {\n if (this.loading) return;\n this.temperature = newTemperature;\n const wrapper = document.querySelector('.hivegpt-chat-bot-wrapper');\n // Remove existing theme classes from body\n wrapper?.classList.remove('creative', 'balanced', 'precise');\n\n switch (newTemperature) {\n case 0:\n wrapper?.classList.add('creative');\n break;\n case 1:\n wrapper?.classList.add('balanced');\n break;\n case 2:\n wrapper?.classList.add('precise');\n break;\n default:\n break;\n }\n }\n\n onStartAgain() {\n if (this.loading) return;\n this.showStartAgain = false;\n this.chatLog = [];\n this.chatLog.push({\n type: 'ai',\n message: this.greetingMsg,\n\n time: formatNow(this.timezone),\n });\n this.archieveMessages().subscribe();\n }\n\n archieveMessages() {\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n });\n const url = `${this.environment.BASE_URL}/bot/clear-history/${this.botId}/${this.userId}`;\n return this.http.post(url, { headers }).pipe(\n switchMap((res: any) => {\n return of(res);\n }),\n catchError((error) => {\n return of(null);\n }),\n );\n }\n\n triggerSupport() {\n this.openSupport.emit();\n }\n fetchBotConfig() {\n this.loading = true;\n const headers = new HttpHeaders({\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n });\n const url = `${this.environment.BASE_URL}/bots?bot_id=${this.botId}`;\n return this.http.get(url, { headers }).pipe(\n switchMap((res: any) => {\n this.botName = this.getTranslation(res.Name);\n this.botIcon = res.Icon;\n this.botSkills = res?.Skills;\n this.greetingMsg = res.Greeting\n ? (this.processMessageForDisplay(res.Greeting) as any)\n : '';\n\n this.thumbsDownMessages = res?.NegativeResponses?.length\n ? res.NegativeResponses\n : [\n this.getTranslation(\n `We are sorry we've not been able to answer your question`,\n ),\n ];\n this.quickPrompts = res.QuickPrompts;\n this.cdr.markForCheck();\n this.loading = false;\n return of(res);\n }),\n catchError((error) => {\n console.error('Error fetching chatbot config: ', error);\n this.loading = false;\n return of(null);\n }),\n );\n }\n\n fetchChatHistory(): Observable<any> {\n this.loading = true;\n\n this.conversationKey = this.conversationService.getKey(this.botId, false);\n this.conSessionKey = this.conversationService.getSessionKey(\n this.botId,\n false,\n );\n const url = `${this.environment.BASE_URL}/conversations/${this.conversationKey}?session_id=${this.conSessionKey}`;\n const headers = new HttpHeaders({\n accept: 'application/json',\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n });\n\n return this.http\n .get(url, { headers })\n .pipe(catchError(this.handleError<any>('fetchConversation')));\n }\n\n private handleError<T>(operation = 'operation', result?: T) {\n return (error: any): Observable<T> => {\n console.error(`${operation} failed: ${error.message}`);\n return of(result as T);\n };\n }\n // fetchChatHistory() {\n // this.loading = true;\n // const headers = new HttpHeaders({\n // 'Content-Type': 'application/json',\n // 'x-api-key': this.apiKey,\n // });\n // return this.http\n // .get(`${this.environment.BASE_URL}/conversations/${this.conversationKey}`, { headers })\n // .pipe(\n // switchMap((res: any) => {\n // this.loading = false;\n // return of(res);\n // }),\n // catchError((error: any) => {\n // console.error('Error fetching chat history: ', error);\n // this.loading = false;\n // return of(null);\n // })\n // );\n // }\n\n /** Push a standard AI message from history (sources, graphs, etc.). Used when not converting to session_cards. */\n private pushAiMessageFromHistory(chat: any): void {\n const sourcesList = chat.WebLinks || [];\n const displayedSources = (chat.WebLinks || []).slice(0, 3);\n const remainingSources = (chat.WebLinks || []).slice(3);\n this.chatLog.push({\n type: 'ai',\n message: this.processMessageForDisplay(chat.Text),\n executionGraphs: chat.ExecutionGraphs,\n graphs: chat.Graphs,\n searchTerms: chat.SearchTerms,\n sourcesList: sourcesList,\n displayedSources: displayedSources,\n remainingSources: remainingSources,\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n copied: false,\n isCollapsedTrue: false,\n _id: chat._id,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n }\n\n mapChatHistory(chats: any) {\n this.chatLog.push({\n type: 'ai',\n message: this.greetingMsg,\n time: formatNow(this.timezone),\n });\n if (chats && chats?.Messages?.length) {\n chats?.Messages.forEach((chat: any) => {\n if (chat.Type == 'user') {\n this.chatLog.push({\n type: 'user',\n message: this.processMessageForDisplay(chat.Text),\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n copied: false,\n isCollapsedTrue: false,\n WorkflowExecutionId: chat.WorkflowExecutionId,\n _id: chat._id,\n });\n }\n if (chat.Type == 'ai') {\n // If this AI message came from session tools, show session cards instead of plain text\n const toolName = chat.toolresults?.tool_name;\n const isSessionTool =\n toolName === 'get_event_sessions' ||\n toolName === 'get_event_sessions_v2' ||\n toolName === 'get_sessions_by_interest' ||\n toolName === 'get_sessions_by_track' ||\n toolName === 'get_speaker_sessions' ||\n toolName === 'get_upcoming_sessions';\n if (\n isSessionTool &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n let sessions: any[] = [];\n try {\n const parsed = JSON.parse(contentStr);\n sessions = parsed?.sessions ?? [];\n } catch (e) {\n sessions = this.parseSessionContentV2(contentStr);\n }\n const mapped = this.mapSessionsToCardData(sessions);\n this.ensureSpeakersForSessionCards(mapped);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'session_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n sessionCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } else if (\n toolName === 'get_event_attendees' &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n // If this AI message came from get_event_attendees, show attendee cards on initial history load\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n try {\n const parsed = JSON.parse(contentStr);\n const attendees = parsed?.attendees ?? [];\n const mapped = this.mapAttendeesToCardData(attendees);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'attendee_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n attendeeCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } catch (e) {\n this.pushAiMessageFromHistory(chat);\n }\n } else if (\n toolName === 'get_event_speakers' &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n // If this AI message came from get_event_speakers, show speaker cards on initial history load\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n try {\n const parsed = JSON.parse(contentStr);\n const speakers = parsed?.speakers ?? parsed?.speaker ?? [];\n const mapped = this.mapSpeakersToCardData(speakers);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'speaker_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n speakerCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } catch (e) {\n this.pushAiMessageFromHistory(chat);\n }\n } else if (\n toolName === 'get_event_sponsors' &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n // If this AI message came from get_event_sponsors, show sponsor cards on initial history load\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n try {\n const parsed = JSON.parse(contentStr);\n const sponsors = parsed?.sponsors ?? [];\n const mapped = this.mapSponsorsToCardData(sponsors);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'sponsor_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n sponsorCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } catch (e) {\n this.pushAiMessageFromHistory(chat);\n }\n } else if (\n toolName === 'get_event_booths' &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n // If this AI message came from get_event_booths, show booth cards using sponsor card design\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n try {\n const parsed = JSON.parse(contentStr);\n const booths = parsed?.booths ?? [];\n const mapped = this.mapBoothsToCardData(booths);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'sponsor_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n sponsorCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } catch (e) {\n this.pushAiMessageFromHistory(chat);\n }\n } else if (\n toolName === 'get_booth_representatives' &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n // If this AI message came from get_booth_representatives, show booth rep cards (attendee design)\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n try {\n const parsed = JSON.parse(contentStr);\n const representatives = parsed?.representatives ?? [];\n const mapped = this.mapBoothRepsToCardData(representatives);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'booth_rep_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n boothRepCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } catch (e) {\n this.pushAiMessageFromHistory(chat);\n }\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n }\n });\n this.showStartAgain = true;\n }\n this.scrollToBottom();\n this.cdr.markForCheck();\n }\n\n processMessage(message: string): SafeHtml {\n if (!message || !(message?.length > 0)) {\n return '';\n }\n\n // console.log('here is my message')\n // console.log(message);\n\n message = message.trim();\n\n const markdownLinkRegex = /\\[([^[]+)]\\(([^)]+)\\)/g;\n const urlRegex = /(?<!href=\")\\bhttps?:\\/\\/\\S+(?<![.,])/gi;\n\n if (markdownLinkRegex.test(message)) {\n const html = message.replace(\n markdownLinkRegex,\n '<a href=\"$2\" target=\"_blank\">$1</a>',\n );\n //console.log('Sanitized message: ', message);\n return this.sanitizeHtml(html);\n }\n\n if (urlRegex.test(message)) {\n const html = message.replace(\n urlRegex,\n '<a href=\"$&\" target=\"_blank\">$&</a>',\n );\n // console.log('Sanitized message: ', message);\n return this.sanitizeHtml(html);\n }\n\n message = message.replace(/(?:\\r\\n|\\r|\\n)/g, '<br>');\n\n message = message.replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>');\n // Convert Markdown headers to HTML headers\n message = message.replace(/^(#{1,6})\\s+(.*)$/gm, (match, hashes, text) => {\n const level = hashes.length;\n return `<h${level}>${text}</h${level}>`;\n });\n\n this.cdr.markForCheck();\n const sanitizedMessage = this.sanitizeHtml(message);\n return sanitizedMessage;\n }\n\n ngAfterViewChecked() {\n const feedbackLinks =\n this.elementRef.nativeElement.querySelectorAll('.feedback-link');\n feedbackLinks.forEach((link: any) => {\n link.addEventListener(\n 'click',\n this.onFeedbackClick.bind(this, 'zendesk'),\n );\n });\n // if (this.elementRef.nativeElement.querySelector('.feedback-link')) {\n // this.elementRef.nativeElement\n // .querySelector('.feedback-link')\n // .addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));\n // }\n }\n\n sanitizeHtml(html: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n\n onFeedbackClick(value: string) {\n this.feedbackEvent.emit(value);\n }\n\n onClose() {\n this.renderer.removeClass(document.body, this.bodyOverflowClass);\n this.onCloseEvent.emit();\n }\n\n sendMessageWithTile(prompt: string) {\n this.input = prompt;\n this.fetchData();\n this.scrollToBottom();\n }\n isChatingWithAi = false;\n fetchData(msg = null) {\n this.input = msg || this.input?.trim();\n this.msg = this.input;\n if (!this.input || this.loading) {\n return;\n }\n this.ensureChatSocket();\n\n this.chatLog.push({\n type: 'user',\n message: this.processMessageForDisplay(this.input),\n time: formatNow(this.timezone),\n copied: false,\n isCollapsedTrue: false,\n });\n\n try {\n const textarea = this.myInput.nativeElement;\n textarea.style.height = 'hidden'; // Reset the height\n textarea.style.height = `62px`;\n } catch (error) {}\n this.cdr.markForCheck();\n\n this.aiResponse = '';\n this.isChatingWithAi = true;\n\n this.makeAskRequest(this.input, this.agents, this.conversationKey);\n }\n fetchDataFor(msg, chat) {\n const inputMsg = msg?.trim();\n if (!inputMsg || this.loading) {\n return;\n }\n this.ensureChatSocket();\n try {\n chat.relatedListItems = [];\n this.cdr.detectChanges();\n } catch (error) {}\n\n this.scrollToBottom();\n this.chatLog.push({\n type: 'user',\n message: this.processMessageForDisplay(inputMsg),\n time: formatNow(this.timezone),\n copied: false,\n isCollapsedTrue: false,\n });\n\n this.cdr.markForCheck();\n\n this.aiResponse = '';\n this.isChatingWithAi = true;\n\n this.makeAskRequest(inputMsg, this.agents, this.conversationKey, msg, chat);\n }\n fetchSmallTalk() {\n this.loading = true;\n this.cdr.markForCheck();\n\n const url = `${this.environment.BASE_URL}/bot/small-talk/${this.botId}/${this.userId}`;\n\n this.http\n .get<{ smallTalk: string }>(url, {\n headers: {\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n },\n })\n .pipe(\n catchError((error) => {\n console.error('Error while fetching small talk:', error);\n\n return of(null);\n }),\n )\n .subscribe((response) => {\n this.loading = false;\n this.cdr.markForCheck();\n\n if (!response) {\n return;\n }\n\n if (response && response.smallTalk) {\n this.chatLog.push({\n type: 'ai',\n message: this.processMessage(response.smallTalk),\n time: formatNow(this.timezone),\n isFeedbackMsg: true,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 2;\n // this.scrollToBottom();\n this.cdr.markForCheck();\n }\n });\n }\n\n readAllChunks = (stream: any) => {\n const reader = stream.getReader();\n const allSuggestions: string[] = [];\n\n reader.closed.catch((err: any) => {\n if (err) {\n console.error('Error reading stream: ', err);\n }\n\n this.isChatingWithAi = false;\n this.scrollToBottom();\n return;\n });\n\n return new ReadableStream({\n start: (controller) => {\n return this.pump(controller, reader, allSuggestions);\n },\n });\n };\n\n pump(controller: any, reader: any, allSuggestions: string[]) {\n reader.read().then(({ done, value }: any) => {\n const lastItem = this.chatLog[this.chatLog.length - 1];\n\n if (done) {\n lastItem.message = this.processMessageForDisplay(lastItem.message);\n this.chatLog.pop();\n this.chatLog.push(lastItem);\n if (allSuggestions?.length) {\n this.chatLog.push({\n type: 'suggestions',\n suggestions: allSuggestions,\n });\n }\n\n controller.close();\n this.isChatingWithAi = false;\n // this.scrollToBottom();\n this.cdr.markForCheck();\n this.showStartAgain = true;\n\n // setTimeout(() => {\n // this.fetchSmallTalk();\n // },1000)\n return;\n }\n\n let decodedChunk = this.decoder.decode(value, { stream: true });\n this.aiResponse += decodedChunk;\n if (lastItem.type === 'ai') {\n const suggestionsMatch = this.aiResponse.match(/<sug>(.*?)<\\/sug>/g);\n if (suggestionsMatch) {\n suggestionsMatch.forEach((match) => {\n this.aiResponse = this.aiResponse.replace(match, '');\n allSuggestions.push(match?.replace(/<\\/?sug>/g, ''));\n });\n }\n\n lastItem.message = this.aiResponse;\n this.cdr.markForCheck();\n } else {\n this.isChatingWithAi = false;\n\n let aiFormattedData: any;\n\n try {\n console.log('parsing json ');\n aiFormattedData = JSON.parse(JSON.parse(this.aiResponse));\n } catch (e) {\n try {\n console.log('parsing json 2');\n aiFormattedData = JSON.parse(this.aiResponse);\n } catch (e) {}\n }\n\n console.log('parsing json done');\n\n if (aiFormattedData && aiFormattedData?.section_id?.length > 0) {\n if (\n aiFormattedData.section_id == 'company_search' ||\n aiFormattedData.section_id == 'user_search' ||\n aiFormattedData.section_id == 'industry_company_search'\n ) {\n this.fetchMyConnections().subscribe();\n this.fetchPendingRequests().subscribe();\n }\n\n if (aiFormattedData.section_id == this.myUpcomingSessionAction) {\n var speakerIds = [];\n aiFormattedData.content?.forEach((session) => {\n speakerIds = [...speakerIds, ...session.speakers];\n });\n\n if (speakerIds?.length > 0)\n this.getSpeakersByStaffIds(speakerIds).subscribe();\n }\n\n if (\n aiFormattedData.section_id == this.addToMyAgendaAction &&\n aiFormattedData.content?.length > 0\n ) {\n this.openPage.next({\n sectionId: aiFormattedData.section_id,\n sessionIds: aiFormattedData.content,\n });\n }\n\n if (aiFormattedData.section_id == this.connectOrFollowAction) {\n let usersLen = aiFormattedData.content?.length;\n if (usersLen > 1) {\n this.openPage.next({\n sectionId: 'open_networking_drawer',\n search: aiFormattedData.content,\n });\n } else if (usersLen == 1) {\n this.openPage.next({\n sectionId: aiFormattedData.section_id,\n connetUserIds: [aiFormattedData.content[0].userId],\n });\n }\n }\n\n if (aiFormattedData.is_open_page == 'true') {\n this.openPage.next({\n sectionId: aiFormattedData.section_id,\n search: aiFormattedData.content,\n });\n\n if (this.isMobileBrowser()) {\n aiFormattedData.message +=\n '\\n\\n' + '<a id=\"closeBotNow\">Click Here</a> to see results.';\n }\n }\n\n this.chatLog.push({\n type: 'ai',\n message: aiFormattedData.message,\n action: aiFormattedData,\n time: formatNow(this.timezone),\n });\n\n if (this.isMobileBrowser()) {\n setTimeout(() => {\n this.addCloseBotClickEvent();\n }, 500);\n }\n\n this.aiResponse = '';\n } else {\n this.chatLog.push({\n type: 'ai',\n message: this.aiResponse,\n time: formatNow(this.timezone),\n });\n }\n\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n this.cdr.markForCheck();\n }\n\n this.scrollToBottom();\n\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n this.pump(controller, reader, allSuggestions);\n });\n }\n\n submitFeedback(flag: boolean, message) {\n console.log(message);\n\n this.feedbackDone = true;\n this.showFeedBackIconsIndex = null;\n const conversation_id = this.conversationService.getKey(this.botId);\n const url = `${this.environment.AGENTS_API}/Conversation/coPilot/${this.botId}/conversation/${conversation_id}/helpful-response`;\n fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n apiKey: 'Conversation_WIz/qAm+EEmfOkFaUA/weA==',\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n },\n body: JSON.stringify({ messageId: message._id, isHelpful: flag }),\n }).then(() => {\n if (flag) {\n this.chatLog.push({\n type: 'ai',\n message:\n this.thumbsUpMessage ||\n this.getTranslation('May I assist you with anything else'),\n time: formatNow(this.timezone),\n isFeedbackMsg: true,\n });\n\n this.scrollToBottom();\n this.cdr.markForCheck();\n this.feedbackDone = false;\n this.showFeedBackIconsIndex = null;\n return;\n }\n\n this.chatLog.push({\n type: 'ai',\n message: this.processMessage(\n this.thumbsDownMessages[this.thumbsDownMsgIndex],\n ),\n time: formatNow(this.timezone),\n isFeedbackMsg: true,\n });\n this.thumbsDownMsgIndex =\n (this.thumbsDownMsgIndex + 1) % this.thumbsDownMessages.length;\n this.scrollToBottom();\n this.cdr.markForCheck();\n setTimeout(() => {\n const supportLink = document.getElementById('supportLink88');\n if (supportLink) {\n supportLink.addEventListener('click', this.triggerSupport.bind(this));\n }\n }, 200);\n this.feedbackDone = false;\n this.showFeedBackIconsIndex = null;\n });\n }\n handleKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n // Prevent default behavior (new line)\n event.preventDefault();\n // Call your submit function\n this.handleSubmit(event);\n }\n }\n handleSubmit(event) {\n this.fetchData();\n this.scrollToBottom();\n }\n\n /** Index of the last AI message in chatLog; -1 if none. */\n get lastAiMessageIndex(): number {\n for (let j = this.chatLog.length - 1; j >= 0; j--) {\n if (this.chatLog[j]?.type === 'ai') return j;\n }\n return -1;\n }\n\n handleUpClick(idx: any) {\n if (this.feedbackDone) {\n return;\n }\n\n this.submitFeedback(true, this.chatLog[idx]);\n this.chatLog[idx].liked = !this.chatLog[idx].liked;\n\n if (this.chatLog[idx].unliked) {\n this.chatLog[idx].unliked = !this.chatLog[idx].unliked;\n }\n\n this.cdr.markForCheck();\n }\n\n handleDownClick(idx: any) {\n if (this.feedbackDone) return;\n this.submitFeedback(false, this.chatLog[idx]);\n this.chatLog[idx].unliked = !this.chatLog[idx].unliked;\n if (this.chatLog[idx].liked)\n this.chatLog[idx].liked = !this.chatLog[idx].liked;\n }\n // handleCopyClick(index: any) {\n // // Copy the message to the clipboard\n // const contentToCopy = this.chatLog[index].message;\n // console.log('contentToCopy');\n // console.log(contentToCopy);\n // navigator.clipboard.writeText(contentToCopy).then(() => {\n // // Indicate that the message was copied\n // this.chatLog[index].copied = true;\n // this.cdr.detectChanges();\n // // Reset the copied state after a delay\n // setTimeout(() => {\n // this.chatLog[index].copied = false;\n // this.cdr.detectChanges();\n // }, 2000); // Reset after 2 seconds\n // });\n // }\n copyText(id, index) {\n // Get the text element\n var textElement = document.getElementById(id);\n\n // Create a temporary textarea element to copy the text\n var tempTextArea = document.createElement('textarea');\n tempTextArea.value = textElement.innerText;\n\n // Append the textarea to the body (necessary for the execCommand to work)\n document.body.appendChild(tempTextArea);\n\n // Select the text inside the textarea\n tempTextArea.select();\n\n // Copy the text to the clipboard\n document.execCommand('copy');\n\n // Remove the temporary textarea\n document.body.removeChild(tempTextArea);\n\n // Optionally, you can alert the user or change the button text to indicate the copy was successful\n // alert('Text copied to clipboard!');\n\n this.chatLog[index].copied = true;\n this.cdr.detectChanges();\n // Reset the copied state after a delay\n setTimeout(() => {\n this.chatLog[index].copied = false;\n this.cdr.detectChanges();\n }, 2000); // Reset after 2 seconds\n }\n handleCopyClick(index: any) {\n // Copy the message to the clipboard\n const contentToCopy = this.chatLog[index].message;\n const resutlt = this.copyText('messageText_' + index, index);\n }\n\n sanitizeHTML(html: string): string {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n\n // Create a new document fragment to hold the simplified content\n const fragment = document.createDocumentFragment();\n\n // Append the children of the body of the parsed document to the fragment\n Array.from(doc.body.childNodes).forEach((node) => {\n fragment.appendChild(node.cloneNode(true));\n });\n\n // Create a new div element to hold the simplified HTML\n const simplifiedDiv = document.createElement('div');\n simplifiedDiv.appendChild(fragment);\n\n // Remove complex tags or attributes as needed\n // Example: remove scripts\n simplifiedDiv\n .querySelectorAll('script')\n .forEach((script) => script.remove());\n\n // Return the simplified HTML as a string\n return simplifiedDiv.innerHTML;\n }\n\n currentMessageForEditor: any = '';\n currentIndexForEditor: any = -1;\n handleEditorClick(index: any) {\n if (this.currentIndexForEditor == -1) {\n this.currentIndexForEditor = index;\n this.currentMessageForEditor = this.sanitizeHTML(\n this.chatLog[index].message,\n );\n this.currentMessageForEditor = this.currentMessageForEditor.replace(\n // 'SafeValue must use [property]=binding:',\n '',\n );\n\n this.cdr.detectChanges();\n } else {\n if (this.currentIndexForEditor == index) {\n this.currentMessageForEditor += this.sanitizeHTML(\n this.chatLog[index].message,\n );\n this.currentMessageForEditor = this.currentMessageForEditor.replace(\n // 'SafeValue must use [property]=binding:',\n '',\n );\n this.cdr.detectChanges();\n } else {\n this.currentIndexForEditor = index;\n this.currentMessageForEditor = this.sanitizeHTML(\n this.chatLog[index].message,\n );\n this.currentMessageForEditor = this.currentMessageForEditor.replace(\n // 'SafeValue must use [property]=binding:',\n '',\n );\n this.cdr.detectChanges();\n }\n }\n this.chatLog[index].isEditor = true;\n this.cdr.detectChanges();\n // Reset the copied state after a delay\n setTimeout(() => {\n this.chatLog[index].isEditor = false;\n this.cdr.detectChanges();\n }, 2000); // Reset after 2 seconds\n this.editorsDrawer.open();\n const button = document.getElementById('botcloseplaygroundbutton');\n if (button) {\n button.style.display = 'none';\n }\n this.cdr.detectChanges();\n }\n scrollToBottom() {\n if (!this.autoScrollOnNewMessage) {\n return;\n }\n let counter = 0;\n const interval = setInterval(() => {\n this.chatMain.nativeElement.scrollTop =\n this.chatMain.nativeElement.scrollHeight;\n if (counter++ > 5) clearInterval(interval);\n }, 5);\n }\n\n focusOnTextarea() {\n setTimeout(() => {\n if (this.myInput && this.myInput.nativeElement) {\n this.myInput.nativeElement.focus();\n }\n }, 100);\n }\n\n handleAction(action: any) {\n console.info('incoming action from the chatbot AI');\n console.info(action);\n\n if (action?.content) {\n }\n }\n\n ngAfterViewInit() {\n // Check if the drawer is initially open and apply overflow hidden to body if so\n if (this.drawer.opened) {\n this.setBodyOverflow();\n }\n\n // Listen to changes in the drawer being opened or closed\n this.drawer.openedChange.subscribe((opened: boolean) => {\n if (opened) {\n this.setBodyOverflow();\n } else {\n this.removeBodyOverflow();\n }\n });\n\n this.drawer.openedChange.subscribe((opened) => {\n if (opened) {\n setTimeout(() => {\n if (this.myInput && this.myInput.nativeElement) {\n this.myInput.nativeElement.focus(); // Focus on the textarea\n }\n });\n }\n });\n }\n\n private setBodyOverflow() {\n this.renderer.addClass(document.body, this.bodyOverflowClass);\n }\n\n private removeBodyOverflow() {\n this.renderer.removeClass(document.body, this.bodyOverflowClass);\n }\n\n getSpeakersByStaffIds(ids: any[]): Observable<any[] | null> {\n const url = `${this.environment.USERS_API}/events/${this.eventId}/users/get-by-staff-ids`;\n const cleanIds = Array.from(\n new Set((ids || []).map((x) => String(x ?? '').trim()).filter(Boolean)),\n );\n if (cleanIds.length === 0) return of(null);\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: this.autogenKey,\n });\n return this.http.post<any[]>(url, cleanIds, { headers }).pipe(\n tap((data: any[]) => {\n if (Array.isArray(data) && data.length > 0) {\n data.forEach((speaker) => {\n const id = String(speaker?.id ?? '').trim();\n if (id) this.speakers[id] = speaker;\n });\n this.cdr.markForCheck();\n }\n }),\n catchError((err) => {\n console.error('Error fetching speakers:', err);\n return of(null);\n }),\n );\n }\n\n performSessionAction(sessionId, action) {\n this.sessionActions.next({\n sessionId,\n action,\n });\n }\n\n addCloseBotClickEvent() {\n const element = this.elementRef.nativeElement.querySelector('#closeBotNow');\n if (element) {\n this.renderer.listen(element, 'click', () => {\n this.closeBot.next();\n });\n }\n }\n\n isMobileBrowser() {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent,\n );\n }\n\n connectToUser(userId) {\n this.connectWithUser.emit({\n connect: !this.canDisconnect(userId),\n userId,\n });\n\n setTimeout(() => {\n this.fetchMyConnections().subscribe((res) => {\n this.cdr.markForCheck();\n });\n this.fetchPendingRequests().subscribe((res) => {\n this.cdr.markForCheck();\n });\n }, 500);\n }\n\n scheduleMeetingWithUser(user) {\n this.scheduleMeeting.emit(user);\n }\n\n /** Whether the given userId has a pending connection request sent (show \"Request Sent\" disabled). */\n checkPendingSentRequest(userId: string | null | undefined): boolean {\n if (userId == null || userId === '') return false;\n const pending = this.pendingSentRequestUserIds?.length\n ? this.pendingSentRequestUserIds\n : this.pendingRequests;\n return !!pending?.find((a: any) => a == userId);\n }\n\n /** Whether this attendee can be followed (show \"Connect\" button). Not connected and no pending sent request. */\n canFollowUser(attendee: { id?: string }): boolean {\n const uid = attendee?.id;\n if (uid == null || uid === '') return false;\n if (this.canUnfollowUser(attendee) || this.checkPendingSentRequest(uid))\n return false;\n return true;\n }\n\n /** Whether this attendee is already connected (show \"Disconnect\" button). */\n canUnfollowUser(attendee: { id?: string }): boolean {\n const uid = attendee?.id;\n if (uid == null || uid === '') return false;\n const list = this.connectionsList?.length\n ? this.connectionsList\n : this.myConnections;\n return !!list?.find((c: any) => (c.userId ?? c.id) == uid);\n }\n\n canConnect(userId) {\n return !(\n this.canDisconnect(userId) ||\n this.pendingRequests.find((a) => a == userId)\n );\n }\n\n canDisconnect(userId) {\n return this.myConnections.find((conn) => conn.userId == userId);\n }\n\n fetchPendingRequests() {\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: this.autogenKey,\n });\n return this.http\n .get(\n `${this.environment.USERS_API}/events/${this.eventId}/connection-requests/autogen/pending-sent-requests?userId=${this.userId}`,\n { headers },\n )\n .pipe(\n switchMap((res: any) => {\n this.pendingRequests = res;\n this.cdr.markForCheck();\n return of(res);\n }),\n catchError((error: any) => {\n console.error('Error fetching pending requests: ', error);\n return of(null);\n }),\n );\n }\n\n fetchMyConnections() {\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: this.autogenKey,\n });\n return this.http\n .get(\n `${this.environment.USERS_API}/events/${this.eventId}/users-connections/autogen?userId=${this.userId}`,\n { headers },\n )\n .pipe(\n switchMap((res: any) => {\n this.myConnections = res;\n this.cdr.markForCheck();\n return of(res);\n }),\n catchError((error: any) => {\n console.error('Error fetching pending requests: ', error);\n return of(null);\n }),\n );\n }\n\n isDropdownOpen: boolean = false;\n agents: any;\n selectedAgents = [];\n allSelected = false;\n // Toggle the dropdown visibility\n toggleDropdown() {\n if (!this.agents) this.fetchAgents();\n this.isDropdownOpen = !this.isDropdownOpen;\n this.cdr.detectChanges();\n }\n\n onSelectAll(event: Event): void {\n this.agents?.forEach((agent) => (agent.selected = false));\n this.cdr.detectChanges();\n }\n\n onAgentChange(agent: any): void {\n //agent.selected = !agent.selected;\n //console.log(agent);\n let agentFound = this.agents.filter((p) => p.id == agent.id);\n if (agentFound && agentFound.length > 0) {\n agentFound[0].selected = !agentFound[0].selected;\n this.cdr.detectChanges();\n }\n this.cdr.detectChanges();\n }\n\n areAllSelected(): boolean {\n return this.agents?.every((agent) => !agent.selected);\n }\n\n getDropdownHeaderText(): string {\n const selectedAgents = this.agents?.filter((agent) => agent.selected);\n if (!selectedAgents) {\n return 'All Agents';\n } else {\n if (selectedAgents && selectedAgents?.length === 0) {\n return 'All Agents';\n } else {\n return selectedAgents?.length > 1\n ? `${selectedAgents?.length} Agents Selected`\n : `${selectedAgents?.length} Agent Selected`;\n }\n }\n }\n fetchAgents_http() {\n this.loading = true;\n const url = `${this.environment.AGENTS_API}/CoPilot/${this.botId}/active-agents`;\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n });\n\n return this.http.post(url, {}, { headers }).pipe(\n switchMap((res: any) => {\n if (res) {\n this.agents = res.map((agent) => ({\n ...agent,\n selected: false,\n }));\n }\n this.cdr.markForCheck();\n\n return of(res);\n }),\n catchError((error) => {\n console.error('Error fetching chatbot config: ', error);\n\n return of(null);\n }),\n );\n }\n isDocInEditMode = false;\n documentContent: any;\n\n conversationId: any;\n isContentLoaded = false;\n\n fetchContent_http() {\n this.isDocInEditMode = false;\n this.isContentLoaded = false;\n console.log('API call function');\n this.loading = true;\n const conversation_id = this.conversationService.getKey(this.botId);\n this.conversationId = conversation_id;\n const url = `${this.environment.AGENTS_API}/ConversationDocuments?conversationId=${conversation_id}&botId=${this.botId}`;\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: 'WIz/qAm+EEmfOkFaUA/weA==',\n 'domain-authority': this.domainAuthorityValue,\n });\n\n return this.http.get(url, { headers }).pipe(\n switchMap((res: any) => {\n if (res) {\n this.isDocInEditMode = true;\n this.documentContent = res;\n console.log('Get API callled success');\n this.isContentLoaded = true;\n console.log(res);\n }\n this.cdr.markForCheck();\n\n return of(res);\n }),\n catchError((error) => {\n console.error('Error fetching chatbot config DJ: ', error);\n this.isDocInEditMode = false;\n this.isContentLoaded = true;\n\n if (error?.status == 404) {\n console.log('dash');\n this.isDocInEditMode = false;\n this.isContentLoaded = true;\n }\n return of(null);\n }),\n );\n }\n\n fetchAgents() {\n this.fetchAgents_http().subscribe();\n }\n\n fetchEditorContent() {\n this.fetchContent_http().subscribe();\n }\n\n // events/${eventId}/users-connections\n processMessageForDisplay(markdown: string): SafeHtml {\n try {\n // Create a custom renderer to modify <a> tags\n const renderer = new marked.Renderer();\n\n // Customize anchor tags to include target=\"_blank\"\n renderer.link = (href: string, title: string, text: string) => {\n return `<a href=\"${href}\" title=\"${\n title || ''\n }\" target=\"_blank\">${text}</a>`;\n };\n\n // Parse the markdown content to HTML using marked with the custom renderer\n const markdownContent = marked.parse(markdown, { renderer: renderer });\n\n // Sanitize the parsed HTML using Angular's DomSanitizer\n const sanitizedHtml =\n this.sanitizer.bypassSecurityTrustHtml(markdownContent);\n\n // Return the safe HTML content for display\n return sanitizedHtml;\n } catch (error) {\n console.error('Error processing markdown:', error);\n return ''; // Return an empty string or handle the error appropriately\n }\n }\n\n prepareHtml(markdown: string): string {\n if (!markdown || !(markdown.length > 0)) {\n console.error('Input Markdown is null or empty');\n return '';\n }\n\n // Convert Markdown headers (### or ##) to <strong> for bold headings\n let html = markdown.replace(\n /^(#{1,6})\\s+(.*)$/gm,\n (match, hashes, text) => {\n const level = hashes.length;\n if (level === 3) {\n return `<h3><strong>${text}</strong></h3>`;\n } else if (level === 4) {\n return `<h4><strong>${text}</strong></h4>`;\n }\n return `<strong>${text}</strong>`;\n },\n );\n\n // Convert Markdown code blocks with language to preformatted HTML\n html = html.replace(/```(\\w+)?\\n([\\s\\S]*?)```/g, (match, lang, code) => {\n const escapedCode = this.escapeHtml(code);\n const language = lang || 'plaintext';\n\n // Create a copy button for the code block\n return `\n <div class=\"code-container\">\n <button id=\"copy-button\" class=\"copy-button\" (click)=\"copyToClipboard('\\`${escapedCode}\\`')\">${this.getTranslation(\n 'Copy',\n )}</button>\n <pre class=\"code_block diff\"><code class=\"language-${language}\">${escapedCode}</code></pre>\n </div>`;\n });\n\n // Convert inline code (wrapped in `backticks`) to inline <code> tags\n html = html.replace(/`([^`]+)`/g, '<code>$1</code>');\n\n // Convert Markdown bold to HTML <strong>\n html = html.replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>');\n\n // Convert numbered lists\n html = html.replace(/^\\d+\\.\\s+(.*)$/gm, '<li>$1</li>');\n\n // Convert bullet point lists\n html = html.replace(/^\\-\\s+(.*)$/gm, '<li>$1</li>');\n\n // Convert Markdown links to HTML links\n html = html.replace(\n /\\[([^\\]]+)]\\(([^)]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\">$1</a>',\n );\n\n // Convert new lines to <br> tags for paragraphs\n html = html.replace(/(?:\\r\\n|\\r|\\n)/g, '<br>');\n\n return html;\n }\n\n // Helper function to escape HTML characters for code blocks\n escapeHtml(code: string): string {\n return code\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n\n // Function to copy text to clipboard\n public copyToClipboard(text: string) {\n navigator.clipboard.writeText(text).then(\n () => {\n alert('Code copied to clipboard!');\n },\n (err) => {\n console.error('Could not copy text: ', err);\n },\n );\n }\n\n isCollapsed = false;\n isCollapsedForGraph = false;\n isCollapsedForFGraph = false;\n toggleCollapse() {\n this.isCollapsed = !this.isCollapsed;\n this.cdr.detectChanges();\n }\n\n toggleCollapseGraph() {\n this.isCollapsedForGraph = !this.isCollapsedForGraph;\n this.cdr.detectChanges();\n }\n toggleCollapseFGraph() {\n this.isCollapsedForFGraph = !this.isCollapsedForFGraph;\n this.cdr.detectChanges();\n }\n // [\n // {\n // \"title\": \"AI News January 2024: In-Depth and Concise - The AI Track\",\n // \"desc\": \"Each month, we compile significant news, trends, and happenings in AI, providing detailed summaries with key points in bullet form for concise yet complete understanding.\",\n // \"link\": \"https://theaitrack.com/ai-news-january-2024/\"\n // },\n // {\n // \"title\": \"Top AI News, January 2024 - Everypixel Journal\",\n // \"desc\": \"In this monthly roundup, we spotlight the top AI news stories from January, including the OpenAI vs. The New York Times Lawsuit.\",\n // \"link\": \"https://journal.everypixel.com/top-ai-news-january-2024\"\n // },\n // {\n // \"title\": \"AI News July 2024: In-Depth and Concise - The AI Track\",\n // \"desc\": \"This page features AI News for July 2024, highlighting significant events such as Canva acquiring Leonardo AI.\",\n // \"link\": \"https://theaitrack.com/ai-news-july-2024-in-depth-and-concise/\"\n // },\n // {\n // \"title\": \"January news roundup: What's new in the world of AI? - Pluralsight\",\n // \"desc\": \"OpenAI’s new GPT store, business-ready ChatGPT plans, and a predicted rise in AI-powered cybercrime.\",\n // \"link\": \"https://www.pluralsight.com/resources/blog/data/ai-this-month-january-2024\"\n // },\n // {\n // \"title\": \"AI News August 2024: In-Depth and Concise - The AI Track\",\n // \"desc\": \"This page features AI News for August 2024, with highlights such as Nvidia delaying the “Blackwell” B200 AI chips delivery.\",\n // \"link\": \"https://theaitrack.com/ai-news-august-2024-in-depth-and-concise-duplicate/\"\n // }\n // ]\n dateTime = { now: new Date().toISOString() };\n // Extracts the domain from a URL\n getDomainName(url: string): string {\n try {\n const { hostname } = new URL(url);\n return hostname.replace(/^www\\./, ''); // Remove 'www.' if present\n } catch {\n return 'unknown';\n }\n }\n\n // Generates the favicon URL\n getFaviconUrl(url: string): string {\n const domain = this.getDomainName(url);\n return `https://www.google.com/s2/favicons?sz=128&domain=${domain}`;\n }\n currentSourcesList: any = [];\n onCardClick(sources): void {\n this.currentSourcesList = sources;\n this.cdr.detectChanges();\n this.sourcesDrawer.open();\n const button = document.getElementById('botcloseplaygroundbutton');\n if (button) {\n button.style.display = 'none';\n }\n }\n\n isShowEditorButton = true;\n\n openOuterEditor() {\n this.fetchEditorContent();\n this.editorsDrawer.open();\n this.isDrawerOpen = true;\n this.isShowEditorButton = false;\n this.cdr.detectChanges();\n\n const button = document.getElementById('botcloseplaygroundbutton');\n if (button) {\n button.style.display = 'none';\n }\n }\n\n onCloseEditor() {\n this.editorsDrawer.close();\n this.isDrawerOpen = false;\n this.isShowEditorButton = true;\n this.cdr.detectChanges(); // Trigger change detection if needed\n this.onDrawerClosed();\n }\n\n onCloseSource() {\n this.sourcesDrawer.close();\n this.isDrawerOpen = false;\n this.cdr.detectChanges(); // Trigger change detection if needed\n this.onDrawerClosed();\n }\n onDrawerClosed() {\n setTimeout(() => {\n this.isDrawerOpen = true;\n this.cdr.detectChanges(); // Trigger change detection if needed\n // Use ngClass to dynamically apply the class\n const button = document.getElementById('botcloseplaygroundbutton');\n if (button) {\n button.style.display = 'block';\n }\n }, 800);\n }\n isDrawerOpen = true;\n\n toggleDrawer(todo) {\n this.isDrawerOpen = todo;\n this.cdr.detectChanges();\n this.updateButtonVisibility();\n }\n updateButtonVisibility() {\n const button = document.getElementById('botcloseplaygroundbutton');\n if (button) {\n button.style.display = this.isDrawerOpen ? 'block' : 'none';\n }\n }\n openLinkInNewTab(link: string): void {\n window.open(link, '_blank');\n }\n adjustTextareaHeight(event: any): void {\n try {\n if (event.key === 'Enter' && !event.shiftKey) {\n // Prevents a new line from being added\n event.preventDefault();\n }\n } catch (error) {}\n const textarea = event.target as HTMLTextAreaElement;\n textarea.style.height = 'auto'; // Reset the height\n textarea.style.height = `${textarea.scrollHeight}px`; // Adjust height to match content\n // Ensure the height doesn't exceed the max-height set in CSS\n if (textarea.scrollHeight > 150) {\n textarea.style.height = `150px`; // Adjust height to match content\n textarea.style.overflowY = 'auto'; // Enable scrolling if content exceeds 400px\n } else {\n textarea.style.overflowY = 'hidden'; // Hide scrollbar if content is within limits\n }\n }\n\n toggleWorkflows(value = null) {\n if (!this.checkForCop29BotId()) {\n this.botService.getWorkflowsByOrgId(this.orgId).subscribe((res) => {\n this.orgWorkflows = res;\n this.isWorkflowOpen = value == null ? !this.isWorkflowOpen : value;\n\n if (!this.isWorkflowOpen) {\n this.selectedWorkflow = null;\n this.openWorkflowInput = false;\n }\n\n this.cdr.detectChanges();\n });\n }\n }\n\n initializeForm() {\n // Create form controls dynamically based on selectedWorkflow.Trigger.InputSchema\n const formControls = {};\n if (this.selectedWorkflow?.Trigger?.InputSchema) {\n this.selectedWorkflow.Trigger.InputSchema.forEach((input) => {\n formControls[input.InputId] = [\n input.Value || '',\n input.Required ? Validators.required : null,\n ];\n });\n }\n\n // Initialize the form\n this.workflowForm = this.fb.group(formControls);\n }\n\n onWorkflowSelected(workflow) {\n this.selectedWorkflow = workflow;\n this.initializeForm();\n this.isWorkflowOpen = false;\n this.openWorkflowInput = true;\n }\n\n onWorkflowSubmit() {\n const container = document.getElementById('botAllChat');\n if (this.workflowForm.valid) {\n console.log(this.workflowForm.value);\n\n var input = this.prepareHtml(\n this.generateMarkdown(\n this.selectedWorkflow.Name,\n this.workflowForm.value,\n ),\n );\n\n // update last two chatLog entries, set showWorkflowExecutionLoader = false\n try {\n this.chatLog[this.chatLog.length - 1]['showWorkflowExecutionLoader'] =\n false;\n this.chatLog[this.chatLog.length - 2]['showWorkflowExecutionLoader'] =\n false;\n } catch (error) {}\n\n this.chatLog.push({\n type: 'user',\n message: input,\n time: formatNow(this.timezone),\n copied: false,\n isCollapsedTrue: false,\n showWorkflowExecutionLoader: true,\n });\n\n console.log(input);\n\n this.currentWorkflowActionProgress = 0;\n this.currentWorkflowAction =\n 'Executing ' + this.selectedWorkflow.Actions[0].Name;\n this.isChatingWithAi = true;\n this.executingWorkflow = true;\n this.workflowExecutionDetails = {\n Actions: this.selectedWorkflow.Actions,\n Inputs: this.workflowForm.value,\n workflowInputs: this.workflowForm.value,\n WorkflowName: this.selectedWorkflow.Name,\n };\n this.currentWorkflowExecutionDetails = this.workflowExecutionDetails;\n this.scrollToBottom();\n\n this.cdr.detectChanges();\n\n // execute the ask endpoint with workflow input\n this.makeAskRequest(\n input,\n this.agents,\n this.conversationKey,\n '',\n null,\n this.selectedWorkflow['_id'],\n this.workflowForm.value,\n );\n }\n }\n\n makeAskRequest(\n inputMsg: string,\n agents: any[],\n conversationId: string,\n msg?: any,\n chat?: any,\n workflowId?: string,\n workflow_inputs?: any,\n ): void {\n var url = `${this.environment.BASE_URL}/ai/ask`;\n\n var body = {\n user_question: inputMsg,\n user_id: this.userId,\n bot_id: this.botId,\n message_id: this.conversationService.generateKey(),\n session_id: this.conSessionKey,\n agents: agents?.filter((p) => p.selected).map((p) => p.id) ?? [],\n conversation_id: conversationId,\n first_name: this.firstName,\n last_name: this.lastName,\n };\n\n if (workflowId) {\n body['workflow_id'] = workflowId;\n body['workflow_inputs'] = workflow_inputs;\n }\n\n const headers: any = {\n 'Content-Type': 'application/json',\n Authorization: 'Bearer ' + this.s27Token,\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n eventUrl: this.eventUrl,\n eventToken: this.eventToken,\n };\n\n if (this.workspaceToken) {\n headers['workspaceToken'] = this.workspaceToken;\n }\n\n fetch(url, {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(body),\n })\n .then((response) => {\n if (response.status === 401 || response.status === 403) {\n this.is401 = true;\n this.refreshToken.emit();\n\n // If `msg` and `chat` exist, handle them\n if (msg && chat) {\n this.msg = msg;\n this.chat = chat;\n this.isFetchDataFor = true;\n }\n } else {\n this.is401 = false;\n }\n return response.json();\n })\n .then((data) => {\n console.log(data);\n // Additional response handling if needed\n })\n .catch((err) => {\n console.error('Error: ', err);\n this.isChatingWithAi = false;\n });\n\n this.input = '';\n this.selectedWorkflow = null;\n this.openWorkflowInput = false;\n this.isWorkflowOpen = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n }\n\n makeAskRequestold(\n inputMsg: string,\n agents: any[],\n conversationId: string,\n msg?: any,\n chat?: any,\n workflowId?: string,\n workflow_inputs?: any,\n ): void {\n const url = `${this.environment.BASE_URL}/ai/ask`;\n\n const body: any = {\n user_question: inputMsg,\n user_id: this.userId,\n bot_id: this.botId,\n message_id: this.conversationService.generateKey(),\n agents: agents?.filter((p) => p.selected).map((p) => p.id) ?? [],\n conversation_id: conversationId,\n first_name: this.firstName,\n last_name: this.lastName,\n };\n\n if (workflowId) {\n body['workflow_id'] = workflowId;\n body['workflow_inputs'] = workflow_inputs;\n }\n\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n });\n\n this.http.post(url, body, { headers }).subscribe({\n next: (data) => {\n console.log(data);\n // Additional response handling if needed\n },\n error: (err) => {\n console.error('Error: ', err);\n this.isChatingWithAi = false;\n },\n });\n\n this.input = '';\n this.selectedWorkflow = null;\n this.openWorkflowInput = false;\n this.isWorkflowOpen = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n }\n\n generateMarkdown(title, obj) {\n // Initialize markdown with the title\n let markdown = `## ${title}\\n`;\n\n // Loop through the object and append the field names and values\n for (const [key, value] of Object.entries(obj)) {\n var key_label =\n this.selectedWorkflow.Trigger.InputSchema.find(\n (input) => input.InputId === key,\n )?.Label || key;\n markdown += `- **${key_label}**: ${value}\\n`;\n }\n\n return markdown;\n }\n\n showWorkflowHistoryDetails(workflow_id) {\n if (!workflow_id) {\n this.workflowExecutionDetails = this.currentWorkflowExecutionDetails;\n this.showWorkflowExecutionDetails = true;\n this.cdr.detectChanges();\n return;\n }\n\n this.botService.getWorkflowExecutionById(workflow_id).subscribe((res) => {\n if (res && res.Actions && Array.isArray(res.Actions)) {\n res.Actions = res.Actions.map((action) => {\n if (action.InsertTimeStamp) {\n action.InsertTimeStamp = formatTimeStamps(\n this.timezone,\n action.InsertTimeStamp,\n );\n }\n return action;\n });\n }\n\n res.InsertTimeStamp = formatTimeStamps(\n this.timezone,\n res.InsertTimeStamp,\n );\n this.workflowExecutionDetails = res;\n this.showWorkflowExecutionDetails = true;\n this.cdr.detectChanges();\n });\n }\n\n closeModal() {\n this.showWorkflowExecutionDetails = false;\n }\n\n objectToArray(obj: any): any[] {\n return Object.keys(obj).map((key) => ({ key, value: obj[key] }));\n }\n\n startNewConversation() {\n this.conversationKey = this.conversationService.getKey(this.botId, true);\n this.chatLog = [this.chatLog[0]];\n this.isChatingWithAi = false;\n this.chatSocketInitialized = false;\n setTimeout(() => {\n this.ensureChatSocket();\n }, 200);\n this.scrollToBottom();\n this.cdr.detectChanges();\n }\n\n initializeSpeechRecognizer(token: string) {\n this.speechConfig = SpeechSDK.SpeechConfig.fromAuthorizationToken(\n token,\n this.region,\n );\n const audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput();\n this.recognizer = new SpeechSDK.SpeechRecognizer(\n this.speechConfig,\n audioConfig,\n );\n\n this.recognizer.recognizing = (s, e) => {\n if (e.result.reason === SpeechSDK.ResultReason.RecognizingSpeech) {\n this.input = e.result.text;\n console.log(`Recognizing: ${e.result.text}`);\n this.cdr.markForCheck();\n }\n };\n\n this.recognizer.recognized = (s, e) => {\n if (e.result.reason === SpeechSDK.ResultReason.RecognizedSpeech) {\n this.input = e.result.text;\n console.log(`Recognized: ${e.result.text}`);\n this.toggleRecording();\n this.cdr.markForCheck();\n }\n };\n\n this.recognizer.canceled = (s, e) => {\n console.error('Canceled: ', e.errorDetails);\n };\n\n this.recognizer.sessionStopped = (s, e) => {\n console.log('Session stopped.');\n this.recognizer.stopContinuousRecognitionAsync();\n this.fetchData();\n };\n }\n\n toggleRecording() {\n this.isRecording = !this.isRecording;\n\n if (this.isRecording) {\n this.startRecognition();\n } else {\n this.stopRecognition();\n }\n }\n\n startRecognition() {\n this.recognizer.startContinuousRecognitionAsync();\n }\n\n stopRecognition() {\n this.recognizer.stopContinuousRecognitionAsync();\n }\n\n checkForCop29BotId() {\n return (\n this.botId == '66fa3f276c5d71e2717bfea8' ||\n this.botId == '671633545652dd78efec848d'\n );\n }\n\n getLatestTime(time): string {\n if (time) {\n return time;\n }\n return new Date().toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n }); // returns current time in 'shortTime' format\n }\n\n /** Used by the voice modal when opened from this drawer. */\n voiceModalConversationId: string = '';\n\n openVoiceModal(): void {\n const conversationId =\n this.conversationKey ??\n this.conversationService.getKey(this.botId, false) ??\n '';\n this.voiceModalConversationId = conversationId;\n this.setupVoiceTranscripts();\n\n // Close existing overlay if any\n if (this.voiceModalOverlayRef) {\n this.voiceModalOverlayRef.detach();\n this.voiceModalOverlayRef.dispose();\n this.voiceModalOverlayRef = null;\n }\n\n const config: VoiceModalConfig = {\n apiUrl: this.environment?.BASE_URL ?? '',\n token: this.s27Token ?? '',\n botId: this.botId ?? '',\n conversationId,\n apiKey: this.apiKey ?? '',\n eventToken: this.eventToken ?? '',\n eventUrl: this.eventUrl ?? '',\n domainAuthority: this.domainAuthorityValue ?? 'prod-lite',\n agentName: this.botName || 'AI Assistant',\n agentRole: this.botSkills || 'AI Agent Specialist',\n agentAvatar: this.botIcon,\n };\n\n const closeCallback = () => {\n if (this.voiceModalOverlayRef) {\n this.voiceModalOverlayRef.detach();\n this.voiceModalOverlayRef.dispose();\n this.voiceModalOverlayRef = null;\n }\n this.closeVoiceModal();\n };\n\n const injector = Injector.create(\n [\n { provide: VOICE_MODAL_CONFIG, useValue: config },\n { provide: VOICE_MODAL_CLOSE_CALLBACK, useValue: closeCallback },\n ],\n this.injector,\n );\n\n const overlayRef = this.overlay.create({\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay\n .position()\n .global()\n .bottom('0')\n .right('0')\n .left('0')\n .top('0'),\n });\n\n const portal = new ComponentPortal(\n VoiceAgentModalComponent,\n this.viewContainerRef,\n injector,\n );\n overlayRef.attach(portal);\n this.voiceModalOverlayRef = overlayRef;\n this.cdr.markForCheck();\n }\n\n closeVoiceModal(): void {\n if (this.voiceModalOverlayRef) {\n this.voiceModalOverlayRef.detach();\n this.voiceModalOverlayRef.dispose();\n this.voiceModalOverlayRef = null;\n }\n this.isVoiceModalOpen = false;\n this.voiceAgentService.disconnect();\n this.cdr.markForCheck();\n\n // Reload chat history when voice modal closes (same as initial load)\n this.chatLog = [];\n this.fetchChatHistory().subscribe(\n (response) => {\n this.loading = false;\n this.mapChatHistory(response);\n this.cdr.markForCheck();\n },\n (err) => {\n this.loading = false;\n this.cdr.markForCheck();\n console.error(\n 'Error fetching chat history after voice modal close:',\n err,\n );\n // Fallback: show greeting so chat is not empty\n if (this.chatLog.length === 0 && this.greetingMsg) {\n this.mapChatHistory({ Messages: [] });\n }\n },\n );\n }\n\n private setupVoiceTranscripts(): void {\n // Clear existing subscriptions\n this.voiceTranscriptSubscriptions.forEach((sub) => sub.unsubscribe());\n this.voiceTranscriptSubscriptions = [];\n\n // Subscribe to user transcripts\n const userSub = this.voiceAgentService.userTranscript$.subscribe(\n (transcript) => {\n if (transcript.final && transcript.text.trim()) {\n // Add user message to chat\n this.chatLog.push({\n type: 'user',\n message: this.processMessageForDisplay(transcript.text),\n time: formatNow(this.timezone),\n copied: false,\n isCollapsedTrue: false,\n });\n this.cdr.markForCheck();\n this.scrollToBottom();\n }\n },\n );\n\n // Subscribe to bot transcripts\n const botSub = this.voiceAgentService.botTranscript$.subscribe(\n (transcript) => {\n if (transcript && transcript.trim()) {\n // Check if last message is from bot, update it, otherwise add new\n const lastMessage = this.chatLog[this.chatLog.length - 1];\n if (lastMessage && lastMessage.type === 'ai') {\n lastMessage.message = this.processMessageForDisplay(transcript);\n } else {\n this.chatLog.push({\n type: 'ai',\n message: this.processMessageForDisplay(transcript),\n time: formatNow(this.timezone),\n copied: false,\n isCollapsedTrue: false,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n }\n this.cdr.markForCheck();\n this.scrollToBottom();\n }\n },\n );\n\n this.voiceTranscriptSubscriptions.push(userSub, botSub);\n }\n}\n\nexport { VoiceModalConfig } from '../voice-agent/voice-modal-tokens';\n","import { InjectionToken } from '@angular/core';\n\nexport interface VoiceModalConfig {\n apiUrl: string;\n token: string;\n botId: string;\n conversationId: string;\n apiKey: string;\n eventToken: string;\n eventUrl: string;\n domainAuthority: string;\n agentName: string;\n agentRole: string;\n agentAvatar?: string;\n}\n\nexport const VOICE_MODAL_CONFIG = new InjectionToken<VoiceModalConfig>('VOICE_MODAL_CONFIG');\nexport const VOICE_MODAL_CLOSE_CALLBACK = new InjectionToken<() => void>('VOICE_MODAL_CLOSE_CALLBACK');\n","import { Component, Input, OnInit, OnDestroy, Output, EventEmitter, Injector } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { VoiceAgentService, CallState } from '../../services/voice-agent.service';\nimport { AudioAnalyzerService } from '../../services/audio-analyzer.service';\nimport { VOICE_MODAL_CONFIG, VOICE_MODAL_CLOSE_CALLBACK, VoiceModalConfig } from '../../voice-modal-tokens';\n\n@Component({\n selector: 'hivegpt-voice-agent-modal',\n templateUrl: './voice-agent-modal.component.html',\n styleUrls: ['./voice-agent-modal.component.scss']\n})\nexport class VoiceAgentModalComponent implements OnInit, OnDestroy {\n @Output() close = new EventEmitter<void>();\n @Input() apiUrl!: string;\n @Input() token!: string;\n @Input() botId!: string;\n @Input() conversationId!: string;\n @Input() apiKey: string = '';\n @Input() eventToken: string = '';\n @Input() eventUrl: string = '';\n @Input() domainAuthority: string = 'prod-lite';\n @Input() agentName: string = 'AI Assistant';\n @Input() agentRole: string = 'AI Agent Specialist';\n @Input() agentAvatar?: string;\n\n private injectedConfig: VoiceModalConfig | null = null;\n private onCloseCallback: (() => void) | null = null;\n\n constructor(\n public voiceAgentService: VoiceAgentService,\n public audioAnalyzer: AudioAnalyzerService,\n private injector: Injector\n ) {}\n\n /** Hardcoded voice agent avatar (Nia). */\n readonly displayAvatarUrl = 'https://www.jotform.com/uploads/mehmetkarakasli/form_files/1564593667676a8e85f23758.86945537_icon.png';\n\n callState: CallState = 'idle';\n statusText: string = '';\n duration: string = '00:00';\n isMicMuted: boolean = false;\n isUserSpeaking: boolean = false;\n audioLevels: number[] = [];\n isSpeaking: boolean = false;\n\n /** Track whether call has transitioned out of initial connected state. */\n private hasLeftConnectedOnce: boolean = false;\n\n private subscriptions: Subscription[] = [];\n\n ngOnInit(): void {\n // When opened via Overlay, config is provided by injection\n this.injectedConfig = this.injector.get(VOICE_MODAL_CONFIG, null);\n this.onCloseCallback = this.injector.get(VOICE_MODAL_CLOSE_CALLBACK, null);\n if (this.injectedConfig) {\n this.apiUrl = this.injectedConfig.apiUrl;\n this.token = this.injectedConfig.token;\n this.botId = this.injectedConfig.botId;\n this.conversationId = this.injectedConfig.conversationId;\n this.apiKey = this.injectedConfig.apiKey ?? '';\n this.eventToken = this.injectedConfig.eventToken ?? '';\n this.eventUrl = this.injectedConfig.eventUrl ?? '';\n this.domainAuthority = this.injectedConfig.domainAuthority ?? 'prod-lite';\n this.agentName = this.injectedConfig.agentName ?? this.agentName;\n this.agentRole = this.injectedConfig.agentRole ?? this.agentRole;\n this.agentAvatar = this.injectedConfig.agentAvatar;\n }\n\n // Subscribe to observables\n this.subscriptions.push(\n this.voiceAgentService.callState$.subscribe(state => {\n this.callState = state;\n this.isSpeaking = state === 'talking';\n if (state === 'listening' || state === 'talking') {\n this.hasLeftConnectedOnce = true;\n }\n if (state === 'idle' || state === 'ended') {\n this.hasLeftConnectedOnce = false;\n }\n })\n );\n\n this.subscriptions.push(\n this.voiceAgentService.statusText$.subscribe(text => {\n this.statusText = text;\n })\n );\n\n this.subscriptions.push(\n this.voiceAgentService.duration$.subscribe(duration => {\n this.duration = duration;\n })\n );\n\n this.subscriptions.push(\n this.voiceAgentService.isMicMuted$.subscribe(muted => {\n this.isMicMuted = muted;\n })\n );\n\n this.subscriptions.push(\n this.voiceAgentService.isUserSpeaking$.subscribe(speaking => {\n this.isUserSpeaking = speaking;\n })\n );\n\n this.subscriptions.push(\n this.voiceAgentService.audioLevels$.subscribe(levels => {\n this.audioLevels = levels;\n })\n );\n\n // Modal opens in idle state, then immediately starts connecting.\n this.voiceAgentService.resetToIdle();\n void this.startCall();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach(sub => sub.unsubscribe());\n this.disconnect();\n }\n\n isConnecting: boolean = false;\n\n async startCall(): Promise<void> {\n if (this.isConnecting || (this.callState !== 'idle' && this.callState !== 'ended')) return;\n this.isConnecting = true;\n try {\n await this.voiceAgentService.connect(\n this.apiUrl,\n this.token,\n this.botId,\n this.conversationId,\n this.apiKey,\n this.eventToken,\n this.eventUrl,\n this.domainAuthority\n );\n } catch (error) {\n console.error('Failed to connect voice agent:', error);\n } finally {\n this.isConnecting = false;\n }\n }\n\n async disconnect(): Promise<void> {\n await this.voiceAgentService.disconnect();\n }\n\n toggleMic(): void {\n this.voiceAgentService.toggleMic();\n }\n\n /** Map audio level (0–100) to waveform bar height in px (3–20). */\n getWaveformHeight(level: number): number {\n const n = Math.min(100, Math.max(0, level ?? 0));\n return 3 + (n / 100) * 17;\n }\n\n /** Status label for active call. */\n get statusLabel(): string {\n if (this.callState === 'connecting') return this.statusText || 'Connecting...';\n if (this.callState === 'talking') return 'Talking...';\n if (this.callState === 'listening') return 'Listening';\n if (this.callState === 'connected') {\n return this.hasLeftConnectedOnce ? 'Talking...' : 'Connected';\n }\n return this.statusText || '';\n }\n\n /** Call Again: reset to idle then start a new call. */\n callAgain(): void {\n this.voiceAgentService.resetToIdle();\n this.startCall();\n }\n\n /** Back to Chat: close modal and disconnect. */\n backToChat(): void {\n this.endCall();\n }\n\n /** End call but keep modal open to show Call Ended + Call Again / Back to Chat. */\n hangUp(): void {\n this.disconnect();\n }\n\n endCall(): void {\n this.disconnect();\n this.onCloseCallback?.();\n this.close.emit();\n }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'hivegpt-chatbot',\n templateUrl: './chatbot.component.html',\n styleUrls: ['./chatbot.component.scss'],\n})\nexport class ChatBotComponent {\n @Input() userId!: string;\n /** Optional user profile image URL; if not set, user initials are shown in chat. */\n @Input() userAvatarUrl?: string;\n /** User's selected timezone (e.g. 'America/New_York'); used for chat timestamps and session card times. */\n @Input() timezone!: string;\n @Input() apiKey!: string;\n @Input() botName!: string;\n @Input() botSkills!: string;\n @Input() botId!: string;\n @Input() closeButtonColor!: string;\n @Input() gradientColors!: string[];\n @Input() greeting!: string;\n @Input() sendButtonColor!: string;\n @Input() useOpenAi!: boolean;\n @Input() showClose!: boolean;\n @Input() bgGradient!: string[];\n @Input() sendButtonTextColor!: string;\n @Input() fullView!: boolean;\n @Input() bgBubbleAi!: string;\n @Input() bgBubbleUser!: string;\n @Input() closeButtonbgColor!: string;\n @Input() messageTextColorAi!: string;\n @Input() messageTextColorUser!: string;\n @Input() dateTimeColor!: string;\n @Input() dateTextColor!: string;\n @Input() formFieldBgColor!: string;\n @Input() formFieldTextColor!: string;\n @Input() thumbsUpMessage!: string;\n @Input() thumbsDownMessages!: string[];\n @Input() eventName!: string;\n @Input() credentials!: [];\n @Input() unknownResponses!: [];\n @Input() rules!: string;\n @Input() eventId!: string;\n @Input() s27Token!: string;\n @Input() workspaceToken!: string;\n @Input() isDev!: boolean;\n /** Optional API base URL (e.g. ngrok). When set, chat/voice use this instead of dev/prod default. */\n @Input() baseUrl?: string;\n visible = false;\n\n toggle() {\n this.visible = !this.visible;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { VoiceAgentModalComponent } from './components/voice-agent-modal/voice-agent-modal.component';\nimport { VoiceAgentService } from './services/voice-agent.service';\nimport { AudioAnalyzerService } from './services/audio-analyzer.service';\nimport { WebSocketVoiceClientService } from './services/websocket-voice-client.service';\nimport { DailyVoiceClientService } from './services/daily-voice-client.service';\n\n/**\n * Voice agent module. Uses native WebSocket + Daily.js only.\n * Does NOT use Socket.IO or ngx-socket-io.\n */\n@NgModule({\n declarations: [\n VoiceAgentModalComponent\n ],\n imports: [\n CommonModule\n ],\n providers: [\n VoiceAgentService,\n AudioAnalyzerService,\n WebSocketVoiceClientService,\n DailyVoiceClientService\n ],\n exports: [\n VoiceAgentModalComponent\n ]\n})\nexport class VoiceAgentModule { }\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Pipe({\n name: 'safeHtml',\n})\nexport class SafeHtmlPipe implements PipeTransform {\n\n constructor(private sanitizer: DomSanitizer) {\n }\n\n transform(html): unknown {\n return html ? this.sanitizer.bypassSecurityTrustHtml(html) : '';\n }\n\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { IVideo } from '../../models/video';\nimport { DOCUMENT } from '@angular/common';\n\n@Component({\n selector: 'app-video-player',\n templateUrl: './video-player.component.html',\n styleUrls: ['./video-player.component.scss'],\n})\nexport class VideoPlayerComponent\n implements OnInit, AfterViewInit {\n @Input() currentUserId: string;\n @Input() user: any;\n @Input() eventId: string;\n @Input() videoObj: IVideo;\n @Input() isDev: boolean;\n myFollowingList: Array<string>;\n myPendingSentRequests: Array<string>;\n @Input() type: string;\n isMuted: boolean = true;\n private observer: IntersectionObserver;\n isFullscreen: boolean = false;\n @ViewChild('video') video: any;\n @ViewChild('fullscreenvideo') fullscreenvideo: any;\n isFullscreenvideoPlaying: boolean = false;\n\n @Output() connectWithUser = new EventEmitter<string>();\n @Output() scheduleMeeting = new EventEmitter<any>();\n\n constructor(\n @Inject(DOCUMENT) private doc: any,\n private el: ElementRef,\n private cdr: ChangeDetectorRef\n ) {\n }\n\n ngOnInit(): void {\n }\n\n toggleSound(isMuted = null) {\n this.isMuted = isMuted != null ? isMuted : !this.isMuted;\n setTimeout(() => {\n const video: any = this.doc\n .getElementById(this.video.id.toString());\n if (video) {\n video.muted = this.isMuted;\n this.video.isMuted = this.isMuted;\n }\n\n this.cdr.markForCheck();\n //this.muteToggle.emit(this.isMuted);\n })\n}\n\n togglePlay(playState: boolean, videoEl) {\n this.videoObj.isPlaying = !this.videoObj.isPlaying;\n setTimeout(() => { \n if (playState) { \n this.videoObj.isPlaying = true;\n videoEl.play();\n var pauseBtn = document.getElementById('pause-btn');\n pauseBtn.classList.add('hide-pause-btn');\n\n this.toggleSound(false);\n }\n else{\n this.videoObj.isPlaying = false;\n videoEl.pause();\n }\n this.cdr.markForCheck();\n })\n }\n \n ngAfterViewInit() {\n if (window.innerWidth <= 576) {\n this.observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting === true) {\n this.video.nativeElement.play();\n } else {\n this.video.nativeElement.pause();\n }\n },\n {\n threshold: 0.75,\n }\n );\n\n this.observer.observe(this.el.nativeElement as HTMLElement);\n }\n }\n\n toggleFullscreen() {\n this.isFullscreen = !this.isFullscreen;\n if (!this.isFullscreen) {\n this.fullscreenvideo.nativeElement.pause();\n }\n }\n\n toggleFullscreenPlay() {\n this.isFullscreenvideoPlaying = !this.isFullscreenvideoPlaying;\n\n if (this.isFullscreenvideoPlaying) {\n this.fullscreenvideo.nativeElement.play();\n } else {\n this.fullscreenvideo.nativeElement.pause();\n }\n }\n\n followUser(userId) {\n this.connectWithUser.emit(userId);\n }\n\n checkPendingSentRequest(userId) {\n return this.myPendingSentRequests?.find(a => a == userId);\n }\n\n canUnfollowUser() {\n return false;\n }\n\n canFollowUser() {\n return true;\n }\n\n getIniNames(firstName, lastName) {\n if(!firstName && !lastName) {\n return '';\n }\n \n if (firstName && lastName)\n return (\n firstName.charAt(0).toUpperCase() + lastName.charAt(0).toUpperCase()\n );\n else return firstName.charAt(0).toUpperCase();\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n QueryList,\n Renderer2,\n SimpleChanges,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { MatDrawer } from '@angular/material/sidenav';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { of, Subscription } from 'rxjs';\nimport { catchError, switchMap } from 'rxjs/operators';\nimport { formatNow, formatTimeStamps } from '../../utils/utils';\nimport {\n dev_environment,\n prod_environment,\n} from '../../../environments/environment';\nimport { ConversationService } from '../conversation.service';\nimport { Observable } from 'rxjs';\nimport { SocketService } from '../socket-service.service';\n\n@Component({\n selector: 'lib-bot-html-editor',\n templateUrl: './bot-html-editor.component.html',\n styleUrls: ['./bot-html-editor.component.css'],\n})\nexport class BotHtmlEditorComponent implements OnInit {\n @Input() editorContent: Observable<string>;\n @Input() isDocInEditMode: any;\n @Input() documentContent: any;\n @Input() conversationId: any;\n @Input() botId: any;\n\n documentName: any = 'doc name';\n\n environment: {\n USERS_API;\n BASE_URL;\n AGENTS_API;\n };\n\n quillConfig = {\n toolbar: [\n [{ header: '1' }, { header: '2' }, { font: [] }],\n [{ list: 'ordered' }, { list: 'bullet' }],\n ['bold', 'italic', 'underline'],\n ['link'],\n ['clean'],\n ],\n };\n constructor(private cdr: ChangeDetectorRef, private http: HttpClient) {}\n\n ngOnInit(): void {\n this.environment = prod_environment;\n\n setTimeout(() => {\n if (this.isDocInEditMode) {\n console.log('In Edit mode');\n this.filldataInForm();\n } else {\n console.log('In save mode');\n }\n }, 2500);\n }\n\n filldataInForm() {\n if (this.documentContent) {\n this.documentName = this.documentContent?.name;\n this.editorContent = this.documentContent?.content;\n this.cdr.detectChanges();\n }\n }\n\n saveContent() {\n if (!this.isDocInEditMode) {\n this.saveContent_http().subscribe();\n } else {\n this.saveContent_http().subscribe();\n }\n }\n\n saveContent_http() {\n console.log('API call function');\n\n const url = `${this.environment.AGENTS_API}/ConversationDocuments?conversationId=${this.conversationId}&botId=${this.botId}`;\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: 'WIz/qAm+EEmfOkFaUA/weA==',\n });\n\n let data = {\n name: this.documentName,\n content: this.editorContent,\n };\n\n return this.http.post(url, data, { headers }).pipe(\n switchMap((res: any) => {\n if (res) {\n // alert('Saved Successfully');\n }\n this.cdr.markForCheck();\n\n return of(res);\n }),\n catchError((error) => {\n console.error('Error fetching chatbot config: ', error);\n\n return of(null);\n })\n );\n }\n\n updateContent_http() {\n console.log('API call function');\n\n const url = `${this.environment.AGENTS_API}/ConversationDocuments/rename?conversationId=${this.conversationId}&botId=${this.botId}`;\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: 'WIz/qAm+EEmfOkFaUA/weA==',\n });\n\n let data = {\n name: this.documentName,\n content: this.editorContent,\n };\n\n return this.http.put(url, data, { headers }).pipe(\n switchMap((res: any) => {\n if (res) {\n // alert('Updated Successfully');\n }\n this.cdr.markForCheck();\n\n return of(res);\n }),\n catchError((error) => {\n console.error('Error fetching chatbot config: ', error);\n\n return of(null);\n })\n );\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { ChatDrawerComponent } from './components/chat-drawer/chat-drawer.component';\nimport { ChatBotComponent } from './components/chatbot/chatbot.component';\nimport { SafeHtmlPipe } from './pipes/safe-html.pipe';\nimport { VideoPlayerComponent } from './components/video-player/video-player.component';\nimport { QuillModule } from 'ngx-quill';\nimport { BotHtmlEditorComponent } from './components/bot-html-editor/bot-html-editor.component';\nimport { VoiceAgentModule } from './components/voice-agent/voice-agent.module';\n\n@NgModule({\n declarations: [ChatBotComponent, ChatDrawerComponent, VideoPlayerComponent, SafeHtmlPipe, BotHtmlEditorComponent],\n imports: [CommonModule, OverlayModule, MatIconModule, MatSidenavModule, FormsModule, ReactiveFormsModule, QuillModule, VoiceAgentModule],\n exports: [ChatBotComponent, ChatDrawerComponent, VideoPlayerComponent]\n})\nexport class HiveGptModule { }\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","_","label","sent","trys","ops","g","Iterator","verb","Symbol","iterator","n","v","op","pop","length","push","__values","o","s","m","i","__read","r","ar","error","__spreadArray","to","from","pack","arguments","l","slice","concat","SuppressedError","TranslationService","eventId","translationsData","Key","DefaultValue","Translations","en","fr","it","es","de","zh","ru","setEventId","id","getTranslation","key","console","log","lang","localStorage","getItem","replace","entry","find","item","getLang","storageKey","type","Injectable","args","providedIn","formatHoursAndMinutes","date","hours","getHours","minutes","getMinutes","formatNow","timezone","now","Date","options","hour12","hour","minute","timeZone","toLocaleString","formatTimeStamps","timestamps","trim","prod_environment","USERS_API","BASE_URL","AGENTS_API","API_KEY","SocketUrl","dev_environment","ConversationService","conversationStorageKeyPrefix","sessionStorageKeyPrefix","userSpecificNotification","Subject","generateKey","Math","floor","getTime","toString","random","getKey","botId","resetKey","setItem","getSessionKey","sessionId","sendValidatedUserData","message","getUserSpecificNotification","asObservable","NotificationSocket","_super","_this","socketConfig","on","warn","err","Socket","url","transports","reconnection","autoConnect","upgrade","reconnectionDelay","reconnectionDelayMax","reconnectionAttempts","Infinity","SocketService","conversationService","notificationSocket","isCommonSocketInitialized","isUserSpecificSocketInitialized","isUserSpecificEventReleased","messageQueue","releaseInterval","intervalSetup","startReleasingMessages","isSocketInitialized","isCommon","disconnectSocketConnection","disconnect","connectSocketConnection","connect","registerUserSpecificHiveSocket","conversation_id","org_id","groupId","groupId_org","emit","fromEvent","subscribe","res","hasOtherFields","_a","OtherFields","messageId","_c","_b","message_id","hasAnswer","_e","_d","answer","isWorkflow","_g","_f","workflow_id","raw","setInterval","shift","BotsService","http","eventDescription","bot_api","fetchSpeechAuthorizationToken","apiKey","domain","headers","HttpHeaders","get","pipe","map","resp","token","getWorkflowsByOrgId","orgId","getWorkflowExecutionById","executionId","apiUrl","HttpClient","AudioAnalyzerService","audioContext","analyserNode","dataArray","animationFrameId","isRunning","audioLevelsSubject","BehaviorSubject","isUserSpeakingSubject","noiseFloor","noiseFloorSamples","NOISE_FLOOR_SAMPLE_COUNT","SPEAKING_THRESHOLD_MULTIPLIER","WAVEFORM_BAR_COUNT","audioLevels$","isUserSpeaking$","start","stream","stop","window","AudioContext","webkitAudioContext","source","createMediaStreamSource","createAnalyser","fftSize","smoothingTimeConstant","bufferLength","frequencyBinCount","Uint8Array","analyze","cancelAnimationFrame","state","close","catch","getByteTimeDomainData","rms","calculateRMS","sum","reduce","a","isSpeaking","bars","generateWaveformBars","requestAnimationFrame","data","normalized","sqrt","abs","min","max","WebSocketVoiceClientService","ws","roomCreatedSubject","userTranscriptSubject","botTranscriptSubject","roomCreated$","userTranscript$","botTranscript$","wsUrl","readyState","WebSocket","OPEN","onmessage","event","msg","JSON","parse","roomUrl","room_url","text","final","onerror","onclose","defineProperty","DailyVoiceClientService","ngZone","callObject","localStream","localSessionId","remoteAudioElement","remoteAudioContext","remoteSpeakingRAF","speakingSubject","userSpeakingSubject","micMutedSubject","localStreamSubject","speaking$","userSpeaking$","micMuted$","localStream$","navigator","mediaDevices","getUserMedia","audio","audioTrack","getAudioTracks","getTracks","forEach","Error","Daily","createCallObject","videoSource","audioSource","setupEventHandlers","joinOptions","join","toISOString","participants","local","session_id","localAudio","cleanup","err_1","run","peerId","activeSpeaker","isLocal","participant","track","kind","muted","tracks","playRemoteTrack","monitorRemoteAudio","stopRemoteAudioMonitor","stopRemoteAudio","errorMsg","onunmute","MediaStream","Audio","autoplay","srcObject","onplaying","firstTimeUpdate_1","ontimeupdate","play","ctx","analyser_1","dataArray_1","lastSoundTime_1","isSpeaking_1","poll_1","getByteFrequencyData","avg","toFixed","pause","setMuted","setLocalAudio","leave","destroy","NgZone","VoiceAgentService","audioAnalyzer","wsClient","dailyClient","callStateSubject","statusTextSubject","durationSubject","isMicMutedSubject","callStartTime","durationInterval","subscriptions","Subscription","destroy$","callState$","statusText$","duration$","isMicMuted$","add","levels","ngOnDestroy","unsubscribe","resetToIdle","stopDurationTimer","conversationId","eventToken","eventUrl","domainAuthority","baseUrl","fetch","method","Authorization","eventtoken","eventurl","stringify","bot_id","voice","ok","status","json","rn_ws_url","take","takeUntil","onRoomCreated","error_1","filter","combineLatest","bot","user","current","startDurationTimer","toggleMic","updateDuration","elapsed","seconds","padStart","clearInterval","eClassificationType","VOICE_MODAL_CONFIG","InjectionToken","VOICE_MODAL_CLOSE_CALLBACK","VoiceAgentModalComponent","voiceAgentService","injector","EventEmitter","agentName","agentRole","injectedConfig","onCloseCallback","displayAvatarUrl","callState","statusText","duration","isMicMuted","isUserSpeaking","audioLevels","hasLeftConnectedOnce","isConnecting","ngOnInit","agentAvatar","speaking","startCall","sub","getWaveformHeight","level","callAgain","backToChat","endCall","hangUp","Component","selector","template","Injector","Output","Input","ChatDrawerComponent","fb","botService","cdr","sanitizer","elementRef","renderer","socketService","translationService","overlay","viewContainerRef","bodyOverflowClass","isCollapsedTrue","copilotName","autoScrollOnNewMessage","connectionsList","pendingSentRequestUserIds","isConnectionsEnabled","isUnEvent","feedbackEvent","onCloseEvent","openPage","sessionActions","sessionActionBlocked","closeBot","connectWithUser","viewSpeakerProfile","viewBooth","scheduleMeeting","refreshToken","openSupport","autogenKey","addToMyAgendaAction","myUpcomingSessionAction","connectOrFollowAction","aiResponse","chatLog","decoder","TextDecoder","feedbackDone","greetingMsg","hasBackdropValue","input","listenerAdded","loading","mode","quickPrompts","thumbsDownMsgIndex","userName","showStartAgain","isIOSDevice","showFeedBackIconsIndex","temperature","speakers","requestedSpeakerIds","Set","conSessionKey","currentWorkflowActionProgress","currentWorkflowAction","recognizedText","authorizationToken","region","isVoiceModalOpen","voiceModalOverlayRef","voiceTranscriptSubscriptions","domainAuthorityValue","chatSocketInitialized","SESSION_CARDS_INITIAL","ATTENDEE_CARDS_INITIAL","SPEAKER_CARDS_INITIAL","SPONSOR_CARDS_INITIAL","BOOTH_REP_CARDS_INITIAL","expandedSessionCardIds","expandedAttendeeCardIds","expandedSpeakerCardIds","expandedSponsorCardIds","expandedBoothRepCardIds","expandedAttendeeDescriptionIds","attendeeVideoPlayingIds","attendeeVideoMutedIds","isChatingWithAi","readAllChunks","reader","getReader","allSuggestions","closed","scrollToBottom","ReadableStream","controller","pump","currentMessageForEditor","currentIndexForEditor","isDropdownOpen","selectedAgents","allSelected","isDocInEditMode","isContentLoaded","isCollapsed","isCollapsedForGraph","isCollapsedForFGraph","dateTime","currentSourcesList","isShowEditorButton","isDrawerOpen","voiceModalConversationId","chatMain","ElementRef","getLoadingTime","getUserIdInitials","first","firstName","last","lastName","toUpperCase","getAttendeeInitials","name","parts","split","Boolean","ngOnChanges","changes","currentValue","s27Token","previousValue","isFetchDataFor","chat","is401","fetchDataFor","fetchData","environment","applyBaseUrlOverride","defaultEnv","isDev","assign","location","hostname","includes","changeTemperature","fetchBotConfig","markForCheck","fetchChatHistory","response","mapChatHistory","initializeSpeechRecognizer","ensureChatSocket","initializeSocket","setTimeout","listenSockets","stripHtml","html","DOMParser","parseFromString","textContent","getAttendeeDescription","attendee","description","interests","jobTitle","str","test","shouldShowAttendeeReadMore","getAttendeeDescKey","msgId","_id","attendeeId","userId","isAttendeeDescriptionExpanded","toggleAttendeeDescription","ev","stopPropagation","_14","getAttendeeVideoUrl","userVideosModel","getAttendeeVideoPoster","poster","thumbnail","getAttendeeMediaKey","isAttendeeVideoMuted","isAttendeeVideoPlaying","toggleAttendeeVideoMute","videoEl","volume","toggleAttendeeVideoPlay","onAttendeeVideoPlayState","isPlaying","formatSessionWhen","dateTimeRange","displayTimeZone","localeOpts","end","startDt","endDt","toLocaleDateString","month","day","year","toLocaleTimeString","startMatch","match","endMatch","startStr","endStr","getSessionDateBadge","isNaN","formatSessionTimeRange","startTime","endTime","getTimezoneAbbreviation","tz","tzId","startsWith","winMap","WINDOWS_TZ_ABBR_MAP","winKey","keys","k","toLowerCase","TZ_ABBR_MAP","mapped","keyLower_1","entries","tzPart","Intl","DateTimeFormat","timeZoneName","formatToParts","getStatusTextFromSessionRoles","sessionRoles","isArray","mapSessionsToCardData","sessions","userTimezone","undefined","whenRaw","actualDateTimeRange","whenFormatted","some","sessionRoleName","sessionTimeZone","tzAbbr","whenWithTz","whenDisplay","dateBadge","timeRange","abstract","meetingType","_j","_h","sessionType","sessionTypeLabel","timeZoneDisplay","timeRangeWithTz","title","_k","organizer","_l","room","_m","roomName","when","dateDay","dateMonth","session","collectSpeakerIdsFromSessionCards","sessionCards","ids","sessionCards_1","sessionCards_1_1","card","raw_1","e_2","raw_1_1","sid","attachSpeakersToSessionCards","sessionCards_2","sessionCards_2_1","speakersList","x","ensureSpeakersForSessionCards","missing","has","getSpeakersByStaffIds","getSpeakerPhotoUrl","speaker","photo","photoPath","avatarUrl","profileImageUrl","profileImage","profilePicture","imageUrl","image","hasSessionCardSpeakers","sessionCard","list","getSpeakerDisplayName","getSpeakerInitials","mapAttendeesToCardData","attendees","company","mapSpeakersToCardData","rawDesc","rawTitle","speakerId","mapSponsorsToCardData","sponsors","boothDescription","urlSlug","boothUrl","boothID","boothId","logoUrl","website","category","boothTitle","mapBoothsToCardData","booths","mapBoothRepsToCardData","representatives","parseSessionContentV2","content","block","lines","j","line","timeMatch","tzMatch","roomMatch","typeMatch","tzLineMatch","getVisibleSessionCards","total","expanded","getVisibleAttendeeCards","attendeeCards","getVisibleSpeakerCards","speakerCards","getVisibleSponsorCards","sponsorCards","getVisibleBoothRepCards","boothRepCards","expandSessionCards","expandAttendeeCards","expandSpeakerCards","expandSponsorCards","expandBoothRepCards","getSessionTypeLabel","getSessionRoleButtons","action","roles","raw_2","raw_2_1","isSessionOndemand","classificationId","OnDemand","canPerformSessionAction","isButtonActivated","getMeetingDelayMinutes","startDate","actualStart","diffMs","isMeetingDelayed","delay","onSessionCardAction","role","eventSubscription","percentage","output","action_name","current_action_name_1","current_action_name","workflow_execution_id","time_stamp","actionIndex","workflowExecutionDetails","Actions","findIndex","Name","currentWorkflowExecutionDetails","executingWorkflow","focusOnTextarea","detectChanges","otherFields","serializable","serializable_to_return","tool_name","contentStr","_o","tool_result","messages","answerText","pushed","_p","parsed","msgId_1","cardEntry","processMessageForDisplay","time","existingIdx","_s","_r","_q","_t","msgId_2","_w","_v","_u","_y","_x","msgId_3","_1","_0","_z","_2","msgId_4","_5","_4","_3","_6","msgId_5","_9","_8","_7","_10","msgId_6","message_id_1","web_results","search_results","graphs","execution_graphs","suggestions","answerLength","webResultsCount","_11","searchResultsCount","_12","currentChatMessage","chatLogLength","searchTerms","sourcesList","displayedSources","remainingSources","answerPreview","_13","substring","executionGraphs","relatedListItems","initializeSocketAndListen","handleEvent","newTemperature","wrapper","document","querySelector","classList","remove","onStartAgain","archieveMessages","post","switchMap","of","catchError","triggerSupport","botName","botIcon","Icon","botSkills","Skills","Greeting","thumbsDownMessages","NegativeResponses","QuickPrompts","conversationKey","accept","handleError","operation","pushAiMessageFromHistory","WebLinks","Text","ExecutionGraphs","Graphs","SearchTerms","InsertTimestamp","copied","chats","Messages","Type","WorkflowExecutionId","toolName","toolresults","processMessage","markdownLinkRegex","urlRegex","sanitizeHtml","hashes","ngAfterViewChecked","nativeElement","querySelectorAll","link","addEventListener","onFeedbackClick","bind","bypassSecurityTrustHtml","onClose","removeClass","sendMessageWithTile","prompt","textarea","myInput","style","height","makeAskRequest","agents","inputMsg","fetchSmallTalk","smallTalk","isFeedbackMsg","read","lastItem","decodedChunk","decode","suggestionsMatch","aiFormattedData","section_id","fetchMyConnections","fetchPendingRequests","speakerIds","sectionId","sessionIds","usersLen","search","connetUserIds","is_open_page","isMobileBrowser","addCloseBotClickEvent","enqueue","submitFeedback","flag","isHelpful","thumbsUpMessage","supportLink","getElementById","handleKeydown","shiftKey","preventDefault","handleSubmit","handleUpClick","idx","liked","unliked","handleDownClick","copyText","index","textElement","tempTextArea","createElement","innerText","appendChild","select","execCommand","removeChild","handleCopyClick","sanitizeHTML","doc","fragment","createDocumentFragment","childNodes","node","cloneNode","simplifiedDiv","script","innerHTML","handleEditorClick","isEditor","editorsDrawer","open","button","display","counter","interval","scrollTop","scrollHeight","focus","handleAction","info","ngAfterViewInit","drawer","opened","setBodyOverflow","openedChange","removeBodyOverflow","addClass","cleanIds","tap","performSessionAction","element","listen","userAgent","connectToUser","canDisconnect","scheduleMeetingWithUser","checkPendingSentRequest","pending","pendingRequests","canFollowUser","uid","canUnfollowUser","myConnections","c","canConnect","conn","toggleDropdown","fetchAgents","onSelectAll","agent","selected","onAgentChange","agentFound","areAllSelected","every","getDropdownHeaderText","fetchAgents_http","fetchContent_http","documentContent","fetchEditorContent","markdown","marked","Renderer","href","markdownContent","prepareHtml","code","escapedCode","escapeHtml","language","copyToClipboard","clipboard","writeText","alert","toggleCollapse","toggleCollapseGraph","toggleCollapseFGraph","getDomainName","URL","getFaviconUrl","onCardClick","sources","sourcesDrawer","openOuterEditor","onCloseEditor","onDrawerClosed","onCloseSource","toggleDrawer","todo","updateButtonVisibility","openLinkInNewTab","adjustTextareaHeight","target","overflowY","toggleWorkflows","checkForCop29BotId","orgWorkflows","isWorkflowOpen","selectedWorkflow","openWorkflowInput","initializeForm","formControls","Trigger","InputSchema","InputId","Value","Required","Validators","required","workflowForm","group","onWorkflowSelected","workflow","onWorkflowSubmit","valid","generateMarkdown","showWorkflowExecutionLoader","Inputs","workflowInputs","WorkflowName","workflowId","workflow_inputs","user_question","user_id","first_name","last_name","workspaceToken","makeAskRequestold","obj","key_label","_loop_1","this_1","Label","_15","_16","_17","showWorkflowHistoryDetails","showWorkflowExecutionDetails","InsertTimeStamp","closeModal","objectToArray","startNewConversation","speechConfig","SpeechSDK","SpeechConfig","fromAuthorizationToken","audioConfig","AudioConfig","fromDefaultMicrophoneInput","recognizer","SpeechRecognizer","recognizing","reason","ResultReason","RecognizingSpeech","recognized","RecognizedSpeech","toggleRecording","canceled","errorDetails","sessionStopped","stopContinuousRecognitionAsync","isRecording","startRecognition","stopRecognition","startContinuousRecognitionAsync","getLatestTime","openVoiceModal","setupVoiceTranscripts","detach","dispose","config","provide","useValue","closeVoiceModal","overlayRef","hasBackdrop","scrollStrategy","scrollStrategies","positionStrategy","position","global","bottom","right","left","top","portal","ComponentPortal","attach","userSub","transcript","botSub","lastMessage","changeDetection","ChangeDetectionStrategy","OnPush","FormBuilder","ChangeDetectorRef","DomSanitizer","Renderer2","Overlay","ViewContainerRef","ViewChild","static","closePlaygroundButtons","ViewChildren","ChatBotComponent","visible","toggle","VoiceAgentModule","NgModule","declarations","imports","CommonModule","providers","exports","SafeHtmlPipe","transform","Pipe","VideoPlayerComponent","el","isMuted","isFullscreen","isFullscreenvideoPlaying","toggleSound","video","togglePlay","playState","videoObj","innerWidth","observer","IntersectionObserver","isIntersecting","threshold","observe","toggleFullscreen","fullscreenvideo","toggleFullscreenPlay","followUser","myPendingSentRequests","getIniNames","charAt","decorators","Inject","DOCUMENT","BotHtmlEditorComponent","documentName","quillConfig","toolbar","header","font","filldataInForm","editorContent","saveContent","saveContent_http","updateContent_http","put","HiveGptModule","OverlayModule","MatIconModule","MatSidenavModule","FormsModule","ReactiveFormsModule","QuillModule"],"sources":["../../../../node_modules/tslib/tslib.es6.js","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/translations/translation.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/utils/utils.ts","../../../../projects/hivegpt/eventsgpt-angular/src/environments/environment.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/conversation.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/NotificationSocket.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/socket-service.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/bot.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/services/audio-analyzer.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/services/websocket-voice-client.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/services/daily-voice-client.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/services/voice-agent.service.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/chat-drawer/chat-drawer.component.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/voice-modal-tokens.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/chatbot/chatbot.component.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/voice-agent/voice-agent.module.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/pipes/safe-html.pipe.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/video-player/video-player.component.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/components/bot-html-editor/bot-html-editor.component.ts","../../../../projects/hivegpt/eventsgpt-angular/src/lib/hivegpt.module.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TranslationService {\n private eventId: string | null = null;\n\n setEventId(id: string) {\n this.eventId = id;\n }\n\n getTranslation(key: string): string {\n console.log('eventId', this.eventId);\n // let lang = String(this.getLang(this.eventId)).replace(/^\"|\"$/g, '');\n const lang = (\n localStorage.getItem('defaultLanguage-' + this.eventId) || 'en'\n ).replace(/^\"|\"$/g, '');\n\n const entry = this.translationsData.find((item) => item.Key === key);\n\n if (!entry) {\n return key; // fallback\n }\n\n return entry.Translations[lang] || entry.DefaultValue || key;\n }\n\n private getLang(eventId?: string | null): string {\n const suffix = eventId ? `-${eventId}` : '';\n const storageKey = `defaultLanguage${suffix}`;\n\n return localStorage.getItem(storageKey) || 'en';\n }\n\n private translationsData: any[] = [\n { \n Key: \"Copy\",\n DefaultValue: \"Copy\",\n Translations: {\n en: \"Copy\",\n fr: \"Copier\",\n it: \"Copia\",\n es: \"Copiar\",\n de: \"Kopieren\",\n \"pt-br\": \"Copiar\",\n ar: \"نسخ\",\n zh: \"复制\",\n ru: \"Копировать\"\n }\n}\n,\n {\n \n Key: \"May I assist you with anything else\",\n DefaultValue: \"Great. May I assist you with anything else?\",\n Translations: {\n en: \"Great. May I assist you with anything else?\",\n fr: \"Parfait. Puis-je vous aider avec autre chose ?\",\n it: \"Perfetto. Posso aiutarti con qualcos'altro?\",\n es: \"Genial. ¿Puedo ayudarte con algo más?\",\n de: \"Super. Kann ich Ihnen noch bei etwas anderem helfen?\",\n \"pt-br\": \"Ótimo. Posso ajudar com mais alguma coisa?\",\n ar: \"رائع. هل يمكنني مساعدتك في أي شيء آخر؟\",\n zh: \"太好了。还有什么我可以帮您的吗?\",\n ru: \"Отлично. Могу ли я помочь вам с чем-то ещё?\"\n }\n},\n {\n Key: \"We are sorry we've not been able to answer your question\",\n DefaultValue: \"We are sorry we've not been able to answer your question. However, our dedicated support team is happy to help. Please <a href=\\\"mailto:support@social27.com\\\">click here</a> and a human agent will assist you as soon as possible.\",\n Translations: {\n en: \"We are sorry we've not been able to answer your question. However, our dedicated support team is happy to help. Please <a href=\\\"mailto:support@social27.com\\\">click here</a> and a human agent will assist you as soon as possible.\",\n fr: \"Nous sommes désolés de ne pas avoir pu répondre à votre question. Cependant, notre équipe d'assistance se fera un plaisir de vous aider. Veuillez <a href=\\\"mailto:support@social27.com\\\">cliquer ici</a> et un agent humain vous assistera dès que possible.\",\n it: \"Ci dispiace di non essere riusciti a rispondere alla tua domanda. Tuttavia, il nostro team di supporto dedicato sarà lieto di aiutarti. Ti preghiamo di <a href=\\\"mailto:support@social27.com\\\">fare clic qui</a> e un operatore umano ti assisterà al più presto.\",\n es: \"Lamentamos no haber podido responder a tu pregunta. Sin embargo, nuestro equipo de soporte estará encantado de ayudarte. Por favor, <a href=\\\"mailto:support@social27.com\\\">haz clic aquí</a> y un agente humano te asistirá lo antes posible.\",\n de: \"Es tut uns leid, dass wir Ihre Frage nicht beantworten konnten. Unser engagiertes Support-Team hilft Ihnen jedoch gerne weiter. Bitte <a href=\\\"mailto:support@social27.com\\\">klicken Sie hier</a>, und ein menschlicher Mitarbeiter wird Ihnen so bald wie möglich helfen.\",\n \"pt-br\": \"Lamentamos não ter conseguido responder à sua pergunta. No entanto, nossa equipe de suporte dedicada ficará feliz em ajudar. Por favor, <a href=\\\"mailto:support@social27.com\\\">clique aqui</a> e um agente humano o ajudará o mais rápido possível.\",\n ar: \"نأسف لعدم تمكننا من الإجابة على سؤالك. ومع ذلك، يسعد فريق الدعم المخصص لدينا بمساعدتك. يرجى <a href=\\\"mailto:support@social27.com\\\">النقر هنا</a> وسيساعدك أحد الوكلاء البشريين في أقرب وقت ممكن.\",\n zh: \"很抱歉我们未能回答您的问题。不过,我们的专属支持团队很乐意为您提供帮助。请<a href=\\\"mailto:support@social27.com\\\">点击这里</a>,人工客服将尽快为您提供协助。\",\n ru: \"К сожалению, мы не смогли ответить на ваш вопрос. Однако наша служба поддержки с радостью вам поможет. Пожалуйста, <a href=\\\"mailto:support@social27.com\\\">нажмите здесь</a>, и наш оператор свяжется с вами как можно скорее.\"\n }\n},\n {\n Key: 'Ask anything',\n DefaultValue: 'Ask anything',\n Translations: {\n en: 'Ask anything',\n fr: 'Demandez ce que vous voulez',\n it: 'Chiedi qualsiasi cosa',\n es: 'Pregunta lo que quieras',\n de: 'Frag alles',\n 'pt-br': 'Pergunte qualquer coisa',\n ar: 'اسأل أي شيء',\n zh: '随便问',\n ru: 'Спросите что угодно',\n },\n },\n {\n Key: 'Assistant',\n DefaultValue: 'Assistant',\n Translations: {\n en: 'Assistant',\n fr: 'Assistant',\n it: 'Assistente',\n es: 'Asistente',\n de: 'Assistent',\n 'pt-br': 'Assistente',\n ar: 'مساعد',\n zh: '助手',\n ru: 'Ассистент',\n },\n },\n {\n Key: 'Your personal or company information is kept private and secure within this chat.',\n DefaultValue:\n 'Your personal or company information is kept private and secure within this chat.',\n Translations: {\n en: 'Your personal or company information is kept private and secure within this chat.',\n fr: 'Vos informations personnelles ou celles de votre entreprise sont conservées privées et sécurisées dans cette conversation.',\n it: \"Le tue informazioni personali o aziendali sono mantenute private e sicure all'interno di questa chat.\",\n es: 'Tu información personal o de la empresa se mantiene privada y segura dentro de este chat.',\n de: 'Ihre persönlichen oder geschäftlichen Informationen bleiben in diesem Chat privat und sicher.',\n 'pt-br':\n 'Suas informações pessoais ou da empresa são mantidas privadas e seguras dentro deste chat.',\n ar: 'تظل معلوماتك الشخصية أو معلومات شركتك خاصة وآمنة داخل هذه المحادثة.',\n zh: '您的个人或公司信息在此聊天中保持私密和安全。',\n ru: 'Ваша личная или корпоративная информация остается конфиденциальной и защищенной в этом чате.',\n },\n },\n {\n Key: 'Send message',\n DefaultValue: 'Send message',\n Translations: {\n en: 'Send message',\n fr: 'Envoyer un message',\n it: 'Invia messaggio',\n es: 'Enviar mensaje',\n de: 'Nachricht senden',\n 'pt-br': 'Enviar mensagem',\n ar: 'إرسال رسالة',\n zh: '发送消息',\n ru: 'Отправить сообщение',\n },\n },\n {\n Key: 'Platform GPT',\n DefaultValue: 'Platform GPT',\n Translations: {\n en: 'Platform GPT',\n fr: 'Plateforme GPT',\n it: 'Piattaforma GPT',\n es: 'Plataforma GPT',\n de: 'Plattform GPT',\n 'pt-br': 'Plataforma GPT',\n ar: 'منصة GPT',\n zh: '平台 GPT',\n ru: 'Платформа GPT',\n },\n },\n {\n Key: 'New Chat',\n DefaultValue: 'New Chat',\n Translations: {\n en: 'New Chat',\n fr: 'Nouvelle conversation',\n it: 'Nuova chat',\n es: 'Nuevo chat',\n de: 'Neuer Chat',\n 'pt-br': 'Novo chat',\n ar: 'محادثة جديدة',\n zh: '新聊天',\n ru: 'Новый чат',\n },\n },\n {\n Key: 'You',\n DefaultValue: 'You',\n Translations: {\n en: 'You',\n fr: 'Vous',\n it: 'Tu',\n es: 'Tú',\n de: 'Du',\n 'pt-br': 'Você',\n ar: 'أنت',\n zh: '您',\n ru: 'Вы',\n },\n },\n {\n Key: 'Write your message',\n DefaultValue: 'Write your message',\n Translations: {\n en: 'Write your message',\n fr: 'Écrivez votre message',\n it: 'Scrivi il tuo messaggio',\n es: 'Escribe tu mensaje',\n de: 'Schreiben Sie Ihre Nachricht',\n 'pt-br': 'Escreva sua mensagem',\n ar: 'اكتب رسالتك',\n zh: '写下您的消息',\n ru: 'Напишите ваше сообщение',\n },\n },\n {\n Key: 'Send',\n DefaultValue: 'Send',\n Translations: {\n en: 'Send',\n fr: 'Envoyer',\n it: 'Invia',\n es: 'Enviar',\n de: 'Senden',\n 'pt-br': 'Enviar',\n ar: 'إرسال',\n zh: '发送',\n ru: 'Отправить',\n },\n },\n \n {\n Key: 'Call Interface',\n DefaultValue: 'Call Interface',\n Translations: {\n en: 'Call Interface',\n fr: \"Interface d'appel\",\n it: 'Interfaccia chiamata',\n es: 'Interfaz de llamada',\n de: 'Anrufoberfläche',\n 'pt-br': 'Interface de chamada',\n ar: 'واجهة الاتصال',\n zh: '呼叫界面',\n ru: 'Интерфейс звонка',\n },\n },\n {\n Key: 'Close',\n DefaultValue: 'Close',\n Translations: {\n en: 'Close',\n fr: 'Fermer',\n it: 'Chiudi',\n es: 'Cerrar',\n de: 'Schließen',\n 'pt-br': 'Fechar',\n ar: 'إغلاق',\n zh: '关闭',\n ru: 'Закрыть',\n },\n },\n ];\n}\n","const formatHoursAndMinutes = (date: Date) => {\n let hours = date.getHours() % 12;\n const minutes = date.getMinutes();\n const amPm = date.getHours() < 12 ? 'AM' : 'PM';\n if(hours === 0) hours = 12;\n\n const formattedHours = hours < 10 ? `0${hours}` : hours;\n const formattedMinutes = minutes < 10 ? `0${minutes}` : minutes;\n\n return `${formattedHours}:${formattedMinutes} ${amPm}`;\n};\n\nexport const formatNow = (timezone?: string) => {\n const now = new Date();\n if (timezone) {\n const options: any = {\n hour12: true,\n hour: 'numeric',\n minute: 'numeric',\n timeZone: timezone,\n };\n return now.toLocaleString('en-US', options);\n }\n return formatHoursAndMinutes(now);\n};\n\nexport const formatTimeStamps = (timezone: string | undefined, timestamps: any) => {\n const date = new Date(timestamps + 'Z');\n const options: any = {\n hour12: true,\n hour: 'numeric',\n minute: 'numeric',\n };\n if (timezone && timezone.trim()) {\n options.timeZone = timezone.trim();\n }\n return date.toLocaleString('en-US', options);\n};\n","\n\nexport const prod_environment = {\n USERS_API: 'https://es-user.social27.com/api',\n BASE_URL: 'https://agent-api.hivegpt.ai',\n AGENTS_API: 'https://hive-ai.social27.com/api',\n API_KEY: '82595783-dc9c-4513-8204-709818d51be3',\n SocketUrl: 'https://notif-v2-ws.social27.com/'\n}\n\n\nexport const dev_environment = {\n USERS_API: 'https://pre-user.social27.com/api',\n BASE_URL: 'https://pre-agent-api.hivegpt.ai',\n AGENTS_API: 'https://hive-pre-ai.social27.com/api',\n API_KEY: '66d59244c50b8fb597a101t1',\n SocketUrl: 'https://notif-ws-staging.social27.com/',\n};\n\n","import { Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConversationService {\n private conversationStorageKeyPrefix = 'conversationKey_';\n private sessionStorageKeyPrefix = 'sessionKey_';\n\n private userSpecificNotification: Subject<any> = new Subject<any>();\n\n constructor() { }\n\n generateKey(): string {\n const timestamp = Math.floor(new Date().getTime() / 1000).toString(16);\n const randomHex = 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, () => {\n return Math.floor(Math.random() * 16).toString(16);\n });\n return timestamp + randomHex;\n }\n\n getKey(botId: string, resetKey: boolean = false): string {\n const storageKey = `${this.conversationStorageKeyPrefix}${botId}`;\n let value = localStorage.getItem(storageKey);\n\n if (!value || resetKey) {\n value = this.generateKey();\n localStorage.setItem(storageKey, value);\n }\n\n return value;\n }\n\n getSessionKey(sessionId: string, resetKey: boolean = false): string {\n const storageKey = `${this.sessionStorageKeyPrefix}${sessionId}`;\n let value = localStorage.getItem(storageKey);\n\n if (!value || resetKey) {\n value = this.generateKey();\n localStorage.setItem(storageKey, value);\n }\n\n return value;\n }\n\n sendValidatedUserData(message: any) {\n this.userSpecificNotification.next(message);\n }\n\n getUserSpecificNotification(): Observable<any> {\n return this.userSpecificNotification.asObservable();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Socket, SocketIoConfig } from 'ngx-socket-io';\nimport { prod_environment } from '../../environments/environment';\n\n@Injectable({\n providedIn: 'root' // This ensures the service is available across the application\n})\nexport class NotificationSocket extends Socket {\n constructor() {\n super(socketConfig);\n\n // Log connection status\n this.on('connect', () => {\n console.log('Socket connected');\n });\n\n this.on('disconnect', () => {\n console.warn('Socket disconnected');\n });\n\n this.on('connect_error', (err) => {\n console.error('Socket connection error:', err);\n });\n }\n}\n\nconst socketConfig: SocketIoConfig = {\n url: prod_environment.SocketUrl,\n options: {\n transports: ['websocket', 'polling'],\n reconnection: true,\n autoConnect: true,\n upgrade: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 5000,\n reconnectionAttempts: Infinity\n }\n};","import { Injectable } from '@angular/core';\n\nimport { Observable, Subject } from 'rxjs';\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\nimport { ConversationService } from './conversation.service';\nimport { NotificationSocket } from './NotificationSocket';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SocketService {\n public testMessage: string;\n private isCommonSocketInitialized = false;\n private isUserSpecificSocketInitialized = false;\n private isUserSpecificEventReleased = true;\n private messageQueue: any[] = [];\n private releaseInterval = 1000;\n private intervalSetup: boolean = false;\n\n constructor(\n private conversationService: ConversationService,\n private notificationSocket: NotificationSocket\n ) {\n this.startReleasingMessages();\n }\n\n isSocketInitialized(isCommon: boolean) {\n return isCommon\n ? this.isCommonSocketInitialized\n : this.isUserSpecificSocketInitialized &&\n !this.isUserSpecificEventReleased;\n }\n\n disconnectSocketConnection() {\n this.notificationSocket.disconnect();\n }\n connectSocketConnection() {\n this.notificationSocket.connect();\n }\n registerUserSpecificHiveSocket(botId: string, conversation_id: string, org_id: string) {\n const commonNotification = 'commonNotification';\n const groupId = `Hive_AI_Notifs_${botId}_${conversation_id}`;\n const groupId_org = `Hive_AI_Notifs_${org_id}`;\n\n // Remove any pre-existing listeners for commonNotification\n // this.notificationSocket.removeAllListeners(commonNotification);\n\n // Join the group again with updated botId and conversation_id\n this.notificationSocket.emit('joinData', { groupId });\n this.notificationSocket.emit('joinData', { groupId: groupId_org });\n\n // Re-register for common notifications\n this.notificationSocket.fromEvent(commonNotification).subscribe(\n (res: any) => {\n console.log('[Socket Chat] Received commonNotification', {\n hasOtherFields: !!res?.m?.OtherFields,\n messageId: res?.m?.OtherFields?.message_id,\n hasAnswer: !!res?.m?.OtherFields?.answer,\n isWorkflow: !!res?.m?.OtherFields?.workflow_id,\n raw: res,\n });\n this.conversationService.sendValidatedUserData(res);\n },\n (error) => {\n console.error('Error receiving commonNotification:', error);\n }\n );\n }\n\n private startReleasingMessages() {\n if (!this.intervalSetup) {\n setInterval(() => {\n if (this.messageQueue.length > 0) {const message = this.messageQueue.shift(); // Remove the first message from the queue\n // Handle the message here, e.g., send it to the server or process it\n console.log('Releasing message from queue:', message);\n // this.campaignService.sendValidatedUserData(message);\n }\n }, this.releaseInterval);\n this.intervalSetup = true; // Prevents multiple intervals\n }\n }\n}\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { catchError, map } from 'rxjs/operators';\n\nimport { HttpHeaders } from '@angular/common/http';\nimport { Observable, Subject, throwError } from 'rxjs';\nimport { AnyRecord } from 'dns';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BotsService {\n eventDescription = new Subject();\n bot_api = 'https://agent-api.hivegpt.ai/';\n constructor(private http: HttpClient) { }\n\n fetchSpeechAuthorizationToken(botId, apiKey, domain) {\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'hive-bot-id': botId,\n 'domain-authority': domain\n });\n\n const apiUrl = `${this.bot_api}speech/issue_token`;\n const url = `${apiUrl}`;\n return this.http.get(url, { headers }).pipe(\n map((resp: any) => {\n return resp.token;\n })\n );\n }\n\n getWorkflowsByOrgId(orgId: string): Observable<any> {\n const apiUrl = `${this.bot_api}workflows`;\n const url = `${apiUrl}?org_id=${orgId}`;\n return this.http.get(url).pipe(\n map((resp: any) => {\n return resp;\n })\n );\n }\n\n getWorkflowExecutionById(executionId: string): Observable<any> {\n const apiUrl = `${this.bot_api}workflows/execution/${executionId}`;\n return this.http.get(apiUrl).pipe(\n map((resp: any) => {\n return resp;\n })\n );\n }\n}","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/**\n * Audio analyzer for waveform visualization only.\n * Do NOT use isUserSpeaking$ for call state; speaking state must come from Daily.js.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AudioAnalyzerService {\n private audioContext: AudioContext | null = null;\n private analyserNode: AnalyserNode | null = null;\n private dataArray: Uint8Array | null = null;\n private animationFrameId: number | null = null;\n private isRunning = false;\n\n private audioLevelsSubject = new BehaviorSubject<number[]>([]);\n private isUserSpeakingSubject = new BehaviorSubject<boolean>(false);\n\n // Adaptive noise floor detection\n private noiseFloor = 0;\n private noiseFloorSamples: number[] = [];\n private readonly NOISE_FLOOR_SAMPLE_COUNT = 30;\n private readonly SPEAKING_THRESHOLD_MULTIPLIER = 2.5;\n private readonly WAVEFORM_BAR_COUNT = 40;\n\n audioLevels$: Observable<number[]> = this.audioLevelsSubject.asObservable();\n isUserSpeaking$: Observable<boolean> = this.isUserSpeakingSubject.asObservable();\n\n start(stream: MediaStream): void {\n if (this.isRunning) {\n this.stop();\n }\n\n try {\n this.audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const source = this.audioContext.createMediaStreamSource(stream);\n \n this.analyserNode = this.audioContext.createAnalyser();\n this.analyserNode.fftSize = 2048;\n this.analyserNode.smoothingTimeConstant = 0.8;\n \n const bufferLength = this.analyserNode.frequencyBinCount;\n this.dataArray = new Uint8Array(bufferLength);\n \n source.connect(this.analyserNode);\n \n this.isRunning = true;\n this.noiseFloorSamples = [];\n this.noiseFloor = 0;\n \n this.analyze();\n } catch (error) {\n console.error('Error starting audio analyzer:', error);\n this.stop();\n }\n }\n\n stop(): void {\n this.isRunning = false;\n \n if (this.animationFrameId !== null) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n\n if (this.analyserNode) {\n this.analyserNode.disconnect();\n this.analyserNode = null;\n }\n\n if (this.audioContext && this.audioContext.state !== 'closed') {\n this.audioContext.close().catch(console.error);\n this.audioContext = null;\n }\n\n this.dataArray = null;\n this.audioLevelsSubject.next([]);\n this.isUserSpeakingSubject.next(false);\n }\n\n private analyze(): void {\n if (!this.isRunning || !this.analyserNode || !this.dataArray) {\n return;\n }\n\n this.analyserNode.getByteTimeDomainData(this.dataArray);\n \n // Calculate RMS (Root Mean Square) volume\n const rms = this.calculateRMS(this.dataArray);\n \n // Learn noise floor during initial samples\n if (this.noiseFloorSamples.length < this.NOISE_FLOOR_SAMPLE_COUNT) {\n this.noiseFloorSamples.push(rms);\n if (this.noiseFloorSamples.length === this.NOISE_FLOOR_SAMPLE_COUNT) {\n // Calculate average noise floor\n const sum = this.noiseFloorSamples.reduce((a, b) => a + b, 0);\n this.noiseFloor = sum / this.NOISE_FLOOR_SAMPLE_COUNT;\n }\n } else {\n // Update noise floor adaptively (moving average)\n this.noiseFloor = this.noiseFloor * 0.99 + rms * 0.01;\n }\n\n // Detect if user is speaking\n const threshold = this.noiseFloor * this.SPEAKING_THRESHOLD_MULTIPLIER;\n const isSpeaking = rms > threshold;\n this.isUserSpeakingSubject.next(isSpeaking);\n\n // Generate waveform bars\n const bars = this.generateWaveformBars(this.dataArray);\n this.audioLevelsSubject.next(bars);\n\n this.animationFrameId = requestAnimationFrame(() => this.analyze());\n }\n\n private calculateRMS(data: Uint8Array): number {\n let sum = 0;\n for (let i = 0; i < data.length; i++) {\n const normalized = (data[i] - 128) / 128;\n sum += normalized * normalized;\n }\n return Math.sqrt(sum / data.length);\n }\n\n private generateWaveformBars(data: Uint8Array): number[] {\n const bars: number[] = [];\n const step = Math.floor(data.length / this.WAVEFORM_BAR_COUNT);\n \n for (let i = 0; i < this.WAVEFORM_BAR_COUNT; i++) {\n const index = i * step;\n const value = data[index];\n // Normalize to 0-100\n const normalized = Math.abs((value - 128) / 128) * 100;\n bars.push(Math.min(100, Math.max(0, normalized)));\n }\n \n return bars;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\n/** WebSocket message types from backend signaling. */\nexport interface WsMessageRoomCreated {\n type: 'room_created';\n room_url: string;\n}\n\nexport interface WsMessageUserTranscript {\n type: 'user_transcript';\n text: string;\n final?: boolean;\n}\n\nexport interface WsMessageBotTranscript {\n type: 'bot_transcript';\n text: string;\n}\n\nexport type WsMessage =\n | WsMessageRoomCreated\n | WsMessageUserTranscript\n | WsMessageBotTranscript;\n\nexport interface TranscriptData {\n text: string;\n final: boolean;\n}\n\n/**\n * WebSocket-only client for voice agent signaling.\n * CRITICAL: Uses native WebSocket only. NO Socket.IO, NO ngx-socket-io.\n *\n * Responsibilities:\n * - Connect to ws_url (from POST /ai/ask-voice response)\n * - Parse JSON messages (room_created, user_transcript, bot_transcript)\n * - Emit roomCreated$, userTranscript$, botTranscript$\n * - NO audio logic, NO mic logic. Audio is handled by Daily.js (WebRTC).\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class WebSocketVoiceClientService {\n private ws: WebSocket | null = null;\n private roomCreatedSubject = new Subject<string>();\n private userTranscriptSubject = new Subject<TranscriptData>();\n private botTranscriptSubject = new Subject<string>();\n\n /** Emits room_url when backend sends room_created. */\n roomCreated$: Observable<string> = this.roomCreatedSubject.asObservable();\n\n /** Emits user transcript updates. */\n userTranscript$: Observable<TranscriptData> =\n this.userTranscriptSubject.asObservable();\n\n /** Emits bot transcript updates. */\n botTranscript$: Observable<string> =\n this.botTranscriptSubject.asObservable();\n\n /** Connect to signaling WebSocket. No audio over this connection. */\n connect(wsUrl: string): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n return;\n }\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n try {\n this.ws = new WebSocket(wsUrl);\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data) as Record<string, unknown>;\n if (msg?.type === 'room_created') {\n const roomUrl = (msg.room_url ?? msg.roomUrl) as string | undefined;\n if (typeof roomUrl === 'string') {\n this.roomCreatedSubject.next(roomUrl);\n }\n } else if (msg?.type === 'user_transcript' && typeof msg.text === 'string') {\n this.userTranscriptSubject.next({\n text: msg.text,\n final: msg.final === true,\n });\n } else if (msg?.type === 'bot_transcript' && typeof msg.text === 'string') {\n this.botTranscriptSubject.next(msg.text);\n }\n } catch {\n // Ignore non-JSON or unknown messages\n }\n };\n this.ws.onerror = () => {\n this.disconnect();\n };\n this.ws.onclose = () => {\n this.ws = null;\n };\n } catch (err) {\n console.error('WebSocketVoiceClient: connect failed', err);\n this.ws = null;\n throw err;\n }\n }\n\n /** Disconnect and cleanup. */\n disconnect(): void {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /** Whether the WebSocket is open. */\n get isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport Daily from '@daily-co/daily-js';\nimport type { DailyCall, DailyParticipant } from '@daily-co/daily-js';\n\n/**\n * Daily.js WebRTC client for voice agent audio.\n * Responsibilities:\n * - Create and manage Daily CallObject\n * - Join Daily room using room_url\n * - Handle mic capture + speaker playback\n * - Bot speaking detection via AnalyserNode on remote track (instant)\n * - User speaking detection via active-speaker-change\n * - Expose speaking$ (bot speaking), userSpeaking$ (user speaking), micMuted$\n * - Expose localStream$ for waveform visualization (AudioAnalyzerService)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DailyVoiceClientService {\n private callObject: DailyCall | null = null;\n private localStream: MediaStream | null = null;\n private localSessionId: string | null = null;\n /** Explicit playback of remote (bot) audio; required in some browsers. */\n private remoteAudioElement: HTMLAudioElement | null = null;\n\n /** AnalyserNode-based remote audio monitor for instant bot speaking detection. */\n private remoteAudioContext: AudioContext | null = null;\n private remoteSpeakingRAF: number | null = null;\n\n private speakingSubject = new BehaviorSubject<boolean>(false);\n private userSpeakingSubject = new BehaviorSubject<boolean>(false);\n private micMutedSubject = new BehaviorSubject<boolean>(false);\n private localStreamSubject = new BehaviorSubject<MediaStream | null>(null);\n\n /** True when bot (remote participant) is the active speaker. */\n speaking$: Observable<boolean> = this.speakingSubject.asObservable();\n\n /** True when user (local participant) is the active speaker. */\n userSpeaking$: Observable<boolean> = this.userSpeakingSubject.asObservable();\n\n /** True when mic is muted. */\n micMuted$: Observable<boolean> = this.micMutedSubject.asObservable();\n\n /** Emits local mic stream for waveform visualization. */\n localStream$: Observable<MediaStream | null> =\n this.localStreamSubject.asObservable();\n\n constructor(private ngZone: NgZone) {}\n\n /**\n * Connect to Daily room. Acquires mic first for waveform, then joins with audio.\n * @param roomUrl Daily room URL (from room_created)\n * @param token Optional meeting token\n */\n async connect(roomUrl: string, token?: string): Promise<void> {\n if (this.callObject) {\n await this.disconnect();\n }\n\n try {\n // Get mic stream for both Daily and waveform (single capture)\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const audioTrack = stream.getAudioTracks()[0];\n if (!audioTrack) {\n stream.getTracks().forEach((t) => t.stop());\n throw new Error('No audio track');\n }\n\n this.localStream = stream;\n this.localStreamSubject.next(stream);\n\n // Create audio-only call object\n // videoSource: false = no camera, audioSource = our mic track\n const callObject = Daily.createCallObject({\n videoSource: false,\n audioSource: audioTrack,\n });\n\n this.callObject = callObject;\n\n this.setupEventHandlers(callObject);\n\n // Join room; Daily handles playback of remote (bot) audio automatically.\n // Only pass token when it's a non-empty string (Daily rejects undefined/non-string).\n const joinOptions: { url: string; token?: string } = { url: roomUrl };\n if (typeof token === 'string' && token.trim() !== '') {\n joinOptions.token = token;\n }\n await callObject.join(joinOptions);\n console.log(`[VoiceDebug] Room connected (Daily join complete) — ${new Date().toISOString()}`);\n\n const participants = callObject.participants();\n if (participants?.local) {\n this.localSessionId = participants.local.session_id;\n }\n\n // Initial mute state: Daily starts with audio on\n this.micMutedSubject.next(!callObject.localAudio());\n } catch (err) {\n this.cleanup();\n throw err;\n }\n }\n\n private setupEventHandlers(call: DailyCall): void {\n // active-speaker-change: used ONLY for user speaking detection.\n // Bot speaking is detected by our own AnalyserNode (instant, no debounce).\n call.on('active-speaker-change', (event: { activeSpeaker?: { peerId?: string } }) => {\n this.ngZone.run(() => {\n const peerId = event?.activeSpeaker?.peerId;\n if (!peerId || !this.localSessionId) {\n this.userSpeakingSubject.next(false);\n return;\n }\n const isLocal = peerId === this.localSessionId;\n this.userSpeakingSubject.next(isLocal);\n });\n });\n\n // track-started / track-stopped: set up remote audio playback + AnalyserNode monitor.\n call.on('track-started', (event: { participant?: DailyParticipant | null; type?: string; track?: MediaStreamTrack }) => {\n this.ngZone.run(() => {\n const p = event?.participant;\n const type = event?.type ?? event?.track?.kind;\n const track = event?.track;\n if (p && !p.local && type === 'audio') {\n console.log(`[VoiceDebug] Got audio track from backend (track-started) — readyState=${track?.readyState}, muted=${track?.muted} — ${new Date().toISOString()}`);\n const audioTrack = track ?? (p as { tracks?: { audio?: { track?: MediaStreamTrack } } }).tracks?.audio?.track;\n if (audioTrack && typeof audioTrack === 'object') {\n this.playRemoteTrack(audioTrack);\n this.monitorRemoteAudio(audioTrack);\n }\n }\n });\n });\n\n call.on('track-stopped', (event: { participant?: DailyParticipant | null; type?: string; track?: MediaStreamTrack }) => {\n this.ngZone.run(() => {\n const p = event?.participant;\n const type = event?.type ?? event?.track?.kind;\n if (p && !p.local && type === 'audio') {\n this.stopRemoteAudioMonitor();\n this.stopRemoteAudio();\n }\n });\n });\n\n call.on('left-meeting', () => {\n this.ngZone.run(() => this.cleanup());\n });\n\n call.on('error', (event?: { errorMsg?: string }) => {\n this.ngZone.run(() => {\n console.error('DailyVoiceClient: Daily error', event?.errorMsg ?? event);\n this.cleanup();\n });\n });\n }\n\n /**\n * Play remote (bot) audio track via a dedicated audio element.\n * Required in many browsers where Daily's internal playback does not output to speakers.\n */\n private playRemoteTrack(track: MediaStreamTrack): void {\n this.stopRemoteAudio();\n try {\n console.log(`[VoiceDebug] playRemoteTrack called — track.readyState=${track.readyState}, track.muted=${track.muted} — ${new Date().toISOString()}`);\n\n track.onunmute = () => {\n console.log(`[VoiceDebug] Remote audio track UNMUTED (audio data arriving) — ${new Date().toISOString()}`);\n };\n\n const stream = new MediaStream([track]);\n const audio = new Audio();\n audio.autoplay = true;\n audio.srcObject = stream;\n this.remoteAudioElement = audio;\n\n audio.onplaying = () => {\n console.log(`[VoiceDebug] Audio element PLAYING (browser started playback) — ${new Date().toISOString()}`);\n };\n\n let firstTimeUpdate = true;\n audio.ontimeupdate = () => {\n if (firstTimeUpdate) {\n firstTimeUpdate = false;\n console.log(`[VoiceDebug] Audio element first TIMEUPDATE (actual audio output) — ${new Date().toISOString()}`);\n }\n };\n\n const p = audio.play();\n if (p && typeof p.then === 'function') {\n p.then(() => {\n console.log(`[VoiceDebug] audio.play() resolved — ${new Date().toISOString()}`);\n }).catch((err) => {\n console.warn('DailyVoiceClient: remote audio play failed (may need user gesture)', err);\n });\n }\n } catch (err) {\n console.warn('DailyVoiceClient: failed to create remote audio element', err);\n }\n }\n\n /**\n * Monitor remote audio track energy via AnalyserNode.\n * Polls at ~60fps and flips speakingSubject based on actual audio energy.\n */\n private monitorRemoteAudio(track: MediaStreamTrack): void {\n this.stopRemoteAudioMonitor();\n try {\n const ctx = new AudioContext();\n const source = ctx.createMediaStreamSource(new MediaStream([track]));\n const analyser = ctx.createAnalyser();\n analyser.fftSize = 256;\n source.connect(analyser);\n this.remoteAudioContext = ctx;\n\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n const THRESHOLD = 5;\n const SILENCE_MS = 1500;\n let lastSoundTime = 0;\n let isSpeaking = false;\n\n const poll = () => {\n if (!this.remoteAudioContext) return;\n analyser.getByteFrequencyData(dataArray);\n\n let sum = 0;\n for (let i = 0; i < dataArray.length; i++) {\n sum += dataArray[i];\n }\n const avg = sum / dataArray.length;\n\n const now = Date.now();\n if (avg > THRESHOLD) {\n lastSoundTime = now;\n if (!isSpeaking) {\n isSpeaking = true;\n console.log(`[VoiceDebug] Bot audio energy detected (speaking=true) — avg=${avg.toFixed(1)} — ${new Date().toISOString()}`);\n this.ngZone.run(() => {\n this.userSpeakingSubject.next(false);\n this.speakingSubject.next(true);\n });\n }\n } else if (isSpeaking && now - lastSoundTime > SILENCE_MS) {\n isSpeaking = false;\n console.log(`[VoiceDebug] Bot audio silence detected (speaking=false) — ${new Date().toISOString()}`);\n this.ngZone.run(() => this.speakingSubject.next(false));\n }\n\n this.remoteSpeakingRAF = requestAnimationFrame(poll);\n };\n\n this.remoteSpeakingRAF = requestAnimationFrame(poll);\n } catch (err) {\n console.warn('DailyVoiceClient: failed to create remote audio monitor', err);\n }\n }\n\n private stopRemoteAudioMonitor(): void {\n if (this.remoteSpeakingRAF) {\n cancelAnimationFrame(this.remoteSpeakingRAF);\n this.remoteSpeakingRAF = null;\n }\n if (this.remoteAudioContext) {\n this.remoteAudioContext.close().catch(() => {});\n this.remoteAudioContext = null;\n }\n }\n\n private stopRemoteAudio(): void {\n if (this.remoteAudioElement) {\n try {\n this.remoteAudioElement.pause();\n this.remoteAudioElement.srcObject = null;\n } catch (_) {}\n this.remoteAudioElement = null;\n }\n }\n\n /** Set mic muted state. */\n setMuted(muted: boolean): void {\n if (!this.callObject) return;\n this.callObject.setLocalAudio(!muted);\n this.micMutedSubject.next(muted);\n }\n\n /** Disconnect and cleanup. */\n async disconnect(): Promise<void> {\n if (!this.callObject) {\n this.cleanup();\n return;\n }\n try {\n await this.callObject.leave();\n } catch (e) {\n // ignore\n }\n this.cleanup();\n }\n\n private cleanup(): void {\n this.stopRemoteAudioMonitor();\n this.stopRemoteAudio();\n if (this.callObject) {\n this.callObject.destroy().catch(() => {});\n this.callObject = null;\n }\n if (this.localStream) {\n this.localStream.getTracks().forEach((t) => t.stop());\n this.localStream = null;\n }\n this.localSessionId = null;\n this.speakingSubject.next(false);\n this.userSpeakingSubject.next(false);\n this.localStreamSubject.next(null);\n // Keep last micMuted state; will reset on next connect\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, combineLatest, Observable, Subject, Subscription } from 'rxjs';\nimport { filter, take, takeUntil } from 'rxjs/operators';\nimport { AudioAnalyzerService } from './audio-analyzer.service';\nimport { WebSocketVoiceClientService } from './websocket-voice-client.service';\nimport { DailyVoiceClientService } from './daily-voice-client.service';\n\nexport type CallState =\n | 'idle'\n | 'connecting'\n | 'connected'\n | 'listening'\n | 'talking'\n | 'ended';\n\nexport interface TranscriptData {\n text: string;\n final: boolean;\n}\n\n/**\n * Voice agent orchestrator. Coordinates WebSocket (signaling) and Daily.js (WebRTC audio).\n *\n * CRITICAL: This service must NEVER use Socket.IO or ngx-socket-io. Voice flow uses only:\n * - Native WebSocket (WebSocketVoiceClientService) for signaling (room_created, transcripts)\n * - Daily.js (DailyVoiceClientService) for WebRTC audio. Audio does NOT flow over WebSocket.\n *\n * - Maintains callState, statusText, duration, isMicMuted, isUserSpeaking, audioLevels\n * - Uses WebSocket for room_created and transcripts only (no audio)\n * - Uses Daily.js for all audio, mic, and real-time speaking detection\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class VoiceAgentService implements OnDestroy {\n private callStateSubject = new BehaviorSubject<CallState>('idle');\n private statusTextSubject = new BehaviorSubject<string>('');\n private durationSubject = new BehaviorSubject<string>('00:00');\n private isMicMutedSubject = new BehaviorSubject<boolean>(false);\n private isUserSpeakingSubject = new BehaviorSubject<boolean>(false);\n private audioLevelsSubject = new BehaviorSubject<number[]>([]);\n private userTranscriptSubject = new Subject<TranscriptData>();\n private botTranscriptSubject = new Subject<string>();\n\n private callStartTime = 0;\n private durationInterval: ReturnType<typeof setInterval> | null = null;\n\n private subscriptions = new Subscription();\n private destroy$ = new Subject<void>();\n\n callState$: Observable<CallState> = this.callStateSubject.asObservable();\n statusText$: Observable<string> = this.statusTextSubject.asObservable();\n duration$: Observable<string> = this.durationSubject.asObservable();\n isMicMuted$: Observable<boolean> = this.isMicMutedSubject.asObservable();\n isUserSpeaking$: Observable<boolean> = this.isUserSpeakingSubject.asObservable();\n audioLevels$: Observable<number[]> = this.audioLevelsSubject.asObservable();\n userTranscript$: Observable<TranscriptData> =\n this.userTranscriptSubject.asObservable();\n botTranscript$: Observable<string> = this.botTranscriptSubject.asObservable();\n\n constructor(\n private audioAnalyzer: AudioAnalyzerService,\n private wsClient: WebSocketVoiceClientService,\n private dailyClient: DailyVoiceClientService\n ) {\n // Waveform visualization only - do NOT use for speaking state\n this.subscriptions.add(\n this.audioAnalyzer.audioLevels$.subscribe((levels) =>\n this.audioLevelsSubject.next(levels)\n )\n );\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.subscriptions.unsubscribe();\n this.disconnect();\n }\n\n /** Reset to idle state (e.g. when modal opens so user can click Start Call). */\n resetToIdle(): void {\n if (this.callStateSubject.value === 'idle') return;\n this.stopDurationTimer();\n this.audioAnalyzer.stop();\n this.wsClient.disconnect();\n // Fire-and-forget: Daily disconnect is async; connect() will await if needed\n void this.dailyClient.disconnect();\n this.callStateSubject.next('idle');\n this.statusTextSubject.next('');\n this.durationSubject.next('0:00');\n }\n\n async connect(\n apiUrl: string,\n token: string,\n botId: string,\n conversationId: string,\n apiKey: string,\n eventToken: string,\n eventUrl: string,\n domainAuthority: string\n ): Promise<void> {\n if (this.callStateSubject.value !== 'idle') {\n console.warn('Call already in progress');\n return;\n }\n\n try {\n this.callStateSubject.next('connecting');\n this.statusTextSubject.next('Connecting...');\n\n const baseUrl = apiUrl.replace(/\\/$/, '');\n const postUrl = `${baseUrl}/ai/ask-voice`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'domain-authority': domainAuthority,\n 'eventtoken': eventToken,\n 'eventurl': eventUrl,\n 'hive-bot-id': botId,\n 'x-api-key': apiKey,\n 'ngrok-skip-browser-warning': 'true',\n };\n\n // POST to get ws_url for signaling\n const res = await fetch(postUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n bot_id: botId,\n conversation_id: conversationId,\n voice: 'alloy',\n }),\n });\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n\n const json = await res.json();\n const wsUrl = json?.rn_ws_url;\n if (!wsUrl || typeof wsUrl !== 'string') {\n throw new Error('No ws_url in response');\n }\n\n // Subscribe to room_created BEFORE connecting to avoid race\n this.wsClient.roomCreated$\n .pipe(take(1), takeUntil(this.destroy$))\n .subscribe(async (roomUrl) => {\n try {\n await this.onRoomCreated(roomUrl);\n } catch (err) {\n console.error('Daily join failed:', err);\n this.callStateSubject.next('ended');\n this.statusTextSubject.next('Connection failed');\n await this.disconnect();\n throw err;\n }\n });\n\n // Forward transcripts from WebSocket\n this.subscriptions.add(\n this.wsClient.userTranscript$\n .pipe(takeUntil(this.destroy$))\n .subscribe((t) => this.userTranscriptSubject.next(t))\n );\n this.subscriptions.add(\n this.wsClient.botTranscript$\n .pipe(takeUntil(this.destroy$))\n .subscribe((t) => this.botTranscriptSubject.next(t))\n );\n\n // Connect signaling WebSocket (no audio over WS)\n this.wsClient.connect(wsUrl);\n } catch (error) {\n console.error('Error connecting voice agent:', error);\n this.callStateSubject.next('ended');\n await this.disconnect();\n this.statusTextSubject.next('Connection failed');\n throw error;\n }\n }\n\n private async onRoomCreated(roomUrl: string): Promise<void> {\n // Connect Daily.js for WebRTC audio\n await this.dailyClient.connect(roomUrl);\n\n // Waveform: use local mic stream from Daily client\n this.dailyClient.localStream$\n .pipe(filter((s): s is MediaStream => s != null), take(1))\n .subscribe((stream) => {\n this.audioAnalyzer.start(stream);\n });\n\n this.subscriptions.add(\n this.dailyClient.userSpeaking$.subscribe((s) =>\n this.isUserSpeakingSubject.next(s)\n )\n );\n this.subscriptions.add(\n combineLatest([\n this.dailyClient.speaking$,\n this.dailyClient.userSpeaking$,\n ]).subscribe(([bot, user]) => {\n const current = this.callStateSubject.value;\n if (current === 'connecting' && !bot) {\n return;\n }\n if (current === 'connecting' && bot) {\n this.callStartTime = Date.now();\n this.startDurationTimer();\n this.callStateSubject.next('talking');\n return;\n }\n if (user) {\n this.callStateSubject.next('listening');\n } else if (bot) {\n this.callStateSubject.next('talking');\n } else if (current === 'talking' || current === 'listening') {\n this.callStateSubject.next('connected');\n }\n })\n );\n\n this.subscriptions.add(\n this.dailyClient.micMuted$.subscribe((muted) =>\n this.isMicMutedSubject.next(muted)\n )\n );\n\n this.statusTextSubject.next('Connecting...');\n }\n\n async disconnect(): Promise<void> {\n this.stopDurationTimer();\n this.audioAnalyzer.stop();\n\n // Daily first, then WebSocket\n await this.dailyClient.disconnect();\n this.wsClient.disconnect();\n\n this.callStateSubject.next('ended');\n this.statusTextSubject.next('Call Ended');\n }\n\n toggleMic(): void {\n const current = this.isMicMutedSubject.value;\n this.dailyClient.setMuted(!current);\n }\n\n private startDurationTimer(): void {\n const updateDuration = () => {\n if (this.callStartTime > 0) {\n const elapsed = Math.floor((Date.now() - this.callStartTime) / 1000);\n const minutes = Math.floor(elapsed / 60);\n const seconds = elapsed % 60;\n this.durationSubject.next(\n `${minutes}:${String(seconds).padStart(2, '0')}`\n );\n }\n };\n updateDuration();\n this.durationInterval = setInterval(updateDuration, 1000);\n }\n\n private stopDurationTimer(): void {\n if (this.durationInterval) {\n clearInterval(this.durationInterval);\n this.durationInterval = null;\n }\n }\n}\n","// import { Platform } from '@angular/cdk/platform';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { TranslationService } from '../translations/translation.service';\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Injector,\n Input,\n OnChanges,\n OnInit,\n Output,\n QueryList,\n Renderer2,\n SimpleChanges,\n ViewChild,\n ViewChildren,\n ViewContainerRef,\n} from '@angular/core';\nimport { MatDrawer } from '@angular/material/sidenav';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { of, Subscription } from 'rxjs';\nimport { catchError, switchMap, tap } from 'rxjs/operators';\nimport { formatNow, formatTimeStamps } from '../../utils/utils';\nimport {\n dev_environment,\n prod_environment,\n} from '../../../environments/environment';\nimport { ConversationService } from '../conversation.service';\nimport { Observable } from 'rxjs';\nimport { SocketService } from '../socket-service.service';\n\nimport { FormBuilder, Validators } from '@angular/forms';\nimport * as SpeechSDK from 'microsoft-cognitiveservices-speech-sdk';\nimport { BotsService } from '../bot.service';\nimport * as marked from 'marked'; // Import marked\nimport { VoiceAgentService } from '../voice-agent/services/voice-agent.service';\nimport { VoiceAgentModalComponent } from '../voice-agent/components/voice-agent-modal/voice-agent-modal.component';\nimport {\n VOICE_MODAL_CONFIG,\n VOICE_MODAL_CLOSE_CALLBACK,\n VoiceModalConfig,\n} from '../voice-agent/voice-modal-tokens';\n\nexport enum eClassificationType {\n Live = '6040dce57615f0770af14256',\n OnDemand = '6040dce57615f0770af14257',\n Breakout = '6040dce57615f0770af14258',\n}\n\n@Component({\n selector: 'hivegpt-chat-drawer-package',\n templateUrl: './chat-drawer.component.html',\n styleUrls: ['./chat-drawer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChatDrawerComponent implements OnInit, OnChanges {\n @ViewChild('chatMain') private chatMain: ElementRef;\n @ViewChild('myInput', { static: false })\n myInput!: ElementRef<HTMLTextAreaElement>; // Reference to the textarea\n @ViewChildren('closeplaygroundbutton')\n closePlaygroundButtons: QueryList<ElementRef>;\n @ViewChild('drawer') drawer!: MatDrawer;\n @ViewChild('sourcesDrawer') sourcesDrawer!: MatDrawer;\n @ViewChild('editorsDrawer') editorsDrawer!: MatDrawer;\n private bodyOverflowClass = 'body-overflow-hidden';\n isCollapsedTrue = false;\n @Input() copilotName: string = 'HiveXGPT';\n @Input() firstName!: string;\n @Input() lastName!: string;\n @Input() apiKey!: string;\n @Input() bgBubbleAi!: string;\n @Input() bgBubbleUser!: string;\n @Input() bgGradient!: string[];\n @Input() botName!: string;\n @Input() botSkills!: string;\n @Input() botId!: string;\n @Input() orgId!: string;\n @Input() closeButtonColor!: string;\n @Input() closeButtonbgColor!: string;\n @Input() credentials!: [];\n @Input() dateTimeColor!: string;\n @Input() dateTextColor!: string;\n @Input() eventId!: string;\n @Input() eventUrl!: string;\n @Input() eventToken!: string;\n @Input() workspaceToken!: string;\n @Input() s27Token!: string;\n @Input() eventName!: string;\n @Input() botIcon!: string;\n readonly displayAvatarUrl =\n 'https://www.jotform.com/uploads/mehmetkarakasli/form_files/1564593667676a8e85f23758.86945537_icon.png';\n /** User profile image URL. Falls back to initials (getUserIdInitials()) if not set. */\n @Input() userAvatarUrl?: string;\n @Input() formFieldBgColor!: string;\n @Input() formFieldTextColor!: string;\n @Input() fullView!: boolean;\n @Input() gradientColors!: string[];\n @Input() greeting!: string;\n @Input() messageTextColorAi!: string;\n @Input() messageTextColorUser!: string;\n @Input() rules!: string;\n @Input() sendButtonColor!: string;\n @Input() sendButtonTextColor!: string;\n @Input() showClose!: boolean;\n @Input() thumbsDownMessages!: string[];\n @Input() thumbsUpMessage!: string;\n /** User's selected timezone (e.g. 'America/New_York'); used for timestamps and session card times. When not set, session data or local time is used. */\n @Input() timezone?: string;\n @Input() unknownResponses!: [];\n @Input() useOpenAi!: boolean;\n @Input() userId!: string;\n @Input() isDev!: boolean;\n /** When true, chat auto-scrolls to bottom when new content is added. Default: false (no auto scroll). */\n @Input() autoScrollOnNewMessage: boolean = false;\n /** Optional API base URL (e.g. ngrok tunnel). When set, all chat/voice requests use this instead of dev/prod default. */\n @Input() baseUrl?: string;\n /** Connections list from host (e.g. from store selectConnectionsList). Each item has userId. When set, used for Connect/Request Sent/Disconnect button state. */\n @Input() connectionsList: any[] = [];\n /** Pending sent request user IDs from host (e.g. from store selectPendingConnectionsSentList). When set, used for Request Sent state. */\n @Input() pendingSentRequestUserIds: any[] = [];\n /** Whether to show Connect / Request Sent / Disconnect buttons on attendee cards (e.g. from userSettings?.isConnectionsEnabled). */\n @Input() isConnectionsEnabled: boolean = true;\n /** When true (UN/COP events): session card shows \"Session type\" label and Join/Watch buttons. When false: shows \"Meeting type\" label and single Play button (same as template2). */\n @Input() isUnEvent: boolean = false;\n\n @Input() againButtonColor!: string[];\n @Input() againButtonTextColor!: string[];\n @Output() feedbackEvent = new EventEmitter<string>();\n @Output() onCloseEvent = new EventEmitter<void>();\n @Output() openPage = new EventEmitter<any>();\n @Output() sessionActions = new EventEmitter<any>();\n /** Emitted when user clicks Join/Watch but action is not yet available (e.g. session not started). Host can show toaster with the message. */\n @Output() sessionActionBlocked = new EventEmitter<string>();\n @Output() closeBot = new EventEmitter<any>();\n @Output() connectWithUser = new EventEmitter<any>();\n /** Emitted when user clicks View profile on a speaker card (get_event_speakers). Host should open speaker detail drawer same as /events/:id/speakers. */\n @Output() viewSpeakerProfile = new EventEmitter<{ speaker: any; speakers: any[] }>();\n /** Emitted when user clicks View Booth on a sponsor/booth card (get_event_sponsors, get_event_booths). Host should navigate to events/:eventUrl/sponsors/booths/:boothUrl. */\n @Output() viewBooth = new EventEmitter<{ boothId?: string; boothUrl?: string; sponsor?: any }>();\n @Output() scheduleMeeting = new EventEmitter<string>();\n @Output() refreshToken = new EventEmitter<any>();\n @Output() openSupport = new EventEmitter<any>();\n\n autogenKey = 'Autogen_eDJTtEU-NB0RtIpzq1w';\n addToMyAgendaAction = 'add_to_my_agenda';\n myUpcomingSessionAction = 'my_upcomming_session';\n connectOrFollowAction = 'connect_or_follow';\n aiResponse: string = '';\n chatLog: any[] = [];\n decoder = new TextDecoder();\n feedbackDone: boolean = false;\n greetingMsg: string = '';\n hasBackdropValue: boolean = false;\n input: string = '';\n listenerAdded = false;\n loading: boolean = false;\n mode: string = 'over';\n quickPrompts: any[] = [];\n thumbsDownMsgIndex = 0;\n userName: string = '';\n showStartAgain: boolean = false;\n isIOSDevice: boolean = false;\n showFeedBackIconsIndex: number | null = null;\n temperature: number = 1;\n /** Speaker cache by staff id (filled via get-by-staff-ids). */\n speakers: Record<string, any> = {};\n /** Prevent duplicate speaker fetches across messages. */\n private requestedSpeakerIds = new Set<string>();\n environment: {\n USERS_API;\n BASE_URL;\n AGENTS_API;\n };\n pendingRequests: any;\n myConnections: any;\n conversationKey: string;\n conSessionKey: string = '';\n isFetchDataFor: boolean;\n is401: boolean;\n msg: any;\n chat: any;\n isWorkflowOpen: boolean;\n orgWorkflows: any;\n openWorkflowInput: boolean;\n selectedWorkflow: any;\n workflowForm: any;\n currentWorkflowActionProgress: number = 0;\n currentWorkflowAction: string = '';\n executingWorkflow: boolean;\n workflowExecutionDetails: any;\n showWorkflowExecutionDetails: any;\n currentWorkflowExecutionDetails: any;\n\n speechConfig: SpeechSDK.SpeechConfig;\n recognizer: SpeechSDK.SpeechRecognizer;\n recognizedText: string = '';\n authorizationToken: string = '';\n region: string = 'westeurope'; // Set your Azure region here\n isRecording: boolean;\n isVoiceModalOpen: boolean = false;\n private voiceModalOverlayRef: OverlayRef | null = null;\n private voiceTranscriptSubscriptions: Subscription[] = [];\n\n constructor(\n private fb: FormBuilder,\n private botService: BotsService,\n private cdr: ChangeDetectorRef,\n private http: HttpClient,\n private sanitizer: DomSanitizer,\n private elementRef: ElementRef,\n private renderer: Renderer2,\n private socketService: SocketService,\n private conversationService: ConversationService, // private platform: Platform\n private translationService: TranslationService,\n private voiceAgentService: VoiceAgentService,\n private overlay: Overlay,\n private viewContainerRef: ViewContainerRef,\n private injector: Injector,\n ) {\n this.chatMain = new ElementRef(null);\n\n // if (this.platform.IOS) {\n // this.isIOSDevice = true;\n // }\n }\n getTranslation(key: string) {\n return this.translationService.getTranslation(key);\n }\n\n /** Time shown next to \"Assistant\" when in thinking/loading state. */\n getLoadingTime(): string {\n return formatNow(this.timezone);\n }\n\n /** User initials for avatar fallback (e.g. \"JD\" from firstName + lastName). */\n getUserIdInitials(): string {\n const first = (this.firstName || '').trim();\n const last = (this.lastName || '').trim();\n if (first && last) return (first[0] + last[0]).toUpperCase();\n if (first) return first.slice(0, 2).toUpperCase();\n if (last) return last.slice(0, 2).toUpperCase();\n return 'U';\n }\n\n /** Attendee initials for card when no photo (e.g. \"Vijay Paliwal\" -> \"VP\", \"Jim\" -> \"J\"). */\n getAttendeeInitials(name: string | null | undefined): string {\n if (!name || typeof name !== 'string') return '?';\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length >= 2)\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return '?';\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Handle eventId changes to update translation service\n if (changes.eventId && changes.eventId.currentValue) {\n this.translationService.setEventId(changes.eventId.currentValue);\n }\n\n if (changes.s27Token) {\n if (changes.s27Token.currentValue != changes.s27Token.previousValue) {\n this.s27Token = changes.s27Token.currentValue;\n\n console.log('isFetchDataFor: ', this.isFetchDataFor);\n console.log('msg: ', this.msg);\n console.log('chat: ', this.chat);\n if (this.is401) {\n if (this.isFetchDataFor) {\n this.fetchDataFor(this.msg, this.chat);\n } else {\n this.fetchData(this.msg);\n }\n }\n }\n }\n\n // Do NOT call initializeSocket() here. Socket.IO is for chat only; we defer\n // until the user actually uses chat (send message or start new conversation)\n // so that voice-only usage never triggers Socket.IO (avoids v2/v3 mismatch error).\n if (\n changes.orgId &&\n changes.orgId.currentValue != changes.orgId.previousValue\n ) {\n this.chatSocketInitialized = false;\n }\n if (changes.baseUrl && this.environment) {\n this.applyBaseUrlOverride();\n }\n }\n\n /** When baseUrl input is set, override environment.BASE_URL so all chat/voice services use it (supports ngrok etc.). */\n private applyBaseUrlOverride(): void {\n const defaultEnv = this.isDev ? dev_environment : prod_environment;\n if (this.baseUrl && typeof this.baseUrl === 'string') {\n const url = this.baseUrl.trim().replace(/\\/+$/, '');\n if (url) {\n this.environment = { ...defaultEnv, BASE_URL: url };\n return;\n }\n }\n this.environment = defaultEnv;\n }\n\n domainAuthorityValue: any = 'prod-lite';\n\n ngOnInit(): void {\n // Set the eventId in translation service to get the correct language from localStorage\n if (this.eventId) {\n this.translationService.setEventId(this.eventId);\n }\n\n this.applyBaseUrlOverride();\n\n const domain = window.location.hostname;\n\n // Determine the header value based on the domain\n\n if (domain.includes('pre-app.social27.com')) {\n this.domainAuthorityValue = 'pre-prod-lite';\n } else if (domain.includes('app.social27.com')) {\n this.domainAuthorityValue = 'prod-lite';\n } else if (domain.includes('hivegpt.io')) {\n this.domainAuthorityValue = 'hivegpt';\n }\n\n // this.fetchMyConnections().subscribe();\n // this.fetchPendingRequests().subscribe();\n\n this.changeTemperature(this.temperature);\n this.fetchBotConfig().subscribe(\n (res) => {\n this.cdr.markForCheck();\n\n this.fetchChatHistory().subscribe(\n (response) => {\n this.loading = false;\n this.mapChatHistory(response);\n this.cdr.markForCheck();\n },\n (err) => {\n console.error('Error fetching chat history:', err);\n },\n );\n },\n (err) => {\n console.error('Error fetching chat history:', err);\n },\n );\n // this.fetchAgents();\n // this.fetchEditorContent();\n this.cdr.markForCheck();\n // this.initializeSocket();\n this.botService\n .fetchSpeechAuthorizationToken(\n this.botId,\n this.apiKey,\n this.domainAuthorityValue,\n )\n .subscribe((token) => {\n this.authorizationToken = token;\n this.initializeSpeechRecognizer(token);\n });\n }\n\n private eventSubscription: Subscription;\n /** True after Socket has been initialized for chat (avoids connecting on voice-only usage). */\n private chatSocketInitialized = false;\n\n /**\n * Call before chat actions so Socket.IO is used only for chat, not for voice.\n * Voice agent uses native WebSocket + Daily.js only; Socket.IO must not run during voice flow.\n */\n private ensureChatSocket(): void {\n if (this.chatSocketInitialized || !this.orgId) return;\n this.chatSocketInitialized = true;\n this.initializeSocket();\n }\n\n initializeSocket() {\n try {\n this.socketService.disconnectSocketConnection();\n } catch (error) {}\n setTimeout(() => {\n this.socketService.connectSocketConnection();\n setTimeout(() => {\n console.log('YES INIT');\n const conversation_id = this.conversationService.getKey(this.botId);\n\n this.socketService.registerUserSpecificHiveSocket(\n this.botId,\n conversation_id,\n this.orgId,\n );\n setTimeout(() => {\n this.listenSockets();\n }, 300);\n }, 200);\n }, 300);\n }\n\n subscriptionNew: any;\n socketData: any;\n\n /** Initial number of session/attendee cards shown before \"Show X more\". */\n readonly SESSION_CARDS_INITIAL = 6;\n readonly ATTENDEE_CARDS_INITIAL = 9;\n readonly SPEAKER_CARDS_INITIAL = 9;\n readonly SPONSOR_CARDS_INITIAL = 9;\n readonly BOOTH_REP_CARDS_INITIAL = 9;\n /** Message id -> true when user expanded \"Show more\" for sessions/attendees. */\n expandedSessionCardIds: Record<string, boolean> = {};\n expandedAttendeeCardIds: Record<string, boolean> = {};\n expandedSpeakerCardIds: Record<string, boolean> = {};\n expandedSponsorCardIds: Record<string, boolean> = {};\n expandedBoothRepCardIds: Record<string, boolean> = {};\n /** key: `${messageId}:${attendeeId}` -> true when description expanded */\n expandedAttendeeDescriptionIds: Record<string, boolean> = {};\n /** key: `${messageId}:${attendeeId}` -> true when video is playing */\n attendeeVideoPlayingIds: Record<string, boolean> = {};\n /** key: `${messageId}:${attendeeId}` -> true when video is muted (default true) */\n attendeeVideoMutedIds: Record<string, boolean> = {};\n\n /** Strip HTML tags to plain text (e.g. for speaker/attendee description from API). */\n stripHtml(html: string): string {\n if (!html || typeof html !== 'string') return '';\n const doc = new DOMParser().parseFromString(html, 'text/html');\n const text = doc.body?.textContent ?? '';\n return text.replace(/\\s+/g, ' ').trim();\n }\n\n getAttendeeDescription(attendee: any): string {\n const raw =\n attendee?.description ?? attendee?.interests ?? attendee?.jobTitle ?? '';\n const str = typeof raw === 'string' ? raw.trim() : String(raw ?? '').trim();\n // If it looks like HTML, strip tags so card shows plain text\n if (str && /<[a-z][\\s\\S]*>/i.test(str)) return this.stripHtml(str);\n return str;\n }\n\n shouldShowAttendeeReadMore(attendee: any): boolean {\n // heuristic: only show toggle for reasonably long text\n return this.getAttendeeDescription(attendee).length > 90;\n }\n\n private getAttendeeDescKey(chat: any, attendee: any): string | null {\n const msgId = chat?._id;\n const attendeeId = attendee?.id ?? attendee?._id ?? attendee?.userId;\n if (!msgId || !attendeeId) return null;\n return `${msgId}:${attendeeId}`;\n }\n\n isAttendeeDescriptionExpanded(chat: any, attendee: any): boolean {\n const key = this.getAttendeeDescKey(chat, attendee);\n if (!key) return false;\n return !!this.expandedAttendeeDescriptionIds[key];\n }\n\n toggleAttendeeDescription(chat: any, attendee: any, ev?: Event): void {\n ev?.stopPropagation?.();\n const key = this.getAttendeeDescKey(chat, attendee);\n if (!key) return;\n const next = !this.expandedAttendeeDescriptionIds[key];\n this.expandedAttendeeDescriptionIds = {\n ...this.expandedAttendeeDescriptionIds,\n [key]: next,\n };\n this.cdr.markForCheck();\n }\n\n getAttendeeVideoUrl(attendee: any): string {\n const url = attendee?.userVideosModel?.url;\n return typeof url === 'string' ? url.trim() : '';\n }\n\n getAttendeeVideoPoster(attendee: any): string {\n const poster = attendee?.userVideosModel?.thumbnail;\n return typeof poster === 'string' ? poster.trim() : '';\n }\n\n private getAttendeeMediaKey(chat: any, attendee: any): string | null {\n const msgId = chat?._id;\n const attendeeId = attendee?.id ?? attendee?._id ?? attendee?.userId;\n if (!msgId || !attendeeId) return null;\n return `${msgId}:${attendeeId}`;\n }\n\n isAttendeeVideoMuted(chat: any, attendee: any): boolean {\n const key = this.getAttendeeMediaKey(chat, attendee);\n if (!key) return true;\n // default true (muted) unless explicitly set to false\n return this.attendeeVideoMutedIds[key] !== false;\n }\n\n isAttendeeVideoPlaying(chat: any, attendee: any): boolean {\n const key = this.getAttendeeMediaKey(chat, attendee);\n if (!key) return false;\n return !!this.attendeeVideoPlayingIds[key];\n }\n\n toggleAttendeeVideoMute(\n chat: any,\n attendee: any,\n videoEl?: HTMLVideoElement | null,\n ev?: Event,\n ): void {\n ev?.stopPropagation?.();\n const key = this.getAttendeeMediaKey(chat, attendee);\n if (!key) return;\n const next = !this.isAttendeeVideoMuted(chat, attendee);\n this.attendeeVideoMutedIds = { ...this.attendeeVideoMutedIds, [key]: next };\n if (videoEl) {\n videoEl.muted = next;\n // Some browsers require volume to be >0 when unmuting\n if (!next && (videoEl.volume == null || videoEl.volume === 0)) {\n videoEl.volume = 1;\n }\n }\n this.cdr.markForCheck();\n }\n\n toggleAttendeeVideoPlay(\n chat: any,\n attendee: any,\n videoEl?: HTMLVideoElement | null,\n ev?: Event,\n ): void {\n ev?.stopPropagation?.();\n const key = this.getAttendeeMediaKey(chat, attendee);\n if (!key) return;\n const next = !this.isAttendeeVideoPlaying(chat, attendee);\n this.attendeeVideoPlayingIds = {\n ...this.attendeeVideoPlayingIds,\n [key]: next,\n };\n if (videoEl) {\n try {\n if (next) {\n const p = videoEl.play();\n if (p && typeof (p as any).catch === 'function') {\n (p as any).catch(() => {\n // If play fails, reflect paused state\n this.attendeeVideoPlayingIds = {\n ...this.attendeeVideoPlayingIds,\n [key]: false,\n };\n this.cdr.markForCheck();\n });\n }\n } else {\n videoEl.pause();\n }\n } catch {\n // ignore\n }\n }\n this.cdr.markForCheck();\n }\n\n onAttendeeVideoPlayState(chat: any, attendee: any, isPlaying: boolean): void {\n const key = this.getAttendeeMediaKey(chat, attendee);\n if (!key) return;\n if (this.attendeeVideoPlayingIds[key] === isPlaying) return;\n this.attendeeVideoPlayingIds = {\n ...this.attendeeVideoPlayingIds,\n [key]: isPlaying,\n };\n this.cdr.markForCheck();\n }\n\n /**\n * Format session date/time for display.\n * @param dateTimeRange Session start/end (object with start/end or string with \"Start: ... End: ...\")\n * @param displayTimeZone Optional user-selected timezone (e.g. 'America/New_York'); when set, times are shown in this zone.\n */\n formatSessionWhen(\n dateTimeRange: string | { start?: string; end?: string } | null,\n displayTimeZone?: string,\n ): string {\n const localeOpts = displayTimeZone ? { timeZone: displayTimeZone } : {};\n if (!dateTimeRange) return '';\n if (\n typeof dateTimeRange === 'object' &&\n dateTimeRange?.start &&\n dateTimeRange?.end\n ) {\n try {\n const startDt = new Date(dateTimeRange.start);\n const endDt = new Date(dateTimeRange.end);\n const dateFormatted = startDt.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n ...localeOpts,\n });\n const startTime = startDt.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n ...localeOpts,\n });\n const endTime = endDt.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n ...localeOpts,\n });\n return `${dateFormatted} | ${startTime} - ${endTime}`;\n } catch {\n return '';\n }\n }\n if (typeof dateTimeRange !== 'string') return '';\n const startMatch = dateTimeRange.match(\n /Start:\\s*(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})/,\n );\n const endMatch = dateTimeRange.match(\n /End:\\s*(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})/,\n );\n if (!startMatch || !endMatch) return dateTimeRange;\n try {\n const startStr = startMatch[1];\n const endStr = endMatch[1];\n const startDt = new Date(startStr.replace(' ', 'T') + 'Z');\n const endDt = new Date(endStr.replace(' ', 'T') + 'Z');\n const dateFormatted = startDt.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n ...localeOpts,\n });\n const startTimeShort = startDt.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n ...localeOpts,\n });\n const endTimeShort = endDt.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n ...localeOpts,\n });\n return `${dateFormatted} | ${startTimeShort} - ${endTimeShort}`;\n } catch {\n return dateTimeRange;\n }\n }\n\n /**\n * Get date badge (day + month) for session card from dateTimeRange.\n * Handles dateTimeRange as string (\"Start: 2026-02-20 01:05:00, End: ...\") or object { start, end }.\n * Uses displayTimeZone only when it is a valid IANA identifier; otherwise formats in local time.\n */\n getSessionDateBadge(\n dateTimeRange: string | { start?: string; end?: string } | null,\n displayTimeZone?: string,\n ): { day: string; month: string } {\n if (!dateTimeRange) return { day: '', month: '' };\n try {\n let startDt: Date | null = null;\n if (typeof dateTimeRange === 'object' && dateTimeRange?.start) {\n startDt = new Date(dateTimeRange.start);\n } else if (typeof dateTimeRange === 'string') {\n const startMatch = dateTimeRange.match(\n /Start:\\s*(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})/,\n );\n if (startMatch)\n startDt = new Date(startMatch[1].replace(' ', 'T') + 'Z');\n }\n if (!startDt || isNaN(startDt.getTime())) return { day: '', month: '' };\n const localeOpts = displayTimeZone ? { timeZone: displayTimeZone } : {};\n try {\n const day = startDt.toLocaleDateString('en-US', {\n day: 'numeric',\n ...localeOpts,\n });\n const month = startDt.toLocaleDateString('en-US', {\n month: 'short',\n ...localeOpts,\n });\n return { day, month };\n } catch {\n // displayTimeZone may be non-IANA (e.g. \"(UTC-03:00) Brasilia\"); format without timeZone\n const day = startDt.toLocaleDateString('en-US', { day: 'numeric' });\n const month = startDt.toLocaleDateString('en-US', { month: 'short' });\n return { day, month };\n }\n } catch {\n return { day: '', month: '' };\n }\n }\n\n /**\n * Get time range only (e.g. \"9:00 AM - 10:30 AM\") for session card.\n * Falls back to formatting without timeZone when displayTimeZone is not a valid IANA identifier.\n */\n formatSessionTimeRange(\n dateTimeRange: string | { start?: string; end?: string } | null,\n displayTimeZone?: string,\n ): string {\n if (!dateTimeRange) return '';\n try {\n let startDt: Date | null = null;\n let endDt: Date | null = null;\n if (\n typeof dateTimeRange === 'object' &&\n dateTimeRange?.start &&\n dateTimeRange?.end\n ) {\n startDt = new Date(dateTimeRange.start);\n endDt = new Date(dateTimeRange.end);\n } else if (typeof dateTimeRange === 'string') {\n const startMatch = dateTimeRange.match(\n /Start:\\s*(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})/,\n );\n const endMatch = dateTimeRange.match(\n /End:\\s*(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})/,\n );\n if (startMatch)\n startDt = new Date(startMatch[1].replace(' ', 'T') + 'Z');\n if (endMatch) endDt = new Date(endMatch[1].replace(' ', 'T') + 'Z');\n }\n if (!startDt || isNaN(startDt.getTime())) return '';\n const localeOpts = displayTimeZone ? { timeZone: displayTimeZone } : {};\n try {\n const startTime = startDt.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n ...localeOpts,\n });\n const endTime =\n endDt && !isNaN(endDt.getTime())\n ? endDt.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n ...localeOpts,\n })\n : '';\n return endTime ? `${startTime} - ${endTime}` : startTime;\n } catch {\n const startTime = startDt.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n const endTime =\n endDt && !isNaN(endDt.getTime())\n ? endDt.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n })\n : '';\n return endTime ? `${startTime} - ${endTime}` : startTime;\n }\n } catch {\n return '';\n }\n }\n\n /**\n * IANA timezone ID -> abbreviation map (matches parent app session-layouts / timezones.enum TimeZones).\n * Used so session cards show SAST, EEST, SAWST, ESAST, etc. instead of GMT+1, GMT+2.\n */\n private static readonly TZ_ABBR_MAP: Record<string, string> = {\n 'Pacific/Kiritimati': 'LINT',\n 'Pacific/Apia': 'SST',\n 'Pacific/Tongatapu': 'TST',\n 'Etc/GMT-13': 'UTC',\n 'Pacific/Chatham': 'CHADT',\n 'Asia/Kamchatka': 'ANAT',\n 'Pacific/Fiji': 'FJT',\n 'Etc/GMT-12': 'U',\n 'Pacific/Auckland': 'NZST',\n 'Pacific/Guadalcanal': 'CPST',\n 'Asia/Sakhalin': 'SAKT',\n 'Pacific/Norfolk': 'NFT',\n 'Asia/Magadan': 'MAGT',\n 'Asia/Srednekolymsk': 'SRET',\n 'Pacific/Bougainville': 'BST',\n 'Australia/Lord_Howe': 'LHST',\n 'Asia/Vladivostok': 'VLAT',\n 'Australia/Hobart': 'AEST',\n 'Pacific/Port_Moresby': 'ChST',\n 'Australia/Sydney': 'AEST',\n 'Australia/Brisbane': 'AWST',\n 'Australia/Darwin': 'ACST',\n 'Australia/Adelaide': 'ACST',\n 'Asia/Yakutsk': 'YAKT',\n 'Asia/Seoul': 'KST',\n 'Asia/Pyongyang': 'KST',\n 'Asia/Tokyo': 'TST',\n 'Asia/Chita': 'YAKT',\n 'Australia/Eucla': 'ACWST',\n 'Asia/Ulaanbaatar': 'FST',\n 'Asia/Taipei': 'ULAT',\n 'Australia/Perth': 'AWST',\n 'Asia/Singapore': 'SNST',\n 'Asia/Irkutsk': 'IRKT',\n 'Asia/Shanghai': 'CST',\n 'Asia/Tomsk': 'MSD',\n 'Asia/Novosibirsk': 'NOVT',\n 'Asia/Krasnoyarsk': 'KRAT',\n 'Asia/Hovd': 'SAST',\n 'Asia/Barnaul': 'MSK',\n 'Asia/Bangkok': 'THA',\n 'Asia/Yangon': 'MYST',\n 'Asia/Omsk': 'OMST',\n 'Asia/Dhaka': 'BST',\n 'Asia/Almaty': 'NCAST',\n 'Asia/Kathmandu': 'NPT',\n 'Asia/Colombo': 'SLT',\n 'Asia/Kolkata': 'IST',\n 'Asia/Calcutta': 'IST',\n 'Asia/Qyzylorda': 'CAST',\n 'Asia/Karachi': 'PKT',\n 'Asia/Yekaterinburg': 'YEKT',\n 'Asia/Tashkent': 'WAST',\n 'Asia/Kabul': 'AFT',\n 'Asia/Yerevan': 'AMT',\n 'Europe/Volgograd': 'VST',\n 'Asia/Tbilisi': 'GET',\n 'Europe/Saratov': 'SLT',\n 'Indian/Mauritius': 'MUT',\n 'Europe/Samara': 'SAMT',\n 'Asia/Baku': 'AZT',\n 'Europe/Astrakhan': 'SAMT',\n 'Asia/Dubai': 'ARBST',\n 'Asia/Tehran': 'IDT',\n 'Africa/Nairobi': 'EAST',\n 'Europe/Moscow': 'MSK',\n 'Europe/Minsk': 'MSK',\n 'Asia/Riyadh': 'AST',\n 'Europe/Istanbul': 'TDT',\n 'Asia/Baghdad': 'AST',\n 'Africa/Windhoek': 'NST',\n 'Africa/Tripoli': 'LST',\n 'Africa/Khartoum': 'EAST',\n 'Europe/Kaliningrad': 'KST',\n 'Asia/Jerusalem': 'JDT',\n 'Europe/Kiev': 'EEDT',\n 'Africa/Johannesburg': 'SAST',\n 'Asia/Hebron': 'EET',\n 'Asia/Damascus': 'SDT',\n 'Europe/Chisinau': 'GDT',\n 'Africa/Cairo': 'EST',\n 'Asia/Beirut': 'MEDT',\n 'Europe/Bucharest': 'GDT',\n 'Asia/Amman': 'JST',\n 'Africa/Lagos': 'ECT',\n 'Europe/Warsaw': 'CEDT',\n 'Africa/Casablanca': 'MDT',\n 'Europe/Paris': 'CEST',\n 'Europe/Budapest': 'CEDT',\n 'Europe/Berlin': 'WEDT',\n 'Africa/Sao_Tome': 'GST',\n 'Atlantic/Reykjavik': 'GST',\n 'Europe/London': 'GDT',\n 'Etc/UTC': 'UTC',\n 'Atlantic/Azores': 'ADT',\n 'Atlantic/Cape_Verde': 'CVST',\n 'Etc/GMT+2': 'MST',\n 'America/Araguaina': 'SEST',\n 'America/Sao_Paulo': 'ESAST',\n 'America/Cayenne': 'SEST',\n 'America/Argentina/Buenos_Aires': 'AST',\n 'America/Nuuk': 'WGT',\n 'America/Montevideo': 'MST',\n 'America/Punta_Arenas': 'CLST',\n 'America/Miquelon': 'PMST',\n 'America/Bahia': 'BST',\n 'America/St_Johns': 'NST',\n 'America/Asuncion': 'PRST',\n 'America/Halifax': 'AST',\n 'America/Caracas': 'VST',\n 'America/Cuiaba': 'CBST',\n 'America/La_Paz': 'SAWST',\n 'America/Santiago': 'PSST',\n 'America/Bogota': 'SPST',\n 'America/Cancun': 'EST',\n 'America/New_York': 'ET',\n 'America/Port-au-Prince': 'EDT',\n 'America/Havana': 'EDT',\n 'America/Indiana/Indianapolis': 'EST',\n 'America/Grand_Turk': 'EST',\n 'America/Guatemala': 'CAST',\n 'America/Chicago': 'CT',\n 'Pacific/Easter': 'EAST',\n 'America/Mexico_City': 'CST',\n 'America/Regina': 'CCST',\n 'America/Phoenix': 'MT',\n 'America/Chihuahua': 'MDT',\n 'America/Denver': 'MT',\n 'America/Whitehorse': 'YST',\n 'America/Tijuana': 'PST',\n 'Etc/GMT+8': 'UTC-08',\n 'America/Los_Angeles': 'PT',\n 'America/Anchorage': 'AK',\n 'Etc/GMT+9': 'UTC-09',\n 'Pacific/Marquesas': 'MST',\n 'America/Adak': 'HST',\n 'Pacific/Honolulu': 'HAST',\n 'Etc/GMT+11': 'UTC-11',\n 'Etc/GMT+12': 'BIT',\n };\n\n /**\n * Windows-style \"(UTC±HH:MM) Place\" -> short name (IST, BRT, etc.) so we show \"IST\" not \"((UTC+05:30) India)\".\n */\n private static readonly WINDOWS_TZ_ABBR_MAP: Record<string, string> = {\n '(UTC-03:00) Brasilia': 'BRT',\n '(UTC-03:00) Buenos Aires': 'ART',\n '(UTC+05:30) India': 'IST',\n '(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi': 'IST',\n '(UTC+00:00) Dublin, Edinburgh, London': 'GMT',\n '(UTC+00:00) Monrovia, Reykjavik': 'GMT',\n '(UTC+01:00) Amsterdam, Berlin, Rome, Stockholm': 'CET',\n '(UTC+01:00) Brussels, Copenhagen, Madrid, Paris': 'CET',\n '(UTC+02:00) Athens, Istanbul, Minsk': 'EET',\n '(UTC+02:00) Cairo': 'EET',\n '(UTC+02:00) Jerusalem': 'IST',\n '(UTC+03:00) Moscow, St. Petersburg': 'MSK',\n '(UTC+03:00) Nairobi': 'EAT',\n '(UTC+04:00) Dubai': 'GST',\n '(UTC+05:00) Islamabad, Karachi': 'PKT',\n '(UTC+05:45) Kathmandu': 'NPT',\n '(UTC+06:00) Dhaka': 'BST',\n '(UTC+06:30) Yangon (Rangoon)': 'MMT',\n '(UTC+07:00) Bangkok, Hanoi, Jakarta': 'ICT',\n '(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi': 'CST',\n '(UTC+08:00) Kuala Lumpur, Singapore': 'SGT',\n '(UTC+09:00) Osaka, Sapporo, Tokyo': 'JST',\n '(UTC+09:30) Adelaide': 'ACST',\n '(UTC+10:00) Brisbane': 'AEST',\n '(UTC+10:00) Canberra, Melbourne, Sydney': 'AEST',\n '(UTC+12:00) Auckland, Wellington': 'NZST',\n '(UTC-05:00) Eastern Time (US & Canada)': 'ET',\n '(UTC-06:00) Central Time (US & Canada)': 'CT',\n '(UTC-07:00) Mountain Time (US & Canada)': 'MT',\n '(UTC-08:00) Pacific Time (US & Canada)': 'PT',\n };\n\n /**\n * Get timezone abbreviation (e.g. IST, BRT, SAST) for display after the time.\n * Uses IANA map and Windows-style map so we show \"BRT\" / \"IST\" instead of \"((UTC-03:00) Brasilia)\".\n * Only consults Windows map when input looks like \"(UTC...)\" so existing IANA/Intl behavior is unchanged.\n */\n getTimezoneAbbreviation(tz: string): string {\n if (!tz || !String(tz).trim()) return '';\n const tzId = String(tz).trim();\n if (tzId.startsWith('(UTC') || tzId.startsWith('(utc')) {\n const winMap = (this.constructor as typeof ChatDrawerComponent)\n .WINDOWS_TZ_ABBR_MAP;\n const winKey = Object.keys(winMap).find(\n (k) => k.toLowerCase() === tzId.toLowerCase(),\n );\n if (winKey) return winMap[winKey];\n }\n const map = (this.constructor as typeof ChatDrawerComponent).TZ_ABBR_MAP;\n let mapped = map[tzId];\n if (!mapped) {\n const keyLower = tzId.toLowerCase();\n const entry = Object.entries(map).find(\n ([k]) => k.toLowerCase() === keyLower,\n );\n if (entry) mapped = entry[1];\n }\n if (mapped) return mapped;\n try {\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: tzId,\n timeZoneName: 'short',\n });\n const parts = formatter.formatToParts(new Date());\n const tzPart = parts.find((p) => p.type === 'timeZoneName');\n const value = (tzPart?.value ?? '').trim();\n if (value && /^GMT[+-]\\d/.test(value)) return '';\n return value;\n } catch {\n return '';\n }\n }\n\n getStatusTextFromSessionRoles(sessionRoles: any): string {\n if (!Array.isArray(sessionRoles) || sessionRoles.length === 0) {\n return (\n this.getTranslation('You can join this meeting') ||\n 'You can join this meeting'\n );\n }\n const first = sessionRoles[0];\n if (typeof first === 'string') {\n return String(first)\n .replace(/^\\s*-\\s*/, '')\n .trim();\n }\n if (first && typeof first === 'object' && (first as any).description) {\n return String((first as any).description).trim();\n }\n return (\n this.getTranslation('You can join this meeting') ||\n 'You can join this meeting'\n );\n }\n\n mapSessionsToCardData(sessions: any[]): any[] {\n if (!Array.isArray(sessions)) return [];\n const userTimezone =\n this.timezone && String(this.timezone).trim()\n ? String(this.timezone).trim()\n : undefined;\n return sessions.map((s: any) => {\n // Support both dateTimeRange (string) and actualDateTimeRange (object with start/end)\n const whenRaw = s.dateTimeRange ?? s.actualDateTimeRange ?? '';\n const whenFormatted = this.formatSessionWhen(whenRaw, userTimezone);\n // Only set statusText when session has join/watch roles (so we don't show \"You can join this meeting\" when there are no buttons)\n const hasJoinWatchRole =\n Array.isArray(s.sessionRoles) &&\n s.sessionRoles.some((r: any) => {\n const name =\n r && typeof r === 'object' && r.sessionRoleName\n ? String(r.sessionRoleName).trim().toLowerCase()\n : String(r ?? '')\n .trim()\n .toLowerCase();\n return name === 'join' || name === 'watch';\n });\n const statusText = hasJoinWatchRole\n ? this.getStatusTextFromSessionRoles(s.sessionRoles)\n : '';\n const sessionTimeZone =\n s.timeZone != null\n ? typeof s.timeZone === 'object'\n ? (s.timeZone.id ?? s.timeZone.name ?? '')\n : String(s.timeZone)\n : '';\n // Show user's selected timezone when set, otherwise session's timezone from data\n const displayTimeZone = (userTimezone || sessionTimeZone || '').trim();\n const tzAbbr = displayTimeZone\n ? this.getTimezoneAbbreviation(displayTimeZone)\n : '';\n const whenWithTz =\n whenFormatted || (typeof whenRaw === 'object' ? '' : String(whenRaw));\n const whenDisplay = tzAbbr\n ? `${whenWithTz} (${tzAbbr})`.trim()\n : whenWithTz;\n const dateBadge = this.getSessionDateBadge(whenRaw, displayTimeZone);\n let timeRange = this.formatSessionTimeRange(whenRaw, displayTimeZone);\n const description = String(s.description ?? s.abstract ?? '').trim();\n const meetingType = String(\n s.sessionType ?? s.type ?? s.meetingType ?? '',\n ).trim();\n const sessionTypeLabel = this.isUnEvent\n ? this.getTranslation('Meeting type') || 'Meeting type'\n : this.getTranslation('Session type') || 'Session type';\n // Same logic as before design update: prefer tz abbreviation (e.g. EST), else show display timezone string (e.g. \"(UTC-03:00) Brasilia)\")\n const timeZoneDisplay = tzAbbr || displayTimeZone || '';\n // When API returns \"Start: N/A, End: N/A, TimeZone: ...\" (string), show at least timezone\n if (!timeRange && displayTimeZone) {\n timeRange = this.getTranslation('Not specified') || 'Not specified';\n }\n // Time range with timezone in parentheses when available (same as old whenDisplay format)\n const timeRangeWithTz = timeZoneDisplay\n ? `${timeRange} (${timeZoneDisplay})`.trim()\n : timeRange;\n return {\n title: String(s.title ?? '').trim(),\n organizer: String(s.organizer ?? '').trim(),\n room: String(s.roomName ?? '').trim(),\n when: whenDisplay,\n timeRange,\n timeRangeWithTz: timeRange ? timeRangeWithTz : timeZoneDisplay || '',\n dateDay: dateBadge.day,\n dateMonth: dateBadge.month,\n description,\n timeZone: displayTimeZone,\n timeZoneDisplay,\n meetingType,\n sessionTypeLabel,\n statusText,\n session: s,\n };\n });\n }\n\n private collectSpeakerIdsFromSessionCards(sessionCards: any[]): string[] {\n if (!Array.isArray(sessionCards)) return [];\n const ids: string[] = [];\n for (const card of sessionCards) {\n const raw = card?.session?.speakers;\n if (Array.isArray(raw)) {\n for (const id of raw) {\n const sid = String(id ?? '').trim();\n if (sid) ids.push(sid);\n }\n }\n }\n return Array.from(new Set(ids));\n }\n\n private attachSpeakersToSessionCards(sessionCards: any[]): void {\n if (!Array.isArray(sessionCards)) return;\n for (const card of sessionCards) {\n const speakerIds: string[] = Array.isArray(card?.session?.speakers)\n ? card.session.speakers\n .map((x: any) => String(x ?? '').trim())\n .filter(Boolean)\n : [];\n const speakersList = speakerIds\n .map((id) => this.speakers[id])\n .filter(Boolean);\n card.speakersList = speakersList;\n if (card?.session && typeof card.session === 'object') {\n card.session.speakersList = speakersList;\n }\n }\n }\n\n private ensureSpeakersForSessionCards(sessionCards: any[]): void {\n const ids = this.collectSpeakerIdsFromSessionCards(sessionCards);\n if (ids.length === 0) return;\n\n const missing = ids.filter(\n (id) => !this.speakers[id] && !this.requestedSpeakerIds.has(id),\n );\n if (missing.length === 0) {\n this.attachSpeakersToSessionCards(sessionCards);\n return;\n }\n missing.forEach((id) => this.requestedSpeakerIds.add(id));\n this.getSpeakersByStaffIds(missing).subscribe({\n next: () => {\n this.attachSpeakersToSessionCards(sessionCards);\n this.cdr.markForCheck();\n },\n error: () => {\n // Best effort: still attach what we have cached\n this.attachSpeakersToSessionCards(sessionCards);\n this.cdr.markForCheck();\n },\n });\n }\n\n getSpeakerPhotoUrl(speaker: any): string | null {\n if (!speaker) return null;\n const candidates = [\n speaker.photo,\n speaker.photoPath,\n speaker.avatarUrl,\n speaker.profileImageUrl,\n speaker.profileImage,\n speaker.profilePicture,\n speaker.imageUrl,\n speaker.image,\n ];\n const url = candidates.find((v) => v != null && String(v).trim() !== '');\n return url ? String(url).trim() : null;\n }\n\n hasSessionCardSpeakers(sessionCard: any): boolean {\n const list =\n sessionCard?.speakersList || sessionCard?.session?.speakersList;\n if (Array.isArray(list) && list.length > 0) return true;\n const ids = sessionCard?.session?.speakers;\n return Array.isArray(ids) && ids.length > 0;\n }\n\n getSpeakerDisplayName(speaker: any): string {\n if (!speaker) return '';\n if (speaker.name != null && String(speaker.name).trim() !== '')\n return String(speaker.name).trim();\n const first =\n speaker.firstName != null ? String(speaker.firstName).trim() : '';\n const last =\n speaker.lastName != null ? String(speaker.lastName).trim() : '';\n return `${first} ${last}`.trim();\n }\n\n getSpeakerInitials(speaker: any): string {\n const name = this.getSpeakerDisplayName(speaker);\n if (name) return this.getAttendeeInitials(name);\n const id = speaker?.id != null ? String(speaker.id) : '';\n return id ? id.slice(0, 2).toUpperCase() : '?';\n }\n\n mapAttendeesToCardData(attendees: any[]): any[] {\n if (!Array.isArray(attendees)) return [];\n return attendees.map((a: any) => ({\n name: String(a.name ?? '').trim(),\n company:\n a.company != null && String(a.company).trim() !== ''\n ? String(a.company).trim()\n : null,\n jobTitle:\n a.jobTitle != null && String(a.jobTitle).trim() !== ''\n ? String(a.jobTitle).trim()\n : null,\n photo:\n a.photo != null && String(a.photo).trim() !== ''\n ? String(a.photo).trim()\n : null,\n id: a.id ?? a.userId ?? a._id ?? a.attendeeId ?? undefined,\n interests:\n a.interests != null && String(a.interests).trim() !== ''\n ? String(a.interests).trim()\n : null,\n description:\n a.description != null && String(a.description).trim() !== ''\n ? String(a.description).trim()\n : null,\n userVideosModel: a.userVideosModel\n ? {\n url:\n a.userVideosModel?.url != null &&\n String(a.userVideosModel.url).trim() !== ''\n ? String(a.userVideosModel.url).trim()\n : null,\n thumbnail:\n a.userVideosModel?.thumbnail != null &&\n String(a.userVideosModel.thumbnail).trim() !== ''\n ? String(a.userVideosModel.thumbnail).trim()\n : null,\n }\n : null,\n }));\n }\n\n mapSpeakersToCardData(speakers: any[]): any[] {\n if (!Array.isArray(speakers)) return [];\n return speakers.map((s: any) => {\n const rawDesc =\n s.description != null && String(s.description).trim() !== ''\n ? String(s.description).trim()\n : null;\n const description = rawDesc\n ? /<[a-z][\\s\\S]*>/i.test(rawDesc)\n ? this.stripHtml(rawDesc)\n : rawDesc\n : null;\n const rawTitle = s.title ?? s.jobTitle;\n const jobTitle =\n rawTitle != null && String(rawTitle).trim() !== ''\n ? String(rawTitle).trim()\n : null;\n return {\n name: this.getSpeakerDisplayName(s),\n company:\n s.company != null && String(s.company).trim() !== ''\n ? String(s.company).trim()\n : null,\n jobTitle,\n photo: this.getSpeakerPhotoUrl(s),\n id: s.id ?? s.userId ?? s._id ?? s.speakerId ?? undefined,\n interests:\n s.interests != null && String(s.interests).trim() !== ''\n ? String(s.interests).trim()\n : null,\n description,\n userVideosModel: s.userVideosModel\n ? {\n url:\n s.userVideosModel?.url != null &&\n String(s.userVideosModel.url).trim() !== ''\n ? String(s.userVideosModel.url).trim()\n : null,\n thumbnail:\n s.userVideosModel?.thumbnail != null &&\n String(s.userVideosModel.thumbnail).trim() !== ''\n ? String(s.userVideosModel.thumbnail).trim()\n : null,\n }\n : null,\n };\n });\n }\n\n mapSponsorsToCardData(sponsors: any[]): any[] {\n if (!Array.isArray(sponsors)) return [];\n return sponsors.map((s: any) => {\n const rawDesc =\n s.boothDescription != null && String(s.boothDescription).trim() !== ''\n ? String(s.boothDescription).trim()\n : null;\n const description = rawDesc\n ? /<[a-z][\\s\\S]*>/i.test(rawDesc)\n ? this.stripHtml(rawDesc)\n : rawDesc\n : null;\n const urlSlug = s.url ?? s.boothUrl ?? (s.boothID != null ? String(s.boothID) : null) ?? (s.boothId != null ? String(s.boothId) : null);\n const logoUrl =\n s.logoUrl != null && String(s.logoUrl).trim() !== ''\n ? String(s.logoUrl).trim()\n : null;\n return {\n name: s.name != null ? String(s.name).trim() : '',\n website: s.website != null && String(s.website).trim() !== '' ? String(s.website).trim() : null,\n category: s.category != null ? String(s.category).trim() : null,\n boothID: s.boothID ?? s.boothId ?? null,\n boothTitle: s.boothTitle != null ? String(s.boothTitle).trim() : '',\n description: description ?? null,\n /** Booth URL slug for routing to detail page (e.g. events/:eventUrl/sponsors/booths/:url). */\n url: urlSlug != null ? String(urlSlug).trim() : null,\n logoUrl,\n };\n });\n }\n\n /**\n * Map get_event_booths results into the same shape used by sponsor cards.\n */\n mapBoothsToCardData(booths: any[]): any[] {\n if (!Array.isArray(booths)) return [];\n return booths.map((b: any) => {\n const rawDesc =\n b.description != null && String(b.description).trim() !== ''\n ? String(b.description).trim()\n : null;\n const description = rawDesc\n ? /<[a-z][\\s\\S]*>/i.test(rawDesc)\n ? this.stripHtml(rawDesc)\n : rawDesc\n : null;\n const urlSlug = b.url ?? b.boothUrl ?? (b.boothId != null ? String(b.boothId) : null) ?? (b.boothID != null ? String(b.boothID) : null);\n const logoUrl =\n b.logoUrl != null && String(b.logoUrl).trim() !== ''\n ? String(b.logoUrl).trim()\n : null;\n return {\n name: b.company != null ? String(b.company).trim() : '',\n website:\n b.website != null && String(b.website).trim() !== ''\n ? String(b.website).trim()\n : null,\n category: null,\n boothID: b.boothId ?? b.boothID ?? null,\n boothTitle: b.boothTitle != null ? String(b.boothTitle).trim() : '',\n description: description ?? null,\n /** Booth URL slug for routing to detail page (e.g. events/:eventUrl/sponsors/booths/:url). */\n url: urlSlug != null ? String(urlSlug).trim() : null,\n logoUrl,\n };\n });\n }\n\n /**\n * Map get_booth_representatives results into the same shape as attendee cards (for reuse of attendee design).\n */\n mapBoothRepsToCardData(representatives: any[]): any[] {\n if (!Array.isArray(representatives)) return [];\n return representatives.map((r: any) => {\n const first = r.firstName != null ? String(r.firstName).trim() : '';\n const last = r.lastName != null ? String(r.lastName).trim() : '';\n const name = [first, last].filter(Boolean).join(' ') || '';\n const userId = r.userId != null && String(r.userId).trim() !== '' ? String(r.userId).trim() : undefined;\n return {\n name,\n company:\n r.company != null && String(r.company).trim() !== ''\n ? String(r.company).trim()\n : null,\n jobTitle:\n r.jobTitle != null && String(r.jobTitle).trim() !== ''\n ? String(r.jobTitle).trim()\n : null,\n photo:\n r.photoPath != null && String(r.photoPath).trim() !== ''\n ? String(r.photoPath).trim()\n : null,\n id: userId,\n interests: null,\n description:\n r.description != null && String(r.description).trim() !== ''\n ? String(r.description).trim()\n : null,\n userVideosModel: null,\n };\n });\n }\n\n /**\n * Parse get_event_sessions_v2 plain-text content into session objects for cards.\n * Format: \"Found N sessions:\\n1. <title>\\n - Time: Start: ..., End: ..., TimeZone: ...\\n - Room: ...\\n - Type: ...\\n2. ...\"\n */\n parseSessionContentV2(content: string): any[] {\n if (!content || typeof content !== 'string') return [];\n const sessions: any[] = [];\n // Split into blocks by \"1. \", \"2. \", etc. (number + dot + space at line start)\n const blockRegex = /\\n\\d+\\.\\s+/;\n const parts = content.split(blockRegex);\n // First part may be \"Found N sessions:\" or similar; skip if it doesn't look like a session title\n for (let i = 0; i < parts.length; i++) {\n const block = parts[i].trim();\n if (!block) continue;\n const lines = block\n .split(/\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n const title = lines[0] || '';\n if (!title || /^Found\\s+\\d+\\s+sessions/i.test(title)) continue;\n let dateTimeRange = '';\n let roomName = '';\n let sessionType = '';\n let timeZone = '';\n for (let j = 1; j < lines.length; j++) {\n const line = lines[j];\n const timeMatch = line.match(/Time:\\s*(.+)/i);\n if (timeMatch) {\n dateTimeRange = timeMatch[1].trim();\n const tzMatch = dateTimeRange.match(/TimeZone:\\s*([^,\\n]+)/i);\n if (tzMatch) timeZone = tzMatch[1].trim();\n }\n const roomMatch = line.match(/Room:\\s*(.+)/i);\n if (roomMatch) {\n roomName = roomMatch[1].trim();\n }\n const typeMatch = line.match(/Type:\\s*(.+)/i);\n if (typeMatch) {\n sessionType = typeMatch[1].trim();\n }\n const tzLineMatch = line.match(/TimeZone:\\s*(.+)/i);\n if (tzLineMatch && !timeZone) timeZone = tzLineMatch[1].trim();\n }\n sessions.push({\n title,\n roomName: roomName || undefined,\n dateTimeRange: dateTimeRange || undefined,\n sessionType: sessionType || undefined,\n timeZone: timeZone || undefined,\n sessionRoles: [],\n });\n }\n return sessions;\n }\n\n getVisibleSessionCards(chat: any): any[] {\n const list = chat?.sessionCards ?? [];\n const total = list.length;\n const expanded = this.expandedSessionCardIds[chat?._id];\n const remaining = total - this.SESSION_CARDS_INITIAL;\n if (remaining > 4 && !expanded) {\n return list.slice(0, this.SESSION_CARDS_INITIAL);\n }\n return list;\n }\n\n getVisibleAttendeeCards(chat: any): any[] {\n const list = chat?.attendeeCards ?? [];\n const total = list.length;\n const expanded = this.expandedAttendeeCardIds[chat?._id];\n const remaining = total - this.ATTENDEE_CARDS_INITIAL;\n if (remaining > 4 && !expanded) {\n return list.slice(0, this.ATTENDEE_CARDS_INITIAL);\n }\n return list;\n }\n\n getVisibleSpeakerCards(chat: any): any[] {\n const list = chat?.speakerCards ?? [];\n const total = list.length;\n const expanded = this.expandedSpeakerCardIds[chat?._id];\n const remaining = total - this.SPEAKER_CARDS_INITIAL;\n if (remaining > 4 && !expanded) {\n return list.slice(0, this.SPEAKER_CARDS_INITIAL);\n }\n return list;\n }\n\n getVisibleSponsorCards(chat: any): any[] {\n const list = chat?.sponsorCards ?? [];\n const total = list.length;\n const expanded = this.expandedSponsorCardIds[chat?._id];\n const remaining = total - this.SPONSOR_CARDS_INITIAL;\n if (remaining > 4 && !expanded) {\n return list.slice(0, this.SPONSOR_CARDS_INITIAL);\n }\n return list;\n }\n\n getVisibleBoothRepCards(chat: any): any[] {\n const list = chat?.boothRepCards ?? [];\n const total = list.length;\n const expanded = this.expandedBoothRepCardIds[chat?._id];\n const remaining = total - this.BOOTH_REP_CARDS_INITIAL;\n if (remaining > 4 && !expanded) {\n return list.slice(0, this.BOOTH_REP_CARDS_INITIAL);\n }\n return list;\n }\n\n expandSessionCards(chat: any): void {\n if (chat?._id) {\n this.expandedSessionCardIds = {\n ...this.expandedSessionCardIds,\n [chat._id]: true,\n };\n this.cdr.markForCheck();\n }\n }\n\n expandAttendeeCards(chat: any): void {\n if (chat?._id) {\n this.expandedAttendeeCardIds = {\n ...this.expandedAttendeeCardIds,\n [chat._id]: true,\n };\n this.cdr.markForCheck();\n }\n }\n\n expandSpeakerCards(chat: any): void {\n if (chat?._id) {\n this.expandedSpeakerCardIds = {\n ...this.expandedSpeakerCardIds,\n [chat._id]: true,\n };\n this.cdr.markForCheck();\n }\n }\n\n expandSponsorCards(chat: any): void {\n if (chat?._id) {\n this.expandedSponsorCardIds = {\n ...this.expandedSponsorCardIds,\n [chat._id]: true,\n };\n this.cdr.markForCheck();\n }\n }\n\n expandBoothRepCards(chat: any): void {\n if (chat?._id) {\n this.expandedBoothRepCardIds = {\n ...this.expandedBoothRepCardIds,\n [chat._id]: true,\n };\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Label for session type on cards: \"Session type\" when isUnEvent, else \"Meeting type\".\n */\n getSessionTypeLabel(): string {\n return this.isUnEvent\n ? this.getTranslation('Meeting type') || 'Meeting type'\n : this.getTranslation('Session type') || 'Session type'\n }\n\n /**\n * Get Join/Watch role buttons from session.sessionRoles for session cards.\n * When isUnEvent is false, returns single \"Watch\" button (same as template2). When true, returns Join/Watch from sessionRoles.\n */\n getSessionRoleButtons(sessionCard: any): { action: string; label: string }[] {\n if (this.isUnEvent === false && sessionCard?.session) {\n return [\n {\n action: 'join',\n label: this.getTranslation('Watch') || 'Watch',\n },\n ];\n }\n const raw = sessionCard?.session?.sessionRoles;\n if (!Array.isArray(raw) || raw.length === 0) return [];\n const roles: { action: string; label: string }[] = [];\n for (const r of raw) {\n const name =\n typeof r === 'object' && r != null && r.sessionRoleName\n ? String(r.sessionRoleName).trim().toLowerCase()\n : String(r).trim().toLowerCase();\n if (name === 'join' || name === 'watch') {\n const label =\n name === 'join'\n ? this.getTranslation('Join') || 'Join'\n : this.getTranslation('Watch') || 'Watch';\n roles.push({ action: name, label });\n }\n }\n return roles;\n }\n\n /**\n * Check if session is on-demand (classificationId === eClassificationType.OnDemand).\n * When true, Join/Watch are always actionable and card uses OnDemand design.\n */\n isSessionOndemand(sessionCard: any): boolean {\n const id =\n sessionCard?.session?.classificationId ?? sessionCard?.classificationId;\n if (id == null || id === '') return false;\n return String(id) === eClassificationType.OnDemand;\n }\n\n /**\n * Whether Join/Watch action is possible (same logic as app template8).\n * Action is allowed when: on-demand session OR isButtonActivated (session has started).\n */\n canPerformSessionAction(sessionCard: any): boolean {\n if (!sessionCard?.session) return false;\n const s = sessionCard.session;\n if (this.isSessionOndemand(sessionCard)) return true;\n return !!s.isButtonActivated;\n }\n\n /**\n * Same logic as app template8: delay in minutes (scheduled start - actual start).\n * Returns undefined if either date missing; > 0 when meeting is delayed.\n */\n getMeetingDelayMinutes(sessionCard: any): number | undefined {\n const s = sessionCard?.session;\n if (!s) return undefined;\n const startDate = s.dateTimeRange?.start;\n const actualStart = s.actualDateTimeRange?.start;\n if (!startDate || !actualStart) return undefined;\n try {\n const diffMs =\n new Date(startDate).getTime() - new Date(actualStart).getTime();\n return Math.floor(diffMs / (1000 * 60));\n } catch {\n return undefined;\n }\n }\n\n /** True when meeting is delayed (same condition as template8: delay minutes > 0, not on-demand, button not activated). */\n isMeetingDelayed(sessionCard: any): boolean {\n const delay = this.getMeetingDelayMinutes(sessionCard);\n if (delay == null || delay <= 0) return false;\n if (this.isSessionOndemand(sessionCard)) return false;\n if (sessionCard?.session?.isButtonActivated) return false;\n return true;\n }\n\n onSessionCardAction(\n sessionCard: any,\n role: { action: string; label: string },\n ): void {\n if (!sessionCard?.session) return;\n if (this.isUnEvent === false) {\n this.sessionActions.emit({\n type: 'session',\n action: role.action,\n session: sessionCard.session,\n sessionCard,\n });\n return;\n }\n if (!this.canPerformSessionAction(sessionCard)) {\n const message =\n this.getTranslation('You can join/watch at the starting time') ||\n 'You can join/watch at the starting time';\n this.sessionActionBlocked.emit(message);\n return;\n }\n this.sessionActions.emit({\n type: 'session',\n action: role.action,\n session: sessionCard.session,\n sessionCard,\n });\n }\n\n listenSockets() {\n if (this.eventSubscription) {\n this.eventSubscription.unsubscribe();\n }\n console.log('Listen Socket');\n this.eventSubscription = this.conversationService\n .getUserSpecificNotification()\n .subscribe(\n (res) => {\n console.log('[Socket Chat] listenSockets received', {\n hasOtherFields: !!res?.m?.OtherFields,\n messageId: res?.m?.OtherFields?.message_id,\n hasAnswer: !!res?.m?.OtherFields?.answer,\n });\n // Check if OtherFields exists in the response\n if (res?.m?.OtherFields?.workflow_id) {\n console.log(\n '[Socket Chat] Workflow progress update',\n res?.m?.OtherFields,\n );\n const {\n percentage,\n output,\n action_name,\n current_action_name,\n workflow_execution_id,\n time_stamp,\n } = res?.m?.OtherFields;\n\n this.currentWorkflowActionProgress = percentage;\n this.currentWorkflowAction = action_name;\n\n const actionIndex = this.workflowExecutionDetails.Actions.findIndex(\n (a) => a.Name == current_action_name,\n );\n\n if (actionIndex !== -1) {\n this.workflowExecutionDetails.Actions[actionIndex]['Output'] =\n output;\n this.workflowExecutionDetails.Actions[actionIndex][\n 'InsertTimeStamp'\n ] = formatTimeStamps(this.timezone, time_stamp);\n } else {\n console.error(`Action with name ${action_name} not found`);\n }\n\n this.currentWorkflowExecutionDetails =\n this.workflowExecutionDetails;\n\n if (this.currentWorkflowActionProgress == 100) {\n this.chatLog[this.chatLog.length - 1]['WorkflowExecutionId'] =\n workflow_execution_id;\n this.isChatingWithAi = false;\n this.executingWorkflow = false;\n this.focusOnTextarea();\n }\n\n this.cdr.detectChanges();\n } else if (res?.m?.OtherFields) {\n const otherFields = res.m.OtherFields;\n const serializable = otherFields.serializable_to_return;\n\n // Session cards: event sessions tools (JSON or plain text)\n const isSessionTool =\n serializable?.tool_name === 'get_event_sessions' ||\n serializable?.tool_name === 'get_event_sessions_v2' ||\n serializable?.tool_name === 'get_sessions_by_interest' ||\n serializable?.tool_name === 'get_sessions_by_track' ||\n serializable?.tool_name === 'get_speaker_sessions' ||\n serializable?.tool_name === 'get_upcoming_sessions';\n if (isSessionTool) {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr && typeof contentStr === 'string') {\n let sessions: any[] = [];\n try {\n const parsed = JSON.parse(contentStr);\n sessions = parsed?.sessions ?? [];\n } catch (e) {\n // v2 plain text: \"Found 2 sessions:\\n1. Title\\n - Time: Start: ... End: ...\\n - Room: ...\\n - Type: ...\"\n sessions = this.parseSessionContentV2(contentStr);\n }\n const mapped = this.mapSessionsToCardData(sessions);\n this.ensureSpeakersForSessionCards(mapped);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `session_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'session_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n sessionCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n this.isChatingWithAi = false;\n this.scrollToBottom();\n pushed = true;\n }\n }\n if (pushed) {\n this.cdr.markForCheck();\n return;\n }\n // No session cards pushed: fall through to normal OtherFields handling so answer is displayed\n }\n\n // Attendee cards: tool get_event_attendees (only push when we have attendees; else fall through so answer is shown as normal AI message)\n if (serializable?.tool_name === 'get_event_attendees') {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr) {\n try {\n const parsed = JSON.parse(contentStr);\n const attendees = parsed?.attendees ?? [];\n const mapped = this.mapAttendeesToCardData(attendees);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `attendee_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'attendee_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n attendeeCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n pushed = true;\n }\n } catch (e) {\n console.error(\n '[Socket Chat] Error parsing get_event_attendees content:',\n e,\n );\n }\n }\n if (pushed) {\n this.isChatingWithAi = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n return;\n }\n /* attendees empty (e.g. totalCount: 0): fall through so answer like \"I couldn't find any attendees...\" is shown as normal AI message */\n }\n\n // Speaker cards: tool get_event_speakers (same handling as attendees; only push when we have speakers)\n if (serializable?.tool_name === 'get_event_speakers') {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr) {\n try {\n const parsed = JSON.parse(contentStr);\n const speakers = parsed?.speakers ?? parsed?.speaker ?? [];\n const mapped = this.mapSpeakersToCardData(speakers);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `speaker_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'speaker_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n speakerCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n pushed = true;\n }\n } catch (e) {\n console.error(\n '[Socket Chat] Error parsing get_event_speakers content:',\n e,\n );\n }\n }\n if (pushed) {\n this.isChatingWithAi = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n return;\n }\n /* speakers empty: fall through so answer is shown as normal AI message */\n }\n\n // Sponsor cards: tool get_event_sponsors (only push when we have sponsors)\n if (serializable?.tool_name === 'get_event_sponsors') {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr) {\n try {\n const parsed = JSON.parse(contentStr);\n const sponsors = parsed?.sponsors ?? [];\n const mapped = this.mapSponsorsToCardData(sponsors);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `sponsor_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'sponsor_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n sponsorCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n pushed = true;\n }\n } catch (e) {\n console.error(\n '[Socket Chat] Error parsing get_event_sponsors content:',\n e,\n );\n }\n }\n if (pushed) {\n this.isChatingWithAi = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n return;\n }\n }\n\n // Booth cards: tool get_event_booths (reuse sponsor card design; only push when we have booths)\n if (serializable?.tool_name === 'get_event_booths') {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr) {\n try {\n const parsed = JSON.parse(contentStr);\n const booths = parsed?.booths ?? [];\n const mapped = this.mapBoothsToCardData(booths);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `sponsor_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'sponsor_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n sponsorCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n pushed = true;\n }\n } catch (e) {\n console.error(\n '[Socket Chat] Error parsing get_event_booths content:',\n e,\n );\n }\n }\n if (pushed) {\n this.isChatingWithAi = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n return;\n }\n }\n\n // Booth representative cards: tool get_booth_representatives (same design as attendee cards)\n if (serializable?.tool_name === 'get_booth_representatives') {\n const contentStr =\n serializable?.tool_result?.messages?.[0]?.content;\n const answerText =\n otherFields.answer != null\n ? String(otherFields.answer).trim()\n : '';\n let pushed = false;\n if (contentStr) {\n try {\n const parsed = JSON.parse(contentStr);\n const representatives = parsed?.representatives ?? [];\n const mapped = this.mapBoothRepsToCardData(representatives);\n if (mapped.length > 0) {\n const msgId =\n serializable.message_id || `booth_rep_cards_${Date.now()}`;\n const cardEntry = {\n _id: msgId,\n type: 'booth_rep_cards',\n message: answerText\n ? this.processMessageForDisplay(answerText)\n : '',\n time: formatNow(this.timezone),\n boothRepCards: mapped,\n };\n const existingIdx = this.chatLog.findIndex(\n (p) => p._id === msgId,\n );\n if (existingIdx >= 0) {\n this.chatLog[existingIdx] = cardEntry;\n } else {\n this.chatLog.push(cardEntry);\n }\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n pushed = true;\n }\n } catch (e) {\n console.error(\n '[Socket Chat] Error parsing get_booth_representatives content:',\n e,\n );\n }\n }\n if (pushed) {\n this.isChatingWithAi = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n return;\n }\n }\n\n if (serializable?.tool_name === 'get_event_details') {\n this.isChatingWithAi = false;\n this.cdr.markForCheck();\n return;\n }\n\n const {\n conversation_id,\n bot_id,\n message_id,\n answer,\n web_results,\n search_results,\n graphs,\n execution_graphs,\n suggestions,\n } = otherFields;\n console.log('[Socket Chat] Processing OtherFields', {\n message_id,\n conversation_id,\n bot_id,\n hasAnswer: !!answer,\n answerLength: answer?.length,\n webResultsCount: web_results?.length ?? 0,\n searchResultsCount: search_results?.length ?? 0,\n });\n var currentChatMessage = this.chatLog.find(\n (p) => p._id == message_id,\n );\n if (!currentChatMessage) {\n console.log('[Socket Chat] New AI message from socket', {\n message_id,\n chatLogLength: this.chatLog.length,\n });\n currentChatMessage = {\n _id: message_id,\n type: 'ai',\n time: formatNow(this.timezone),\n };\n\n this.chatLog.push(currentChatMessage);\n\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n this.cdr.detectChanges();\n } else {\n console.log('[Socket Chat] Updating existing message', {\n message_id,\n });\n }\n\n // Handle the fields based on their presence\n if (search_results && Array.isArray(search_results)) {\n console.log('[Socket Chat] search_results', search_results);\n currentChatMessage.searchTerms = search_results;\n this.cdr.detectChanges();\n }\n\n if (web_results && Array.isArray(web_results)) {\n console.log(\n '[Socket Chat] web_results',\n web_results?.length,\n web_results,\n );\n currentChatMessage.sourcesList = web_results;\n currentChatMessage.displayedSources = web_results?.slice(0, 3); // First 3 cards\n currentChatMessage.remainingSources = web_results?.slice(3); // Remaining items\n this.cdr.detectChanges();\n }\n\n if (answer) {\n this.isChatingWithAi = false;\n console.log('[Socket Chat] Received answer, updating message', {\n message_id,\n answerLength: answer?.length,\n answerPreview: answer?.substring?.(0, 100),\n });\n\n currentChatMessage.message =\n this.processMessageForDisplay(answer);\n this.cdr.detectChanges();\n this.scrollToBottom();\n this.focusOnTextarea();\n }\n\n if (graphs && Array.isArray(graphs)) {\n console.log('[Socket Chat] graphs', graphs?.length, graphs);\n currentChatMessage.graphs = graphs;\n this.cdr.detectChanges();\n }\n\n if (execution_graphs && Array.isArray(execution_graphs)) {\n console.log(\n '[Socket Chat] execution_graphs',\n execution_graphs?.length,\n execution_graphs,\n );\n currentChatMessage.executionGraphs = execution_graphs;\n this.cdr.detectChanges();\n }\n\n if (suggestions && Array.isArray(suggestions)) {\n console.log(\n '[Socket Chat] suggestions',\n suggestions?.length,\n suggestions,\n );\n currentChatMessage.relatedListItems = suggestions;\n this.cdr.detectChanges();\n // Process online search terms as needed\n }\n\n // Add any other fields and their processing here\n } else {\n console.warn('OtherFields is missing in the response');\n }\n },\n (err) => {\n this.eventSubscription.unsubscribe();\n console.error('Error in fetching data from socket', err);\n },\n );\n }\n\n initializeSocketAndListen() {}\n handleEvent(data: any, type: string) {\n switch (type) {\n case 'webresult':\n break;\n case 'answer':\n break;\n case 'graph':\n break;\n default:\n break;\n }\n }\n ngOnDestroy(): void {\n if (this.eventSubscription) {\n this.eventSubscription.unsubscribe();\n }\n this.voiceTranscriptSubscriptions.forEach((sub) => sub.unsubscribe());\n this.socketService.disconnectSocketConnection();\n //this.socketService.close();\n }\n changeTemperature(newTemperature: number) {\n if (this.loading) return;\n this.temperature = newTemperature;\n const wrapper = document.querySelector('.hivegpt-chat-bot-wrapper');\n // Remove existing theme classes from body\n wrapper?.classList.remove('creative', 'balanced', 'precise');\n\n switch (newTemperature) {\n case 0:\n wrapper?.classList.add('creative');\n break;\n case 1:\n wrapper?.classList.add('balanced');\n break;\n case 2:\n wrapper?.classList.add('precise');\n break;\n default:\n break;\n }\n }\n\n onStartAgain() {\n if (this.loading) return;\n this.showStartAgain = false;\n this.chatLog = [];\n this.chatLog.push({\n type: 'ai',\n message: this.greetingMsg,\n\n time: formatNow(this.timezone),\n });\n this.archieveMessages().subscribe();\n }\n\n archieveMessages() {\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n });\n const url = `${this.environment.BASE_URL}/bot/clear-history/${this.botId}/${this.userId}`;\n return this.http.post(url, { headers }).pipe(\n switchMap((res: any) => {\n return of(res);\n }),\n catchError((error) => {\n return of(null);\n }),\n );\n }\n\n triggerSupport() {\n this.openSupport.emit();\n }\n fetchBotConfig() {\n this.loading = true;\n const headers = new HttpHeaders({\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n });\n const url = `${this.environment.BASE_URL}/bots?bot_id=${this.botId}`;\n return this.http.get(url, { headers }).pipe(\n switchMap((res: any) => {\n this.botName = this.getTranslation(res.Name);\n this.botIcon = res.Icon;\n this.botSkills = res?.Skills;\n this.greetingMsg = res.Greeting\n ? (this.processMessageForDisplay(res.Greeting) as any)\n : '';\n\n this.thumbsDownMessages = res?.NegativeResponses?.length\n ? res.NegativeResponses\n : [\n this.getTranslation(\n `We are sorry we've not been able to answer your question`,\n ),\n ];\n this.quickPrompts = res.QuickPrompts;\n this.cdr.markForCheck();\n this.loading = false;\n return of(res);\n }),\n catchError((error) => {\n console.error('Error fetching chatbot config: ', error);\n this.loading = false;\n return of(null);\n }),\n );\n }\n\n fetchChatHistory(): Observable<any> {\n this.loading = true;\n\n this.conversationKey = this.conversationService.getKey(this.botId, false);\n this.conSessionKey = this.conversationService.getSessionKey(\n this.botId,\n false,\n );\n const url = `${this.environment.BASE_URL}/conversations/${this.conversationKey}?session_id=${this.conSessionKey}`;\n const headers = new HttpHeaders({\n accept: 'application/json',\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n });\n\n return this.http\n .get(url, { headers })\n .pipe(catchError(this.handleError<any>('fetchConversation')));\n }\n\n private handleError<T>(operation = 'operation', result?: T) {\n return (error: any): Observable<T> => {\n console.error(`${operation} failed: ${error.message}`);\n return of(result as T);\n };\n }\n // fetchChatHistory() {\n // this.loading = true;\n // const headers = new HttpHeaders({\n // 'Content-Type': 'application/json',\n // 'x-api-key': this.apiKey,\n // });\n // return this.http\n // .get(`${this.environment.BASE_URL}/conversations/${this.conversationKey}`, { headers })\n // .pipe(\n // switchMap((res: any) => {\n // this.loading = false;\n // return of(res);\n // }),\n // catchError((error: any) => {\n // console.error('Error fetching chat history: ', error);\n // this.loading = false;\n // return of(null);\n // })\n // );\n // }\n\n /** Push a standard AI message from history (sources, graphs, etc.). Used when not converting to session_cards. */\n private pushAiMessageFromHistory(chat: any): void {\n const sourcesList = chat.WebLinks || [];\n const displayedSources = (chat.WebLinks || []).slice(0, 3);\n const remainingSources = (chat.WebLinks || []).slice(3);\n this.chatLog.push({\n type: 'ai',\n message: this.processMessageForDisplay(chat.Text),\n executionGraphs: chat.ExecutionGraphs,\n graphs: chat.Graphs,\n searchTerms: chat.SearchTerms,\n sourcesList: sourcesList,\n displayedSources: displayedSources,\n remainingSources: remainingSources,\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n copied: false,\n isCollapsedTrue: false,\n _id: chat._id,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n }\n\n mapChatHistory(chats: any) {\n this.chatLog.push({\n type: 'ai',\n message: this.greetingMsg,\n time: formatNow(this.timezone),\n });\n if (chats && chats?.Messages?.length) {\n chats?.Messages.forEach((chat: any) => {\n if (chat.Type == 'user') {\n this.chatLog.push({\n type: 'user',\n message: this.processMessageForDisplay(chat.Text),\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n copied: false,\n isCollapsedTrue: false,\n WorkflowExecutionId: chat.WorkflowExecutionId,\n _id: chat._id,\n });\n }\n if (chat.Type == 'ai') {\n // If this AI message came from session tools, show session cards instead of plain text\n const toolName = chat.toolresults?.tool_name;\n const isSessionTool =\n toolName === 'get_event_sessions' ||\n toolName === 'get_event_sessions_v2' ||\n toolName === 'get_sessions_by_interest' ||\n toolName === 'get_sessions_by_track' ||\n toolName === 'get_speaker_sessions' ||\n toolName === 'get_upcoming_sessions';\n if (\n isSessionTool &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n let sessions: any[] = [];\n try {\n const parsed = JSON.parse(contentStr);\n sessions = parsed?.sessions ?? [];\n } catch (e) {\n sessions = this.parseSessionContentV2(contentStr);\n }\n const mapped = this.mapSessionsToCardData(sessions);\n this.ensureSpeakersForSessionCards(mapped);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'session_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n sessionCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } else if (\n toolName === 'get_event_attendees' &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n // If this AI message came from get_event_attendees, show attendee cards on initial history load\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n try {\n const parsed = JSON.parse(contentStr);\n const attendees = parsed?.attendees ?? [];\n const mapped = this.mapAttendeesToCardData(attendees);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'attendee_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n attendeeCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } catch (e) {\n this.pushAiMessageFromHistory(chat);\n }\n } else if (\n toolName === 'get_event_speakers' &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n // If this AI message came from get_event_speakers, show speaker cards on initial history load\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n try {\n const parsed = JSON.parse(contentStr);\n const speakers = parsed?.speakers ?? parsed?.speaker ?? [];\n const mapped = this.mapSpeakersToCardData(speakers);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'speaker_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n speakerCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } catch (e) {\n this.pushAiMessageFromHistory(chat);\n }\n } else if (\n toolName === 'get_event_sponsors' &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n // If this AI message came from get_event_sponsors, show sponsor cards on initial history load\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n try {\n const parsed = JSON.parse(contentStr);\n const sponsors = parsed?.sponsors ?? [];\n const mapped = this.mapSponsorsToCardData(sponsors);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'sponsor_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n sponsorCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } catch (e) {\n this.pushAiMessageFromHistory(chat);\n }\n } else if (\n toolName === 'get_event_booths' &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n // If this AI message came from get_event_booths, show booth cards using sponsor card design\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n try {\n const parsed = JSON.parse(contentStr);\n const booths = parsed?.booths ?? [];\n const mapped = this.mapBoothsToCardData(booths);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'sponsor_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n sponsorCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } catch (e) {\n this.pushAiMessageFromHistory(chat);\n }\n } else if (\n toolName === 'get_booth_representatives' &&\n chat.toolresults?.tool_result?.messages?.[0]?.content\n ) {\n // If this AI message came from get_booth_representatives, show booth rep cards (attendee design)\n const contentStr = chat.toolresults.tool_result.messages[0].content;\n try {\n const parsed = JSON.parse(contentStr);\n const representatives = parsed?.representatives ?? [];\n const mapped = this.mapBoothRepsToCardData(representatives);\n if (mapped.length > 0) {\n this.chatLog.push({\n _id: chat._id,\n type: 'booth_rep_cards',\n message: chat.Text\n ? this.processMessageForDisplay(chat.Text)\n : '',\n time: formatTimeStamps(this.timezone, chat.InsertTimestamp),\n boothRepCards: mapped,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n } catch (e) {\n this.pushAiMessageFromHistory(chat);\n }\n } else {\n this.pushAiMessageFromHistory(chat);\n }\n }\n });\n this.showStartAgain = true;\n }\n this.scrollToBottom();\n this.cdr.markForCheck();\n }\n\n processMessage(message: string): SafeHtml {\n if (!message || !(message?.length > 0)) {\n return '';\n }\n\n // console.log('here is my message')\n // console.log(message);\n\n message = message.trim();\n\n const markdownLinkRegex = /\\[([^[]+)]\\(([^)]+)\\)/g;\n const urlRegex = /(?<!href=\")\\bhttps?:\\/\\/\\S+(?<![.,])/gi;\n\n if (markdownLinkRegex.test(message)) {\n const html = message.replace(\n markdownLinkRegex,\n '<a href=\"$2\" target=\"_blank\">$1</a>',\n );\n //console.log('Sanitized message: ', message);\n return this.sanitizeHtml(html);\n }\n\n if (urlRegex.test(message)) {\n const html = message.replace(\n urlRegex,\n '<a href=\"$&\" target=\"_blank\">$&</a>',\n );\n // console.log('Sanitized message: ', message);\n return this.sanitizeHtml(html);\n }\n\n message = message.replace(/(?:\\r\\n|\\r|\\n)/g, '<br>');\n\n message = message.replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>');\n // Convert Markdown headers to HTML headers\n message = message.replace(/^(#{1,6})\\s+(.*)$/gm, (match, hashes, text) => {\n const level = hashes.length;\n return `<h${level}>${text}</h${level}>`;\n });\n\n this.cdr.markForCheck();\n const sanitizedMessage = this.sanitizeHtml(message);\n return sanitizedMessage;\n }\n\n ngAfterViewChecked() {\n const feedbackLinks =\n this.elementRef.nativeElement.querySelectorAll('.feedback-link');\n feedbackLinks.forEach((link: any) => {\n link.addEventListener(\n 'click',\n this.onFeedbackClick.bind(this, 'zendesk'),\n );\n });\n // if (this.elementRef.nativeElement.querySelector('.feedback-link')) {\n // this.elementRef.nativeElement\n // .querySelector('.feedback-link')\n // .addEventListener('click', this.onFeedbackClick.bind(this, 'zendesk'));\n // }\n }\n\n sanitizeHtml(html: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n\n onFeedbackClick(value: string) {\n this.feedbackEvent.emit(value);\n }\n\n onClose() {\n this.renderer.removeClass(document.body, this.bodyOverflowClass);\n this.onCloseEvent.emit();\n }\n\n sendMessageWithTile(prompt: string) {\n this.input = prompt;\n this.fetchData();\n this.scrollToBottom();\n }\n isChatingWithAi = false;\n fetchData(msg = null) {\n this.input = msg || this.input?.trim();\n this.msg = this.input;\n if (!this.input || this.loading) {\n return;\n }\n this.ensureChatSocket();\n\n this.chatLog.push({\n type: 'user',\n message: this.processMessageForDisplay(this.input),\n time: formatNow(this.timezone),\n copied: false,\n isCollapsedTrue: false,\n });\n\n try {\n const textarea = this.myInput.nativeElement;\n textarea.style.height = 'hidden'; // Reset the height\n textarea.style.height = `62px`;\n } catch (error) {}\n this.cdr.markForCheck();\n\n this.aiResponse = '';\n this.isChatingWithAi = true;\n\n this.makeAskRequest(this.input, this.agents, this.conversationKey);\n }\n fetchDataFor(msg, chat) {\n const inputMsg = msg?.trim();\n if (!inputMsg || this.loading) {\n return;\n }\n this.ensureChatSocket();\n try {\n chat.relatedListItems = [];\n this.cdr.detectChanges();\n } catch (error) {}\n\n this.scrollToBottom();\n this.chatLog.push({\n type: 'user',\n message: this.processMessageForDisplay(inputMsg),\n time: formatNow(this.timezone),\n copied: false,\n isCollapsedTrue: false,\n });\n\n this.cdr.markForCheck();\n\n this.aiResponse = '';\n this.isChatingWithAi = true;\n\n this.makeAskRequest(inputMsg, this.agents, this.conversationKey, msg, chat);\n }\n fetchSmallTalk() {\n this.loading = true;\n this.cdr.markForCheck();\n\n const url = `${this.environment.BASE_URL}/bot/small-talk/${this.botId}/${this.userId}`;\n\n this.http\n .get<{ smallTalk: string }>(url, {\n headers: {\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n },\n })\n .pipe(\n catchError((error) => {\n console.error('Error while fetching small talk:', error);\n\n return of(null);\n }),\n )\n .subscribe((response) => {\n this.loading = false;\n this.cdr.markForCheck();\n\n if (!response) {\n return;\n }\n\n if (response && response.smallTalk) {\n this.chatLog.push({\n type: 'ai',\n message: this.processMessage(response.smallTalk),\n time: formatNow(this.timezone),\n isFeedbackMsg: true,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 2;\n // this.scrollToBottom();\n this.cdr.markForCheck();\n }\n });\n }\n\n readAllChunks = (stream: any) => {\n const reader = stream.getReader();\n const allSuggestions: string[] = [];\n\n reader.closed.catch((err: any) => {\n if (err) {\n console.error('Error reading stream: ', err);\n }\n\n this.isChatingWithAi = false;\n this.scrollToBottom();\n return;\n });\n\n return new ReadableStream({\n start: (controller) => {\n return this.pump(controller, reader, allSuggestions);\n },\n });\n };\n\n pump(controller: any, reader: any, allSuggestions: string[]) {\n reader.read().then(({ done, value }: any) => {\n const lastItem = this.chatLog[this.chatLog.length - 1];\n\n if (done) {\n lastItem.message = this.processMessageForDisplay(lastItem.message);\n this.chatLog.pop();\n this.chatLog.push(lastItem);\n if (allSuggestions?.length) {\n this.chatLog.push({\n type: 'suggestions',\n suggestions: allSuggestions,\n });\n }\n\n controller.close();\n this.isChatingWithAi = false;\n // this.scrollToBottom();\n this.cdr.markForCheck();\n this.showStartAgain = true;\n\n // setTimeout(() => {\n // this.fetchSmallTalk();\n // },1000)\n return;\n }\n\n let decodedChunk = this.decoder.decode(value, { stream: true });\n this.aiResponse += decodedChunk;\n if (lastItem.type === 'ai') {\n const suggestionsMatch = this.aiResponse.match(/<sug>(.*?)<\\/sug>/g);\n if (suggestionsMatch) {\n suggestionsMatch.forEach((match) => {\n this.aiResponse = this.aiResponse.replace(match, '');\n allSuggestions.push(match?.replace(/<\\/?sug>/g, ''));\n });\n }\n\n lastItem.message = this.aiResponse;\n this.cdr.markForCheck();\n } else {\n this.isChatingWithAi = false;\n\n let aiFormattedData: any;\n\n try {\n console.log('parsing json ');\n aiFormattedData = JSON.parse(JSON.parse(this.aiResponse));\n } catch (e) {\n try {\n console.log('parsing json 2');\n aiFormattedData = JSON.parse(this.aiResponse);\n } catch (e) {}\n }\n\n console.log('parsing json done');\n\n if (aiFormattedData && aiFormattedData?.section_id?.length > 0) {\n if (\n aiFormattedData.section_id == 'company_search' ||\n aiFormattedData.section_id == 'user_search' ||\n aiFormattedData.section_id == 'industry_company_search'\n ) {\n this.fetchMyConnections().subscribe();\n this.fetchPendingRequests().subscribe();\n }\n\n if (aiFormattedData.section_id == this.myUpcomingSessionAction) {\n var speakerIds = [];\n aiFormattedData.content?.forEach((session) => {\n speakerIds = [...speakerIds, ...session.speakers];\n });\n\n if (speakerIds?.length > 0)\n this.getSpeakersByStaffIds(speakerIds).subscribe();\n }\n\n if (\n aiFormattedData.section_id == this.addToMyAgendaAction &&\n aiFormattedData.content?.length > 0\n ) {\n this.openPage.next({\n sectionId: aiFormattedData.section_id,\n sessionIds: aiFormattedData.content,\n });\n }\n\n if (aiFormattedData.section_id == this.connectOrFollowAction) {\n let usersLen = aiFormattedData.content?.length;\n if (usersLen > 1) {\n this.openPage.next({\n sectionId: 'open_networking_drawer',\n search: aiFormattedData.content,\n });\n } else if (usersLen == 1) {\n this.openPage.next({\n sectionId: aiFormattedData.section_id,\n connetUserIds: [aiFormattedData.content[0].userId],\n });\n }\n }\n\n if (aiFormattedData.is_open_page == 'true') {\n this.openPage.next({\n sectionId: aiFormattedData.section_id,\n search: aiFormattedData.content,\n });\n\n if (this.isMobileBrowser()) {\n aiFormattedData.message +=\n '\\n\\n' + '<a id=\"closeBotNow\">Click Here</a> to see results.';\n }\n }\n\n this.chatLog.push({\n type: 'ai',\n message: aiFormattedData.message,\n action: aiFormattedData,\n time: formatNow(this.timezone),\n });\n\n if (this.isMobileBrowser()) {\n setTimeout(() => {\n this.addCloseBotClickEvent();\n }, 500);\n }\n\n this.aiResponse = '';\n } else {\n this.chatLog.push({\n type: 'ai',\n message: this.aiResponse,\n time: formatNow(this.timezone),\n });\n }\n\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n this.cdr.markForCheck();\n }\n\n this.scrollToBottom();\n\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n this.pump(controller, reader, allSuggestions);\n });\n }\n\n submitFeedback(flag: boolean, message) {\n console.log(message);\n\n this.feedbackDone = true;\n this.showFeedBackIconsIndex = null;\n const conversation_id = this.conversationService.getKey(this.botId);\n const url = `${this.environment.AGENTS_API}/Conversation/coPilot/${this.botId}/conversation/${conversation_id}/helpful-response`;\n fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n apiKey: 'Conversation_WIz/qAm+EEmfOkFaUA/weA==',\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n },\n body: JSON.stringify({ messageId: message._id, isHelpful: flag }),\n }).then(() => {\n if (flag) {\n this.chatLog.push({\n type: 'ai',\n message:\n this.thumbsUpMessage ||\n this.getTranslation('May I assist you with anything else'),\n time: formatNow(this.timezone),\n isFeedbackMsg: true,\n });\n\n this.scrollToBottom();\n this.cdr.markForCheck();\n this.feedbackDone = false;\n this.showFeedBackIconsIndex = null;\n return;\n }\n\n this.chatLog.push({\n type: 'ai',\n message: this.processMessage(\n this.thumbsDownMessages[this.thumbsDownMsgIndex],\n ),\n time: formatNow(this.timezone),\n isFeedbackMsg: true,\n });\n this.thumbsDownMsgIndex =\n (this.thumbsDownMsgIndex + 1) % this.thumbsDownMessages.length;\n this.scrollToBottom();\n this.cdr.markForCheck();\n setTimeout(() => {\n const supportLink = document.getElementById('supportLink88');\n if (supportLink) {\n supportLink.addEventListener('click', this.triggerSupport.bind(this));\n }\n }, 200);\n this.feedbackDone = false;\n this.showFeedBackIconsIndex = null;\n });\n }\n handleKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n // Prevent default behavior (new line)\n event.preventDefault();\n // Call your submit function\n this.handleSubmit(event);\n }\n }\n handleSubmit(event) {\n this.fetchData();\n this.scrollToBottom();\n }\n\n /** Index of the last AI message in chatLog; -1 if none. */\n get lastAiMessageIndex(): number {\n for (let j = this.chatLog.length - 1; j >= 0; j--) {\n if (this.chatLog[j]?.type === 'ai') return j;\n }\n return -1;\n }\n\n handleUpClick(idx: any) {\n if (this.feedbackDone) {\n return;\n }\n\n this.submitFeedback(true, this.chatLog[idx]);\n this.chatLog[idx].liked = !this.chatLog[idx].liked;\n\n if (this.chatLog[idx].unliked) {\n this.chatLog[idx].unliked = !this.chatLog[idx].unliked;\n }\n\n this.cdr.markForCheck();\n }\n\n handleDownClick(idx: any) {\n if (this.feedbackDone) return;\n this.submitFeedback(false, this.chatLog[idx]);\n this.chatLog[idx].unliked = !this.chatLog[idx].unliked;\n if (this.chatLog[idx].liked)\n this.chatLog[idx].liked = !this.chatLog[idx].liked;\n }\n // handleCopyClick(index: any) {\n // // Copy the message to the clipboard\n // const contentToCopy = this.chatLog[index].message;\n // console.log('contentToCopy');\n // console.log(contentToCopy);\n // navigator.clipboard.writeText(contentToCopy).then(() => {\n // // Indicate that the message was copied\n // this.chatLog[index].copied = true;\n // this.cdr.detectChanges();\n // // Reset the copied state after a delay\n // setTimeout(() => {\n // this.chatLog[index].copied = false;\n // this.cdr.detectChanges();\n // }, 2000); // Reset after 2 seconds\n // });\n // }\n copyText(id, index) {\n // Get the text element\n var textElement = document.getElementById(id);\n\n // Create a temporary textarea element to copy the text\n var tempTextArea = document.createElement('textarea');\n tempTextArea.value = textElement.innerText;\n\n // Append the textarea to the body (necessary for the execCommand to work)\n document.body.appendChild(tempTextArea);\n\n // Select the text inside the textarea\n tempTextArea.select();\n\n // Copy the text to the clipboard\n document.execCommand('copy');\n\n // Remove the temporary textarea\n document.body.removeChild(tempTextArea);\n\n // Optionally, you can alert the user or change the button text to indicate the copy was successful\n // alert('Text copied to clipboard!');\n\n this.chatLog[index].copied = true;\n this.cdr.detectChanges();\n // Reset the copied state after a delay\n setTimeout(() => {\n this.chatLog[index].copied = false;\n this.cdr.detectChanges();\n }, 2000); // Reset after 2 seconds\n }\n handleCopyClick(index: any) {\n // Copy the message to the clipboard\n const contentToCopy = this.chatLog[index].message;\n const resutlt = this.copyText('messageText_' + index, index);\n }\n\n sanitizeHTML(html: string): string {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n\n // Create a new document fragment to hold the simplified content\n const fragment = document.createDocumentFragment();\n\n // Append the children of the body of the parsed document to the fragment\n Array.from(doc.body.childNodes).forEach((node) => {\n fragment.appendChild(node.cloneNode(true));\n });\n\n // Create a new div element to hold the simplified HTML\n const simplifiedDiv = document.createElement('div');\n simplifiedDiv.appendChild(fragment);\n\n // Remove complex tags or attributes as needed\n // Example: remove scripts\n simplifiedDiv\n .querySelectorAll('script')\n .forEach((script) => script.remove());\n\n // Return the simplified HTML as a string\n return simplifiedDiv.innerHTML;\n }\n\n currentMessageForEditor: any = '';\n currentIndexForEditor: any = -1;\n handleEditorClick(index: any) {\n if (this.currentIndexForEditor == -1) {\n this.currentIndexForEditor = index;\n this.currentMessageForEditor = this.sanitizeHTML(\n this.chatLog[index].message,\n );\n this.currentMessageForEditor = this.currentMessageForEditor.replace(\n // 'SafeValue must use [property]=binding:',\n '',\n );\n\n this.cdr.detectChanges();\n } else {\n if (this.currentIndexForEditor == index) {\n this.currentMessageForEditor += this.sanitizeHTML(\n this.chatLog[index].message,\n );\n this.currentMessageForEditor = this.currentMessageForEditor.replace(\n // 'SafeValue must use [property]=binding:',\n '',\n );\n this.cdr.detectChanges();\n } else {\n this.currentIndexForEditor = index;\n this.currentMessageForEditor = this.sanitizeHTML(\n this.chatLog[index].message,\n );\n this.currentMessageForEditor = this.currentMessageForEditor.replace(\n // 'SafeValue must use [property]=binding:',\n '',\n );\n this.cdr.detectChanges();\n }\n }\n this.chatLog[index].isEditor = true;\n this.cdr.detectChanges();\n // Reset the copied state after a delay\n setTimeout(() => {\n this.chatLog[index].isEditor = false;\n this.cdr.detectChanges();\n }, 2000); // Reset after 2 seconds\n this.editorsDrawer.open();\n const button = document.getElementById('botcloseplaygroundbutton');\n if (button) {\n button.style.display = 'none';\n }\n this.cdr.detectChanges();\n }\n scrollToBottom() {\n if (!this.autoScrollOnNewMessage) {\n return;\n }\n let counter = 0;\n const interval = setInterval(() => {\n this.chatMain.nativeElement.scrollTop =\n this.chatMain.nativeElement.scrollHeight;\n if (counter++ > 5) clearInterval(interval);\n }, 5);\n }\n\n focusOnTextarea() {\n setTimeout(() => {\n if (this.myInput && this.myInput.nativeElement) {\n this.myInput.nativeElement.focus();\n }\n }, 100);\n }\n\n handleAction(action: any) {\n console.info('incoming action from the chatbot AI');\n console.info(action);\n\n if (action?.content) {\n }\n }\n\n ngAfterViewInit() {\n // Check if the drawer is initially open and apply overflow hidden to body if so\n if (this.drawer.opened) {\n this.setBodyOverflow();\n }\n\n // Listen to changes in the drawer being opened or closed\n this.drawer.openedChange.subscribe((opened: boolean) => {\n if (opened) {\n this.setBodyOverflow();\n } else {\n this.removeBodyOverflow();\n }\n });\n\n this.drawer.openedChange.subscribe((opened) => {\n if (opened) {\n setTimeout(() => {\n if (this.myInput && this.myInput.nativeElement) {\n this.myInput.nativeElement.focus(); // Focus on the textarea\n }\n });\n }\n });\n }\n\n private setBodyOverflow() {\n this.renderer.addClass(document.body, this.bodyOverflowClass);\n }\n\n private removeBodyOverflow() {\n this.renderer.removeClass(document.body, this.bodyOverflowClass);\n }\n\n getSpeakersByStaffIds(ids: any[]): Observable<any[] | null> {\n const url = `${this.environment.USERS_API}/events/${this.eventId}/users/get-by-staff-ids`;\n const cleanIds = Array.from(\n new Set((ids || []).map((x) => String(x ?? '').trim()).filter(Boolean)),\n );\n if (cleanIds.length === 0) return of(null);\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: this.autogenKey,\n });\n return this.http.post<any[]>(url, cleanIds, { headers }).pipe(\n tap((data: any[]) => {\n if (Array.isArray(data) && data.length > 0) {\n data.forEach((speaker) => {\n const id = String(speaker?.id ?? '').trim();\n if (id) this.speakers[id] = speaker;\n });\n this.cdr.markForCheck();\n }\n }),\n catchError((err) => {\n console.error('Error fetching speakers:', err);\n return of(null);\n }),\n );\n }\n\n performSessionAction(sessionId, action) {\n this.sessionActions.next({\n sessionId,\n action,\n });\n }\n\n addCloseBotClickEvent() {\n const element = this.elementRef.nativeElement.querySelector('#closeBotNow');\n if (element) {\n this.renderer.listen(element, 'click', () => {\n this.closeBot.next();\n });\n }\n }\n\n isMobileBrowser() {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent,\n );\n }\n\n connectToUser(userId) {\n this.connectWithUser.emit({\n connect: !this.canDisconnect(userId),\n userId,\n });\n\n setTimeout(() => {\n this.fetchMyConnections().subscribe((res) => {\n this.cdr.markForCheck();\n });\n this.fetchPendingRequests().subscribe((res) => {\n this.cdr.markForCheck();\n });\n }, 500);\n }\n\n scheduleMeetingWithUser(user) {\n this.scheduleMeeting.emit(user);\n }\n\n /** Whether the given userId has a pending connection request sent (show \"Request Sent\" disabled). */\n checkPendingSentRequest(userId: string | null | undefined): boolean {\n if (userId == null || userId === '') return false;\n const pending = this.pendingSentRequestUserIds?.length\n ? this.pendingSentRequestUserIds\n : this.pendingRequests;\n return !!pending?.find((a: any) => a == userId);\n }\n\n /** Whether this attendee can be followed (show \"Connect\" button). Not connected and no pending sent request. */\n canFollowUser(attendee: { id?: string }): boolean {\n const uid = attendee?.id;\n if (uid == null || uid === '') return false;\n if (this.canUnfollowUser(attendee) || this.checkPendingSentRequest(uid))\n return false;\n return true;\n }\n\n /** Whether this attendee is already connected (show \"Disconnect\" button). */\n canUnfollowUser(attendee: { id?: string }): boolean {\n const uid = attendee?.id;\n if (uid == null || uid === '') return false;\n const list = this.connectionsList?.length\n ? this.connectionsList\n : this.myConnections;\n return !!list?.find((c: any) => (c.userId ?? c.id) == uid);\n }\n\n canConnect(userId) {\n return !(\n this.canDisconnect(userId) ||\n this.pendingRequests.find((a) => a == userId)\n );\n }\n\n canDisconnect(userId) {\n return this.myConnections.find((conn) => conn.userId == userId);\n }\n\n fetchPendingRequests() {\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: this.autogenKey,\n });\n return this.http\n .get(\n `${this.environment.USERS_API}/events/${this.eventId}/connection-requests/autogen/pending-sent-requests?userId=${this.userId}`,\n { headers },\n )\n .pipe(\n switchMap((res: any) => {\n this.pendingRequests = res;\n this.cdr.markForCheck();\n return of(res);\n }),\n catchError((error: any) => {\n console.error('Error fetching pending requests: ', error);\n return of(null);\n }),\n );\n }\n\n fetchMyConnections() {\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: this.autogenKey,\n });\n return this.http\n .get(\n `${this.environment.USERS_API}/events/${this.eventId}/users-connections/autogen?userId=${this.userId}`,\n { headers },\n )\n .pipe(\n switchMap((res: any) => {\n this.myConnections = res;\n this.cdr.markForCheck();\n return of(res);\n }),\n catchError((error: any) => {\n console.error('Error fetching pending requests: ', error);\n return of(null);\n }),\n );\n }\n\n isDropdownOpen: boolean = false;\n agents: any;\n selectedAgents = [];\n allSelected = false;\n // Toggle the dropdown visibility\n toggleDropdown() {\n if (!this.agents) this.fetchAgents();\n this.isDropdownOpen = !this.isDropdownOpen;\n this.cdr.detectChanges();\n }\n\n onSelectAll(event: Event): void {\n this.agents?.forEach((agent) => (agent.selected = false));\n this.cdr.detectChanges();\n }\n\n onAgentChange(agent: any): void {\n //agent.selected = !agent.selected;\n //console.log(agent);\n let agentFound = this.agents.filter((p) => p.id == agent.id);\n if (agentFound && agentFound.length > 0) {\n agentFound[0].selected = !agentFound[0].selected;\n this.cdr.detectChanges();\n }\n this.cdr.detectChanges();\n }\n\n areAllSelected(): boolean {\n return this.agents?.every((agent) => !agent.selected);\n }\n\n getDropdownHeaderText(): string {\n const selectedAgents = this.agents?.filter((agent) => agent.selected);\n if (!selectedAgents) {\n return 'All Agents';\n } else {\n if (selectedAgents && selectedAgents?.length === 0) {\n return 'All Agents';\n } else {\n return selectedAgents?.length > 1\n ? `${selectedAgents?.length} Agents Selected`\n : `${selectedAgents?.length} Agent Selected`;\n }\n }\n }\n fetchAgents_http() {\n this.loading = true;\n const url = `${this.environment.AGENTS_API}/CoPilot/${this.botId}/active-agents`;\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n });\n\n return this.http.post(url, {}, { headers }).pipe(\n switchMap((res: any) => {\n if (res) {\n this.agents = res.map((agent) => ({\n ...agent,\n selected: false,\n }));\n }\n this.cdr.markForCheck();\n\n return of(res);\n }),\n catchError((error) => {\n console.error('Error fetching chatbot config: ', error);\n\n return of(null);\n }),\n );\n }\n isDocInEditMode = false;\n documentContent: any;\n\n conversationId: any;\n isContentLoaded = false;\n\n fetchContent_http() {\n this.isDocInEditMode = false;\n this.isContentLoaded = false;\n console.log('API call function');\n this.loading = true;\n const conversation_id = this.conversationService.getKey(this.botId);\n this.conversationId = conversation_id;\n const url = `${this.environment.AGENTS_API}/ConversationDocuments?conversationId=${conversation_id}&botId=${this.botId}`;\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: 'WIz/qAm+EEmfOkFaUA/weA==',\n 'domain-authority': this.domainAuthorityValue,\n });\n\n return this.http.get(url, { headers }).pipe(\n switchMap((res: any) => {\n if (res) {\n this.isDocInEditMode = true;\n this.documentContent = res;\n console.log('Get API callled success');\n this.isContentLoaded = true;\n console.log(res);\n }\n this.cdr.markForCheck();\n\n return of(res);\n }),\n catchError((error) => {\n console.error('Error fetching chatbot config DJ: ', error);\n this.isDocInEditMode = false;\n this.isContentLoaded = true;\n\n if (error?.status == 404) {\n console.log('dash');\n this.isDocInEditMode = false;\n this.isContentLoaded = true;\n }\n return of(null);\n }),\n );\n }\n\n fetchAgents() {\n this.fetchAgents_http().subscribe();\n }\n\n fetchEditorContent() {\n this.fetchContent_http().subscribe();\n }\n\n // events/${eventId}/users-connections\n processMessageForDisplay(markdown: string): SafeHtml {\n try {\n // Create a custom renderer to modify <a> tags\n const renderer = new marked.Renderer();\n\n // Customize anchor tags to include target=\"_blank\"\n renderer.link = (href: string, title: string, text: string) => {\n return `<a href=\"${href}\" title=\"${\n title || ''\n }\" target=\"_blank\">${text}</a>`;\n };\n\n // Parse the markdown content to HTML using marked with the custom renderer\n const markdownContent = marked.parse(markdown, { renderer: renderer });\n\n // Sanitize the parsed HTML using Angular's DomSanitizer\n const sanitizedHtml =\n this.sanitizer.bypassSecurityTrustHtml(markdownContent);\n\n // Return the safe HTML content for display\n return sanitizedHtml;\n } catch (error) {\n console.error('Error processing markdown:', error);\n return ''; // Return an empty string or handle the error appropriately\n }\n }\n\n prepareHtml(markdown: string): string {\n if (!markdown || !(markdown.length > 0)) {\n console.error('Input Markdown is null or empty');\n return '';\n }\n\n // Convert Markdown headers (### or ##) to <strong> for bold headings\n let html = markdown.replace(\n /^(#{1,6})\\s+(.*)$/gm,\n (match, hashes, text) => {\n const level = hashes.length;\n if (level === 3) {\n return `<h3><strong>${text}</strong></h3>`;\n } else if (level === 4) {\n return `<h4><strong>${text}</strong></h4>`;\n }\n return `<strong>${text}</strong>`;\n },\n );\n\n // Convert Markdown code blocks with language to preformatted HTML\n html = html.replace(/```(\\w+)?\\n([\\s\\S]*?)```/g, (match, lang, code) => {\n const escapedCode = this.escapeHtml(code);\n const language = lang || 'plaintext';\n\n // Create a copy button for the code block\n return `\n <div class=\"code-container\">\n <button id=\"copy-button\" class=\"copy-button\" (click)=\"copyToClipboard('\\`${escapedCode}\\`')\">${this.getTranslation(\n 'Copy',\n )}</button>\n <pre class=\"code_block diff\"><code class=\"language-${language}\">${escapedCode}</code></pre>\n </div>`;\n });\n\n // Convert inline code (wrapped in `backticks`) to inline <code> tags\n html = html.replace(/`([^`]+)`/g, '<code>$1</code>');\n\n // Convert Markdown bold to HTML <strong>\n html = html.replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>');\n\n // Convert numbered lists\n html = html.replace(/^\\d+\\.\\s+(.*)$/gm, '<li>$1</li>');\n\n // Convert bullet point lists\n html = html.replace(/^\\-\\s+(.*)$/gm, '<li>$1</li>');\n\n // Convert Markdown links to HTML links\n html = html.replace(\n /\\[([^\\]]+)]\\(([^)]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\">$1</a>',\n );\n\n // Convert new lines to <br> tags for paragraphs\n html = html.replace(/(?:\\r\\n|\\r|\\n)/g, '<br>');\n\n return html;\n }\n\n // Helper function to escape HTML characters for code blocks\n escapeHtml(code: string): string {\n return code\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n }\n\n // Function to copy text to clipboard\n public copyToClipboard(text: string) {\n navigator.clipboard.writeText(text).then(\n () => {\n alert('Code copied to clipboard!');\n },\n (err) => {\n console.error('Could not copy text: ', err);\n },\n );\n }\n\n isCollapsed = false;\n isCollapsedForGraph = false;\n isCollapsedForFGraph = false;\n toggleCollapse() {\n this.isCollapsed = !this.isCollapsed;\n this.cdr.detectChanges();\n }\n\n toggleCollapseGraph() {\n this.isCollapsedForGraph = !this.isCollapsedForGraph;\n this.cdr.detectChanges();\n }\n toggleCollapseFGraph() {\n this.isCollapsedForFGraph = !this.isCollapsedForFGraph;\n this.cdr.detectChanges();\n }\n // [\n // {\n // \"title\": \"AI News January 2024: In-Depth and Concise - The AI Track\",\n // \"desc\": \"Each month, we compile significant news, trends, and happenings in AI, providing detailed summaries with key points in bullet form for concise yet complete understanding.\",\n // \"link\": \"https://theaitrack.com/ai-news-january-2024/\"\n // },\n // {\n // \"title\": \"Top AI News, January 2024 - Everypixel Journal\",\n // \"desc\": \"In this monthly roundup, we spotlight the top AI news stories from January, including the OpenAI vs. The New York Times Lawsuit.\",\n // \"link\": \"https://journal.everypixel.com/top-ai-news-january-2024\"\n // },\n // {\n // \"title\": \"AI News July 2024: In-Depth and Concise - The AI Track\",\n // \"desc\": \"This page features AI News for July 2024, highlighting significant events such as Canva acquiring Leonardo AI.\",\n // \"link\": \"https://theaitrack.com/ai-news-july-2024-in-depth-and-concise/\"\n // },\n // {\n // \"title\": \"January news roundup: What's new in the world of AI? - Pluralsight\",\n // \"desc\": \"OpenAI’s new GPT store, business-ready ChatGPT plans, and a predicted rise in AI-powered cybercrime.\",\n // \"link\": \"https://www.pluralsight.com/resources/blog/data/ai-this-month-january-2024\"\n // },\n // {\n // \"title\": \"AI News August 2024: In-Depth and Concise - The AI Track\",\n // \"desc\": \"This page features AI News for August 2024, with highlights such as Nvidia delaying the “Blackwell” B200 AI chips delivery.\",\n // \"link\": \"https://theaitrack.com/ai-news-august-2024-in-depth-and-concise-duplicate/\"\n // }\n // ]\n dateTime = { now: new Date().toISOString() };\n // Extracts the domain from a URL\n getDomainName(url: string): string {\n try {\n const { hostname } = new URL(url);\n return hostname.replace(/^www\\./, ''); // Remove 'www.' if present\n } catch {\n return 'unknown';\n }\n }\n\n // Generates the favicon URL\n getFaviconUrl(url: string): string {\n const domain = this.getDomainName(url);\n return `https://www.google.com/s2/favicons?sz=128&domain=${domain}`;\n }\n currentSourcesList: any = [];\n onCardClick(sources): void {\n this.currentSourcesList = sources;\n this.cdr.detectChanges();\n this.sourcesDrawer.open();\n const button = document.getElementById('botcloseplaygroundbutton');\n if (button) {\n button.style.display = 'none';\n }\n }\n\n isShowEditorButton = true;\n\n openOuterEditor() {\n this.fetchEditorContent();\n this.editorsDrawer.open();\n this.isDrawerOpen = true;\n this.isShowEditorButton = false;\n this.cdr.detectChanges();\n\n const button = document.getElementById('botcloseplaygroundbutton');\n if (button) {\n button.style.display = 'none';\n }\n }\n\n onCloseEditor() {\n this.editorsDrawer.close();\n this.isDrawerOpen = false;\n this.isShowEditorButton = true;\n this.cdr.detectChanges(); // Trigger change detection if needed\n this.onDrawerClosed();\n }\n\n onCloseSource() {\n this.sourcesDrawer.close();\n this.isDrawerOpen = false;\n this.cdr.detectChanges(); // Trigger change detection if needed\n this.onDrawerClosed();\n }\n onDrawerClosed() {\n setTimeout(() => {\n this.isDrawerOpen = true;\n this.cdr.detectChanges(); // Trigger change detection if needed\n // Use ngClass to dynamically apply the class\n const button = document.getElementById('botcloseplaygroundbutton');\n if (button) {\n button.style.display = 'block';\n }\n }, 800);\n }\n isDrawerOpen = true;\n\n toggleDrawer(todo) {\n this.isDrawerOpen = todo;\n this.cdr.detectChanges();\n this.updateButtonVisibility();\n }\n updateButtonVisibility() {\n const button = document.getElementById('botcloseplaygroundbutton');\n if (button) {\n button.style.display = this.isDrawerOpen ? 'block' : 'none';\n }\n }\n openLinkInNewTab(link: string): void {\n window.open(link, '_blank');\n }\n adjustTextareaHeight(event: any): void {\n try {\n if (event.key === 'Enter' && !event.shiftKey) {\n // Prevents a new line from being added\n event.preventDefault();\n }\n } catch (error) {}\n const textarea = event.target as HTMLTextAreaElement;\n textarea.style.height = 'auto'; // Reset the height\n textarea.style.height = `${textarea.scrollHeight}px`; // Adjust height to match content\n // Ensure the height doesn't exceed the max-height set in CSS\n if (textarea.scrollHeight > 150) {\n textarea.style.height = `150px`; // Adjust height to match content\n textarea.style.overflowY = 'auto'; // Enable scrolling if content exceeds 400px\n } else {\n textarea.style.overflowY = 'hidden'; // Hide scrollbar if content is within limits\n }\n }\n\n toggleWorkflows(value = null) {\n if (!this.checkForCop29BotId()) {\n this.botService.getWorkflowsByOrgId(this.orgId).subscribe((res) => {\n this.orgWorkflows = res;\n this.isWorkflowOpen = value == null ? !this.isWorkflowOpen : value;\n\n if (!this.isWorkflowOpen) {\n this.selectedWorkflow = null;\n this.openWorkflowInput = false;\n }\n\n this.cdr.detectChanges();\n });\n }\n }\n\n initializeForm() {\n // Create form controls dynamically based on selectedWorkflow.Trigger.InputSchema\n const formControls = {};\n if (this.selectedWorkflow?.Trigger?.InputSchema) {\n this.selectedWorkflow.Trigger.InputSchema.forEach((input) => {\n formControls[input.InputId] = [\n input.Value || '',\n input.Required ? Validators.required : null,\n ];\n });\n }\n\n // Initialize the form\n this.workflowForm = this.fb.group(formControls);\n }\n\n onWorkflowSelected(workflow) {\n this.selectedWorkflow = workflow;\n this.initializeForm();\n this.isWorkflowOpen = false;\n this.openWorkflowInput = true;\n }\n\n onWorkflowSubmit() {\n const container = document.getElementById('botAllChat');\n if (this.workflowForm.valid) {\n console.log(this.workflowForm.value);\n\n var input = this.prepareHtml(\n this.generateMarkdown(\n this.selectedWorkflow.Name,\n this.workflowForm.value,\n ),\n );\n\n // update last two chatLog entries, set showWorkflowExecutionLoader = false\n try {\n this.chatLog[this.chatLog.length - 1]['showWorkflowExecutionLoader'] =\n false;\n this.chatLog[this.chatLog.length - 2]['showWorkflowExecutionLoader'] =\n false;\n } catch (error) {}\n\n this.chatLog.push({\n type: 'user',\n message: input,\n time: formatNow(this.timezone),\n copied: false,\n isCollapsedTrue: false,\n showWorkflowExecutionLoader: true,\n });\n\n console.log(input);\n\n this.currentWorkflowActionProgress = 0;\n this.currentWorkflowAction =\n 'Executing ' + this.selectedWorkflow.Actions[0].Name;\n this.isChatingWithAi = true;\n this.executingWorkflow = true;\n this.workflowExecutionDetails = {\n Actions: this.selectedWorkflow.Actions,\n Inputs: this.workflowForm.value,\n workflowInputs: this.workflowForm.value,\n WorkflowName: this.selectedWorkflow.Name,\n };\n this.currentWorkflowExecutionDetails = this.workflowExecutionDetails;\n this.scrollToBottom();\n\n this.cdr.detectChanges();\n\n // execute the ask endpoint with workflow input\n this.makeAskRequest(\n input,\n this.agents,\n this.conversationKey,\n '',\n null,\n this.selectedWorkflow['_id'],\n this.workflowForm.value,\n );\n }\n }\n\n makeAskRequest(\n inputMsg: string,\n agents: any[],\n conversationId: string,\n msg?: any,\n chat?: any,\n workflowId?: string,\n workflow_inputs?: any,\n ): void {\n var url = `${this.environment.BASE_URL}/ai/ask`;\n\n var body = {\n user_question: inputMsg,\n user_id: this.userId,\n bot_id: this.botId,\n message_id: this.conversationService.generateKey(),\n session_id: this.conSessionKey,\n agents: agents?.filter((p) => p.selected).map((p) => p.id) ?? [],\n conversation_id: conversationId,\n first_name: this.firstName,\n last_name: this.lastName,\n };\n\n if (workflowId) {\n body['workflow_id'] = workflowId;\n body['workflow_inputs'] = workflow_inputs;\n }\n\n const headers: any = {\n 'Content-Type': 'application/json',\n Authorization: 'Bearer ' + this.s27Token,\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n eventUrl: this.eventUrl,\n eventToken: this.eventToken,\n };\n\n if (this.workspaceToken) {\n headers['workspaceToken'] = this.workspaceToken;\n }\n\n fetch(url, {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(body),\n })\n .then((response) => {\n if (response.status === 401 || response.status === 403) {\n this.is401 = true;\n this.refreshToken.emit();\n\n // If `msg` and `chat` exist, handle them\n if (msg && chat) {\n this.msg = msg;\n this.chat = chat;\n this.isFetchDataFor = true;\n }\n } else {\n this.is401 = false;\n }\n return response.json();\n })\n .then((data) => {\n console.log(data);\n // Additional response handling if needed\n })\n .catch((err) => {\n console.error('Error: ', err);\n this.isChatingWithAi = false;\n });\n\n this.input = '';\n this.selectedWorkflow = null;\n this.openWorkflowInput = false;\n this.isWorkflowOpen = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n }\n\n makeAskRequestold(\n inputMsg: string,\n agents: any[],\n conversationId: string,\n msg?: any,\n chat?: any,\n workflowId?: string,\n workflow_inputs?: any,\n ): void {\n const url = `${this.environment.BASE_URL}/ai/ask`;\n\n const body: any = {\n user_question: inputMsg,\n user_id: this.userId,\n bot_id: this.botId,\n message_id: this.conversationService.generateKey(),\n agents: agents?.filter((p) => p.selected).map((p) => p.id) ?? [],\n conversation_id: conversationId,\n first_name: this.firstName,\n last_name: this.lastName,\n };\n\n if (workflowId) {\n body['workflow_id'] = workflowId;\n body['workflow_inputs'] = workflow_inputs;\n }\n\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'hive-bot-id': this.botId,\n 'domain-authority': this.domainAuthorityValue,\n });\n\n this.http.post(url, body, { headers }).subscribe({\n next: (data) => {\n console.log(data);\n // Additional response handling if needed\n },\n error: (err) => {\n console.error('Error: ', err);\n this.isChatingWithAi = false;\n },\n });\n\n this.input = '';\n this.selectedWorkflow = null;\n this.openWorkflowInput = false;\n this.isWorkflowOpen = false;\n this.scrollToBottom();\n this.cdr.markForCheck();\n }\n\n generateMarkdown(title, obj) {\n // Initialize markdown with the title\n let markdown = `## ${title}\\n`;\n\n // Loop through the object and append the field names and values\n for (const [key, value] of Object.entries(obj)) {\n var key_label =\n this.selectedWorkflow.Trigger.InputSchema.find(\n (input) => input.InputId === key,\n )?.Label || key;\n markdown += `- **${key_label}**: ${value}\\n`;\n }\n\n return markdown;\n }\n\n showWorkflowHistoryDetails(workflow_id) {\n if (!workflow_id) {\n this.workflowExecutionDetails = this.currentWorkflowExecutionDetails;\n this.showWorkflowExecutionDetails = true;\n this.cdr.detectChanges();\n return;\n }\n\n this.botService.getWorkflowExecutionById(workflow_id).subscribe((res) => {\n if (res && res.Actions && Array.isArray(res.Actions)) {\n res.Actions = res.Actions.map((action) => {\n if (action.InsertTimeStamp) {\n action.InsertTimeStamp = formatTimeStamps(\n this.timezone,\n action.InsertTimeStamp,\n );\n }\n return action;\n });\n }\n\n res.InsertTimeStamp = formatTimeStamps(\n this.timezone,\n res.InsertTimeStamp,\n );\n this.workflowExecutionDetails = res;\n this.showWorkflowExecutionDetails = true;\n this.cdr.detectChanges();\n });\n }\n\n closeModal() {\n this.showWorkflowExecutionDetails = false;\n }\n\n objectToArray(obj: any): any[] {\n return Object.keys(obj).map((key) => ({ key, value: obj[key] }));\n }\n\n startNewConversation() {\n this.conversationKey = this.conversationService.getKey(this.botId, true);\n this.chatLog = [this.chatLog[0]];\n this.isChatingWithAi = false;\n this.chatSocketInitialized = false;\n setTimeout(() => {\n this.ensureChatSocket();\n }, 200);\n this.scrollToBottom();\n this.cdr.detectChanges();\n }\n\n initializeSpeechRecognizer(token: string) {\n this.speechConfig = SpeechSDK.SpeechConfig.fromAuthorizationToken(\n token,\n this.region,\n );\n const audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput();\n this.recognizer = new SpeechSDK.SpeechRecognizer(\n this.speechConfig,\n audioConfig,\n );\n\n this.recognizer.recognizing = (s, e) => {\n if (e.result.reason === SpeechSDK.ResultReason.RecognizingSpeech) {\n this.input = e.result.text;\n console.log(`Recognizing: ${e.result.text}`);\n this.cdr.markForCheck();\n }\n };\n\n this.recognizer.recognized = (s, e) => {\n if (e.result.reason === SpeechSDK.ResultReason.RecognizedSpeech) {\n this.input = e.result.text;\n console.log(`Recognized: ${e.result.text}`);\n this.toggleRecording();\n this.cdr.markForCheck();\n }\n };\n\n this.recognizer.canceled = (s, e) => {\n console.error('Canceled: ', e.errorDetails);\n };\n\n this.recognizer.sessionStopped = (s, e) => {\n console.log('Session stopped.');\n this.recognizer.stopContinuousRecognitionAsync();\n this.fetchData();\n };\n }\n\n toggleRecording() {\n this.isRecording = !this.isRecording;\n\n if (this.isRecording) {\n this.startRecognition();\n } else {\n this.stopRecognition();\n }\n }\n\n startRecognition() {\n this.recognizer.startContinuousRecognitionAsync();\n }\n\n stopRecognition() {\n this.recognizer.stopContinuousRecognitionAsync();\n }\n\n checkForCop29BotId() {\n return (\n this.botId == '66fa3f276c5d71e2717bfea8' ||\n this.botId == '671633545652dd78efec848d'\n );\n }\n\n getLatestTime(time): string {\n if (time) {\n return time;\n }\n return new Date().toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n }); // returns current time in 'shortTime' format\n }\n\n /** Used by the voice modal when opened from this drawer. */\n voiceModalConversationId: string = '';\n\n openVoiceModal(): void {\n const conversationId =\n this.conversationKey ??\n this.conversationService.getKey(this.botId, false) ??\n '';\n this.voiceModalConversationId = conversationId;\n this.setupVoiceTranscripts();\n\n // Close existing overlay if any\n if (this.voiceModalOverlayRef) {\n this.voiceModalOverlayRef.detach();\n this.voiceModalOverlayRef.dispose();\n this.voiceModalOverlayRef = null;\n }\n\n const config: VoiceModalConfig = {\n apiUrl: this.environment?.BASE_URL ?? '',\n token: this.s27Token ?? '',\n botId: this.botId ?? '',\n conversationId,\n apiKey: this.apiKey ?? '',\n eventToken: this.eventToken ?? '',\n eventUrl: this.eventUrl ?? '',\n domainAuthority: this.domainAuthorityValue ?? 'prod-lite',\n agentName: this.botName || 'AI Assistant',\n agentRole: this.botSkills || 'AI Agent Specialist',\n agentAvatar: this.botIcon,\n };\n\n const closeCallback = () => {\n if (this.voiceModalOverlayRef) {\n this.voiceModalOverlayRef.detach();\n this.voiceModalOverlayRef.dispose();\n this.voiceModalOverlayRef = null;\n }\n this.closeVoiceModal();\n };\n\n const injector = Injector.create(\n [\n { provide: VOICE_MODAL_CONFIG, useValue: config },\n { provide: VOICE_MODAL_CLOSE_CALLBACK, useValue: closeCallback },\n ],\n this.injector,\n );\n\n const overlayRef = this.overlay.create({\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay\n .position()\n .global()\n .bottom('0')\n .right('0')\n .left('0')\n .top('0'),\n });\n\n const portal = new ComponentPortal(\n VoiceAgentModalComponent,\n this.viewContainerRef,\n injector,\n );\n overlayRef.attach(portal);\n this.voiceModalOverlayRef = overlayRef;\n this.cdr.markForCheck();\n }\n\n closeVoiceModal(): void {\n if (this.voiceModalOverlayRef) {\n this.voiceModalOverlayRef.detach();\n this.voiceModalOverlayRef.dispose();\n this.voiceModalOverlayRef = null;\n }\n this.isVoiceModalOpen = false;\n this.voiceAgentService.disconnect();\n this.cdr.markForCheck();\n\n // Reload chat history when voice modal closes (same as initial load)\n this.chatLog = [];\n this.fetchChatHistory().subscribe(\n (response) => {\n this.loading = false;\n this.mapChatHistory(response);\n this.cdr.markForCheck();\n },\n (err) => {\n this.loading = false;\n this.cdr.markForCheck();\n console.error(\n 'Error fetching chat history after voice modal close:',\n err,\n );\n // Fallback: show greeting so chat is not empty\n if (this.chatLog.length === 0 && this.greetingMsg) {\n this.mapChatHistory({ Messages: [] });\n }\n },\n );\n }\n\n private setupVoiceTranscripts(): void {\n // Clear existing subscriptions\n this.voiceTranscriptSubscriptions.forEach((sub) => sub.unsubscribe());\n this.voiceTranscriptSubscriptions = [];\n\n // Subscribe to user transcripts\n const userSub = this.voiceAgentService.userTranscript$.subscribe(\n (transcript) => {\n if (transcript.final && transcript.text.trim()) {\n // Add user message to chat\n this.chatLog.push({\n type: 'user',\n message: this.processMessageForDisplay(transcript.text),\n time: formatNow(this.timezone),\n copied: false,\n isCollapsedTrue: false,\n });\n this.cdr.markForCheck();\n this.scrollToBottom();\n }\n },\n );\n\n // Subscribe to bot transcripts\n const botSub = this.voiceAgentService.botTranscript$.subscribe(\n (transcript) => {\n if (transcript && transcript.trim()) {\n // Check if last message is from bot, update it, otherwise add new\n const lastMessage = this.chatLog[this.chatLog.length - 1];\n if (lastMessage && lastMessage.type === 'ai') {\n lastMessage.message = this.processMessageForDisplay(transcript);\n } else {\n this.chatLog.push({\n type: 'ai',\n message: this.processMessageForDisplay(transcript),\n time: formatNow(this.timezone),\n copied: false,\n isCollapsedTrue: false,\n });\n this.showFeedBackIconsIndex = this.chatLog.length - 1;\n }\n this.cdr.markForCheck();\n this.scrollToBottom();\n }\n },\n );\n\n this.voiceTranscriptSubscriptions.push(userSub, botSub);\n }\n}\n\nexport { VoiceModalConfig } from '../voice-agent/voice-modal-tokens';\n","import { InjectionToken } from '@angular/core';\n\nexport interface VoiceModalConfig {\n apiUrl: string;\n token: string;\n botId: string;\n conversationId: string;\n apiKey: string;\n eventToken: string;\n eventUrl: string;\n domainAuthority: string;\n agentName: string;\n agentRole: string;\n agentAvatar?: string;\n}\n\nexport const VOICE_MODAL_CONFIG = new InjectionToken<VoiceModalConfig>('VOICE_MODAL_CONFIG');\nexport const VOICE_MODAL_CLOSE_CALLBACK = new InjectionToken<() => void>('VOICE_MODAL_CLOSE_CALLBACK');\n","import { Component, Input, OnInit, OnDestroy, Output, EventEmitter, Injector } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { VoiceAgentService, CallState } from '../../services/voice-agent.service';\nimport { AudioAnalyzerService } from '../../services/audio-analyzer.service';\nimport { VOICE_MODAL_CONFIG, VOICE_MODAL_CLOSE_CALLBACK, VoiceModalConfig } from '../../voice-modal-tokens';\n\n@Component({\n selector: 'hivegpt-voice-agent-modal',\n templateUrl: './voice-agent-modal.component.html',\n styleUrls: ['./voice-agent-modal.component.scss']\n})\nexport class VoiceAgentModalComponent implements OnInit, OnDestroy {\n @Output() close = new EventEmitter<void>();\n @Input() apiUrl!: string;\n @Input() token!: string;\n @Input() botId!: string;\n @Input() conversationId!: string;\n @Input() apiKey: string = '';\n @Input() eventToken: string = '';\n @Input() eventUrl: string = '';\n @Input() domainAuthority: string = 'prod-lite';\n @Input() agentName: string = 'AI Assistant';\n @Input() agentRole: string = 'AI Agent Specialist';\n @Input() agentAvatar?: string;\n\n private injectedConfig: VoiceModalConfig | null = null;\n private onCloseCallback: (() => void) | null = null;\n\n constructor(\n public voiceAgentService: VoiceAgentService,\n public audioAnalyzer: AudioAnalyzerService,\n private injector: Injector\n ) {}\n\n /** Hardcoded voice agent avatar (Nia). */\n readonly displayAvatarUrl = 'https://www.jotform.com/uploads/mehmetkarakasli/form_files/1564593667676a8e85f23758.86945537_icon.png';\n\n callState: CallState = 'idle';\n statusText: string = '';\n duration: string = '00:00';\n isMicMuted: boolean = false;\n isUserSpeaking: boolean = false;\n audioLevels: number[] = [];\n isSpeaking: boolean = false;\n\n /** Track whether call has transitioned out of initial connected state. */\n private hasLeftConnectedOnce: boolean = false;\n\n private subscriptions: Subscription[] = [];\n\n ngOnInit(): void {\n // When opened via Overlay, config is provided by injection\n this.injectedConfig = this.injector.get(VOICE_MODAL_CONFIG, null);\n this.onCloseCallback = this.injector.get(VOICE_MODAL_CLOSE_CALLBACK, null);\n if (this.injectedConfig) {\n this.apiUrl = this.injectedConfig.apiUrl;\n this.token = this.injectedConfig.token;\n this.botId = this.injectedConfig.botId;\n this.conversationId = this.injectedConfig.conversationId;\n this.apiKey = this.injectedConfig.apiKey ?? '';\n this.eventToken = this.injectedConfig.eventToken ?? '';\n this.eventUrl = this.injectedConfig.eventUrl ?? '';\n this.domainAuthority = this.injectedConfig.domainAuthority ?? 'prod-lite';\n this.agentName = this.injectedConfig.agentName ?? this.agentName;\n this.agentRole = this.injectedConfig.agentRole ?? this.agentRole;\n this.agentAvatar = this.injectedConfig.agentAvatar;\n }\n\n // Subscribe to observables\n this.subscriptions.push(\n this.voiceAgentService.callState$.subscribe(state => {\n this.callState = state;\n this.isSpeaking = state === 'talking';\n if (state === 'listening' || state === 'talking') {\n this.hasLeftConnectedOnce = true;\n }\n if (state === 'idle' || state === 'ended') {\n this.hasLeftConnectedOnce = false;\n }\n })\n );\n\n this.subscriptions.push(\n this.voiceAgentService.statusText$.subscribe(text => {\n this.statusText = text;\n })\n );\n\n this.subscriptions.push(\n this.voiceAgentService.duration$.subscribe(duration => {\n this.duration = duration;\n })\n );\n\n this.subscriptions.push(\n this.voiceAgentService.isMicMuted$.subscribe(muted => {\n this.isMicMuted = muted;\n })\n );\n\n this.subscriptions.push(\n this.voiceAgentService.isUserSpeaking$.subscribe(speaking => {\n this.isUserSpeaking = speaking;\n })\n );\n\n this.subscriptions.push(\n this.voiceAgentService.audioLevels$.subscribe(levels => {\n this.audioLevels = levels;\n })\n );\n\n // Modal opens in idle state, then immediately starts connecting.\n this.voiceAgentService.resetToIdle();\n void this.startCall();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach(sub => sub.unsubscribe());\n this.disconnect();\n }\n\n isConnecting: boolean = false;\n\n async startCall(): Promise<void> {\n if (this.isConnecting || (this.callState !== 'idle' && this.callState !== 'ended')) return;\n this.isConnecting = true;\n try {\n await this.voiceAgentService.connect(\n this.apiUrl,\n this.token,\n this.botId,\n this.conversationId,\n this.apiKey,\n this.eventToken,\n this.eventUrl,\n this.domainAuthority\n );\n } catch (error) {\n console.error('Failed to connect voice agent:', error);\n } finally {\n this.isConnecting = false;\n }\n }\n\n async disconnect(): Promise<void> {\n await this.voiceAgentService.disconnect();\n }\n\n toggleMic(): void {\n this.voiceAgentService.toggleMic();\n }\n\n /** Map audio level (0–100) to waveform bar height in px (3–20). */\n getWaveformHeight(level: number): number {\n const n = Math.min(100, Math.max(0, level ?? 0));\n return 3 + (n / 100) * 17;\n }\n\n /** Status label for active call. */\n get statusLabel(): string {\n if (this.callState === 'connecting') return this.statusText || 'Connecting...';\n if (this.callState === 'talking') return 'Talking...';\n if (this.callState === 'listening') return 'Listening';\n if (this.callState === 'connected') {\n return this.hasLeftConnectedOnce ? 'Talking...' : 'Connected';\n }\n return this.statusText || '';\n }\n\n /** Call Again: reset to idle then start a new call. */\n callAgain(): void {\n this.voiceAgentService.resetToIdle();\n this.startCall();\n }\n\n /** Back to Chat: close modal and disconnect. */\n backToChat(): void {\n this.endCall();\n }\n\n /** End call but keep modal open to show Call Ended + Call Again / Back to Chat. */\n hangUp(): void {\n this.disconnect();\n }\n\n endCall(): void {\n this.disconnect();\n this.onCloseCallback?.();\n this.close.emit();\n }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'hivegpt-chatbot',\n templateUrl: './chatbot.component.html',\n styleUrls: ['./chatbot.component.scss'],\n})\nexport class ChatBotComponent {\n @Input() userId!: string;\n /** Optional user profile image URL; if not set, user initials are shown in chat. */\n @Input() userAvatarUrl?: string;\n /** User's selected timezone (e.g. 'America/New_York'); used for chat timestamps and session card times. */\n @Input() timezone!: string;\n @Input() apiKey!: string;\n @Input() botName!: string;\n @Input() botSkills!: string;\n @Input() botId!: string;\n @Input() closeButtonColor!: string;\n @Input() gradientColors!: string[];\n @Input() greeting!: string;\n @Input() sendButtonColor!: string;\n @Input() useOpenAi!: boolean;\n @Input() showClose!: boolean;\n @Input() bgGradient!: string[];\n @Input() sendButtonTextColor!: string;\n @Input() fullView!: boolean;\n @Input() bgBubbleAi!: string;\n @Input() bgBubbleUser!: string;\n @Input() closeButtonbgColor!: string;\n @Input() messageTextColorAi!: string;\n @Input() messageTextColorUser!: string;\n @Input() dateTimeColor!: string;\n @Input() dateTextColor!: string;\n @Input() formFieldBgColor!: string;\n @Input() formFieldTextColor!: string;\n @Input() thumbsUpMessage!: string;\n @Input() thumbsDownMessages!: string[];\n @Input() eventName!: string;\n @Input() credentials!: [];\n @Input() unknownResponses!: [];\n @Input() rules!: string;\n @Input() eventId!: string;\n @Input() s27Token!: string;\n @Input() workspaceToken!: string;\n @Input() isDev!: boolean;\n /** Optional API base URL (e.g. ngrok). When set, chat/voice use this instead of dev/prod default. */\n @Input() baseUrl?: string;\n visible = false;\n\n toggle() {\n this.visible = !this.visible;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { VoiceAgentModalComponent } from './components/voice-agent-modal/voice-agent-modal.component';\nimport { VoiceAgentService } from './services/voice-agent.service';\nimport { AudioAnalyzerService } from './services/audio-analyzer.service';\nimport { WebSocketVoiceClientService } from './services/websocket-voice-client.service';\nimport { DailyVoiceClientService } from './services/daily-voice-client.service';\n\n/**\n * Voice agent module. Uses native WebSocket + Daily.js only.\n * Does NOT use Socket.IO or ngx-socket-io.\n */\n@NgModule({\n declarations: [\n VoiceAgentModalComponent\n ],\n imports: [\n CommonModule\n ],\n providers: [\n VoiceAgentService,\n AudioAnalyzerService,\n WebSocketVoiceClientService,\n DailyVoiceClientService\n ],\n exports: [\n VoiceAgentModalComponent\n ]\n})\nexport class VoiceAgentModule { }\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Pipe({\n name: 'safeHtml',\n})\nexport class SafeHtmlPipe implements PipeTransform {\n\n constructor(private sanitizer: DomSanitizer) {\n }\n\n transform(html): unknown {\n return html ? this.sanitizer.bypassSecurityTrustHtml(html) : '';\n }\n\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { IVideo } from '../../models/video';\nimport { DOCUMENT } from '@angular/common';\n\n@Component({\n selector: 'app-video-player',\n templateUrl: './video-player.component.html',\n styleUrls: ['./video-player.component.scss'],\n})\nexport class VideoPlayerComponent\n implements OnInit, AfterViewInit {\n @Input() currentUserId: string;\n @Input() user: any;\n @Input() eventId: string;\n @Input() videoObj: IVideo;\n @Input() isDev: boolean;\n myFollowingList: Array<string>;\n myPendingSentRequests: Array<string>;\n @Input() type: string;\n isMuted: boolean = true;\n private observer: IntersectionObserver;\n isFullscreen: boolean = false;\n @ViewChild('video') video: any;\n @ViewChild('fullscreenvideo') fullscreenvideo: any;\n isFullscreenvideoPlaying: boolean = false;\n\n @Output() connectWithUser = new EventEmitter<string>();\n @Output() scheduleMeeting = new EventEmitter<any>();\n\n constructor(\n @Inject(DOCUMENT) private doc: any,\n private el: ElementRef,\n private cdr: ChangeDetectorRef\n ) {\n }\n\n ngOnInit(): void {\n }\n\n toggleSound(isMuted = null) {\n this.isMuted = isMuted != null ? isMuted : !this.isMuted;\n setTimeout(() => {\n const video: any = this.doc\n .getElementById(this.video.id.toString());\n if (video) {\n video.muted = this.isMuted;\n this.video.isMuted = this.isMuted;\n }\n\n this.cdr.markForCheck();\n //this.muteToggle.emit(this.isMuted);\n })\n}\n\n togglePlay(playState: boolean, videoEl) {\n this.videoObj.isPlaying = !this.videoObj.isPlaying;\n setTimeout(() => { \n if (playState) { \n this.videoObj.isPlaying = true;\n videoEl.play();\n var pauseBtn = document.getElementById('pause-btn');\n pauseBtn.classList.add('hide-pause-btn');\n\n this.toggleSound(false);\n }\n else{\n this.videoObj.isPlaying = false;\n videoEl.pause();\n }\n this.cdr.markForCheck();\n })\n }\n \n ngAfterViewInit() {\n if (window.innerWidth <= 576) {\n this.observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting === true) {\n this.video.nativeElement.play();\n } else {\n this.video.nativeElement.pause();\n }\n },\n {\n threshold: 0.75,\n }\n );\n\n this.observer.observe(this.el.nativeElement as HTMLElement);\n }\n }\n\n toggleFullscreen() {\n this.isFullscreen = !this.isFullscreen;\n if (!this.isFullscreen) {\n this.fullscreenvideo.nativeElement.pause();\n }\n }\n\n toggleFullscreenPlay() {\n this.isFullscreenvideoPlaying = !this.isFullscreenvideoPlaying;\n\n if (this.isFullscreenvideoPlaying) {\n this.fullscreenvideo.nativeElement.play();\n } else {\n this.fullscreenvideo.nativeElement.pause();\n }\n }\n\n followUser(userId) {\n this.connectWithUser.emit(userId);\n }\n\n checkPendingSentRequest(userId) {\n return this.myPendingSentRequests?.find(a => a == userId);\n }\n\n canUnfollowUser() {\n return false;\n }\n\n canFollowUser() {\n return true;\n }\n\n getIniNames(firstName, lastName) {\n if(!firstName && !lastName) {\n return '';\n }\n \n if (firstName && lastName)\n return (\n firstName.charAt(0).toUpperCase() + lastName.charAt(0).toUpperCase()\n );\n else return firstName.charAt(0).toUpperCase();\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n QueryList,\n Renderer2,\n SimpleChanges,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { MatDrawer } from '@angular/material/sidenav';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { of, Subscription } from 'rxjs';\nimport { catchError, switchMap } from 'rxjs/operators';\nimport { formatNow, formatTimeStamps } from '../../utils/utils';\nimport {\n dev_environment,\n prod_environment,\n} from '../../../environments/environment';\nimport { ConversationService } from '../conversation.service';\nimport { Observable } from 'rxjs';\nimport { SocketService } from '../socket-service.service';\n\n@Component({\n selector: 'lib-bot-html-editor',\n templateUrl: './bot-html-editor.component.html',\n styleUrls: ['./bot-html-editor.component.css'],\n})\nexport class BotHtmlEditorComponent implements OnInit {\n @Input() editorContent: Observable<string>;\n @Input() isDocInEditMode: any;\n @Input() documentContent: any;\n @Input() conversationId: any;\n @Input() botId: any;\n\n documentName: any = 'doc name';\n\n environment: {\n USERS_API;\n BASE_URL;\n AGENTS_API;\n };\n\n quillConfig = {\n toolbar: [\n [{ header: '1' }, { header: '2' }, { font: [] }],\n [{ list: 'ordered' }, { list: 'bullet' }],\n ['bold', 'italic', 'underline'],\n ['link'],\n ['clean'],\n ],\n };\n constructor(private cdr: ChangeDetectorRef, private http: HttpClient) {}\n\n ngOnInit(): void {\n this.environment = prod_environment;\n\n setTimeout(() => {\n if (this.isDocInEditMode) {\n console.log('In Edit mode');\n this.filldataInForm();\n } else {\n console.log('In save mode');\n }\n }, 2500);\n }\n\n filldataInForm() {\n if (this.documentContent) {\n this.documentName = this.documentContent?.name;\n this.editorContent = this.documentContent?.content;\n this.cdr.detectChanges();\n }\n }\n\n saveContent() {\n if (!this.isDocInEditMode) {\n this.saveContent_http().subscribe();\n } else {\n this.saveContent_http().subscribe();\n }\n }\n\n saveContent_http() {\n console.log('API call function');\n\n const url = `${this.environment.AGENTS_API}/ConversationDocuments?conversationId=${this.conversationId}&botId=${this.botId}`;\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: 'WIz/qAm+EEmfOkFaUA/weA==',\n });\n\n let data = {\n name: this.documentName,\n content: this.editorContent,\n };\n\n return this.http.post(url, data, { headers }).pipe(\n switchMap((res: any) => {\n if (res) {\n // alert('Saved Successfully');\n }\n this.cdr.markForCheck();\n\n return of(res);\n }),\n catchError((error) => {\n console.error('Error fetching chatbot config: ', error);\n\n return of(null);\n })\n );\n }\n\n updateContent_http() {\n console.log('API call function');\n\n const url = `${this.environment.AGENTS_API}/ConversationDocuments/rename?conversationId=${this.conversationId}&botId=${this.botId}`;\n const headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n apiKey: 'WIz/qAm+EEmfOkFaUA/weA==',\n });\n\n let data = {\n name: this.documentName,\n content: this.editorContent,\n };\n\n return this.http.put(url, data, { headers }).pipe(\n switchMap((res: any) => {\n if (res) {\n // alert('Updated Successfully');\n }\n this.cdr.markForCheck();\n\n return of(res);\n }),\n catchError((error) => {\n console.error('Error fetching chatbot config: ', error);\n\n return of(null);\n })\n );\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { ChatDrawerComponent } from './components/chat-drawer/chat-drawer.component';\nimport { ChatBotComponent } from './components/chatbot/chatbot.component';\nimport { SafeHtmlPipe } from './pipes/safe-html.pipe';\nimport { VideoPlayerComponent } from './components/video-player/video-player.component';\nimport { QuillModule } from 'ngx-quill';\nimport { BotHtmlEditorComponent } from './components/bot-html-editor/bot-html-editor.component';\nimport { VoiceAgentModule } from './components/voice-agent/voice-agent.module';\n\n@NgModule({\n declarations: [ChatBotComponent, ChatDrawerComponent, VideoPlayerComponent, SafeHtmlPipe, BotHtmlEditorComponent],\n imports: [CommonModule, OverlayModule, MatIconModule, MatSidenavModule, FormsModule, ReactiveFormsModule, QuillModule, VoiceAgentModule],\n exports: [ChatBotComponent, ChatDrawerComponent, VideoPlayerComponent]\n})\nexport class HiveGptModule { }\n"],"mappings":"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","ignoreList":[]}