From 1b881c4c086381d2b072be990a72f5eb9fcd262e Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Thu, 16 Apr 2026 09:40:32 -0700 Subject: [PATCH 1/2] Update Resources --- README.md | 3 +- .../docs/core/getting-started-aspnet.md | 3 +- .../docs/getting-started.md | 3 +- .../Assets/css/chat-widget.css | 65 +- .../Assets/js/ai-chat.js | 458 +++++++++- .../Assets/js/chat-interaction.js | 39 +- .../CrestApps.AI.Resources/package.json | 2 +- .../wwwroot/scripts/ai-chat.js | 846 +++++++++++++----- .../wwwroot/scripts/ai-chat.js.map | 2 +- .../wwwroot/scripts/ai-chat.min.js | 2 +- .../wwwroot/scripts/ai-chat.min.js.map | 2 +- .../wwwroot/scripts/chat-interaction.js | 38 +- .../wwwroot/scripts/chat-interaction.js.map | 2 +- .../wwwroot/scripts/chat-interaction.min.js | 2 +- .../scripts/chat-interaction.min.js.map | 2 +- .../wwwroot/styles/chat-widget.css | 65 +- .../wwwroot/styles/chat-widget.css.map | 2 +- .../wwwroot/styles/chat-widget.min.css | 2 +- 18 files changed, 1250 insertions(+), 288 deletions(-) diff --git a/README.md b/README.md index 59f53a7b..625e3053 100644 --- a/README.md +++ b/README.md @@ -101,8 +101,7 @@ By default, provider connections are loaded from `CrestApps:AI:Connections` and "Name": "gpt-4.1", "ClientName": "OpenAI", "ModelName": "gpt-4.1", - "Type": "Chat", - "IsDefault": true + "Type": "Chat" } ] } diff --git a/src/CrestApps.Core.Docs/docs/core/getting-started-aspnet.md b/src/CrestApps.Core.Docs/docs/core/getting-started-aspnet.md index 8786cdc9..5a8fd483 100644 --- a/src/CrestApps.Core.Docs/docs/core/getting-started-aspnet.md +++ b/src/CrestApps.Core.Docs/docs/core/getting-started-aspnet.md @@ -75,8 +75,7 @@ At minimum, provide a connection and a deployment through configuration or your "Name": "gpt-4.1", "ClientName": "OpenAI", "Type": "Chat", - "ModelName": "gpt-4.1", - "IsDefault": true + "ModelName": "gpt-4.1" } ] } diff --git a/src/CrestApps.Core.Docs/docs/getting-started.md b/src/CrestApps.Core.Docs/docs/getting-started.md index d1e6447f..33eb09a1 100644 --- a/src/CrestApps.Core.Docs/docs/getting-started.md +++ b/src/CrestApps.Core.Docs/docs/getting-started.md @@ -113,8 +113,7 @@ By default: "Name": "gpt-4.1", "ClientName": "OpenAI", "ModelName": "gpt-4.1", - "Type": "Chat", - "IsDefault": true + "Type": "Chat" } ] } diff --git a/src/Resources/CrestApps.AI.Resources/Assets/css/chat-widget.css b/src/Resources/CrestApps.AI.Resources/Assets/css/chat-widget.css index 0d70246b..4bc953dc 100644 --- a/src/Resources/CrestApps.AI.Resources/Assets/css/chat-widget.css +++ b/src/Resources/CrestApps.AI.Resources/Assets/css/chat-widget.css @@ -45,6 +45,14 @@ overflow: hidden; } +.ai-chat-widget-container.ai-chat-widget-resizable { + resize: both; + min-width: 320px; + min-height: 420px; + max-width: min(90vw, 960px); + max-height: min(90vh, 960px); +} + .ai-chat-widget-container.open { display: flex; } @@ -58,6 +66,31 @@ color: white; } +.ai-chat-widget-header.ai-chat-widget-drag-handle { + cursor: move; + user-select: none; + touch-action: none; +} + +.ai-chat-widget-header-actions { + display: flex; + align-items: center; + gap: 0.15rem; +} + +.ai-chat-widget-toggle.ai-chat-widget-draggable { + touch-action: none; +} + +.ai-chat-widget-container.ai-chat-widget-dragging, +.ai-chat-widget-toggle.ai-chat-widget-dragging { + transition: none; +} + +.ai-chat-widget-toggle.ai-chat-widget-dragging:hover { + transform: none; +} + .ai-chat-widget-header .title { font-weight: 600; font-size: 0.95rem; @@ -140,7 +173,7 @@ .ai-chat-widget-messages .ai-chat-message-body { position: relative; - padding: 0 0 0.25rem 0; + padding: 0; overflow-wrap: break-word; word-break: break-word; min-width: 0; @@ -153,17 +186,22 @@ /* ── Message action buttons (copy, thumbs up/down) ── */ .ai-chat-widget-messages .message-buttons-container { position: absolute; - right: 0; - top: 0; + right: 0.1rem; + bottom: 0; display: inline-flex; + align-items: center; gap: 0.35rem; + width: auto; + max-width: max-content; opacity: 0; pointer-events: none; transition: opacity 0.15s ease-in-out; - background: #fff; - padding: 0.15rem 0.35rem; - border-radius: 4px; + background: rgba(255, 255, 255, 0.96); + padding: 0.2rem 0.35rem; + border-radius: 999px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); + margin-bottom: 1rem; + transform: translateY(50%); z-index: 1; } @@ -174,10 +212,25 @@ } .ai-chat-widget-messages .message-buttons-container > .button-message-toolbox { + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + width: 1.75rem; + height: 1.75rem; + margin: 0 !important; + padding: 0 !important; + border-radius: 50%; color: var(--bs-secondary-color, #6c757d) !important; text-decoration: none; } +.ai-chat-widget-messages .message-buttons-container .ai-chat-message-assistant-feedback { + display: inline-flex; + align-items: center; + gap: 0.35rem; +} + .ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:hover, .ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:focus { color: var(--bs-body-color, #212529) !important; diff --git a/src/Resources/CrestApps.AI.Resources/Assets/js/ai-chat.js b/src/Resources/CrestApps.AI.Resources/Assets/js/ai-chat.js index d47c96c4..b8b377b1 100644 --- a/src/Resources/CrestApps.AI.Resources/Assets/js/ai-chat.js +++ b/src/Resources/CrestApps.AI.Resources/Assets/js/ai-chat.js @@ -14,6 +14,24 @@ window.openAIChatManager = function () { thumbsDownTitle: 'Thumbs down', copyTitle: 'Click here to copy response to clipboard.', codeCopiedText: 'Copied!', + widget: { + chatWidgetContainer: null, + chatWidgetStateName: null, + chatHistorySection: null, + showHistoryButton: null, + closeHistoryButton: null, + newChatButton: null, + toggleButtonSelector: null, + resetSizeButtonSelector: null, + dragHandleSelector: '.ai-chat-widget-header', + enableDragging: true, + enableResizing: true, + persistLayout: true, + defaultWidth: null, + defaultHeight: null, + minWidth: 320, + minHeight: 420 + }, messageTemplate: `
@@ -37,7 +55,7 @@ window.openAIChatManager = function () { -
-
+

{{ message.title }}

- \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n \n ", + widget: { + chatWidgetContainer: null, + chatWidgetStateName: null, + chatHistorySection: null, + showHistoryButton: null, + closeHistoryButton: null, + newChatButton: null, + toggleButtonSelector: null, + resetSizeButtonSelector: null, + dragHandleSelector: '.ai-chat-widget-header', + enableDragging: true, + enableResizing: true, + persistLayout: true, + defaultWidth: null, + defaultHeight: null, + minWidth: 320, + minHeight: 420 + }, + messageTemplate: "\n
\n
\n
\n
{{ userLabel }}
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n ", indicatorTemplate: "\n
\n \n Assistant\n
\n " }; @@ -54,6 +72,19 @@ window.openAIChatManager = function () { span.textContent = text; return span.innerHTML; } + function parsePixelValue(value) { + if (typeof value === 'number' && Number.isFinite(value)) { + return value; + } + if (typeof value !== 'string') { + return null; + } + var parsed = parseFloat(value); + return Number.isFinite(parsed) ? parsed : null; + } + function clamp(value, min, max) { + return Math.min(Math.max(value, min), max); + } function normalizeReference(reference) { var _ref, _normalized$index, _ref2, _normalized$text, _ref3, _normalized$link; if (!reference || _typeof(reference) !== 'object') { @@ -330,6 +361,8 @@ window.openAIChatManager = function () { } var initialize = function initialize(instanceConfig) { var config = Object.assign({}, defaultConfig, instanceConfig); + config.widget = Object.assign({}, defaultConfig.widget || {}, instanceConfig && instanceConfig.widget ? instanceConfig.widget : {}); + var hasWidgetConfig = !!(instanceConfig && instanceConfig.widget && instanceConfig.widget.chatWidgetContainer && instanceConfig.widget.chatWidgetStateName); // Keep defaultConfig in sync so renderers use overridden values defaultConfig = config; if (!config.signalRHubUrl) { @@ -363,7 +396,15 @@ window.openAIChatManager = function () { isPlaceholderVisible: true, chatWidgetStateName: null, chatWidgetStateSession: null, + chatWidgetLayoutKey: null, chatHistorySection: null, + widgetContainerElement: null, + widgetToggleButtonElement: null, + widgetResetSizeButtonElement: null, + widgetResizeObserver: null, + widgetViewportResizeHandler: null, + widgetDefaultWidth: null, + widgetDefaultHeight: null, widgetIsInitialized: false, isStreaming: false, isNavigatingAway: false, @@ -394,9 +435,11 @@ window.openAIChatManager = function () { audioPlayQueue: [], isPlayingAudio: false, currentAudioElement: null, + currentAudioUrl: null, ttsButton: null, ttsPlayingMessageIndex: -1, ttsAudioCache: {}, + ttsInstanceId: 'ai-chat-' + Math.random().toString(36).slice(2), singleResponseMode: !!config.singleResponseMode, conversationModeEnabled: config.chatMode === 'Conversation', conversationButton: null, @@ -418,6 +461,255 @@ window.openAIChatManager = function () { handleBeforeUnload: function handleBeforeUnload() { this.isNavigatingAway = true; }, + getStoredWidgetLayout: function getStoredWidgetLayout() { + if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) { + return {}; + } + try { + var storedLayout = localStorage.getItem(this.chatWidgetLayoutKey); + return storedLayout ? JSON.parse(storedLayout) || {} : {}; + } catch (error) { + console.warn('Failed to read widget layout state.', error); + return {}; + } + }, + saveStoredWidgetLayout: function saveStoredWidgetLayout(partialLayout) { + if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) { + return; + } + var currentLayout = this.getStoredWidgetLayout(); + var nextLayout = Object.assign({}, currentLayout); + if (partialLayout.panel !== undefined) { + nextLayout.panel = Object.assign({}, currentLayout.panel || {}, partialLayout.panel || {}); + } + if (partialLayout.toggle !== undefined) { + nextLayout.toggle = Object.assign({}, currentLayout.toggle || {}, partialLayout.toggle || {}); + } + localStorage.setItem(this.chatWidgetLayoutKey, JSON.stringify(nextLayout)); + }, + getElementSize: function getElementSize(element, fallbackWidth, fallbackHeight) { + if (!element) { + return { + width: fallbackWidth || 0, + height: fallbackHeight || 0 + }; + } + var rect = element.getBoundingClientRect(); + var computed = window.getComputedStyle(element); + return { + width: Math.round(rect.width || parsePixelValue(computed.width) || fallbackWidth || 0), + height: Math.round(rect.height || parsePixelValue(computed.height) || fallbackHeight || 0) + }; + }, + clampWidgetPosition: function clampWidgetPosition(left, top, width, height) { + var viewportPadding = 8; + var maxLeft = Math.max(viewportPadding, window.innerWidth - width - viewportPadding); + var maxTop = Math.max(viewportPadding, window.innerHeight - height - viewportPadding); + return { + left: Math.round(clamp(left, viewportPadding, maxLeft)), + top: Math.round(clamp(top, viewportPadding, maxTop)) + }; + }, + applyAbsolutePosition: function applyAbsolutePosition(element, left, top) { + if (!element) { + return; + } + element.style.left = left + 'px'; + element.style.top = top + 'px'; + element.style.right = 'auto'; + element.style.bottom = 'auto'; + }, + getWidgetDefaultSize: function getWidgetDefaultSize() { + return { + width: this.widgetDefaultWidth || parsePixelValue(config.widget.defaultWidth) || 380, + height: this.widgetDefaultHeight || parsePixelValue(config.widget.defaultHeight) || 520 + }; + }, + persistWidgetPanelPosition: function persistWidgetPanelPosition() { + if (!this.widgetContainerElement || !config.widget.persistLayout) { + return; + } + var panelRect = this.widgetContainerElement.getBoundingClientRect(); + this.saveStoredWidgetLayout({ + panel: { + left: Math.round(panelRect.left), + top: Math.round(panelRect.top) + } + }); + }, + persistWidgetTogglePosition: function persistWidgetTogglePosition() { + if (!this.widgetToggleButtonElement || !config.widget.persistLayout) { + return; + } + var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect(); + this.saveStoredWidgetLayout({ + toggle: { + left: Math.round(toggleRect.left), + top: Math.round(toggleRect.top) + } + }); + }, + persistWidgetPanelSize: function persistWidgetPanelSize() { + if (!this.widgetContainerElement || !config.widget.enableResizing || !config.widget.persistLayout) { + return; + } + var defaultSize = this.getWidgetDefaultSize(); + var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height); + this.saveStoredWidgetLayout({ + panel: { + width: Math.abs(currentSize.width - defaultSize.width) <= 1 ? null : currentSize.width, + height: Math.abs(currentSize.height - defaultSize.height) <= 1 ? null : currentSize.height + } + }); + }, + updateWidgetResetSizeButtonVisibility: function updateWidgetResetSizeButtonVisibility() { + if (!this.widgetResetSizeButtonElement) { + return; + } + if (!config.widget.enableResizing || !this.widgetContainerElement) { + this.widgetResetSizeButtonElement.classList.add('d-none'); + return; + } + var defaultSize = this.getWidgetDefaultSize(); + var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height); + var isResized = Math.abs(currentSize.width - defaultSize.width) > 1 || Math.abs(currentSize.height - defaultSize.height) > 1 || !!this.widgetContainerElement.style.width || !!this.widgetContainerElement.style.height; + this.widgetResetSizeButtonElement.classList.toggle('d-none', !isResized); + }, + resetWidgetSize: function resetWidgetSize() { + if (!this.widgetContainerElement || !config.widget.enableResizing) { + return; + } + this.widgetContainerElement.style.removeProperty('width'); + this.widgetContainerElement.style.removeProperty('height'); + this.persistWidgetPanelSize(); + this.constrainWidgetElementsToViewport(); + this.updateWidgetResetSizeButtonVisibility(); + }, + restoreWidgetLayout: function restoreWidgetLayout() { + var storedLayout = this.getStoredWidgetLayout(); + if (this.widgetContainerElement && config.widget.enableResizing) { + if (Number.isFinite(storedLayout.panel && storedLayout.panel.width)) { + this.widgetContainerElement.style.width = storedLayout.panel.width + 'px'; + } else { + this.widgetContainerElement.style.removeProperty('width'); + } + if (Number.isFinite(storedLayout.panel && storedLayout.panel.height)) { + this.widgetContainerElement.style.height = storedLayout.panel.height + 'px'; + } else { + this.widgetContainerElement.style.removeProperty('height'); + } + } + if (this.widgetContainerElement && config.widget.enableDragging && Number.isFinite(storedLayout.panel && storedLayout.panel.left) && Number.isFinite(storedLayout.panel && storedLayout.panel.top)) { + this.applyAbsolutePosition(this.widgetContainerElement, storedLayout.panel.left, storedLayout.panel.top); + } + if (this.widgetToggleButtonElement && config.widget.enableDragging && Number.isFinite(storedLayout.toggle && storedLayout.toggle.left) && Number.isFinite(storedLayout.toggle && storedLayout.toggle.top)) { + this.applyAbsolutePosition(this.widgetToggleButtonElement, storedLayout.toggle.left, storedLayout.toggle.top); + } + this.constrainWidgetElementsToViewport(); + this.updateWidgetResetSizeButtonVisibility(); + }, + attachDraggableWidgetElement: function attachDraggableWidgetElement(element, handle, layoutKey, suppressClickOnDrag) { + var _this = this; + if (!element || !handle || !config.widget.enableDragging) { + return; + } + var activePointerId = null; + var startX = 0; + var startY = 0; + var startLeft = 0; + var startTop = 0; + var dragged = false; + var dragThreshold = 4; + var interactiveSelector = 'button, a, input, textarea, select, option, label'; + var _stopDragging = function stopDragging(event) { + if (activePointerId === null) { + return; + } + if (event && event.pointerId !== undefined && event.pointerId !== activePointerId) { + return; + } + document.removeEventListener('pointermove', onPointerMove); + document.removeEventListener('pointerup', _stopDragging); + document.removeEventListener('pointercancel', _stopDragging); + element.classList.remove('ai-chat-widget-dragging'); + activePointerId = null; + if (!dragged) { + return; + } + if (layoutKey === 'panel') { + _this.persistWidgetPanelPosition(); + } else if (layoutKey === 'toggle') { + _this.persistWidgetTogglePosition(); + } + if (suppressClickOnDrag) { + element.dataset.dragSuppressClick = 'true'; + window.setTimeout(function () { + if (element.dataset.dragSuppressClick === 'true') { + element.dataset.dragSuppressClick = 'false'; + } + }, 0); + } + }; + var onPointerMove = function onPointerMove(event) { + if (activePointerId === null || event.pointerId !== activePointerId) { + return; + } + var deltaX = event.clientX - startX; + var deltaY = event.clientY - startY; + if (!dragged && Math.hypot(deltaX, deltaY) < dragThreshold) { + return; + } + dragged = true; + var defaultSize = _this.getWidgetDefaultSize(); + var currentSize = _this.getElementSize(element, layoutKey === 'panel' ? defaultSize.width : 52, layoutKey === 'panel' ? defaultSize.height : 52); + var nextPosition = _this.clampWidgetPosition(startLeft + deltaX, startTop + deltaY, currentSize.width, currentSize.height); + _this.applyAbsolutePosition(element, nextPosition.left, nextPosition.top); + }; + handle.addEventListener('pointerdown', function (event) { + if (event.button !== 0) { + return; + } + if (layoutKey === 'panel' && event.target.closest(interactiveSelector)) { + return; + } + var rect = element.getBoundingClientRect(); + startX = event.clientX; + startY = event.clientY; + startLeft = rect.left; + startTop = rect.top; + dragged = false; + activePointerId = event.pointerId; + element.classList.add('ai-chat-widget-dragging'); + if (handle.setPointerCapture) { + handle.setPointerCapture(event.pointerId); + } + document.addEventListener('pointermove', onPointerMove); + document.addEventListener('pointerup', _stopDragging); + document.addEventListener('pointercancel', _stopDragging); + event.preventDefault(); + }); + }, + constrainWidgetElementsToViewport: function constrainWidgetElementsToViewport() { + if (this.widgetContainerElement && this.widgetContainerElement.style.left) { + var panelDefaultSize = this.getWidgetDefaultSize(); + var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height); + var panelRect = this.widgetContainerElement.getBoundingClientRect(); + var clampedPanel = this.clampWidgetPosition(panelRect.left, panelRect.top, panelSize.width, panelSize.height); + this.applyAbsolutePosition(this.widgetContainerElement, clampedPanel.left, clampedPanel.top); + if (config.widget.persistLayout) { + this.persistWidgetPanelPosition(); + } + } + if (this.widgetToggleButtonElement && this.widgetToggleButtonElement.style.left) { + var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52); + var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect(); + var clampedToggle = this.clampWidgetPosition(toggleRect.left, toggleRect.top, toggleSize.width, toggleSize.height); + this.applyAbsolutePosition(this.widgetToggleButtonElement, clampedToggle.left, clampedToggle.top); + if (config.widget.persistLayout) { + this.persistWidgetTogglePosition(); + } + } + }, handleDragOver: function handleDragOver(e) { if (!config.sessionDocumentsEnabled) return; e.preventDefault(); @@ -458,7 +750,7 @@ window.openAIChatManager = function () { e.target.value = ''; }, uploadFiles: function uploadFiles(files) { - var _this = this; + var _this2 = this; return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { var sessionId, profileId, formData, i, response, errorText, uploadError, result, j, _t; return _regenerator().w(function (_context) { @@ -470,8 +762,8 @@ window.openAIChatManager = function () { } return _context.a(2); case 1: - sessionId = _this.getSessionId(); - profileId = _this.getProfileId(); + sessionId = _this2.getSessionId(); + profileId = _this2.getProfileId(); if (!(!sessionId && !profileId)) { _context.n = 2; break; @@ -479,9 +771,9 @@ window.openAIChatManager = function () { console.warn('Cannot upload documents without a session or profile.'); return _context.a(2); case 2: - _this.isUploading = true; - _this.uploadErrors = []; - _this.renderDocumentBar(); + _this2.isUploading = true; + _this2.uploadErrors = []; + _this2.renderDocumentBar(); _context.p = 3; formData = new FormData(); if (sessionId) { @@ -507,9 +799,9 @@ window.openAIChatManager = function () { return response.text(); case 5: errorText = _context.v; - uploadError = _this.extractReadableErrorMessage(errorText, 'Upload failed. Please try again.'); + uploadError = _this2.extractReadableErrorMessage(errorText, 'Upload failed. Please try again.'); console.error('Upload failed:', errorText); - _this.uploadErrors = [{ + _this2.uploadErrors = [{ fileName: '', error: uploadError }]; @@ -521,15 +813,15 @@ window.openAIChatManager = function () { result = _context.v; // If the server created a new session, initialize it. if (result.sessionId && !sessionId) { - _this.initializeSession(result.sessionId); + _this2.initializeSession(result.sessionId); } if (result.uploaded && result.uploaded.length > 0) { for (j = 0; j < result.uploaded.length; j++) { - _this.documents.push(result.uploaded[j]); + _this2.documents.push(result.uploaded[j]); } } if (result.failed && result.failed.length > 0) { - _this.uploadErrors = result.failed; + _this2.uploadErrors = result.failed; } _context.n = 9; break; @@ -537,14 +829,14 @@ window.openAIChatManager = function () { _context.p = 8; _t = _context.v; console.error('Upload error:', _t); - _this.uploadErrors = [{ + _this2.uploadErrors = [{ fileName: '', error: 'Upload failed. Please try again.' }]; case 9: _context.p = 9; - _this.isUploading = false; - _this.renderDocumentBar(); + _this2.isUploading = false; + _this2.renderDocumentBar(); return _context.f(9); case 10: return _context.a(2); @@ -553,7 +845,7 @@ window.openAIChatManager = function () { }))(); }, removeDocument: function removeDocument(doc) { - var _this2 = this; + var _this3 = this; return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() { var sessionId, response, idx, errorText, removeError, _t2; return _regenerator().w(function (_context2) { @@ -566,7 +858,7 @@ window.openAIChatManager = function () { return _context2.a(2); case 1: _context2.p = 1; - sessionId = _this2.getSessionId(); + sessionId = _this3.getSessionId(); _context2.n = 2; return fetch(config.removeDocumentUrl, { method: 'POST', @@ -584,8 +876,8 @@ window.openAIChatManager = function () { _context2.n = 3; break; } - idx = _this2.documents.indexOf(doc); - if (idx > -1) _this2.documents.splice(idx, 1); + idx = _this3.documents.indexOf(doc); + if (idx > -1) _this3.documents.splice(idx, 1); _context2.n = 5; break; case 3: @@ -593,13 +885,13 @@ window.openAIChatManager = function () { return response.text(); case 4: errorText = _context2.v; - removeError = _this2.extractReadableErrorMessage(errorText, 'Failed to remove document. Please try again.'); + removeError = _this3.extractReadableErrorMessage(errorText, 'Failed to remove document. Please try again.'); console.error('Failed to remove document:', response.status, errorText); - _this2.uploadErrors = [{ + _this3.uploadErrors = [{ fileName: doc.fileName || '', error: removeError }]; - _this2.renderDocumentBar(); + _this3.renderDocumentBar(); case 5: _context2.n = 7; break; @@ -607,11 +899,11 @@ window.openAIChatManager = function () { _context2.p = 6; _t2 = _context2.v; console.error('Remove document error:', _t2); - _this2.uploadErrors = [{ + _this3.uploadErrors = [{ fileName: doc.fileName || '', error: 'Failed to remove document. Please try again.' }]; - _this2.renderDocumentBar(); + _this3.renderDocumentBar(); case 7: return _context2.a(2); } @@ -781,139 +1073,139 @@ window.openAIChatManager = function () { return !!message && message.isStreaming && index === this.lastAssistantIndex && !(appearance && appearance.disableStreamingAnimation); }, startConnection: function startConnection() { - var _this3 = this; + var _this4 = this; return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() { var _t3; return _regenerator().w(function (_context3) { while (1) switch (_context3.p = _context3.n) { case 0: - _this3.connection = new signalR.HubConnectionBuilder().withUrl(config.signalRHubUrl).withAutomaticReconnect().build(); + _this4.connection = new signalR.HubConnectionBuilder().withUrl(config.signalRHubUrl).withAutomaticReconnect().build(); // Allow long-running operations (e.g., multi-step MCP tool calls) // without the client disconnecting prematurely. - _this3.connection.serverTimeoutInMilliseconds = 600000; - _this3.connection.keepAliveIntervalInMilliseconds = 15000; - _this3.connection.on("LoadSession", function (data) { + _this4.connection.serverTimeoutInMilliseconds = 600000; + _this4.connection.keepAliveIntervalInMilliseconds = 15000; + _this4.connection.on("LoadSession", function (data) { var _data$messages; - _this3.initializeSession(data.sessionId, true); - _this3.messages = []; - _this3.documents = data.documents || []; + _this4.initializeSession(data.sessionId, true); + _this4.messages = []; + _this4.documents = data.documents || []; ((_data$messages = data.messages) !== null && _data$messages !== void 0 ? _data$messages : []).forEach(function (msg) { - _this3.addMessage(msg); - _this3.$nextTick(function () { + _this4.addMessage(msg); + _this4.$nextTick(function () { renderChartsInMessage(msg); }); }); // Update feedback icons in the DOM after all messages have rendered. - _this3.$nextTick(function () { - _this3.refreshAllFeedbackIcons(); + _this4.$nextTick(function () { + _this4.refreshAllFeedbackIcons(); }); // When the session is new (no messages) and an initial prompt is configured, // automatically send it as the first user message to trigger an AI response. - if (_this3.messages.length === 0 && config.initialPrompt) { - _this3.prompt = config.initialPrompt; - _this3.sendMessage(); + if (_this4.messages.length === 0 && config.initialPrompt) { + _this4.prompt = config.initialPrompt; + _this4.sendMessage(); } }); - _this3.connection.on("ReceiveError", function (error) { + _this4.connection.on("ReceiveError", function (error) { console.error("SignalR Error: ", error); - if (_this3.isRecording) { - _this3.stopRecording(); + if (_this4.isRecording) { + _this4.stopRecording(); } // If this is a widget with a stale cached session (e.g., profile was deleted), // clear the cached session and start fresh with the current profile. - if (_this3.widgetIsInitialized && !_this3.isSessionStarted && !_this3._attemptedSessionRecovery) { - _this3._attemptedSessionRecovery = true; - localStorage.removeItem(_this3.chatWidgetStateSession); - _this3.startNewSession(); + if (_this4.widgetIsInitialized && !_this4.isSessionStarted && !_this4._attemptedSessionRecovery) { + _this4._attemptedSessionRecovery = true; + localStorage.removeItem(_this4.chatWidgetStateSession); + _this4.startNewSession(); } }); - _this3.connection.on("MessageRated", function (messageId, userRating) { - var msg = _this3.messages.find(function (m) { + _this4.connection.on("MessageRated", function (messageId, userRating) { + var msg = _this4.messages.find(function (m) { return m.id === messageId; }); if (msg) { msg.userRating = userRating; } }); - _this3.connection.on("ReceiveTranscript", function (sessionId, text, isFinal) { - if (_this3.isConversationMode) { + _this4.connection.on("ReceiveTranscript", function (sessionId, text, isFinal) { + if (_this4.isConversationMode) { if (!isFinal && text) { - _this3._conversationPartialTranscript = text; + _this4._conversationPartialTranscript = text; var escaped = text.replace(/&/g, '&').replace(//g, '>'); var html = '

' + escaped + '

'; // Show partial transcript as a live user message. - if (!_this3._conversationPartialMessage) { - _this3.hidePlaceholder(); - _this3._conversationPartialMessage = { + if (!_this4._conversationPartialMessage) { + _this4.hidePlaceholder(); + _this4._conversationPartialMessage = { role: 'user', content: text, htmlContent: html, isPartial: true }; - _this3.messages.push(_this3._conversationPartialMessage); + _this4.messages.push(_this4._conversationPartialMessage); } else { - _this3._conversationPartialMessage.content = text; - _this3._conversationPartialMessage.htmlContent = html; + _this4._conversationPartialMessage.content = text; + _this4._conversationPartialMessage.htmlContent = html; } - _this3.scrollToBottom(); + _this4.scrollToBottom(); } return; } - if (text && !_this3._audioInputSent) { - _this3.prompt = _this3.preRecordingPrompt + text; - if (_this3.inputElement) { - _this3.inputElement.value = _this3.prompt; - _this3.inputElement.dispatchEvent(new Event('input')); + if (text && !_this4._audioInputSent) { + _this4.prompt = _this4.preRecordingPrompt + text; + if (_this4.inputElement) { + _this4.inputElement.value = _this4.prompt; + _this4.inputElement.dispatchEvent(new Event('input')); } } }); - _this3.connection.on("ReceiveConversationUserMessage", function (sessionId, text) { + _this4.connection.on("ReceiveConversationUserMessage", function (sessionId, text) { if (text) { - _this3.stopAudio(); + _this4.stopAudio(); // If there's an interrupted assistant message still streaming, // mark it as done to stop the spinner animation. - if (_this3._conversationAssistantMessage) { - var oldMsg = _this3.messages[_this3._conversationAssistantMessage.index]; + if (_this4._conversationAssistantMessage) { + var oldMsg = _this4.messages[_this4._conversationAssistantMessage.index]; if (oldMsg) { oldMsg.isStreaming = false; } - _this3._conversationAssistantMessage = null; + _this4._conversationAssistantMessage = null; } // Replace the partial transcript message with the final one. - if (_this3._conversationPartialMessage) { + if (_this4._conversationPartialMessage) { var escaped = text.replace(/&/g, '&').replace(//g, '>'); - _this3._conversationPartialMessage.content = text; - _this3._conversationPartialMessage.htmlContent = '

' + escaped + '

'; - _this3._conversationPartialMessage.isPartial = false; - _this3._conversationPartialMessage = null; + _this4._conversationPartialMessage.content = text; + _this4._conversationPartialMessage.htmlContent = '

' + escaped + '

'; + _this4._conversationPartialMessage.isPartial = false; + _this4._conversationPartialMessage = null; } else { - _this3.addMessage({ + _this4.addMessage({ role: 'user', content: text }); } - _this3.scrollToBottom(); + _this4.scrollToBottom(); } }); - _this3.connection.on("ReceiveConversationAssistantToken", function (sessionId, messageId, token, responseId, appearance) { - if (!_this3._conversationAssistantMessage) { - _this3.stopAudio(); - _this3.hideTypingIndicator(); + _this4.connection.on("ReceiveConversationAssistantToken", function (sessionId, messageId, token, responseId, appearance) { + if (!_this4._conversationAssistantMessage) { + _this4.stopAudio(); + _this4.hideTypingIndicator(); // Ensure no stale streaming indicators remain from prior messages. - for (var j = 0; j < _this3.messages.length; j++) { - if (_this3.messages[j].isStreaming) { - _this3.messages[j].isStreaming = false; + for (var j = 0; j < _this4.messages.length; j++) { + if (_this4.messages[j].isStreaming) { + _this4.messages[j].isStreaming = false; } } - var msgIndex = _this3.messages.length; + var msgIndex = _this4.messages.length; var newMessage = { id: messageId, role: "assistant", @@ -921,72 +1213,72 @@ window.openAIChatManager = function () { htmlContent: "", isStreaming: true, userRating: null, - appearance: _this3.normalizeAssistantAppearance(appearance) + appearance: _this4.normalizeAssistantAppearance(appearance) }; - _this3.messages.push(newMessage); - _this3._conversationAssistantMessage = { + _this4.messages.push(newMessage); + _this4._conversationAssistantMessage = { index: msgIndex, content: '' }; } - _this3._conversationAssistantMessage.content += token; - var msg = _this3.messages[_this3._conversationAssistantMessage.index]; + _this4._conversationAssistantMessage.content += token; + var msg = _this4.messages[_this4._conversationAssistantMessage.index]; if (msg) { if (!msg.appearance) { - msg.appearance = _this3.normalizeAssistantAppearance(appearance); + msg.appearance = _this4.normalizeAssistantAppearance(appearance); } - msg.content = _this3._conversationAssistantMessage.content; + msg.content = _this4._conversationAssistantMessage.content; msg.htmlContent = parseMarkdownContent(msg.content, msg); - _this3.$nextTick(function () { + _this4.$nextTick(function () { renderChartsInMessage(msg); - _this3.scrollToBottom(); + _this4.scrollToBottom(); }); } }); - _this3.connection.on("ReceiveConversationAssistantComplete", function (sessionId, messageId) { - if (_this3._conversationAssistantMessage) { - var msg = _this3.messages[_this3._conversationAssistantMessage.index]; + _this4.connection.on("ReceiveConversationAssistantComplete", function (sessionId, messageId) { + if (_this4._conversationAssistantMessage) { + var msg = _this4.messages[_this4._conversationAssistantMessage.index]; if (msg) { msg.isStreaming = false; } - _this3._conversationAssistantMessage = null; + _this4._conversationAssistantMessage = null; } }); - _this3.connection.on("ReceiveAudioChunk", function (sessionId, base64Audio, contentType) { + _this4.connection.on("ReceiveAudioChunk", function (sessionId, base64Audio, contentType) { if (base64Audio) { var binaryString = atob(base64Audio); var bytes = new Uint8Array(binaryString.length); for (var i = 0; i < binaryString.length; i++) { bytes[i] = binaryString.charCodeAt(i); } - _this3.audioChunks.push(bytes); + _this4.audioChunks.push(bytes); } }); - _this3.connection.on("ReceiveAudioComplete", function (sessionId) { - _this3.playCollectedAudio(); + _this4.connection.on("ReceiveAudioComplete", function (sessionId) { + _this4.playCollectedAudio(); }); - _this3.connection.on("ReceiveNotification", function (notification) { - _this3.receiveNotification(notification); + _this4.connection.on("ReceiveNotification", function (notification) { + _this4.receiveNotification(notification); }); - _this3.connection.on("UpdateNotification", function (notification) { - _this3.updateNotification(notification); + _this4.connection.on("UpdateNotification", function (notification) { + _this4.updateNotification(notification); }); - _this3.connection.on("RemoveNotification", function (notificationType) { - _this3.removeNotification(notificationType); + _this4.connection.on("RemoveNotification", function (notificationType) { + _this4.removeNotification(notificationType); }); - _this3.connection.onreconnecting(function () { + _this4.connection.onreconnecting(function () { console.warn("SignalR: reconnecting..."); }); - _this3.connection.onreconnected(function () { + _this4.connection.onreconnected(function () { console.info("SignalR: reconnected."); - if (_this3.isSessionStarted) { - _this3.reloadCurrentSession(); + if (_this4.isSessionStarted) { + _this4.reloadCurrentSession(); } else if (config.autoCreateSession) { - _this3.startNewSession(); + _this4.startNewSession(); } }); - _this3.connection.onclose(function (error) { - if (_this3.isNavigatingAway) { + _this4.connection.onclose(function (error) { + if (_this4.isNavigatingAway) { return; } if (error) { @@ -995,7 +1287,7 @@ window.openAIChatManager = function () { }); _context3.p = 1; _context3.n = 2; - return _this3.connection.start(); + return _this4.connection.start(); case 2: _context3.n = 4; break; @@ -1010,7 +1302,7 @@ window.openAIChatManager = function () { }))(); }, addMessageInternal: function addMessageInternal(message) { - var _this4 = this; + var _this5 = this; if (message.role === 'assistant') { message.appearance = this.normalizeAssistantAppearance(message.appearance); } @@ -1024,7 +1316,7 @@ window.openAIChatManager = function () { })); this.messages.push(message); this.$nextTick(function () { - _this4.fireEvent(new CustomEvent("addedOpenAIPromotMessage", { + _this5.fireEvent(new CustomEvent("addedOpenAIPromotMessage", { detail: { message: message } @@ -1032,7 +1324,7 @@ window.openAIChatManager = function () { }); }, addMessage: function addMessage(message) { - var _this5 = this; + var _this6 = this; // Ensure userRating is always defined for Vue reactivity. if (message.userRating === undefined) { message.userRating = null; @@ -1120,17 +1412,17 @@ window.openAIChatManager = function () { this.$nextTick(function () { // Render any pending charts once the DOM is updated renderChartsInMessage(message); - _this5.scrollToBottom(); + _this6.scrollToBottom(); }); }, addMessages: function addMessages(messages) { - var _this6 = this; + var _this7 = this; for (var i = 0; i < messages.length; i++) { this.addMessageInternal(messages[i]); } this.hidePlaceholder(); this.$nextTick(function () { - _this6.scrollToBottom(); + _this7.scrollToBottom(); }); }, hidePlaceholder: function hidePlaceholder() { @@ -1207,7 +1499,7 @@ window.openAIChatManager = function () { this.prompt = ''; }, startRecording: function startRecording() { - var _this7 = this; + var _this8 = this; if (this.isRecording || !this.connection) { return; } @@ -1219,17 +1511,17 @@ window.openAIChatManager = function () { } }).then(function (stream) { var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus') ? 'audio/ogg;codecs=opus' : MediaRecorder.isTypeSupported('audio/webm;codecs=opus') ? 'audio/webm;codecs=opus' : 'audio/webm'; - _this7.mediaRecorder = new MediaRecorder(stream, { + _this8.mediaRecorder = new MediaRecorder(stream, { mimeType: mimeType, audioBitsPerSecond: 128000 }); - _this7.preRecordingPrompt = _this7.prompt; - _this7._audioInputSent = false; + _this8.preRecordingPrompt = _this8.prompt; + _this8._audioInputSent = false; var subject = new signalR.Subject(); - var profileId = _this7.getProfileId(); - var sessionId = _this7.getSessionId() || ''; + var profileId = _this8.getProfileId(); + var sessionId = _this8.getSessionId() || ''; var pendingChunk = Promise.resolve(); - _this7.mediaRecorder.addEventListener('dataavailable', function (e) { + _this8.mediaRecorder.addEventListener('dataavailable', function (e) { if (e.data && e.data.size > 0) { pendingChunk = pendingChunk.then(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() { var data, uint8Array, binaryString, base64; @@ -1253,7 +1545,7 @@ window.openAIChatManager = function () { }))); } }); - _this7.mediaRecorder.addEventListener('stop', function () { + _this8.mediaRecorder.addEventListener('stop', function () { stream.getTracks().forEach(function (track) { return track.stop(); }); @@ -1262,10 +1554,10 @@ window.openAIChatManager = function () { }); }); var language = navigator.language || document.documentElement.lang || 'en-US'; - _this7.connection.send("SendAudioStream", profileId, sessionId, subject, mimeType, language); - _this7.mediaRecorder.start(250); - _this7.isRecording = true; - _this7.updateMicButton(); + _this8.connection.send("SendAudioStream", profileId, sessionId, subject, mimeType, language); + _this8.mediaRecorder.start(250); + _this8.isRecording = true; + _this8.updateMicButton(); })["catch"](function (err) { console.error('Microphone access denied:', err); }); @@ -1298,7 +1590,7 @@ window.openAIChatManager = function () { } }, streamMessage: function streamMessage(profileId, trimmedPrompt, sessionProfileId) { - var _this8 = this; + var _this9 = this; if (this.stream) { this.stream.dispose(); this.stream = null; @@ -1315,14 +1607,14 @@ window.openAIChatManager = function () { var currentSessionId = this.getSessionId(); this.stream = this.connection.stream("SendMessage", profileId, trimmedPrompt, currentSessionId, sessionProfileId).subscribe({ next: function next(chunk) { - var message = _this8.messages[messageIndex]; + var message = _this9.messages[messageIndex]; if (!message) { if (chunk.sessionId && !currentSessionId) { - _this8.initializeSession(chunk.sessionId); + _this9.initializeSession(chunk.sessionId); } - _this8.hideTypingIndicator(); + _this9.hideTypingIndicator(); // Re-assign the index after hiding the typing indicator. - messageIndex = _this8.messages.length; + messageIndex = _this9.messages.length; var newMessage = { id: chunk.messageId, role: "assistant", @@ -1332,7 +1624,7 @@ window.openAIChatManager = function () { isStreaming: true, userRating: null }; - _this8.messages.push(newMessage); + _this9.messages.push(newMessage); message = newMessage; } if (chunk.title && (!message.title || message.title !== chunk.title)) { @@ -1372,46 +1664,46 @@ window.openAIChatManager = function () { // Update the existing message message.content = content; message.htmlContent = parseMarkdownContent(content, message); - _this8.messages[messageIndex] = message; - _this8.$nextTick(function () { + _this9.messages[messageIndex] = message; + _this9.$nextTick(function () { renderChartsInMessage(message); - _this8.scrollToBottom(); + _this9.scrollToBottom(); }); }, complete: function complete() { - var _this8$stream; - _this8.processReferences(references, messageIndex); - _this8.streamingFinished(); - var msg = _this8.messages[messageIndex]; + var _this9$stream; + _this9.processReferences(references, messageIndex); + _this9.streamingFinished(); + var msg = _this9.messages[messageIndex]; if (msg) { msg.isStreaming = false; } if (!msg || !msg.content) { // No content received at all. - _this8.hideTypingIndicator(); + _this9.hideTypingIndicator(); } // Trigger text-to-speech only in conversation mode. - if (_this8.isConversationMode && _this8.textToSpeechEnabled && msg && msg.content) { - _this8.synthesizeSpeech(msg.content); + if (_this9.isConversationMode && _this9.textToSpeechEnabled && msg && msg.content) { + _this9.synthesizeSpeech(msg.content); } - (_this8$stream = _this8.stream) === null || _this8$stream === void 0 || _this8$stream.dispose(); - _this8.stream = null; + (_this9$stream = _this9.stream) === null || _this9$stream === void 0 || _this9$stream.dispose(); + _this9.stream = null; }, error: function error(err) { - var _this8$stream2; - _this8.processReferences(references, messageIndex); - _this8.streamingFinished(); - var msg = _this8.messages[messageIndex]; + var _this9$stream2; + _this9.processReferences(references, messageIndex); + _this9.streamingFinished(); + var msg = _this9.messages[messageIndex]; if (msg) { msg.isStreaming = false; } - _this8.hideTypingIndicator(); - if (!_this8.isNavigatingAway) { - _this8.addMessage(_this8.getServiceDownMessage()); + _this9.hideTypingIndicator(); + if (!_this9.isNavigatingAway) { + _this9.addMessage(_this9.getServiceDownMessage()); } - (_this8$stream2 = _this8.stream) === null || _this8$stream2 === void 0 || _this8$stream2.dispose(); - _this8.stream = null; + (_this9$stream2 = _this9.stream) === null || _this9$stream2 === void 0 || _this9$stream2.dispose(); + _this9.stream = null; console.error("Stream error:", err); } }); @@ -1425,7 +1717,7 @@ window.openAIChatManager = function () { return newMessage; }, processReferences: function processReferences(references, messageIndex) { - var _this9 = this; + var _this0 = this; references = normalizeReferences(references); if (Object.keys(references).length) { var message = this.messages[messageIndex]; @@ -1510,7 +1802,7 @@ window.openAIChatManager = function () { this.messages[messageIndex] = message; this.$nextTick(function () { renderChartsInMessage(message); - _this9.scrollToBottom(); + _this0.scrollToBottom(); }); } }, @@ -1553,8 +1845,15 @@ window.openAIChatManager = function () { } } }, + handleExternalTtsStop: function handleExternalTtsStop(e) { + var _e$detail; + if ((e === null || e === void 0 || (_e$detail = e.detail) === null || _e$detail === void 0 ? void 0 : _e$detail.sourceId) === this.ttsInstanceId) { + return; + } + this.stopAudio(false); + }, synthesizeSpeech: function synthesizeSpeech(text, cacheIndex) { - var _this0 = this; + var _this1 = this; if (!this.textToSpeechEnabled || !text || !this.connection) { return; } @@ -1563,9 +1862,9 @@ window.openAIChatManager = function () { this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1; this.connection.invoke("SynthesizeSpeech", this.getProfileId(), this.getSessionId(), text, this.ttsVoiceName)["catch"](function (err) { console.error("TTS synthesis error:", err); - _this0.isPlayingAudio = false; - _this0.ttsPlayingMessageIndex = -1; - _this0._ttsCacheIndex = -1; + _this1.isPlayingAudio = false; + _this1.ttsPlayingMessageIndex = -1; + _this1._ttsCacheIndex = -1; }); }, toggleMessageTts: function toggleMessageTts(message, index) { @@ -1573,7 +1872,12 @@ window.openAIChatManager = function () { this.stopAudio(); return; } - this.stopAudio(); + this.stopAudio(false); + window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', { + detail: { + sourceId: this.ttsInstanceId + } + })); this.ttsPlayingMessageIndex = index; if (this.ttsAudioCache[index]) { this.playAudioBlob(this.ttsAudioCache[index]); @@ -1585,6 +1889,7 @@ window.openAIChatManager = function () { if (this.audioChunks.length === 0) { if (!this.currentAudioElement && this.audioPlayQueue.length === 0) { this.isPlayingAudio = false; + this.ttsPlayingMessageIndex = -1; } return; } @@ -1623,26 +1928,32 @@ window.openAIChatManager = function () { this.playAudioBlob(blob); }, playAudioBlob: function playAudioBlob(blob) { - var _this1 = this; + var _this10 = this; var url = URL.createObjectURL(blob); var audio = new Audio(url); + this.currentAudioUrl = url; this.currentAudioElement = audio; this.isPlayingAudio = true; audio.addEventListener('ended', function () { + _this10.currentAudioElement = null; + _this10.currentAudioUrl = null; URL.revokeObjectURL(url); - _this1.currentAudioElement = null; - _this1.playNextInQueue(); + _this10.playNextInQueue(); }); audio.addEventListener('error', function () { + _this10.currentAudioElement = null; + _this10.currentAudioUrl = null; URL.revokeObjectURL(url); - _this1.currentAudioElement = null; - _this1.playNextInQueue(); + _this10.playNextInQueue(); }); audio.play()["catch"](function (err) { console.error("Audio playback error:", err); + _this10.currentAudioElement = null; + _this10.currentAudioUrl = null; URL.revokeObjectURL(url); - _this1.currentAudioElement = null; - _this1.isPlayingAudio = false; + _this10.audioPlayQueue = []; + _this10.isPlayingAudio = false; + _this10.ttsPlayingMessageIndex = -1; }); }, playNextInQueue: function playNextInQueue() { @@ -1661,6 +1972,10 @@ window.openAIChatManager = function () { this.currentAudioElement.currentTime = 0; this.currentAudioElement = null; } + if (this.currentAudioUrl) { + URL.revokeObjectURL(this.currentAudioUrl); + this.currentAudioUrl = null; + } this.audioChunks = []; this.audioPlayQueue = []; this.isPlayingAudio = false; @@ -1674,7 +1989,7 @@ window.openAIChatManager = function () { } }, startConversationMode: function startConversationMode() { - var _this10 = this; + var _this11 = this; if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) { return; } @@ -1694,12 +2009,12 @@ window.openAIChatManager = function () { } }).then(function (stream) { var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus') ? 'audio/ogg;codecs=opus' : MediaRecorder.isTypeSupported('audio/webm;codecs=opus') ? 'audio/webm;codecs=opus' : 'audio/webm'; - _this10.mediaRecorder = new MediaRecorder(stream, { + _this11.mediaRecorder = new MediaRecorder(stream, { mimeType: mimeType, audioBitsPerSecond: 128000 }); - _this10._conversationSubject = new signalR.Subject(); - _this10._conversationStream = stream; + _this11._conversationSubject = new signalR.Subject(); + _this11._conversationStream = stream; // Create an AnalyserNode for volume-based interrupt detection. // During TTS playback, detect when the user speaks above @@ -1708,20 +2023,20 @@ window.openAIChatManager = function () { // speaker echo so the STT stream has no gaps. var AudioCtx = window.AudioContext || window.webkitAudioContext; if (AudioCtx) { - _this10._conversationAudioCtx = new AudioCtx(); - _this10._conversationAnalyser = _this10._conversationAudioCtx.createAnalyser(); - _this10._conversationAnalyser.fftSize = 256; - var micSource = _this10._conversationAudioCtx.createMediaStreamSource(stream); - micSource.connect(_this10._conversationAnalyser); + _this11._conversationAudioCtx = new AudioCtx(); + _this11._conversationAnalyser = _this11._conversationAudioCtx.createAnalyser(); + _this11._conversationAnalyser.fftSize = 256; + var micSource = _this11._conversationAudioCtx.createMediaStreamSource(stream); + micSource.connect(_this11._conversationAnalyser); } var pendingChunk = Promise.resolve(); - var analyser = _this10._conversationAnalyser; + var analyser = _this11._conversationAnalyser; var interruptVolumeThreshold = 30; - _this10.mediaRecorder.addEventListener('dataavailable', function (e) { + _this11.mediaRecorder.addEventListener('dataavailable', function (e) { if (e.data && e.data.size > 0) { // During TTS playback, check mic volume to detect // user interruption (speaking above threshold). - if (_this10.isPlayingAudio && analyser) { + if (_this11.isPlayingAudio && analyser) { var freqData = new Uint8Array(analyser.frequencyBinCount); analyser.getByteFrequencyData(freqData); var sum = 0; @@ -1731,7 +2046,7 @@ window.openAIChatManager = function () { var avg = sum / freqData.length; if (avg >= interruptVolumeThreshold) { // User is speaking — interrupt TTS playback. - _this10.stopAudio(); + _this11.stopAudio(); } } @@ -1753,7 +2068,7 @@ window.openAIChatManager = function () { }, ''); base64 = btoa(binaryString); try { - _this10._conversationSubject.next(base64); + _this11._conversationSubject.next(base64); } catch (err) { // Subject may have been completed already. } @@ -1764,28 +2079,28 @@ window.openAIChatManager = function () { }))); } }); - _this10.mediaRecorder.addEventListener('stop', function () { + _this11.mediaRecorder.addEventListener('stop', function () { stream.getTracks().forEach(function (track) { return track.stop(); }); pendingChunk.then(function () { try { - _this10._conversationSubject.complete(); + _this11._conversationSubject.complete(); } catch (err) { // Already completed. } }); }); - var profileId = _this10.getProfileId(); - var sessionId = _this10.getSessionId() || ''; + var profileId = _this11.getProfileId(); + var sessionId = _this11.getSessionId() || ''; var language = navigator.language || document.documentElement.lang || 'en-US'; - _this10.connection.send("StartConversation", profileId, sessionId, _this10._conversationSubject, mimeType, language); - _this10.mediaRecorder.start(250); - _this10.isRecording = true; + _this11.connection.send("StartConversation", profileId, sessionId, _this11._conversationSubject, mimeType, language); + _this11.mediaRecorder.start(250); + _this11.isRecording = true; })["catch"](function (err) { console.error('Microphone access denied:', err); - _this10.isConversationMode = false; - _this10.updateConversationButton(); + _this11.isConversationMode = false; + _this11.updateConversationButton(); }); }, stopConversationMode: function stopConversationMode() { @@ -1912,7 +2227,7 @@ window.openAIChatManager = function () { return removedCount; }, receiveNotification: function receiveNotification(notification) { - var _this11 = this; + var _this12 = this; if (!notification || !notification.type) { return; } @@ -1927,7 +2242,7 @@ window.openAIChatManager = function () { } this.scheduleNotificationDismiss(notification); this.$nextTick(function () { - _this11.scrollToBottom(); + _this12.scrollToBottom(); }); }, updateNotification: function updateNotification(notification) { @@ -1944,12 +2259,12 @@ window.openAIChatManager = function () { } }, scheduleNotificationDismiss: function scheduleNotificationDismiss(notification) { - var _this12 = this; + var _this13 = this; if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) { return; } this.notificationDismissTimers[notification.type] = setTimeout(function () { - _this12.removeNotification(notification.type); + _this13.removeNotification(notification.type); }, notification.autoDismissMs); }, clearNotificationDismiss: function clearNotificationDismiss(notificationType) { @@ -1979,12 +2294,12 @@ window.openAIChatManager = function () { }); }, scrollToBottom: function scrollToBottom() { - var _this13 = this; + var _this14 = this; if (!this.autoScroll) { return; } setTimeout(function () { - _this13.chatContainer.scrollTop = _this13.chatContainer.scrollHeight - _this13.chatContainer.clientHeight; + _this14.chatContainer.scrollTop = _this14.chatContainer.scrollHeight - _this14.chatContainer.clientHeight; }, 50); }, handleUserInput: function handleUserInput(event) { @@ -2026,16 +2341,16 @@ window.openAIChatManager = function () { }); }, initializeApp: function initializeApp() { - var _this14 = this; + var _this15 = this; this.inputElement = document.querySelector(config.inputElementSelector); this.buttonElement = document.querySelector(config.sendButtonElementSelector); this.chatContainer = document.querySelector(config.chatContainerElementSelector); this.placeholder = document.querySelector(config.placeholderElementSelector); this.applyOrchestratorAvailability(); var sessionId = this.getSessionId(); - if (!config.widget && sessionId) { + if (!hasWidgetConfig && sessionId) { this.loadSession(sessionId); - } else if (this.isOrchestratorAvailable() && config.autoCreateSession && !config.widget && !sessionId) { + } else if (this.isOrchestratorAvailable() && config.autoCreateSession && !hasWidgetConfig && !sessionId) { this.startNewSession(); } @@ -2055,7 +2370,7 @@ window.openAIChatManager = function () { fileInput.accept = config.allowedExtensions; } fileInput.addEventListener('change', function (e) { - return _this14.handleFileInputChange(e); + return _this15.handleFileInputChange(e); }); this.documentBar.parentElement.appendChild(fileInput); @@ -2063,13 +2378,13 @@ window.openAIChatManager = function () { var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null; if (inputArea) { inputArea.addEventListener('dragover', function (e) { - return _this14.handleDragOver(e); + return _this15.handleDragOver(e); }); inputArea.addEventListener('dragleave', function (e) { - return _this14.handleDragLeave(e); + return _this15.handleDragLeave(e); }); inputArea.addEventListener('drop', function (e) { - return _this14.handleDrop(e); + return _this15.handleDrop(e); }); } } @@ -2077,55 +2392,55 @@ window.openAIChatManager = function () { // Pause auto-scroll when the user manually scrolls up during streaming. this.chatContainer.addEventListener('scroll', function () { - if (!_this14.stream) { + if (!_this15.stream) { return; } var threshold = 30; - var atBottom = _this14.chatContainer.scrollHeight - _this14.chatContainer.clientHeight - _this14.chatContainer.scrollTop <= threshold; - _this14.autoScroll = atBottom; + var atBottom = _this15.chatContainer.scrollHeight - _this15.chatContainer.clientHeight - _this15.chatContainer.scrollTop <= threshold; + _this15.autoScroll = atBottom; }); this.inputElement.addEventListener('keydown', function (event) { - if (_this14.stream != null) { + if (_this15.stream != null) { return; } if (event.key === "Enter" && !event.shiftKey) { event.preventDefault(); - _this14.buttonElement.click(); + _this15.buttonElement.click(); } }); this.inputElement.addEventListener('input', function (e) { - _this14.handleUserInput(e); + _this15.handleUserInput(e); if (e.target.value.trim()) { - _this14.buttonElement.removeAttribute('disabled'); + _this15.buttonElement.removeAttribute('disabled'); } else { - _this14.buttonElement.setAttribute('disabled', true); + _this15.buttonElement.setAttribute('disabled', true); } }); this.buttonElement.addEventListener('click', function () { - if (_this14.stream != null) { - _this14.stream.dispose(); - _this14.stream = null; - _this14.streamingFinished(); - _this14.hideTypingIndicator(); + if (_this15.stream != null) { + _this15.stream.dispose(); + _this15.stream = null; + _this15.streamingFinished(); + _this15.hideTypingIndicator(); // Clean up: remove empty assistant message or stop streaming animation. - if (_this14.messages.length > 0) { - var lastMsg = _this14.messages[_this14.messages.length - 1]; + if (_this15.messages.length > 0) { + var lastMsg = _this15.messages[_this15.messages.length - 1]; if (lastMsg.role === 'assistant' && !lastMsg.content) { - _this14.messages.pop(); + _this15.messages.pop(); } else if (lastMsg.isStreaming) { lastMsg.isStreaming = false; } } return; } - _this14.sendMessage(); + _this15.sendMessage(); }); var promptGenerators = document.getElementsByClassName('profile-generated-prompt'); for (var i = 0; i < promptGenerators.length; i++) { promptGenerators[i].addEventListener('click', function (e) { e.preventDefault(); - _this14.generatePrompt(e.target); + _this15.generatePrompt(e.target); }); } var chatSessions = document.getElementsByClassName('chat-session-history-item'); @@ -2137,8 +2452,8 @@ window.openAIChatManager = function () { console.error('an element with the class chat-session-history-item with no data-session-id set.'); return; } - _this14.loadSession(sessionId); - _this14.showChatScreen(); + _this15.loadSession(sessionId); + _this15.showChatScreen(); }); } for (var _i5 = 0; _i5 < config.messages.length; _i5++) { @@ -2147,7 +2462,7 @@ window.openAIChatManager = function () { // Update feedback icons in the DOM after initial messages have rendered. this.$nextTick(function () { - _this14.refreshAllFeedbackIcons(); + _this15.refreshAllFeedbackIcons(); }); // Delegate click for code block copy buttons. @@ -2179,7 +2494,7 @@ window.openAIChatManager = function () { if (this.micButton) { this.micButton.style.display = ''; this.micButton.addEventListener('click', function () { - _this14.toggleRecording(); + _this15.toggleRecording(); }); } } @@ -2189,7 +2504,7 @@ window.openAIChatManager = function () { this.conversationButton = document.querySelector(config.conversationButtonElementSelector); if (this.conversationButton) { this.conversationButton.addEventListener('click', function () { - _this14.toggleConversationMode(); + _this15.toggleConversationMode(); }); } } @@ -2221,7 +2536,7 @@ window.openAIChatManager = function () { } }, initializeWidget: function initializeWidget() { - var _this15 = this; + var _this16 = this; if (!config.widget.chatWidgetContainer) { console.error('The widget chatWidgetContainer is required.'); return; @@ -2239,7 +2554,51 @@ window.openAIChatManager = function () { } this.chatWidgetStateName = config.widget.chatWidgetStateName; this.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session'; + this.chatWidgetLayoutKey = config.widget.chatWidgetStateName + 'Layout'; + this.widgetContainerElement = chatWidgetContainer; + this.widgetToggleButtonElement = config.widget.toggleButtonSelector ? document.querySelector(config.widget.toggleButtonSelector) : null; + this.widgetResetSizeButtonElement = config.widget.resetSizeButtonSelector ? document.querySelector(config.widget.resetSizeButtonSelector) : null; + this.widgetDefaultWidth = parsePixelValue(config.widget.defaultWidth) || parsePixelValue(window.getComputedStyle(chatWidgetContainer).width) || 380; + this.widgetDefaultHeight = parsePixelValue(config.widget.defaultHeight) || parsePixelValue(window.getComputedStyle(chatWidgetContainer).height) || 520; this.widgetIsInitialized = true; + if (config.widget.enableResizing) { + chatWidgetContainer.classList.add('ai-chat-widget-resizable'); + chatWidgetContainer.style.minWidth = (parsePixelValue(config.widget.minWidth) || 320) + 'px'; + chatWidgetContainer.style.minHeight = (parsePixelValue(config.widget.minHeight) || 420) + 'px'; + if (typeof ResizeObserver !== 'undefined') { + this.widgetResizeObserver = new ResizeObserver(function () { + _this16.persistWidgetPanelSize(); + _this16.constrainWidgetElementsToViewport(); + _this16.updateWidgetResetSizeButtonVisibility(); + }); + this.widgetResizeObserver.observe(chatWidgetContainer); + } + } + var dragHandleSelector = config.widget.dragHandleSelector || '.ai-chat-widget-header'; + var dragHandle = chatWidgetContainer.querySelector(dragHandleSelector); + if (config.widget.enableDragging && dragHandle) { + dragHandle.classList.add('ai-chat-widget-drag-handle'); + chatWidgetContainer.classList.add('ai-chat-widget-draggable'); + this.attachDraggableWidgetElement(chatWidgetContainer, dragHandle, 'panel', false); + } + if (config.widget.enableDragging && this.widgetToggleButtonElement) { + this.widgetToggleButtonElement.classList.add('ai-chat-widget-draggable'); + this.attachDraggableWidgetElement(this.widgetToggleButtonElement, this.widgetToggleButtonElement, 'toggle', true); + } + if (this.widgetResetSizeButtonElement) { + this.widgetResetSizeButtonElement.addEventListener('click', function (event) { + event.preventDefault(); + _this16.resetWidgetSize(); + }); + } + this.restoreWidgetLayout(); + if (!this.widgetViewportResizeHandler) { + this.widgetViewportResizeHandler = function () { + _this16.constrainWidgetElementsToViewport(); + _this16.updateWidgetResetSizeButtonVisibility(); + }; + window.addEventListener('resize', this.widgetViewportResizeHandler); + } // Auto-load the last session so the user always sees previous chat history. this.reloadCurrentSession(); @@ -2250,14 +2609,14 @@ window.openAIChatManager = function () { var showHistoryButton = document.querySelector(config.widget.showHistoryButton); if (showHistoryButton) { showHistoryButton.addEventListener('click', function () { - _this15.chatHistorySection.classList.toggle('show'); + _this16.chatHistorySection.classList.toggle('show'); }); } if (config.widget.closeHistoryButton) { var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton); if (closeHistoryButton) { closeHistoryButton.addEventListener('click', function () { - _this15.showChatScreen(); + _this16.showChatScreen(); }); } } @@ -2266,8 +2625,8 @@ window.openAIChatManager = function () { var newChatButton = document.querySelector(config.widget.newChatButton); if (newChatButton) { newChatButton.addEventListener('click', function () { - _this15.resetSession(); - _this15.showChatScreen(); + _this16.resetSession(); + _this16.showChatScreen(); }); } } @@ -2403,17 +2762,17 @@ window.openAIChatManager = function () { } }, mounted: function mounted() { - var _this16 = this; + var _this17 = this; _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() { return _regenerator().w(function (_context6) { while (1) switch (_context6.n) { case 0: _context6.n = 1; - return _this16.startConnection(); + return _this17.startConnection(); case 1: - _this16.initializeApp(); - if (config.widget) { - _this16.initializeWidget(); + _this17.initializeApp(); + if (hasWidgetConfig) { + _this17.initializeWidget(); } case 2: return _context6.a(2); @@ -2421,9 +2780,12 @@ window.openAIChatManager = function () { }, _callee6); }))(); window.addEventListener('beforeunload', this.handleBeforeUnload); + window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop); }, beforeUnmount: function beforeUnmount() { window.removeEventListener('beforeunload', this.handleBeforeUnload); + window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop); + this.stopAudio(false); if (this.stream) { this.stream.dispose(); this.stream = null; diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.js.map b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.js.map index a3416638..c8961cb5 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.js.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.js.map @@ -1 +1 @@ -{"version":3,"sources":["ai-chat.js"],"names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","from","_arrayLikeToArray","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","push","_typeof","window","openAIChatManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","userLabel","assistantLabel","thumbsUpTitle","thumbsDownTitle","copyTitle","codeCopiedText","messageTemplate","indicatorTemplate","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","normalizeReference","reference","_ref","_normalized$index","_ref2","_normalized$text","_ref3","_normalized$link","normalized","assign","index","Index","Text","link","Link","normalizeReferences","references","_i","_Object$entries","entries","_normalizeReference","_Object$entries$_i","key","renderer","marked","Renderer","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","__chartConfigs","createChartHtml","chartId","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","tryExtractChartMarker","startIndex","type","raw","substring","endIndex","json","token","config","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","renderChartsInMessage","message","charts","requestAnimationFrame","_iterator","_step","renderChartOnCanvas","err","canvas","getElementById","Chart","console","warn","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","renderPendingCharts","configs","_i2","_Object$keys","keys","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","initialize","instanceConfig","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isSessionStarted","isPlaceholderVisible","chatWidgetStateName","chatWidgetStateSession","chatHistorySection","widgetIsInitialized","isStreaming","isNavigatingAway","autoScroll","stream","messages","notifications","prompt","documents","existingDocuments","isUploading","uploadErrors","isDragOver","documentBar","metricsEnabled","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","ttsButton","ttsPlayingMessageIndex","ttsAudioCache","singleResponseMode","conversationModeEnabled","conversationButton","isConversationMode","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","handleDragOver","sessionDocumentsEnabled","preventDefault","stopPropagation","inputArea","closest","classList","add","handleDragLeave","remove","handleDrop","dataTransfer","files","uploadFiles","triggerFileInput","fileInput","click","handleFileInputChange","target","_this","_callee","sessionId","profileId","formData","response","errorText","uploadError","result","j","_t","_context","uploadDocumentUrl","getSessionId","getProfileId","renderDocumentBar","FormData","append","fetch","method","body","ok","extractReadableErrorMessage","fileName","initializeSession","uploaded","failed","removeDocument","doc","_this2","_callee2","removeError","_t2","_context2","removeDocumentUrl","headers","stringify","itemId","documentId","splice","status","formatFileSize","bytes","toFixed","escapeHtml","failedItem","failedName","errorMsg","supportedExtensionsText","replaceChildren","RETURN_DOM_FRAGMENT","self","closeButtons","querySelectorAll","addEventListener","docToRemove","parseInt","getAttribute","errorCloseButtons","addBtn","querySelector","div","fallbackMessage","startsWith","parsed","title","detail","normalizeAssistantAppearance","appearance","label","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","startConnection","_this3","_callee3","_t3","_context3","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","forEach","msg","addMessage","$nextTick","refreshAllFeedbackIcons","initialPrompt","sendMessage","stopRecording","_attemptedSessionRecovery","localStorage","removeItem","startNewSession","messageId","userRating","find","id","isFinal","_conversationPartialTranscript","escaped","replace","_conversationPartialMessage","hidePlaceholder","htmlContent","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","responseId","hideTypingIndicator","msgIndex","newMessage","base64Audio","contentType","binaryString","atob","Uint8Array","charCodeAt","playCollectedAudio","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentSession","autoCreateSession","onclose","addMessageInternal","_this4","fireEvent","CustomEvent","_this5","processedContent","citedRefs","filter","_ref4","_ref5","includes","sort","_ref6","_ref7","_ref8","_ref9","b","displayIndex","_iterator2","_step2","_step2$value","replaceAll","_displayIndex","_placeholder","_iterator3","_step3","_step3$value","_iterator4","_step4","_step4$value","addMessages","_this6","showPlaceholder","isOrchestratorAvailable","applyOrchestratorAvailability","unavailableMessage","orchestratorUnavailableMessage","disabled","micButtonElement","style","display","conversationButtonElement","event","isIndicator","trimmedPrompt","streamMessage","startRecording","_this7","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","subject","Subject","pendingChunk","size","_callee4","uint8Array","base64","_context4","arrayBuffer","reduce","str","byte","String","fromCharCode","btoa","getTracks","track","stop","complete","documentElement","send","updateMicButton","toggleRecording","sessionProfileId","_this8","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentSessionId","subscribe","chunk","_i3","_Object$entries2","_normalizeReference2","_Object$entries2$_i","_i4","_Object$entries3","_Object$entries3$_i","_this8$stream","processReferences","streamingFinished","synthesizeSpeech","_this8$stream2","getServiceDownMessage","_this9","_ref1","_ref10","_ref11","_ref12","_ref13","_ref14","processed","_iterator5","_step5","_step5$value","_iterator6","_step6","_step6$value","_iterator7","_step7","_step7$value","stopIcon","setAttribute","startIcon","removeAttribute","focus","icons","cacheIndex","_this0","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","totalLength","sum","combined","offset","_iterator8","_step8","set","blob","Blob","_this1","URL","createObjectURL","Audio","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this10","updateConversationButton","_conversationSubject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","micSource","createMediaStreamSource","connect","analyser","interruptVolumeThreshold","freqData","frequencyBinCount","getByteFrequencyData","k","avg","_callee5","_context5","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","generatePrompt","element","templateProfileId","createSessionUrl","baseUrl","param","fullUrl","toLowerCase","location","origin","searchParams","originalLength","removedCount","_this11","clearNotificationDismiss","existingIndex","findIndex","scheduleNotificationDismiss","_this12","setTimeout","timerId","clearTimeout","dismissNotification","handleNotificationAction","actionName","_this13","scrollTop","scrollHeight","clientHeight","handleUserInput","setSessionId","resetSession","sessionRating","initializeApp","_this14","placeholderElementSelector","widget","loadSession","documentBarSelector","className","multiple","allowedExtensions","accept","parentElement","appendChild","threshold","atBottom","shiftKey","lastMsg","pop","promptGenerators","getElementsByClassName","chatSessions","showChatScreen","btn","block","codeEl","clipboard","writeText","copiedText","micButtonElementSelector","conversationButtonElementSelector","force","setItem","initializeWidget","_this15","chatWidgetContainer","showHistoryButton","toggle","closeHistoryButton","newChatButton","getItem","copyResponse","updateFeedbackIcons","container","upBtn","downBtn","upClass","upIcon","fontSize","downClass","downIcon","FontAwesome","dom","i2svg","node","containers","$el","msgId","rateMessage","isPositive","newRating","feedbackContainer","btnClass","offsetWidth","onEnd","removeEventListener","watch","handler","deep","active","mounted","_this16","_callee6","_context6","beforeUnmount","template","mount","download","toDataURL","img","res","removeChild"],"mappings":"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","file":"ai-chat.js","sourcesContent":["window.openAIChatManager = function () {\n\n // Defaults (can be overridden by instanceConfig)\n var defaultConfig = {\n // UI defaults for generated media\n generatedImageAltText: 'Generated Image',\n generatedImageMaxWidth: 400,\n downloadImageTitle: 'Download image',\n downloadChartTitle: 'Download chart as image',\n downloadChartButtonText: 'Download',\n userLabel: 'You',\n assistantLabel: 'Assistant',\n thumbsUpTitle: 'Thumbs up',\n thumbsDownTitle: 'Thumbs down',\n copyTitle: 'Click here to copy response to clipboard.',\n codeCopiedText: 'Copied!',\n messageTemplate: `\n
\n
\n
\n
{{ userLabel }}
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n `,\n indicatorTemplate: `\n
\n \n Assistant\n
\n `\n };\n\n // Sanitize URLs to prevent javascript: protocol injection.\n function sanitizeUrl(url) {\n if (!url) return '';\n var trimmed = url.trim();\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\n return '';\n }\n return url;\n }\n\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\n function escapeHtmlEntities(text) {\n var span = document.createElement('span');\n span.textContent = text;\n return span.innerHTML;\n }\n\n function normalizeReference(reference) {\n if (!reference || typeof reference !== 'object') {\n return null;\n }\n\n const normalized = Object.assign({}, reference);\n normalized.index = normalized.index ?? normalized.Index ?? 0;\n normalized.text = normalized.text ?? normalized.Text ?? null;\n normalized.link = normalized.link ?? normalized.Link ?? null;\n\n return normalized;\n }\n\n function normalizeReferences(references) {\n if (!references || typeof references !== 'object') {\n return {};\n }\n\n const normalized = {};\n\n for (const [key, value] of Object.entries(references)) {\n normalized[key] = normalizeReference(value) ?? {};\n }\n\n return normalized;\n }\n\n const renderer = new marked.Renderer();\n\n // Modify the link rendering to open in a new tab\n renderer.link = function (data) {\n var href = sanitizeUrl(data.href);\n if (!href) return data.text || '';\n return `${data.text}`;\n };\n\n // Custom code block renderer with highlight.js integration and copy button.\n renderer.code = function (data) {\n var code = data.text || '';\n var lang = (data.lang || '').trim();\n var highlighted = code;\n\n if (typeof hljs !== 'undefined') {\n if (lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(code, { language: lang }).value;\n } catch (_) { }\n } else {\n try {\n highlighted = hljs.highlightAuto(code).value;\n } catch (_) { }\n }\n } else {\n highlighted = escapeHtmlEntities(code);\n }\n\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\n return `
${langDisplay}
${highlighted}
`;\n };\n\n // Custom image renderer for generated images with thumbnail styling and download button.\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\n renderer.image = function (data) {\n const src = sanitizeUrl(data.href);\n if (!src) return '';\n const alt = data.text || defaultConfig.generatedImageAltText;\n const maxWidth = defaultConfig.generatedImageMaxWidth;\n return `
\n \"${alt}\"\n
\n \n \n \n
\n
`;\n };\n\n // Chart counter for unique IDs\n let chartCounter = 0;\n\n // Collector for charts discovered during marked parsing.\n let _pendingCharts = [];\n\n // Global chart config map: any page (e.g., Chat Interactions) that uses\n // the shared marked instance can call window.renderPendingCharts() after\n // its DOM update to render charts it didn't create itself.\n window.__chartConfigs = window.__chartConfigs || {};\n\n function createChartHtml(chartId) {\n return `
`\n + ``\n + `
`\n + `
`\n + ``\n + `
`;\n }\n\n // Register [chart:{...json...}] as a native marked block extension so the\n // markdown parser handles chart markers inline with surrounding text.\n marked.use({\n extensions: [{\n name: 'chart',\n level: 'block',\n start(src) {\n const idx = src.indexOf('[chart:');\n return idx >= 0 ? idx : undefined;\n },\n tokenizer(src) {\n const extracted = tryExtractChartMarker(src);\n if (!extracted || extracted.startIndex !== 0) {\n return undefined;\n }\n\n const chartId = `chat_chart_${++chartCounter}`;\n\n return {\n type: 'chart',\n raw: src.substring(0, extracted.endIndex),\n chartId: chartId,\n json: extracted.json,\n };\n },\n renderer(token) {\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\n window.__chartConfigs[token.chartId] = token.json;\n return createChartHtml(token.chartId);\n }\n }]\n });\n\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\n function tryExtractChartMarker(text) {\n const token = '[chart:';\n const start = text.indexOf(token);\n if (start < 0) {\n return null;\n }\n\n // Find JSON object boundary by balancing braces\n const jsonStart = start + token.length;\n let i = jsonStart;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\n i++;\n }\n\n if (i >= text.length || text[i] !== '{') {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n\n if (inString) {\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\') {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) {\n const jsonEnd = i;\n // Expect closing bracket after JSON\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\n if (closeBracketIndex < 0) {\n return null;\n }\n\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\n return {\n startIndex: start,\n endIndex: closeBracketIndex + 1,\n json: json\n };\n }\n }\n }\n\n return null;\n }\n\n function renderChartsInMessage(message) {\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\n return;\n }\n\n // Copy and clear pending charts immediately to prevent duplicate renders.\n const charts = [...message._pendingCharts];\n message._pendingCharts = [];\n\n // Defer to requestAnimationFrame so the browser has fully laid out the\n // canvas elements before Chart.js reads their dimensions.\n requestAnimationFrame(() => {\n for (const c of charts) {\n renderChartOnCanvas(c.chartId, c.config);\n }\n });\n }\n\n function renderChartOnCanvas(chartId, config) {\n const canvas = document.getElementById(chartId);\n if (!canvas) {\n return false;\n }\n\n if (typeof Chart === 'undefined') {\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n return false;\n }\n\n // When the canvas is inside a hidden container (e.g., a widget panel with\n // display:none), it has zero dimensions and Chart.js cannot render correctly.\n // Keep the config in __chartConfigs so renderPendingCharts() can retry later\n // once the container becomes visible.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[chartId] = config;\n return false;\n }\n\n try {\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof config === 'string' ? JSON.parse(config) : config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n delete window.__chartConfigs[chartId];\n return true;\n } catch (e) {\n console.error('Error creating chart:', e);\n return false;\n }\n }\n\n // Global function: renders any chart canvases whose configs are in the\n // global __chartConfigs map. Called by pages (e.g., Chat Interactions)\n // that share the marked instance but have their own rendering pipeline.\n window.renderPendingCharts = function () {\n if (typeof Chart === 'undefined') {\n return;\n }\n\n const configs = window.__chartConfigs;\n if (!configs) {\n return;\n }\n\n requestAnimationFrame(() => {\n for (const chartId of Object.keys(configs)) {\n renderChartOnCanvas(chartId, configs[chartId]);\n }\n });\n };\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n const initialize = (instanceConfig) => {\n\n const config = Object.assign({}, defaultConfig, instanceConfig);\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isSessionStarted: false,\n isPlaceholderVisible: true,\n chatWidgetStateName: null,\n chatWidgetStateSession: null,\n chatHistorySection: null,\n widgetIsInitialized: false,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n notifications: [],\n prompt: '',\n documents: config.existingDocuments || [],\n isUploading: false,\n uploadErrors: [],\n isDragOver: false,\n documentBar: null,\n metricsEnabled: !!config.metricsEnabled,\n userLabel: config.userLabel,\n assistantLabel: config.assistantLabel,\n thumbsUpTitle: config.thumbsUpTitle,\n thumbsDownTitle: config.thumbsDownTitle,\n copyTitle: config.copyTitle,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n ttsButton: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n singleResponseMode: !!config.singleResponseMode,\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n notificationDismissTimers: {},\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n handleDragOver(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = true;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.add('ai-chat-drag-over');\n },\n handleDragLeave(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = false;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\n },\n handleDrop(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = false;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\n if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.uploadFiles(e.dataTransfer.files);\n }\n },\n triggerFileInput() {\n if (!config.sessionDocumentsEnabled) return;\n var fileInput = document.getElementById('ai-chat-doc-input');\n if (fileInput) fileInput.click();\n },\n handleFileInputChange(e) {\n var files = e.target.files;\n if (files && files.length > 0) {\n this.uploadFiles(files);\n }\n e.target.value = '';\n },\n async uploadFiles(files) {\n if (!config.uploadDocumentUrl) return;\n\n var sessionId = this.getSessionId();\n var profileId = this.getProfileId();\n\n if (!sessionId && !profileId) {\n console.warn('Cannot upload documents without a session or profile.');\n return;\n }\n\n this.isUploading = true;\n this.uploadErrors = [];\n this.renderDocumentBar();\n try {\n var formData = new FormData();\n if (sessionId) {\n formData.append('sessionId', sessionId);\n } else {\n formData.append('profileId', profileId);\n }\n for (var i = 0; i < files.length; i++) {\n formData.append('files', files[i]);\n }\n\n var response = await fetch(config.uploadDocumentUrl, {\n method: 'POST',\n body: formData\n });\n\n if (!response.ok) {\n var errorText = await response.text();\n var uploadError = this.extractReadableErrorMessage(errorText, 'Upload failed. Please try again.');\n console.error('Upload failed:', errorText);\n this.uploadErrors = [{ fileName: '', error: uploadError }];\n return;\n }\n\n var result = await response.json();\n\n // If the server created a new session, initialize it.\n if (result.sessionId && !sessionId) {\n this.initializeSession(result.sessionId);\n }\n\n if (result.uploaded && result.uploaded.length > 0) {\n for (var j = 0; j < result.uploaded.length; j++) {\n this.documents.push(result.uploaded[j]);\n }\n }\n if (result.failed && result.failed.length > 0) {\n this.uploadErrors = result.failed;\n }\n } catch (err) {\n console.error('Upload error:', err);\n this.uploadErrors = [{ fileName: '', error: 'Upload failed. Please try again.' }];\n } finally {\n this.isUploading = false;\n this.renderDocumentBar();\n }\n },\n async removeDocument(doc) {\n if (!config.removeDocumentUrl) return;\n\n try {\n var sessionId = this.getSessionId();\n var response = await fetch(config.removeDocumentUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ itemId: sessionId, documentId: doc.documentId })\n });\n\n if (response.ok) {\n var idx = this.documents.indexOf(doc);\n if (idx > -1) this.documents.splice(idx, 1);\n } else {\n var errorText = await response.text();\n var removeError = this.extractReadableErrorMessage(errorText, 'Failed to remove document. Please try again.');\n console.error('Failed to remove document:', response.status, errorText);\n this.uploadErrors = [{ fileName: doc.fileName || '', error: removeError }];\n this.renderDocumentBar();\n }\n } catch (err) {\n console.error('Remove document error:', err);\n this.uploadErrors = [{ fileName: doc.fileName || '', error: 'Failed to remove document. Please try again.' }];\n this.renderDocumentBar();\n }\n },\n formatFileSize(bytes) {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n },\n renderDocumentBar() {\n if (!this.documentBar) return;\n\n if (!config.sessionDocumentsEnabled) {\n this.documentBar.classList.add('d-none');\n return;\n }\n\n this.documentBar.classList.remove('d-none');\n\n var html = '
';\n html += '
';\n\n for (var i = 0; i < this.documents.length; i++) {\n var doc = this.documents[i];\n var name = doc.fileName || 'Document';\n if (name.length > 20) name = name.substring(0, 17) + '...';\n html += '';\n html += ' ';\n html += this.escapeHtml(name);\n html += ' ';\n html += '';\n }\n\n for (var m = 0; m < this.uploadErrors.length; m++) {\n var failedItem = this.uploadErrors[m];\n var failedName = failedItem.fileName || 'File';\n var errorMsg = failedItem.error || 'Upload failed';\n if (failedName.length > 15) failedName = failedName.substring(0, 12) + '...';\n html += '';\n html += ' ';\n html += this.escapeHtml(failedName);\n html += ' ';\n html += '';\n }\n\n if (this.isUploading) {\n html += '';\n html += ' Uploading...';\n html += '';\n }\n\n html += '';\n html += '
';\n if (config.supportedExtensionsText) {\n html += '
Supported formats: ' + this.escapeHtml(config.supportedExtensionsText) + '
';\n }\n\n html += '
';\n\n this.documentBar.replaceChildren(DOMPurify.sanitize(html, { RETURN_DOM_FRAGMENT: true }));\n\n // Bind remove handlers\n var self = this;\n var closeButtons = this.documentBar.querySelectorAll('[data-doc-index]');\n for (var j = 0; j < closeButtons.length; j++) {\n closeButtons[j].addEventListener('click', (function (idx) {\n return function (e) {\n e.preventDefault();\n e.stopPropagation();\n var docToRemove = self.documents[idx];\n if (docToRemove) self.removeDocument(docToRemove);\n };\n })(parseInt(closeButtons[j].getAttribute('data-doc-index'))));\n }\n\n // Bind error dismiss handlers\n var errorCloseButtons = this.documentBar.querySelectorAll('[data-error-index]');\n for (var n = 0; n < errorCloseButtons.length; n++) {\n errorCloseButtons[n].addEventListener('click', (function (idx) {\n return function (e) {\n e.preventDefault();\n e.stopPropagation();\n self.uploadErrors.splice(idx, 1);\n self.renderDocumentBar();\n };\n })(parseInt(errorCloseButtons[n].getAttribute('data-error-index'))));\n }\n\n // Bind add button\n var addBtn = this.documentBar.querySelector('.ai-chat-doc-add-btn');\n if (addBtn) {\n addBtn.addEventListener('click', function (e) {\n e.preventDefault();\n self.triggerFileInput();\n });\n }\n },\n escapeHtml(text) {\n var div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n },\n extractReadableErrorMessage(errorText, fallbackMessage) {\n if (!errorText || typeof errorText !== 'string') {\n return fallbackMessage;\n }\n\n var trimmed = errorText.trim();\n if (!trimmed) {\n return fallbackMessage;\n }\n\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n var parsed = JSON.parse(trimmed);\n var message = parsed?.error || parsed?.message || parsed?.title || parsed?.detail;\n return typeof message === 'string' && message.trim()\n ? message.trim()\n : fallbackMessage;\n } catch (err) {\n return fallbackMessage;\n }\n }\n\n if (/<[^>]+>/.test(trimmed)) {\n return fallbackMessage;\n }\n\n return trimmed;\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : this.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadSession\", (data) => {\n this.initializeSession(data.sessionId, true);\n this.messages = [];\n this.documents = data.documents || [];\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n\n // Update feedback icons in the DOM after all messages have rendered.\n this.$nextTick(() => {\n this.refreshAllFeedbackIcons();\n });\n\n // When the session is new (no messages) and an initial prompt is configured,\n // automatically send it as the first user message to trigger an AI response.\n if (this.messages.length === 0 && config.initialPrompt) {\n this.prompt = config.initialPrompt;\n this.sendMessage();\n }\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // If this is a widget with a stale cached session (e.g., profile was deleted),\n // clear the cached session and start fresh with the current profile.\n if (this.widgetIsInitialized && !this.isSessionStarted && !this._attemptedSessionRecovery) {\n this._attemptedSessionRecovery = true;\n localStorage.removeItem(this.chatWidgetStateSession);\n this.startNewSession();\n }\n });\n\n this.connection.on(\"MessageRated\", (messageId, userRating) => {\n var msg = this.messages.find(m => m.id === messageId);\n if (msg) {\n msg.userRating = userRating;\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (sessionId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (sessionId, text) => {\n if (text) {\n this.stopAudio();\n\n // If there's an interrupted assistant message still streaming,\n // mark it as done to stop the spinner animation.\n if (this._conversationAssistantMessage) {\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\n if (oldMsg) {\n oldMsg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (sessionId, messageId, token, responseId, appearance) => {\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n userRating: null,\n appearance: this.normalizeAssistantAppearance(appearance),\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.content = this._conversationAssistantMessage.content;\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (sessionId, messageId) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (sessionId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n this.audioChunks.push(bytes);\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (sessionId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n\n if (this.isSessionStarted) {\n this.reloadCurrentSession();\n } else if (config.autoCreateSession) {\n this.startNewSession();\n }\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingOpenAIPromotMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedOpenAIPromotMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n\n // Ensure userRating is always defined for Vue reactivity.\n if (message.userRating === undefined) {\n message.userRating = null;\n }\n\n if (message.content) {\n let processedContent = message.content.trim();\n message.references = normalizeReferences(message.references);\n\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\n\n // Only include references that were actually cited in the response.\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\n\n if (citedRefs.length) {\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders.\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\n processedContent = processedContent.replaceAll('', ',');\n\n processedContent += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || key;\n processedContent += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n }\n }\n\n message.content = processedContent;\n message.htmlContent = parseMarkdownContent(processedContent, message);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n addMessages(messages) {\n\n for (let i = 0; i < messages.length; i++) {\n this.addMessageInternal(messages[i]);\n }\n\n this.hidePlaceholder();\n this.$nextTick(() => {\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n isOrchestratorAvailable() {\n return config.isOrchestratorAvailable !== false;\n },\n applyOrchestratorAvailability() {\n if (this.isOrchestratorAvailable()) {\n return true;\n }\n\n const unavailableMessage = config.orchestratorUnavailableMessage || \"This orchestrator is not currently available.\";\n\n if (this.inputElement) {\n this.inputElement.disabled = true;\n this.inputElement.value = '';\n this.inputElement.placeholder = unavailableMessage;\n }\n\n if (this.buttonElement) {\n this.buttonElement.disabled = true;\n }\n\n if (this.micButtonElement) {\n this.micButtonElement.disabled = true;\n this.micButtonElement.style.display = 'none';\n }\n\n if (this.conversationButtonElement) {\n this.conversationButtonElement.disabled = true;\n this.conversationButtonElement.style.display = 'none';\n }\n\n return false;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n sendMessage() {\n if (!this.applyOrchestratorAvailability()) {\n return;\n }\n\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // In single-response mode, clear all previous messages.\n if (this.singleResponseMode) {\n this.messages.splice(0, this.messages.length);\n }\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n this.streamMessage(this.getProfileId(), trimmedPrompt, null);\n this.inputElement.value = '';\n this.prompt = '';\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var profileId = this.getProfileId();\n var sessionId = this.getSessionId() || '';\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", profileId, sessionId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n },\n streamMessage(profileId, trimmedPrompt, sessionProfileId) {\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n // Get the index after showing typing indicator.\n var messageIndex = this.messages.length;\n var currentSessionId = this.getSessionId();\n\n this.stream = this.connection.stream(\"SendMessage\", profileId, trimmedPrompt, currentSessionId, sessionProfileId)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n\n if (chunk.sessionId && !currentSessionId) {\n this.initializeSession(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n // Re-assign the index after hiding the typing indicator.\n messageIndex = this.messages.length;\n let newMessage = {\n id: chunk.messageId,\n role: \"assistant\",\n title: chunk.title,\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n userRating: null,\n };\n\n this.messages.push(newMessage);\n\n message = newMessage;\n }\n\n if (chunk.title && (!message.title || message.title !== chunk.title)) {\n message.title = chunk.title;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = normalizeReference(value) ?? {};\n }\n }\n\n if (chunk.content) {\n\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n let processedContent = chunk.content;\n\n for (const [key, value] of Object.entries(references)) {\n processedContent = processedContent.replaceAll(key, `${value.index}`);\n }\n\n // Append processed content to the message.\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\n content += processedContent.replaceAll('
', ',');\n }\n\n // Update the existing message\n message.content = content;\n\n message.htmlContent = parseMarkdownContent(content, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n let newMessage = {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n\n return newMessage;\n },\n processReferences(references, messageIndex) {\n references = normalizeReferences(references);\n\n if (Object.keys(references).length) {\n\n let message = this.messages[messageIndex];\n const content = message.content || '';\n\n // Only include references that were actually cited in the response.\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\n const citedRefs = Object.entries(references).filter(([key, value]) =>\n content.includes(key) || content.includes(`${value.index}`)\n );\n\n if (!citedRefs.length) {\n return;\n }\n\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\n let processed = content.trim();\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processed = processed.replaceAll(key, placeholder);\n processed = processed.replaceAll(`${value.index}`, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processed = processed.replaceAll('', ',');\n\n processed += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || key;\n processed += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n\n message.content = processed;\n message.htmlContent = parseMarkdownContent(processed, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n if (this.inputElement) {\n this.inputElement.setAttribute('disabled', 'disabled');\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n if (this.inputElement) {\n this.inputElement.removeAttribute('disabled');\n this.inputElement.focus();\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getProfileId(), this.getSessionId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio();\n this.ttsPlayingMessageIndex = index;\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.currentAudioElement && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is already playing, queue this blob for sequential playback.\n if (this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.isPlayingAudio = false;\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n var nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n // During TTS playback, detect when the user speaks above\n // the threshold to stop TTS (interrupt). Audio chunks are\n // always forwarded — browser echo cancellation handles\n // speaker echo so the STT stream has no gaps.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var profileId = this.getProfileId();\n var sessionId = this.getSessionId() || '';\n var language = navigator.language || document.documentElement.lang || 'en-US';\n\n this.connection.send(\"StartConversation\", profileId, sessionId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, audio playback continuation\n // is handled by the persistent stream. This method is only\n // called from playCollectedAudio for non-conversation TTS.\n },\n generatePrompt(element) {\n if (!element) {\n console.error('The element paramter is required.');\n\n return;\n }\n\n let templateProfileId = element.getAttribute('data-profile-id');\n let sessionId = this.getSessionId();\n let sessionProfileId = this.getProfileId();\n\n if (!templateProfileId || !sessionId) {\n\n console.error('The given element is missing data-profile-id or the session has not yet started.');\n return;\n }\n\n // streamMessage() already shows the typing indicator.\n this.streamMessage(templateProfileId, null, sessionProfileId);\n },\n createSessionUrl(baseUrl, param, value) {\n\n const fullUrl = baseUrl.toLowerCase().startsWith('http') ? baseUrl : window.location.origin + baseUrl;\n const url = new URL(fullUrl);\n\n url.searchParams.set(param, value);\n\n return url.toString();\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\n if (existingIndex >= 0) {\n this.notifications.splice(existingIndex, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.$nextTick(() => {\n this.scrollToBottom();\n });\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\n if (existingIndex >= 0) {\n this.notifications.splice(existingIndex, 1, notification);\n this.scheduleNotificationDismiss(notification);\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var sessionId = this.getSessionId();\n this.connection.invoke(\"HandleNotificationAction\", sessionId, notificationType, actionName).catch(function (err) {\n console.error(\"Error handling notification action:\", err);\n });\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getProfileId() {\n return this.inputElement.getAttribute('data-profile-id');\n },\n setSessionId(sessionId) {\n this.inputElement.setAttribute('data-session-id', sessionId || '');\n },\n resetSession() {\n this.stopRecording();\n this.setSessionId('');\n this.isSessionStarted = false;\n this.sessionRating = null;\n if (this.widgetIsInitialized) {\n localStorage.removeItem(this.chatWidgetStateSession);\n }\n this.messages = [];\n this.documents = [];\n if (!config.autoCreateSession) {\n this.showPlaceholder();\n }\n\n if (config.autoCreateSession) {\n this.startNewSession();\n }\n },\n startNewSession() {\n if (!this.applyOrchestratorAvailability()) {\n return;\n }\n\n const profileId = this.getProfileId();\n if (!profileId || !this.connection) {\n return;\n }\n\n this.connection.invoke(\"StartSession\", profileId, null).catch(err => console.error(err));\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n this.applyOrchestratorAvailability();\n\n const sessionId = this.getSessionId();\n if (!config.widget && sessionId) {\n this.loadSession(sessionId);\n } else if (this.isOrchestratorAvailable() && config.autoCreateSession && !config.widget && !sessionId) {\n this.startNewSession();\n }\n\n // Initialize document bar if enabled.\n if (config.sessionDocumentsEnabled && config.documentBarSelector) {\n this.documentBar = document.querySelector(config.documentBarSelector);\n if (this.documentBar) {\n this.renderDocumentBar();\n\n // Create hidden file input for document uploads.\n var fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.id = 'ai-chat-doc-input';\n fileInput.className = 'd-none';\n fileInput.multiple = true;\n if (config.allowedExtensions) {\n fileInput.accept = config.allowedExtensions;\n }\n fileInput.addEventListener('change', (e) => this.handleFileInputChange(e));\n this.documentBar.parentElement.appendChild(fileInput);\n\n // Set up drag-and-drop on the input area.\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) {\n inputArea.addEventListener('dragover', (e) => this.handleDragOver(e));\n inputArea.addEventListener('dragleave', (e) => this.handleDragLeave(e));\n inputArea.addEventListener('drop', (e) => this.handleDrop(e));\n }\n }\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keydown', event => {\n\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.buttonElement.addEventListener('click', () => {\n\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const promptGenerators = document.getElementsByClassName('profile-generated-prompt');\n\n for (var i = 0; i < promptGenerators.length; i++) {\n promptGenerators[i].addEventListener('click', (e) => {\n e.preventDefault();\n this.generatePrompt(e.target);\n });\n }\n\n const chatSessions = document.getElementsByClassName('chat-session-history-item');\n\n for (var i = 0; i < chatSessions.length; i++) {\n chatSessions[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var sessionId = e.target.getAttribute('data-session-id');\n\n if (!sessionId) {\n console.error('an element with the class chat-session-history-item with no data-session-id set.');\n\n return;\n }\n\n this.loadSession(sessionId);\n this.showChatScreen();\n });\n }\n\n for (let i = 0; i < config.messages.length; i++) {\n this.addMessage(config.messages[i]);\n }\n\n // Update feedback icons in the DOM after initial messages have rendered.\n this.$nextTick(() => {\n this.refreshAllFeedbackIcons();\n });\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n },\n loadSession(sessionId) {\n this.connection.invoke(\"LoadSession\", sessionId).catch(err => console.error(err));\n },\n reloadCurrentSession() {\n\n var sessionId = this.getSessionId();\n if (sessionId) {\n this.loadSession(sessionId);\n }\n },\n initializeSession(sessionId, force) {\n if (this.isSessionStarted && !force) {\n return\n }\n this.fireEvent(new CustomEvent(\"initializingSessionOpenAIChat\", { detail: { sessionId: sessionId } }))\n this.setSessionId(sessionId);\n this.isSessionStarted = true;\n\n if (this.widgetIsInitialized) {\n localStorage.setItem(this.chatWidgetStateSession, sessionId);\n }\n },\n initializeWidget() {\n\n if (!config.widget.chatWidgetContainer) {\n console.error('The widget chatWidgetContainer is required.');\n return;\n }\n\n if (!config.widget.chatWidgetStateName) {\n console.error('The widget chatWidgetStateName is required.');\n return;\n }\n\n const chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);\n\n if (!chatWidgetContainer) {\n return;\n }\n\n if (config.widget.chatHistorySection) {\n this.chatHistorySection = document.querySelector(config.widget.chatHistorySection);\n }\n\n this.chatWidgetStateName = config.widget.chatWidgetStateName;\n this.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';\n this.widgetIsInitialized = true;\n\n // Auto-load the last session so the user always sees previous chat history.\n this.reloadCurrentSession();\n\n if (config.autoCreateSession && !this.getSessionId()) {\n this.startNewSession();\n }\n\n if (config.widget.showHistoryButton && this.chatHistorySection) {\n\n const showHistoryButton = document.querySelector(config.widget.showHistoryButton);\n\n if (showHistoryButton) {\n showHistoryButton.addEventListener('click', () => {\n this.chatHistorySection.classList.toggle('show');\n });\n }\n\n if (config.widget.closeHistoryButton) {\n var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);\n\n if (closeHistoryButton) {\n closeHistoryButton.addEventListener('click', () => {\n this.showChatScreen();\n });\n }\n }\n }\n\n if (config.widget.newChatButton) {\n const newChatButton = document.querySelector(config.widget.newChatButton);\n\n if (newChatButton) {\n newChatButton.addEventListener('click', () => {\n this.resetSession();\n this.showChatScreen();\n });\n }\n }\n },\n showChatScreen() {\n\n if (!this.chatHistorySection) {\n return;\n }\n\n this.chatHistorySection.classList.remove('show');\n },\n getSessionId() {\n let sessionId = this.inputElement.getAttribute('data-session-id');\n\n if (!sessionId && this.widgetIsInitialized) {\n sessionId = localStorage.getItem(this.chatWidgetStateSession);\n }\n\n return sessionId;\n },\n copyResponse(message) {\n navigator.clipboard.writeText(message);\n },\n updateFeedbackIcons(container, userRating) {\n if (!container) {\n return;\n }\n\n var upBtn = container.querySelector('.rate-up-btn');\n var downBtn = container.querySelector('.rate-down-btn');\n\n // Font Awesome SVG+JS replaces with , so we must replace\n // the entire button content and let Font Awesome re-process.\n if (upBtn) {\n var upClass = userRating === true ? 'fa-solid fa-thumbs-up' : 'fa-regular fa-thumbs-up';\n var upIcon = document.createElement('i');\n upIcon.className = upClass;\n upIcon.style.fontSize = '0.9rem';\n upBtn.textContent = '';\n upBtn.appendChild(upIcon);\n }\n\n if (downBtn) {\n var downClass = userRating === false ? 'fa-solid fa-thumbs-down' : 'fa-regular fa-thumbs-down';\n var downIcon = document.createElement('i');\n downIcon.className = downClass;\n downIcon.style.fontSize = '0.9rem';\n downBtn.textContent = '';\n downBtn.appendChild(downIcon);\n }\n\n // Trigger Font Awesome SVG+JS to convert the new elements.\n if (window.FontAwesome && FontAwesome.dom && FontAwesome.dom.i2svg) {\n FontAwesome.dom.i2svg({ node: container });\n }\n },\n refreshAllFeedbackIcons() {\n var containers = this.$el.querySelectorAll('.ai-chat-message-assistant-feedback');\n\n for (var i = 0; i < containers.length; i++) {\n var msgId = containers[i].getAttribute('data-message-id');\n var msg = this.messages.find(m => m.id === msgId);\n\n if (msg) {\n this.updateFeedbackIcons(containers[i], msg.userRating);\n }\n }\n },\n rateMessage(message, isPositive, event) {\n var sessionId = this.getSessionId();\n\n if (!sessionId || !message.id || !this.connection) {\n return;\n }\n\n // Toggle: clicking the same rating again clears it.\n var newRating = message.userRating === isPositive ? null : isPositive;\n message.userRating = newRating;\n\n // Find the feedback container by message ID for reliable DOM targeting.\n var feedbackContainer = this.$el.querySelector(\n '.ai-chat-message-assistant-feedback[data-message-id=\"' + message.id + '\"]'\n );\n\n this.updateFeedbackIcons(feedbackContainer, newRating);\n\n // Trigger spark animation after Font Awesome has re-processed icons.\n if (newRating !== null && feedbackContainer) {\n setTimeout(() => {\n var btnClass = isPositive ? '.rate-up-btn' : '.rate-down-btn';\n var btn = feedbackContainer.querySelector(btnClass);\n\n if (btn) {\n btn.classList.remove('spark-effect');\n void btn.offsetWidth;\n btn.classList.add('spark-effect');\n btn.addEventListener('animationend', function onEnd() {\n btn.removeEventListener('animationend', onEnd);\n btn.classList.remove('spark-effect');\n });\n }\n }, 50);\n }\n\n this.connection.invoke(\"RateMessage\", sessionId, message.id, isPositive).catch(function (err) {\n console.error('Failed to rate message:', err);\n });\n }\n },\n watch: {\n documents: {\n handler() { this.renderDocumentBar(); },\n deep: true\n },\n isUploading() { this.renderDocumentBar(); },\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n // Hide/show mic button.\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n // Hide/show send button.\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n // Disable/enable textarea.\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n if (config.widget) {\n this.initializeWidget();\n }\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n return {\n initialize: initialize\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} \ No newline at end of file +{"version":3,"sources":["ai-chat.js"],"names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","from","_arrayLikeToArray","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","push","_typeof","window","openAIChatManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","userLabel","assistantLabel","thumbsUpTitle","thumbsDownTitle","copyTitle","codeCopiedText","widget","chatWidgetContainer","chatWidgetStateName","chatHistorySection","showHistoryButton","closeHistoryButton","newChatButton","toggleButtonSelector","resetSizeButtonSelector","dragHandleSelector","enableDragging","enableResizing","persistLayout","defaultWidth","defaultHeight","minWidth","minHeight","messageTemplate","indicatorTemplate","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","parsePixelValue","Number","isFinite","parsed","parseFloat","clamp","min","max","Math","normalizeReference","reference","_ref","_normalized$index","_ref2","_normalized$text","_ref3","_normalized$link","normalized","assign","index","Index","Text","link","Link","normalizeReferences","references","_i","_Object$entries","entries","_normalizeReference","_Object$entries$_i","key","renderer","marked","Renderer","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","__chartConfigs","createChartHtml","chartId","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","tryExtractChartMarker","startIndex","type","raw","substring","endIndex","json","token","config","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","renderChartsInMessage","message","charts","requestAnimationFrame","_iterator","_step","renderChartOnCanvas","err","canvas","getElementById","Chart","console","warn","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","renderPendingCharts","configs","_i2","_Object$keys","keys","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","initialize","instanceConfig","hasWidgetConfig","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isSessionStarted","isPlaceholderVisible","chatWidgetStateSession","chatWidgetLayoutKey","widgetContainerElement","widgetToggleButtonElement","widgetResetSizeButtonElement","widgetResizeObserver","widgetViewportResizeHandler","widgetDefaultWidth","widgetDefaultHeight","widgetIsInitialized","isStreaming","isNavigatingAway","autoScroll","stream","messages","notifications","prompt","documents","existingDocuments","isUploading","uploadErrors","isDragOver","documentBar","metricsEnabled","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsButton","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","random","singleResponseMode","conversationModeEnabled","conversationButton","isConversationMode","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","getStoredWidgetLayout","storedLayout","localStorage","getItem","saveStoredWidgetLayout","partialLayout","currentLayout","nextLayout","panel","toggle","setItem","stringify","getElementSize","element","fallbackWidth","fallbackHeight","width","height","rect","getBoundingClientRect","getComputedStyle","round","clampWidgetPosition","left","top","viewportPadding","maxLeft","innerWidth","maxTop","innerHeight","applyAbsolutePosition","style","right","bottom","getWidgetDefaultSize","persistWidgetPanelPosition","panelRect","persistWidgetTogglePosition","toggleRect","persistWidgetPanelSize","defaultSize","currentSize","abs","updateWidgetResetSizeButtonVisibility","classList","add","isResized","resetWidgetSize","removeProperty","constrainWidgetElementsToViewport","restoreWidgetLayout","attachDraggableWidgetElement","handle","layoutKey","suppressClickOnDrag","_this","activePointerId","startX","startY","startLeft","startTop","dragged","dragThreshold","interactiveSelector","stopDragging","event","pointerId","removeEventListener","onPointerMove","remove","dataset","dragSuppressClick","setTimeout","deltaX","clientX","deltaY","clientY","hypot","nextPosition","addEventListener","button","target","closest","setPointerCapture","preventDefault","panelDefaultSize","panelSize","clampedPanel","toggleSize","clampedToggle","handleDragOver","sessionDocumentsEnabled","stopPropagation","inputArea","handleDragLeave","handleDrop","dataTransfer","files","uploadFiles","triggerFileInput","fileInput","click","handleFileInputChange","_this2","_callee","sessionId","profileId","formData","response","errorText","uploadError","result","j","_t","_context","uploadDocumentUrl","getSessionId","getProfileId","renderDocumentBar","FormData","append","fetch","method","body","ok","extractReadableErrorMessage","fileName","initializeSession","uploaded","failed","removeDocument","doc","_this3","_callee2","removeError","_t2","_context2","removeDocumentUrl","headers","itemId","documentId","splice","status","formatFileSize","bytes","toFixed","escapeHtml","failedItem","failedName","errorMsg","supportedExtensionsText","replaceChildren","RETURN_DOM_FRAGMENT","self","closeButtons","querySelectorAll","docToRemove","parseInt","getAttribute","errorCloseButtons","addBtn","querySelector","div","fallbackMessage","startsWith","title","detail","normalizeAssistantAppearance","appearance","label","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","startConnection","_this4","_callee3","_t3","_context3","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","forEach","msg","addMessage","$nextTick","refreshAllFeedbackIcons","initialPrompt","sendMessage","stopRecording","_attemptedSessionRecovery","removeItem","startNewSession","messageId","userRating","find","id","isFinal","_conversationPartialTranscript","escaped","replace","_conversationPartialMessage","hidePlaceholder","htmlContent","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","responseId","hideTypingIndicator","msgIndex","newMessage","base64Audio","contentType","binaryString","atob","Uint8Array","charCodeAt","playCollectedAudio","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentSession","autoCreateSession","onclose","addMessageInternal","_this5","fireEvent","CustomEvent","_this6","processedContent","citedRefs","filter","_ref4","_ref5","includes","sort","_ref6","_ref7","_ref8","_ref9","b","displayIndex","_iterator2","_step2","_step2$value","replaceAll","_displayIndex","_placeholder","_iterator3","_step3","_step3$value","_iterator4","_step4","_step4$value","addMessages","_this7","showPlaceholder","isOrchestratorAvailable","applyOrchestratorAvailability","unavailableMessage","orchestratorUnavailableMessage","disabled","micButtonElement","display","conversationButtonElement","isIndicator","trimmedPrompt","streamMessage","startRecording","_this8","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","subject","Subject","pendingChunk","size","_callee4","uint8Array","base64","_context4","arrayBuffer","reduce","str","byte","String","fromCharCode","btoa","getTracks","track","stop","complete","documentElement","send","updateMicButton","toggleRecording","sessionProfileId","_this9","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentSessionId","subscribe","chunk","_i3","_Object$entries2","_normalizeReference2","_Object$entries2$_i","_i4","_Object$entries3","_Object$entries3$_i","_this9$stream","processReferences","streamingFinished","synthesizeSpeech","_this9$stream2","getServiceDownMessage","_this0","_ref1","_ref10","_ref11","_ref12","_ref13","_ref14","processed","_iterator5","_step5","_step5$value","_iterator6","_step6","_step6$value","_iterator7","_step7","_step7$value","stopIcon","setAttribute","startIcon","removeAttribute","focus","icons","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this1","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","totalLength","sum","combined","offset","_iterator8","_step8","set","blob","Blob","_this10","URL","createObjectURL","Audio","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this11","updateConversationButton","_conversationSubject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","micSource","createMediaStreamSource","connect","analyser","interruptVolumeThreshold","freqData","frequencyBinCount","getByteFrequencyData","k","avg","_callee5","_context5","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","generatePrompt","templateProfileId","createSessionUrl","baseUrl","param","fullUrl","toLowerCase","location","origin","searchParams","originalLength","removedCount","_this12","clearNotificationDismiss","existingIndex","findIndex","scheduleNotificationDismiss","_this13","timerId","clearTimeout","dismissNotification","handleNotificationAction","actionName","_this14","scrollTop","scrollHeight","clientHeight","handleUserInput","setSessionId","resetSession","sessionRating","initializeApp","_this15","placeholderElementSelector","loadSession","documentBarSelector","className","multiple","allowedExtensions","accept","parentElement","appendChild","threshold","atBottom","shiftKey","lastMsg","pop","promptGenerators","getElementsByClassName","chatSessions","showChatScreen","btn","block","codeEl","clipboard","writeText","copiedText","micButtonElementSelector","conversationButtonElementSelector","force","initializeWidget","_this16","ResizeObserver","observe","dragHandle","copyResponse","updateFeedbackIcons","container","upBtn","downBtn","upClass","upIcon","fontSize","downClass","downIcon","FontAwesome","dom","i2svg","node","containers","$el","msgId","rateMessage","isPositive","newRating","feedbackContainer","btnClass","offsetWidth","onEnd","watch","handler","deep","active","mounted","_this17","_callee6","_context6","beforeUnmount","template","mount","download","toDataURL","img","res","removeChild"],"mappings":"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","file":"ai-chat.js","sourcesContent":["window.openAIChatManager = function () {\r\n\r\n // Defaults (can be overridden by instanceConfig)\r\n var defaultConfig = {\r\n // UI defaults for generated media\r\n generatedImageAltText: 'Generated Image',\r\n generatedImageMaxWidth: 400,\r\n downloadImageTitle: 'Download image',\r\n downloadChartTitle: 'Download chart as image',\r\n downloadChartButtonText: 'Download',\r\n userLabel: 'You',\r\n assistantLabel: 'Assistant',\r\n thumbsUpTitle: 'Thumbs up',\r\n thumbsDownTitle: 'Thumbs down',\r\n copyTitle: 'Click here to copy response to clipboard.',\r\n codeCopiedText: 'Copied!',\r\n widget: {\r\n chatWidgetContainer: null,\r\n chatWidgetStateName: null,\r\n chatHistorySection: null,\r\n showHistoryButton: null,\r\n closeHistoryButton: null,\r\n newChatButton: null,\r\n toggleButtonSelector: null,\r\n resetSizeButtonSelector: null,\r\n dragHandleSelector: '.ai-chat-widget-header',\r\n enableDragging: true,\r\n enableResizing: true,\r\n persistLayout: true,\r\n defaultWidth: null,\r\n defaultHeight: null,\r\n minWidth: 320,\r\n minHeight: 420\r\n },\r\n messageTemplate: `\r\n
\r\n
\r\n
\r\n
{{ userLabel }}
\r\n
\r\n \r\n {{ getAssistantLabel(message) }}\r\n
\r\n
\r\n

{{ message.title }}

\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{ notification.content }}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n `,\r\n indicatorTemplate: `\r\n
\r\n \r\n Assistant\r\n
\r\n `\r\n };\r\n\r\n // Sanitize URLs to prevent javascript: protocol injection.\r\n function sanitizeUrl(url) {\r\n if (!url) return '';\r\n var trimmed = url.trim();\r\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\r\n return '';\r\n }\r\n return url;\r\n }\r\n\r\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\r\n function escapeHtmlEntities(text) {\r\n var span = document.createElement('span');\r\n span.textContent = text;\r\n return span.innerHTML;\r\n }\r\n\r\n function parsePixelValue(value) {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n var parsed = parseFloat(value);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n }\r\n\r\n function clamp(value, min, max) {\r\n return Math.min(Math.max(value, min), max);\r\n }\r\n\r\n function normalizeReference(reference) {\r\n if (!reference || typeof reference !== 'object') {\r\n return null;\r\n }\r\n\r\n const normalized = Object.assign({}, reference);\r\n normalized.index = normalized.index ?? normalized.Index ?? 0;\r\n normalized.text = normalized.text ?? normalized.Text ?? null;\r\n normalized.link = normalized.link ?? normalized.Link ?? null;\r\n\r\n return normalized;\r\n }\r\n\r\n function normalizeReferences(references) {\r\n if (!references || typeof references !== 'object') {\r\n return {};\r\n }\r\n\r\n const normalized = {};\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n normalized[key] = normalizeReference(value) ?? {};\r\n }\r\n\r\n return normalized;\r\n }\r\n\r\n const renderer = new marked.Renderer();\r\n\r\n // Modify the link rendering to open in a new tab\r\n renderer.link = function (data) {\r\n var href = sanitizeUrl(data.href);\r\n if (!href) return data.text || '';\r\n return `
${data.text}`;\r\n };\r\n\r\n // Custom code block renderer with highlight.js integration and copy button.\r\n renderer.code = function (data) {\r\n var code = data.text || '';\r\n var lang = (data.lang || '').trim();\r\n var highlighted = code;\r\n\r\n if (typeof hljs !== 'undefined') {\r\n if (lang && hljs.getLanguage(lang)) {\r\n try {\r\n highlighted = hljs.highlight(code, { language: lang }).value;\r\n } catch (_) { }\r\n } else {\r\n try {\r\n highlighted = hljs.highlightAuto(code).value;\r\n } catch (_) { }\r\n }\r\n } else {\r\n highlighted = escapeHtmlEntities(code);\r\n }\r\n\r\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\r\n return `
${langDisplay}
${highlighted}
`;\r\n };\r\n\r\n // Custom image renderer for generated images with thumbnail styling and download button.\r\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\r\n renderer.image = function (data) {\r\n const src = sanitizeUrl(data.href);\r\n if (!src) return '';\r\n const alt = data.text || defaultConfig.generatedImageAltText;\r\n const maxWidth = defaultConfig.generatedImageMaxWidth;\r\n return `
\r\n \"${alt}\"\r\n
\r\n \r\n \r\n \r\n
\r\n
`;\r\n };\r\n\r\n // Chart counter for unique IDs\r\n let chartCounter = 0;\r\n\r\n // Collector for charts discovered during marked parsing.\r\n let _pendingCharts = [];\r\n\r\n // Global chart config map: any page (e.g., Chat Interactions) that uses\r\n // the shared marked instance can call window.renderPendingCharts() after\r\n // its DOM update to render charts it didn't create itself.\r\n window.__chartConfigs = window.__chartConfigs || {};\r\n\r\n function createChartHtml(chartId) {\r\n return `
`\r\n + ``\r\n + `
`\r\n + `
`\r\n + ``\r\n + `
`;\r\n }\r\n\r\n // Register [chart:{...json...}] as a native marked block extension so the\r\n // markdown parser handles chart markers inline with surrounding text.\r\n marked.use({\r\n extensions: [{\r\n name: 'chart',\r\n level: 'block',\r\n start(src) {\r\n const idx = src.indexOf('[chart:');\r\n return idx >= 0 ? idx : undefined;\r\n },\r\n tokenizer(src) {\r\n const extracted = tryExtractChartMarker(src);\r\n if (!extracted || extracted.startIndex !== 0) {\r\n return undefined;\r\n }\r\n\r\n const chartId = `chat_chart_${++chartCounter}`;\r\n\r\n return {\r\n type: 'chart',\r\n raw: src.substring(0, extracted.endIndex),\r\n chartId: chartId,\r\n json: extracted.json,\r\n };\r\n },\r\n renderer(token) {\r\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\r\n window.__chartConfigs[token.chartId] = token.json;\r\n return createChartHtml(token.chartId);\r\n }\r\n }]\r\n });\r\n\r\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\r\n function tryExtractChartMarker(text) {\r\n const token = '[chart:';\r\n const start = text.indexOf(token);\r\n if (start < 0) {\r\n return null;\r\n }\r\n\r\n // Find JSON object boundary by balancing braces\r\n const jsonStart = start + token.length;\r\n let i = jsonStart;\r\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\r\n i++;\r\n }\r\n\r\n if (i >= text.length || text[i] !== '{') {\r\n return null;\r\n }\r\n\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n\r\n for (; i < text.length; i++) {\r\n const ch = text[i];\r\n\r\n if (inString) {\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n if (ch === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n inString = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n depth++;\r\n } else if (ch === '}') {\r\n depth--;\r\n if (depth === 0) {\r\n const jsonEnd = i;\r\n // Expect closing bracket after JSON\r\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\r\n if (closeBracketIndex < 0) {\r\n return null;\r\n }\r\n\r\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\r\n return {\r\n startIndex: start,\r\n endIndex: closeBracketIndex + 1,\r\n json: json\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function renderChartsInMessage(message) {\r\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\r\n return;\r\n }\r\n\r\n // Copy and clear pending charts immediately to prevent duplicate renders.\r\n const charts = [...message._pendingCharts];\r\n message._pendingCharts = [];\r\n\r\n // Defer to requestAnimationFrame so the browser has fully laid out the\r\n // canvas elements before Chart.js reads their dimensions.\r\n requestAnimationFrame(() => {\r\n for (const c of charts) {\r\n renderChartOnCanvas(c.chartId, c.config);\r\n }\r\n });\r\n }\r\n\r\n function renderChartOnCanvas(chartId, config) {\r\n const canvas = document.getElementById(chartId);\r\n if (!canvas) {\r\n return false;\r\n }\r\n\r\n if (typeof Chart === 'undefined') {\r\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\r\n return false;\r\n }\r\n\r\n // When the canvas is inside a hidden container (e.g., a widget panel with\r\n // display:none), it has zero dimensions and Chart.js cannot render correctly.\r\n // Keep the config in __chartConfigs so renderPendingCharts() can retry later\r\n // once the container becomes visible.\r\n if (canvas.offsetParent === null) {\r\n window.__chartConfigs[chartId] = config;\r\n return false;\r\n }\r\n\r\n try {\r\n if (canvas._chartInstance) {\r\n canvas._chartInstance.destroy();\r\n }\r\n\r\n const cfg = typeof config === 'string' ? JSON.parse(config) : config;\r\n cfg.options ??= {};\r\n cfg.options.responsive = true;\r\n cfg.options.maintainAspectRatio = true;\r\n cfg.options.aspectRatio ??= 4 / 3;\r\n\r\n canvas._chartInstance = new Chart(canvas, cfg);\r\n delete window.__chartConfigs[chartId];\r\n return true;\r\n } catch (e) {\r\n console.error('Error creating chart:', e);\r\n return false;\r\n }\r\n }\r\n\r\n // Global function: renders any chart canvases whose configs are in the\r\n // global __chartConfigs map. Called by pages (e.g., Chat Interactions)\r\n // that share the marked instance but have their own rendering pipeline.\r\n window.renderPendingCharts = function () {\r\n if (typeof Chart === 'undefined') {\r\n return;\r\n }\r\n\r\n const configs = window.__chartConfigs;\r\n if (!configs) {\r\n return;\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n for (const chartId of Object.keys(configs)) {\r\n renderChartOnCanvas(chartId, configs[chartId]);\r\n }\r\n });\r\n };\r\n\r\n // Parse markdown content via marked (which natively handles [chart:...] markers\r\n // through the registered extension) and collect pending chart configs for later\r\n // Chart.js rendering.\r\n function parseMarkdownContent(content, message) {\r\n _pendingCharts = [];\r\n const html = marked.parse(content, { renderer });\r\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\r\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\r\n }\r\n\r\n const initialize = (instanceConfig) => {\r\n\r\n const config = Object.assign({}, defaultConfig, instanceConfig);\r\n config.widget = Object.assign({}, defaultConfig.widget || {}, instanceConfig && instanceConfig.widget ? instanceConfig.widget : {});\r\n const hasWidgetConfig = !!(instanceConfig && instanceConfig.widget && instanceConfig.widget.chatWidgetContainer && instanceConfig.widget.chatWidgetStateName);\r\n // Keep defaultConfig in sync so renderers use overridden values\r\n defaultConfig = config;\r\n\r\n if (!config.signalRHubUrl) {\r\n console.error('The signalRHubUrl is required.');\r\n return;\r\n }\r\n\r\n if (!config.appElementSelector) {\r\n console.error('The appElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.chatContainerElementSelector) {\r\n console.error('The chatContainerElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.inputElementSelector) {\r\n console.error('The inputElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.sendButtonElementSelector) {\r\n console.error('The sendButtonElementSelector is required.');\r\n return;\r\n }\r\n\r\n const app = Vue.createApp({\r\n data() {\r\n return {\r\n inputElement: null,\r\n buttonElement: null,\r\n chatContainer: null,\r\n placeholder: null,\r\n isSessionStarted: false,\r\n isPlaceholderVisible: true,\r\n chatWidgetStateName: null,\r\n chatWidgetStateSession: null,\r\n chatWidgetLayoutKey: null,\r\n chatHistorySection: null,\r\n widgetContainerElement: null,\r\n widgetToggleButtonElement: null,\r\n widgetResetSizeButtonElement: null,\r\n widgetResizeObserver: null,\r\n widgetViewportResizeHandler: null,\r\n widgetDefaultWidth: null,\r\n widgetDefaultHeight: null,\r\n widgetIsInitialized: false,\r\n isStreaming: false,\r\n isNavigatingAway: false,\r\n autoScroll: true,\r\n stream: null,\r\n messages: [],\r\n notifications: [],\r\n prompt: '',\r\n documents: config.existingDocuments || [],\r\n isUploading: false,\r\n uploadErrors: [],\r\n isDragOver: false,\r\n documentBar: null,\r\n metricsEnabled: !!config.metricsEnabled,\r\n userLabel: config.userLabel,\r\n assistantLabel: config.assistantLabel,\r\n thumbsUpTitle: config.thumbsUpTitle,\r\n thumbsDownTitle: config.thumbsDownTitle,\r\n copyTitle: config.copyTitle,\r\n isRecording: false,\r\n mediaRecorder: null,\r\n preRecordingPrompt: '',\r\n micButton: null,\r\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\r\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\r\n ttsVoiceName: config.ttsVoiceName || null,\r\n audioChunks: [],\r\n audioPlayQueue: [],\r\n isPlayingAudio: false,\r\n currentAudioElement: null,\r\n currentAudioUrl: null,\r\n ttsButton: null,\r\n ttsPlayingMessageIndex: -1,\r\n ttsAudioCache: {},\r\n ttsInstanceId: 'ai-chat-' + Math.random().toString(36).slice(2),\r\n singleResponseMode: !!config.singleResponseMode,\r\n conversationModeEnabled: config.chatMode === 'Conversation',\r\n conversationButton: null,\r\n isConversationMode: false,\r\n notificationDismissTimers: {},\r\n };\r\n },\r\n computed: {\r\n lastAssistantIndex() {\r\n for (var i = this.messages.length - 1; i >= 0; i--) {\r\n if (this.messages[i].role === 'assistant') {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n },\r\n methods: {\r\n handleBeforeUnload() {\r\n this.isNavigatingAway = true;\r\n },\r\n getStoredWidgetLayout() {\r\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\r\n return {};\r\n }\r\n\r\n try {\r\n var storedLayout = localStorage.getItem(this.chatWidgetLayoutKey);\r\n return storedLayout ? JSON.parse(storedLayout) || {} : {};\r\n } catch (error) {\r\n console.warn('Failed to read widget layout state.', error);\r\n return {};\r\n }\r\n },\r\n saveStoredWidgetLayout(partialLayout) {\r\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var currentLayout = this.getStoredWidgetLayout();\r\n var nextLayout = Object.assign({}, currentLayout);\r\n\r\n if (partialLayout.panel !== undefined) {\r\n nextLayout.panel = Object.assign({}, currentLayout.panel || {}, partialLayout.panel || {});\r\n }\r\n\r\n if (partialLayout.toggle !== undefined) {\r\n nextLayout.toggle = Object.assign({}, currentLayout.toggle || {}, partialLayout.toggle || {});\r\n }\r\n\r\n localStorage.setItem(this.chatWidgetLayoutKey, JSON.stringify(nextLayout));\r\n },\r\n getElementSize(element, fallbackWidth, fallbackHeight) {\r\n if (!element) {\r\n return {\r\n width: fallbackWidth || 0,\r\n height: fallbackHeight || 0\r\n };\r\n }\r\n\r\n var rect = element.getBoundingClientRect();\r\n var computed = window.getComputedStyle(element);\r\n\r\n return {\r\n width: Math.round(rect.width || parsePixelValue(computed.width) || fallbackWidth || 0),\r\n height: Math.round(rect.height || parsePixelValue(computed.height) || fallbackHeight || 0)\r\n };\r\n },\r\n clampWidgetPosition(left, top, width, height) {\r\n var viewportPadding = 8;\r\n var maxLeft = Math.max(viewportPadding, window.innerWidth - width - viewportPadding);\r\n var maxTop = Math.max(viewportPadding, window.innerHeight - height - viewportPadding);\r\n\r\n return {\r\n left: Math.round(clamp(left, viewportPadding, maxLeft)),\r\n top: Math.round(clamp(top, viewportPadding, maxTop))\r\n };\r\n },\r\n applyAbsolutePosition(element, left, top) {\r\n if (!element) {\r\n return;\r\n }\r\n\r\n element.style.left = left + 'px';\r\n element.style.top = top + 'px';\r\n element.style.right = 'auto';\r\n element.style.bottom = 'auto';\r\n },\r\n getWidgetDefaultSize() {\r\n return {\r\n width: this.widgetDefaultWidth || parsePixelValue(config.widget.defaultWidth) || 380,\r\n height: this.widgetDefaultHeight || parsePixelValue(config.widget.defaultHeight) || 520\r\n };\r\n },\r\n persistWidgetPanelPosition() {\r\n if (!this.widgetContainerElement || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\r\n this.saveStoredWidgetLayout({\r\n panel: {\r\n left: Math.round(panelRect.left),\r\n top: Math.round(panelRect.top)\r\n }\r\n });\r\n },\r\n persistWidgetTogglePosition() {\r\n if (!this.widgetToggleButtonElement || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\r\n this.saveStoredWidgetLayout({\r\n toggle: {\r\n left: Math.round(toggleRect.left),\r\n top: Math.round(toggleRect.top)\r\n }\r\n });\r\n },\r\n persistWidgetPanelSize() {\r\n if (!this.widgetContainerElement || !config.widget.enableResizing || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\r\n\r\n this.saveStoredWidgetLayout({\r\n panel: {\r\n width: Math.abs(currentSize.width - defaultSize.width) <= 1 ? null : currentSize.width,\r\n height: Math.abs(currentSize.height - defaultSize.height) <= 1 ? null : currentSize.height\r\n }\r\n });\r\n },\r\n updateWidgetResetSizeButtonVisibility() {\r\n if (!this.widgetResetSizeButtonElement) {\r\n return;\r\n }\r\n\r\n if (!config.widget.enableResizing || !this.widgetContainerElement) {\r\n this.widgetResetSizeButtonElement.classList.add('d-none');\r\n return;\r\n }\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\r\n var isResized =\r\n Math.abs(currentSize.width - defaultSize.width) > 1 ||\r\n Math.abs(currentSize.height - defaultSize.height) > 1 ||\r\n !!this.widgetContainerElement.style.width ||\r\n !!this.widgetContainerElement.style.height;\r\n\r\n this.widgetResetSizeButtonElement.classList.toggle('d-none', !isResized);\r\n },\r\n resetWidgetSize() {\r\n if (!this.widgetContainerElement || !config.widget.enableResizing) {\r\n return;\r\n }\r\n\r\n this.widgetContainerElement.style.removeProperty('width');\r\n this.widgetContainerElement.style.removeProperty('height');\r\n this.persistWidgetPanelSize();\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n },\r\n restoreWidgetLayout() {\r\n var storedLayout = this.getStoredWidgetLayout();\r\n\r\n if (this.widgetContainerElement && config.widget.enableResizing) {\r\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.width)) {\r\n this.widgetContainerElement.style.width = storedLayout.panel.width + 'px';\r\n } else {\r\n this.widgetContainerElement.style.removeProperty('width');\r\n }\r\n\r\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.height)) {\r\n this.widgetContainerElement.style.height = storedLayout.panel.height + 'px';\r\n } else {\r\n this.widgetContainerElement.style.removeProperty('height');\r\n }\r\n }\r\n\r\n if (this.widgetContainerElement && config.widget.enableDragging &&\r\n Number.isFinite(storedLayout.panel && storedLayout.panel.left) &&\r\n Number.isFinite(storedLayout.panel && storedLayout.panel.top)) {\r\n this.applyAbsolutePosition(this.widgetContainerElement, storedLayout.panel.left, storedLayout.panel.top);\r\n }\r\n\r\n if (this.widgetToggleButtonElement && config.widget.enableDragging &&\r\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.left) &&\r\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.top)) {\r\n this.applyAbsolutePosition(this.widgetToggleButtonElement, storedLayout.toggle.left, storedLayout.toggle.top);\r\n }\r\n\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n },\r\n attachDraggableWidgetElement(element, handle, layoutKey, suppressClickOnDrag) {\r\n if (!element || !handle || !config.widget.enableDragging) {\r\n return;\r\n }\r\n\r\n var activePointerId = null;\r\n var startX = 0;\r\n var startY = 0;\r\n var startLeft = 0;\r\n var startTop = 0;\r\n var dragged = false;\r\n var dragThreshold = 4;\r\n var interactiveSelector = 'button, a, input, textarea, select, option, label';\r\n\r\n var stopDragging = (event) => {\r\n if (activePointerId === null) {\r\n return;\r\n }\r\n\r\n if (event && event.pointerId !== undefined && event.pointerId !== activePointerId) {\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointermove', onPointerMove);\r\n document.removeEventListener('pointerup', stopDragging);\r\n document.removeEventListener('pointercancel', stopDragging);\r\n element.classList.remove('ai-chat-widget-dragging');\r\n activePointerId = null;\r\n\r\n if (!dragged) {\r\n return;\r\n }\r\n\r\n if (layoutKey === 'panel') {\r\n this.persistWidgetPanelPosition();\r\n } else if (layoutKey === 'toggle') {\r\n this.persistWidgetTogglePosition();\r\n }\r\n\r\n if (suppressClickOnDrag) {\r\n element.dataset.dragSuppressClick = 'true';\r\n window.setTimeout(() => {\r\n if (element.dataset.dragSuppressClick === 'true') {\r\n element.dataset.dragSuppressClick = 'false';\r\n }\r\n }, 0);\r\n }\r\n };\r\n\r\n var onPointerMove = (event) => {\r\n if (activePointerId === null || event.pointerId !== activePointerId) {\r\n return;\r\n }\r\n\r\n var deltaX = event.clientX - startX;\r\n var deltaY = event.clientY - startY;\r\n\r\n if (!dragged && Math.hypot(deltaX, deltaY) < dragThreshold) {\r\n return;\r\n }\r\n\r\n dragged = true;\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(\r\n element,\r\n layoutKey === 'panel' ? defaultSize.width : 52,\r\n layoutKey === 'panel' ? defaultSize.height : 52);\r\n var nextPosition = this.clampWidgetPosition(\r\n startLeft + deltaX,\r\n startTop + deltaY,\r\n currentSize.width,\r\n currentSize.height);\r\n\r\n this.applyAbsolutePosition(element, nextPosition.left, nextPosition.top);\r\n };\r\n\r\n handle.addEventListener('pointerdown', (event) => {\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n\r\n if (layoutKey === 'panel' && event.target.closest(interactiveSelector)) {\r\n return;\r\n }\r\n\r\n var rect = element.getBoundingClientRect();\r\n startX = event.clientX;\r\n startY = event.clientY;\r\n startLeft = rect.left;\r\n startTop = rect.top;\r\n dragged = false;\r\n activePointerId = event.pointerId;\r\n element.classList.add('ai-chat-widget-dragging');\r\n\r\n if (handle.setPointerCapture) {\r\n handle.setPointerCapture(event.pointerId);\r\n }\r\n\r\n document.addEventListener('pointermove', onPointerMove);\r\n document.addEventListener('pointerup', stopDragging);\r\n document.addEventListener('pointercancel', stopDragging);\r\n event.preventDefault();\r\n });\r\n },\r\n constrainWidgetElementsToViewport() {\r\n if (this.widgetContainerElement && this.widgetContainerElement.style.left) {\r\n var panelDefaultSize = this.getWidgetDefaultSize();\r\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\r\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\r\n var clampedPanel = this.clampWidgetPosition(panelRect.left, panelRect.top, panelSize.width, panelSize.height);\r\n\r\n this.applyAbsolutePosition(this.widgetContainerElement, clampedPanel.left, clampedPanel.top);\r\n\r\n if (config.widget.persistLayout) {\r\n this.persistWidgetPanelPosition();\r\n }\r\n }\r\n\r\n if (this.widgetToggleButtonElement && this.widgetToggleButtonElement.style.left) {\r\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\r\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\r\n var clampedToggle = this.clampWidgetPosition(toggleRect.left, toggleRect.top, toggleSize.width, toggleSize.height);\r\n\r\n this.applyAbsolutePosition(this.widgetToggleButtonElement, clampedToggle.left, clampedToggle.top);\r\n\r\n if (config.widget.persistLayout) {\r\n this.persistWidgetTogglePosition();\r\n }\r\n }\r\n },\r\n handleDragOver(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = true;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.add('ai-chat-drag-over');\r\n },\r\n handleDragLeave(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = false;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\r\n },\r\n handleDrop(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = false;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\r\n if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\r\n this.uploadFiles(e.dataTransfer.files);\r\n }\r\n },\r\n triggerFileInput() {\r\n if (!config.sessionDocumentsEnabled) return;\r\n var fileInput = document.getElementById('ai-chat-doc-input');\r\n if (fileInput) fileInput.click();\r\n },\r\n handleFileInputChange(e) {\r\n var files = e.target.files;\r\n if (files && files.length > 0) {\r\n this.uploadFiles(files);\r\n }\r\n e.target.value = '';\r\n },\r\n async uploadFiles(files) {\r\n if (!config.uploadDocumentUrl) return;\r\n\r\n var sessionId = this.getSessionId();\r\n var profileId = this.getProfileId();\r\n\r\n if (!sessionId && !profileId) {\r\n console.warn('Cannot upload documents without a session or profile.');\r\n return;\r\n }\r\n\r\n this.isUploading = true;\r\n this.uploadErrors = [];\r\n this.renderDocumentBar();\r\n try {\r\n var formData = new FormData();\r\n if (sessionId) {\r\n formData.append('sessionId', sessionId);\r\n } else {\r\n formData.append('profileId', profileId);\r\n }\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n\r\n var response = await fetch(config.uploadDocumentUrl, {\r\n method: 'POST',\r\n body: formData\r\n });\r\n\r\n if (!response.ok) {\r\n var errorText = await response.text();\r\n var uploadError = this.extractReadableErrorMessage(errorText, 'Upload failed. Please try again.');\r\n console.error('Upload failed:', errorText);\r\n this.uploadErrors = [{ fileName: '', error: uploadError }];\r\n return;\r\n }\r\n\r\n var result = await response.json();\r\n\r\n // If the server created a new session, initialize it.\r\n if (result.sessionId && !sessionId) {\r\n this.initializeSession(result.sessionId);\r\n }\r\n\r\n if (result.uploaded && result.uploaded.length > 0) {\r\n for (var j = 0; j < result.uploaded.length; j++) {\r\n this.documents.push(result.uploaded[j]);\r\n }\r\n }\r\n if (result.failed && result.failed.length > 0) {\r\n this.uploadErrors = result.failed;\r\n }\r\n } catch (err) {\r\n console.error('Upload error:', err);\r\n this.uploadErrors = [{ fileName: '', error: 'Upload failed. Please try again.' }];\r\n } finally {\r\n this.isUploading = false;\r\n this.renderDocumentBar();\r\n }\r\n },\r\n async removeDocument(doc) {\r\n if (!config.removeDocumentUrl) return;\r\n\r\n try {\r\n var sessionId = this.getSessionId();\r\n var response = await fetch(config.removeDocumentUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ itemId: sessionId, documentId: doc.documentId })\r\n });\r\n\r\n if (response.ok) {\r\n var idx = this.documents.indexOf(doc);\r\n if (idx > -1) this.documents.splice(idx, 1);\r\n } else {\r\n var errorText = await response.text();\r\n var removeError = this.extractReadableErrorMessage(errorText, 'Failed to remove document. Please try again.');\r\n console.error('Failed to remove document:', response.status, errorText);\r\n this.uploadErrors = [{ fileName: doc.fileName || '', error: removeError }];\r\n this.renderDocumentBar();\r\n }\r\n } catch (err) {\r\n console.error('Remove document error:', err);\r\n this.uploadErrors = [{ fileName: doc.fileName || '', error: 'Failed to remove document. Please try again.' }];\r\n this.renderDocumentBar();\r\n }\r\n },\r\n formatFileSize(bytes) {\r\n if (bytes < 1024) return bytes + ' B';\r\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\r\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\r\n },\r\n renderDocumentBar() {\r\n if (!this.documentBar) return;\r\n\r\n if (!config.sessionDocumentsEnabled) {\r\n this.documentBar.classList.add('d-none');\r\n return;\r\n }\r\n\r\n this.documentBar.classList.remove('d-none');\r\n\r\n var html = '
';\r\n html += '
';\r\n\r\n for (var i = 0; i < this.documents.length; i++) {\r\n var doc = this.documents[i];\r\n var name = doc.fileName || 'Document';\r\n if (name.length > 20) name = name.substring(0, 17) + '...';\r\n html += '';\r\n html += ' ';\r\n html += this.escapeHtml(name);\r\n html += ' ';\r\n html += '';\r\n }\r\n\r\n for (var m = 0; m < this.uploadErrors.length; m++) {\r\n var failedItem = this.uploadErrors[m];\r\n var failedName = failedItem.fileName || 'File';\r\n var errorMsg = failedItem.error || 'Upload failed';\r\n if (failedName.length > 15) failedName = failedName.substring(0, 12) + '...';\r\n html += '';\r\n html += ' ';\r\n html += this.escapeHtml(failedName);\r\n html += ' ';\r\n html += '';\r\n }\r\n\r\n if (this.isUploading) {\r\n html += '';\r\n html += ' Uploading...';\r\n html += '';\r\n }\r\n\r\n html += '';\r\n html += '
';\r\n if (config.supportedExtensionsText) {\r\n html += '
Supported formats: ' + this.escapeHtml(config.supportedExtensionsText) + '
';\r\n }\r\n\r\n html += '
';\r\n\r\n this.documentBar.replaceChildren(DOMPurify.sanitize(html, { RETURN_DOM_FRAGMENT: true }));\r\n\r\n // Bind remove handlers\r\n var self = this;\r\n var closeButtons = this.documentBar.querySelectorAll('[data-doc-index]');\r\n for (var j = 0; j < closeButtons.length; j++) {\r\n closeButtons[j].addEventListener('click', (function (idx) {\r\n return function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n var docToRemove = self.documents[idx];\r\n if (docToRemove) self.removeDocument(docToRemove);\r\n };\r\n })(parseInt(closeButtons[j].getAttribute('data-doc-index'))));\r\n }\r\n\r\n // Bind error dismiss handlers\r\n var errorCloseButtons = this.documentBar.querySelectorAll('[data-error-index]');\r\n for (var n = 0; n < errorCloseButtons.length; n++) {\r\n errorCloseButtons[n].addEventListener('click', (function (idx) {\r\n return function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n self.uploadErrors.splice(idx, 1);\r\n self.renderDocumentBar();\r\n };\r\n })(parseInt(errorCloseButtons[n].getAttribute('data-error-index'))));\r\n }\r\n\r\n // Bind add button\r\n var addBtn = this.documentBar.querySelector('.ai-chat-doc-add-btn');\r\n if (addBtn) {\r\n addBtn.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n self.triggerFileInput();\r\n });\r\n }\r\n },\r\n escapeHtml(text) {\r\n var div = document.createElement('div');\r\n div.textContent = text;\r\n return div.innerHTML;\r\n },\r\n extractReadableErrorMessage(errorText, fallbackMessage) {\r\n if (!errorText || typeof errorText !== 'string') {\r\n return fallbackMessage;\r\n }\r\n\r\n var trimmed = errorText.trim();\r\n if (!trimmed) {\r\n return fallbackMessage;\r\n }\r\n\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n try {\r\n var parsed = JSON.parse(trimmed);\r\n var message = parsed?.error || parsed?.message || parsed?.title || parsed?.detail;\r\n return typeof message === 'string' && message.trim()\r\n ? message.trim()\r\n : fallbackMessage;\r\n } catch (err) {\r\n return fallbackMessage;\r\n }\r\n }\r\n\r\n if (/<[^>]+>/.test(trimmed)) {\r\n return fallbackMessage;\r\n }\r\n\r\n return trimmed;\r\n },\r\n normalizeAssistantAppearance(appearance) {\r\n if (!appearance) {\r\n return null;\r\n }\r\n\r\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\r\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\r\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\r\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\r\n\r\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\r\n return null;\r\n }\r\n\r\n return {\r\n label: label,\r\n icon: icon,\r\n cssClass: cssClass,\r\n disableStreamingAnimation: disableStreamingAnimation,\r\n };\r\n },\r\n getAssistantLabel(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.label ? appearance.label : this.assistantLabel;\r\n },\r\n getAssistantRoleClasses(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n var classes = ['ai-chat-msg-role'];\r\n\r\n if (appearance && appearance.cssClass) {\r\n classes.push(appearance.cssClass);\r\n } else {\r\n classes.push('ai-chat-msg-role-assistant');\r\n }\r\n\r\n return classes;\r\n },\r\n getAssistantIconClasses(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\r\n },\r\n getAssistantIcon(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\r\n },\r\n shouldAnimateAssistantIcon(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return !!message &&\r\n message.isStreaming &&\r\n index === this.lastAssistantIndex &&\r\n !(appearance && appearance.disableStreamingAnimation);\r\n },\r\n async startConnection() {\r\n this.connection = new signalR.HubConnectionBuilder()\r\n .withUrl(config.signalRHubUrl)\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n // Allow long-running operations (e.g., multi-step MCP tool calls)\r\n // without the client disconnecting prematurely.\r\n this.connection.serverTimeoutInMilliseconds = 600000;\r\n this.connection.keepAliveIntervalInMilliseconds = 15000;\r\n\r\n this.connection.on(\"LoadSession\", (data) => {\r\n this.initializeSession(data.sessionId, true);\r\n this.messages = [];\r\n this.documents = data.documents || [];\r\n\r\n (data.messages ?? []).forEach(msg => {\r\n this.addMessage(msg);\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n });\r\n });\r\n\r\n // Update feedback icons in the DOM after all messages have rendered.\r\n this.$nextTick(() => {\r\n this.refreshAllFeedbackIcons();\r\n });\r\n\r\n // When the session is new (no messages) and an initial prompt is configured,\r\n // automatically send it as the first user message to trigger an AI response.\r\n if (this.messages.length === 0 && config.initialPrompt) {\r\n this.prompt = config.initialPrompt;\r\n this.sendMessage();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveError\", (error) => {\r\n console.error(\"SignalR Error: \", error);\r\n\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // If this is a widget with a stale cached session (e.g., profile was deleted),\r\n // clear the cached session and start fresh with the current profile.\r\n if (this.widgetIsInitialized && !this.isSessionStarted && !this._attemptedSessionRecovery) {\r\n this._attemptedSessionRecovery = true;\r\n localStorage.removeItem(this.chatWidgetStateSession);\r\n this.startNewSession();\r\n }\r\n });\r\n\r\n this.connection.on(\"MessageRated\", (messageId, userRating) => {\r\n var msg = this.messages.find(m => m.id === messageId);\r\n if (msg) {\r\n msg.userRating = userRating;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveTranscript\", (sessionId, text, isFinal) => {\r\n if (this.isConversationMode) {\r\n if (!isFinal && text) {\r\n this._conversationPartialTranscript = text;\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n var html = '

' + escaped + '

';\r\n\r\n // Show partial transcript as a live user message.\r\n if (!this._conversationPartialMessage) {\r\n this.hidePlaceholder();\r\n this._conversationPartialMessage = {\r\n role: 'user',\r\n content: text,\r\n htmlContent: html,\r\n isPartial: true\r\n };\r\n this.messages.push(this._conversationPartialMessage);\r\n } else {\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = html;\r\n }\r\n this.scrollToBottom();\r\n }\r\n return;\r\n }\r\n\r\n if (text && !this._audioInputSent) {\r\n this.prompt = this.preRecordingPrompt + text;\r\n if (this.inputElement) {\r\n this.inputElement.value = this.prompt;\r\n this.inputElement.dispatchEvent(new Event('input'));\r\n }\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationUserMessage\", (sessionId, text) => {\r\n if (text) {\r\n this.stopAudio();\r\n\r\n // If there's an interrupted assistant message still streaming,\r\n // mark it as done to stop the spinner animation.\r\n if (this._conversationAssistantMessage) {\r\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\r\n if (oldMsg) {\r\n oldMsg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Replace the partial transcript message with the final one.\r\n if (this._conversationPartialMessage) {\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\r\n this._conversationPartialMessage.isPartial = false;\r\n this._conversationPartialMessage = null;\r\n } else {\r\n this.addMessage({\r\n role: 'user',\r\n content: text\r\n });\r\n }\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantToken\", (sessionId, messageId, token, responseId, appearance) => {\r\n if (!this._conversationAssistantMessage) {\r\n this.stopAudio();\r\n this.hideTypingIndicator();\r\n\r\n // Ensure no stale streaming indicators remain from prior messages.\r\n for (var j = 0; j < this.messages.length; j++) {\r\n if (this.messages[j].isStreaming) {\r\n this.messages[j].isStreaming = false;\r\n }\r\n }\r\n\r\n var msgIndex = this.messages.length;\r\n var newMessage = {\r\n id: messageId,\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n userRating: null,\r\n appearance: this.normalizeAssistantAppearance(appearance),\r\n };\r\n this.messages.push(newMessage);\r\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\r\n }\r\n\r\n this._conversationAssistantMessage.content += token;\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n if (!msg.appearance) {\r\n msg.appearance = this.normalizeAssistantAppearance(appearance);\r\n }\r\n msg.content = this._conversationAssistantMessage.content;\r\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n this.scrollToBottom();\r\n });\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantComplete\", (sessionId, messageId) => {\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioChunk\", (sessionId, base64Audio, contentType) => {\r\n if (base64Audio) {\r\n const binaryString = atob(base64Audio);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n this.audioChunks.push(bytes);\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioComplete\", (sessionId) => {\r\n this.playCollectedAudio();\r\n });\r\n\r\n this.connection.on(\"ReceiveNotification\", (notification) => {\r\n this.receiveNotification(notification);\r\n });\r\n\r\n this.connection.on(\"UpdateNotification\", (notification) => {\r\n this.updateNotification(notification);\r\n });\r\n\r\n this.connection.on(\"RemoveNotification\", (notificationType) => {\r\n this.removeNotification(notificationType);\r\n });\r\n\r\n this.connection.onreconnecting(() => {\r\n console.warn(\"SignalR: reconnecting...\");\r\n });\r\n\r\n this.connection.onreconnected(() => {\r\n console.info(\"SignalR: reconnected.\");\r\n\r\n if (this.isSessionStarted) {\r\n this.reloadCurrentSession();\r\n } else if (config.autoCreateSession) {\r\n this.startNewSession();\r\n }\r\n });\r\n\r\n this.connection.onclose((error) => {\r\n if (this.isNavigatingAway) {\r\n return;\r\n }\r\n\r\n if (error) {\r\n console.warn(\"SignalR connection closed with error:\", error.message || error);\r\n }\r\n });\r\n\r\n try {\r\n await this.connection.start();\r\n } catch (err) {\r\n console.error(\"SignalR Connection Error: \", err);\r\n }\r\n },\r\n addMessageInternal(message) {\r\n if (message.role === 'assistant') {\r\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\r\n }\r\n\r\n if (message.content && !message.htmlContent) {\r\n message.htmlContent = parseMarkdownContent(message.content, message);\r\n }\r\n this.fireEvent(new CustomEvent(\"addingOpenAIPromotMessage\", { detail: { message: message } }));\r\n this.messages.push(message);\r\n\r\n this.$nextTick(() => {\r\n this.fireEvent(new CustomEvent(\"addedOpenAIPromotMessage\", { detail: { message: message } }));\r\n });\r\n },\r\n addMessage(message) {\r\n\r\n // Ensure userRating is always defined for Vue reactivity.\r\n if (message.userRating === undefined) {\r\n message.userRating = null;\r\n }\r\n\r\n if (message.content) {\r\n let processedContent = message.content.trim();\r\n message.references = normalizeReferences(message.references);\r\n\r\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\r\n\r\n // Only include references that were actually cited in the response.\r\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\r\n\r\n if (citedRefs.length) {\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders.\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processedContent = processedContent.replaceAll(key, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\r\n processedContent = processedContent.replaceAll('
', ',');\r\n\r\n processedContent += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || key;\r\n processedContent += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n }\r\n }\r\n\r\n message.content = processedContent;\r\n message.htmlContent = parseMarkdownContent(processedContent, message);\r\n }\r\n\r\n this.addMessageInternal(message);\r\n this.hidePlaceholder();\r\n\r\n this.$nextTick(() => {\r\n // Render any pending charts once the DOM is updated\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n addMessages(messages) {\r\n\r\n for (let i = 0; i < messages.length; i++) {\r\n this.addMessageInternal(messages[i]);\r\n }\r\n\r\n this.hidePlaceholder();\r\n this.$nextTick(() => {\r\n this.scrollToBottom();\r\n });\r\n },\r\n hidePlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.add('d-none');\r\n }\r\n this.isPlaceholderVisible = false;\r\n },\r\n showPlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.remove('d-none');\r\n }\r\n this.isPlaceholderVisible = true;\r\n },\r\n isOrchestratorAvailable() {\r\n return config.isOrchestratorAvailable !== false;\r\n },\r\n applyOrchestratorAvailability() {\r\n if (this.isOrchestratorAvailable()) {\r\n return true;\r\n }\r\n\r\n const unavailableMessage = config.orchestratorUnavailableMessage || \"This orchestrator is not currently available.\";\r\n\r\n if (this.inputElement) {\r\n this.inputElement.disabled = true;\r\n this.inputElement.value = '';\r\n this.inputElement.placeholder = unavailableMessage;\r\n }\r\n\r\n if (this.buttonElement) {\r\n this.buttonElement.disabled = true;\r\n }\r\n\r\n if (this.micButtonElement) {\r\n this.micButtonElement.disabled = true;\r\n this.micButtonElement.style.display = 'none';\r\n }\r\n\r\n if (this.conversationButtonElement) {\r\n this.conversationButtonElement.disabled = true;\r\n this.conversationButtonElement.style.display = 'none';\r\n }\r\n\r\n return false;\r\n },\r\n fireEvent(event) {\r\n document.dispatchEvent(event);\r\n },\r\n isIndicator(message) {\r\n return message.role === 'indicator';\r\n },\r\n sendMessage() {\r\n if (!this.applyOrchestratorAvailability()) {\r\n return;\r\n }\r\n\r\n let trimmedPrompt = this.prompt.trim();\r\n\r\n if (!trimmedPrompt) {\r\n return;\r\n }\r\n\r\n // Stop any active recording before sending.\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\r\n this._audioInputSent = true;\r\n\r\n // In single-response mode, clear all previous messages.\r\n if (this.singleResponseMode) {\r\n this.messages.splice(0, this.messages.length);\r\n }\r\n\r\n this.addMessage({\r\n role: 'user',\r\n content: trimmedPrompt\r\n });\r\n\r\n this.streamMessage(this.getProfileId(), trimmedPrompt, null);\r\n this.inputElement.value = '';\r\n this.prompt = '';\r\n },\r\n startRecording() {\r\n if (this.isRecording || !this.connection) {\r\n return;\r\n }\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this.preRecordingPrompt = this.prompt;\r\n this._audioInputSent = false;\r\n\r\n var subject = new signalR.Subject();\r\n var profileId = this.getProfileId();\r\n var sessionId = this.getSessionId() || '';\r\n var pendingChunk = Promise.resolve();\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n subject.next(base64);\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => subject.complete());\r\n });\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"SendAudioStream\", profileId, sessionId, subject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n this.updateMicButton();\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n });\r\n },\r\n stopRecording() {\r\n if (!this.isRecording || !this.mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n this.updateMicButton();\r\n },\r\n toggleRecording() {\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n } else {\r\n this.startRecording();\r\n }\r\n },\r\n updateMicButton() {\r\n if (!this.micButton) {\r\n return;\r\n }\r\n\r\n if (this.isRecording) {\r\n this.micButton.classList.add('stt-recording');\r\n this.micButton.innerHTML = '';\r\n } else {\r\n this.micButton.classList.remove('stt-recording');\r\n this.micButton.innerHTML = '';\r\n }\r\n },\r\n streamMessage(profileId, trimmedPrompt, sessionProfileId) {\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n\r\n this.streamingStarted();\r\n this.showTypingIndicator();\r\n this.autoScroll = true;\r\n\r\n var content = '';\r\n var references = {};\r\n var lastResponseId = null;\r\n\r\n // Get the index after showing typing indicator.\r\n var messageIndex = this.messages.length;\r\n var currentSessionId = this.getSessionId();\r\n\r\n this.stream = this.connection.stream(\"SendMessage\", profileId, trimmedPrompt, currentSessionId, sessionProfileId)\r\n .subscribe({\r\n next: (chunk) => {\r\n let message = this.messages[messageIndex];\r\n\r\n if (!message) {\r\n\r\n if (chunk.sessionId && !currentSessionId) {\r\n this.initializeSession(chunk.sessionId);\r\n }\r\n\r\n this.hideTypingIndicator();\r\n // Re-assign the index after hiding the typing indicator.\r\n messageIndex = this.messages.length;\r\n let newMessage = {\r\n id: chunk.messageId,\r\n role: \"assistant\",\r\n title: chunk.title,\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n userRating: null,\r\n };\r\n\r\n this.messages.push(newMessage);\r\n\r\n message = newMessage;\r\n }\r\n\r\n if (chunk.title && (!message.title || message.title !== chunk.title)) {\r\n message.title = chunk.title;\r\n }\r\n\r\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\r\n\r\n for (const [key, value] of Object.entries(chunk.references)) {\r\n references[key] = normalizeReference(value) ?? {};\r\n }\r\n }\r\n\r\n if (chunk.content) {\r\n\r\n // When the responseId changes (e.g., after an internal tool call),\r\n // insert a line break to visually separate response segments.\r\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\r\n content += '\\n\\n';\r\n }\r\n\r\n if (chunk.responseId) {\r\n lastResponseId = chunk.responseId;\r\n }\r\n\r\n let processedContent = chunk.content;\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n processedContent = processedContent.replaceAll(key, `${value.index}`);\r\n }\r\n\r\n // Append processed content to the message.\r\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\r\n content += processedContent.replaceAll('
', ',');\r\n }\r\n\r\n // Update the existing message\r\n message.content = content;\r\n\r\n message.htmlContent = parseMarkdownContent(content, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n complete: () => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n if (!msg || !msg.content) {\r\n // No content received at all.\r\n this.hideTypingIndicator();\r\n }\r\n\r\n // Trigger text-to-speech only in conversation mode.\r\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\r\n this.synthesizeSpeech(msg.content);\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n },\r\n error: (err) => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n this.hideTypingIndicator();\r\n\r\n if (!this.isNavigatingAway) {\r\n this.addMessage(this.getServiceDownMessage());\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n\r\n console.error(\"Stream error:\", err);\r\n }\r\n });\r\n },\r\n getServiceDownMessage() {\r\n let newMessage = {\r\n role: \"assistant\",\r\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\r\n htmlContent: \"\",\r\n };\r\n\r\n return newMessage;\r\n },\r\n processReferences(references, messageIndex) {\r\n references = normalizeReferences(references);\r\n\r\n if (Object.keys(references).length) {\r\n\r\n let message = this.messages[messageIndex];\r\n const content = message.content || '';\r\n\r\n // Only include references that were actually cited in the response.\r\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\r\n const citedRefs = Object.entries(references).filter(([key, value]) =>\r\n content.includes(key) || content.includes(`${value.index}`)\r\n );\r\n\r\n if (!citedRefs.length) {\r\n return;\r\n }\r\n\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\r\n let processed = content.trim();\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processed = processed.replaceAll(key, placeholder);\r\n processed = processed.replaceAll(`${value.index}`, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processed = processed.replaceAll('', ',');\r\n\r\n processed += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || key;\r\n processed += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n\r\n message.content = processed;\r\n message.htmlContent = parseMarkdownContent(processed, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n }\r\n },\r\n streamingStarted() {\r\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\r\n\r\n if (stopIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.setAttribute('disabled', 'disabled');\r\n }\r\n },\r\n streamingFinished() {\r\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\r\n\r\n if (startIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.removeAttribute('disabled');\r\n this.inputElement.focus();\r\n }\r\n\r\n // Directly manipulate the DOM to stop all streaming animations.\r\n if (this.chatContainer) {\r\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\r\n for (var i = 0; i < icons.length; i++) {\r\n icons[i].classList.remove('ai-streaming-icon');\r\n icons[i].classList.add('ai-bot-icon');\r\n }\r\n }\r\n\r\n // Also update Vue data for consistency.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n },\r\n handleExternalTtsStop(e) {\r\n if (e?.detail?.sourceId === this.ttsInstanceId) {\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n },\r\n synthesizeSpeech(text, cacheIndex) {\r\n if (!this.textToSpeechEnabled || !text || !this.connection) {\r\n return;\r\n }\r\n\r\n this.audioChunks = [];\r\n this.isPlayingAudio = true;\r\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\r\n\r\n this.connection.invoke(\"SynthesizeSpeech\", this.getProfileId(), this.getSessionId(), text, this.ttsVoiceName)\r\n .catch(err => {\r\n console.error(\"TTS synthesis error:\", err);\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this._ttsCacheIndex = -1;\r\n });\r\n },\r\n toggleMessageTts(message, index) {\r\n if (this.ttsPlayingMessageIndex === index) {\r\n this.stopAudio();\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\r\n detail: { sourceId: this.ttsInstanceId }\r\n }));\r\n this.ttsPlayingMessageIndex = index;\r\n\r\n if (this.ttsAudioCache[index]) {\r\n this.playAudioBlob(this.ttsAudioCache[index]);\r\n return;\r\n }\r\n\r\n this.synthesizeSpeech(message.content, index);\r\n },\r\n playCollectedAudio() {\r\n if (this.audioChunks.length === 0) {\r\n if (!this.currentAudioElement && this.audioPlayQueue.length === 0) {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n }\r\n return;\r\n }\r\n\r\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\r\n const combined = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const chunk of this.audioChunks) {\r\n combined.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n this.audioChunks = [];\r\n\r\n const blob = new Blob([combined], { type: 'audio/mp3' });\r\n\r\n if (this._ttsCacheIndex >= 0) {\r\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\r\n this._ttsCacheIndex = -1;\r\n }\r\n\r\n // If audio is already playing, queue this blob for sequential playback.\r\n if (this.currentAudioElement) {\r\n this.audioPlayQueue.push(blob);\r\n return;\r\n }\r\n\r\n this.playAudioBlob(blob);\r\n },\r\n playAudioBlob(blob) {\r\n const url = URL.createObjectURL(blob);\r\n const audio = new Audio(url);\r\n\r\n this.currentAudioUrl = url;\r\n this.currentAudioElement = audio;\r\n this.isPlayingAudio = true;\r\n\r\n audio.addEventListener('ended', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.addEventListener('error', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.play().catch(err => {\r\n console.error(\"Audio playback error:\", err);\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n });\r\n },\r\n playNextInQueue() {\r\n if (this.audioPlayQueue.length > 0) {\r\n var nextBlob = this.audioPlayQueue.shift();\r\n this.playAudioBlob(nextBlob);\r\n } else {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this.conversationModeOnAudioEnded();\r\n }\r\n },\r\n stopAudio() {\r\n if (this.currentAudioElement) {\r\n this.currentAudioElement.pause();\r\n this.currentAudioElement.currentTime = 0;\r\n this.currentAudioElement = null;\r\n }\r\n if (this.currentAudioUrl) {\r\n URL.revokeObjectURL(this.currentAudioUrl);\r\n this.currentAudioUrl = null;\r\n }\r\n this.audioChunks = [];\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n },\r\n toggleConversationMode() {\r\n if (this.isConversationMode) {\r\n this.stopConversationMode();\r\n } else {\r\n this.startConversationMode();\r\n }\r\n },\r\n startConversationMode() {\r\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = true;\r\n this.updateConversationButton();\r\n this._conversationPartialTranscript = '';\r\n this._conversationAssistantMessage = null;\r\n this._conversationPartialMessage = null;\r\n\r\n // Remove any previous conversation ended notification.\r\n this.removeNotification('conversation-ended');\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this._conversationSubject = new signalR.Subject();\r\n this._conversationStream = stream;\r\n\r\n // Create an AnalyserNode for volume-based interrupt detection.\r\n // During TTS playback, detect when the user speaks above\r\n // the threshold to stop TTS (interrupt). Audio chunks are\r\n // always forwarded — browser echo cancellation handles\r\n // speaker echo so the STT stream has no gaps.\r\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\r\n if (AudioCtx) {\r\n this._conversationAudioCtx = new AudioCtx();\r\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\r\n this._conversationAnalyser.fftSize = 256;\r\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\r\n micSource.connect(this._conversationAnalyser);\r\n }\r\n\r\n var pendingChunk = Promise.resolve();\r\n var analyser = this._conversationAnalyser;\r\n var interruptVolumeThreshold = 30;\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n // During TTS playback, check mic volume to detect\r\n // user interruption (speaking above threshold).\r\n if (this.isPlayingAudio && analyser) {\r\n var freqData = new Uint8Array(analyser.frequencyBinCount);\r\n analyser.getByteFrequencyData(freqData);\r\n var sum = 0;\r\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\r\n var avg = sum / freqData.length;\r\n\r\n if (avg >= interruptVolumeThreshold) {\r\n // User is speaking — interrupt TTS playback.\r\n this.stopAudio();\r\n }\r\n }\r\n\r\n // Always send audio to STT — browser echo cancellation\r\n // handles speaker echo; continuous audio avoids gaps\r\n // that increase recognition latency.\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n try {\r\n this._conversationSubject.next(base64);\r\n } catch (err) {\r\n // Subject may have been completed already.\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => {\r\n try {\r\n this._conversationSubject.complete();\r\n } catch (err) {\r\n // Already completed.\r\n }\r\n });\r\n });\r\n\r\n var profileId = this.getProfileId();\r\n var sessionId = this.getSessionId() || '';\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n\r\n this.connection.send(\"StartConversation\", profileId, sessionId, this._conversationSubject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n });\r\n },\r\n stopConversationMode() {\r\n if (!this.isConversationMode) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n\r\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\r\n if (this.connection) {\r\n this.connection.invoke(\"StopConversation\").catch(function () { });\r\n }\r\n\r\n if (this.isRecording && this.mediaRecorder) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n }\r\n\r\n this.stopAudio();\r\n this._conversationPartialTranscript = '';\r\n this._conversationPartialMessage = null;\r\n\r\n // Clean up the AudioContext used for volume monitoring.\r\n if (this._conversationAudioCtx) {\r\n this._conversationAudioCtx.close().catch(function () { });\r\n this._conversationAudioCtx = null;\r\n this._conversationAnalyser = null;\r\n }\r\n\r\n // Mark any in-flight assistant message as done to stop the spinner.\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Safety net: clear all lingering streaming indicators.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Show a \"conversation ended\" notification system message.\r\n this.receiveNotification({\r\n type: 'conversation-ended',\r\n content: 'Conversation ended.',\r\n icon: 'fa-solid fa-circle-check',\r\n dismissible: true,\r\n autoDismissMs: 5000\r\n });\r\n },\r\n updateConversationButton() {\r\n if (!this.conversationButton) {\r\n return;\r\n }\r\n\r\n if (this.isConversationMode) {\r\n this.conversationButton.classList.add('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\r\n var endHtml = this.conversationButton.getAttribute('data-end-html');\r\n if (endHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n } else {\r\n this.conversationButton.classList.remove('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\r\n this.conversationButton.classList.add('btn-outline-dark');\r\n this.conversationButton.blur();\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\r\n var startHtml = this.conversationButton.getAttribute('data-start-html');\r\n if (startHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n }\r\n },\r\n conversationModeSendPrompt() {\r\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\r\n },\r\n conversationModeOnAudioEnded() {\r\n // Legacy: in conversation mode, audio playback continuation\r\n // is handled by the persistent stream. This method is only\r\n // called from playCollectedAudio for non-conversation TTS.\r\n },\r\n generatePrompt(element) {\r\n if (!element) {\r\n console.error('The element paramter is required.');\r\n\r\n return;\r\n }\r\n\r\n let templateProfileId = element.getAttribute('data-profile-id');\r\n let sessionId = this.getSessionId();\r\n let sessionProfileId = this.getProfileId();\r\n\r\n if (!templateProfileId || !sessionId) {\r\n\r\n console.error('The given element is missing data-profile-id or the session has not yet started.');\r\n return;\r\n }\r\n\r\n // streamMessage() already shows the typing indicator.\r\n this.streamMessage(templateProfileId, null, sessionProfileId);\r\n },\r\n createSessionUrl(baseUrl, param, value) {\r\n\r\n const fullUrl = baseUrl.toLowerCase().startsWith('http') ? baseUrl : window.location.origin + baseUrl;\r\n const url = new URL(fullUrl);\r\n\r\n url.searchParams.set(param, value);\r\n\r\n return url.toString();\r\n },\r\n showTypingIndicator() {\r\n this.addMessage({\r\n role: 'indicator',\r\n htmlContent: config.indicatorTemplate\r\n });\r\n },\r\n hideTypingIndicator() {\r\n const originalLength = this.messages.length;\r\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\r\n const removedCount = originalLength - this.messages.length;\r\n return removedCount;\r\n },\r\n receiveNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\r\n if (existingIndex >= 0) {\r\n this.notifications.splice(existingIndex, 1, notification);\r\n } else {\r\n this.notifications.push(notification);\r\n }\r\n this.scheduleNotificationDismiss(notification);\r\n this.$nextTick(() => {\r\n this.scrollToBottom();\r\n });\r\n },\r\n updateNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\r\n if (existingIndex >= 0) {\r\n this.notifications.splice(existingIndex, 1, notification);\r\n this.scheduleNotificationDismiss(notification);\r\n }\r\n },\r\n scheduleNotificationDismiss(notification) {\r\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\r\n return;\r\n }\r\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\r\n this.removeNotification(notification.type);\r\n }, notification.autoDismissMs);\r\n },\r\n clearNotificationDismiss(notificationType) {\r\n var timerId = this.notificationDismissTimers[notificationType];\r\n if (!timerId) {\r\n return;\r\n }\r\n clearTimeout(timerId);\r\n delete this.notificationDismissTimers[notificationType];\r\n },\r\n removeNotification(notificationType) {\r\n this.clearNotificationDismiss(notificationType);\r\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\r\n },\r\n dismissNotification(notificationType) {\r\n this.removeNotification(notificationType);\r\n },\r\n handleNotificationAction(notificationType, actionName) {\r\n if (!this.connection) {\r\n return;\r\n }\r\n var sessionId = this.getSessionId();\r\n this.connection.invoke(\"HandleNotificationAction\", sessionId, notificationType, actionName).catch(function (err) {\r\n console.error(\"Error handling notification action:\", err);\r\n });\r\n },\r\n scrollToBottom() {\r\n if (!this.autoScroll) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\r\n }, 50);\r\n },\r\n handleUserInput(event) {\r\n this.prompt = event.target.value;\r\n },\r\n getProfileId() {\r\n return this.inputElement.getAttribute('data-profile-id');\r\n },\r\n setSessionId(sessionId) {\r\n this.inputElement.setAttribute('data-session-id', sessionId || '');\r\n },\r\n resetSession() {\r\n this.stopRecording();\r\n this.setSessionId('');\r\n this.isSessionStarted = false;\r\n this.sessionRating = null;\r\n if (this.widgetIsInitialized) {\r\n localStorage.removeItem(this.chatWidgetStateSession);\r\n }\r\n this.messages = [];\r\n this.documents = [];\r\n if (!config.autoCreateSession) {\r\n this.showPlaceholder();\r\n }\r\n\r\n if (config.autoCreateSession) {\r\n this.startNewSession();\r\n }\r\n },\r\n startNewSession() {\r\n if (!this.applyOrchestratorAvailability()) {\r\n return;\r\n }\r\n\r\n const profileId = this.getProfileId();\r\n if (!profileId || !this.connection) {\r\n return;\r\n }\r\n\r\n this.connection.invoke(\"StartSession\", profileId, null).catch(err => console.error(err));\r\n },\r\n initializeApp() {\r\n this.inputElement = document.querySelector(config.inputElementSelector);\r\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\r\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\r\n this.placeholder = document.querySelector(config.placeholderElementSelector);\r\n this.applyOrchestratorAvailability();\r\n\r\n const sessionId = this.getSessionId();\r\n if (!hasWidgetConfig && sessionId) {\r\n this.loadSession(sessionId);\r\n } else if (this.isOrchestratorAvailable() && config.autoCreateSession && !hasWidgetConfig && !sessionId) {\r\n this.startNewSession();\r\n }\r\n\r\n // Initialize document bar if enabled.\r\n if (config.sessionDocumentsEnabled && config.documentBarSelector) {\r\n this.documentBar = document.querySelector(config.documentBarSelector);\r\n if (this.documentBar) {\r\n this.renderDocumentBar();\r\n\r\n // Create hidden file input for document uploads.\r\n var fileInput = document.createElement('input');\r\n fileInput.type = 'file';\r\n fileInput.id = 'ai-chat-doc-input';\r\n fileInput.className = 'd-none';\r\n fileInput.multiple = true;\r\n if (config.allowedExtensions) {\r\n fileInput.accept = config.allowedExtensions;\r\n }\r\n fileInput.addEventListener('change', (e) => this.handleFileInputChange(e));\r\n this.documentBar.parentElement.appendChild(fileInput);\r\n\r\n // Set up drag-and-drop on the input area.\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) {\r\n inputArea.addEventListener('dragover', (e) => this.handleDragOver(e));\r\n inputArea.addEventListener('dragleave', (e) => this.handleDragLeave(e));\r\n inputArea.addEventListener('drop', (e) => this.handleDrop(e));\r\n }\r\n }\r\n }\r\n\r\n // Pause auto-scroll when the user manually scrolls up during streaming.\r\n this.chatContainer.addEventListener('scroll', () => {\r\n if (!this.stream) {\r\n return;\r\n }\r\n const threshold = 30;\r\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\r\n this.autoScroll = atBottom;\r\n });\r\n\r\n this.inputElement.addEventListener('keydown', event => {\r\n\r\n if (this.stream != null) {\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" && !event.shiftKey) {\r\n event.preventDefault();\r\n this.buttonElement.click();\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('input', (e) => {\r\n this.handleUserInput(e);\r\n\r\n if (e.target.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n });\r\n\r\n this.buttonElement.addEventListener('click', () => {\r\n\r\n if (this.stream != null) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n\r\n this.streamingFinished();\r\n this.hideTypingIndicator();\r\n\r\n // Clean up: remove empty assistant message or stop streaming animation.\r\n if (this.messages.length > 0) {\r\n const lastMsg = this.messages[this.messages.length - 1];\r\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\r\n this.messages.pop();\r\n } else if (lastMsg.isStreaming) {\r\n lastMsg.isStreaming = false;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.sendMessage();\r\n });\r\n\r\n const promptGenerators = document.getElementsByClassName('profile-generated-prompt');\r\n\r\n for (var i = 0; i < promptGenerators.length; i++) {\r\n promptGenerators[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n this.generatePrompt(e.target);\r\n });\r\n }\r\n\r\n const chatSessions = document.getElementsByClassName('chat-session-history-item');\r\n\r\n for (var i = 0; i < chatSessions.length; i++) {\r\n chatSessions[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n var sessionId = e.target.getAttribute('data-session-id');\r\n\r\n if (!sessionId) {\r\n console.error('an element with the class chat-session-history-item with no data-session-id set.');\r\n\r\n return;\r\n }\r\n\r\n this.loadSession(sessionId);\r\n this.showChatScreen();\r\n });\r\n }\r\n\r\n for (let i = 0; i < config.messages.length; i++) {\r\n this.addMessage(config.messages[i]);\r\n }\r\n\r\n // Update feedback icons in the DOM after initial messages have rendered.\r\n this.$nextTick(() => {\r\n this.refreshAllFeedbackIcons();\r\n });\r\n\r\n // Delegate click for code block copy buttons.\r\n if (this.chatContainer) {\r\n this.chatContainer.addEventListener('click', (e) => {\r\n var btn = e.target.closest('.ai-code-copy-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n\r\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\r\n if (!block) {\r\n return;\r\n }\r\n\r\n var codeEl = block.querySelector('code');\r\n if (codeEl) {\r\n navigator.clipboard.writeText(codeEl.textContent);\r\n var copiedText = config.codeCopiedText || 'Copied!';\r\n btn.innerHTML = ' ' + copiedText;\r\n setTimeout(() => {\r\n btn.innerHTML = '';\r\n }, 2000);\r\n }\r\n });\r\n }\r\n\r\n // Initialize speech-to-text microphone button.\r\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\r\n this.micButton = document.querySelector(config.micButtonElementSelector);\r\n if (this.micButton) {\r\n this.micButton.style.display = '';\r\n this.micButton.addEventListener('click', () => {\r\n this.toggleRecording();\r\n });\r\n }\r\n }\r\n\r\n // Initialize conversation mode button.\r\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\r\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\r\n if (this.conversationButton) {\r\n this.conversationButton.addEventListener('click', () => {\r\n this.toggleConversationMode();\r\n });\r\n }\r\n }\r\n },\r\n loadSession(sessionId) {\r\n this.connection.invoke(\"LoadSession\", sessionId).catch(err => console.error(err));\r\n },\r\n reloadCurrentSession() {\r\n\r\n var sessionId = this.getSessionId();\r\n if (sessionId) {\r\n this.loadSession(sessionId);\r\n }\r\n },\r\n initializeSession(sessionId, force) {\r\n if (this.isSessionStarted && !force) {\r\n return\r\n }\r\n this.fireEvent(new CustomEvent(\"initializingSessionOpenAIChat\", { detail: { sessionId: sessionId } }))\r\n this.setSessionId(sessionId);\r\n this.isSessionStarted = true;\r\n\r\n if (this.widgetIsInitialized) {\r\n localStorage.setItem(this.chatWidgetStateSession, sessionId);\r\n }\r\n },\r\n initializeWidget() {\r\n\r\n if (!config.widget.chatWidgetContainer) {\r\n console.error('The widget chatWidgetContainer is required.');\r\n return;\r\n }\r\n\r\n if (!config.widget.chatWidgetStateName) {\r\n console.error('The widget chatWidgetStateName is required.');\r\n return;\r\n }\r\n\r\n const chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);\r\n\r\n if (!chatWidgetContainer) {\r\n return;\r\n }\r\n\r\n if (config.widget.chatHistorySection) {\r\n this.chatHistorySection = document.querySelector(config.widget.chatHistorySection);\r\n }\r\n\r\n this.chatWidgetStateName = config.widget.chatWidgetStateName;\r\n this.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';\r\n this.chatWidgetLayoutKey = config.widget.chatWidgetStateName + 'Layout';\r\n this.widgetContainerElement = chatWidgetContainer;\r\n this.widgetToggleButtonElement = config.widget.toggleButtonSelector\r\n ? document.querySelector(config.widget.toggleButtonSelector)\r\n : null;\r\n this.widgetResetSizeButtonElement = config.widget.resetSizeButtonSelector\r\n ? document.querySelector(config.widget.resetSizeButtonSelector)\r\n : null;\r\n this.widgetDefaultWidth = parsePixelValue(config.widget.defaultWidth) ||\r\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).width) ||\r\n 380;\r\n this.widgetDefaultHeight = parsePixelValue(config.widget.defaultHeight) ||\r\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).height) ||\r\n 520;\r\n this.widgetIsInitialized = true;\r\n\r\n if (config.widget.enableResizing) {\r\n chatWidgetContainer.classList.add('ai-chat-widget-resizable');\r\n chatWidgetContainer.style.minWidth = (parsePixelValue(config.widget.minWidth) || 320) + 'px';\r\n chatWidgetContainer.style.minHeight = (parsePixelValue(config.widget.minHeight) || 420) + 'px';\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.widgetResizeObserver = new ResizeObserver(() => {\r\n this.persistWidgetPanelSize();\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n });\r\n\r\n this.widgetResizeObserver.observe(chatWidgetContainer);\r\n }\r\n }\r\n\r\n var dragHandleSelector = config.widget.dragHandleSelector || '.ai-chat-widget-header';\r\n var dragHandle = chatWidgetContainer.querySelector(dragHandleSelector);\r\n\r\n if (config.widget.enableDragging && dragHandle) {\r\n dragHandle.classList.add('ai-chat-widget-drag-handle');\r\n chatWidgetContainer.classList.add('ai-chat-widget-draggable');\r\n this.attachDraggableWidgetElement(chatWidgetContainer, dragHandle, 'panel', false);\r\n }\r\n\r\n if (config.widget.enableDragging && this.widgetToggleButtonElement) {\r\n this.widgetToggleButtonElement.classList.add('ai-chat-widget-draggable');\r\n this.attachDraggableWidgetElement(this.widgetToggleButtonElement, this.widgetToggleButtonElement, 'toggle', true);\r\n }\r\n\r\n if (this.widgetResetSizeButtonElement) {\r\n this.widgetResetSizeButtonElement.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n this.resetWidgetSize();\r\n });\r\n }\r\n\r\n this.restoreWidgetLayout();\r\n\r\n if (!this.widgetViewportResizeHandler) {\r\n this.widgetViewportResizeHandler = () => {\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n };\r\n\r\n window.addEventListener('resize', this.widgetViewportResizeHandler);\r\n }\r\n\r\n // Auto-load the last session so the user always sees previous chat history.\r\n this.reloadCurrentSession();\r\n\r\n if (config.autoCreateSession && !this.getSessionId()) {\r\n this.startNewSession();\r\n }\r\n\r\n if (config.widget.showHistoryButton && this.chatHistorySection) {\r\n\r\n const showHistoryButton = document.querySelector(config.widget.showHistoryButton);\r\n\r\n if (showHistoryButton) {\r\n showHistoryButton.addEventListener('click', () => {\r\n this.chatHistorySection.classList.toggle('show');\r\n });\r\n }\r\n\r\n if (config.widget.closeHistoryButton) {\r\n var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);\r\n\r\n if (closeHistoryButton) {\r\n closeHistoryButton.addEventListener('click', () => {\r\n this.showChatScreen();\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (config.widget.newChatButton) {\r\n const newChatButton = document.querySelector(config.widget.newChatButton);\r\n\r\n if (newChatButton) {\r\n newChatButton.addEventListener('click', () => {\r\n this.resetSession();\r\n this.showChatScreen();\r\n });\r\n }\r\n }\r\n },\r\n showChatScreen() {\r\n\r\n if (!this.chatHistorySection) {\r\n return;\r\n }\r\n\r\n this.chatHistorySection.classList.remove('show');\r\n },\r\n getSessionId() {\r\n let sessionId = this.inputElement.getAttribute('data-session-id');\r\n\r\n if (!sessionId && this.widgetIsInitialized) {\r\n sessionId = localStorage.getItem(this.chatWidgetStateSession);\r\n }\r\n\r\n return sessionId;\r\n },\r\n copyResponse(message) {\r\n navigator.clipboard.writeText(message);\r\n },\r\n updateFeedbackIcons(container, userRating) {\r\n if (!container) {\r\n return;\r\n }\r\n\r\n var upBtn = container.querySelector('.rate-up-btn');\r\n var downBtn = container.querySelector('.rate-down-btn');\r\n\r\n // Font Awesome SVG+JS replaces with , so we must replace\r\n // the entire button content and let Font Awesome re-process.\r\n if (upBtn) {\r\n var upClass = userRating === true ? 'fa-solid fa-thumbs-up' : 'fa-regular fa-thumbs-up';\r\n var upIcon = document.createElement('i');\r\n upIcon.className = upClass;\r\n upIcon.style.fontSize = '0.9rem';\r\n upBtn.textContent = '';\r\n upBtn.appendChild(upIcon);\r\n }\r\n\r\n if (downBtn) {\r\n var downClass = userRating === false ? 'fa-solid fa-thumbs-down' : 'fa-regular fa-thumbs-down';\r\n var downIcon = document.createElement('i');\r\n downIcon.className = downClass;\r\n downIcon.style.fontSize = '0.9rem';\r\n downBtn.textContent = '';\r\n downBtn.appendChild(downIcon);\r\n }\r\n\r\n // Trigger Font Awesome SVG+JS to convert the new elements.\r\n if (window.FontAwesome && FontAwesome.dom && FontAwesome.dom.i2svg) {\r\n FontAwesome.dom.i2svg({ node: container });\r\n }\r\n },\r\n refreshAllFeedbackIcons() {\r\n var containers = this.$el.querySelectorAll('.ai-chat-message-assistant-feedback');\r\n\r\n for (var i = 0; i < containers.length; i++) {\r\n var msgId = containers[i].getAttribute('data-message-id');\r\n var msg = this.messages.find(m => m.id === msgId);\r\n\r\n if (msg) {\r\n this.updateFeedbackIcons(containers[i], msg.userRating);\r\n }\r\n }\r\n },\r\n rateMessage(message, isPositive, event) {\r\n var sessionId = this.getSessionId();\r\n\r\n if (!sessionId || !message.id || !this.connection) {\r\n return;\r\n }\r\n\r\n // Toggle: clicking the same rating again clears it.\r\n var newRating = message.userRating === isPositive ? null : isPositive;\r\n message.userRating = newRating;\r\n\r\n // Find the feedback container by message ID for reliable DOM targeting.\r\n var feedbackContainer = this.$el.querySelector(\r\n '.ai-chat-message-assistant-feedback[data-message-id=\"' + message.id + '\"]'\r\n );\r\n\r\n this.updateFeedbackIcons(feedbackContainer, newRating);\r\n\r\n // Trigger spark animation after Font Awesome has re-processed icons.\r\n if (newRating !== null && feedbackContainer) {\r\n setTimeout(() => {\r\n var btnClass = isPositive ? '.rate-up-btn' : '.rate-down-btn';\r\n var btn = feedbackContainer.querySelector(btnClass);\r\n\r\n if (btn) {\r\n btn.classList.remove('spark-effect');\r\n void btn.offsetWidth;\r\n btn.classList.add('spark-effect');\r\n btn.addEventListener('animationend', function onEnd() {\r\n btn.removeEventListener('animationend', onEnd);\r\n btn.classList.remove('spark-effect');\r\n });\r\n }\r\n }, 50);\r\n }\r\n\r\n this.connection.invoke(\"RateMessage\", sessionId, message.id, isPositive).catch(function (err) {\r\n console.error('Failed to rate message:', err);\r\n });\r\n }\r\n },\r\n watch: {\r\n documents: {\r\n handler() { this.renderDocumentBar(); },\r\n deep: true\r\n },\r\n isUploading() { this.renderDocumentBar(); },\r\n isPlayingAudio() {\r\n // Reserved for future use — volume-based interrupt detection\r\n // no longer mutes tracks; browser echo cancellation handles echo.\r\n },\r\n isConversationMode(active) {\r\n // Hide/show mic button.\r\n if (this.micButton) {\r\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\r\n }\r\n\r\n // Hide/show send button.\r\n if (this.buttonElement) {\r\n this.buttonElement.style.display = active ? 'none' : '';\r\n }\r\n\r\n // Disable/enable textarea.\r\n if (this.inputElement) {\r\n this.inputElement.disabled = active;\r\n if (active) {\r\n this.inputElement.placeholder = '';\r\n }\r\n }\r\n }\r\n },\r\n mounted() {\r\n (async () => {\r\n await this.startConnection();\r\n this.initializeApp();\r\n if (hasWidgetConfig) {\r\n this.initializeWidget();\r\n }\r\n })();\r\n\r\n window.addEventListener('beforeunload', this.handleBeforeUnload);\r\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n },\r\n beforeUnmount() {\r\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\r\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n\r\n this.stopAudio(false);\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n },\r\n template: config.messageTemplate\r\n }).mount(config.appElementSelector);\r\n\r\n return app;\r\n };\r\n\r\n return {\r\n initialize: initialize\r\n };\r\n}();\r\n\r\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\r\ndocument.addEventListener('click', function (e) {\r\n const btn = e.target.closest('.download-chart-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n const chartId = btn.getAttribute('data-chart-id');\r\n const canvas = chartId ? document.getElementById(chartId) : null;\r\n if (!canvas) {\r\n console.error('Chart canvas not found:', chartId);\r\n return;\r\n }\r\n const link = document.createElement('a');\r\n link.download = 'chart-' + chartId + '.png';\r\n link.href = canvas.toDataURL('image/png');\r\n link.click();\r\n});\r\n\r\n// Intercept download clicks for data-URI images and convert to blob downloads.\r\ndocument.addEventListener('click', function (e) {\r\n const link = e.target.closest('.ai-download-image');\r\n if (!link) {\r\n return;\r\n }\r\n\r\n const container = link.closest('.generated-image-container');\r\n const img = container?.querySelector('img');\r\n if (!img) {\r\n return;\r\n }\r\n\r\n const src = img.src;\r\n if (!src || !src.startsWith('data:')) {\r\n return; // Normal URL – let the default behaviour handle it.\r\n }\r\n\r\n e.preventDefault();\r\n\r\n fetch(src)\r\n .then(function (res) { return res.blob(); })\r\n .then(function (blob) {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = link.getAttribute('download') || 'generated-image.png';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\r\n })\r\n .catch(function (err) { console.error('Failed to download image:', err); });\r\n});\r\n"]} \ No newline at end of file diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.min.js b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.min.js index b3571d2a..fab50da4 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.min.js +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.min.js @@ -1,2 +1,2 @@ -function _regenerator(){/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */var e,t,n="function"==typeof Symbol?Symbol:{},i=n.iterator||"@@iterator",s=n.toStringTag||"@@toStringTag";function o(n,i,s,o){var c=i&&i.prototype instanceof r?i:r,l=Object.create(c.prototype);return _regeneratorDefine2(l,"_invoke",function(n,i,s){var o,r,c,l=0,d=s||[],u=!1,h={p:0,n:0,v:e,a:f,f:f.bind(e,4),d:function(t,n){return o=t,r=0,c=e,h.n=n,a}};function f(n,i){for(r=n,c=i,t=0;!u&&l&&!s&&t3?(s=m===i)&&(c=o[(r=o[4])?5:(r=3,3)],o[4]=o[5]=e):o[0]<=f&&((s=n<2&&fi||i>m)&&(o[4]=n,o[5]=i,h.n=m,r=0))}if(s||n>1)return a;throw u=!0,i}return function(s,d,m){if(l>1)throw TypeError("Generator is already running");for(u&&1===d&&f(d,m),r=d,c=m;(t=r<2?e:c)||!u;){o||(r?r<3?(r>1&&(h.n=-1),f(r,c)):h.n=c:h.v=c);try{if(l=2,o){if(r||(s="next"),t=o[s]){if(!(t=t.call(o,c)))throw TypeError("iterator result is not an object");if(!t.done)return t;c=t.value,r<2&&(r=0)}else 1===r&&(t=o.return)&&t.call(o),r<2&&(c=TypeError("The iterator does not provide a '"+s+"' method"),r=1);o=e}else if((t=(u=h.n<0)?c:n.call(i,h))!==a)break}catch(t){o=e,r=1,c=t}finally{l=1}}return{value:t,done:u}}}(n,s,o),!0),l}var a={};function r(){}function c(){}function l(){}t=Object.getPrototypeOf;var d=[][i]?t(t([][i]())):(_regeneratorDefine2(t={},i,function(){return this}),t),u=l.prototype=r.prototype=Object.create(d);function h(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,_regeneratorDefine2(e,s,"GeneratorFunction")),e.prototype=Object.create(u),e}return c.prototype=l,_regeneratorDefine2(u,"constructor",l),_regeneratorDefine2(l,"constructor",c),c.displayName="GeneratorFunction",_regeneratorDefine2(l,s,"GeneratorFunction"),_regeneratorDefine2(u),_regeneratorDefine2(u,s,"Generator"),_regeneratorDefine2(u,i,function(){return this}),_regeneratorDefine2(u,"toString",function(){return"[object Generator]"}),(_regenerator=function(){return{w:o,m:h}})()}function _regeneratorDefine2(e,t,n,i){var s=Object.defineProperty;try{s({},"",{})}catch(e){s=0}_regeneratorDefine2=function(e,t,n,i){function o(t,n){_regeneratorDefine2(e,t,function(e){return this._invoke(t,n,e)})}t?s?s(e,t,{value:n,enumerable:!i,configurable:!i,writable:!i}):e[t]=n:(o("next",0),o("throw",1),o("return",2))},_regeneratorDefine2(e,t,n,i)}function asyncGeneratorStep(e,t,n,i,s,o,a){try{var r=e[o](a),c=r.value}catch(e){return void n(e)}r.done?t(c):Promise.resolve(c).then(i,s)}function _asyncToGenerator(e){return function(){var t=this,n=arguments;return new Promise(function(i,s){var o=e.apply(t,n);function a(e){asyncGeneratorStep(o,i,s,a,r,"next",e)}function r(e){asyncGeneratorStep(o,i,s,a,r,"throw",e)}a(void 0)})}}function _createForOfIteratorHelper(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=_unsupportedIterableToArray(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,s=function(){};return{s:s,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:s}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,r=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){r=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(r)throw o}}}}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=Array(t);n\n
\n
\n
{{ userLabel }}
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n \n ',indicatorTemplate:'\n
\n \n Assistant\n
\n '};function t(e){if(!e)return"";var t=e.trim();return/^javascript:/i.test(t)||/^vbscript:/i.test(t)||/^data:text\/html/i.test(t)?"":e}function n(e){var t=document.createElement("span");return t.textContent=e,t.innerHTML}function i(e){var t,n,i,s,o,a;if(!e||"object"!==_typeof(e))return null;var r=Object.assign({},e);return r.index=null!==(t=null!==(n=r.index)&&void 0!==n?n:r.Index)&&void 0!==t?t:0,r.text=null!==(i=null!==(s=r.text)&&void 0!==s?s:r.Text)&&void 0!==i?i:null,r.link=null!==(o=null!==(a=r.link)&&void 0!==a?a:r.Link)&&void 0!==o?o:null,r}function s(e){if(!e||"object"!==_typeof(e))return{};for(var t={},n=0,s=Object.entries(e);n').concat(e.text,"
"):e.text||""},o.code=function(e){var t=e.text||"",i=(e.lang||"").trim(),s=t;if("undefined"!=typeof hljs)if(i&&hljs.getLanguage(i))try{s=hljs.highlight(t,{language:i}).value}catch(e){}else try{s=hljs.highlightAuto(t).value}catch(e){}else s=n(t);var o=i?n(i):"code";return'
'.concat(o,'
').concat(s,"
")},o.image=function(n){var i=t(n.href);if(!i)return"";var s=n.text||e.generatedImageAltText,o=e.generatedImageMaxWidth;return'
\n ').concat(s,'\n
\n \n \n \n
\n
')};var a=0,r=[];function c(e){if(e&&e._pendingCharts&&e._pendingCharts.length){var t=_toConsumableArray(e._pendingCharts);e._pendingCharts=[],requestAnimationFrame(function(){var e,n=_createForOfIteratorHelper(t);try{for(n.s();!(e=n.n()).done;){var i=e.value;l(i.chartId,i.config)}}catch(e){n.e(e)}finally{n.f()}})}}function l(e,t){var n=document.getElementById(e);if(!n)return!1;if("undefined"==typeof Chart)return console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n return false;\n }\n\n // When the canvas is inside a hidden container (e.g., a widget panel with\n // display:none), it has zero dimensions and Chart.js cannot render correctly.\n // Keep the config in __chartConfigs so renderPendingCharts() can retry later\n // once the container becomes visible.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[chartId] = config;\n return false;\n }\n\n try {\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof config === 'string' ? JSON.parse(config) : config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n delete window.__chartConfigs[chartId];\n return true;\n } catch (e) {\n console.error('Error creating chart:', e);\n return false;\n }\n }\n\n // Global function: renders any chart canvases whose configs are in the\n // global __chartConfigs map. Called by pages (e.g., Chat Interactions)\n // that share the marked instance but have their own rendering pipeline.\n window.renderPendingCharts = function () {\n if (typeof Chart === 'undefined') {\n return;\n }\n\n const configs = window.__chartConfigs;\n if (!configs) {\n return;\n }\n\n requestAnimationFrame(() => {\n for (const chartId of Object.keys(configs)) {\n renderChartOnCanvas(chartId, configs[chartId]);\n }\n });\n };\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n const initialize = (instanceConfig) => {\n\n const config = Object.assign({}, defaultConfig, instanceConfig);\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isSessionStarted: false,\n isPlaceholderVisible: true,\n chatWidgetStateName: null,\n chatWidgetStateSession: null,\n chatHistorySection: null,\n widgetIsInitialized: false,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n notifications: [],\n prompt: '',\n documents: config.existingDocuments || [],\n isUploading: false,\n uploadErrors: [],\n isDragOver: false,\n documentBar: null,\n metricsEnabled: !!config.metricsEnabled,\n userLabel: config.userLabel,\n assistantLabel: config.assistantLabel,\n thumbsUpTitle: config.thumbsUpTitle,\n thumbsDownTitle: config.thumbsDownTitle,\n copyTitle: config.copyTitle,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n ttsButton: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n singleResponseMode: !!config.singleResponseMode,\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n notificationDismissTimers: {},\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n handleDragOver(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = true;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.add('ai-chat-drag-over');\n },\n handleDragLeave(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = false;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\n },\n handleDrop(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = false;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\n if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.uploadFiles(e.dataTransfer.files);\n }\n },\n triggerFileInput() {\n if (!config.sessionDocumentsEnabled) return;\n var fileInput = document.getElementById('ai-chat-doc-input');\n if (fileInput) fileInput.click();\n },\n handleFileInputChange(e) {\n var files = e.target.files;\n if (files && files.length > 0) {\n this.uploadFiles(files);\n }\n e.target.value = '';\n },\n async uploadFiles(files) {\n if (!config.uploadDocumentUrl) return;\n\n var sessionId = this.getSessionId();\n var profileId = this.getProfileId();\n\n if (!sessionId && !profileId) {\n console.warn('Cannot upload documents without a session or profile.');\n return;\n }\n\n this.isUploading = true;\n this.uploadErrors = [];\n this.renderDocumentBar();\n try {\n var formData = new FormData();\n if (sessionId) {\n formData.append('sessionId', sessionId);\n } else {\n formData.append('profileId', profileId);\n }\n for (var i = 0; i < files.length; i++) {\n formData.append('files', files[i]);\n }\n\n var response = await fetch(config.uploadDocumentUrl, {\n method: 'POST',\n body: formData\n });\n\n if (!response.ok) {\n var errorText = await response.text();\n var uploadError = this.extractReadableErrorMessage(errorText, 'Upload failed. Please try again.');\n console.error('Upload failed:', errorText);\n this.uploadErrors = [{ fileName: '', error: uploadError }];\n return;\n }\n\n var result = await response.json();\n\n // If the server created a new session, initialize it.\n if (result.sessionId && !sessionId) {\n this.initializeSession(result.sessionId);\n }\n\n if (result.uploaded && result.uploaded.length > 0) {\n for (var j = 0; j < result.uploaded.length; j++) {\n this.documents.push(result.uploaded[j]);\n }\n }\n if (result.failed && result.failed.length > 0) {\n this.uploadErrors = result.failed;\n }\n } catch (err) {\n console.error('Upload error:', err);\n this.uploadErrors = [{ fileName: '', error: 'Upload failed. Please try again.' }];\n } finally {\n this.isUploading = false;\n this.renderDocumentBar();\n }\n },\n async removeDocument(doc) {\n if (!config.removeDocumentUrl) return;\n\n try {\n var sessionId = this.getSessionId();\n var response = await fetch(config.removeDocumentUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ itemId: sessionId, documentId: doc.documentId })\n });\n\n if (response.ok) {\n var idx = this.documents.indexOf(doc);\n if (idx > -1) this.documents.splice(idx, 1);\n } else {\n var errorText = await response.text();\n var removeError = this.extractReadableErrorMessage(errorText, 'Failed to remove document. Please try again.');\n console.error('Failed to remove document:', response.status, errorText);\n this.uploadErrors = [{ fileName: doc.fileName || '', error: removeError }];\n this.renderDocumentBar();\n }\n } catch (err) {\n console.error('Remove document error:', err);\n this.uploadErrors = [{ fileName: doc.fileName || '', error: 'Failed to remove document. Please try again.' }];\n this.renderDocumentBar();\n }\n },\n formatFileSize(bytes) {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n },\n renderDocumentBar() {\n if (!this.documentBar) return;\n\n if (!config.sessionDocumentsEnabled) {\n this.documentBar.classList.add('d-none');\n return;\n }\n\n this.documentBar.classList.remove('d-none');\n\n var html = '
';\n html += '
';\n\n for (var i = 0; i < this.documents.length; i++) {\n var doc = this.documents[i];\n var name = doc.fileName || 'Document';\n if (name.length > 20) name = name.substring(0, 17) + '...';\n html += '';\n html += ' ';\n html += this.escapeHtml(name);\n html += ' ';\n html += '';\n }\n\n for (var m = 0; m < this.uploadErrors.length; m++) {\n var failedItem = this.uploadErrors[m];\n var failedName = failedItem.fileName || 'File';\n var errorMsg = failedItem.error || 'Upload failed';\n if (failedName.length > 15) failedName = failedName.substring(0, 12) + '...';\n html += '';\n html += ' ';\n html += this.escapeHtml(failedName);\n html += ' ';\n html += '';\n }\n\n if (this.isUploading) {\n html += '';\n html += ' Uploading...';\n html += '';\n }\n\n html += '';\n html += '
';\n if (config.supportedExtensionsText) {\n html += '
Supported formats: ' + this.escapeHtml(config.supportedExtensionsText) + '
';\n }\n\n html += '
';\n\n this.documentBar.replaceChildren(DOMPurify.sanitize(html, { RETURN_DOM_FRAGMENT: true }));\n\n // Bind remove handlers\n var self = this;\n var closeButtons = this.documentBar.querySelectorAll('[data-doc-index]');\n for (var j = 0; j < closeButtons.length; j++) {\n closeButtons[j].addEventListener('click', (function (idx) {\n return function (e) {\n e.preventDefault();\n e.stopPropagation();\n var docToRemove = self.documents[idx];\n if (docToRemove) self.removeDocument(docToRemove);\n };\n })(parseInt(closeButtons[j].getAttribute('data-doc-index'))));\n }\n\n // Bind error dismiss handlers\n var errorCloseButtons = this.documentBar.querySelectorAll('[data-error-index]');\n for (var n = 0; n < errorCloseButtons.length; n++) {\n errorCloseButtons[n].addEventListener('click', (function (idx) {\n return function (e) {\n e.preventDefault();\n e.stopPropagation();\n self.uploadErrors.splice(idx, 1);\n self.renderDocumentBar();\n };\n })(parseInt(errorCloseButtons[n].getAttribute('data-error-index'))));\n }\n\n // Bind add button\n var addBtn = this.documentBar.querySelector('.ai-chat-doc-add-btn');\n if (addBtn) {\n addBtn.addEventListener('click', function (e) {\n e.preventDefault();\n self.triggerFileInput();\n });\n }\n },\n escapeHtml(text) {\n var div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n },\n extractReadableErrorMessage(errorText, fallbackMessage) {\n if (!errorText || typeof errorText !== 'string') {\n return fallbackMessage;\n }\n\n var trimmed = errorText.trim();\n if (!trimmed) {\n return fallbackMessage;\n }\n\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n var parsed = JSON.parse(trimmed);\n var message = parsed?.error || parsed?.message || parsed?.title || parsed?.detail;\n return typeof message === 'string' && message.trim()\n ? message.trim()\n : fallbackMessage;\n } catch (err) {\n return fallbackMessage;\n }\n }\n\n if (/<[^>]+>/.test(trimmed)) {\n return fallbackMessage;\n }\n\n return trimmed;\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : this.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadSession\", (data) => {\n this.initializeSession(data.sessionId, true);\n this.messages = [];\n this.documents = data.documents || [];\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n\n // Update feedback icons in the DOM after all messages have rendered.\n this.$nextTick(() => {\n this.refreshAllFeedbackIcons();\n });\n\n // When the session is new (no messages) and an initial prompt is configured,\n // automatically send it as the first user message to trigger an AI response.\n if (this.messages.length === 0 && config.initialPrompt) {\n this.prompt = config.initialPrompt;\n this.sendMessage();\n }\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // If this is a widget with a stale cached session (e.g., profile was deleted),\n // clear the cached session and start fresh with the current profile.\n if (this.widgetIsInitialized && !this.isSessionStarted && !this._attemptedSessionRecovery) {\n this._attemptedSessionRecovery = true;\n localStorage.removeItem(this.chatWidgetStateSession);\n this.startNewSession();\n }\n });\n\n this.connection.on(\"MessageRated\", (messageId, userRating) => {\n var msg = this.messages.find(m => m.id === messageId);\n if (msg) {\n msg.userRating = userRating;\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (sessionId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (sessionId, text) => {\n if (text) {\n this.stopAudio();\n\n // If there's an interrupted assistant message still streaming,\n // mark it as done to stop the spinner animation.\n if (this._conversationAssistantMessage) {\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\n if (oldMsg) {\n oldMsg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (sessionId, messageId, token, responseId, appearance) => {\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n userRating: null,\n appearance: this.normalizeAssistantAppearance(appearance),\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.content = this._conversationAssistantMessage.content;\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (sessionId, messageId) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (sessionId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n this.audioChunks.push(bytes);\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (sessionId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n\n if (this.isSessionStarted) {\n this.reloadCurrentSession();\n } else if (config.autoCreateSession) {\n this.startNewSession();\n }\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingOpenAIPromotMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedOpenAIPromotMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n\n // Ensure userRating is always defined for Vue reactivity.\n if (message.userRating === undefined) {\n message.userRating = null;\n }\n\n if (message.content) {\n let processedContent = message.content.trim();\n message.references = normalizeReferences(message.references);\n\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\n\n // Only include references that were actually cited in the response.\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\n\n if (citedRefs.length) {\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders.\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\n processedContent = processedContent.replaceAll('
', ',');\n\n processedContent += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || key;\n processedContent += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n }\n }\n\n message.content = processedContent;\n message.htmlContent = parseMarkdownContent(processedContent, message);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n addMessages(messages) {\n\n for (let i = 0; i < messages.length; i++) {\n this.addMessageInternal(messages[i]);\n }\n\n this.hidePlaceholder();\n this.$nextTick(() => {\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n isOrchestratorAvailable() {\n return config.isOrchestratorAvailable !== false;\n },\n applyOrchestratorAvailability() {\n if (this.isOrchestratorAvailable()) {\n return true;\n }\n\n const unavailableMessage = config.orchestratorUnavailableMessage || \"This orchestrator is not currently available.\";\n\n if (this.inputElement) {\n this.inputElement.disabled = true;\n this.inputElement.value = '';\n this.inputElement.placeholder = unavailableMessage;\n }\n\n if (this.buttonElement) {\n this.buttonElement.disabled = true;\n }\n\n if (this.micButtonElement) {\n this.micButtonElement.disabled = true;\n this.micButtonElement.style.display = 'none';\n }\n\n if (this.conversationButtonElement) {\n this.conversationButtonElement.disabled = true;\n this.conversationButtonElement.style.display = 'none';\n }\n\n return false;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n sendMessage() {\n if (!this.applyOrchestratorAvailability()) {\n return;\n }\n\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // In single-response mode, clear all previous messages.\n if (this.singleResponseMode) {\n this.messages.splice(0, this.messages.length);\n }\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n this.streamMessage(this.getProfileId(), trimmedPrompt, null);\n this.inputElement.value = '';\n this.prompt = '';\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var profileId = this.getProfileId();\n var sessionId = this.getSessionId() || '';\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", profileId, sessionId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n },\n streamMessage(profileId, trimmedPrompt, sessionProfileId) {\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n // Get the index after showing typing indicator.\n var messageIndex = this.messages.length;\n var currentSessionId = this.getSessionId();\n\n this.stream = this.connection.stream(\"SendMessage\", profileId, trimmedPrompt, currentSessionId, sessionProfileId)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n\n if (chunk.sessionId && !currentSessionId) {\n this.initializeSession(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n // Re-assign the index after hiding the typing indicator.\n messageIndex = this.messages.length;\n let newMessage = {\n id: chunk.messageId,\n role: \"assistant\",\n title: chunk.title,\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n userRating: null,\n };\n\n this.messages.push(newMessage);\n\n message = newMessage;\n }\n\n if (chunk.title && (!message.title || message.title !== chunk.title)) {\n message.title = chunk.title;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = normalizeReference(value) ?? {};\n }\n }\n\n if (chunk.content) {\n\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n let processedContent = chunk.content;\n\n for (const [key, value] of Object.entries(references)) {\n processedContent = processedContent.replaceAll(key, `${value.index}`);\n }\n\n // Append processed content to the message.\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\n content += processedContent.replaceAll('
', ',');\n }\n\n // Update the existing message\n message.content = content;\n\n message.htmlContent = parseMarkdownContent(content, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n let newMessage = {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n\n return newMessage;\n },\n processReferences(references, messageIndex) {\n references = normalizeReferences(references);\n\n if (Object.keys(references).length) {\n\n let message = this.messages[messageIndex];\n const content = message.content || '';\n\n // Only include references that were actually cited in the response.\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\n const citedRefs = Object.entries(references).filter(([key, value]) =>\n content.includes(key) || content.includes(`${value.index}`)\n );\n\n if (!citedRefs.length) {\n return;\n }\n\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\n let processed = content.trim();\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processed = processed.replaceAll(key, placeholder);\n processed = processed.replaceAll(`${value.index}`, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processed = processed.replaceAll('', ',');\n\n processed += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || key;\n processed += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n\n message.content = processed;\n message.htmlContent = parseMarkdownContent(processed, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n if (this.inputElement) {\n this.inputElement.setAttribute('disabled', 'disabled');\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n if (this.inputElement) {\n this.inputElement.removeAttribute('disabled');\n this.inputElement.focus();\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getProfileId(), this.getSessionId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio();\n this.ttsPlayingMessageIndex = index;\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.currentAudioElement && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is already playing, queue this blob for sequential playback.\n if (this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.isPlayingAudio = false;\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n var nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n // During TTS playback, detect when the user speaks above\n // the threshold to stop TTS (interrupt). Audio chunks are\n // always forwarded — browser echo cancellation handles\n // speaker echo so the STT stream has no gaps.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var profileId = this.getProfileId();\n var sessionId = this.getSessionId() || '';\n var language = navigator.language || document.documentElement.lang || 'en-US';\n\n this.connection.send(\"StartConversation\", profileId, sessionId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, audio playback continuation\n // is handled by the persistent stream. This method is only\n // called from playCollectedAudio for non-conversation TTS.\n },\n generatePrompt(element) {\n if (!element) {\n console.error('The element paramter is required.');\n\n return;\n }\n\n let templateProfileId = element.getAttribute('data-profile-id');\n let sessionId = this.getSessionId();\n let sessionProfileId = this.getProfileId();\n\n if (!templateProfileId || !sessionId) {\n\n console.error('The given element is missing data-profile-id or the session has not yet started.');\n return;\n }\n\n // streamMessage() already shows the typing indicator.\n this.streamMessage(templateProfileId, null, sessionProfileId);\n },\n createSessionUrl(baseUrl, param, value) {\n\n const fullUrl = baseUrl.toLowerCase().startsWith('http') ? baseUrl : window.location.origin + baseUrl;\n const url = new URL(fullUrl);\n\n url.searchParams.set(param, value);\n\n return url.toString();\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\n if (existingIndex >= 0) {\n this.notifications.splice(existingIndex, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.$nextTick(() => {\n this.scrollToBottom();\n });\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\n if (existingIndex >= 0) {\n this.notifications.splice(existingIndex, 1, notification);\n this.scheduleNotificationDismiss(notification);\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var sessionId = this.getSessionId();\n this.connection.invoke(\"HandleNotificationAction\", sessionId, notificationType, actionName).catch(function (err) {\n console.error(\"Error handling notification action:\", err);\n });\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getProfileId() {\n return this.inputElement.getAttribute('data-profile-id');\n },\n setSessionId(sessionId) {\n this.inputElement.setAttribute('data-session-id', sessionId || '');\n },\n resetSession() {\n this.stopRecording();\n this.setSessionId('');\n this.isSessionStarted = false;\n this.sessionRating = null;\n if (this.widgetIsInitialized) {\n localStorage.removeItem(this.chatWidgetStateSession);\n }\n this.messages = [];\n this.documents = [];\n if (!config.autoCreateSession) {\n this.showPlaceholder();\n }\n\n if (config.autoCreateSession) {\n this.startNewSession();\n }\n },\n startNewSession() {\n if (!this.applyOrchestratorAvailability()) {\n return;\n }\n\n const profileId = this.getProfileId();\n if (!profileId || !this.connection) {\n return;\n }\n\n this.connection.invoke(\"StartSession\", profileId, null).catch(err => console.error(err));\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n this.applyOrchestratorAvailability();\n\n const sessionId = this.getSessionId();\n if (!config.widget && sessionId) {\n this.loadSession(sessionId);\n } else if (this.isOrchestratorAvailable() && config.autoCreateSession && !config.widget && !sessionId) {\n this.startNewSession();\n }\n\n // Initialize document bar if enabled.\n if (config.sessionDocumentsEnabled && config.documentBarSelector) {\n this.documentBar = document.querySelector(config.documentBarSelector);\n if (this.documentBar) {\n this.renderDocumentBar();\n\n // Create hidden file input for document uploads.\n var fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.id = 'ai-chat-doc-input';\n fileInput.className = 'd-none';\n fileInput.multiple = true;\n if (config.allowedExtensions) {\n fileInput.accept = config.allowedExtensions;\n }\n fileInput.addEventListener('change', (e) => this.handleFileInputChange(e));\n this.documentBar.parentElement.appendChild(fileInput);\n\n // Set up drag-and-drop on the input area.\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) {\n inputArea.addEventListener('dragover', (e) => this.handleDragOver(e));\n inputArea.addEventListener('dragleave', (e) => this.handleDragLeave(e));\n inputArea.addEventListener('drop', (e) => this.handleDrop(e));\n }\n }\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keydown', event => {\n\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.buttonElement.addEventListener('click', () => {\n\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const promptGenerators = document.getElementsByClassName('profile-generated-prompt');\n\n for (var i = 0; i < promptGenerators.length; i++) {\n promptGenerators[i].addEventListener('click', (e) => {\n e.preventDefault();\n this.generatePrompt(e.target);\n });\n }\n\n const chatSessions = document.getElementsByClassName('chat-session-history-item');\n\n for (var i = 0; i < chatSessions.length; i++) {\n chatSessions[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var sessionId = e.target.getAttribute('data-session-id');\n\n if (!sessionId) {\n console.error('an element with the class chat-session-history-item with no data-session-id set.');\n\n return;\n }\n\n this.loadSession(sessionId);\n this.showChatScreen();\n });\n }\n\n for (let i = 0; i < config.messages.length; i++) {\n this.addMessage(config.messages[i]);\n }\n\n // Update feedback icons in the DOM after initial messages have rendered.\n this.$nextTick(() => {\n this.refreshAllFeedbackIcons();\n });\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n },\n loadSession(sessionId) {\n this.connection.invoke(\"LoadSession\", sessionId).catch(err => console.error(err));\n },\n reloadCurrentSession() {\n\n var sessionId = this.getSessionId();\n if (sessionId) {\n this.loadSession(sessionId);\n }\n },\n initializeSession(sessionId, force) {\n if (this.isSessionStarted && !force) {\n return\n }\n this.fireEvent(new CustomEvent(\"initializingSessionOpenAIChat\", { detail: { sessionId: sessionId } }))\n this.setSessionId(sessionId);\n this.isSessionStarted = true;\n\n if (this.widgetIsInitialized) {\n localStorage.setItem(this.chatWidgetStateSession, sessionId);\n }\n },\n initializeWidget() {\n\n if (!config.widget.chatWidgetContainer) {\n console.error('The widget chatWidgetContainer is required.');\n return;\n }\n\n if (!config.widget.chatWidgetStateName) {\n console.error('The widget chatWidgetStateName is required.');\n return;\n }\n\n const chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);\n\n if (!chatWidgetContainer) {\n return;\n }\n\n if (config.widget.chatHistorySection) {\n this.chatHistorySection = document.querySelector(config.widget.chatHistorySection);\n }\n\n this.chatWidgetStateName = config.widget.chatWidgetStateName;\n this.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';\n this.widgetIsInitialized = true;\n\n // Auto-load the last session so the user always sees previous chat history.\n this.reloadCurrentSession();\n\n if (config.autoCreateSession && !this.getSessionId()) {\n this.startNewSession();\n }\n\n if (config.widget.showHistoryButton && this.chatHistorySection) {\n\n const showHistoryButton = document.querySelector(config.widget.showHistoryButton);\n\n if (showHistoryButton) {\n showHistoryButton.addEventListener('click', () => {\n this.chatHistorySection.classList.toggle('show');\n });\n }\n\n if (config.widget.closeHistoryButton) {\n var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);\n\n if (closeHistoryButton) {\n closeHistoryButton.addEventListener('click', () => {\n this.showChatScreen();\n });\n }\n }\n }\n\n if (config.widget.newChatButton) {\n const newChatButton = document.querySelector(config.widget.newChatButton);\n\n if (newChatButton) {\n newChatButton.addEventListener('click', () => {\n this.resetSession();\n this.showChatScreen();\n });\n }\n }\n },\n showChatScreen() {\n\n if (!this.chatHistorySection) {\n return;\n }\n\n this.chatHistorySection.classList.remove('show');\n },\n getSessionId() {\n let sessionId = this.inputElement.getAttribute('data-session-id');\n\n if (!sessionId && this.widgetIsInitialized) {\n sessionId = localStorage.getItem(this.chatWidgetStateSession);\n }\n\n return sessionId;\n },\n copyResponse(message) {\n navigator.clipboard.writeText(message);\n },\n updateFeedbackIcons(container, userRating) {\n if (!container) {\n return;\n }\n\n var upBtn = container.querySelector('.rate-up-btn');\n var downBtn = container.querySelector('.rate-down-btn');\n\n // Font Awesome SVG+JS replaces with , so we must replace\n // the entire button content and let Font Awesome re-process.\n if (upBtn) {\n var upClass = userRating === true ? 'fa-solid fa-thumbs-up' : 'fa-regular fa-thumbs-up';\n var upIcon = document.createElement('i');\n upIcon.className = upClass;\n upIcon.style.fontSize = '0.9rem';\n upBtn.textContent = '';\n upBtn.appendChild(upIcon);\n }\n\n if (downBtn) {\n var downClass = userRating === false ? 'fa-solid fa-thumbs-down' : 'fa-regular fa-thumbs-down';\n var downIcon = document.createElement('i');\n downIcon.className = downClass;\n downIcon.style.fontSize = '0.9rem';\n downBtn.textContent = '';\n downBtn.appendChild(downIcon);\n }\n\n // Trigger Font Awesome SVG+JS to convert the new elements.\n if (window.FontAwesome && FontAwesome.dom && FontAwesome.dom.i2svg) {\n FontAwesome.dom.i2svg({ node: container });\n }\n },\n refreshAllFeedbackIcons() {\n var containers = this.$el.querySelectorAll('.ai-chat-message-assistant-feedback');\n\n for (var i = 0; i < containers.length; i++) {\n var msgId = containers[i].getAttribute('data-message-id');\n var msg = this.messages.find(m => m.id === msgId);\n\n if (msg) {\n this.updateFeedbackIcons(containers[i], msg.userRating);\n }\n }\n },\n rateMessage(message, isPositive, event) {\n var sessionId = this.getSessionId();\n\n if (!sessionId || !message.id || !this.connection) {\n return;\n }\n\n // Toggle: clicking the same rating again clears it.\n var newRating = message.userRating === isPositive ? null : isPositive;\n message.userRating = newRating;\n\n // Find the feedback container by message ID for reliable DOM targeting.\n var feedbackContainer = this.$el.querySelector(\n '.ai-chat-message-assistant-feedback[data-message-id=\"' + message.id + '\"]'\n );\n\n this.updateFeedbackIcons(feedbackContainer, newRating);\n\n // Trigger spark animation after Font Awesome has re-processed icons.\n if (newRating !== null && feedbackContainer) {\n setTimeout(() => {\n var btnClass = isPositive ? '.rate-up-btn' : '.rate-down-btn';\n var btn = feedbackContainer.querySelector(btnClass);\n\n if (btn) {\n btn.classList.remove('spark-effect');\n void btn.offsetWidth;\n btn.classList.add('spark-effect');\n btn.addEventListener('animationend', function onEnd() {\n btn.removeEventListener('animationend', onEnd);\n btn.classList.remove('spark-effect');\n });\n }\n }, 50);\n }\n\n this.connection.invoke(\"RateMessage\", sessionId, message.id, isPositive).catch(function (err) {\n console.error('Failed to rate message:', err);\n });\n }\n },\n watch: {\n documents: {\n handler() { this.renderDocumentBar(); },\n deep: true\n },\n isUploading() { this.renderDocumentBar(); },\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n // Hide/show mic button.\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n // Hide/show send button.\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n // Disable/enable textarea.\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n if (config.widget) {\n this.initializeWidget();\n }\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n return {\n initialize: initialize\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} +{"version":3,"sources":["ai-chat.js"],"names":["_regenerator","e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","this","setPrototypeOf","__proto__","displayName","w","m","defineProperty","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","from","_arrayLikeToArray","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","push","_typeof","window","openAIChatManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","userLabel","assistantLabel","thumbsUpTitle","thumbsDownTitle","copyTitle","codeCopiedText","widget","chatWidgetContainer","chatWidgetStateName","chatHistorySection","showHistoryButton","closeHistoryButton","newChatButton","toggleButtonSelector","resetSizeButtonSelector","dragHandleSelector","enableDragging","enableResizing","persistLayout","defaultWidth","defaultHeight","minWidth","minHeight","messageTemplate","indicatorTemplate","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","parsePixelValue","Number","isFinite","parsed","parseFloat","clamp","min","max","Math","normalizeReference","reference","_ref","_normalized$index","_ref2","_normalized$text","_ref3","_normalized$link","normalized","assign","index","Index","Text","link","Link","normalizeReferences","references","_i","_Object$entries","entries","_normalizeReference","_Object$entries$_i","key","renderer","marked","Renderer","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","renderChartsInMessage","message","charts","requestAnimationFrame","_step","_iterator","renderChartOnCanvas","chartId","config","err","canvas","getElementById","Chart","console","warn","offsetParent","__chartConfigs","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","token","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","startIndex","endIndex","json","substring","tryExtractChartMarker","type","raw","renderPendingCharts","configs","_i2","_Object$keys","keys","initialize","instanceConfig","hasWidgetConfig","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isSessionStarted","isPlaceholderVisible","chatWidgetStateSession","chatWidgetLayoutKey","widgetContainerElement","widgetToggleButtonElement","widgetResetSizeButtonElement","widgetResizeObserver","widgetViewportResizeHandler","widgetDefaultWidth","widgetDefaultHeight","widgetIsInitialized","isStreaming","isNavigatingAway","autoScroll","stream","messages","notifications","prompt","documents","existingDocuments","isUploading","uploadErrors","isDragOver","documentBar","metricsEnabled","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsButton","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","random","singleResponseMode","conversationModeEnabled","conversationButton","isConversationMode","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","getStoredWidgetLayout","storedLayout","localStorage","getItem","saveStoredWidgetLayout","partialLayout","currentLayout","nextLayout","panel","toggle","setItem","stringify","getElementSize","element","fallbackWidth","fallbackHeight","width","height","rect","getBoundingClientRect","getComputedStyle","round","clampWidgetPosition","left","top","maxLeft","innerWidth","maxTop","innerHeight","applyAbsolutePosition","style","right","bottom","getWidgetDefaultSize","persistWidgetPanelPosition","panelRect","persistWidgetTogglePosition","toggleRect","persistWidgetPanelSize","defaultSize","currentSize","abs","updateWidgetResetSizeButtonVisibility","isResized","classList","add","resetWidgetSize","removeProperty","constrainWidgetElementsToViewport","restoreWidgetLayout","attachDraggableWidgetElement","handle","layoutKey","suppressClickOnDrag","_this","activePointerId","startX","startY","startLeft","startTop","dragged","stopDragging","event","pointerId","removeEventListener","onPointerMove","remove","dataset","dragSuppressClick","setTimeout","deltaX","clientX","deltaY","clientY","hypot","nextPosition","addEventListener","button","target","closest","setPointerCapture","preventDefault","panelDefaultSize","panelSize","clampedPanel","toggleSize","clampedToggle","handleDragOver","sessionDocumentsEnabled","stopPropagation","inputArea","handleDragLeave","handleDrop","dataTransfer","files","uploadFiles","triggerFileInput","fileInput","click","handleFileInputChange","_this2","_callee","sessionId","profileId","formData","response","errorText","uploadError","result","j","_t","_context","uploadDocumentUrl","getSessionId","getProfileId","renderDocumentBar","FormData","append","fetch","method","body","ok","extractReadableErrorMessage","fileName","initializeSession","uploaded","failed","removeDocument","doc","_this3","_callee2","removeError","_t2","_context2","removeDocumentUrl","headers","itemId","documentId","splice","status","formatFileSize","bytes","toFixed","escapeHtml","failedItem","failedName","errorMsg","supportedExtensionsText","replaceChildren","RETURN_DOM_FRAGMENT","self","closeButtons","querySelectorAll","docToRemove","parseInt","getAttribute","errorCloseButtons","addBtn","querySelector","div","fallbackMessage","startsWith","title","detail","normalizeAssistantAppearance","appearance","label","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","startConnection","_this4","_callee3","_t3","_context3","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","forEach","msg","addMessage","$nextTick","refreshAllFeedbackIcons","initialPrompt","sendMessage","stopRecording","_attemptedSessionRecovery","removeItem","startNewSession","messageId","userRating","find","id","isFinal","_conversationPartialTranscript","replace","_conversationPartialMessage","htmlContent","hidePlaceholder","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","escaped","responseId","hideTypingIndicator","msgIndex","newMessage","base64Audio","contentType","binaryString","atob","Uint8Array","charCodeAt","playCollectedAudio","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentSession","autoCreateSession","onclose","addMessageInternal","_this5","fireEvent","CustomEvent","_this6","processedContent","citedRefs","filter","_ref4","includes","sort","_ref6","_ref7","b","_step2","displayIndex","_iterator2","_step2$value","replaceAll","_displayIndex","_placeholder","_step3","_iterator3","_step4","_iterator4","_step4$value","addMessages","_this7","showPlaceholder","isOrchestratorAvailable","applyOrchestratorAvailability","unavailableMessage","orchestratorUnavailableMessage","disabled","micButtonElement","display","conversationButtonElement","isIndicator","trimmedPrompt","streamMessage","startRecording","_this8","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","subject","Subject","pendingChunk","size","_callee4","uint8Array","base64","_context4","arrayBuffer","reduce","str","byte","String","fromCharCode","btoa","getTracks","track","stop","complete","documentElement","send","updateMicButton","toggleRecording","sessionProfileId","_this9","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentSessionId","subscribe","chunk","_i3","_Object$entries2","_normalizeReference2","_Object$entries2$_i","_i4","_Object$entries3","_Object$entries3$_i","_this9$stream","processReferences","streamingFinished","synthesizeSpeech","_this9$stream2","getServiceDownMessage","_this0","_ref1","_ref10","_ref11","_ref12","_step5","processed","_iterator5","_step5$value","_step6","_iterator6","_step7","_iterator7","_step7$value","stopIcon","setAttribute","startIcon","removeAttribute","focus","icons","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this1","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","_step8","totalLength","sum","combined","offset","_iterator8","set","blob","Blob","_this10","URL","createObjectURL","Audio","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this11","updateConversationButton","_conversationSubject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","createMediaStreamSource","connect","analyser","freqData","frequencyBinCount","getByteFrequencyData","k","_callee5","_context5","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","generatePrompt","templateProfileId","createSessionUrl","baseUrl","param","fullUrl","toLowerCase","location","origin","searchParams","originalLength","_this12","clearNotificationDismiss","existingIndex","findIndex","scheduleNotificationDismiss","_this13","timerId","clearTimeout","dismissNotification","handleNotificationAction","actionName","_this14","scrollTop","scrollHeight","clientHeight","handleUserInput","setSessionId","resetSession","sessionRating","initializeApp","_this15","placeholderElementSelector","loadSession","documentBarSelector","className","multiple","allowedExtensions","accept","parentElement","appendChild","atBottom","shiftKey","lastMsg","pop","promptGenerators","getElementsByClassName","chatSessions","showChatScreen","btn","block","codeEl","clipboard","writeText","copiedText","micButtonElementSelector","conversationButtonElementSelector","force","initializeWidget","_this16","ResizeObserver","observe","dragHandle","copyResponse","updateFeedbackIcons","container","upBtn","downBtn","upClass","upIcon","fontSize","downClass","downIcon","FontAwesome","dom","i2svg","node","containers","$el","msgId","rateMessage","isPositive","newRating","feedbackContainer","btnClass","offsetWidth","onEnd","watch","handler","deep","active","mounted","_this17","_callee6","_context6","beforeUnmount","template","mount","download","toDataURL","img","res","removeChild"],"mappings":"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","file":"ai-chat.min.js","sourcesContent":["window.openAIChatManager = function () {\r\n\r\n // Defaults (can be overridden by instanceConfig)\r\n var defaultConfig = {\r\n // UI defaults for generated media\r\n generatedImageAltText: 'Generated Image',\r\n generatedImageMaxWidth: 400,\r\n downloadImageTitle: 'Download image',\r\n downloadChartTitle: 'Download chart as image',\r\n downloadChartButtonText: 'Download',\r\n userLabel: 'You',\r\n assistantLabel: 'Assistant',\r\n thumbsUpTitle: 'Thumbs up',\r\n thumbsDownTitle: 'Thumbs down',\r\n copyTitle: 'Click here to copy response to clipboard.',\r\n codeCopiedText: 'Copied!',\r\n widget: {\r\n chatWidgetContainer: null,\r\n chatWidgetStateName: null,\r\n chatHistorySection: null,\r\n showHistoryButton: null,\r\n closeHistoryButton: null,\r\n newChatButton: null,\r\n toggleButtonSelector: null,\r\n resetSizeButtonSelector: null,\r\n dragHandleSelector: '.ai-chat-widget-header',\r\n enableDragging: true,\r\n enableResizing: true,\r\n persistLayout: true,\r\n defaultWidth: null,\r\n defaultHeight: null,\r\n minWidth: 320,\r\n minHeight: 420\r\n },\r\n messageTemplate: `\r\n
\r\n
\r\n
\r\n
{{ userLabel }}
\r\n
\r\n \r\n {{ getAssistantLabel(message) }}\r\n
\r\n
\r\n

{{ message.title }}

\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{ notification.content }}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n `,\r\n indicatorTemplate: `\r\n
\r\n \r\n Assistant\r\n
\r\n `\r\n };\r\n\r\n // Sanitize URLs to prevent javascript: protocol injection.\r\n function sanitizeUrl(url) {\r\n if (!url) return '';\r\n var trimmed = url.trim();\r\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\r\n return '';\r\n }\r\n return url;\r\n }\r\n\r\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\r\n function escapeHtmlEntities(text) {\r\n var span = document.createElement('span');\r\n span.textContent = text;\r\n return span.innerHTML;\r\n }\r\n\r\n function parsePixelValue(value) {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n var parsed = parseFloat(value);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n }\r\n\r\n function clamp(value, min, max) {\r\n return Math.min(Math.max(value, min), max);\r\n }\r\n\r\n function normalizeReference(reference) {\r\n if (!reference || typeof reference !== 'object') {\r\n return null;\r\n }\r\n\r\n const normalized = Object.assign({}, reference);\r\n normalized.index = normalized.index ?? normalized.Index ?? 0;\r\n normalized.text = normalized.text ?? normalized.Text ?? null;\r\n normalized.link = normalized.link ?? normalized.Link ?? null;\r\n\r\n return normalized;\r\n }\r\n\r\n function normalizeReferences(references) {\r\n if (!references || typeof references !== 'object') {\r\n return {};\r\n }\r\n\r\n const normalized = {};\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n normalized[key] = normalizeReference(value) ?? {};\r\n }\r\n\r\n return normalized;\r\n }\r\n\r\n const renderer = new marked.Renderer();\r\n\r\n // Modify the link rendering to open in a new tab\r\n renderer.link = function (data) {\r\n var href = sanitizeUrl(data.href);\r\n if (!href) return data.text || '';\r\n return `
${data.text}`;\r\n };\r\n\r\n // Custom code block renderer with highlight.js integration and copy button.\r\n renderer.code = function (data) {\r\n var code = data.text || '';\r\n var lang = (data.lang || '').trim();\r\n var highlighted = code;\r\n\r\n if (typeof hljs !== 'undefined') {\r\n if (lang && hljs.getLanguage(lang)) {\r\n try {\r\n highlighted = hljs.highlight(code, { language: lang }).value;\r\n } catch (_) { }\r\n } else {\r\n try {\r\n highlighted = hljs.highlightAuto(code).value;\r\n } catch (_) { }\r\n }\r\n } else {\r\n highlighted = escapeHtmlEntities(code);\r\n }\r\n\r\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\r\n return `
${langDisplay}
${highlighted}
`;\r\n };\r\n\r\n // Custom image renderer for generated images with thumbnail styling and download button.\r\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\r\n renderer.image = function (data) {\r\n const src = sanitizeUrl(data.href);\r\n if (!src) return '';\r\n const alt = data.text || defaultConfig.generatedImageAltText;\r\n const maxWidth = defaultConfig.generatedImageMaxWidth;\r\n return `
\r\n \"${alt}\"\r\n
\r\n \r\n \r\n \r\n
\r\n
`;\r\n };\r\n\r\n // Chart counter for unique IDs\r\n let chartCounter = 0;\r\n\r\n // Collector for charts discovered during marked parsing.\r\n let _pendingCharts = [];\r\n\r\n // Global chart config map: any page (e.g., Chat Interactions) that uses\r\n // the shared marked instance can call window.renderPendingCharts() after\r\n // its DOM update to render charts it didn't create itself.\r\n window.__chartConfigs = window.__chartConfigs || {};\r\n\r\n function createChartHtml(chartId) {\r\n return `
`\r\n + ``\r\n + `
`\r\n + `
`\r\n + ``\r\n + `
`;\r\n }\r\n\r\n // Register [chart:{...json...}] as a native marked block extension so the\r\n // markdown parser handles chart markers inline with surrounding text.\r\n marked.use({\r\n extensions: [{\r\n name: 'chart',\r\n level: 'block',\r\n start(src) {\r\n const idx = src.indexOf('[chart:');\r\n return idx >= 0 ? idx : undefined;\r\n },\r\n tokenizer(src) {\r\n const extracted = tryExtractChartMarker(src);\r\n if (!extracted || extracted.startIndex !== 0) {\r\n return undefined;\r\n }\r\n\r\n const chartId = `chat_chart_${++chartCounter}`;\r\n\r\n return {\r\n type: 'chart',\r\n raw: src.substring(0, extracted.endIndex),\r\n chartId: chartId,\r\n json: extracted.json,\r\n };\r\n },\r\n renderer(token) {\r\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\r\n window.__chartConfigs[token.chartId] = token.json;\r\n return createChartHtml(token.chartId);\r\n }\r\n }]\r\n });\r\n\r\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\r\n function tryExtractChartMarker(text) {\r\n const token = '[chart:';\r\n const start = text.indexOf(token);\r\n if (start < 0) {\r\n return null;\r\n }\r\n\r\n // Find JSON object boundary by balancing braces\r\n const jsonStart = start + token.length;\r\n let i = jsonStart;\r\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\r\n i++;\r\n }\r\n\r\n if (i >= text.length || text[i] !== '{') {\r\n return null;\r\n }\r\n\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n\r\n for (; i < text.length; i++) {\r\n const ch = text[i];\r\n\r\n if (inString) {\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n if (ch === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n inString = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n depth++;\r\n } else if (ch === '}') {\r\n depth--;\r\n if (depth === 0) {\r\n const jsonEnd = i;\r\n // Expect closing bracket after JSON\r\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\r\n if (closeBracketIndex < 0) {\r\n return null;\r\n }\r\n\r\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\r\n return {\r\n startIndex: start,\r\n endIndex: closeBracketIndex + 1,\r\n json: json\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function renderChartsInMessage(message) {\r\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\r\n return;\r\n }\r\n\r\n // Copy and clear pending charts immediately to prevent duplicate renders.\r\n const charts = [...message._pendingCharts];\r\n message._pendingCharts = [];\r\n\r\n // Defer to requestAnimationFrame so the browser has fully laid out the\r\n // canvas elements before Chart.js reads their dimensions.\r\n requestAnimationFrame(() => {\r\n for (const c of charts) {\r\n renderChartOnCanvas(c.chartId, c.config);\r\n }\r\n });\r\n }\r\n\r\n function renderChartOnCanvas(chartId, config) {\r\n const canvas = document.getElementById(chartId);\r\n if (!canvas) {\r\n return false;\r\n }\r\n\r\n if (typeof Chart === 'undefined') {\r\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\r\n return false;\r\n }\r\n\r\n // When the canvas is inside a hidden container (e.g., a widget panel with\r\n // display:none), it has zero dimensions and Chart.js cannot render correctly.\r\n // Keep the config in __chartConfigs so renderPendingCharts() can retry later\r\n // once the container becomes visible.\r\n if (canvas.offsetParent === null) {\r\n window.__chartConfigs[chartId] = config;\r\n return false;\r\n }\r\n\r\n try {\r\n if (canvas._chartInstance) {\r\n canvas._chartInstance.destroy();\r\n }\r\n\r\n const cfg = typeof config === 'string' ? JSON.parse(config) : config;\r\n cfg.options ??= {};\r\n cfg.options.responsive = true;\r\n cfg.options.maintainAspectRatio = true;\r\n cfg.options.aspectRatio ??= 4 / 3;\r\n\r\n canvas._chartInstance = new Chart(canvas, cfg);\r\n delete window.__chartConfigs[chartId];\r\n return true;\r\n } catch (e) {\r\n console.error('Error creating chart:', e);\r\n return false;\r\n }\r\n }\r\n\r\n // Global function: renders any chart canvases whose configs are in the\r\n // global __chartConfigs map. Called by pages (e.g., Chat Interactions)\r\n // that share the marked instance but have their own rendering pipeline.\r\n window.renderPendingCharts = function () {\r\n if (typeof Chart === 'undefined') {\r\n return;\r\n }\r\n\r\n const configs = window.__chartConfigs;\r\n if (!configs) {\r\n return;\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n for (const chartId of Object.keys(configs)) {\r\n renderChartOnCanvas(chartId, configs[chartId]);\r\n }\r\n });\r\n };\r\n\r\n // Parse markdown content via marked (which natively handles [chart:...] markers\r\n // through the registered extension) and collect pending chart configs for later\r\n // Chart.js rendering.\r\n function parseMarkdownContent(content, message) {\r\n _pendingCharts = [];\r\n const html = marked.parse(content, { renderer });\r\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\r\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\r\n }\r\n\r\n const initialize = (instanceConfig) => {\r\n\r\n const config = Object.assign({}, defaultConfig, instanceConfig);\r\n config.widget = Object.assign({}, defaultConfig.widget || {}, instanceConfig && instanceConfig.widget ? instanceConfig.widget : {});\r\n const hasWidgetConfig = !!(instanceConfig && instanceConfig.widget && instanceConfig.widget.chatWidgetContainer && instanceConfig.widget.chatWidgetStateName);\r\n // Keep defaultConfig in sync so renderers use overridden values\r\n defaultConfig = config;\r\n\r\n if (!config.signalRHubUrl) {\r\n console.error('The signalRHubUrl is required.');\r\n return;\r\n }\r\n\r\n if (!config.appElementSelector) {\r\n console.error('The appElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.chatContainerElementSelector) {\r\n console.error('The chatContainerElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.inputElementSelector) {\r\n console.error('The inputElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.sendButtonElementSelector) {\r\n console.error('The sendButtonElementSelector is required.');\r\n return;\r\n }\r\n\r\n const app = Vue.createApp({\r\n data() {\r\n return {\r\n inputElement: null,\r\n buttonElement: null,\r\n chatContainer: null,\r\n placeholder: null,\r\n isSessionStarted: false,\r\n isPlaceholderVisible: true,\r\n chatWidgetStateName: null,\r\n chatWidgetStateSession: null,\r\n chatWidgetLayoutKey: null,\r\n chatHistorySection: null,\r\n widgetContainerElement: null,\r\n widgetToggleButtonElement: null,\r\n widgetResetSizeButtonElement: null,\r\n widgetResizeObserver: null,\r\n widgetViewportResizeHandler: null,\r\n widgetDefaultWidth: null,\r\n widgetDefaultHeight: null,\r\n widgetIsInitialized: false,\r\n isStreaming: false,\r\n isNavigatingAway: false,\r\n autoScroll: true,\r\n stream: null,\r\n messages: [],\r\n notifications: [],\r\n prompt: '',\r\n documents: config.existingDocuments || [],\r\n isUploading: false,\r\n uploadErrors: [],\r\n isDragOver: false,\r\n documentBar: null,\r\n metricsEnabled: !!config.metricsEnabled,\r\n userLabel: config.userLabel,\r\n assistantLabel: config.assistantLabel,\r\n thumbsUpTitle: config.thumbsUpTitle,\r\n thumbsDownTitle: config.thumbsDownTitle,\r\n copyTitle: config.copyTitle,\r\n isRecording: false,\r\n mediaRecorder: null,\r\n preRecordingPrompt: '',\r\n micButton: null,\r\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\r\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\r\n ttsVoiceName: config.ttsVoiceName || null,\r\n audioChunks: [],\r\n audioPlayQueue: [],\r\n isPlayingAudio: false,\r\n currentAudioElement: null,\r\n currentAudioUrl: null,\r\n ttsButton: null,\r\n ttsPlayingMessageIndex: -1,\r\n ttsAudioCache: {},\r\n ttsInstanceId: 'ai-chat-' + Math.random().toString(36).slice(2),\r\n singleResponseMode: !!config.singleResponseMode,\r\n conversationModeEnabled: config.chatMode === 'Conversation',\r\n conversationButton: null,\r\n isConversationMode: false,\r\n notificationDismissTimers: {},\r\n };\r\n },\r\n computed: {\r\n lastAssistantIndex() {\r\n for (var i = this.messages.length - 1; i >= 0; i--) {\r\n if (this.messages[i].role === 'assistant') {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n },\r\n methods: {\r\n handleBeforeUnload() {\r\n this.isNavigatingAway = true;\r\n },\r\n getStoredWidgetLayout() {\r\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\r\n return {};\r\n }\r\n\r\n try {\r\n var storedLayout = localStorage.getItem(this.chatWidgetLayoutKey);\r\n return storedLayout ? JSON.parse(storedLayout) || {} : {};\r\n } catch (error) {\r\n console.warn('Failed to read widget layout state.', error);\r\n return {};\r\n }\r\n },\r\n saveStoredWidgetLayout(partialLayout) {\r\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var currentLayout = this.getStoredWidgetLayout();\r\n var nextLayout = Object.assign({}, currentLayout);\r\n\r\n if (partialLayout.panel !== undefined) {\r\n nextLayout.panel = Object.assign({}, currentLayout.panel || {}, partialLayout.panel || {});\r\n }\r\n\r\n if (partialLayout.toggle !== undefined) {\r\n nextLayout.toggle = Object.assign({}, currentLayout.toggle || {}, partialLayout.toggle || {});\r\n }\r\n\r\n localStorage.setItem(this.chatWidgetLayoutKey, JSON.stringify(nextLayout));\r\n },\r\n getElementSize(element, fallbackWidth, fallbackHeight) {\r\n if (!element) {\r\n return {\r\n width: fallbackWidth || 0,\r\n height: fallbackHeight || 0\r\n };\r\n }\r\n\r\n var rect = element.getBoundingClientRect();\r\n var computed = window.getComputedStyle(element);\r\n\r\n return {\r\n width: Math.round(rect.width || parsePixelValue(computed.width) || fallbackWidth || 0),\r\n height: Math.round(rect.height || parsePixelValue(computed.height) || fallbackHeight || 0)\r\n };\r\n },\r\n clampWidgetPosition(left, top, width, height) {\r\n var viewportPadding = 8;\r\n var maxLeft = Math.max(viewportPadding, window.innerWidth - width - viewportPadding);\r\n var maxTop = Math.max(viewportPadding, window.innerHeight - height - viewportPadding);\r\n\r\n return {\r\n left: Math.round(clamp(left, viewportPadding, maxLeft)),\r\n top: Math.round(clamp(top, viewportPadding, maxTop))\r\n };\r\n },\r\n applyAbsolutePosition(element, left, top) {\r\n if (!element) {\r\n return;\r\n }\r\n\r\n element.style.left = left + 'px';\r\n element.style.top = top + 'px';\r\n element.style.right = 'auto';\r\n element.style.bottom = 'auto';\r\n },\r\n getWidgetDefaultSize() {\r\n return {\r\n width: this.widgetDefaultWidth || parsePixelValue(config.widget.defaultWidth) || 380,\r\n height: this.widgetDefaultHeight || parsePixelValue(config.widget.defaultHeight) || 520\r\n };\r\n },\r\n persistWidgetPanelPosition() {\r\n if (!this.widgetContainerElement || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\r\n this.saveStoredWidgetLayout({\r\n panel: {\r\n left: Math.round(panelRect.left),\r\n top: Math.round(panelRect.top)\r\n }\r\n });\r\n },\r\n persistWidgetTogglePosition() {\r\n if (!this.widgetToggleButtonElement || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\r\n this.saveStoredWidgetLayout({\r\n toggle: {\r\n left: Math.round(toggleRect.left),\r\n top: Math.round(toggleRect.top)\r\n }\r\n });\r\n },\r\n persistWidgetPanelSize() {\r\n if (!this.widgetContainerElement || !config.widget.enableResizing || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\r\n\r\n this.saveStoredWidgetLayout({\r\n panel: {\r\n width: Math.abs(currentSize.width - defaultSize.width) <= 1 ? null : currentSize.width,\r\n height: Math.abs(currentSize.height - defaultSize.height) <= 1 ? null : currentSize.height\r\n }\r\n });\r\n },\r\n updateWidgetResetSizeButtonVisibility() {\r\n if (!this.widgetResetSizeButtonElement) {\r\n return;\r\n }\r\n\r\n if (!config.widget.enableResizing || !this.widgetContainerElement) {\r\n this.widgetResetSizeButtonElement.classList.add('d-none');\r\n return;\r\n }\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\r\n var isResized =\r\n Math.abs(currentSize.width - defaultSize.width) > 1 ||\r\n Math.abs(currentSize.height - defaultSize.height) > 1 ||\r\n !!this.widgetContainerElement.style.width ||\r\n !!this.widgetContainerElement.style.height;\r\n\r\n this.widgetResetSizeButtonElement.classList.toggle('d-none', !isResized);\r\n },\r\n resetWidgetSize() {\r\n if (!this.widgetContainerElement || !config.widget.enableResizing) {\r\n return;\r\n }\r\n\r\n this.widgetContainerElement.style.removeProperty('width');\r\n this.widgetContainerElement.style.removeProperty('height');\r\n this.persistWidgetPanelSize();\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n },\r\n restoreWidgetLayout() {\r\n var storedLayout = this.getStoredWidgetLayout();\r\n\r\n if (this.widgetContainerElement && config.widget.enableResizing) {\r\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.width)) {\r\n this.widgetContainerElement.style.width = storedLayout.panel.width + 'px';\r\n } else {\r\n this.widgetContainerElement.style.removeProperty('width');\r\n }\r\n\r\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.height)) {\r\n this.widgetContainerElement.style.height = storedLayout.panel.height + 'px';\r\n } else {\r\n this.widgetContainerElement.style.removeProperty('height');\r\n }\r\n }\r\n\r\n if (this.widgetContainerElement && config.widget.enableDragging &&\r\n Number.isFinite(storedLayout.panel && storedLayout.panel.left) &&\r\n Number.isFinite(storedLayout.panel && storedLayout.panel.top)) {\r\n this.applyAbsolutePosition(this.widgetContainerElement, storedLayout.panel.left, storedLayout.panel.top);\r\n }\r\n\r\n if (this.widgetToggleButtonElement && config.widget.enableDragging &&\r\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.left) &&\r\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.top)) {\r\n this.applyAbsolutePosition(this.widgetToggleButtonElement, storedLayout.toggle.left, storedLayout.toggle.top);\r\n }\r\n\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n },\r\n attachDraggableWidgetElement(element, handle, layoutKey, suppressClickOnDrag) {\r\n if (!element || !handle || !config.widget.enableDragging) {\r\n return;\r\n }\r\n\r\n var activePointerId = null;\r\n var startX = 0;\r\n var startY = 0;\r\n var startLeft = 0;\r\n var startTop = 0;\r\n var dragged = false;\r\n var dragThreshold = 4;\r\n var interactiveSelector = 'button, a, input, textarea, select, option, label';\r\n\r\n var stopDragging = (event) => {\r\n if (activePointerId === null) {\r\n return;\r\n }\r\n\r\n if (event && event.pointerId !== undefined && event.pointerId !== activePointerId) {\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointermove', onPointerMove);\r\n document.removeEventListener('pointerup', stopDragging);\r\n document.removeEventListener('pointercancel', stopDragging);\r\n element.classList.remove('ai-chat-widget-dragging');\r\n activePointerId = null;\r\n\r\n if (!dragged) {\r\n return;\r\n }\r\n\r\n if (layoutKey === 'panel') {\r\n this.persistWidgetPanelPosition();\r\n } else if (layoutKey === 'toggle') {\r\n this.persistWidgetTogglePosition();\r\n }\r\n\r\n if (suppressClickOnDrag) {\r\n element.dataset.dragSuppressClick = 'true';\r\n window.setTimeout(() => {\r\n if (element.dataset.dragSuppressClick === 'true') {\r\n element.dataset.dragSuppressClick = 'false';\r\n }\r\n }, 0);\r\n }\r\n };\r\n\r\n var onPointerMove = (event) => {\r\n if (activePointerId === null || event.pointerId !== activePointerId) {\r\n return;\r\n }\r\n\r\n var deltaX = event.clientX - startX;\r\n var deltaY = event.clientY - startY;\r\n\r\n if (!dragged && Math.hypot(deltaX, deltaY) < dragThreshold) {\r\n return;\r\n }\r\n\r\n dragged = true;\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(\r\n element,\r\n layoutKey === 'panel' ? defaultSize.width : 52,\r\n layoutKey === 'panel' ? defaultSize.height : 52);\r\n var nextPosition = this.clampWidgetPosition(\r\n startLeft + deltaX,\r\n startTop + deltaY,\r\n currentSize.width,\r\n currentSize.height);\r\n\r\n this.applyAbsolutePosition(element, nextPosition.left, nextPosition.top);\r\n };\r\n\r\n handle.addEventListener('pointerdown', (event) => {\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n\r\n if (layoutKey === 'panel' && event.target.closest(interactiveSelector)) {\r\n return;\r\n }\r\n\r\n var rect = element.getBoundingClientRect();\r\n startX = event.clientX;\r\n startY = event.clientY;\r\n startLeft = rect.left;\r\n startTop = rect.top;\r\n dragged = false;\r\n activePointerId = event.pointerId;\r\n element.classList.add('ai-chat-widget-dragging');\r\n\r\n if (handle.setPointerCapture) {\r\n handle.setPointerCapture(event.pointerId);\r\n }\r\n\r\n document.addEventListener('pointermove', onPointerMove);\r\n document.addEventListener('pointerup', stopDragging);\r\n document.addEventListener('pointercancel', stopDragging);\r\n event.preventDefault();\r\n });\r\n },\r\n constrainWidgetElementsToViewport() {\r\n if (this.widgetContainerElement && this.widgetContainerElement.style.left) {\r\n var panelDefaultSize = this.getWidgetDefaultSize();\r\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\r\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\r\n var clampedPanel = this.clampWidgetPosition(panelRect.left, panelRect.top, panelSize.width, panelSize.height);\r\n\r\n this.applyAbsolutePosition(this.widgetContainerElement, clampedPanel.left, clampedPanel.top);\r\n\r\n if (config.widget.persistLayout) {\r\n this.persistWidgetPanelPosition();\r\n }\r\n }\r\n\r\n if (this.widgetToggleButtonElement && this.widgetToggleButtonElement.style.left) {\r\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\r\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\r\n var clampedToggle = this.clampWidgetPosition(toggleRect.left, toggleRect.top, toggleSize.width, toggleSize.height);\r\n\r\n this.applyAbsolutePosition(this.widgetToggleButtonElement, clampedToggle.left, clampedToggle.top);\r\n\r\n if (config.widget.persistLayout) {\r\n this.persistWidgetTogglePosition();\r\n }\r\n }\r\n },\r\n handleDragOver(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = true;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.add('ai-chat-drag-over');\r\n },\r\n handleDragLeave(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = false;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\r\n },\r\n handleDrop(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = false;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\r\n if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\r\n this.uploadFiles(e.dataTransfer.files);\r\n }\r\n },\r\n triggerFileInput() {\r\n if (!config.sessionDocumentsEnabled) return;\r\n var fileInput = document.getElementById('ai-chat-doc-input');\r\n if (fileInput) fileInput.click();\r\n },\r\n handleFileInputChange(e) {\r\n var files = e.target.files;\r\n if (files && files.length > 0) {\r\n this.uploadFiles(files);\r\n }\r\n e.target.value = '';\r\n },\r\n async uploadFiles(files) {\r\n if (!config.uploadDocumentUrl) return;\r\n\r\n var sessionId = this.getSessionId();\r\n var profileId = this.getProfileId();\r\n\r\n if (!sessionId && !profileId) {\r\n console.warn('Cannot upload documents without a session or profile.');\r\n return;\r\n }\r\n\r\n this.isUploading = true;\r\n this.uploadErrors = [];\r\n this.renderDocumentBar();\r\n try {\r\n var formData = new FormData();\r\n if (sessionId) {\r\n formData.append('sessionId', sessionId);\r\n } else {\r\n formData.append('profileId', profileId);\r\n }\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n\r\n var response = await fetch(config.uploadDocumentUrl, {\r\n method: 'POST',\r\n body: formData\r\n });\r\n\r\n if (!response.ok) {\r\n var errorText = await response.text();\r\n var uploadError = this.extractReadableErrorMessage(errorText, 'Upload failed. Please try again.');\r\n console.error('Upload failed:', errorText);\r\n this.uploadErrors = [{ fileName: '', error: uploadError }];\r\n return;\r\n }\r\n\r\n var result = await response.json();\r\n\r\n // If the server created a new session, initialize it.\r\n if (result.sessionId && !sessionId) {\r\n this.initializeSession(result.sessionId);\r\n }\r\n\r\n if (result.uploaded && result.uploaded.length > 0) {\r\n for (var j = 0; j < result.uploaded.length; j++) {\r\n this.documents.push(result.uploaded[j]);\r\n }\r\n }\r\n if (result.failed && result.failed.length > 0) {\r\n this.uploadErrors = result.failed;\r\n }\r\n } catch (err) {\r\n console.error('Upload error:', err);\r\n this.uploadErrors = [{ fileName: '', error: 'Upload failed. Please try again.' }];\r\n } finally {\r\n this.isUploading = false;\r\n this.renderDocumentBar();\r\n }\r\n },\r\n async removeDocument(doc) {\r\n if (!config.removeDocumentUrl) return;\r\n\r\n try {\r\n var sessionId = this.getSessionId();\r\n var response = await fetch(config.removeDocumentUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ itemId: sessionId, documentId: doc.documentId })\r\n });\r\n\r\n if (response.ok) {\r\n var idx = this.documents.indexOf(doc);\r\n if (idx > -1) this.documents.splice(idx, 1);\r\n } else {\r\n var errorText = await response.text();\r\n var removeError = this.extractReadableErrorMessage(errorText, 'Failed to remove document. Please try again.');\r\n console.error('Failed to remove document:', response.status, errorText);\r\n this.uploadErrors = [{ fileName: doc.fileName || '', error: removeError }];\r\n this.renderDocumentBar();\r\n }\r\n } catch (err) {\r\n console.error('Remove document error:', err);\r\n this.uploadErrors = [{ fileName: doc.fileName || '', error: 'Failed to remove document. Please try again.' }];\r\n this.renderDocumentBar();\r\n }\r\n },\r\n formatFileSize(bytes) {\r\n if (bytes < 1024) return bytes + ' B';\r\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\r\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\r\n },\r\n renderDocumentBar() {\r\n if (!this.documentBar) return;\r\n\r\n if (!config.sessionDocumentsEnabled) {\r\n this.documentBar.classList.add('d-none');\r\n return;\r\n }\r\n\r\n this.documentBar.classList.remove('d-none');\r\n\r\n var html = '
';\r\n html += '
';\r\n\r\n for (var i = 0; i < this.documents.length; i++) {\r\n var doc = this.documents[i];\r\n var name = doc.fileName || 'Document';\r\n if (name.length > 20) name = name.substring(0, 17) + '...';\r\n html += '';\r\n html += ' ';\r\n html += this.escapeHtml(name);\r\n html += ' ';\r\n html += '';\r\n }\r\n\r\n for (var m = 0; m < this.uploadErrors.length; m++) {\r\n var failedItem = this.uploadErrors[m];\r\n var failedName = failedItem.fileName || 'File';\r\n var errorMsg = failedItem.error || 'Upload failed';\r\n if (failedName.length > 15) failedName = failedName.substring(0, 12) + '...';\r\n html += '';\r\n html += ' ';\r\n html += this.escapeHtml(failedName);\r\n html += ' ';\r\n html += '';\r\n }\r\n\r\n if (this.isUploading) {\r\n html += '';\r\n html += ' Uploading...';\r\n html += '';\r\n }\r\n\r\n html += '';\r\n html += '
';\r\n if (config.supportedExtensionsText) {\r\n html += '
Supported formats: ' + this.escapeHtml(config.supportedExtensionsText) + '
';\r\n }\r\n\r\n html += '
';\r\n\r\n this.documentBar.replaceChildren(DOMPurify.sanitize(html, { RETURN_DOM_FRAGMENT: true }));\r\n\r\n // Bind remove handlers\r\n var self = this;\r\n var closeButtons = this.documentBar.querySelectorAll('[data-doc-index]');\r\n for (var j = 0; j < closeButtons.length; j++) {\r\n closeButtons[j].addEventListener('click', (function (idx) {\r\n return function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n var docToRemove = self.documents[idx];\r\n if (docToRemove) self.removeDocument(docToRemove);\r\n };\r\n })(parseInt(closeButtons[j].getAttribute('data-doc-index'))));\r\n }\r\n\r\n // Bind error dismiss handlers\r\n var errorCloseButtons = this.documentBar.querySelectorAll('[data-error-index]');\r\n for (var n = 0; n < errorCloseButtons.length; n++) {\r\n errorCloseButtons[n].addEventListener('click', (function (idx) {\r\n return function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n self.uploadErrors.splice(idx, 1);\r\n self.renderDocumentBar();\r\n };\r\n })(parseInt(errorCloseButtons[n].getAttribute('data-error-index'))));\r\n }\r\n\r\n // Bind add button\r\n var addBtn = this.documentBar.querySelector('.ai-chat-doc-add-btn');\r\n if (addBtn) {\r\n addBtn.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n self.triggerFileInput();\r\n });\r\n }\r\n },\r\n escapeHtml(text) {\r\n var div = document.createElement('div');\r\n div.textContent = text;\r\n return div.innerHTML;\r\n },\r\n extractReadableErrorMessage(errorText, fallbackMessage) {\r\n if (!errorText || typeof errorText !== 'string') {\r\n return fallbackMessage;\r\n }\r\n\r\n var trimmed = errorText.trim();\r\n if (!trimmed) {\r\n return fallbackMessage;\r\n }\r\n\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n try {\r\n var parsed = JSON.parse(trimmed);\r\n var message = parsed?.error || parsed?.message || parsed?.title || parsed?.detail;\r\n return typeof message === 'string' && message.trim()\r\n ? message.trim()\r\n : fallbackMessage;\r\n } catch (err) {\r\n return fallbackMessage;\r\n }\r\n }\r\n\r\n if (/<[^>]+>/.test(trimmed)) {\r\n return fallbackMessage;\r\n }\r\n\r\n return trimmed;\r\n },\r\n normalizeAssistantAppearance(appearance) {\r\n if (!appearance) {\r\n return null;\r\n }\r\n\r\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\r\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\r\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\r\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\r\n\r\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\r\n return null;\r\n }\r\n\r\n return {\r\n label: label,\r\n icon: icon,\r\n cssClass: cssClass,\r\n disableStreamingAnimation: disableStreamingAnimation,\r\n };\r\n },\r\n getAssistantLabel(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.label ? appearance.label : this.assistantLabel;\r\n },\r\n getAssistantRoleClasses(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n var classes = ['ai-chat-msg-role'];\r\n\r\n if (appearance && appearance.cssClass) {\r\n classes.push(appearance.cssClass);\r\n } else {\r\n classes.push('ai-chat-msg-role-assistant');\r\n }\r\n\r\n return classes;\r\n },\r\n getAssistantIconClasses(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\r\n },\r\n getAssistantIcon(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\r\n },\r\n shouldAnimateAssistantIcon(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return !!message &&\r\n message.isStreaming &&\r\n index === this.lastAssistantIndex &&\r\n !(appearance && appearance.disableStreamingAnimation);\r\n },\r\n async startConnection() {\r\n this.connection = new signalR.HubConnectionBuilder()\r\n .withUrl(config.signalRHubUrl)\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n // Allow long-running operations (e.g., multi-step MCP tool calls)\r\n // without the client disconnecting prematurely.\r\n this.connection.serverTimeoutInMilliseconds = 600000;\r\n this.connection.keepAliveIntervalInMilliseconds = 15000;\r\n\r\n this.connection.on(\"LoadSession\", (data) => {\r\n this.initializeSession(data.sessionId, true);\r\n this.messages = [];\r\n this.documents = data.documents || [];\r\n\r\n (data.messages ?? []).forEach(msg => {\r\n this.addMessage(msg);\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n });\r\n });\r\n\r\n // Update feedback icons in the DOM after all messages have rendered.\r\n this.$nextTick(() => {\r\n this.refreshAllFeedbackIcons();\r\n });\r\n\r\n // When the session is new (no messages) and an initial prompt is configured,\r\n // automatically send it as the first user message to trigger an AI response.\r\n if (this.messages.length === 0 && config.initialPrompt) {\r\n this.prompt = config.initialPrompt;\r\n this.sendMessage();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveError\", (error) => {\r\n console.error(\"SignalR Error: \", error);\r\n\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // If this is a widget with a stale cached session (e.g., profile was deleted),\r\n // clear the cached session and start fresh with the current profile.\r\n if (this.widgetIsInitialized && !this.isSessionStarted && !this._attemptedSessionRecovery) {\r\n this._attemptedSessionRecovery = true;\r\n localStorage.removeItem(this.chatWidgetStateSession);\r\n this.startNewSession();\r\n }\r\n });\r\n\r\n this.connection.on(\"MessageRated\", (messageId, userRating) => {\r\n var msg = this.messages.find(m => m.id === messageId);\r\n if (msg) {\r\n msg.userRating = userRating;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveTranscript\", (sessionId, text, isFinal) => {\r\n if (this.isConversationMode) {\r\n if (!isFinal && text) {\r\n this._conversationPartialTranscript = text;\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n var html = '

' + escaped + '

';\r\n\r\n // Show partial transcript as a live user message.\r\n if (!this._conversationPartialMessage) {\r\n this.hidePlaceholder();\r\n this._conversationPartialMessage = {\r\n role: 'user',\r\n content: text,\r\n htmlContent: html,\r\n isPartial: true\r\n };\r\n this.messages.push(this._conversationPartialMessage);\r\n } else {\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = html;\r\n }\r\n this.scrollToBottom();\r\n }\r\n return;\r\n }\r\n\r\n if (text && !this._audioInputSent) {\r\n this.prompt = this.preRecordingPrompt + text;\r\n if (this.inputElement) {\r\n this.inputElement.value = this.prompt;\r\n this.inputElement.dispatchEvent(new Event('input'));\r\n }\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationUserMessage\", (sessionId, text) => {\r\n if (text) {\r\n this.stopAudio();\r\n\r\n // If there's an interrupted assistant message still streaming,\r\n // mark it as done to stop the spinner animation.\r\n if (this._conversationAssistantMessage) {\r\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\r\n if (oldMsg) {\r\n oldMsg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Replace the partial transcript message with the final one.\r\n if (this._conversationPartialMessage) {\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\r\n this._conversationPartialMessage.isPartial = false;\r\n this._conversationPartialMessage = null;\r\n } else {\r\n this.addMessage({\r\n role: 'user',\r\n content: text\r\n });\r\n }\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantToken\", (sessionId, messageId, token, responseId, appearance) => {\r\n if (!this._conversationAssistantMessage) {\r\n this.stopAudio();\r\n this.hideTypingIndicator();\r\n\r\n // Ensure no stale streaming indicators remain from prior messages.\r\n for (var j = 0; j < this.messages.length; j++) {\r\n if (this.messages[j].isStreaming) {\r\n this.messages[j].isStreaming = false;\r\n }\r\n }\r\n\r\n var msgIndex = this.messages.length;\r\n var newMessage = {\r\n id: messageId,\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n userRating: null,\r\n appearance: this.normalizeAssistantAppearance(appearance),\r\n };\r\n this.messages.push(newMessage);\r\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\r\n }\r\n\r\n this._conversationAssistantMessage.content += token;\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n if (!msg.appearance) {\r\n msg.appearance = this.normalizeAssistantAppearance(appearance);\r\n }\r\n msg.content = this._conversationAssistantMessage.content;\r\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n this.scrollToBottom();\r\n });\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantComplete\", (sessionId, messageId) => {\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioChunk\", (sessionId, base64Audio, contentType) => {\r\n if (base64Audio) {\r\n const binaryString = atob(base64Audio);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n this.audioChunks.push(bytes);\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioComplete\", (sessionId) => {\r\n this.playCollectedAudio();\r\n });\r\n\r\n this.connection.on(\"ReceiveNotification\", (notification) => {\r\n this.receiveNotification(notification);\r\n });\r\n\r\n this.connection.on(\"UpdateNotification\", (notification) => {\r\n this.updateNotification(notification);\r\n });\r\n\r\n this.connection.on(\"RemoveNotification\", (notificationType) => {\r\n this.removeNotification(notificationType);\r\n });\r\n\r\n this.connection.onreconnecting(() => {\r\n console.warn(\"SignalR: reconnecting...\");\r\n });\r\n\r\n this.connection.onreconnected(() => {\r\n console.info(\"SignalR: reconnected.\");\r\n\r\n if (this.isSessionStarted) {\r\n this.reloadCurrentSession();\r\n } else if (config.autoCreateSession) {\r\n this.startNewSession();\r\n }\r\n });\r\n\r\n this.connection.onclose((error) => {\r\n if (this.isNavigatingAway) {\r\n return;\r\n }\r\n\r\n if (error) {\r\n console.warn(\"SignalR connection closed with error:\", error.message || error);\r\n }\r\n });\r\n\r\n try {\r\n await this.connection.start();\r\n } catch (err) {\r\n console.error(\"SignalR Connection Error: \", err);\r\n }\r\n },\r\n addMessageInternal(message) {\r\n if (message.role === 'assistant') {\r\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\r\n }\r\n\r\n if (message.content && !message.htmlContent) {\r\n message.htmlContent = parseMarkdownContent(message.content, message);\r\n }\r\n this.fireEvent(new CustomEvent(\"addingOpenAIPromotMessage\", { detail: { message: message } }));\r\n this.messages.push(message);\r\n\r\n this.$nextTick(() => {\r\n this.fireEvent(new CustomEvent(\"addedOpenAIPromotMessage\", { detail: { message: message } }));\r\n });\r\n },\r\n addMessage(message) {\r\n\r\n // Ensure userRating is always defined for Vue reactivity.\r\n if (message.userRating === undefined) {\r\n message.userRating = null;\r\n }\r\n\r\n if (message.content) {\r\n let processedContent = message.content.trim();\r\n message.references = normalizeReferences(message.references);\r\n\r\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\r\n\r\n // Only include references that were actually cited in the response.\r\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\r\n\r\n if (citedRefs.length) {\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders.\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processedContent = processedContent.replaceAll(key, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\r\n processedContent = processedContent.replaceAll('
', ',');\r\n\r\n processedContent += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || key;\r\n processedContent += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n }\r\n }\r\n\r\n message.content = processedContent;\r\n message.htmlContent = parseMarkdownContent(processedContent, message);\r\n }\r\n\r\n this.addMessageInternal(message);\r\n this.hidePlaceholder();\r\n\r\n this.$nextTick(() => {\r\n // Render any pending charts once the DOM is updated\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n addMessages(messages) {\r\n\r\n for (let i = 0; i < messages.length; i++) {\r\n this.addMessageInternal(messages[i]);\r\n }\r\n\r\n this.hidePlaceholder();\r\n this.$nextTick(() => {\r\n this.scrollToBottom();\r\n });\r\n },\r\n hidePlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.add('d-none');\r\n }\r\n this.isPlaceholderVisible = false;\r\n },\r\n showPlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.remove('d-none');\r\n }\r\n this.isPlaceholderVisible = true;\r\n },\r\n isOrchestratorAvailable() {\r\n return config.isOrchestratorAvailable !== false;\r\n },\r\n applyOrchestratorAvailability() {\r\n if (this.isOrchestratorAvailable()) {\r\n return true;\r\n }\r\n\r\n const unavailableMessage = config.orchestratorUnavailableMessage || \"This orchestrator is not currently available.\";\r\n\r\n if (this.inputElement) {\r\n this.inputElement.disabled = true;\r\n this.inputElement.value = '';\r\n this.inputElement.placeholder = unavailableMessage;\r\n }\r\n\r\n if (this.buttonElement) {\r\n this.buttonElement.disabled = true;\r\n }\r\n\r\n if (this.micButtonElement) {\r\n this.micButtonElement.disabled = true;\r\n this.micButtonElement.style.display = 'none';\r\n }\r\n\r\n if (this.conversationButtonElement) {\r\n this.conversationButtonElement.disabled = true;\r\n this.conversationButtonElement.style.display = 'none';\r\n }\r\n\r\n return false;\r\n },\r\n fireEvent(event) {\r\n document.dispatchEvent(event);\r\n },\r\n isIndicator(message) {\r\n return message.role === 'indicator';\r\n },\r\n sendMessage() {\r\n if (!this.applyOrchestratorAvailability()) {\r\n return;\r\n }\r\n\r\n let trimmedPrompt = this.prompt.trim();\r\n\r\n if (!trimmedPrompt) {\r\n return;\r\n }\r\n\r\n // Stop any active recording before sending.\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\r\n this._audioInputSent = true;\r\n\r\n // In single-response mode, clear all previous messages.\r\n if (this.singleResponseMode) {\r\n this.messages.splice(0, this.messages.length);\r\n }\r\n\r\n this.addMessage({\r\n role: 'user',\r\n content: trimmedPrompt\r\n });\r\n\r\n this.streamMessage(this.getProfileId(), trimmedPrompt, null);\r\n this.inputElement.value = '';\r\n this.prompt = '';\r\n },\r\n startRecording() {\r\n if (this.isRecording || !this.connection) {\r\n return;\r\n }\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this.preRecordingPrompt = this.prompt;\r\n this._audioInputSent = false;\r\n\r\n var subject = new signalR.Subject();\r\n var profileId = this.getProfileId();\r\n var sessionId = this.getSessionId() || '';\r\n var pendingChunk = Promise.resolve();\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n subject.next(base64);\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => subject.complete());\r\n });\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"SendAudioStream\", profileId, sessionId, subject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n this.updateMicButton();\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n });\r\n },\r\n stopRecording() {\r\n if (!this.isRecording || !this.mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n this.updateMicButton();\r\n },\r\n toggleRecording() {\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n } else {\r\n this.startRecording();\r\n }\r\n },\r\n updateMicButton() {\r\n if (!this.micButton) {\r\n return;\r\n }\r\n\r\n if (this.isRecording) {\r\n this.micButton.classList.add('stt-recording');\r\n this.micButton.innerHTML = '';\r\n } else {\r\n this.micButton.classList.remove('stt-recording');\r\n this.micButton.innerHTML = '';\r\n }\r\n },\r\n streamMessage(profileId, trimmedPrompt, sessionProfileId) {\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n\r\n this.streamingStarted();\r\n this.showTypingIndicator();\r\n this.autoScroll = true;\r\n\r\n var content = '';\r\n var references = {};\r\n var lastResponseId = null;\r\n\r\n // Get the index after showing typing indicator.\r\n var messageIndex = this.messages.length;\r\n var currentSessionId = this.getSessionId();\r\n\r\n this.stream = this.connection.stream(\"SendMessage\", profileId, trimmedPrompt, currentSessionId, sessionProfileId)\r\n .subscribe({\r\n next: (chunk) => {\r\n let message = this.messages[messageIndex];\r\n\r\n if (!message) {\r\n\r\n if (chunk.sessionId && !currentSessionId) {\r\n this.initializeSession(chunk.sessionId);\r\n }\r\n\r\n this.hideTypingIndicator();\r\n // Re-assign the index after hiding the typing indicator.\r\n messageIndex = this.messages.length;\r\n let newMessage = {\r\n id: chunk.messageId,\r\n role: \"assistant\",\r\n title: chunk.title,\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n userRating: null,\r\n };\r\n\r\n this.messages.push(newMessage);\r\n\r\n message = newMessage;\r\n }\r\n\r\n if (chunk.title && (!message.title || message.title !== chunk.title)) {\r\n message.title = chunk.title;\r\n }\r\n\r\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\r\n\r\n for (const [key, value] of Object.entries(chunk.references)) {\r\n references[key] = normalizeReference(value) ?? {};\r\n }\r\n }\r\n\r\n if (chunk.content) {\r\n\r\n // When the responseId changes (e.g., after an internal tool call),\r\n // insert a line break to visually separate response segments.\r\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\r\n content += '\\n\\n';\r\n }\r\n\r\n if (chunk.responseId) {\r\n lastResponseId = chunk.responseId;\r\n }\r\n\r\n let processedContent = chunk.content;\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n processedContent = processedContent.replaceAll(key, `${value.index}`);\r\n }\r\n\r\n // Append processed content to the message.\r\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\r\n content += processedContent.replaceAll('
', ',');\r\n }\r\n\r\n // Update the existing message\r\n message.content = content;\r\n\r\n message.htmlContent = parseMarkdownContent(content, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n complete: () => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n if (!msg || !msg.content) {\r\n // No content received at all.\r\n this.hideTypingIndicator();\r\n }\r\n\r\n // Trigger text-to-speech only in conversation mode.\r\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\r\n this.synthesizeSpeech(msg.content);\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n },\r\n error: (err) => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n this.hideTypingIndicator();\r\n\r\n if (!this.isNavigatingAway) {\r\n this.addMessage(this.getServiceDownMessage());\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n\r\n console.error(\"Stream error:\", err);\r\n }\r\n });\r\n },\r\n getServiceDownMessage() {\r\n let newMessage = {\r\n role: \"assistant\",\r\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\r\n htmlContent: \"\",\r\n };\r\n\r\n return newMessage;\r\n },\r\n processReferences(references, messageIndex) {\r\n references = normalizeReferences(references);\r\n\r\n if (Object.keys(references).length) {\r\n\r\n let message = this.messages[messageIndex];\r\n const content = message.content || '';\r\n\r\n // Only include references that were actually cited in the response.\r\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\r\n const citedRefs = Object.entries(references).filter(([key, value]) =>\r\n content.includes(key) || content.includes(`${value.index}`)\r\n );\r\n\r\n if (!citedRefs.length) {\r\n return;\r\n }\r\n\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\r\n let processed = content.trim();\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processed = processed.replaceAll(key, placeholder);\r\n processed = processed.replaceAll(`${value.index}`, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processed = processed.replaceAll('', ',');\r\n\r\n processed += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || key;\r\n processed += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n\r\n message.content = processed;\r\n message.htmlContent = parseMarkdownContent(processed, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n }\r\n },\r\n streamingStarted() {\r\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\r\n\r\n if (stopIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.setAttribute('disabled', 'disabled');\r\n }\r\n },\r\n streamingFinished() {\r\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\r\n\r\n if (startIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.removeAttribute('disabled');\r\n this.inputElement.focus();\r\n }\r\n\r\n // Directly manipulate the DOM to stop all streaming animations.\r\n if (this.chatContainer) {\r\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\r\n for (var i = 0; i < icons.length; i++) {\r\n icons[i].classList.remove('ai-streaming-icon');\r\n icons[i].classList.add('ai-bot-icon');\r\n }\r\n }\r\n\r\n // Also update Vue data for consistency.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n },\r\n handleExternalTtsStop(e) {\r\n if (e?.detail?.sourceId === this.ttsInstanceId) {\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n },\r\n synthesizeSpeech(text, cacheIndex) {\r\n if (!this.textToSpeechEnabled || !text || !this.connection) {\r\n return;\r\n }\r\n\r\n this.audioChunks = [];\r\n this.isPlayingAudio = true;\r\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\r\n\r\n this.connection.invoke(\"SynthesizeSpeech\", this.getProfileId(), this.getSessionId(), text, this.ttsVoiceName)\r\n .catch(err => {\r\n console.error(\"TTS synthesis error:\", err);\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this._ttsCacheIndex = -1;\r\n });\r\n },\r\n toggleMessageTts(message, index) {\r\n if (this.ttsPlayingMessageIndex === index) {\r\n this.stopAudio();\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\r\n detail: { sourceId: this.ttsInstanceId }\r\n }));\r\n this.ttsPlayingMessageIndex = index;\r\n\r\n if (this.ttsAudioCache[index]) {\r\n this.playAudioBlob(this.ttsAudioCache[index]);\r\n return;\r\n }\r\n\r\n this.synthesizeSpeech(message.content, index);\r\n },\r\n playCollectedAudio() {\r\n if (this.audioChunks.length === 0) {\r\n if (!this.currentAudioElement && this.audioPlayQueue.length === 0) {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n }\r\n return;\r\n }\r\n\r\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\r\n const combined = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const chunk of this.audioChunks) {\r\n combined.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n this.audioChunks = [];\r\n\r\n const blob = new Blob([combined], { type: 'audio/mp3' });\r\n\r\n if (this._ttsCacheIndex >= 0) {\r\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\r\n this._ttsCacheIndex = -1;\r\n }\r\n\r\n // If audio is already playing, queue this blob for sequential playback.\r\n if (this.currentAudioElement) {\r\n this.audioPlayQueue.push(blob);\r\n return;\r\n }\r\n\r\n this.playAudioBlob(blob);\r\n },\r\n playAudioBlob(blob) {\r\n const url = URL.createObjectURL(blob);\r\n const audio = new Audio(url);\r\n\r\n this.currentAudioUrl = url;\r\n this.currentAudioElement = audio;\r\n this.isPlayingAudio = true;\r\n\r\n audio.addEventListener('ended', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.addEventListener('error', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.play().catch(err => {\r\n console.error(\"Audio playback error:\", err);\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n });\r\n },\r\n playNextInQueue() {\r\n if (this.audioPlayQueue.length > 0) {\r\n var nextBlob = this.audioPlayQueue.shift();\r\n this.playAudioBlob(nextBlob);\r\n } else {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this.conversationModeOnAudioEnded();\r\n }\r\n },\r\n stopAudio() {\r\n if (this.currentAudioElement) {\r\n this.currentAudioElement.pause();\r\n this.currentAudioElement.currentTime = 0;\r\n this.currentAudioElement = null;\r\n }\r\n if (this.currentAudioUrl) {\r\n URL.revokeObjectURL(this.currentAudioUrl);\r\n this.currentAudioUrl = null;\r\n }\r\n this.audioChunks = [];\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n },\r\n toggleConversationMode() {\r\n if (this.isConversationMode) {\r\n this.stopConversationMode();\r\n } else {\r\n this.startConversationMode();\r\n }\r\n },\r\n startConversationMode() {\r\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = true;\r\n this.updateConversationButton();\r\n this._conversationPartialTranscript = '';\r\n this._conversationAssistantMessage = null;\r\n this._conversationPartialMessage = null;\r\n\r\n // Remove any previous conversation ended notification.\r\n this.removeNotification('conversation-ended');\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this._conversationSubject = new signalR.Subject();\r\n this._conversationStream = stream;\r\n\r\n // Create an AnalyserNode for volume-based interrupt detection.\r\n // During TTS playback, detect when the user speaks above\r\n // the threshold to stop TTS (interrupt). Audio chunks are\r\n // always forwarded — browser echo cancellation handles\r\n // speaker echo so the STT stream has no gaps.\r\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\r\n if (AudioCtx) {\r\n this._conversationAudioCtx = new AudioCtx();\r\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\r\n this._conversationAnalyser.fftSize = 256;\r\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\r\n micSource.connect(this._conversationAnalyser);\r\n }\r\n\r\n var pendingChunk = Promise.resolve();\r\n var analyser = this._conversationAnalyser;\r\n var interruptVolumeThreshold = 30;\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n // During TTS playback, check mic volume to detect\r\n // user interruption (speaking above threshold).\r\n if (this.isPlayingAudio && analyser) {\r\n var freqData = new Uint8Array(analyser.frequencyBinCount);\r\n analyser.getByteFrequencyData(freqData);\r\n var sum = 0;\r\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\r\n var avg = sum / freqData.length;\r\n\r\n if (avg >= interruptVolumeThreshold) {\r\n // User is speaking — interrupt TTS playback.\r\n this.stopAudio();\r\n }\r\n }\r\n\r\n // Always send audio to STT — browser echo cancellation\r\n // handles speaker echo; continuous audio avoids gaps\r\n // that increase recognition latency.\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n try {\r\n this._conversationSubject.next(base64);\r\n } catch (err) {\r\n // Subject may have been completed already.\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => {\r\n try {\r\n this._conversationSubject.complete();\r\n } catch (err) {\r\n // Already completed.\r\n }\r\n });\r\n });\r\n\r\n var profileId = this.getProfileId();\r\n var sessionId = this.getSessionId() || '';\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n\r\n this.connection.send(\"StartConversation\", profileId, sessionId, this._conversationSubject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n });\r\n },\r\n stopConversationMode() {\r\n if (!this.isConversationMode) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n\r\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\r\n if (this.connection) {\r\n this.connection.invoke(\"StopConversation\").catch(function () { });\r\n }\r\n\r\n if (this.isRecording && this.mediaRecorder) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n }\r\n\r\n this.stopAudio();\r\n this._conversationPartialTranscript = '';\r\n this._conversationPartialMessage = null;\r\n\r\n // Clean up the AudioContext used for volume monitoring.\r\n if (this._conversationAudioCtx) {\r\n this._conversationAudioCtx.close().catch(function () { });\r\n this._conversationAudioCtx = null;\r\n this._conversationAnalyser = null;\r\n }\r\n\r\n // Mark any in-flight assistant message as done to stop the spinner.\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Safety net: clear all lingering streaming indicators.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Show a \"conversation ended\" notification system message.\r\n this.receiveNotification({\r\n type: 'conversation-ended',\r\n content: 'Conversation ended.',\r\n icon: 'fa-solid fa-circle-check',\r\n dismissible: true,\r\n autoDismissMs: 5000\r\n });\r\n },\r\n updateConversationButton() {\r\n if (!this.conversationButton) {\r\n return;\r\n }\r\n\r\n if (this.isConversationMode) {\r\n this.conversationButton.classList.add('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\r\n var endHtml = this.conversationButton.getAttribute('data-end-html');\r\n if (endHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n } else {\r\n this.conversationButton.classList.remove('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\r\n this.conversationButton.classList.add('btn-outline-dark');\r\n this.conversationButton.blur();\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\r\n var startHtml = this.conversationButton.getAttribute('data-start-html');\r\n if (startHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n }\r\n },\r\n conversationModeSendPrompt() {\r\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\r\n },\r\n conversationModeOnAudioEnded() {\r\n // Legacy: in conversation mode, audio playback continuation\r\n // is handled by the persistent stream. This method is only\r\n // called from playCollectedAudio for non-conversation TTS.\r\n },\r\n generatePrompt(element) {\r\n if (!element) {\r\n console.error('The element paramter is required.');\r\n\r\n return;\r\n }\r\n\r\n let templateProfileId = element.getAttribute('data-profile-id');\r\n let sessionId = this.getSessionId();\r\n let sessionProfileId = this.getProfileId();\r\n\r\n if (!templateProfileId || !sessionId) {\r\n\r\n console.error('The given element is missing data-profile-id or the session has not yet started.');\r\n return;\r\n }\r\n\r\n // streamMessage() already shows the typing indicator.\r\n this.streamMessage(templateProfileId, null, sessionProfileId);\r\n },\r\n createSessionUrl(baseUrl, param, value) {\r\n\r\n const fullUrl = baseUrl.toLowerCase().startsWith('http') ? baseUrl : window.location.origin + baseUrl;\r\n const url = new URL(fullUrl);\r\n\r\n url.searchParams.set(param, value);\r\n\r\n return url.toString();\r\n },\r\n showTypingIndicator() {\r\n this.addMessage({\r\n role: 'indicator',\r\n htmlContent: config.indicatorTemplate\r\n });\r\n },\r\n hideTypingIndicator() {\r\n const originalLength = this.messages.length;\r\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\r\n const removedCount = originalLength - this.messages.length;\r\n return removedCount;\r\n },\r\n receiveNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\r\n if (existingIndex >= 0) {\r\n this.notifications.splice(existingIndex, 1, notification);\r\n } else {\r\n this.notifications.push(notification);\r\n }\r\n this.scheduleNotificationDismiss(notification);\r\n this.$nextTick(() => {\r\n this.scrollToBottom();\r\n });\r\n },\r\n updateNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\r\n if (existingIndex >= 0) {\r\n this.notifications.splice(existingIndex, 1, notification);\r\n this.scheduleNotificationDismiss(notification);\r\n }\r\n },\r\n scheduleNotificationDismiss(notification) {\r\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\r\n return;\r\n }\r\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\r\n this.removeNotification(notification.type);\r\n }, notification.autoDismissMs);\r\n },\r\n clearNotificationDismiss(notificationType) {\r\n var timerId = this.notificationDismissTimers[notificationType];\r\n if (!timerId) {\r\n return;\r\n }\r\n clearTimeout(timerId);\r\n delete this.notificationDismissTimers[notificationType];\r\n },\r\n removeNotification(notificationType) {\r\n this.clearNotificationDismiss(notificationType);\r\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\r\n },\r\n dismissNotification(notificationType) {\r\n this.removeNotification(notificationType);\r\n },\r\n handleNotificationAction(notificationType, actionName) {\r\n if (!this.connection) {\r\n return;\r\n }\r\n var sessionId = this.getSessionId();\r\n this.connection.invoke(\"HandleNotificationAction\", sessionId, notificationType, actionName).catch(function (err) {\r\n console.error(\"Error handling notification action:\", err);\r\n });\r\n },\r\n scrollToBottom() {\r\n if (!this.autoScroll) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\r\n }, 50);\r\n },\r\n handleUserInput(event) {\r\n this.prompt = event.target.value;\r\n },\r\n getProfileId() {\r\n return this.inputElement.getAttribute('data-profile-id');\r\n },\r\n setSessionId(sessionId) {\r\n this.inputElement.setAttribute('data-session-id', sessionId || '');\r\n },\r\n resetSession() {\r\n this.stopRecording();\r\n this.setSessionId('');\r\n this.isSessionStarted = false;\r\n this.sessionRating = null;\r\n if (this.widgetIsInitialized) {\r\n localStorage.removeItem(this.chatWidgetStateSession);\r\n }\r\n this.messages = [];\r\n this.documents = [];\r\n if (!config.autoCreateSession) {\r\n this.showPlaceholder();\r\n }\r\n\r\n if (config.autoCreateSession) {\r\n this.startNewSession();\r\n }\r\n },\r\n startNewSession() {\r\n if (!this.applyOrchestratorAvailability()) {\r\n return;\r\n }\r\n\r\n const profileId = this.getProfileId();\r\n if (!profileId || !this.connection) {\r\n return;\r\n }\r\n\r\n this.connection.invoke(\"StartSession\", profileId, null).catch(err => console.error(err));\r\n },\r\n initializeApp() {\r\n this.inputElement = document.querySelector(config.inputElementSelector);\r\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\r\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\r\n this.placeholder = document.querySelector(config.placeholderElementSelector);\r\n this.applyOrchestratorAvailability();\r\n\r\n const sessionId = this.getSessionId();\r\n if (!hasWidgetConfig && sessionId) {\r\n this.loadSession(sessionId);\r\n } else if (this.isOrchestratorAvailable() && config.autoCreateSession && !hasWidgetConfig && !sessionId) {\r\n this.startNewSession();\r\n }\r\n\r\n // Initialize document bar if enabled.\r\n if (config.sessionDocumentsEnabled && config.documentBarSelector) {\r\n this.documentBar = document.querySelector(config.documentBarSelector);\r\n if (this.documentBar) {\r\n this.renderDocumentBar();\r\n\r\n // Create hidden file input for document uploads.\r\n var fileInput = document.createElement('input');\r\n fileInput.type = 'file';\r\n fileInput.id = 'ai-chat-doc-input';\r\n fileInput.className = 'd-none';\r\n fileInput.multiple = true;\r\n if (config.allowedExtensions) {\r\n fileInput.accept = config.allowedExtensions;\r\n }\r\n fileInput.addEventListener('change', (e) => this.handleFileInputChange(e));\r\n this.documentBar.parentElement.appendChild(fileInput);\r\n\r\n // Set up drag-and-drop on the input area.\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) {\r\n inputArea.addEventListener('dragover', (e) => this.handleDragOver(e));\r\n inputArea.addEventListener('dragleave', (e) => this.handleDragLeave(e));\r\n inputArea.addEventListener('drop', (e) => this.handleDrop(e));\r\n }\r\n }\r\n }\r\n\r\n // Pause auto-scroll when the user manually scrolls up during streaming.\r\n this.chatContainer.addEventListener('scroll', () => {\r\n if (!this.stream) {\r\n return;\r\n }\r\n const threshold = 30;\r\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\r\n this.autoScroll = atBottom;\r\n });\r\n\r\n this.inputElement.addEventListener('keydown', event => {\r\n\r\n if (this.stream != null) {\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" && !event.shiftKey) {\r\n event.preventDefault();\r\n this.buttonElement.click();\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('input', (e) => {\r\n this.handleUserInput(e);\r\n\r\n if (e.target.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n });\r\n\r\n this.buttonElement.addEventListener('click', () => {\r\n\r\n if (this.stream != null) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n\r\n this.streamingFinished();\r\n this.hideTypingIndicator();\r\n\r\n // Clean up: remove empty assistant message or stop streaming animation.\r\n if (this.messages.length > 0) {\r\n const lastMsg = this.messages[this.messages.length - 1];\r\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\r\n this.messages.pop();\r\n } else if (lastMsg.isStreaming) {\r\n lastMsg.isStreaming = false;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.sendMessage();\r\n });\r\n\r\n const promptGenerators = document.getElementsByClassName('profile-generated-prompt');\r\n\r\n for (var i = 0; i < promptGenerators.length; i++) {\r\n promptGenerators[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n this.generatePrompt(e.target);\r\n });\r\n }\r\n\r\n const chatSessions = document.getElementsByClassName('chat-session-history-item');\r\n\r\n for (var i = 0; i < chatSessions.length; i++) {\r\n chatSessions[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n var sessionId = e.target.getAttribute('data-session-id');\r\n\r\n if (!sessionId) {\r\n console.error('an element with the class chat-session-history-item with no data-session-id set.');\r\n\r\n return;\r\n }\r\n\r\n this.loadSession(sessionId);\r\n this.showChatScreen();\r\n });\r\n }\r\n\r\n for (let i = 0; i < config.messages.length; i++) {\r\n this.addMessage(config.messages[i]);\r\n }\r\n\r\n // Update feedback icons in the DOM after initial messages have rendered.\r\n this.$nextTick(() => {\r\n this.refreshAllFeedbackIcons();\r\n });\r\n\r\n // Delegate click for code block copy buttons.\r\n if (this.chatContainer) {\r\n this.chatContainer.addEventListener('click', (e) => {\r\n var btn = e.target.closest('.ai-code-copy-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n\r\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\r\n if (!block) {\r\n return;\r\n }\r\n\r\n var codeEl = block.querySelector('code');\r\n if (codeEl) {\r\n navigator.clipboard.writeText(codeEl.textContent);\r\n var copiedText = config.codeCopiedText || 'Copied!';\r\n btn.innerHTML = ' ' + copiedText;\r\n setTimeout(() => {\r\n btn.innerHTML = '';\r\n }, 2000);\r\n }\r\n });\r\n }\r\n\r\n // Initialize speech-to-text microphone button.\r\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\r\n this.micButton = document.querySelector(config.micButtonElementSelector);\r\n if (this.micButton) {\r\n this.micButton.style.display = '';\r\n this.micButton.addEventListener('click', () => {\r\n this.toggleRecording();\r\n });\r\n }\r\n }\r\n\r\n // Initialize conversation mode button.\r\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\r\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\r\n if (this.conversationButton) {\r\n this.conversationButton.addEventListener('click', () => {\r\n this.toggleConversationMode();\r\n });\r\n }\r\n }\r\n },\r\n loadSession(sessionId) {\r\n this.connection.invoke(\"LoadSession\", sessionId).catch(err => console.error(err));\r\n },\r\n reloadCurrentSession() {\r\n\r\n var sessionId = this.getSessionId();\r\n if (sessionId) {\r\n this.loadSession(sessionId);\r\n }\r\n },\r\n initializeSession(sessionId, force) {\r\n if (this.isSessionStarted && !force) {\r\n return\r\n }\r\n this.fireEvent(new CustomEvent(\"initializingSessionOpenAIChat\", { detail: { sessionId: sessionId } }))\r\n this.setSessionId(sessionId);\r\n this.isSessionStarted = true;\r\n\r\n if (this.widgetIsInitialized) {\r\n localStorage.setItem(this.chatWidgetStateSession, sessionId);\r\n }\r\n },\r\n initializeWidget() {\r\n\r\n if (!config.widget.chatWidgetContainer) {\r\n console.error('The widget chatWidgetContainer is required.');\r\n return;\r\n }\r\n\r\n if (!config.widget.chatWidgetStateName) {\r\n console.error('The widget chatWidgetStateName is required.');\r\n return;\r\n }\r\n\r\n const chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);\r\n\r\n if (!chatWidgetContainer) {\r\n return;\r\n }\r\n\r\n if (config.widget.chatHistorySection) {\r\n this.chatHistorySection = document.querySelector(config.widget.chatHistorySection);\r\n }\r\n\r\n this.chatWidgetStateName = config.widget.chatWidgetStateName;\r\n this.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';\r\n this.chatWidgetLayoutKey = config.widget.chatWidgetStateName + 'Layout';\r\n this.widgetContainerElement = chatWidgetContainer;\r\n this.widgetToggleButtonElement = config.widget.toggleButtonSelector\r\n ? document.querySelector(config.widget.toggleButtonSelector)\r\n : null;\r\n this.widgetResetSizeButtonElement = config.widget.resetSizeButtonSelector\r\n ? document.querySelector(config.widget.resetSizeButtonSelector)\r\n : null;\r\n this.widgetDefaultWidth = parsePixelValue(config.widget.defaultWidth) ||\r\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).width) ||\r\n 380;\r\n this.widgetDefaultHeight = parsePixelValue(config.widget.defaultHeight) ||\r\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).height) ||\r\n 520;\r\n this.widgetIsInitialized = true;\r\n\r\n if (config.widget.enableResizing) {\r\n chatWidgetContainer.classList.add('ai-chat-widget-resizable');\r\n chatWidgetContainer.style.minWidth = (parsePixelValue(config.widget.minWidth) || 320) + 'px';\r\n chatWidgetContainer.style.minHeight = (parsePixelValue(config.widget.minHeight) || 420) + 'px';\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.widgetResizeObserver = new ResizeObserver(() => {\r\n this.persistWidgetPanelSize();\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n });\r\n\r\n this.widgetResizeObserver.observe(chatWidgetContainer);\r\n }\r\n }\r\n\r\n var dragHandleSelector = config.widget.dragHandleSelector || '.ai-chat-widget-header';\r\n var dragHandle = chatWidgetContainer.querySelector(dragHandleSelector);\r\n\r\n if (config.widget.enableDragging && dragHandle) {\r\n dragHandle.classList.add('ai-chat-widget-drag-handle');\r\n chatWidgetContainer.classList.add('ai-chat-widget-draggable');\r\n this.attachDraggableWidgetElement(chatWidgetContainer, dragHandle, 'panel', false);\r\n }\r\n\r\n if (config.widget.enableDragging && this.widgetToggleButtonElement) {\r\n this.widgetToggleButtonElement.classList.add('ai-chat-widget-draggable');\r\n this.attachDraggableWidgetElement(this.widgetToggleButtonElement, this.widgetToggleButtonElement, 'toggle', true);\r\n }\r\n\r\n if (this.widgetResetSizeButtonElement) {\r\n this.widgetResetSizeButtonElement.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n this.resetWidgetSize();\r\n });\r\n }\r\n\r\n this.restoreWidgetLayout();\r\n\r\n if (!this.widgetViewportResizeHandler) {\r\n this.widgetViewportResizeHandler = () => {\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n };\r\n\r\n window.addEventListener('resize', this.widgetViewportResizeHandler);\r\n }\r\n\r\n // Auto-load the last session so the user always sees previous chat history.\r\n this.reloadCurrentSession();\r\n\r\n if (config.autoCreateSession && !this.getSessionId()) {\r\n this.startNewSession();\r\n }\r\n\r\n if (config.widget.showHistoryButton && this.chatHistorySection) {\r\n\r\n const showHistoryButton = document.querySelector(config.widget.showHistoryButton);\r\n\r\n if (showHistoryButton) {\r\n showHistoryButton.addEventListener('click', () => {\r\n this.chatHistorySection.classList.toggle('show');\r\n });\r\n }\r\n\r\n if (config.widget.closeHistoryButton) {\r\n var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);\r\n\r\n if (closeHistoryButton) {\r\n closeHistoryButton.addEventListener('click', () => {\r\n this.showChatScreen();\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (config.widget.newChatButton) {\r\n const newChatButton = document.querySelector(config.widget.newChatButton);\r\n\r\n if (newChatButton) {\r\n newChatButton.addEventListener('click', () => {\r\n this.resetSession();\r\n this.showChatScreen();\r\n });\r\n }\r\n }\r\n },\r\n showChatScreen() {\r\n\r\n if (!this.chatHistorySection) {\r\n return;\r\n }\r\n\r\n this.chatHistorySection.classList.remove('show');\r\n },\r\n getSessionId() {\r\n let sessionId = this.inputElement.getAttribute('data-session-id');\r\n\r\n if (!sessionId && this.widgetIsInitialized) {\r\n sessionId = localStorage.getItem(this.chatWidgetStateSession);\r\n }\r\n\r\n return sessionId;\r\n },\r\n copyResponse(message) {\r\n navigator.clipboard.writeText(message);\r\n },\r\n updateFeedbackIcons(container, userRating) {\r\n if (!container) {\r\n return;\r\n }\r\n\r\n var upBtn = container.querySelector('.rate-up-btn');\r\n var downBtn = container.querySelector('.rate-down-btn');\r\n\r\n // Font Awesome SVG+JS replaces with , so we must replace\r\n // the entire button content and let Font Awesome re-process.\r\n if (upBtn) {\r\n var upClass = userRating === true ? 'fa-solid fa-thumbs-up' : 'fa-regular fa-thumbs-up';\r\n var upIcon = document.createElement('i');\r\n upIcon.className = upClass;\r\n upIcon.style.fontSize = '0.9rem';\r\n upBtn.textContent = '';\r\n upBtn.appendChild(upIcon);\r\n }\r\n\r\n if (downBtn) {\r\n var downClass = userRating === false ? 'fa-solid fa-thumbs-down' : 'fa-regular fa-thumbs-down';\r\n var downIcon = document.createElement('i');\r\n downIcon.className = downClass;\r\n downIcon.style.fontSize = '0.9rem';\r\n downBtn.textContent = '';\r\n downBtn.appendChild(downIcon);\r\n }\r\n\r\n // Trigger Font Awesome SVG+JS to convert the new elements.\r\n if (window.FontAwesome && FontAwesome.dom && FontAwesome.dom.i2svg) {\r\n FontAwesome.dom.i2svg({ node: container });\r\n }\r\n },\r\n refreshAllFeedbackIcons() {\r\n var containers = this.$el.querySelectorAll('.ai-chat-message-assistant-feedback');\r\n\r\n for (var i = 0; i < containers.length; i++) {\r\n var msgId = containers[i].getAttribute('data-message-id');\r\n var msg = this.messages.find(m => m.id === msgId);\r\n\r\n if (msg) {\r\n this.updateFeedbackIcons(containers[i], msg.userRating);\r\n }\r\n }\r\n },\r\n rateMessage(message, isPositive, event) {\r\n var sessionId = this.getSessionId();\r\n\r\n if (!sessionId || !message.id || !this.connection) {\r\n return;\r\n }\r\n\r\n // Toggle: clicking the same rating again clears it.\r\n var newRating = message.userRating === isPositive ? null : isPositive;\r\n message.userRating = newRating;\r\n\r\n // Find the feedback container by message ID for reliable DOM targeting.\r\n var feedbackContainer = this.$el.querySelector(\r\n '.ai-chat-message-assistant-feedback[data-message-id=\"' + message.id + '\"]'\r\n );\r\n\r\n this.updateFeedbackIcons(feedbackContainer, newRating);\r\n\r\n // Trigger spark animation after Font Awesome has re-processed icons.\r\n if (newRating !== null && feedbackContainer) {\r\n setTimeout(() => {\r\n var btnClass = isPositive ? '.rate-up-btn' : '.rate-down-btn';\r\n var btn = feedbackContainer.querySelector(btnClass);\r\n\r\n if (btn) {\r\n btn.classList.remove('spark-effect');\r\n void btn.offsetWidth;\r\n btn.classList.add('spark-effect');\r\n btn.addEventListener('animationend', function onEnd() {\r\n btn.removeEventListener('animationend', onEnd);\r\n btn.classList.remove('spark-effect');\r\n });\r\n }\r\n }, 50);\r\n }\r\n\r\n this.connection.invoke(\"RateMessage\", sessionId, message.id, isPositive).catch(function (err) {\r\n console.error('Failed to rate message:', err);\r\n });\r\n }\r\n },\r\n watch: {\r\n documents: {\r\n handler() { this.renderDocumentBar(); },\r\n deep: true\r\n },\r\n isUploading() { this.renderDocumentBar(); },\r\n isPlayingAudio() {\r\n // Reserved for future use — volume-based interrupt detection\r\n // no longer mutes tracks; browser echo cancellation handles echo.\r\n },\r\n isConversationMode(active) {\r\n // Hide/show mic button.\r\n if (this.micButton) {\r\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\r\n }\r\n\r\n // Hide/show send button.\r\n if (this.buttonElement) {\r\n this.buttonElement.style.display = active ? 'none' : '';\r\n }\r\n\r\n // Disable/enable textarea.\r\n if (this.inputElement) {\r\n this.inputElement.disabled = active;\r\n if (active) {\r\n this.inputElement.placeholder = '';\r\n }\r\n }\r\n }\r\n },\r\n mounted() {\r\n (async () => {\r\n await this.startConnection();\r\n this.initializeApp();\r\n if (hasWidgetConfig) {\r\n this.initializeWidget();\r\n }\r\n })();\r\n\r\n window.addEventListener('beforeunload', this.handleBeforeUnload);\r\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n },\r\n beforeUnmount() {\r\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\r\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n\r\n this.stopAudio(false);\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n },\r\n template: config.messageTemplate\r\n }).mount(config.appElementSelector);\r\n\r\n return app;\r\n };\r\n\r\n return {\r\n initialize: initialize\r\n };\r\n}();\r\n\r\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\r\ndocument.addEventListener('click', function (e) {\r\n const btn = e.target.closest('.download-chart-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n const chartId = btn.getAttribute('data-chart-id');\r\n const canvas = chartId ? document.getElementById(chartId) : null;\r\n if (!canvas) {\r\n console.error('Chart canvas not found:', chartId);\r\n return;\r\n }\r\n const link = document.createElement('a');\r\n link.download = 'chart-' + chartId + '.png';\r\n link.href = canvas.toDataURL('image/png');\r\n link.click();\r\n});\r\n\r\n// Intercept download clicks for data-URI images and convert to blob downloads.\r\ndocument.addEventListener('click', function (e) {\r\n const link = e.target.closest('.ai-download-image');\r\n if (!link) {\r\n return;\r\n }\r\n\r\n const container = link.closest('.generated-image-container');\r\n const img = container?.querySelector('img');\r\n if (!img) {\r\n return;\r\n }\r\n\r\n const src = img.src;\r\n if (!src || !src.startsWith('data:')) {\r\n return; // Normal URL – let the default behaviour handle it.\r\n }\r\n\r\n e.preventDefault();\r\n\r\n fetch(src)\r\n .then(function (res) { return res.blob(); })\r\n .then(function (blob) {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = link.getAttribute('download') || 'generated-image.png';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\r\n })\r\n .catch(function (err) { console.error('Failed to download image:', err); });\r\n});\r\n"]} diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js index 41d375db..76c21703 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js @@ -30,7 +30,7 @@ window.chatInteractionManager = function () { downloadChartButtonText: 'Download', codeCopiedText: 'Copied!', assistantLabel: 'Assistant', - messageTemplate: "\n
\n
\n
\n
You
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n ", + messageTemplate: "\n
\n
\n
\n
You
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n ", indicatorTemplate: "\n
\n \n Assistant\n
\n ", // Localizable strings untitledText: 'Untitled', @@ -331,8 +331,10 @@ window.chatInteractionManager = function () { audioPlayQueue: [], isPlayingAudio: false, currentAudioElement: null, + currentAudioUrl: null, ttsPlayingMessageIndex: -1, ttsAudioCache: {}, + ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2), conversationModeEnabled: config.chatMode === 'Conversation', conversationButton: null, isConversationMode: false, @@ -1030,6 +1032,13 @@ window.chatInteractionManager = function () { this.debouncedSaveSettings(); } }, + handleExternalTtsStop: function handleExternalTtsStop(e) { + var _e$detail; + if ((e === null || e === void 0 || (_e$detail = e.detail) === null || _e$detail === void 0 ? void 0 : _e$detail.sourceId) === this.ttsInstanceId) { + return; + } + this.stopAudio(false); + }, synthesizeSpeech: function synthesizeSpeech(text, cacheIndex) { var _this7 = this; if (!this.textToSpeechEnabled || !text || !this.connection) { @@ -1050,7 +1059,12 @@ window.chatInteractionManager = function () { this.stopAudio(); return; } - this.stopAudio(); + this.stopAudio(false); + window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', { + detail: { + sourceId: this.ttsInstanceId + } + })); this.ttsPlayingMessageIndex = index; if (this.ttsAudioCache[index]) { this.playAudioBlob(this.ttsAudioCache[index]); @@ -1062,6 +1076,7 @@ window.chatInteractionManager = function () { if (this.audioChunks.length === 0) { if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) { this.isPlayingAudio = false; + this.ttsPlayingMessageIndex = -1; } return; } @@ -1103,23 +1118,29 @@ window.chatInteractionManager = function () { var _this8 = this; var url = URL.createObjectURL(blob); var audio = new Audio(url); + this.currentAudioUrl = url; this.currentAudioElement = audio; this.isPlayingAudio = true; audio.addEventListener('ended', function () { - URL.revokeObjectURL(url); _this8.currentAudioElement = null; + _this8.currentAudioUrl = null; + URL.revokeObjectURL(url); _this8.playNextInQueue(); }); audio.addEventListener('error', function () { - URL.revokeObjectURL(url); _this8.currentAudioElement = null; + _this8.currentAudioUrl = null; + URL.revokeObjectURL(url); _this8.playNextInQueue(); }); audio.play()["catch"](function (err) { console.error("Audio playback error:", err); - URL.revokeObjectURL(url); _this8.currentAudioElement = null; + _this8.currentAudioUrl = null; + URL.revokeObjectURL(url); + _this8.audioPlayQueue = []; _this8.isPlayingAudio = false; + _this8.ttsPlayingMessageIndex = -1; }); }, playNextInQueue: function playNextInQueue() { @@ -1138,6 +1159,10 @@ window.chatInteractionManager = function () { this.currentAudioElement.currentTime = 0; this.currentAudioElement = null; } + if (this.currentAudioUrl) { + URL.revokeObjectURL(this.currentAudioUrl); + this.currentAudioUrl = null; + } this.audioChunks = []; this.audioPlayQueue = []; this.isPlayingAudio = false; @@ -2046,9 +2071,12 @@ window.chatInteractionManager = function () { }, _callee5); }))(); window.addEventListener('beforeunload', this.handleBeforeUnload); + window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop); }, beforeUnmount: function beforeUnmount() { window.removeEventListener('beforeunload', this.handleBeforeUnload); + window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop); + this.stopAudio(false); if (this.stream) { this.stream.dispose(); this.stream = null; diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map index 9d76948b..703f813c 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map @@ -1 +1 @@ -{"version":3,"sources":["chat-interaction.js"],"names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_arrayLikeToArray","toString","slice","constructor","name","from","test","window","chatInteractionManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","codeCopiedText","assistantLabel","messageTemplate","indicatorTemplate","untitledText","clearHistoryTitle","clearHistoryMessage","clearHistoryOkText","clearHistoryCancelText","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","renderer","marked","Renderer","link","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","__chartConfigs","createChartHtml","chartId","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","tryExtractChartMarker","startIndex","type","raw","substring","endIndex","json","token","push","config","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","renderChartsInMessage","message","charts","requestAnimationFrame","_iterator","_step","canvas","getElementById","Chart","console","warn","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","err","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","initialize","instanceConfig","assign","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isInteractionStarted","isPlaceholderVisible","isStreaming","isNavigatingAway","autoScroll","stream","messages","prompt","initialFieldValues","Map","settingsDirty","saveSettingsTimeout","saveIndicatorTimeout","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","ttsPlayingMessageIndex","ttsAudioCache","conversationModeEnabled","conversationButton","isConversationMode","notifications","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","startConnection","_this","_callee","_t","_context","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","initializeInteraction","itemId","titleInput","querySelector","title","forEach","msg","addMessage","$nextTick","historyItem","showSaveIndicator","stopRecording","isFinal","_conversationPartialTranscript","escaped","replace","_conversationPartialMessage","hidePlaceholder","htmlContent","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","index","messageId","responseId","appearance","hideTypingIndicator","j","msgIndex","newMessage","id","normalizeAssistantAppearance","base64Audio","contentType","binaryString","atob","bytes","Uint8Array","charCodeAt","playCollectedAudio","showPlaceholder","clearHistoryBtn","classList","add","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentInteraction","onclose","addMessageInternal","_this2","fireEvent","CustomEvent","detail","_this3","processedContent","references","_typeof","keys","citedRefs","entries","filter","_ref","_ref2","_slicedToArray","key","includes","sort","_ref3","_ref4","_ref5","_ref6","b","displayIndex","_iterator2","_step2","_step2$value","replaceAll","_displayIndex","_placeholder","_iterator3","_step3","_step3$value","_iterator4","_step4","_step4$value","label","remove","event","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","isIndicator","sendMessage","_this4","_callee2","trimmedPrompt","_context2","flushPendingSave","streamMessage","_this5","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentItemId","getItemId","subscribe","chunk","sessionId","setItemId","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","complete","_this5$stream","processReferences","streamingFinished","synthesizeSpeech","_this5$stream2","getServiceDownMessage","_this6","_ref7","_ref8","_ref9","_ref0","_ref1","_ref10","processed","_iterator5","_step5","_step5$value","_iterator6","_step6","_step6$value","_iterator7","_step7","_step7$value","stopIcon","getAttribute","replaceChildren","RETURN_DOM_FRAGMENT","startIcon","icons","querySelectorAll","debouncedSaveSettings","cacheIndex","_this7","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","totalLength","reduce","sum","combined","offset","_iterator8","_step8","set","blob","Blob","_this8","URL","createObjectURL","audio","Audio","addEventListener","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this9","updateConversationButton","navigator","mediaDevices","getUserMedia","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","_conversationSubject","Subject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","micSource","createMediaStreamSource","connect","pendingChunk","analyser","interruptVolumeThreshold","size","freqData","frequencyBinCount","getByteFrequencyData","k","avg","_callee3","uint8Array","base64","_context3","arrayBuffer","str","byte","String","fromCharCode","btoa","getTracks","track","stop","documentElement","send","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","originalLength","removedCount","_this0","setTimeout","scrollTop","scrollHeight","clientHeight","handleUserInput","target","getSaveIndicatorElement","saveIndicatorElementSelector","className","_this1","indicator","clearTimeout","clearPendingSettingsSave","getFieldLabel","input","_input$closest","closest","dataset","setting","getValidationFeedbackElement","feedback","nextElementSibling","contains","insertAdjacentElement","clearSettingValidationError","removeAttribute","setSettingValidationError","setAttribute","getSettingValidationMessage","disabled","number","Number","fieldLabel","isNaN","min","max","validateSettingInput","validateSettings","_this10","isValid","getSettingInputs","queueSettingsSave","explicitInputs","getSelectedGroupValues","groupName","fallbackSelector","explicitSelections","values","checkbox","checkboxes","baseName","hiddenInput","getPromptTemplateSelections","promptTemplates","card","templateIdInput","promptParametersInput","templateId","promptParameters","clearNotificationDismiss","findIndex","splice","scheduleNotificationDismiss","_this11","timerId","dismissNotification","handleNotificationAction","actionName","resetInteraction","initializeApp","_this12","placeholderElementSelector","loadInteraction","threshold","atBottom","shiftKey","click","lastMsg","pop","chatInteractionItems","getElementsByClassName","preventDefault","btn","block","codeEl","clipboard","writeText","copiedText","matches","clearHistory","micButtonElementSelector","style","display","toggleRecording","conversationButtonElementSelector","self","confirmDialog","okText","cancelText","callback","confirmed","_this13","saveSettings","getSelectedToolNames","getSelectedMcpConnectionIds","getSelectedA2AConnectionIds","getSelectedAgentNames","_this14","settings","inputs","match","toLowerCase","checked","parseFloat","toolNames","mcpConnectionIds","a2aConnectionIds","agentNames","promptTemplateIds","map","template","force","copyResponse","startRecording","_this15","subject","_callee4","_context4","updateMicButton","watch","active","mounted","_this16","_callee5","_context5","beforeUnmount","removeEventListener","mount","download","toDataURL","container","img","startsWith","fetch","res","body","appendChild","removeChild"],"mappings":"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","file":"chat-interaction.js","sourcesContent":["window.chatInteractionManager = function () {\n\n // Defaults (can be overridden by instanceConfig)\n var defaultConfig = {\n // UI defaults for generated media\n generatedImageAltText: 'Generated Image',\n generatedImageMaxWidth: 400,\n downloadImageTitle: 'Download image',\n downloadChartTitle: 'Download chart as image',\n downloadChartButtonText: 'Download',\n codeCopiedText: 'Copied!',\n assistantLabel: 'Assistant',\n\n messageTemplate: `\n
\n
\n
\n
You
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n `,\n indicatorTemplate: `\n
\n \n Assistant\n
\n `,\n // Localizable strings\n untitledText: 'Untitled',\n clearHistoryTitle: 'Clear History',\n clearHistoryMessage: 'Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.',\n clearHistoryOkText: 'Yes',\n clearHistoryCancelText: 'Cancel'\n };\n\n // Sanitize URLs to prevent javascript: protocol injection.\n function sanitizeUrl(url) {\n if (!url) return '';\n var trimmed = url.trim();\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\n return '';\n }\n return url;\n }\n\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\n function escapeHtmlEntities(text) {\n var span = document.createElement('span');\n span.textContent = text;\n return span.innerHTML;\n }\n\n const renderer = new marked.Renderer();\n\n // Modify the link rendering to open in a new tab\n renderer.link = function (data) {\n var href = sanitizeUrl(data.href);\n if (!href) return data.text || '';\n return `
${data.text}`;\n };\n\n // Custom code block renderer with highlight.js integration and copy button.\n renderer.code = function (data) {\n var code = data.text || '';\n var lang = (data.lang || '').trim();\n var highlighted = code;\n\n if (typeof hljs !== 'undefined') {\n if (lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(code, { language: lang }).value;\n } catch (_) { }\n } else {\n try {\n highlighted = hljs.highlightAuto(code).value;\n } catch (_) { }\n }\n } else {\n highlighted = escapeHtmlEntities(code);\n }\n\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\n return `
${langDisplay}
${highlighted}
`;\n };\n\n // Custom image renderer for generated images with thumbnail styling and download button.\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\n renderer.image = function (data) {\n const src = sanitizeUrl(data.href);\n if (!src) return '';\n const alt = data.text || defaultConfig.generatedImageAltText;\n const maxWidth = defaultConfig.generatedImageMaxWidth;\n return `
\n \"${alt}\"\n
\n \n \n \n
\n
`;\n };\n\n // Chart counter for unique IDs\n let chartCounter = 0;\n\n // Collector for charts discovered during marked parsing.\n let _pendingCharts = [];\n\n // Global chart config map shared with ai-chat.js\n window.__chartConfigs = window.__chartConfigs || {};\n\n function createChartHtml(chartId) {\n return `
`\n + ``\n + `
`\n + `
`\n + ``\n + `
`;\n }\n\n // Register [chart:{...json...}] as a native marked block extension so the\n // markdown parser handles chart markers inline with surrounding text.\n marked.use({\n extensions: [{\n name: 'chart',\n level: 'block',\n start(src) {\n const idx = src.indexOf('[chart:');\n return idx >= 0 ? idx : undefined;\n },\n tokenizer(src) {\n const extracted = tryExtractChartMarker(src);\n if (!extracted || extracted.startIndex !== 0) {\n return undefined;\n }\n\n const chartId = `chat_chart_${++chartCounter}`;\n\n return {\n type: 'chart',\n raw: src.substring(0, extracted.endIndex),\n chartId: chartId,\n json: extracted.json,\n };\n },\n renderer(token) {\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\n window.__chartConfigs[token.chartId] = token.json;\n return createChartHtml(token.chartId);\n }\n }]\n });\n\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\n function tryExtractChartMarker(text) {\n const token = '[chart:';\n const start = text.indexOf(token);\n if (start < 0) {\n return null;\n }\n\n // Find JSON object boundary by balancing braces\n const jsonStart = start + token.length;\n let i = jsonStart;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\n i++;\n }\n\n if (i >= text.length || text[i] !== '{') {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n\n if (inString) {\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\') {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) {\n const jsonEnd = i;\n // Expect closing bracket after JSON\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\n if (closeBracketIndex < 0) {\n return null;\n }\n\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\n return {\n startIndex: start,\n endIndex: closeBracketIndex + 1,\n json: json\n };\n }\n }\n }\n\n return null;\n }\n\n function renderChartsInMessage(message) {\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\n return;\n }\n\n // Copy and clear pending charts immediately to prevent duplicate renders.\n const charts = [...message._pendingCharts];\n message._pendingCharts = [];\n\n // Defer to requestAnimationFrame so the browser has fully laid out the\n // canvas elements before Chart.js reads their dimensions.\n requestAnimationFrame(() => {\n for (const c of charts) {\n const canvas = document.getElementById(c.chartId);\n if (!canvas) {\n continue;\n }\n\n if (typeof Chart === 'undefined') {\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n continue;\n }\n\n // When the canvas is inside a hidden container (e.g., display:none),\n // it has zero dimensions. Keep the config for later rendering.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[c.chartId] = c.config;\n continue;\n }\n\n try {\n // Destroy existing chart instance if re-rendering\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n } catch (e) {\n console.error('Error creating chart:', e);\n }\n }\n });\n }\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n const initialize = (instanceConfig) => {\n\n const config = Object.assign({}, defaultConfig, instanceConfig);\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isInteractionStarted: false,\n isPlaceholderVisible: true,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n prompt: '',\n initialFieldValues: new Map(),\n settingsDirty: false,\n saveSettingsTimeout: null,\n saveIndicatorTimeout: null,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n notifications: [],\n notificationDismissTimers: {},\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadInteraction\", (data) => {\n this.initializeInteraction(data.itemId, true);\n this.messages = [];// Update the title field if it exists\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && data.title) {\n titleInput.value = data.title;\n }\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n });\n\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\n // Update the history list item if it exists\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\n if (historyItem) {\n historyItem.textContent = title || config.untitledText;\n }\n\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && title) {\n titleInput.value = title;\n }\n\n this.showSaveIndicator('Saved', 'text-success');\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n this.showSaveIndicator('Save failed', 'text-danger');\n\n if (this.isRecording) {\n this.stopRecording();\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, text) => {\n if (text) {\n this.stopAudio();\n\n // If there's an interrupted assistant message still streaming,\n // mark it as done to stop the spinner animation.\n if (this._conversationAssistantMessage) {\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\n if (oldMsg) {\n oldMsg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, appearance) => {\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n appearance: this.normalizeAssistantAppearance(appearance),\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.content = this._conversationAssistantMessage.content;\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n this.audioChunks.push(bytes);\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"HistoryCleared\", (itemId) => {\n // Clear messages and show placeholder\n this.messages = [];\n this.showPlaceholder();\n\n // Hide the clear history button since there's no history now\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.add('d-none');\n }\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n this.reloadCurrentInteraction();\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n if (message.content) {\n let processedContent = message.content.trim();\n\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\n\n // Only include references that were actually cited in the response.\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\n\n if (citedRefs.length) {\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders.\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processedContent = processedContent.replaceAll('
', ',');\n\n processedContent += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || `[doc:${value.index}]`;\n processedContent += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n }\n }\n\n message.content = processedContent;\n message.htmlContent = parseMarkdownContent(processedContent, message);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n async sendMessage() {\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // Flush any pending settings save before sending a message\n // to prevent concurrent hub calls that can cause database deadlocks.\n await this.flushPendingSave();\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n // Show the clear history button since we now have prompts\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.remove('d-none');\n }\n\n this.streamMessage(trimmedPrompt);\n this.inputElement.value = '';\n this.prompt = '';\n },\n streamMessage(trimmedPrompt) {\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n var messageIndex = this.messages.length;\n var currentItemId = this.getItemId();\n\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n if (chunk.sessionId && !currentItemId) {\n this.setItemId(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n messageIndex = this.messages.length;\n let newMessage = {\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n };\n\n this.messages.push(newMessage);\n message = newMessage;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = value;\n }\n }\n\n if (chunk.content) {\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n let processedContent = chunk.content;\n\n for (const [key, value] of Object.entries(references)) {\n processedContent = processedContent.replaceAll(key, `${value.index}`);\n }\n\n content += processedContent.replaceAll('
', ',');\n }\n\n message.content = content;\n\n message.htmlContent = parseMarkdownContent(content, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n return {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n },\n processReferences(references, messageIndex) {\n if (Object.keys(references).length) {\n let message = this.messages[messageIndex];\n const content = message.content || '';\n\n // Only include references that were actually cited in the response.\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\n const citedRefs = Object.entries(references).filter(([key, value]) =>\n content.includes(key) || content.includes(`${value.index}`)\n );\n\n if (!citedRefs.length) {\n return;\n }\n\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\n let processed = content.trim();\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processed = processed.replaceAll(key, placeholder);\n processed = processed.replaceAll(`${value.index}`, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processed = processed.replaceAll('', ',');\n\n processed += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || `[doc:${value.index}]`;\n processed += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n\n message.content = processed;\n message.htmlContent = parseMarkdownContent(processed, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Save any settings that were deferred during streaming.\n if (this.settingsDirty) {\n this.debouncedSaveSettings();\n }\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio();\n this.ttsPlayingMessageIndex = index;\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is currently playing, queue this blob for later.\n if (this.isPlayingAudio && this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.isPlayingAudio = false;\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n const nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var itemId = this.getItemId();\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, continuation is handled\n // by the persistent stream.\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getItemId() {\n return this.inputElement.getAttribute('data-interaction-id')\n || this.inputElement.getAttribute('data-item-id');\n },\n getSaveIndicatorElement() {\n if (config.saveIndicatorElementSelector) {\n return document.querySelector(config.saveIndicatorElementSelector);\n }\n\n return document.querySelector('[data-chat-interaction-save-indicator]');\n },\n showSaveIndicator(text, className) {\n const indicator = this.getSaveIndicatorElement();\n if (!indicator) {\n return;\n }\n\n indicator.textContent = text || '';\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\n\n if (this.saveIndicatorTimeout) {\n clearTimeout(this.saveIndicatorTimeout);\n this.saveIndicatorTimeout = null;\n }\n\n if (!text) {\n return;\n }\n\n this.saveIndicatorTimeout = setTimeout(() => {\n indicator.textContent = '';\n this.saveIndicatorTimeout = null;\n }, 3000);\n },\n clearPendingSettingsSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n },\n getFieldLabel(input) {\n const label = input\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\n ?.querySelector('label');\n\n if (!label) {\n return input.dataset.setting || 'This field';\n }\n\n return (label.textContent || '')\n .replace(/\\s+/g, ' ')\n .trim()\n || input.dataset.setting\n || 'This field';\n },\n getValidationFeedbackElement(input) {\n let feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n return feedback;\n }\n\n feedback = document.createElement('div');\n feedback.className = 'invalid-feedback';\n input.insertAdjacentElement('afterend', feedback);\n\n return feedback;\n },\n clearSettingValidationError(input) {\n input.classList.remove('is-invalid');\n input.removeAttribute('aria-invalid');\n\n const feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n feedback.textContent = '';\n }\n },\n setSettingValidationError(input, message) {\n const feedback = this.getValidationFeedbackElement(input);\n input.classList.add('is-invalid');\n input.setAttribute('aria-invalid', 'true');\n feedback.textContent = message;\n },\n getSettingValidationMessage(input) {\n if (!input || input.disabled || input.type !== 'number') {\n return null;\n }\n\n const value = (input.value || '').trim();\n if (!value) {\n return null;\n }\n\n const number = Number(value);\n const fieldLabel = this.getFieldLabel(input);\n\n if (Number.isNaN(number)) {\n return `${fieldLabel} must be a valid number.`;\n }\n\n const min = input.getAttribute('min');\n if (min !== null && number < Number(min)) {\n return `${fieldLabel} must be ${min} or greater.`;\n }\n\n const max = input.getAttribute('max');\n if (max !== null && number > Number(max)) {\n return `${fieldLabel} must be ${max} or less.`;\n }\n\n return null;\n },\n validateSettingInput(input) {\n const message = this.getSettingValidationMessage(input);\n if (!message) {\n this.clearSettingValidationError(input);\n return true;\n }\n\n this.setSettingValidationError(input, message);\n return false;\n },\n validateSettings() {\n let isValid = true;\n\n this.getSettingInputs().forEach(input => {\n isValid = this.validateSettingInput(input) && isValid;\n });\n\n return isValid;\n },\n queueSettingsSave() {\n if (!this.validateSettings()) {\n this.clearPendingSettingsSave();\n this.settingsDirty = false;\n this.showSaveIndicator('Fix errors', 'text-danger');\n return;\n }\n\n this.settingsDirty = true;\n this.showSaveIndicator('Saving...', 'text-warning');\n this.debouncedSaveSettings();\n },\n getSettingInputs() {\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\n if (explicitInputs.length > 0) {\n return explicitInputs;\n }\n\n return document.querySelectorAll(\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\n );\n },\n getSelectedGroupValues(groupName, fallbackSelector) {\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked`);\n if (explicitSelections.length > 0) {\n const values = [];\n\n explicitSelections.forEach(checkbox => {\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\n if (value) {\n values.push(value);\n }\n });\n\n return values;\n }\n\n if (!fallbackSelector) {\n return [];\n }\n\n const values = [];\n const checkboxes = document.querySelectorAll(fallbackSelector);\n\n checkboxes.forEach(checkbox => {\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\n\n if (hiddenInput && hiddenInput.value) {\n values.push(hiddenInput.value);\n }\n });\n\n return values;\n },\n getPromptTemplateSelections() {\n const promptTemplates = [];\n\n document.querySelectorAll('.prompt-template-card').forEach(card => {\n const templateIdInput = card.querySelector('.prompt-template-id-input');\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\n\n if (!templateId) {\n return;\n }\n\n promptTemplates.push({\n templateId: templateId,\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\n });\n });\n\n return promptTemplates;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n // Replace existing notification with same type, or add new one.\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var itemId = this.getItemId();\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\n .catch(err => console.error('Failed to handle notification action:', err));\n },\n setItemId(itemId) {\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\n this.inputElement.setAttribute('data-item-id', itemId || '');\n },\n resetInteraction() {\n this.setItemId('');\n this.isInteractionStarted = false;\n this.messages = [];\n this.showPlaceholder();\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keyup', event => {\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.inputElement.addEventListener('paste', (e) => {\n // Use setTimeout to allow the paste to complete before checking the value\n setTimeout(() => {\n this.prompt = this.inputElement.value;\n if (this.inputElement.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n }, 0);\n });\n\n this.buttonElement.addEventListener('click', () => {\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\n\n for (var i = 0; i < chatInteractionItems.length; i++) {\n chatInteractionItems[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var itemId = e.target.getAttribute('data-interaction-id');\n\n if (!itemId) {\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\n return;\n }\n\n this.loadInteraction(itemId);\n });\n }\n\n for (let i = 0; i < config.messages.length; i++) {\n this.addMessage(config.messages[i]);\n }\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n document.addEventListener('input', event => {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('change', event => {\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .group-toggle, .ci-agent-global-toggle')) {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n }\n\n this.queueSettingsSave();\n return;\n }\n\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('click', event => {\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\n return;\n }\n\n setTimeout(() => {\n this.queueSettingsSave();\n }, 0);\n });\n\n // Add event listener for clear history button\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.addEventListener('click', () => {\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\n if (itemId) {\n this.clearHistory(itemId);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n },\n loadInteraction(itemId) {\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\n },\n reloadCurrentInteraction() {\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n },\n clearHistory(itemId) {\n const self = this;\n confirmDialog({\n title: config.clearHistoryTitle,\n message: config.clearHistoryMessage,\n okText: config.clearHistoryOkText,\n cancelText: config.clearHistoryCancelText,\n callback: function (confirmed) {\n if (confirmed) {\n // Cancel any active stream before clearing history.\n if (self.stream) {\n self.stream.dispose();\n self.stream = null;\n self.hideTypingIndicator();\n self.streamingFinished();\n }\n\n self.connection.invoke(\"ClearHistory\", itemId)\n .catch(err => console.error('Error clearing history:', err));\n }\n }\n });\n },\n debouncedSaveSettings() {\n // Clear any existing timeout to reset the debounce timer\n this.clearPendingSettingsSave();\n\n // Don't save while streaming — it will be saved when streaming completes.\n if (this.stream) {\n return;\n }\n\n // Set a new timeout to save after 850ms of no changes\n this.saveSettingsTimeout = setTimeout(() => {\n if (this.settingsDirty) {\n this.saveSettings();\n this.settingsDirty = false;\n }\n this.saveSettingsTimeout = null;\n }, 850);\n },\n getSelectedToolNames() {\n return this.getSelectedGroupValues(\n 'toolNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\n );\n },\n getSelectedMcpConnectionIds() {\n return this.getSelectedGroupValues(\n 'mcpConnectionIds',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\n );\n },\n getSelectedA2AConnectionIds() {\n return this.getSelectedGroupValues('a2aConnectionIds');\n },\n getSelectedAgentNames() {\n return this.getSelectedGroupValues(\n 'agentNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\n );\n },\n saveSettings() {\n const itemId = this.getItemId();\n if (!itemId) {\n return Promise.resolve();\n }\n\n if (!this.validateSettings()) {\n this.showSaveIndicator('Fix errors', 'text-danger');\n return Promise.resolve();\n }\n\n const settings = {};\n\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\n // This avoids coupling the JS to specific field names — new fields added by\n // any module are automatically included.\n const inputs = this.getSettingInputs();\n\n inputs.forEach(input => {\n const key = input.dataset.setting\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\n\n if (!key) {\n return;\n }\n\n if (input.type === 'checkbox') {\n settings[key] = input.checked;\n } else if (input.type === 'number') {\n settings[key] = input.value ? parseFloat(input.value) : null;\n } else {\n settings[key] = input.value || null;\n }\n });\n\n // Add tool, MCP connection, and agent collections (special handling).\n settings.toolNames = this.getSelectedToolNames();\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\n settings.agentNames = this.getSelectedAgentNames();\n\n const promptTemplates = this.getPromptTemplateSelections();\n if (promptTemplates.length > 0) {\n settings.promptTemplates = promptTemplates;\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\n }\n\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\n .catch(err => {\n console.error('Error saving settings:', err);\n this.showSaveIndicator('Save failed', 'text-danger');\n });\n },\n flushPendingSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n\n if (this.settingsDirty) {\n this.settingsDirty = false;\n return this.saveSettings();\n }\n\n return Promise.resolve();\n },\n initializeInteraction(itemId, force) {\n if (this.isInteractionStarted && !force) {\n return;\n }\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\n this.setItemId(itemId);\n this.isInteractionStarted = true;\n },\n copyResponse(message) {\n navigator.clipboard.writeText(message);\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var itemId = this.getItemId();\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n }\n },\n watch: {\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n return {\n initialize: initialize\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} \ No newline at end of file +{"version":3,"sources":["chat-interaction.js"],"names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_arrayLikeToArray","toString","slice","constructor","name","from","test","window","chatInteractionManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","codeCopiedText","assistantLabel","messageTemplate","indicatorTemplate","untitledText","clearHistoryTitle","clearHistoryMessage","clearHistoryOkText","clearHistoryCancelText","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","renderer","marked","Renderer","link","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","__chartConfigs","createChartHtml","chartId","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","tryExtractChartMarker","startIndex","type","raw","substring","endIndex","json","token","push","config","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","renderChartsInMessage","message","charts","requestAnimationFrame","_iterator","_step","canvas","getElementById","Chart","console","warn","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","err","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","initialize","instanceConfig","assign","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isInteractionStarted","isPlaceholderVisible","isStreaming","isNavigatingAway","autoScroll","stream","messages","prompt","initialFieldValues","Map","settingsDirty","saveSettingsTimeout","saveIndicatorTimeout","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","Math","random","conversationModeEnabled","conversationButton","isConversationMode","notifications","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","startConnection","_this","_callee","_t","_context","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","initializeInteraction","itemId","titleInput","querySelector","title","forEach","msg","addMessage","$nextTick","historyItem","showSaveIndicator","stopRecording","isFinal","_conversationPartialTranscript","escaped","replace","_conversationPartialMessage","hidePlaceholder","htmlContent","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","index","messageId","responseId","appearance","hideTypingIndicator","j","msgIndex","newMessage","id","normalizeAssistantAppearance","base64Audio","contentType","binaryString","atob","bytes","Uint8Array","charCodeAt","playCollectedAudio","showPlaceholder","clearHistoryBtn","classList","add","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentInteraction","onclose","addMessageInternal","_this2","fireEvent","CustomEvent","detail","_this3","processedContent","references","_typeof","keys","citedRefs","entries","filter","_ref","_ref2","_slicedToArray","key","includes","sort","_ref3","_ref4","_ref5","_ref6","b","displayIndex","_iterator2","_step2","_step2$value","replaceAll","_displayIndex","_placeholder","_iterator3","_step3","_step3$value","_iterator4","_step4","_step4$value","label","remove","event","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","isIndicator","sendMessage","_this4","_callee2","trimmedPrompt","_context2","flushPendingSave","streamMessage","_this5","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentItemId","getItemId","subscribe","chunk","sessionId","setItemId","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","complete","_this5$stream","processReferences","streamingFinished","synthesizeSpeech","_this5$stream2","getServiceDownMessage","_this6","_ref7","_ref8","_ref9","_ref0","_ref1","_ref10","processed","_iterator5","_step5","_step5$value","_iterator6","_step6","_step6$value","_iterator7","_step7","_step7$value","stopIcon","getAttribute","replaceChildren","RETURN_DOM_FRAGMENT","startIcon","icons","querySelectorAll","debouncedSaveSettings","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this7","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","totalLength","reduce","sum","combined","offset","_iterator8","_step8","set","blob","Blob","_this8","URL","createObjectURL","audio","Audio","addEventListener","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this9","updateConversationButton","navigator","mediaDevices","getUserMedia","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","_conversationSubject","Subject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","micSource","createMediaStreamSource","connect","pendingChunk","analyser","interruptVolumeThreshold","size","freqData","frequencyBinCount","getByteFrequencyData","k","avg","_callee3","uint8Array","base64","_context3","arrayBuffer","str","byte","String","fromCharCode","btoa","getTracks","track","stop","documentElement","send","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","originalLength","removedCount","_this0","setTimeout","scrollTop","scrollHeight","clientHeight","handleUserInput","target","getSaveIndicatorElement","saveIndicatorElementSelector","className","_this1","indicator","clearTimeout","clearPendingSettingsSave","getFieldLabel","input","_input$closest","closest","dataset","setting","getValidationFeedbackElement","feedback","nextElementSibling","contains","insertAdjacentElement","clearSettingValidationError","removeAttribute","setSettingValidationError","setAttribute","getSettingValidationMessage","disabled","number","Number","fieldLabel","isNaN","min","max","validateSettingInput","validateSettings","_this10","isValid","getSettingInputs","queueSettingsSave","explicitInputs","getSelectedGroupValues","groupName","fallbackSelector","explicitSelections","values","checkbox","checkboxes","baseName","hiddenInput","getPromptTemplateSelections","promptTemplates","card","templateIdInput","promptParametersInput","templateId","promptParameters","clearNotificationDismiss","findIndex","splice","scheduleNotificationDismiss","_this11","timerId","dismissNotification","handleNotificationAction","actionName","resetInteraction","initializeApp","_this12","placeholderElementSelector","loadInteraction","threshold","atBottom","shiftKey","click","lastMsg","pop","chatInteractionItems","getElementsByClassName","preventDefault","btn","block","codeEl","clipboard","writeText","copiedText","matches","clearHistory","micButtonElementSelector","style","display","toggleRecording","conversationButtonElementSelector","self","confirmDialog","okText","cancelText","callback","confirmed","_this13","saveSettings","getSelectedToolNames","getSelectedMcpConnectionIds","getSelectedA2AConnectionIds","getSelectedAgentNames","_this14","settings","inputs","match","toLowerCase","checked","parseFloat","toolNames","mcpConnectionIds","a2aConnectionIds","agentNames","promptTemplateIds","map","template","force","copyResponse","startRecording","_this15","subject","_callee4","_context4","updateMicButton","watch","active","mounted","_this16","_callee5","_context5","beforeUnmount","removeEventListener","mount","download","toDataURL","container","img","startsWith","fetch","res","body","appendChild","removeChild"],"mappings":"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","file":"chat-interaction.js","sourcesContent":["window.chatInteractionManager = function () {\r\n\r\n // Defaults (can be overridden by instanceConfig)\r\n var defaultConfig = {\r\n // UI defaults for generated media\r\n generatedImageAltText: 'Generated Image',\r\n generatedImageMaxWidth: 400,\r\n downloadImageTitle: 'Download image',\r\n downloadChartTitle: 'Download chart as image',\r\n downloadChartButtonText: 'Download',\r\n codeCopiedText: 'Copied!',\r\n assistantLabel: 'Assistant',\r\n\r\n messageTemplate: `\r\n
\r\n
\r\n
\r\n
You
\r\n
\r\n \r\n {{ getAssistantLabel(message) }}\r\n
\r\n
\r\n

{{ message.title }}

\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{ notification.content }}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n `,\r\n indicatorTemplate: `\r\n
\r\n \r\n Assistant\r\n
\r\n `,\r\n // Localizable strings\r\n untitledText: 'Untitled',\r\n clearHistoryTitle: 'Clear History',\r\n clearHistoryMessage: 'Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.',\r\n clearHistoryOkText: 'Yes',\r\n clearHistoryCancelText: 'Cancel'\r\n };\r\n\r\n // Sanitize URLs to prevent javascript: protocol injection.\r\n function sanitizeUrl(url) {\r\n if (!url) return '';\r\n var trimmed = url.trim();\r\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\r\n return '';\r\n }\r\n return url;\r\n }\r\n\r\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\r\n function escapeHtmlEntities(text) {\r\n var span = document.createElement('span');\r\n span.textContent = text;\r\n return span.innerHTML;\r\n }\r\n\r\n const renderer = new marked.Renderer();\r\n\r\n // Modify the link rendering to open in a new tab\r\n renderer.link = function (data) {\r\n var href = sanitizeUrl(data.href);\r\n if (!href) return data.text || '';\r\n return `
${data.text}`;\r\n };\r\n\r\n // Custom code block renderer with highlight.js integration and copy button.\r\n renderer.code = function (data) {\r\n var code = data.text || '';\r\n var lang = (data.lang || '').trim();\r\n var highlighted = code;\r\n\r\n if (typeof hljs !== 'undefined') {\r\n if (lang && hljs.getLanguage(lang)) {\r\n try {\r\n highlighted = hljs.highlight(code, { language: lang }).value;\r\n } catch (_) { }\r\n } else {\r\n try {\r\n highlighted = hljs.highlightAuto(code).value;\r\n } catch (_) { }\r\n }\r\n } else {\r\n highlighted = escapeHtmlEntities(code);\r\n }\r\n\r\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\r\n return `
${langDisplay}
${highlighted}
`;\r\n };\r\n\r\n // Custom image renderer for generated images with thumbnail styling and download button.\r\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\r\n renderer.image = function (data) {\r\n const src = sanitizeUrl(data.href);\r\n if (!src) return '';\r\n const alt = data.text || defaultConfig.generatedImageAltText;\r\n const maxWidth = defaultConfig.generatedImageMaxWidth;\r\n return `
\r\n \"${alt}\"\r\n
\r\n \r\n \r\n \r\n
\r\n
`;\r\n };\r\n\r\n // Chart counter for unique IDs\r\n let chartCounter = 0;\r\n\r\n // Collector for charts discovered during marked parsing.\r\n let _pendingCharts = [];\r\n\r\n // Global chart config map shared with ai-chat.js\r\n window.__chartConfigs = window.__chartConfigs || {};\r\n\r\n function createChartHtml(chartId) {\r\n return `
`\r\n + ``\r\n + `
`\r\n + `
`\r\n + ``\r\n + `
`;\r\n }\r\n\r\n // Register [chart:{...json...}] as a native marked block extension so the\r\n // markdown parser handles chart markers inline with surrounding text.\r\n marked.use({\r\n extensions: [{\r\n name: 'chart',\r\n level: 'block',\r\n start(src) {\r\n const idx = src.indexOf('[chart:');\r\n return idx >= 0 ? idx : undefined;\r\n },\r\n tokenizer(src) {\r\n const extracted = tryExtractChartMarker(src);\r\n if (!extracted || extracted.startIndex !== 0) {\r\n return undefined;\r\n }\r\n\r\n const chartId = `chat_chart_${++chartCounter}`;\r\n\r\n return {\r\n type: 'chart',\r\n raw: src.substring(0, extracted.endIndex),\r\n chartId: chartId,\r\n json: extracted.json,\r\n };\r\n },\r\n renderer(token) {\r\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\r\n window.__chartConfigs[token.chartId] = token.json;\r\n return createChartHtml(token.chartId);\r\n }\r\n }]\r\n });\r\n\r\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\r\n function tryExtractChartMarker(text) {\r\n const token = '[chart:';\r\n const start = text.indexOf(token);\r\n if (start < 0) {\r\n return null;\r\n }\r\n\r\n // Find JSON object boundary by balancing braces\r\n const jsonStart = start + token.length;\r\n let i = jsonStart;\r\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\r\n i++;\r\n }\r\n\r\n if (i >= text.length || text[i] !== '{') {\r\n return null;\r\n }\r\n\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n\r\n for (; i < text.length; i++) {\r\n const ch = text[i];\r\n\r\n if (inString) {\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n if (ch === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n inString = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n depth++;\r\n } else if (ch === '}') {\r\n depth--;\r\n if (depth === 0) {\r\n const jsonEnd = i;\r\n // Expect closing bracket after JSON\r\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\r\n if (closeBracketIndex < 0) {\r\n return null;\r\n }\r\n\r\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\r\n return {\r\n startIndex: start,\r\n endIndex: closeBracketIndex + 1,\r\n json: json\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function renderChartsInMessage(message) {\r\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\r\n return;\r\n }\r\n\r\n // Copy and clear pending charts immediately to prevent duplicate renders.\r\n const charts = [...message._pendingCharts];\r\n message._pendingCharts = [];\r\n\r\n // Defer to requestAnimationFrame so the browser has fully laid out the\r\n // canvas elements before Chart.js reads their dimensions.\r\n requestAnimationFrame(() => {\r\n for (const c of charts) {\r\n const canvas = document.getElementById(c.chartId);\r\n if (!canvas) {\r\n continue;\r\n }\r\n\r\n if (typeof Chart === 'undefined') {\r\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\r\n continue;\r\n }\r\n\r\n // When the canvas is inside a hidden container (e.g., display:none),\r\n // it has zero dimensions. Keep the config for later rendering.\r\n if (canvas.offsetParent === null) {\r\n window.__chartConfigs[c.chartId] = c.config;\r\n continue;\r\n }\r\n\r\n try {\r\n // Destroy existing chart instance if re-rendering\r\n if (canvas._chartInstance) {\r\n canvas._chartInstance.destroy();\r\n }\r\n\r\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\r\n cfg.options ??= {};\r\n cfg.options.responsive = true;\r\n cfg.options.maintainAspectRatio = true;\r\n cfg.options.aspectRatio ??= 4 / 3;\r\n\r\n canvas._chartInstance = new Chart(canvas, cfg);\r\n } catch (e) {\r\n console.error('Error creating chart:', e);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Parse markdown content via marked (which natively handles [chart:...] markers\r\n // through the registered extension) and collect pending chart configs for later\r\n // Chart.js rendering.\r\n function parseMarkdownContent(content, message) {\r\n _pendingCharts = [];\r\n const html = marked.parse(content, { renderer });\r\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\r\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\r\n }\r\n\r\n const initialize = (instanceConfig) => {\r\n\r\n const config = Object.assign({}, defaultConfig, instanceConfig);\r\n // Keep defaultConfig in sync so renderers use overridden values\r\n defaultConfig = config;\r\n\r\n if (!config.signalRHubUrl) {\r\n console.error('The signalRHubUrl is required.');\r\n return;\r\n }\r\n\r\n if (!config.appElementSelector) {\r\n console.error('The appElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.chatContainerElementSelector) {\r\n console.error('The chatContainerElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.inputElementSelector) {\r\n console.error('The inputElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.sendButtonElementSelector) {\r\n console.error('The sendButtonElementSelector is required.');\r\n return;\r\n }\r\n\r\n const app = Vue.createApp({\r\n data() {\r\n return {\r\n inputElement: null,\r\n buttonElement: null,\r\n chatContainer: null,\r\n placeholder: null,\r\n isInteractionStarted: false,\r\n isPlaceholderVisible: true,\r\n isStreaming: false,\r\n isNavigatingAway: false,\r\n autoScroll: true,\r\n stream: null,\r\n messages: [],\r\n prompt: '',\r\n initialFieldValues: new Map(),\r\n settingsDirty: false,\r\n saveSettingsTimeout: null,\r\n saveIndicatorTimeout: null,\r\n isRecording: false,\r\n mediaRecorder: null,\r\n preRecordingPrompt: '',\r\n micButton: null,\r\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\r\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\r\n ttsVoiceName: config.ttsVoiceName || null,\r\n audioChunks: [],\r\n audioPlayQueue: [],\r\n isPlayingAudio: false,\r\n currentAudioElement: null,\r\n currentAudioUrl: null,\r\n ttsPlayingMessageIndex: -1,\r\n ttsAudioCache: {},\r\n ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2),\r\n conversationModeEnabled: config.chatMode === 'Conversation',\r\n conversationButton: null,\r\n isConversationMode: false,\r\n notifications: [],\r\n notificationDismissTimers: {},\r\n };\r\n },\r\n computed: {\r\n lastAssistantIndex() {\r\n for (var i = this.messages.length - 1; i >= 0; i--) {\r\n if (this.messages[i].role === 'assistant') {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n },\r\n methods: {\r\n handleBeforeUnload() {\r\n this.isNavigatingAway = true;\r\n },\r\n async startConnection() {\r\n this.connection = new signalR.HubConnectionBuilder()\r\n .withUrl(config.signalRHubUrl)\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n // Allow long-running operations (e.g., multi-step MCP tool calls)\r\n // without the client disconnecting prematurely.\r\n this.connection.serverTimeoutInMilliseconds = 600000;\r\n this.connection.keepAliveIntervalInMilliseconds = 15000;\r\n\r\n this.connection.on(\"LoadInteraction\", (data) => {\r\n this.initializeInteraction(data.itemId, true);\r\n this.messages = [];// Update the title field if it exists\r\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\r\n if (titleInput && data.title) {\r\n titleInput.value = data.title;\r\n }\r\n\r\n (data.messages ?? []).forEach(msg => {\r\n this.addMessage(msg);\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n });\r\n });\r\n });\r\n\r\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\r\n // Update the history list item if it exists\r\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\r\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\r\n if (historyItem) {\r\n historyItem.textContent = title || config.untitledText;\r\n }\r\n\r\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\r\n if (titleInput && title) {\r\n titleInput.value = title;\r\n }\r\n\r\n this.showSaveIndicator('Saved', 'text-success');\r\n });\r\n\r\n this.connection.on(\"ReceiveError\", (error) => {\r\n console.error(\"SignalR Error: \", error);\r\n this.showSaveIndicator('Save failed', 'text-danger');\r\n\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\r\n if (this.isConversationMode) {\r\n if (!isFinal && text) {\r\n this._conversationPartialTranscript = text;\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n var html = '

' + escaped + '

';\r\n\r\n // Show partial transcript as a live user message.\r\n if (!this._conversationPartialMessage) {\r\n this.hidePlaceholder();\r\n this._conversationPartialMessage = {\r\n role: 'user',\r\n content: text,\r\n htmlContent: html,\r\n isPartial: true\r\n };\r\n this.messages.push(this._conversationPartialMessage);\r\n } else {\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = html;\r\n }\r\n this.scrollToBottom();\r\n }\r\n return;\r\n }\r\n\r\n if (text && !this._audioInputSent) {\r\n this.prompt = this.preRecordingPrompt + text;\r\n if (this.inputElement) {\r\n this.inputElement.value = this.prompt;\r\n this.inputElement.dispatchEvent(new Event('input'));\r\n }\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, text) => {\r\n if (text) {\r\n this.stopAudio();\r\n\r\n // If there's an interrupted assistant message still streaming,\r\n // mark it as done to stop the spinner animation.\r\n if (this._conversationAssistantMessage) {\r\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\r\n if (oldMsg) {\r\n oldMsg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Replace the partial transcript message with the final one.\r\n if (this._conversationPartialMessage) {\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\r\n this._conversationPartialMessage.isPartial = false;\r\n this._conversationPartialMessage = null;\r\n } else {\r\n this.addMessage({\r\n role: 'user',\r\n content: text\r\n });\r\n }\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, appearance) => {\r\n if (!this._conversationAssistantMessage) {\r\n this.stopAudio();\r\n this.hideTypingIndicator();\r\n\r\n // Ensure no stale streaming indicators remain from prior messages.\r\n for (var j = 0; j < this.messages.length; j++) {\r\n if (this.messages[j].isStreaming) {\r\n this.messages[j].isStreaming = false;\r\n }\r\n }\r\n\r\n var msgIndex = this.messages.length;\r\n var newMessage = {\r\n id: messageId,\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n appearance: this.normalizeAssistantAppearance(appearance),\r\n };\r\n this.messages.push(newMessage);\r\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\r\n }\r\n\r\n this._conversationAssistantMessage.content += token;\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n if (!msg.appearance) {\r\n msg.appearance = this.normalizeAssistantAppearance(appearance);\r\n }\r\n msg.content = this._conversationAssistantMessage.content;\r\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n this.scrollToBottom();\r\n });\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId) => {\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\r\n if (base64Audio) {\r\n const binaryString = atob(base64Audio);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n this.audioChunks.push(bytes);\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\r\n this.playCollectedAudio();\r\n });\r\n\r\n this.connection.on(\"HistoryCleared\", (itemId) => {\r\n // Clear messages and show placeholder\r\n this.messages = [];\r\n this.showPlaceholder();\r\n\r\n // Hide the clear history button since there's no history now\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.classList.add('d-none');\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveNotification\", (notification) => {\r\n this.receiveNotification(notification);\r\n });\r\n\r\n this.connection.on(\"UpdateNotification\", (notification) => {\r\n this.updateNotification(notification);\r\n });\r\n\r\n this.connection.on(\"RemoveNotification\", (notificationType) => {\r\n this.removeNotification(notificationType);\r\n });\r\n\r\n this.connection.onreconnecting(() => {\r\n console.warn(\"SignalR: reconnecting...\");\r\n });\r\n\r\n this.connection.onreconnected(() => {\r\n console.info(\"SignalR: reconnected.\");\r\n this.reloadCurrentInteraction();\r\n });\r\n\r\n this.connection.onclose((error) => {\r\n if (this.isNavigatingAway) {\r\n return;\r\n }\r\n\r\n if (error) {\r\n console.warn(\"SignalR connection closed with error:\", error.message || error);\r\n }\r\n });\r\n\r\n try {\r\n await this.connection.start();\r\n } catch (err) {\r\n console.error(\"SignalR Connection Error: \", err);\r\n }\r\n },\r\n addMessageInternal(message) {\r\n if (message.role === 'assistant') {\r\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\r\n }\r\n\r\n if (message.content && !message.htmlContent) {\r\n message.htmlContent = parseMarkdownContent(message.content, message);\r\n }\r\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\r\n this.messages.push(message);\r\n\r\n this.$nextTick(() => {\r\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\r\n });\r\n },\r\n addMessage(message) {\r\n if (message.content) {\r\n let processedContent = message.content.trim();\r\n\r\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\r\n\r\n // Only include references that were actually cited in the response.\r\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\r\n\r\n if (citedRefs.length) {\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders.\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processedContent = processedContent.replaceAll(key, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processedContent = processedContent.replaceAll('
', ',');\r\n\r\n processedContent += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || `[doc:${value.index}]`;\r\n processedContent += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n }\r\n }\r\n\r\n message.content = processedContent;\r\n message.htmlContent = parseMarkdownContent(processedContent, message);\r\n }\r\n\r\n this.addMessageInternal(message);\r\n this.hidePlaceholder();\r\n\r\n this.$nextTick(() => {\r\n // Render any pending charts once the DOM is updated\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n hidePlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.add('d-none');\r\n }\r\n this.isPlaceholderVisible = false;\r\n },\r\n showPlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.remove('d-none');\r\n }\r\n this.isPlaceholderVisible = true;\r\n },\r\n fireEvent(event) {\r\n document.dispatchEvent(event);\r\n },\r\n normalizeAssistantAppearance(appearance) {\r\n if (!appearance) {\r\n return null;\r\n }\r\n\r\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\r\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\r\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\r\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\r\n\r\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\r\n return null;\r\n }\r\n\r\n return {\r\n label: label,\r\n icon: icon,\r\n cssClass: cssClass,\r\n disableStreamingAnimation: disableStreamingAnimation,\r\n };\r\n },\r\n getAssistantLabel(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\r\n },\r\n getAssistantRoleClasses(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n var classes = ['ai-chat-msg-role'];\r\n\r\n if (appearance && appearance.cssClass) {\r\n classes.push(appearance.cssClass);\r\n } else {\r\n classes.push('ai-chat-msg-role-assistant');\r\n }\r\n\r\n return classes;\r\n },\r\n getAssistantIconClasses(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\r\n },\r\n getAssistantIcon(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\r\n },\r\n shouldAnimateAssistantIcon(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return !!message &&\r\n message.isStreaming &&\r\n index === this.lastAssistantIndex &&\r\n !(appearance && appearance.disableStreamingAnimation);\r\n },\r\n isIndicator(message) {\r\n return message.role === 'indicator';\r\n },\r\n async sendMessage() {\r\n let trimmedPrompt = this.prompt.trim();\r\n\r\n if (!trimmedPrompt) {\r\n return;\r\n }\r\n\r\n // Stop any active recording before sending.\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\r\n this._audioInputSent = true;\r\n\r\n // Flush any pending settings save before sending a message\r\n // to prevent concurrent hub calls that can cause database deadlocks.\r\n await this.flushPendingSave();\r\n\r\n this.addMessage({\r\n role: 'user',\r\n content: trimmedPrompt\r\n });\r\n\r\n // Show the clear history button since we now have prompts\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.classList.remove('d-none');\r\n }\r\n\r\n this.streamMessage(trimmedPrompt);\r\n this.inputElement.value = '';\r\n this.prompt = '';\r\n },\r\n streamMessage(trimmedPrompt) {\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n\r\n this.streamingStarted();\r\n this.showTypingIndicator();\r\n this.autoScroll = true;\r\n\r\n var content = '';\r\n var references = {};\r\n var lastResponseId = null;\r\n\r\n var messageIndex = this.messages.length;\r\n var currentItemId = this.getItemId();\r\n\r\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\r\n .subscribe({\r\n next: (chunk) => {\r\n let message = this.messages[messageIndex];\r\n\r\n if (!message) {\r\n if (chunk.sessionId && !currentItemId) {\r\n this.setItemId(chunk.sessionId);\r\n }\r\n\r\n this.hideTypingIndicator();\r\n messageIndex = this.messages.length;\r\n let newMessage = {\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n };\r\n\r\n this.messages.push(newMessage);\r\n message = newMessage;\r\n }\r\n\r\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\r\n for (const [key, value] of Object.entries(chunk.references)) {\r\n references[key] = value;\r\n }\r\n }\r\n\r\n if (chunk.content) {\r\n // When the responseId changes (e.g., after an internal tool call),\r\n // insert a line break to visually separate response segments.\r\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\r\n content += '\\n\\n';\r\n }\r\n\r\n if (chunk.responseId) {\r\n lastResponseId = chunk.responseId;\r\n }\r\n\r\n let processedContent = chunk.content;\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n processedContent = processedContent.replaceAll(key, `${value.index}`);\r\n }\r\n\r\n content += processedContent.replaceAll('
', ',');\r\n }\r\n\r\n message.content = content;\r\n\r\n message.htmlContent = parseMarkdownContent(content, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n complete: () => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n if (!msg || !msg.content) {\r\n // No content received at all.\r\n this.hideTypingIndicator();\r\n }\r\n\r\n // Trigger text-to-speech only in conversation mode.\r\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\r\n this.synthesizeSpeech(msg.content);\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n },\r\n error: (err) => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n this.hideTypingIndicator();\r\n\r\n if (!this.isNavigatingAway) {\r\n this.addMessage(this.getServiceDownMessage());\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n\r\n console.error(\"Stream error:\", err);\r\n }\r\n });\r\n },\r\n getServiceDownMessage() {\r\n return {\r\n role: \"assistant\",\r\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\r\n htmlContent: \"\",\r\n };\r\n },\r\n processReferences(references, messageIndex) {\r\n if (Object.keys(references).length) {\r\n let message = this.messages[messageIndex];\r\n const content = message.content || '';\r\n\r\n // Only include references that were actually cited in the response.\r\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\r\n const citedRefs = Object.entries(references).filter(([key, value]) =>\r\n content.includes(key) || content.includes(`${value.index}`)\r\n );\r\n\r\n if (!citedRefs.length) {\r\n return;\r\n }\r\n\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\r\n let processed = content.trim();\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processed = processed.replaceAll(key, placeholder);\r\n processed = processed.replaceAll(`${value.index}`, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processed = processed.replaceAll('', ',');\r\n\r\n processed += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || `[doc:${value.index}]`;\r\n processed += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n\r\n message.content = processed;\r\n message.htmlContent = parseMarkdownContent(processed, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n }\r\n },\r\n streamingStarted() {\r\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\r\n\r\n if (stopIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n },\r\n streamingFinished() {\r\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\r\n\r\n if (startIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n // Directly manipulate the DOM to stop all streaming animations.\r\n if (this.chatContainer) {\r\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\r\n for (var i = 0; i < icons.length; i++) {\r\n icons[i].classList.remove('ai-streaming-icon');\r\n icons[i].classList.add('ai-bot-icon');\r\n }\r\n }\r\n\r\n // Also update Vue data for consistency.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Save any settings that were deferred during streaming.\r\n if (this.settingsDirty) {\r\n this.debouncedSaveSettings();\r\n }\r\n },\r\n handleExternalTtsStop(e) {\r\n if (e?.detail?.sourceId === this.ttsInstanceId) {\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n },\r\n synthesizeSpeech(text, cacheIndex) {\r\n if (!this.textToSpeechEnabled || !text || !this.connection) {\r\n return;\r\n }\r\n\r\n this.audioChunks = [];\r\n this.isPlayingAudio = true;\r\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\r\n\r\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\r\n .catch(err => {\r\n console.error(\"TTS synthesis error:\", err);\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this._ttsCacheIndex = -1;\r\n });\r\n },\r\n toggleMessageTts(message, index) {\r\n if (this.ttsPlayingMessageIndex === index) {\r\n this.stopAudio();\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\r\n detail: { sourceId: this.ttsInstanceId }\r\n }));\r\n this.ttsPlayingMessageIndex = index;\r\n\r\n if (this.ttsAudioCache[index]) {\r\n this.playAudioBlob(this.ttsAudioCache[index]);\r\n return;\r\n }\r\n\r\n this.synthesizeSpeech(message.content, index);\r\n },\r\n playCollectedAudio() {\r\n if (this.audioChunks.length === 0) {\r\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n }\r\n return;\r\n }\r\n\r\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\r\n const combined = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const chunk of this.audioChunks) {\r\n combined.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n this.audioChunks = [];\r\n\r\n const blob = new Blob([combined], { type: 'audio/mp3' });\r\n\r\n if (this._ttsCacheIndex >= 0) {\r\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\r\n this._ttsCacheIndex = -1;\r\n }\r\n\r\n // If audio is currently playing, queue this blob for later.\r\n if (this.isPlayingAudio && this.currentAudioElement) {\r\n this.audioPlayQueue.push(blob);\r\n return;\r\n }\r\n\r\n this.playAudioBlob(blob);\r\n },\r\n playAudioBlob(blob) {\r\n const url = URL.createObjectURL(blob);\r\n const audio = new Audio(url);\r\n\r\n this.currentAudioUrl = url;\r\n this.currentAudioElement = audio;\r\n this.isPlayingAudio = true;\r\n\r\n audio.addEventListener('ended', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.addEventListener('error', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.play().catch(err => {\r\n console.error(\"Audio playback error:\", err);\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n });\r\n },\r\n playNextInQueue() {\r\n if (this.audioPlayQueue.length > 0) {\r\n const nextBlob = this.audioPlayQueue.shift();\r\n this.playAudioBlob(nextBlob);\r\n } else {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this.conversationModeOnAudioEnded();\r\n }\r\n },\r\n stopAudio() {\r\n if (this.currentAudioElement) {\r\n this.currentAudioElement.pause();\r\n this.currentAudioElement.currentTime = 0;\r\n this.currentAudioElement = null;\r\n }\r\n if (this.currentAudioUrl) {\r\n URL.revokeObjectURL(this.currentAudioUrl);\r\n this.currentAudioUrl = null;\r\n }\r\n this.audioChunks = [];\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n },\r\n toggleConversationMode() {\r\n if (this.isConversationMode) {\r\n this.stopConversationMode();\r\n } else {\r\n this.startConversationMode();\r\n }\r\n },\r\n startConversationMode() {\r\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = true;\r\n this.updateConversationButton();\r\n this._conversationPartialTranscript = '';\r\n this._conversationAssistantMessage = null;\r\n this._conversationPartialMessage = null;\r\n\r\n // Remove any previous conversation ended notification.\r\n this.removeNotification('conversation-ended');\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this._conversationSubject = new signalR.Subject();\r\n this._conversationStream = stream;\r\n\r\n // Create an AnalyserNode for volume-based interrupt detection.\r\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\r\n if (AudioCtx) {\r\n this._conversationAudioCtx = new AudioCtx();\r\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\r\n this._conversationAnalyser.fftSize = 256;\r\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\r\n micSource.connect(this._conversationAnalyser);\r\n }\r\n\r\n var pendingChunk = Promise.resolve();\r\n var analyser = this._conversationAnalyser;\r\n var interruptVolumeThreshold = 30;\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n // During TTS playback, check mic volume to detect\r\n // user interruption (speaking above threshold).\r\n if (this.isPlayingAudio && analyser) {\r\n var freqData = new Uint8Array(analyser.frequencyBinCount);\r\n analyser.getByteFrequencyData(freqData);\r\n var sum = 0;\r\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\r\n var avg = sum / freqData.length;\r\n\r\n if (avg >= interruptVolumeThreshold) {\r\n // User is speaking — interrupt TTS playback.\r\n this.stopAudio();\r\n }\r\n }\r\n\r\n // Always send audio to STT — browser echo cancellation\r\n // handles speaker echo; continuous audio avoids gaps\r\n // that increase recognition latency.\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n try {\r\n this._conversationSubject.next(base64);\r\n } catch (err) {\r\n // Subject may have been completed already.\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => {\r\n try {\r\n this._conversationSubject.complete();\r\n } catch (err) {\r\n // Already completed.\r\n }\r\n });\r\n });\r\n\r\n var itemId = this.getItemId();\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n });\r\n },\r\n stopConversationMode() {\r\n if (!this.isConversationMode) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n\r\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\r\n if (this.connection) {\r\n this.connection.invoke(\"StopConversation\").catch(function () { });\r\n }\r\n\r\n if (this.isRecording && this.mediaRecorder) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n }\r\n\r\n this.stopAudio();\r\n this._conversationPartialTranscript = '';\r\n this._conversationPartialMessage = null;\r\n\r\n // Clean up the AudioContext used for volume monitoring.\r\n if (this._conversationAudioCtx) {\r\n this._conversationAudioCtx.close().catch(function () { });\r\n this._conversationAudioCtx = null;\r\n this._conversationAnalyser = null;\r\n }\r\n\r\n // Mark any in-flight assistant message as done to stop the spinner.\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Safety net: clear all lingering streaming indicators.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Show a \"conversation ended\" notification system message.\r\n this.receiveNotification({\r\n type: 'conversation-ended',\r\n content: 'Conversation ended.',\r\n icon: 'fa-solid fa-circle-check',\r\n dismissible: true,\r\n autoDismissMs: 5000\r\n });\r\n },\r\n updateConversationButton() {\r\n if (!this.conversationButton) {\r\n return;\r\n }\r\n\r\n if (this.isConversationMode) {\r\n this.conversationButton.classList.add('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\r\n var endHtml = this.conversationButton.getAttribute('data-end-html');\r\n if (endHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n } else {\r\n this.conversationButton.classList.remove('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\r\n this.conversationButton.classList.add('btn-outline-dark');\r\n this.conversationButton.blur();\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\r\n var startHtml = this.conversationButton.getAttribute('data-start-html');\r\n if (startHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n }\r\n },\r\n conversationModeSendPrompt() {\r\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\r\n },\r\n conversationModeOnAudioEnded() {\r\n // Legacy: in conversation mode, continuation is handled\r\n // by the persistent stream.\r\n },\r\n showTypingIndicator() {\r\n this.addMessage({\r\n role: 'indicator',\r\n htmlContent: config.indicatorTemplate\r\n });\r\n },\r\n hideTypingIndicator() {\r\n const originalLength = this.messages.length;\r\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\r\n const removedCount = originalLength - this.messages.length;\r\n return removedCount;\r\n },\r\n scrollToBottom() {\r\n if (!this.autoScroll) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\r\n }, 50);\r\n },\r\n handleUserInput(event) {\r\n this.prompt = event.target.value;\r\n },\r\n getItemId() {\r\n return this.inputElement.getAttribute('data-interaction-id')\r\n || this.inputElement.getAttribute('data-item-id');\r\n },\r\n getSaveIndicatorElement() {\r\n if (config.saveIndicatorElementSelector) {\r\n return document.querySelector(config.saveIndicatorElementSelector);\r\n }\r\n\r\n return document.querySelector('[data-chat-interaction-save-indicator]');\r\n },\r\n showSaveIndicator(text, className) {\r\n const indicator = this.getSaveIndicatorElement();\r\n if (!indicator) {\r\n return;\r\n }\r\n\r\n indicator.textContent = text || '';\r\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\r\n\r\n if (this.saveIndicatorTimeout) {\r\n clearTimeout(this.saveIndicatorTimeout);\r\n this.saveIndicatorTimeout = null;\r\n }\r\n\r\n if (!text) {\r\n return;\r\n }\r\n\r\n this.saveIndicatorTimeout = setTimeout(() => {\r\n indicator.textContent = '';\r\n this.saveIndicatorTimeout = null;\r\n }, 3000);\r\n },\r\n clearPendingSettingsSave() {\r\n if (this.saveSettingsTimeout) {\r\n clearTimeout(this.saveSettingsTimeout);\r\n this.saveSettingsTimeout = null;\r\n }\r\n },\r\n getFieldLabel(input) {\r\n const label = input\r\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\r\n ?.querySelector('label');\r\n\r\n if (!label) {\r\n return input.dataset.setting || 'This field';\r\n }\r\n\r\n return (label.textContent || '')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n || input.dataset.setting\r\n || 'This field';\r\n },\r\n getValidationFeedbackElement(input) {\r\n let feedback = input.nextElementSibling;\r\n if (feedback && feedback.classList.contains('invalid-feedback')) {\r\n return feedback;\r\n }\r\n\r\n feedback = document.createElement('div');\r\n feedback.className = 'invalid-feedback';\r\n input.insertAdjacentElement('afterend', feedback);\r\n\r\n return feedback;\r\n },\r\n clearSettingValidationError(input) {\r\n input.classList.remove('is-invalid');\r\n input.removeAttribute('aria-invalid');\r\n\r\n const feedback = input.nextElementSibling;\r\n if (feedback && feedback.classList.contains('invalid-feedback')) {\r\n feedback.textContent = '';\r\n }\r\n },\r\n setSettingValidationError(input, message) {\r\n const feedback = this.getValidationFeedbackElement(input);\r\n input.classList.add('is-invalid');\r\n input.setAttribute('aria-invalid', 'true');\r\n feedback.textContent = message;\r\n },\r\n getSettingValidationMessage(input) {\r\n if (!input || input.disabled || input.type !== 'number') {\r\n return null;\r\n }\r\n\r\n const value = (input.value || '').trim();\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const number = Number(value);\r\n const fieldLabel = this.getFieldLabel(input);\r\n\r\n if (Number.isNaN(number)) {\r\n return `${fieldLabel} must be a valid number.`;\r\n }\r\n\r\n const min = input.getAttribute('min');\r\n if (min !== null && number < Number(min)) {\r\n return `${fieldLabel} must be ${min} or greater.`;\r\n }\r\n\r\n const max = input.getAttribute('max');\r\n if (max !== null && number > Number(max)) {\r\n return `${fieldLabel} must be ${max} or less.`;\r\n }\r\n\r\n return null;\r\n },\r\n validateSettingInput(input) {\r\n const message = this.getSettingValidationMessage(input);\r\n if (!message) {\r\n this.clearSettingValidationError(input);\r\n return true;\r\n }\r\n\r\n this.setSettingValidationError(input, message);\r\n return false;\r\n },\r\n validateSettings() {\r\n let isValid = true;\r\n\r\n this.getSettingInputs().forEach(input => {\r\n isValid = this.validateSettingInput(input) && isValid;\r\n });\r\n\r\n return isValid;\r\n },\r\n queueSettingsSave() {\r\n if (!this.validateSettings()) {\r\n this.clearPendingSettingsSave();\r\n this.settingsDirty = false;\r\n this.showSaveIndicator('Fix errors', 'text-danger');\r\n return;\r\n }\r\n\r\n this.settingsDirty = true;\r\n this.showSaveIndicator('Saving...', 'text-warning');\r\n this.debouncedSaveSettings();\r\n },\r\n getSettingInputs() {\r\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\r\n if (explicitInputs.length > 0) {\r\n return explicitInputs;\r\n }\r\n\r\n return document.querySelectorAll(\r\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\r\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\r\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\r\n );\r\n },\r\n getSelectedGroupValues(groupName, fallbackSelector) {\r\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked`);\r\n if (explicitSelections.length > 0) {\r\n const values = [];\r\n\r\n explicitSelections.forEach(checkbox => {\r\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\r\n if (value) {\r\n values.push(value);\r\n }\r\n });\r\n\r\n return values;\r\n }\r\n\r\n if (!fallbackSelector) {\r\n return [];\r\n }\r\n\r\n const values = [];\r\n const checkboxes = document.querySelectorAll(fallbackSelector);\r\n\r\n checkboxes.forEach(checkbox => {\r\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\r\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\r\n\r\n if (hiddenInput && hiddenInput.value) {\r\n values.push(hiddenInput.value);\r\n }\r\n });\r\n\r\n return values;\r\n },\r\n getPromptTemplateSelections() {\r\n const promptTemplates = [];\r\n\r\n document.querySelectorAll('.prompt-template-card').forEach(card => {\r\n const templateIdInput = card.querySelector('.prompt-template-id-input');\r\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\r\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\r\n\r\n if (!templateId) {\r\n return;\r\n }\r\n\r\n promptTemplates.push({\r\n templateId: templateId,\r\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\r\n });\r\n });\r\n\r\n return promptTemplates;\r\n },\r\n receiveNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n // Replace existing notification with same type, or add new one.\r\n var idx = this.notifications.findIndex(n => n.type === notification.type);\r\n if (idx >= 0) {\r\n this.notifications.splice(idx, 1, notification);\r\n } else {\r\n this.notifications.push(notification);\r\n }\r\n this.scheduleNotificationDismiss(notification);\r\n this.scrollToBottom();\r\n },\r\n updateNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var idx = this.notifications.findIndex(n => n.type === notification.type);\r\n if (idx >= 0) {\r\n this.notifications.splice(idx, 1, notification);\r\n this.scheduleNotificationDismiss(notification);\r\n this.scrollToBottom();\r\n }\r\n },\r\n scheduleNotificationDismiss(notification) {\r\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\r\n return;\r\n }\r\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\r\n this.removeNotification(notification.type);\r\n }, notification.autoDismissMs);\r\n },\r\n clearNotificationDismiss(notificationType) {\r\n var timerId = this.notificationDismissTimers[notificationType];\r\n if (!timerId) {\r\n return;\r\n }\r\n clearTimeout(timerId);\r\n delete this.notificationDismissTimers[notificationType];\r\n },\r\n removeNotification(notificationType) {\r\n this.clearNotificationDismiss(notificationType);\r\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\r\n },\r\n dismissNotification(notificationType) {\r\n this.removeNotification(notificationType);\r\n },\r\n handleNotificationAction(notificationType, actionName) {\r\n if (!this.connection) {\r\n return;\r\n }\r\n var itemId = this.getItemId();\r\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\r\n .catch(err => console.error('Failed to handle notification action:', err));\r\n },\r\n setItemId(itemId) {\r\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\r\n this.inputElement.setAttribute('data-item-id', itemId || '');\r\n },\r\n resetInteraction() {\r\n this.setItemId('');\r\n this.isInteractionStarted = false;\r\n this.messages = [];\r\n this.showPlaceholder();\r\n },\r\n initializeApp() {\r\n this.inputElement = document.querySelector(config.inputElementSelector);\r\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\r\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\r\n this.placeholder = document.querySelector(config.placeholderElementSelector);\r\n\r\n const itemId = this.getItemId();\r\n if (itemId) {\r\n this.loadInteraction(itemId);\r\n }\r\n\r\n // Pause auto-scroll when the user manually scrolls up during streaming.\r\n this.chatContainer.addEventListener('scroll', () => {\r\n if (!this.stream) {\r\n return;\r\n }\r\n const threshold = 30;\r\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\r\n this.autoScroll = atBottom;\r\n });\r\n\r\n this.inputElement.addEventListener('keyup', event => {\r\n if (this.stream != null) {\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" && !event.shiftKey) {\r\n this.buttonElement.click();\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('input', (e) => {\r\n this.handleUserInput(e);\r\n\r\n if (e.target.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('paste', (e) => {\r\n // Use setTimeout to allow the paste to complete before checking the value\r\n setTimeout(() => {\r\n this.prompt = this.inputElement.value;\r\n if (this.inputElement.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n }, 0);\r\n });\r\n\r\n this.buttonElement.addEventListener('click', () => {\r\n if (this.stream != null) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n\r\n this.streamingFinished();\r\n this.hideTypingIndicator();\r\n\r\n // Clean up: remove empty assistant message or stop streaming animation.\r\n if (this.messages.length > 0) {\r\n const lastMsg = this.messages[this.messages.length - 1];\r\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\r\n this.messages.pop();\r\n } else if (lastMsg.isStreaming) {\r\n lastMsg.isStreaming = false;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.sendMessage();\r\n });\r\n\r\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\r\n\r\n for (var i = 0; i < chatInteractionItems.length; i++) {\r\n chatInteractionItems[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n var itemId = e.target.getAttribute('data-interaction-id');\r\n\r\n if (!itemId) {\r\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\r\n return;\r\n }\r\n\r\n this.loadInteraction(itemId);\r\n });\r\n }\r\n\r\n for (let i = 0; i < config.messages.length; i++) {\r\n this.addMessage(config.messages[i]);\r\n }\r\n\r\n // Delegate click for code block copy buttons.\r\n if (this.chatContainer) {\r\n this.chatContainer.addEventListener('click', (e) => {\r\n var btn = e.target.closest('.ai-code-copy-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n\r\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\r\n if (!block) {\r\n return;\r\n }\r\n\r\n var codeEl = block.querySelector('code');\r\n if (codeEl) {\r\n navigator.clipboard.writeText(codeEl.textContent);\r\n var copiedText = config.codeCopiedText || 'Copied!';\r\n btn.innerHTML = ' ' + copiedText;\r\n setTimeout(() => {\r\n btn.innerHTML = '';\r\n }, 2000);\r\n }\r\n });\r\n }\r\n\r\n document.addEventListener('input', event => {\r\n if (event.target.matches('.setting-input[data-setting]')) {\r\n this.validateSettingInput(event.target);\r\n this.queueSettingsSave();\r\n }\r\n });\r\n\r\n document.addEventListener('change', event => {\r\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .group-toggle, .ci-agent-global-toggle')) {\r\n if (event.target.matches('.setting-input[data-setting]')) {\r\n this.validateSettingInput(event.target);\r\n }\r\n\r\n this.queueSettingsSave();\r\n return;\r\n }\r\n\r\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\r\n this.queueSettingsSave();\r\n }\r\n });\r\n\r\n document.addEventListener('click', event => {\r\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n this.queueSettingsSave();\r\n }, 0);\r\n });\r\n\r\n // Add event listener for clear history button\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.addEventListener('click', () => {\r\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\r\n if (itemId) {\r\n this.clearHistory(itemId);\r\n }\r\n });\r\n }\r\n\r\n // Initialize speech-to-text microphone button.\r\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\r\n this.micButton = document.querySelector(config.micButtonElementSelector);\r\n if (this.micButton) {\r\n this.micButton.style.display = '';\r\n this.micButton.addEventListener('click', () => {\r\n this.toggleRecording();\r\n });\r\n }\r\n }\r\n\r\n // Initialize conversation mode button.\r\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\r\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\r\n if (this.conversationButton) {\r\n this.conversationButton.addEventListener('click', () => {\r\n this.toggleConversationMode();\r\n });\r\n }\r\n }\r\n },\r\n loadInteraction(itemId) {\r\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\r\n },\r\n reloadCurrentInteraction() {\r\n const itemId = this.getItemId();\r\n if (itemId) {\r\n this.loadInteraction(itemId);\r\n }\r\n },\r\n clearHistory(itemId) {\r\n const self = this;\r\n confirmDialog({\r\n title: config.clearHistoryTitle,\r\n message: config.clearHistoryMessage,\r\n okText: config.clearHistoryOkText,\r\n cancelText: config.clearHistoryCancelText,\r\n callback: function (confirmed) {\r\n if (confirmed) {\r\n // Cancel any active stream before clearing history.\r\n if (self.stream) {\r\n self.stream.dispose();\r\n self.stream = null;\r\n self.hideTypingIndicator();\r\n self.streamingFinished();\r\n }\r\n\r\n self.connection.invoke(\"ClearHistory\", itemId)\r\n .catch(err => console.error('Error clearing history:', err));\r\n }\r\n }\r\n });\r\n },\r\n debouncedSaveSettings() {\r\n // Clear any existing timeout to reset the debounce timer\r\n this.clearPendingSettingsSave();\r\n\r\n // Don't save while streaming — it will be saved when streaming completes.\r\n if (this.stream) {\r\n return;\r\n }\r\n\r\n // Set a new timeout to save after 850ms of no changes\r\n this.saveSettingsTimeout = setTimeout(() => {\r\n if (this.settingsDirty) {\r\n this.saveSettings();\r\n this.settingsDirty = false;\r\n }\r\n this.saveSettingsTimeout = null;\r\n }, 850);\r\n },\r\n getSelectedToolNames() {\r\n return this.getSelectedGroupValues(\r\n 'toolNames',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\r\n );\r\n },\r\n getSelectedMcpConnectionIds() {\r\n return this.getSelectedGroupValues(\r\n 'mcpConnectionIds',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\r\n );\r\n },\r\n getSelectedA2AConnectionIds() {\r\n return this.getSelectedGroupValues('a2aConnectionIds');\r\n },\r\n getSelectedAgentNames() {\r\n return this.getSelectedGroupValues(\r\n 'agentNames',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\r\n );\r\n },\r\n saveSettings() {\r\n const itemId = this.getItemId();\r\n if (!itemId) {\r\n return Promise.resolve();\r\n }\r\n\r\n if (!this.validateSettings()) {\r\n this.showSaveIndicator('Fix errors', 'text-danger');\r\n return Promise.resolve();\r\n }\r\n\r\n const settings = {};\r\n\r\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\r\n // This avoids coupling the JS to specific field names — new fields added by\r\n // any module are automatically included.\r\n const inputs = this.getSettingInputs();\r\n\r\n inputs.forEach(input => {\r\n const key = input.dataset.setting\r\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\r\n\r\n if (!key) {\r\n return;\r\n }\r\n\r\n if (input.type === 'checkbox') {\r\n settings[key] = input.checked;\r\n } else if (input.type === 'number') {\r\n settings[key] = input.value ? parseFloat(input.value) : null;\r\n } else {\r\n settings[key] = input.value || null;\r\n }\r\n });\r\n\r\n // Add tool, MCP connection, and agent collections (special handling).\r\n settings.toolNames = this.getSelectedToolNames();\r\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\r\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\r\n settings.agentNames = this.getSelectedAgentNames();\r\n\r\n const promptTemplates = this.getPromptTemplateSelections();\r\n if (promptTemplates.length > 0) {\r\n settings.promptTemplates = promptTemplates;\r\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\r\n }\r\n\r\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\r\n .catch(err => {\r\n console.error('Error saving settings:', err);\r\n this.showSaveIndicator('Save failed', 'text-danger');\r\n });\r\n },\r\n flushPendingSave() {\r\n if (this.saveSettingsTimeout) {\r\n clearTimeout(this.saveSettingsTimeout);\r\n this.saveSettingsTimeout = null;\r\n }\r\n\r\n if (this.settingsDirty) {\r\n this.settingsDirty = false;\r\n return this.saveSettings();\r\n }\r\n\r\n return Promise.resolve();\r\n },\r\n initializeInteraction(itemId, force) {\r\n if (this.isInteractionStarted && !force) {\r\n return;\r\n }\r\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\r\n this.setItemId(itemId);\r\n this.isInteractionStarted = true;\r\n },\r\n copyResponse(message) {\r\n navigator.clipboard.writeText(message);\r\n },\r\n startRecording() {\r\n if (this.isRecording || !this.connection) {\r\n return;\r\n }\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this.preRecordingPrompt = this.prompt;\r\n this._audioInputSent = false;\r\n\r\n var subject = new signalR.Subject();\r\n var itemId = this.getItemId();\r\n var pendingChunk = Promise.resolve();\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n subject.next(base64);\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => subject.complete());\r\n });\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n this.updateMicButton();\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n });\r\n },\r\n stopRecording() {\r\n if (!this.isRecording || !this.mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n this.updateMicButton();\r\n },\r\n toggleRecording() {\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n } else {\r\n this.startRecording();\r\n }\r\n },\r\n updateMicButton() {\r\n if (!this.micButton) {\r\n return;\r\n }\r\n\r\n if (this.isRecording) {\r\n this.micButton.classList.add('stt-recording');\r\n this.micButton.innerHTML = '';\r\n } else {\r\n this.micButton.classList.remove('stt-recording');\r\n this.micButton.innerHTML = '';\r\n }\r\n }\r\n },\r\n watch: {\r\n isPlayingAudio() {\r\n // Reserved for future use — volume-based interrupt detection\r\n // no longer mutes tracks; browser echo cancellation handles echo.\r\n },\r\n isConversationMode(active) {\r\n if (this.micButton) {\r\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\r\n }\r\n\r\n if (this.buttonElement) {\r\n this.buttonElement.style.display = active ? 'none' : '';\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.disabled = active;\r\n if (active) {\r\n this.inputElement.placeholder = '';\r\n }\r\n }\r\n }\r\n },\r\n mounted() {\r\n (async () => {\r\n await this.startConnection();\r\n this.initializeApp();\r\n })();\r\n\r\n window.addEventListener('beforeunload', this.handleBeforeUnload);\r\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n },\r\n beforeUnmount() {\r\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\r\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n\r\n this.stopAudio(false);\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n },\r\n template: config.messageTemplate\r\n }).mount(config.appElementSelector);\r\n\r\n return app;\r\n };\r\n\r\n return {\r\n initialize: initialize\r\n };\r\n}();\r\n\r\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\r\ndocument.addEventListener('click', function (e) {\r\n const btn = e.target.closest('.download-chart-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n const chartId = btn.getAttribute('data-chart-id');\r\n const canvas = chartId ? document.getElementById(chartId) : null;\r\n if (!canvas) {\r\n console.error('Chart canvas not found:', chartId);\r\n return;\r\n }\r\n const link = document.createElement('a');\r\n link.download = 'chart-' + chartId + '.png';\r\n link.href = canvas.toDataURL('image/png');\r\n link.click();\r\n});\r\n\r\n// Intercept download clicks for data-URI images and convert to blob downloads.\r\ndocument.addEventListener('click', function (e) {\r\n const link = e.target.closest('.ai-download-image');\r\n if (!link) {\r\n return;\r\n }\r\n\r\n const container = link.closest('.generated-image-container');\r\n const img = container?.querySelector('img');\r\n if (!img) {\r\n return;\r\n }\r\n\r\n const src = img.src;\r\n if (!src || !src.startsWith('data:')) {\r\n return; // Normal URL – let the default behaviour handle it.\r\n }\r\n\r\n e.preventDefault();\r\n\r\n fetch(src)\r\n .then(function (res) { return res.blob(); })\r\n .then(function (blob) {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = link.getAttribute('download') || 'generated-image.png';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\r\n })\r\n .catch(function (err) { console.error('Failed to download image:', err); });\r\n});\r\n"]} \ No newline at end of file diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js index 397a6c7a..f8d3562b 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js @@ -1,2 +1,2 @@ -function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArrayLimit(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var i,o,a,r,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(i=a.call(n)).done)&&(s.push(i.value),s.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(r=n.return(),Object(r)!==r))return}finally{if(l)throw o}}return s}}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function _regenerator(){/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */var e,t,n="function"==typeof Symbol?Symbol:{},i=n.iterator||"@@iterator",o=n.toStringTag||"@@toStringTag";function a(n,i,o,a){var c=i&&i.prototype instanceof s?i:s,l=Object.create(c.prototype);return _regeneratorDefine2(l,"_invoke",function(n,i,o){var a,s,c,l=0,u=o||[],d=!1,h={p:0,n:0,v:e,a:m,f:m.bind(e,4),d:function(t,n){return a=t,s=0,c=e,h.n=n,r}};function m(n,i){for(s=n,c=i,t=0;!d&&l&&!o&&t3?(o=g===i)&&(c=a[(s=a[4])?5:(s=3,3)],a[4]=a[5]=e):a[0]<=m&&((o=n<2&&mi||i>g)&&(a[4]=n,a[5]=i,h.n=g,s=0))}if(o||n>1)return r;throw d=!0,i}return function(o,u,g){if(l>1)throw TypeError("Generator is already running");for(d&&1===u&&m(u,g),s=u,c=g;(t=s<2?e:c)||!d;){a||(s?s<3?(s>1&&(h.n=-1),m(s,c)):h.n=c:h.v=c);try{if(l=2,a){if(s||(o="next"),t=a[o]){if(!(t=t.call(a,c)))throw TypeError("iterator result is not an object");if(!t.done)return t;c=t.value,s<2&&(s=0)}else 1===s&&(t=a.return)&&t.call(a),s<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),s=1);a=e}else if((t=(d=h.n<0)?c:n.call(i,h))!==r)break}catch(t){a=e,s=1,c=t}finally{l=1}}return{value:t,done:d}}}(n,o,a),!0),l}var r={};function s(){}function c(){}function l(){}t=Object.getPrototypeOf;var u=[][i]?t(t([][i]())):(_regeneratorDefine2(t={},i,function(){return this}),t),d=l.prototype=s.prototype=Object.create(u);function h(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,_regeneratorDefine2(e,o,"GeneratorFunction")),e.prototype=Object.create(d),e}return c.prototype=l,_regeneratorDefine2(d,"constructor",l),_regeneratorDefine2(l,"constructor",c),c.displayName="GeneratorFunction",_regeneratorDefine2(l,o,"GeneratorFunction"),_regeneratorDefine2(d),_regeneratorDefine2(d,o,"Generator"),_regeneratorDefine2(d,i,function(){return this}),_regeneratorDefine2(d,"toString",function(){return"[object Generator]"}),(_regenerator=function(){return{w:a,m:h}})()}function _regeneratorDefine2(e,t,n,i){var o=Object.defineProperty;try{o({},"",{})}catch(e){o=0}_regeneratorDefine2=function(e,t,n,i){function a(t,n){_regeneratorDefine2(e,t,function(e){return this._invoke(t,n,e)})}t?o?o(e,t,{value:n,enumerable:!i,configurable:!i,writable:!i}):e[t]=n:(a("next",0),a("throw",1),a("return",2))},_regeneratorDefine2(e,t,n,i)}function asyncGeneratorStep(e,t,n,i,o,a,r){try{var s=e[a](r),c=s.value}catch(e){return void n(e)}s.done?t(c):Promise.resolve(c).then(i,o)}function _asyncToGenerator(e){return function(){var t=this,n=arguments;return new Promise(function(i,o){var a=e.apply(t,n);function r(e){asyncGeneratorStep(a,i,o,r,s,"next",e)}function s(e){asyncGeneratorStep(a,i,o,r,s,"throw",e)}r(void 0)})}}function _createForOfIteratorHelper(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=_unsupportedIterableToArray(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,o=function(){};return{s:o,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,r=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return r=e.done,e},e:function(e){s=!0,a=e},f:function(){try{r||null==n.return||n.return()}finally{if(s)throw a}}}}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(e,t):void 0}}function _iterableToArray(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=Array(t);n\n
\n
\n
You
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n \n ',indicatorTemplate:'\n
\n \n Assistant\n
\n ',untitledText:"Untitled",clearHistoryTitle:"Clear History",clearHistoryMessage:"Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.",clearHistoryOkText:"Yes",clearHistoryCancelText:"Cancel"};function t(e){if(!e)return"";var t=e.trim();return/^javascript:/i.test(t)||/^vbscript:/i.test(t)||/^data:text\/html/i.test(t)?"":e}function n(e){var t=document.createElement("span");return t.textContent=e,t.innerHTML}var i=new marked.Renderer;i.link=function(e){var n=t(e.href);return n?'
').concat(e.text,""):e.text||""},i.code=function(e){var t=e.text||"",i=(e.lang||"").trim(),o=t;if("undefined"!=typeof hljs)if(i&&hljs.getLanguage(i))try{o=hljs.highlight(t,{language:i}).value}catch(e){}else try{o=hljs.highlightAuto(t).value}catch(e){}else o=n(t);var a=i?n(i):"code";return'
'.concat(a,'
').concat(o,"
")},i.image=function(n){var i=t(n.href);if(!i)return"";var o=n.text||e.generatedImageAltText,a=e.generatedImageMaxWidth;return'
\n ').concat(o,'\n
\n \n \n \n
\n
')};var o=0,a=[];function r(e){if(e&&e._pendingCharts&&e._pendingCharts.length){var t=_toConsumableArray(e._pendingCharts);e._pendingCharts=[],requestAnimationFrame(function(){var e,n=_createForOfIteratorHelper(t);try{for(n.s();!(e=n.n()).done;){var i=e.value,o=document.getElementById(i.chartId);if(o)if("undefined"!=typeof Chart)if(null!==o.offsetParent)try{var a,r,s;o._chartInstance&&o._chartInstance.destroy();var c="string"==typeof i.config?JSON.parse(i.config):i.config;null!==(a=c.options)&&void 0!==a||(c.options={}),c.options.responsive=!0,c.options.maintainAspectRatio=!0,null!==(s=(r=c.options).aspectRatio)&&void 0!==s||(r.aspectRatio=4/3),o._chartInstance=new Chart(o,c)}catch(e){console.error("Error creating chart:",e)}else window.__chartConfigs[i.chartId]=i.config;else console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n continue;\n }\n\n // When the canvas is inside a hidden container (e.g., display:none),\n // it has zero dimensions. Keep the config for later rendering.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[c.chartId] = c.config;\n continue;\n }\n\n try {\n // Destroy existing chart instance if re-rendering\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n } catch (e) {\n console.error('Error creating chart:', e);\n }\n }\n });\n }\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n const initialize = (instanceConfig) => {\n\n const config = Object.assign({}, defaultConfig, instanceConfig);\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isInteractionStarted: false,\n isPlaceholderVisible: true,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n prompt: '',\n initialFieldValues: new Map(),\n settingsDirty: false,\n saveSettingsTimeout: null,\n saveIndicatorTimeout: null,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n notifications: [],\n notificationDismissTimers: {},\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadInteraction\", (data) => {\n this.initializeInteraction(data.itemId, true);\n this.messages = [];// Update the title field if it exists\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && data.title) {\n titleInput.value = data.title;\n }\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n });\n\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\n // Update the history list item if it exists\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\n if (historyItem) {\n historyItem.textContent = title || config.untitledText;\n }\n\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && title) {\n titleInput.value = title;\n }\n\n this.showSaveIndicator('Saved', 'text-success');\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n this.showSaveIndicator('Save failed', 'text-danger');\n\n if (this.isRecording) {\n this.stopRecording();\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, text) => {\n if (text) {\n this.stopAudio();\n\n // If there's an interrupted assistant message still streaming,\n // mark it as done to stop the spinner animation.\n if (this._conversationAssistantMessage) {\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\n if (oldMsg) {\n oldMsg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, appearance) => {\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n appearance: this.normalizeAssistantAppearance(appearance),\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.content = this._conversationAssistantMessage.content;\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n this.audioChunks.push(bytes);\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"HistoryCleared\", (itemId) => {\n // Clear messages and show placeholder\n this.messages = [];\n this.showPlaceholder();\n\n // Hide the clear history button since there's no history now\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.add('d-none');\n }\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n this.reloadCurrentInteraction();\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n if (message.content) {\n let processedContent = message.content.trim();\n\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\n\n // Only include references that were actually cited in the response.\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\n\n if (citedRefs.length) {\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders.\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processedContent = processedContent.replaceAll('
', ',');\n\n processedContent += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || `[doc:${value.index}]`;\n processedContent += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n }\n }\n\n message.content = processedContent;\n message.htmlContent = parseMarkdownContent(processedContent, message);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n async sendMessage() {\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // Flush any pending settings save before sending a message\n // to prevent concurrent hub calls that can cause database deadlocks.\n await this.flushPendingSave();\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n // Show the clear history button since we now have prompts\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.remove('d-none');\n }\n\n this.streamMessage(trimmedPrompt);\n this.inputElement.value = '';\n this.prompt = '';\n },\n streamMessage(trimmedPrompt) {\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n var messageIndex = this.messages.length;\n var currentItemId = this.getItemId();\n\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n if (chunk.sessionId && !currentItemId) {\n this.setItemId(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n messageIndex = this.messages.length;\n let newMessage = {\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n };\n\n this.messages.push(newMessage);\n message = newMessage;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = value;\n }\n }\n\n if (chunk.content) {\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n let processedContent = chunk.content;\n\n for (const [key, value] of Object.entries(references)) {\n processedContent = processedContent.replaceAll(key, `${value.index}`);\n }\n\n content += processedContent.replaceAll('
', ',');\n }\n\n message.content = content;\n\n message.htmlContent = parseMarkdownContent(content, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n return {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n },\n processReferences(references, messageIndex) {\n if (Object.keys(references).length) {\n let message = this.messages[messageIndex];\n const content = message.content || '';\n\n // Only include references that were actually cited in the response.\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\n const citedRefs = Object.entries(references).filter(([key, value]) =>\n content.includes(key) || content.includes(`${value.index}`)\n );\n\n if (!citedRefs.length) {\n return;\n }\n\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\n let processed = content.trim();\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processed = processed.replaceAll(key, placeholder);\n processed = processed.replaceAll(`${value.index}`, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processed = processed.replaceAll('', ',');\n\n processed += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || `[doc:${value.index}]`;\n processed += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n\n message.content = processed;\n message.htmlContent = parseMarkdownContent(processed, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Save any settings that were deferred during streaming.\n if (this.settingsDirty) {\n this.debouncedSaveSettings();\n }\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio();\n this.ttsPlayingMessageIndex = index;\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is currently playing, queue this blob for later.\n if (this.isPlayingAudio && this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n URL.revokeObjectURL(url);\n this.currentAudioElement = null;\n this.isPlayingAudio = false;\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n const nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var itemId = this.getItemId();\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, continuation is handled\n // by the persistent stream.\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getItemId() {\n return this.inputElement.getAttribute('data-interaction-id')\n || this.inputElement.getAttribute('data-item-id');\n },\n getSaveIndicatorElement() {\n if (config.saveIndicatorElementSelector) {\n return document.querySelector(config.saveIndicatorElementSelector);\n }\n\n return document.querySelector('[data-chat-interaction-save-indicator]');\n },\n showSaveIndicator(text, className) {\n const indicator = this.getSaveIndicatorElement();\n if (!indicator) {\n return;\n }\n\n indicator.textContent = text || '';\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\n\n if (this.saveIndicatorTimeout) {\n clearTimeout(this.saveIndicatorTimeout);\n this.saveIndicatorTimeout = null;\n }\n\n if (!text) {\n return;\n }\n\n this.saveIndicatorTimeout = setTimeout(() => {\n indicator.textContent = '';\n this.saveIndicatorTimeout = null;\n }, 3000);\n },\n clearPendingSettingsSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n },\n getFieldLabel(input) {\n const label = input\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\n ?.querySelector('label');\n\n if (!label) {\n return input.dataset.setting || 'This field';\n }\n\n return (label.textContent || '')\n .replace(/\\s+/g, ' ')\n .trim()\n || input.dataset.setting\n || 'This field';\n },\n getValidationFeedbackElement(input) {\n let feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n return feedback;\n }\n\n feedback = document.createElement('div');\n feedback.className = 'invalid-feedback';\n input.insertAdjacentElement('afterend', feedback);\n\n return feedback;\n },\n clearSettingValidationError(input) {\n input.classList.remove('is-invalid');\n input.removeAttribute('aria-invalid');\n\n const feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n feedback.textContent = '';\n }\n },\n setSettingValidationError(input, message) {\n const feedback = this.getValidationFeedbackElement(input);\n input.classList.add('is-invalid');\n input.setAttribute('aria-invalid', 'true');\n feedback.textContent = message;\n },\n getSettingValidationMessage(input) {\n if (!input || input.disabled || input.type !== 'number') {\n return null;\n }\n\n const value = (input.value || '').trim();\n if (!value) {\n return null;\n }\n\n const number = Number(value);\n const fieldLabel = this.getFieldLabel(input);\n\n if (Number.isNaN(number)) {\n return `${fieldLabel} must be a valid number.`;\n }\n\n const min = input.getAttribute('min');\n if (min !== null && number < Number(min)) {\n return `${fieldLabel} must be ${min} or greater.`;\n }\n\n const max = input.getAttribute('max');\n if (max !== null && number > Number(max)) {\n return `${fieldLabel} must be ${max} or less.`;\n }\n\n return null;\n },\n validateSettingInput(input) {\n const message = this.getSettingValidationMessage(input);\n if (!message) {\n this.clearSettingValidationError(input);\n return true;\n }\n\n this.setSettingValidationError(input, message);\n return false;\n },\n validateSettings() {\n let isValid = true;\n\n this.getSettingInputs().forEach(input => {\n isValid = this.validateSettingInput(input) && isValid;\n });\n\n return isValid;\n },\n queueSettingsSave() {\n if (!this.validateSettings()) {\n this.clearPendingSettingsSave();\n this.settingsDirty = false;\n this.showSaveIndicator('Fix errors', 'text-danger');\n return;\n }\n\n this.settingsDirty = true;\n this.showSaveIndicator('Saving...', 'text-warning');\n this.debouncedSaveSettings();\n },\n getSettingInputs() {\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\n if (explicitInputs.length > 0) {\n return explicitInputs;\n }\n\n return document.querySelectorAll(\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\n );\n },\n getSelectedGroupValues(groupName, fallbackSelector) {\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked`);\n if (explicitSelections.length > 0) {\n const values = [];\n\n explicitSelections.forEach(checkbox => {\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\n if (value) {\n values.push(value);\n }\n });\n\n return values;\n }\n\n if (!fallbackSelector) {\n return [];\n }\n\n const values = [];\n const checkboxes = document.querySelectorAll(fallbackSelector);\n\n checkboxes.forEach(checkbox => {\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\n\n if (hiddenInput && hiddenInput.value) {\n values.push(hiddenInput.value);\n }\n });\n\n return values;\n },\n getPromptTemplateSelections() {\n const promptTemplates = [];\n\n document.querySelectorAll('.prompt-template-card').forEach(card => {\n const templateIdInput = card.querySelector('.prompt-template-id-input');\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\n\n if (!templateId) {\n return;\n }\n\n promptTemplates.push({\n templateId: templateId,\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\n });\n });\n\n return promptTemplates;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n // Replace existing notification with same type, or add new one.\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var itemId = this.getItemId();\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\n .catch(err => console.error('Failed to handle notification action:', err));\n },\n setItemId(itemId) {\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\n this.inputElement.setAttribute('data-item-id', itemId || '');\n },\n resetInteraction() {\n this.setItemId('');\n this.isInteractionStarted = false;\n this.messages = [];\n this.showPlaceholder();\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keyup', event => {\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.inputElement.addEventListener('paste', (e) => {\n // Use setTimeout to allow the paste to complete before checking the value\n setTimeout(() => {\n this.prompt = this.inputElement.value;\n if (this.inputElement.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n }, 0);\n });\n\n this.buttonElement.addEventListener('click', () => {\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\n\n for (var i = 0; i < chatInteractionItems.length; i++) {\n chatInteractionItems[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var itemId = e.target.getAttribute('data-interaction-id');\n\n if (!itemId) {\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\n return;\n }\n\n this.loadInteraction(itemId);\n });\n }\n\n for (let i = 0; i < config.messages.length; i++) {\n this.addMessage(config.messages[i]);\n }\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n document.addEventListener('input', event => {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('change', event => {\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .group-toggle, .ci-agent-global-toggle')) {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n }\n\n this.queueSettingsSave();\n return;\n }\n\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('click', event => {\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\n return;\n }\n\n setTimeout(() => {\n this.queueSettingsSave();\n }, 0);\n });\n\n // Add event listener for clear history button\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.addEventListener('click', () => {\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\n if (itemId) {\n this.clearHistory(itemId);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n },\n loadInteraction(itemId) {\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\n },\n reloadCurrentInteraction() {\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n },\n clearHistory(itemId) {\n const self = this;\n confirmDialog({\n title: config.clearHistoryTitle,\n message: config.clearHistoryMessage,\n okText: config.clearHistoryOkText,\n cancelText: config.clearHistoryCancelText,\n callback: function (confirmed) {\n if (confirmed) {\n // Cancel any active stream before clearing history.\n if (self.stream) {\n self.stream.dispose();\n self.stream = null;\n self.hideTypingIndicator();\n self.streamingFinished();\n }\n\n self.connection.invoke(\"ClearHistory\", itemId)\n .catch(err => console.error('Error clearing history:', err));\n }\n }\n });\n },\n debouncedSaveSettings() {\n // Clear any existing timeout to reset the debounce timer\n this.clearPendingSettingsSave();\n\n // Don't save while streaming — it will be saved when streaming completes.\n if (this.stream) {\n return;\n }\n\n // Set a new timeout to save after 850ms of no changes\n this.saveSettingsTimeout = setTimeout(() => {\n if (this.settingsDirty) {\n this.saveSettings();\n this.settingsDirty = false;\n }\n this.saveSettingsTimeout = null;\n }, 850);\n },\n getSelectedToolNames() {\n return this.getSelectedGroupValues(\n 'toolNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\n );\n },\n getSelectedMcpConnectionIds() {\n return this.getSelectedGroupValues(\n 'mcpConnectionIds',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\n );\n },\n getSelectedA2AConnectionIds() {\n return this.getSelectedGroupValues('a2aConnectionIds');\n },\n getSelectedAgentNames() {\n return this.getSelectedGroupValues(\n 'agentNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\n );\n },\n saveSettings() {\n const itemId = this.getItemId();\n if (!itemId) {\n return Promise.resolve();\n }\n\n if (!this.validateSettings()) {\n this.showSaveIndicator('Fix errors', 'text-danger');\n return Promise.resolve();\n }\n\n const settings = {};\n\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\n // This avoids coupling the JS to specific field names — new fields added by\n // any module are automatically included.\n const inputs = this.getSettingInputs();\n\n inputs.forEach(input => {\n const key = input.dataset.setting\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\n\n if (!key) {\n return;\n }\n\n if (input.type === 'checkbox') {\n settings[key] = input.checked;\n } else if (input.type === 'number') {\n settings[key] = input.value ? parseFloat(input.value) : null;\n } else {\n settings[key] = input.value || null;\n }\n });\n\n // Add tool, MCP connection, and agent collections (special handling).\n settings.toolNames = this.getSelectedToolNames();\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\n settings.agentNames = this.getSelectedAgentNames();\n\n const promptTemplates = this.getPromptTemplateSelections();\n if (promptTemplates.length > 0) {\n settings.promptTemplates = promptTemplates;\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\n }\n\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\n .catch(err => {\n console.error('Error saving settings:', err);\n this.showSaveIndicator('Save failed', 'text-danger');\n });\n },\n flushPendingSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n\n if (this.settingsDirty) {\n this.settingsDirty = false;\n return this.saveSettings();\n }\n\n return Promise.resolve();\n },\n initializeInteraction(itemId, force) {\n if (this.isInteractionStarted && !force) {\n return;\n }\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\n this.setItemId(itemId);\n this.isInteractionStarted = true;\n },\n copyResponse(message) {\n navigator.clipboard.writeText(message);\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var itemId = this.getItemId();\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n }\n },\n watch: {\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n return {\n initialize: initialize\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} +{"version":3,"sources":["chat-interaction.js"],"names":["_slicedToArray","r","e","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","l","t","Symbol","iterator","n","i","u","a","f","o","call","next","Object","done","push","value","length","Array","isArray","_typeof","constructor","prototype","_regenerator","toStringTag","c","Generator","create","_regeneratorDefine2","p","y","G","v","d","bind","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","this","setPrototypeOf","__proto__","displayName","w","m","defineProperty","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","_n","F","s","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_arrayLikeToArray","toString","slice","name","from","test","window","chatInteractionManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","codeCopiedText","assistantLabel","messageTemplate","indicatorTemplate","untitledText","clearHistoryTitle","clearHistoryMessage","clearHistoryOkText","clearHistoryCancelText","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","renderer","marked","Renderer","link","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","renderChartsInMessage","message","charts","requestAnimationFrame","_step","_iterator","canvas","getElementById","chartId","Chart","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","config","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","console","error","__chartConfigs","warn","err","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","token","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","startIndex","endIndex","json","substring","tryExtractChartMarker","type","raw","initialize","instanceConfig","assign","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isInteractionStarted","isPlaceholderVisible","isStreaming","isNavigatingAway","autoScroll","stream","messages","prompt","initialFieldValues","Map","settingsDirty","saveSettingsTimeout","saveIndicatorTimeout","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","Math","random","conversationModeEnabled","conversationButton","isConversationMode","notifications","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","startConnection","_this","_callee","_t","_context","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","initializeInteraction","itemId","titleInput","querySelector","title","forEach","msg","addMessage","$nextTick","historyItem","showSaveIndicator","stopRecording","isFinal","_conversationPartialTranscript","replace","_conversationPartialMessage","htmlContent","hidePlaceholder","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","index","escaped","messageId","responseId","appearance","hideTypingIndicator","j","msgIndex","newMessage","id","normalizeAssistantAppearance","base64Audio","contentType","binaryString","atob","bytes","Uint8Array","charCodeAt","playCollectedAudio","showPlaceholder","clearHistoryBtn","classList","add","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentInteraction","onclose","addMessageInternal","_this2","fireEvent","CustomEvent","detail","_this3","processedContent","references","keys","citedRefs","entries","filter","_ref","key","includes","sort","_ref3","_ref4","b","_step2","displayIndex","_iterator2","_step2$value","replaceAll","_displayIndex","_placeholder","_step3","_iterator3","_step4","_iterator4","_step4$value","label","remove","event","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","isIndicator","sendMessage","_this4","_callee2","trimmedPrompt","_context2","flushPendingSave","streamMessage","_this5","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentItemId","getItemId","subscribe","chunk","sessionId","setItemId","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","complete","_this5$stream","processReferences","streamingFinished","synthesizeSpeech","_this5$stream2","getServiceDownMessage","_this6","_ref7","_ref8","_ref9","_ref0","_step5","processed","_iterator5","_step5$value","_step6","_iterator6","_step7","_iterator7","_step7$value","stopIcon","getAttribute","replaceChildren","RETURN_DOM_FRAGMENT","startIcon","icons","querySelectorAll","debouncedSaveSettings","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this7","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","_step8","totalLength","reduce","sum","combined","offset","_iterator8","set","blob","Blob","_this8","URL","createObjectURL","audio","Audio","addEventListener","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this9","updateConversationButton","navigator","mediaDevices","getUserMedia","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","_conversationSubject","Subject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","createMediaStreamSource","connect","pendingChunk","analyser","size","freqData","frequencyBinCount","getByteFrequencyData","k","_callee3","uint8Array","base64","_context3","arrayBuffer","str","byte","String","fromCharCode","btoa","getTracks","track","stop","documentElement","send","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","originalLength","_this0","setTimeout","scrollTop","scrollHeight","clientHeight","handleUserInput","target","getSaveIndicatorElement","saveIndicatorElementSelector","className","_this1","indicator","clearTimeout","clearPendingSettingsSave","getFieldLabel","input","_input$closest","closest","dataset","setting","getValidationFeedbackElement","feedback","nextElementSibling","contains","insertAdjacentElement","clearSettingValidationError","removeAttribute","setSettingValidationError","setAttribute","getSettingValidationMessage","disabled","number","Number","fieldLabel","isNaN","min","max","validateSettingInput","validateSettings","_this10","isValid","getSettingInputs","queueSettingsSave","explicitInputs","getSelectedGroupValues","groupName","fallbackSelector","explicitSelections","values","checkbox","baseName","hiddenInput","getPromptTemplateSelections","promptTemplates","card","templateIdInput","promptParametersInput","templateId","promptParameters","clearNotificationDismiss","findIndex","splice","scheduleNotificationDismiss","_this11","timerId","dismissNotification","handleNotificationAction","actionName","resetInteraction","initializeApp","_this12","placeholderElementSelector","loadInteraction","atBottom","shiftKey","click","lastMsg","pop","chatInteractionItems","getElementsByClassName","preventDefault","btn","block","codeEl","clipboard","writeText","copiedText","matches","clearHistory","micButtonElementSelector","style","display","toggleRecording","conversationButtonElementSelector","self","confirmDialog","okText","cancelText","callback","confirmed","_this13","saveSettings","getSelectedToolNames","getSelectedMcpConnectionIds","getSelectedA2AConnectionIds","getSelectedAgentNames","_this14","settings","match","toLowerCase","checked","parseFloat","toolNames","mcpConnectionIds","a2aConnectionIds","agentNames","promptTemplateIds","map","template","force","copyResponse","startRecording","_this15","subject","_callee4","_context4","updateMicButton","watch","active","mounted","_this16","_callee5","_context5","beforeUnmount","removeEventListener","mount","download","toDataURL","container","img","startsWith","fetch","res","body","appendChild","removeChild"],"mappings":"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","file":"chat-interaction.min.js","sourcesContent":["window.chatInteractionManager = function () {\r\n\r\n // Defaults (can be overridden by instanceConfig)\r\n var defaultConfig = {\r\n // UI defaults for generated media\r\n generatedImageAltText: 'Generated Image',\r\n generatedImageMaxWidth: 400,\r\n downloadImageTitle: 'Download image',\r\n downloadChartTitle: 'Download chart as image',\r\n downloadChartButtonText: 'Download',\r\n codeCopiedText: 'Copied!',\r\n assistantLabel: 'Assistant',\r\n\r\n messageTemplate: `\r\n
\r\n
\r\n
\r\n
You
\r\n
\r\n \r\n {{ getAssistantLabel(message) }}\r\n
\r\n
\r\n

{{ message.title }}

\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{ notification.content }}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n `,\r\n indicatorTemplate: `\r\n
\r\n \r\n Assistant\r\n
\r\n `,\r\n // Localizable strings\r\n untitledText: 'Untitled',\r\n clearHistoryTitle: 'Clear History',\r\n clearHistoryMessage: 'Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.',\r\n clearHistoryOkText: 'Yes',\r\n clearHistoryCancelText: 'Cancel'\r\n };\r\n\r\n // Sanitize URLs to prevent javascript: protocol injection.\r\n function sanitizeUrl(url) {\r\n if (!url) return '';\r\n var trimmed = url.trim();\r\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\r\n return '';\r\n }\r\n return url;\r\n }\r\n\r\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\r\n function escapeHtmlEntities(text) {\r\n var span = document.createElement('span');\r\n span.textContent = text;\r\n return span.innerHTML;\r\n }\r\n\r\n const renderer = new marked.Renderer();\r\n\r\n // Modify the link rendering to open in a new tab\r\n renderer.link = function (data) {\r\n var href = sanitizeUrl(data.href);\r\n if (!href) return data.text || '';\r\n return `
${data.text}`;\r\n };\r\n\r\n // Custom code block renderer with highlight.js integration and copy button.\r\n renderer.code = function (data) {\r\n var code = data.text || '';\r\n var lang = (data.lang || '').trim();\r\n var highlighted = code;\r\n\r\n if (typeof hljs !== 'undefined') {\r\n if (lang && hljs.getLanguage(lang)) {\r\n try {\r\n highlighted = hljs.highlight(code, { language: lang }).value;\r\n } catch (_) { }\r\n } else {\r\n try {\r\n highlighted = hljs.highlightAuto(code).value;\r\n } catch (_) { }\r\n }\r\n } else {\r\n highlighted = escapeHtmlEntities(code);\r\n }\r\n\r\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\r\n return `
${langDisplay}
${highlighted}
`;\r\n };\r\n\r\n // Custom image renderer for generated images with thumbnail styling and download button.\r\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\r\n renderer.image = function (data) {\r\n const src = sanitizeUrl(data.href);\r\n if (!src) return '';\r\n const alt = data.text || defaultConfig.generatedImageAltText;\r\n const maxWidth = defaultConfig.generatedImageMaxWidth;\r\n return `
\r\n \"${alt}\"\r\n
\r\n \r\n \r\n \r\n
\r\n
`;\r\n };\r\n\r\n // Chart counter for unique IDs\r\n let chartCounter = 0;\r\n\r\n // Collector for charts discovered during marked parsing.\r\n let _pendingCharts = [];\r\n\r\n // Global chart config map shared with ai-chat.js\r\n window.__chartConfigs = window.__chartConfigs || {};\r\n\r\n function createChartHtml(chartId) {\r\n return `
`\r\n + ``\r\n + `
`\r\n + `
`\r\n + ``\r\n + `
`;\r\n }\r\n\r\n // Register [chart:{...json...}] as a native marked block extension so the\r\n // markdown parser handles chart markers inline with surrounding text.\r\n marked.use({\r\n extensions: [{\r\n name: 'chart',\r\n level: 'block',\r\n start(src) {\r\n const idx = src.indexOf('[chart:');\r\n return idx >= 0 ? idx : undefined;\r\n },\r\n tokenizer(src) {\r\n const extracted = tryExtractChartMarker(src);\r\n if (!extracted || extracted.startIndex !== 0) {\r\n return undefined;\r\n }\r\n\r\n const chartId = `chat_chart_${++chartCounter}`;\r\n\r\n return {\r\n type: 'chart',\r\n raw: src.substring(0, extracted.endIndex),\r\n chartId: chartId,\r\n json: extracted.json,\r\n };\r\n },\r\n renderer(token) {\r\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\r\n window.__chartConfigs[token.chartId] = token.json;\r\n return createChartHtml(token.chartId);\r\n }\r\n }]\r\n });\r\n\r\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\r\n function tryExtractChartMarker(text) {\r\n const token = '[chart:';\r\n const start = text.indexOf(token);\r\n if (start < 0) {\r\n return null;\r\n }\r\n\r\n // Find JSON object boundary by balancing braces\r\n const jsonStart = start + token.length;\r\n let i = jsonStart;\r\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\r\n i++;\r\n }\r\n\r\n if (i >= text.length || text[i] !== '{') {\r\n return null;\r\n }\r\n\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n\r\n for (; i < text.length; i++) {\r\n const ch = text[i];\r\n\r\n if (inString) {\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n if (ch === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n inString = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n depth++;\r\n } else if (ch === '}') {\r\n depth--;\r\n if (depth === 0) {\r\n const jsonEnd = i;\r\n // Expect closing bracket after JSON\r\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\r\n if (closeBracketIndex < 0) {\r\n return null;\r\n }\r\n\r\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\r\n return {\r\n startIndex: start,\r\n endIndex: closeBracketIndex + 1,\r\n json: json\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function renderChartsInMessage(message) {\r\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\r\n return;\r\n }\r\n\r\n // Copy and clear pending charts immediately to prevent duplicate renders.\r\n const charts = [...message._pendingCharts];\r\n message._pendingCharts = [];\r\n\r\n // Defer to requestAnimationFrame so the browser has fully laid out the\r\n // canvas elements before Chart.js reads their dimensions.\r\n requestAnimationFrame(() => {\r\n for (const c of charts) {\r\n const canvas = document.getElementById(c.chartId);\r\n if (!canvas) {\r\n continue;\r\n }\r\n\r\n if (typeof Chart === 'undefined') {\r\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\r\n continue;\r\n }\r\n\r\n // When the canvas is inside a hidden container (e.g., display:none),\r\n // it has zero dimensions. Keep the config for later rendering.\r\n if (canvas.offsetParent === null) {\r\n window.__chartConfigs[c.chartId] = c.config;\r\n continue;\r\n }\r\n\r\n try {\r\n // Destroy existing chart instance if re-rendering\r\n if (canvas._chartInstance) {\r\n canvas._chartInstance.destroy();\r\n }\r\n\r\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\r\n cfg.options ??= {};\r\n cfg.options.responsive = true;\r\n cfg.options.maintainAspectRatio = true;\r\n cfg.options.aspectRatio ??= 4 / 3;\r\n\r\n canvas._chartInstance = new Chart(canvas, cfg);\r\n } catch (e) {\r\n console.error('Error creating chart:', e);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Parse markdown content via marked (which natively handles [chart:...] markers\r\n // through the registered extension) and collect pending chart configs for later\r\n // Chart.js rendering.\r\n function parseMarkdownContent(content, message) {\r\n _pendingCharts = [];\r\n const html = marked.parse(content, { renderer });\r\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\r\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\r\n }\r\n\r\n const initialize = (instanceConfig) => {\r\n\r\n const config = Object.assign({}, defaultConfig, instanceConfig);\r\n // Keep defaultConfig in sync so renderers use overridden values\r\n defaultConfig = config;\r\n\r\n if (!config.signalRHubUrl) {\r\n console.error('The signalRHubUrl is required.');\r\n return;\r\n }\r\n\r\n if (!config.appElementSelector) {\r\n console.error('The appElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.chatContainerElementSelector) {\r\n console.error('The chatContainerElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.inputElementSelector) {\r\n console.error('The inputElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.sendButtonElementSelector) {\r\n console.error('The sendButtonElementSelector is required.');\r\n return;\r\n }\r\n\r\n const app = Vue.createApp({\r\n data() {\r\n return {\r\n inputElement: null,\r\n buttonElement: null,\r\n chatContainer: null,\r\n placeholder: null,\r\n isInteractionStarted: false,\r\n isPlaceholderVisible: true,\r\n isStreaming: false,\r\n isNavigatingAway: false,\r\n autoScroll: true,\r\n stream: null,\r\n messages: [],\r\n prompt: '',\r\n initialFieldValues: new Map(),\r\n settingsDirty: false,\r\n saveSettingsTimeout: null,\r\n saveIndicatorTimeout: null,\r\n isRecording: false,\r\n mediaRecorder: null,\r\n preRecordingPrompt: '',\r\n micButton: null,\r\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\r\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\r\n ttsVoiceName: config.ttsVoiceName || null,\r\n audioChunks: [],\r\n audioPlayQueue: [],\r\n isPlayingAudio: false,\r\n currentAudioElement: null,\r\n currentAudioUrl: null,\r\n ttsPlayingMessageIndex: -1,\r\n ttsAudioCache: {},\r\n ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2),\r\n conversationModeEnabled: config.chatMode === 'Conversation',\r\n conversationButton: null,\r\n isConversationMode: false,\r\n notifications: [],\r\n notificationDismissTimers: {},\r\n };\r\n },\r\n computed: {\r\n lastAssistantIndex() {\r\n for (var i = this.messages.length - 1; i >= 0; i--) {\r\n if (this.messages[i].role === 'assistant') {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n },\r\n methods: {\r\n handleBeforeUnload() {\r\n this.isNavigatingAway = true;\r\n },\r\n async startConnection() {\r\n this.connection = new signalR.HubConnectionBuilder()\r\n .withUrl(config.signalRHubUrl)\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n // Allow long-running operations (e.g., multi-step MCP tool calls)\r\n // without the client disconnecting prematurely.\r\n this.connection.serverTimeoutInMilliseconds = 600000;\r\n this.connection.keepAliveIntervalInMilliseconds = 15000;\r\n\r\n this.connection.on(\"LoadInteraction\", (data) => {\r\n this.initializeInteraction(data.itemId, true);\r\n this.messages = [];// Update the title field if it exists\r\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\r\n if (titleInput && data.title) {\r\n titleInput.value = data.title;\r\n }\r\n\r\n (data.messages ?? []).forEach(msg => {\r\n this.addMessage(msg);\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n });\r\n });\r\n });\r\n\r\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\r\n // Update the history list item if it exists\r\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\r\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\r\n if (historyItem) {\r\n historyItem.textContent = title || config.untitledText;\r\n }\r\n\r\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\r\n if (titleInput && title) {\r\n titleInput.value = title;\r\n }\r\n\r\n this.showSaveIndicator('Saved', 'text-success');\r\n });\r\n\r\n this.connection.on(\"ReceiveError\", (error) => {\r\n console.error(\"SignalR Error: \", error);\r\n this.showSaveIndicator('Save failed', 'text-danger');\r\n\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\r\n if (this.isConversationMode) {\r\n if (!isFinal && text) {\r\n this._conversationPartialTranscript = text;\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n var html = '

' + escaped + '

';\r\n\r\n // Show partial transcript as a live user message.\r\n if (!this._conversationPartialMessage) {\r\n this.hidePlaceholder();\r\n this._conversationPartialMessage = {\r\n role: 'user',\r\n content: text,\r\n htmlContent: html,\r\n isPartial: true\r\n };\r\n this.messages.push(this._conversationPartialMessage);\r\n } else {\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = html;\r\n }\r\n this.scrollToBottom();\r\n }\r\n return;\r\n }\r\n\r\n if (text && !this._audioInputSent) {\r\n this.prompt = this.preRecordingPrompt + text;\r\n if (this.inputElement) {\r\n this.inputElement.value = this.prompt;\r\n this.inputElement.dispatchEvent(new Event('input'));\r\n }\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, text) => {\r\n if (text) {\r\n this.stopAudio();\r\n\r\n // If there's an interrupted assistant message still streaming,\r\n // mark it as done to stop the spinner animation.\r\n if (this._conversationAssistantMessage) {\r\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\r\n if (oldMsg) {\r\n oldMsg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Replace the partial transcript message with the final one.\r\n if (this._conversationPartialMessage) {\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\r\n this._conversationPartialMessage.isPartial = false;\r\n this._conversationPartialMessage = null;\r\n } else {\r\n this.addMessage({\r\n role: 'user',\r\n content: text\r\n });\r\n }\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, appearance) => {\r\n if (!this._conversationAssistantMessage) {\r\n this.stopAudio();\r\n this.hideTypingIndicator();\r\n\r\n // Ensure no stale streaming indicators remain from prior messages.\r\n for (var j = 0; j < this.messages.length; j++) {\r\n if (this.messages[j].isStreaming) {\r\n this.messages[j].isStreaming = false;\r\n }\r\n }\r\n\r\n var msgIndex = this.messages.length;\r\n var newMessage = {\r\n id: messageId,\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n appearance: this.normalizeAssistantAppearance(appearance),\r\n };\r\n this.messages.push(newMessage);\r\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\r\n }\r\n\r\n this._conversationAssistantMessage.content += token;\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n if (!msg.appearance) {\r\n msg.appearance = this.normalizeAssistantAppearance(appearance);\r\n }\r\n msg.content = this._conversationAssistantMessage.content;\r\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n this.scrollToBottom();\r\n });\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId) => {\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\r\n if (base64Audio) {\r\n const binaryString = atob(base64Audio);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n this.audioChunks.push(bytes);\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\r\n this.playCollectedAudio();\r\n });\r\n\r\n this.connection.on(\"HistoryCleared\", (itemId) => {\r\n // Clear messages and show placeholder\r\n this.messages = [];\r\n this.showPlaceholder();\r\n\r\n // Hide the clear history button since there's no history now\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.classList.add('d-none');\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveNotification\", (notification) => {\r\n this.receiveNotification(notification);\r\n });\r\n\r\n this.connection.on(\"UpdateNotification\", (notification) => {\r\n this.updateNotification(notification);\r\n });\r\n\r\n this.connection.on(\"RemoveNotification\", (notificationType) => {\r\n this.removeNotification(notificationType);\r\n });\r\n\r\n this.connection.onreconnecting(() => {\r\n console.warn(\"SignalR: reconnecting...\");\r\n });\r\n\r\n this.connection.onreconnected(() => {\r\n console.info(\"SignalR: reconnected.\");\r\n this.reloadCurrentInteraction();\r\n });\r\n\r\n this.connection.onclose((error) => {\r\n if (this.isNavigatingAway) {\r\n return;\r\n }\r\n\r\n if (error) {\r\n console.warn(\"SignalR connection closed with error:\", error.message || error);\r\n }\r\n });\r\n\r\n try {\r\n await this.connection.start();\r\n } catch (err) {\r\n console.error(\"SignalR Connection Error: \", err);\r\n }\r\n },\r\n addMessageInternal(message) {\r\n if (message.role === 'assistant') {\r\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\r\n }\r\n\r\n if (message.content && !message.htmlContent) {\r\n message.htmlContent = parseMarkdownContent(message.content, message);\r\n }\r\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\r\n this.messages.push(message);\r\n\r\n this.$nextTick(() => {\r\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\r\n });\r\n },\r\n addMessage(message) {\r\n if (message.content) {\r\n let processedContent = message.content.trim();\r\n\r\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\r\n\r\n // Only include references that were actually cited in the response.\r\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\r\n\r\n if (citedRefs.length) {\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders.\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processedContent = processedContent.replaceAll(key, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processedContent = processedContent.replaceAll('
', ',');\r\n\r\n processedContent += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || `[doc:${value.index}]`;\r\n processedContent += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n }\r\n }\r\n\r\n message.content = processedContent;\r\n message.htmlContent = parseMarkdownContent(processedContent, message);\r\n }\r\n\r\n this.addMessageInternal(message);\r\n this.hidePlaceholder();\r\n\r\n this.$nextTick(() => {\r\n // Render any pending charts once the DOM is updated\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n hidePlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.add('d-none');\r\n }\r\n this.isPlaceholderVisible = false;\r\n },\r\n showPlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.remove('d-none');\r\n }\r\n this.isPlaceholderVisible = true;\r\n },\r\n fireEvent(event) {\r\n document.dispatchEvent(event);\r\n },\r\n normalizeAssistantAppearance(appearance) {\r\n if (!appearance) {\r\n return null;\r\n }\r\n\r\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\r\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\r\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\r\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\r\n\r\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\r\n return null;\r\n }\r\n\r\n return {\r\n label: label,\r\n icon: icon,\r\n cssClass: cssClass,\r\n disableStreamingAnimation: disableStreamingAnimation,\r\n };\r\n },\r\n getAssistantLabel(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\r\n },\r\n getAssistantRoleClasses(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n var classes = ['ai-chat-msg-role'];\r\n\r\n if (appearance && appearance.cssClass) {\r\n classes.push(appearance.cssClass);\r\n } else {\r\n classes.push('ai-chat-msg-role-assistant');\r\n }\r\n\r\n return classes;\r\n },\r\n getAssistantIconClasses(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\r\n },\r\n getAssistantIcon(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\r\n },\r\n shouldAnimateAssistantIcon(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return !!message &&\r\n message.isStreaming &&\r\n index === this.lastAssistantIndex &&\r\n !(appearance && appearance.disableStreamingAnimation);\r\n },\r\n isIndicator(message) {\r\n return message.role === 'indicator';\r\n },\r\n async sendMessage() {\r\n let trimmedPrompt = this.prompt.trim();\r\n\r\n if (!trimmedPrompt) {\r\n return;\r\n }\r\n\r\n // Stop any active recording before sending.\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\r\n this._audioInputSent = true;\r\n\r\n // Flush any pending settings save before sending a message\r\n // to prevent concurrent hub calls that can cause database deadlocks.\r\n await this.flushPendingSave();\r\n\r\n this.addMessage({\r\n role: 'user',\r\n content: trimmedPrompt\r\n });\r\n\r\n // Show the clear history button since we now have prompts\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.classList.remove('d-none');\r\n }\r\n\r\n this.streamMessage(trimmedPrompt);\r\n this.inputElement.value = '';\r\n this.prompt = '';\r\n },\r\n streamMessage(trimmedPrompt) {\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n\r\n this.streamingStarted();\r\n this.showTypingIndicator();\r\n this.autoScroll = true;\r\n\r\n var content = '';\r\n var references = {};\r\n var lastResponseId = null;\r\n\r\n var messageIndex = this.messages.length;\r\n var currentItemId = this.getItemId();\r\n\r\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\r\n .subscribe({\r\n next: (chunk) => {\r\n let message = this.messages[messageIndex];\r\n\r\n if (!message) {\r\n if (chunk.sessionId && !currentItemId) {\r\n this.setItemId(chunk.sessionId);\r\n }\r\n\r\n this.hideTypingIndicator();\r\n messageIndex = this.messages.length;\r\n let newMessage = {\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n };\r\n\r\n this.messages.push(newMessage);\r\n message = newMessage;\r\n }\r\n\r\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\r\n for (const [key, value] of Object.entries(chunk.references)) {\r\n references[key] = value;\r\n }\r\n }\r\n\r\n if (chunk.content) {\r\n // When the responseId changes (e.g., after an internal tool call),\r\n // insert a line break to visually separate response segments.\r\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\r\n content += '\\n\\n';\r\n }\r\n\r\n if (chunk.responseId) {\r\n lastResponseId = chunk.responseId;\r\n }\r\n\r\n let processedContent = chunk.content;\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n processedContent = processedContent.replaceAll(key, `${value.index}`);\r\n }\r\n\r\n content += processedContent.replaceAll('
', ',');\r\n }\r\n\r\n message.content = content;\r\n\r\n message.htmlContent = parseMarkdownContent(content, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n complete: () => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n if (!msg || !msg.content) {\r\n // No content received at all.\r\n this.hideTypingIndicator();\r\n }\r\n\r\n // Trigger text-to-speech only in conversation mode.\r\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\r\n this.synthesizeSpeech(msg.content);\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n },\r\n error: (err) => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n this.hideTypingIndicator();\r\n\r\n if (!this.isNavigatingAway) {\r\n this.addMessage(this.getServiceDownMessage());\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n\r\n console.error(\"Stream error:\", err);\r\n }\r\n });\r\n },\r\n getServiceDownMessage() {\r\n return {\r\n role: \"assistant\",\r\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\r\n htmlContent: \"\",\r\n };\r\n },\r\n processReferences(references, messageIndex) {\r\n if (Object.keys(references).length) {\r\n let message = this.messages[messageIndex];\r\n const content = message.content || '';\r\n\r\n // Only include references that were actually cited in the response.\r\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\r\n const citedRefs = Object.entries(references).filter(([key, value]) =>\r\n content.includes(key) || content.includes(`${value.index}`)\r\n );\r\n\r\n if (!citedRefs.length) {\r\n return;\r\n }\r\n\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\r\n let processed = content.trim();\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processed = processed.replaceAll(key, placeholder);\r\n processed = processed.replaceAll(`${value.index}`, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processed = processed.replaceAll('', ',');\r\n\r\n processed += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || `[doc:${value.index}]`;\r\n processed += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n\r\n message.content = processed;\r\n message.htmlContent = parseMarkdownContent(processed, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n }\r\n },\r\n streamingStarted() {\r\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\r\n\r\n if (stopIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n },\r\n streamingFinished() {\r\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\r\n\r\n if (startIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n // Directly manipulate the DOM to stop all streaming animations.\r\n if (this.chatContainer) {\r\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\r\n for (var i = 0; i < icons.length; i++) {\r\n icons[i].classList.remove('ai-streaming-icon');\r\n icons[i].classList.add('ai-bot-icon');\r\n }\r\n }\r\n\r\n // Also update Vue data for consistency.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Save any settings that were deferred during streaming.\r\n if (this.settingsDirty) {\r\n this.debouncedSaveSettings();\r\n }\r\n },\r\n handleExternalTtsStop(e) {\r\n if (e?.detail?.sourceId === this.ttsInstanceId) {\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n },\r\n synthesizeSpeech(text, cacheIndex) {\r\n if (!this.textToSpeechEnabled || !text || !this.connection) {\r\n return;\r\n }\r\n\r\n this.audioChunks = [];\r\n this.isPlayingAudio = true;\r\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\r\n\r\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\r\n .catch(err => {\r\n console.error(\"TTS synthesis error:\", err);\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this._ttsCacheIndex = -1;\r\n });\r\n },\r\n toggleMessageTts(message, index) {\r\n if (this.ttsPlayingMessageIndex === index) {\r\n this.stopAudio();\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\r\n detail: { sourceId: this.ttsInstanceId }\r\n }));\r\n this.ttsPlayingMessageIndex = index;\r\n\r\n if (this.ttsAudioCache[index]) {\r\n this.playAudioBlob(this.ttsAudioCache[index]);\r\n return;\r\n }\r\n\r\n this.synthesizeSpeech(message.content, index);\r\n },\r\n playCollectedAudio() {\r\n if (this.audioChunks.length === 0) {\r\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n }\r\n return;\r\n }\r\n\r\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\r\n const combined = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const chunk of this.audioChunks) {\r\n combined.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n this.audioChunks = [];\r\n\r\n const blob = new Blob([combined], { type: 'audio/mp3' });\r\n\r\n if (this._ttsCacheIndex >= 0) {\r\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\r\n this._ttsCacheIndex = -1;\r\n }\r\n\r\n // If audio is currently playing, queue this blob for later.\r\n if (this.isPlayingAudio && this.currentAudioElement) {\r\n this.audioPlayQueue.push(blob);\r\n return;\r\n }\r\n\r\n this.playAudioBlob(blob);\r\n },\r\n playAudioBlob(blob) {\r\n const url = URL.createObjectURL(blob);\r\n const audio = new Audio(url);\r\n\r\n this.currentAudioUrl = url;\r\n this.currentAudioElement = audio;\r\n this.isPlayingAudio = true;\r\n\r\n audio.addEventListener('ended', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.addEventListener('error', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.play().catch(err => {\r\n console.error(\"Audio playback error:\", err);\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n });\r\n },\r\n playNextInQueue() {\r\n if (this.audioPlayQueue.length > 0) {\r\n const nextBlob = this.audioPlayQueue.shift();\r\n this.playAudioBlob(nextBlob);\r\n } else {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this.conversationModeOnAudioEnded();\r\n }\r\n },\r\n stopAudio() {\r\n if (this.currentAudioElement) {\r\n this.currentAudioElement.pause();\r\n this.currentAudioElement.currentTime = 0;\r\n this.currentAudioElement = null;\r\n }\r\n if (this.currentAudioUrl) {\r\n URL.revokeObjectURL(this.currentAudioUrl);\r\n this.currentAudioUrl = null;\r\n }\r\n this.audioChunks = [];\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n },\r\n toggleConversationMode() {\r\n if (this.isConversationMode) {\r\n this.stopConversationMode();\r\n } else {\r\n this.startConversationMode();\r\n }\r\n },\r\n startConversationMode() {\r\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = true;\r\n this.updateConversationButton();\r\n this._conversationPartialTranscript = '';\r\n this._conversationAssistantMessage = null;\r\n this._conversationPartialMessage = null;\r\n\r\n // Remove any previous conversation ended notification.\r\n this.removeNotification('conversation-ended');\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this._conversationSubject = new signalR.Subject();\r\n this._conversationStream = stream;\r\n\r\n // Create an AnalyserNode for volume-based interrupt detection.\r\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\r\n if (AudioCtx) {\r\n this._conversationAudioCtx = new AudioCtx();\r\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\r\n this._conversationAnalyser.fftSize = 256;\r\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\r\n micSource.connect(this._conversationAnalyser);\r\n }\r\n\r\n var pendingChunk = Promise.resolve();\r\n var analyser = this._conversationAnalyser;\r\n var interruptVolumeThreshold = 30;\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n // During TTS playback, check mic volume to detect\r\n // user interruption (speaking above threshold).\r\n if (this.isPlayingAudio && analyser) {\r\n var freqData = new Uint8Array(analyser.frequencyBinCount);\r\n analyser.getByteFrequencyData(freqData);\r\n var sum = 0;\r\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\r\n var avg = sum / freqData.length;\r\n\r\n if (avg >= interruptVolumeThreshold) {\r\n // User is speaking — interrupt TTS playback.\r\n this.stopAudio();\r\n }\r\n }\r\n\r\n // Always send audio to STT — browser echo cancellation\r\n // handles speaker echo; continuous audio avoids gaps\r\n // that increase recognition latency.\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n try {\r\n this._conversationSubject.next(base64);\r\n } catch (err) {\r\n // Subject may have been completed already.\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => {\r\n try {\r\n this._conversationSubject.complete();\r\n } catch (err) {\r\n // Already completed.\r\n }\r\n });\r\n });\r\n\r\n var itemId = this.getItemId();\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n });\r\n },\r\n stopConversationMode() {\r\n if (!this.isConversationMode) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n\r\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\r\n if (this.connection) {\r\n this.connection.invoke(\"StopConversation\").catch(function () { });\r\n }\r\n\r\n if (this.isRecording && this.mediaRecorder) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n }\r\n\r\n this.stopAudio();\r\n this._conversationPartialTranscript = '';\r\n this._conversationPartialMessage = null;\r\n\r\n // Clean up the AudioContext used for volume monitoring.\r\n if (this._conversationAudioCtx) {\r\n this._conversationAudioCtx.close().catch(function () { });\r\n this._conversationAudioCtx = null;\r\n this._conversationAnalyser = null;\r\n }\r\n\r\n // Mark any in-flight assistant message as done to stop the spinner.\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Safety net: clear all lingering streaming indicators.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Show a \"conversation ended\" notification system message.\r\n this.receiveNotification({\r\n type: 'conversation-ended',\r\n content: 'Conversation ended.',\r\n icon: 'fa-solid fa-circle-check',\r\n dismissible: true,\r\n autoDismissMs: 5000\r\n });\r\n },\r\n updateConversationButton() {\r\n if (!this.conversationButton) {\r\n return;\r\n }\r\n\r\n if (this.isConversationMode) {\r\n this.conversationButton.classList.add('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\r\n var endHtml = this.conversationButton.getAttribute('data-end-html');\r\n if (endHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n } else {\r\n this.conversationButton.classList.remove('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\r\n this.conversationButton.classList.add('btn-outline-dark');\r\n this.conversationButton.blur();\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\r\n var startHtml = this.conversationButton.getAttribute('data-start-html');\r\n if (startHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n }\r\n },\r\n conversationModeSendPrompt() {\r\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\r\n },\r\n conversationModeOnAudioEnded() {\r\n // Legacy: in conversation mode, continuation is handled\r\n // by the persistent stream.\r\n },\r\n showTypingIndicator() {\r\n this.addMessage({\r\n role: 'indicator',\r\n htmlContent: config.indicatorTemplate\r\n });\r\n },\r\n hideTypingIndicator() {\r\n const originalLength = this.messages.length;\r\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\r\n const removedCount = originalLength - this.messages.length;\r\n return removedCount;\r\n },\r\n scrollToBottom() {\r\n if (!this.autoScroll) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\r\n }, 50);\r\n },\r\n handleUserInput(event) {\r\n this.prompt = event.target.value;\r\n },\r\n getItemId() {\r\n return this.inputElement.getAttribute('data-interaction-id')\r\n || this.inputElement.getAttribute('data-item-id');\r\n },\r\n getSaveIndicatorElement() {\r\n if (config.saveIndicatorElementSelector) {\r\n return document.querySelector(config.saveIndicatorElementSelector);\r\n }\r\n\r\n return document.querySelector('[data-chat-interaction-save-indicator]');\r\n },\r\n showSaveIndicator(text, className) {\r\n const indicator = this.getSaveIndicatorElement();\r\n if (!indicator) {\r\n return;\r\n }\r\n\r\n indicator.textContent = text || '';\r\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\r\n\r\n if (this.saveIndicatorTimeout) {\r\n clearTimeout(this.saveIndicatorTimeout);\r\n this.saveIndicatorTimeout = null;\r\n }\r\n\r\n if (!text) {\r\n return;\r\n }\r\n\r\n this.saveIndicatorTimeout = setTimeout(() => {\r\n indicator.textContent = '';\r\n this.saveIndicatorTimeout = null;\r\n }, 3000);\r\n },\r\n clearPendingSettingsSave() {\r\n if (this.saveSettingsTimeout) {\r\n clearTimeout(this.saveSettingsTimeout);\r\n this.saveSettingsTimeout = null;\r\n }\r\n },\r\n getFieldLabel(input) {\r\n const label = input\r\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\r\n ?.querySelector('label');\r\n\r\n if (!label) {\r\n return input.dataset.setting || 'This field';\r\n }\r\n\r\n return (label.textContent || '')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n || input.dataset.setting\r\n || 'This field';\r\n },\r\n getValidationFeedbackElement(input) {\r\n let feedback = input.nextElementSibling;\r\n if (feedback && feedback.classList.contains('invalid-feedback')) {\r\n return feedback;\r\n }\r\n\r\n feedback = document.createElement('div');\r\n feedback.className = 'invalid-feedback';\r\n input.insertAdjacentElement('afterend', feedback);\r\n\r\n return feedback;\r\n },\r\n clearSettingValidationError(input) {\r\n input.classList.remove('is-invalid');\r\n input.removeAttribute('aria-invalid');\r\n\r\n const feedback = input.nextElementSibling;\r\n if (feedback && feedback.classList.contains('invalid-feedback')) {\r\n feedback.textContent = '';\r\n }\r\n },\r\n setSettingValidationError(input, message) {\r\n const feedback = this.getValidationFeedbackElement(input);\r\n input.classList.add('is-invalid');\r\n input.setAttribute('aria-invalid', 'true');\r\n feedback.textContent = message;\r\n },\r\n getSettingValidationMessage(input) {\r\n if (!input || input.disabled || input.type !== 'number') {\r\n return null;\r\n }\r\n\r\n const value = (input.value || '').trim();\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const number = Number(value);\r\n const fieldLabel = this.getFieldLabel(input);\r\n\r\n if (Number.isNaN(number)) {\r\n return `${fieldLabel} must be a valid number.`;\r\n }\r\n\r\n const min = input.getAttribute('min');\r\n if (min !== null && number < Number(min)) {\r\n return `${fieldLabel} must be ${min} or greater.`;\r\n }\r\n\r\n const max = input.getAttribute('max');\r\n if (max !== null && number > Number(max)) {\r\n return `${fieldLabel} must be ${max} or less.`;\r\n }\r\n\r\n return null;\r\n },\r\n validateSettingInput(input) {\r\n const message = this.getSettingValidationMessage(input);\r\n if (!message) {\r\n this.clearSettingValidationError(input);\r\n return true;\r\n }\r\n\r\n this.setSettingValidationError(input, message);\r\n return false;\r\n },\r\n validateSettings() {\r\n let isValid = true;\r\n\r\n this.getSettingInputs().forEach(input => {\r\n isValid = this.validateSettingInput(input) && isValid;\r\n });\r\n\r\n return isValid;\r\n },\r\n queueSettingsSave() {\r\n if (!this.validateSettings()) {\r\n this.clearPendingSettingsSave();\r\n this.settingsDirty = false;\r\n this.showSaveIndicator('Fix errors', 'text-danger');\r\n return;\r\n }\r\n\r\n this.settingsDirty = true;\r\n this.showSaveIndicator('Saving...', 'text-warning');\r\n this.debouncedSaveSettings();\r\n },\r\n getSettingInputs() {\r\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\r\n if (explicitInputs.length > 0) {\r\n return explicitInputs;\r\n }\r\n\r\n return document.querySelectorAll(\r\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\r\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\r\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\r\n );\r\n },\r\n getSelectedGroupValues(groupName, fallbackSelector) {\r\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked`);\r\n if (explicitSelections.length > 0) {\r\n const values = [];\r\n\r\n explicitSelections.forEach(checkbox => {\r\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\r\n if (value) {\r\n values.push(value);\r\n }\r\n });\r\n\r\n return values;\r\n }\r\n\r\n if (!fallbackSelector) {\r\n return [];\r\n }\r\n\r\n const values = [];\r\n const checkboxes = document.querySelectorAll(fallbackSelector);\r\n\r\n checkboxes.forEach(checkbox => {\r\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\r\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\r\n\r\n if (hiddenInput && hiddenInput.value) {\r\n values.push(hiddenInput.value);\r\n }\r\n });\r\n\r\n return values;\r\n },\r\n getPromptTemplateSelections() {\r\n const promptTemplates = [];\r\n\r\n document.querySelectorAll('.prompt-template-card').forEach(card => {\r\n const templateIdInput = card.querySelector('.prompt-template-id-input');\r\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\r\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\r\n\r\n if (!templateId) {\r\n return;\r\n }\r\n\r\n promptTemplates.push({\r\n templateId: templateId,\r\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\r\n });\r\n });\r\n\r\n return promptTemplates;\r\n },\r\n receiveNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n // Replace existing notification with same type, or add new one.\r\n var idx = this.notifications.findIndex(n => n.type === notification.type);\r\n if (idx >= 0) {\r\n this.notifications.splice(idx, 1, notification);\r\n } else {\r\n this.notifications.push(notification);\r\n }\r\n this.scheduleNotificationDismiss(notification);\r\n this.scrollToBottom();\r\n },\r\n updateNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var idx = this.notifications.findIndex(n => n.type === notification.type);\r\n if (idx >= 0) {\r\n this.notifications.splice(idx, 1, notification);\r\n this.scheduleNotificationDismiss(notification);\r\n this.scrollToBottom();\r\n }\r\n },\r\n scheduleNotificationDismiss(notification) {\r\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\r\n return;\r\n }\r\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\r\n this.removeNotification(notification.type);\r\n }, notification.autoDismissMs);\r\n },\r\n clearNotificationDismiss(notificationType) {\r\n var timerId = this.notificationDismissTimers[notificationType];\r\n if (!timerId) {\r\n return;\r\n }\r\n clearTimeout(timerId);\r\n delete this.notificationDismissTimers[notificationType];\r\n },\r\n removeNotification(notificationType) {\r\n this.clearNotificationDismiss(notificationType);\r\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\r\n },\r\n dismissNotification(notificationType) {\r\n this.removeNotification(notificationType);\r\n },\r\n handleNotificationAction(notificationType, actionName) {\r\n if (!this.connection) {\r\n return;\r\n }\r\n var itemId = this.getItemId();\r\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\r\n .catch(err => console.error('Failed to handle notification action:', err));\r\n },\r\n setItemId(itemId) {\r\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\r\n this.inputElement.setAttribute('data-item-id', itemId || '');\r\n },\r\n resetInteraction() {\r\n this.setItemId('');\r\n this.isInteractionStarted = false;\r\n this.messages = [];\r\n this.showPlaceholder();\r\n },\r\n initializeApp() {\r\n this.inputElement = document.querySelector(config.inputElementSelector);\r\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\r\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\r\n this.placeholder = document.querySelector(config.placeholderElementSelector);\r\n\r\n const itemId = this.getItemId();\r\n if (itemId) {\r\n this.loadInteraction(itemId);\r\n }\r\n\r\n // Pause auto-scroll when the user manually scrolls up during streaming.\r\n this.chatContainer.addEventListener('scroll', () => {\r\n if (!this.stream) {\r\n return;\r\n }\r\n const threshold = 30;\r\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\r\n this.autoScroll = atBottom;\r\n });\r\n\r\n this.inputElement.addEventListener('keyup', event => {\r\n if (this.stream != null) {\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" && !event.shiftKey) {\r\n this.buttonElement.click();\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('input', (e) => {\r\n this.handleUserInput(e);\r\n\r\n if (e.target.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('paste', (e) => {\r\n // Use setTimeout to allow the paste to complete before checking the value\r\n setTimeout(() => {\r\n this.prompt = this.inputElement.value;\r\n if (this.inputElement.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n }, 0);\r\n });\r\n\r\n this.buttonElement.addEventListener('click', () => {\r\n if (this.stream != null) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n\r\n this.streamingFinished();\r\n this.hideTypingIndicator();\r\n\r\n // Clean up: remove empty assistant message or stop streaming animation.\r\n if (this.messages.length > 0) {\r\n const lastMsg = this.messages[this.messages.length - 1];\r\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\r\n this.messages.pop();\r\n } else if (lastMsg.isStreaming) {\r\n lastMsg.isStreaming = false;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.sendMessage();\r\n });\r\n\r\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\r\n\r\n for (var i = 0; i < chatInteractionItems.length; i++) {\r\n chatInteractionItems[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n var itemId = e.target.getAttribute('data-interaction-id');\r\n\r\n if (!itemId) {\r\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\r\n return;\r\n }\r\n\r\n this.loadInteraction(itemId);\r\n });\r\n }\r\n\r\n for (let i = 0; i < config.messages.length; i++) {\r\n this.addMessage(config.messages[i]);\r\n }\r\n\r\n // Delegate click for code block copy buttons.\r\n if (this.chatContainer) {\r\n this.chatContainer.addEventListener('click', (e) => {\r\n var btn = e.target.closest('.ai-code-copy-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n\r\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\r\n if (!block) {\r\n return;\r\n }\r\n\r\n var codeEl = block.querySelector('code');\r\n if (codeEl) {\r\n navigator.clipboard.writeText(codeEl.textContent);\r\n var copiedText = config.codeCopiedText || 'Copied!';\r\n btn.innerHTML = ' ' + copiedText;\r\n setTimeout(() => {\r\n btn.innerHTML = '';\r\n }, 2000);\r\n }\r\n });\r\n }\r\n\r\n document.addEventListener('input', event => {\r\n if (event.target.matches('.setting-input[data-setting]')) {\r\n this.validateSettingInput(event.target);\r\n this.queueSettingsSave();\r\n }\r\n });\r\n\r\n document.addEventListener('change', event => {\r\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .group-toggle, .ci-agent-global-toggle')) {\r\n if (event.target.matches('.setting-input[data-setting]')) {\r\n this.validateSettingInput(event.target);\r\n }\r\n\r\n this.queueSettingsSave();\r\n return;\r\n }\r\n\r\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\r\n this.queueSettingsSave();\r\n }\r\n });\r\n\r\n document.addEventListener('click', event => {\r\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n this.queueSettingsSave();\r\n }, 0);\r\n });\r\n\r\n // Add event listener for clear history button\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.addEventListener('click', () => {\r\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\r\n if (itemId) {\r\n this.clearHistory(itemId);\r\n }\r\n });\r\n }\r\n\r\n // Initialize speech-to-text microphone button.\r\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\r\n this.micButton = document.querySelector(config.micButtonElementSelector);\r\n if (this.micButton) {\r\n this.micButton.style.display = '';\r\n this.micButton.addEventListener('click', () => {\r\n this.toggleRecording();\r\n });\r\n }\r\n }\r\n\r\n // Initialize conversation mode button.\r\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\r\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\r\n if (this.conversationButton) {\r\n this.conversationButton.addEventListener('click', () => {\r\n this.toggleConversationMode();\r\n });\r\n }\r\n }\r\n },\r\n loadInteraction(itemId) {\r\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\r\n },\r\n reloadCurrentInteraction() {\r\n const itemId = this.getItemId();\r\n if (itemId) {\r\n this.loadInteraction(itemId);\r\n }\r\n },\r\n clearHistory(itemId) {\r\n const self = this;\r\n confirmDialog({\r\n title: config.clearHistoryTitle,\r\n message: config.clearHistoryMessage,\r\n okText: config.clearHistoryOkText,\r\n cancelText: config.clearHistoryCancelText,\r\n callback: function (confirmed) {\r\n if (confirmed) {\r\n // Cancel any active stream before clearing history.\r\n if (self.stream) {\r\n self.stream.dispose();\r\n self.stream = null;\r\n self.hideTypingIndicator();\r\n self.streamingFinished();\r\n }\r\n\r\n self.connection.invoke(\"ClearHistory\", itemId)\r\n .catch(err => console.error('Error clearing history:', err));\r\n }\r\n }\r\n });\r\n },\r\n debouncedSaveSettings() {\r\n // Clear any existing timeout to reset the debounce timer\r\n this.clearPendingSettingsSave();\r\n\r\n // Don't save while streaming — it will be saved when streaming completes.\r\n if (this.stream) {\r\n return;\r\n }\r\n\r\n // Set a new timeout to save after 850ms of no changes\r\n this.saveSettingsTimeout = setTimeout(() => {\r\n if (this.settingsDirty) {\r\n this.saveSettings();\r\n this.settingsDirty = false;\r\n }\r\n this.saveSettingsTimeout = null;\r\n }, 850);\r\n },\r\n getSelectedToolNames() {\r\n return this.getSelectedGroupValues(\r\n 'toolNames',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\r\n );\r\n },\r\n getSelectedMcpConnectionIds() {\r\n return this.getSelectedGroupValues(\r\n 'mcpConnectionIds',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\r\n );\r\n },\r\n getSelectedA2AConnectionIds() {\r\n return this.getSelectedGroupValues('a2aConnectionIds');\r\n },\r\n getSelectedAgentNames() {\r\n return this.getSelectedGroupValues(\r\n 'agentNames',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\r\n );\r\n },\r\n saveSettings() {\r\n const itemId = this.getItemId();\r\n if (!itemId) {\r\n return Promise.resolve();\r\n }\r\n\r\n if (!this.validateSettings()) {\r\n this.showSaveIndicator('Fix errors', 'text-danger');\r\n return Promise.resolve();\r\n }\r\n\r\n const settings = {};\r\n\r\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\r\n // This avoids coupling the JS to specific field names — new fields added by\r\n // any module are automatically included.\r\n const inputs = this.getSettingInputs();\r\n\r\n inputs.forEach(input => {\r\n const key = input.dataset.setting\r\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\r\n\r\n if (!key) {\r\n return;\r\n }\r\n\r\n if (input.type === 'checkbox') {\r\n settings[key] = input.checked;\r\n } else if (input.type === 'number') {\r\n settings[key] = input.value ? parseFloat(input.value) : null;\r\n } else {\r\n settings[key] = input.value || null;\r\n }\r\n });\r\n\r\n // Add tool, MCP connection, and agent collections (special handling).\r\n settings.toolNames = this.getSelectedToolNames();\r\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\r\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\r\n settings.agentNames = this.getSelectedAgentNames();\r\n\r\n const promptTemplates = this.getPromptTemplateSelections();\r\n if (promptTemplates.length > 0) {\r\n settings.promptTemplates = promptTemplates;\r\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\r\n }\r\n\r\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\r\n .catch(err => {\r\n console.error('Error saving settings:', err);\r\n this.showSaveIndicator('Save failed', 'text-danger');\r\n });\r\n },\r\n flushPendingSave() {\r\n if (this.saveSettingsTimeout) {\r\n clearTimeout(this.saveSettingsTimeout);\r\n this.saveSettingsTimeout = null;\r\n }\r\n\r\n if (this.settingsDirty) {\r\n this.settingsDirty = false;\r\n return this.saveSettings();\r\n }\r\n\r\n return Promise.resolve();\r\n },\r\n initializeInteraction(itemId, force) {\r\n if (this.isInteractionStarted && !force) {\r\n return;\r\n }\r\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\r\n this.setItemId(itemId);\r\n this.isInteractionStarted = true;\r\n },\r\n copyResponse(message) {\r\n navigator.clipboard.writeText(message);\r\n },\r\n startRecording() {\r\n if (this.isRecording || !this.connection) {\r\n return;\r\n }\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this.preRecordingPrompt = this.prompt;\r\n this._audioInputSent = false;\r\n\r\n var subject = new signalR.Subject();\r\n var itemId = this.getItemId();\r\n var pendingChunk = Promise.resolve();\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n subject.next(base64);\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => subject.complete());\r\n });\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n this.updateMicButton();\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n });\r\n },\r\n stopRecording() {\r\n if (!this.isRecording || !this.mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n this.updateMicButton();\r\n },\r\n toggleRecording() {\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n } else {\r\n this.startRecording();\r\n }\r\n },\r\n updateMicButton() {\r\n if (!this.micButton) {\r\n return;\r\n }\r\n\r\n if (this.isRecording) {\r\n this.micButton.classList.add('stt-recording');\r\n this.micButton.innerHTML = '';\r\n } else {\r\n this.micButton.classList.remove('stt-recording');\r\n this.micButton.innerHTML = '';\r\n }\r\n }\r\n },\r\n watch: {\r\n isPlayingAudio() {\r\n // Reserved for future use — volume-based interrupt detection\r\n // no longer mutes tracks; browser echo cancellation handles echo.\r\n },\r\n isConversationMode(active) {\r\n if (this.micButton) {\r\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\r\n }\r\n\r\n if (this.buttonElement) {\r\n this.buttonElement.style.display = active ? 'none' : '';\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.disabled = active;\r\n if (active) {\r\n this.inputElement.placeholder = '';\r\n }\r\n }\r\n }\r\n },\r\n mounted() {\r\n (async () => {\r\n await this.startConnection();\r\n this.initializeApp();\r\n })();\r\n\r\n window.addEventListener('beforeunload', this.handleBeforeUnload);\r\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n },\r\n beforeUnmount() {\r\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\r\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n\r\n this.stopAudio(false);\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n },\r\n template: config.messageTemplate\r\n }).mount(config.appElementSelector);\r\n\r\n return app;\r\n };\r\n\r\n return {\r\n initialize: initialize\r\n };\r\n}();\r\n\r\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\r\ndocument.addEventListener('click', function (e) {\r\n const btn = e.target.closest('.download-chart-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n const chartId = btn.getAttribute('data-chart-id');\r\n const canvas = chartId ? document.getElementById(chartId) : null;\r\n if (!canvas) {\r\n console.error('Chart canvas not found:', chartId);\r\n return;\r\n }\r\n const link = document.createElement('a');\r\n link.download = 'chart-' + chartId + '.png';\r\n link.href = canvas.toDataURL('image/png');\r\n link.click();\r\n});\r\n\r\n// Intercept download clicks for data-URI images and convert to blob downloads.\r\ndocument.addEventListener('click', function (e) {\r\n const link = e.target.closest('.ai-download-image');\r\n if (!link) {\r\n return;\r\n }\r\n\r\n const container = link.closest('.generated-image-container');\r\n const img = container?.querySelector('img');\r\n if (!img) {\r\n return;\r\n }\r\n\r\n const src = img.src;\r\n if (!src || !src.startsWith('data:')) {\r\n return; // Normal URL – let the default behaviour handle it.\r\n }\r\n\r\n e.preventDefault();\r\n\r\n fetch(src)\r\n .then(function (res) { return res.blob(); })\r\n .then(function (blob) {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = link.getAttribute('download') || 'generated-image.png';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\r\n })\r\n .catch(function (err) { console.error('Failed to download image:', err); });\r\n});\r\n"]} diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css b/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css index 26942bf7..4a520ead 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css @@ -45,6 +45,14 @@ overflow: hidden; } +.ai-chat-widget-container.ai-chat-widget-resizable { + resize: both; + min-width: 320px; + min-height: 420px; + max-width: min(90vw, 960px); + max-height: min(90vh, 960px); +} + .ai-chat-widget-container.open { display: flex; } @@ -58,6 +66,31 @@ color: white; } +.ai-chat-widget-header.ai-chat-widget-drag-handle { + cursor: move; + user-select: none; + touch-action: none; +} + +.ai-chat-widget-header-actions { + display: flex; + align-items: center; + gap: 0.15rem; +} + +.ai-chat-widget-toggle.ai-chat-widget-draggable { + touch-action: none; +} + +.ai-chat-widget-container.ai-chat-widget-dragging, +.ai-chat-widget-toggle.ai-chat-widget-dragging { + transition: none; +} + +.ai-chat-widget-toggle.ai-chat-widget-dragging:hover { + transform: none; +} + .ai-chat-widget-header .title { font-weight: 600; font-size: 0.95rem; @@ -140,7 +173,7 @@ .ai-chat-widget-messages .ai-chat-message-body { position: relative; - padding: 0 0 0.25rem 0; + padding: 0; overflow-wrap: break-word; word-break: break-word; min-width: 0; @@ -153,17 +186,22 @@ /* ── Message action buttons (copy, thumbs up/down) ── */ .ai-chat-widget-messages .message-buttons-container { position: absolute; - right: 0; - top: 0; + right: 0.1rem; + bottom: 0; display: inline-flex; + align-items: center; gap: 0.35rem; + width: auto; + max-width: max-content; opacity: 0; pointer-events: none; transition: opacity 0.15s ease-in-out; - background: #fff; - padding: 0.15rem 0.35rem; - border-radius: 4px; + background: rgba(255, 255, 255, 0.96); + padding: 0.2rem 0.35rem; + border-radius: 999px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); + margin-bottom: 1rem; + transform: translateY(50%); z-index: 1; } @@ -174,10 +212,25 @@ } .ai-chat-widget-messages .message-buttons-container > .button-message-toolbox { + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + width: 1.75rem; + height: 1.75rem; + margin: 0 !important; + padding: 0 !important; + border-radius: 50%; color: var(--bs-secondary-color, #6c757d) !important; text-decoration: none; } +.ai-chat-widget-messages .message-buttons-container .ai-chat-message-assistant-feedback { + display: inline-flex; + align-items: center; + gap: 0.35rem; +} + .ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:hover, .ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:focus { color: var(--bs-body-color, #212529) !important; diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css.map b/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css.map index a9a9dd3a..f0ce1bb2 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css.map @@ -1 +1 @@ -{"version":3,"sources":["chat-widget.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"chat-widget.css","sourcesContent":["/* CrestApps AI Chat Widget */\n:root {\n --ai-widget-primary: var(--bs-secondary, #6c757d);\n --ai-widget-width: 380px;\n --ai-widget-height: 520px;\n}\n\n.ai-chat-widget-toggle {\n position: fixed;\n bottom: 1.25rem;\n right: 1.25rem;\n z-index: 10000;\n width: 52px;\n height: 52px;\n border-radius: 50%;\n background: var(--ai-widget-primary);\n color: white;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.5rem;\n box-shadow: 0 4px 12px rgba(0,0,0,0.2);\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.ai-chat-widget-toggle:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 16px rgba(0,0,0,0.3);\n}\n\n.ai-chat-widget-container {\n position: fixed;\n bottom: 5rem;\n right: 1.25rem;\n z-index: 10001;\n width: var(--ai-widget-width);\n height: var(--ai-widget-height);\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0,0,0,0.18);\n display: none;\n flex-direction: column;\n overflow: hidden;\n}\n\n.ai-chat-widget-container.open {\n display: flex;\n}\n\n.ai-chat-widget-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n background: var(--ai-widget-primary);\n color: white;\n}\n\n.ai-chat-widget-header .title {\n font-weight: 600;\n font-size: 0.95rem;\n}\n\n.ai-chat-widget-header button {\n background: none;\n border: none;\n color: white;\n cursor: pointer;\n font-size: 1rem;\n padding: 0 0.25rem;\n opacity: 0.8;\n}\n\n.ai-chat-widget-header button:hover {\n opacity: 1;\n}\n\n.ai-chat-widget-profile-select {\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid #e9ecef;\n background: #f8f9fa;\n}\n\n.ai-chat-widget-profile-select select {\n width: 100%;\n padding: 0.35rem 0.5rem;\n border: 1px solid #ced4da;\n border-radius: 6px;\n font-size: 0.85rem;\n}\n\n.ai-chat-widget-messages {\n flex: 1;\n overflow-y: auto;\n padding: 0.75rem;\n font-size: 0.9rem;\n}\n\n/* ── Widget message items (ai-chat.js Vue template) ── */\n.ai-chat-widget-messages .ai-chat-messages {\n padding: 0.5rem;\n}\n\n.ai-chat-widget-messages .ai-chat-message-item {\n position: relative;\n padding: 0.5rem 0;\n}\n\n.ai-chat-widget-messages .ai-chat-message-item + .ai-chat-message-item::before {\n content: '';\n display: block;\n width: 100%;\n margin-bottom: 0.5rem;\n border-top: 1px solid rgba(33, 37, 41, 0.08);\n}\n\n.ai-chat-widget-messages .ai-chat-msg-role {\n font-size: 0.7rem;\n font-weight: 600;\n margin-bottom: 2px;\n}\n\n.ai-chat-widget-messages .ai-chat-msg-role-user {\n color: #0d6efd;\n}\n\n.ai-chat-widget-messages .ai-chat-msg-role-assistant {\n color: #6f42c1;\n}\n\n.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-streaming-icon {\n animation: ai-widget-pulse 1.5s infinite;\n}\n\n.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-bot-icon {\n color: #6f42c1;\n}\n\n.ai-chat-widget-messages .ai-chat-message-body {\n position: relative;\n padding: 0 0 0.25rem 0;\n overflow-wrap: break-word;\n word-break: break-word;\n min-width: 0;\n}\n\n.ai-chat-widget-messages .ai-chat-message-body p:last-child {\n margin-bottom: 0;\n}\n\n/* ── Message action buttons (copy, thumbs up/down) ── */\n.ai-chat-widget-messages .message-buttons-container {\n position: absolute;\n right: 0;\n top: 0;\n display: inline-flex;\n gap: 0.35rem;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.15s ease-in-out;\n background: #fff;\n padding: 0.15rem 0.35rem;\n border-radius: 4px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n z-index: 1;\n}\n\n.ai-chat-widget-messages .ai-chat-message-item:hover .message-buttons-container,\n.ai-chat-widget-messages .ai-chat-message-item:focus-within .message-buttons-container {\n opacity: 1;\n pointer-events: auto;\n}\n\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox {\n color: var(--bs-secondary-color, #6c757d) !important;\n text-decoration: none;\n}\n\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:hover,\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:focus {\n color: var(--bs-body-color, #212529) !important;\n}\n\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox.tts-playing {\n color: var(--bs-primary, #0d6efd) !important;\n opacity: 1;\n pointer-events: auto;\n}\n\n/* ── Notifications ── */\n.ai-chat-widget-messages .ai-chat-notification {\n margin: 0.75rem 0.5rem 0;\n padding: 0.625rem 0.75rem;\n border: 1px solid rgba(33, 37, 41, 0.12);\n border-radius: 0.5rem;\n background: rgba(248, 249, 250, 0.98);\n}\n\n.ai-chat-widget-messages .ai-chat-notification-content {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n\n.ai-chat-widget-messages .ai-chat-notification-icon {\n margin-top: 0.1rem;\n color: var(--bs-secondary-color, #6c757d);\n}\n\n.ai-chat-widget-messages .ai-chat-notification-text {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.ai-chat-widget-messages .ai-chat-notification-dismiss {\n margin-left: auto !important;\n color: var(--bs-secondary-color, #6c757d) !important;\n}\n\n.ai-chat-widget-messages .ai-chat-notification-actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.5rem;\n}\n\n/* ── Chart containers inside widget ── */\n.ai-chat-widget-messages .chart-container {\n width: 100%;\n max-width: 100% !important;\n min-height: 280px;\n}\n\n/* ── Code blocks & inline code ── */\n.ai-chat-widget-messages .ai-chat-message-body pre {\n background: #2d2d2d;\n color: #f8f8f2;\n padding: 0.5rem;\n border-radius: 4px;\n overflow-x: auto;\n font-size: 0.8rem;\n}\n\n.ai-chat-widget-messages .ai-chat-message-body code {\n font-size: 0.85em;\n}\n\n@keyframes ai-widget-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n}\n\n.ai-chat-widget-input {\n border-top: 1px solid #e9ecef;\n padding: 0.5rem 0.75rem;\n display: flex;\n gap: 0.5rem;\n align-items: flex-end;\n}\n\n.ai-chat-widget-input textarea {\n flex: 1;\n border: 1px solid #ced4da;\n border-radius: 8px;\n padding: 0.4rem 0.6rem;\n font-size: 0.9rem;\n resize: none;\n max-height: 80px;\n min-height: 36px;\n line-height: 1.4;\n outline: none;\n}\n\n.ai-chat-widget-input textarea:focus {\n border-color: var(--ai-widget-primary);\n box-shadow: 0 0 0 2px rgba(65,182,112,0.15);\n}\n\n.ai-chat-widget-input button {\n background: var(--ai-widget-primary);\n color: white;\n border: none;\n border-radius: 8px;\n padding: 0.4rem 0.75rem;\n cursor: pointer;\n font-size: 0.9rem;\n white-space: nowrap;\n}\n\n.ai-chat-widget-input button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.ai-chat-widget-status {\n padding: 0.25rem 0.75rem;\n font-size: 0.8rem;\n color: #6c757d;\n display: none;\n}\n\n.ai-chat-widget-status.visible {\n display: block;\n}\n\n.ai-chat-widget-welcome {\n text-align: center;\n color: #6c757d;\n padding: 2rem 1rem;\n font-size: 0.9rem;\n}\n\n@media (max-width: 576px) {\n .ai-chat-widget-container {\n width: calc(100vw - 1rem);\n height: calc(100vh - 6rem);\n right: 0.5rem;\n bottom: 4.5rem;\n }\n}\n"]} +{"version":3,"sources":["chat-widget.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"chat-widget.css","sourcesContent":["/* CrestApps AI Chat Widget */\r\n:root {\r\n --ai-widget-primary: var(--bs-secondary, #6c757d);\r\n --ai-widget-width: 380px;\r\n --ai-widget-height: 520px;\r\n}\r\n\r\n.ai-chat-widget-toggle {\r\n position: fixed;\r\n bottom: 1.25rem;\r\n right: 1.25rem;\r\n z-index: 10000;\r\n width: 52px;\r\n height: 52px;\r\n border-radius: 50%;\r\n background: var(--ai-widget-primary);\r\n color: white;\r\n border: none;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 1.5rem;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.2);\r\n transition: transform 0.2s, box-shadow 0.2s;\r\n}\r\n\r\n.ai-chat-widget-toggle:hover {\r\n transform: scale(1.1);\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.3);\r\n}\r\n\r\n.ai-chat-widget-container {\r\n position: fixed;\r\n bottom: 5rem;\r\n right: 1.25rem;\r\n z-index: 10001;\r\n width: var(--ai-widget-width);\r\n height: var(--ai-widget-height);\r\n background: #fff;\r\n border-radius: 12px;\r\n box-shadow: 0 8px 32px rgba(0,0,0,0.18);\r\n display: none;\r\n flex-direction: column;\r\n overflow: hidden;\r\n}\r\n\r\n.ai-chat-widget-container.ai-chat-widget-resizable {\r\n resize: both;\r\n min-width: 320px;\r\n min-height: 420px;\r\n max-width: min(90vw, 960px);\r\n max-height: min(90vh, 960px);\r\n}\r\n\r\n.ai-chat-widget-container.open {\r\n display: flex;\r\n}\r\n\r\n.ai-chat-widget-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 0.75rem 1rem;\r\n background: var(--ai-widget-primary);\r\n color: white;\r\n}\r\n\r\n.ai-chat-widget-header.ai-chat-widget-drag-handle {\r\n cursor: move;\r\n user-select: none;\r\n touch-action: none;\r\n}\r\n\r\n.ai-chat-widget-header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.15rem;\r\n}\r\n\r\n.ai-chat-widget-toggle.ai-chat-widget-draggable {\r\n touch-action: none;\r\n}\r\n\r\n.ai-chat-widget-container.ai-chat-widget-dragging,\r\n.ai-chat-widget-toggle.ai-chat-widget-dragging {\r\n transition: none;\r\n}\r\n\r\n.ai-chat-widget-toggle.ai-chat-widget-dragging:hover {\r\n transform: none;\r\n}\r\n\r\n.ai-chat-widget-header .title {\r\n font-weight: 600;\r\n font-size: 0.95rem;\r\n}\r\n\r\n.ai-chat-widget-header button {\r\n background: none;\r\n border: none;\r\n color: white;\r\n cursor: pointer;\r\n font-size: 1rem;\r\n padding: 0 0.25rem;\r\n opacity: 0.8;\r\n}\r\n\r\n.ai-chat-widget-header button:hover {\r\n opacity: 1;\r\n}\r\n\r\n.ai-chat-widget-profile-select {\r\n padding: 0.5rem 0.75rem;\r\n border-bottom: 1px solid #e9ecef;\r\n background: #f8f9fa;\r\n}\r\n\r\n.ai-chat-widget-profile-select select {\r\n width: 100%;\r\n padding: 0.35rem 0.5rem;\r\n border: 1px solid #ced4da;\r\n border-radius: 6px;\r\n font-size: 0.85rem;\r\n}\r\n\r\n.ai-chat-widget-messages {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 0.75rem;\r\n font-size: 0.9rem;\r\n}\r\n\r\n/* ── Widget message items (ai-chat.js Vue template) ── */\r\n.ai-chat-widget-messages .ai-chat-messages {\r\n padding: 0.5rem;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-item {\r\n position: relative;\r\n padding: 0.5rem 0;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-item + .ai-chat-message-item::before {\r\n content: '';\r\n display: block;\r\n width: 100%;\r\n margin-bottom: 0.5rem;\r\n border-top: 1px solid rgba(33, 37, 41, 0.08);\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-msg-role {\r\n font-size: 0.7rem;\r\n font-weight: 600;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-msg-role-user {\r\n color: #0d6efd;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-msg-role-assistant {\r\n color: #6f42c1;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-streaming-icon {\r\n animation: ai-widget-pulse 1.5s infinite;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-bot-icon {\r\n color: #6f42c1;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-body {\r\n position: relative;\r\n padding: 0;\r\n overflow-wrap: break-word;\r\n word-break: break-word;\r\n min-width: 0;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-body p:last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n/* ── Message action buttons (copy, thumbs up/down) ── */\r\n.ai-chat-widget-messages .message-buttons-container {\r\n position: absolute;\r\n right: 0.1rem;\r\n bottom: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0.35rem;\r\n width: auto;\r\n max-width: max-content;\r\n opacity: 0;\r\n pointer-events: none;\r\n transition: opacity 0.15s ease-in-out;\r\n background: rgba(255, 255, 255, 0.96);\r\n padding: 0.2rem 0.35rem;\r\n border-radius: 999px;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\r\n margin-bottom: 1rem;\r\n transform: translateY(50%);\r\n z-index: 1;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-item:hover .message-buttons-container,\r\n.ai-chat-widget-messages .ai-chat-message-item:focus-within .message-buttons-container {\r\n opacity: 1;\r\n pointer-events: auto;\r\n}\r\n\r\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: 0 0 auto;\r\n width: 1.75rem;\r\n height: 1.75rem;\r\n margin: 0 !important;\r\n padding: 0 !important;\r\n border-radius: 50%;\r\n color: var(--bs-secondary-color, #6c757d) !important;\r\n text-decoration: none;\r\n}\r\n\r\n.ai-chat-widget-messages .message-buttons-container .ai-chat-message-assistant-feedback {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0.35rem;\r\n}\r\n\r\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:hover,\r\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:focus {\r\n color: var(--bs-body-color, #212529) !important;\r\n}\r\n\r\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox.tts-playing {\r\n color: var(--bs-primary, #0d6efd) !important;\r\n opacity: 1;\r\n pointer-events: auto;\r\n}\r\n\r\n/* ── Notifications ── */\r\n.ai-chat-widget-messages .ai-chat-notification {\r\n margin: 0.75rem 0.5rem 0;\r\n padding: 0.625rem 0.75rem;\r\n border: 1px solid rgba(33, 37, 41, 0.12);\r\n border-radius: 0.5rem;\r\n background: rgba(248, 249, 250, 0.98);\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-notification-content {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 0.5rem;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-notification-icon {\r\n margin-top: 0.1rem;\r\n color: var(--bs-secondary-color, #6c757d);\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-notification-text {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-notification-dismiss {\r\n margin-left: auto !important;\r\n color: var(--bs-secondary-color, #6c757d) !important;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-notification-actions {\r\n display: flex;\r\n gap: 0.5rem;\r\n margin-top: 0.5rem;\r\n}\r\n\r\n/* ── Chart containers inside widget ── */\r\n.ai-chat-widget-messages .chart-container {\r\n width: 100%;\r\n max-width: 100% !important;\r\n min-height: 280px;\r\n}\r\n\r\n/* ── Code blocks & inline code ── */\r\n.ai-chat-widget-messages .ai-chat-message-body pre {\r\n background: #2d2d2d;\r\n color: #f8f8f2;\r\n padding: 0.5rem;\r\n border-radius: 4px;\r\n overflow-x: auto;\r\n font-size: 0.8rem;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-body code {\r\n font-size: 0.85em;\r\n}\r\n\r\n@keyframes ai-widget-pulse {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.4; }\r\n}\r\n\r\n.ai-chat-widget-input {\r\n border-top: 1px solid #e9ecef;\r\n padding: 0.5rem 0.75rem;\r\n display: flex;\r\n gap: 0.5rem;\r\n align-items: flex-end;\r\n}\r\n\r\n.ai-chat-widget-input textarea {\r\n flex: 1;\r\n border: 1px solid #ced4da;\r\n border-radius: 8px;\r\n padding: 0.4rem 0.6rem;\r\n font-size: 0.9rem;\r\n resize: none;\r\n max-height: 80px;\r\n min-height: 36px;\r\n line-height: 1.4;\r\n outline: none;\r\n}\r\n\r\n.ai-chat-widget-input textarea:focus {\r\n border-color: var(--ai-widget-primary);\r\n box-shadow: 0 0 0 2px rgba(65,182,112,0.15);\r\n}\r\n\r\n.ai-chat-widget-input button {\r\n background: var(--ai-widget-primary);\r\n color: white;\r\n border: none;\r\n border-radius: 8px;\r\n padding: 0.4rem 0.75rem;\r\n cursor: pointer;\r\n font-size: 0.9rem;\r\n white-space: nowrap;\r\n}\r\n\r\n.ai-chat-widget-input button:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n.ai-chat-widget-status {\r\n padding: 0.25rem 0.75rem;\r\n font-size: 0.8rem;\r\n color: #6c757d;\r\n display: none;\r\n}\r\n\r\n.ai-chat-widget-status.visible {\r\n display: block;\r\n}\r\n\r\n.ai-chat-widget-welcome {\r\n text-align: center;\r\n color: #6c757d;\r\n padding: 2rem 1rem;\r\n font-size: 0.9rem;\r\n}\r\n\r\n@media (max-width: 576px) {\r\n .ai-chat-widget-container {\r\n width: calc(100vw - 1rem);\r\n height: calc(100vh - 6rem);\r\n right: 0.5rem;\r\n bottom: 4.5rem;\r\n }\r\n}\r\n"]} diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.min.css b/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.min.css index 160e9140..f1584463 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.min.css +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.min.css @@ -1 +1 @@ -:root{--ai-widget-primary:var(--bs-secondary, #6c757d);--ai-widget-width:380px;--ai-widget-height:520px}.ai-chat-widget-toggle{position:fixed;bottom:1.25rem;right:1.25rem;z-index:10000;width:52px;height:52px;border-radius:50%;background:var(--ai-widget-primary);color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:1.5rem;box-shadow:0 4px 12px rgba(0,0,0,.2);transition:transform .2s,box-shadow .2s}.ai-chat-widget-toggle:hover{transform:scale(1.1);box-shadow:0 6px 16px rgba(0,0,0,.3)}.ai-chat-widget-container{position:fixed;bottom:5rem;right:1.25rem;z-index:10001;width:var(--ai-widget-width);height:var(--ai-widget-height);background:#fff;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,.18);display:none;flex-direction:column;overflow:hidden}.ai-chat-widget-container.open{display:flex}.ai-chat-widget-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;background:var(--ai-widget-primary);color:#fff}.ai-chat-widget-header .title{font-weight:600;font-size:.95rem}.ai-chat-widget-header button{background:0 0;border:none;color:#fff;cursor:pointer;font-size:1rem;padding:0 .25rem;opacity:.8}.ai-chat-widget-header button:hover{opacity:1}.ai-chat-widget-profile-select{padding:.5rem .75rem;border-bottom:1px solid #e9ecef;background:#f8f9fa}.ai-chat-widget-profile-select select{width:100%;padding:.35rem .5rem;border:1px solid #ced4da;border-radius:6px;font-size:.85rem}.ai-chat-widget-messages{flex:1;overflow-y:auto;padding:.75rem;font-size:.9rem}.ai-chat-widget-messages .ai-chat-messages{padding:.5rem}.ai-chat-widget-messages .ai-chat-message-item{position:relative;padding:.5rem 0}.ai-chat-widget-messages .ai-chat-message-item+.ai-chat-message-item::before{content:'';display:block;width:100%;margin-bottom:.5rem;border-top:1px solid rgba(33,37,41,.08)}.ai-chat-widget-messages .ai-chat-msg-role{font-size:.7rem;font-weight:600;margin-bottom:2px}.ai-chat-widget-messages .ai-chat-msg-role-user{color:#0d6efd}.ai-chat-widget-messages .ai-chat-msg-role-assistant{color:#6f42c1}.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-streaming-icon{animation:ai-widget-pulse 1.5s infinite}.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-bot-icon{color:#6f42c1}.ai-chat-widget-messages .ai-chat-message-body{position:relative;padding:0 0 .25rem 0;overflow-wrap:break-word;word-break:break-word;min-width:0}.ai-chat-widget-messages .ai-chat-message-body p:last-child{margin-bottom:0}.ai-chat-widget-messages .message-buttons-container{position:absolute;right:0;top:0;display:inline-flex;gap:.35rem;opacity:0;pointer-events:none;transition:opacity .15s ease-in-out;background:#fff;padding:.15rem .35rem;border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.08);z-index:1}.ai-chat-widget-messages .ai-chat-message-item:focus-within .message-buttons-container,.ai-chat-widget-messages .ai-chat-message-item:hover .message-buttons-container{opacity:1;pointer-events:auto}.ai-chat-widget-messages .message-buttons-container>.button-message-toolbox{color:var(--bs-secondary-color,#6c757d)!important;text-decoration:none}.ai-chat-widget-messages .message-buttons-container>.button-message-toolbox:focus,.ai-chat-widget-messages .message-buttons-container>.button-message-toolbox:hover{color:var(--bs-body-color,#212529)!important}.ai-chat-widget-messages .message-buttons-container>.button-message-toolbox.tts-playing{color:var(--bs-primary,#0d6efd)!important;opacity:1;pointer-events:auto}.ai-chat-widget-messages .ai-chat-notification{margin:.75rem .5rem 0;padding:.625rem .75rem;border:1px solid rgba(33,37,41,.12);border-radius:.5rem;background:rgba(248,249,250,.98)}.ai-chat-widget-messages .ai-chat-notification-content{display:flex;align-items:flex-start;gap:.5rem}.ai-chat-widget-messages .ai-chat-notification-icon{margin-top:.1rem;color:var(--bs-secondary-color,#6c757d)}.ai-chat-widget-messages .ai-chat-notification-text{flex:1 1 auto;min-width:0}.ai-chat-widget-messages .ai-chat-notification-dismiss{margin-left:auto!important;color:var(--bs-secondary-color,#6c757d)!important}.ai-chat-widget-messages .ai-chat-notification-actions{display:flex;gap:.5rem;margin-top:.5rem}.ai-chat-widget-messages .chart-container{width:100%;max-width:100%!important;min-height:280px}.ai-chat-widget-messages .ai-chat-message-body pre{background:#2d2d2d;color:#f8f8f2;padding:.5rem;border-radius:4px;overflow-x:auto;font-size:.8rem}.ai-chat-widget-messages .ai-chat-message-body code{font-size:.85em}@keyframes ai-widget-pulse{0%,100%{opacity:1}50%{opacity:.4}}.ai-chat-widget-input{border-top:1px solid #e9ecef;padding:.5rem .75rem;display:flex;gap:.5rem;align-items:flex-end}.ai-chat-widget-input textarea{flex:1;border:1px solid #ced4da;border-radius:8px;padding:.4rem .6rem;font-size:.9rem;resize:none;max-height:80px;min-height:36px;line-height:1.4;outline:0}.ai-chat-widget-input textarea:focus{border-color:var(--ai-widget-primary);box-shadow:0 0 0 2px rgba(65,182,112,.15)}.ai-chat-widget-input button{background:var(--ai-widget-primary);color:#fff;border:none;border-radius:8px;padding:.4rem .75rem;cursor:pointer;font-size:.9rem;white-space:nowrap}.ai-chat-widget-input button:disabled{opacity:.5;cursor:not-allowed}.ai-chat-widget-status{padding:.25rem .75rem;font-size:.8rem;color:#6c757d;display:none}.ai-chat-widget-status.visible{display:block}.ai-chat-widget-welcome{text-align:center;color:#6c757d;padding:2rem 1rem;font-size:.9rem}@media (max-width:576px){.ai-chat-widget-container{width:calc(100vw - 1rem);height:calc(100vh - 6rem);right:.5rem;bottom:4.5rem}} +:root{--ai-widget-primary:var(--bs-secondary, #6c757d);--ai-widget-width:380px;--ai-widget-height:520px}.ai-chat-widget-toggle{position:fixed;bottom:1.25rem;right:1.25rem;z-index:10000;width:52px;height:52px;border-radius:50%;background:var(--ai-widget-primary);color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:1.5rem;box-shadow:0 4px 12px rgba(0,0,0,.2);transition:transform .2s,box-shadow .2s}.ai-chat-widget-toggle:hover{transform:scale(1.1);box-shadow:0 6px 16px rgba(0,0,0,.3)}.ai-chat-widget-container{position:fixed;bottom:5rem;right:1.25rem;z-index:10001;width:var(--ai-widget-width);height:var(--ai-widget-height);background:#fff;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,.18);display:none;flex-direction:column;overflow:hidden}.ai-chat-widget-container.ai-chat-widget-resizable{resize:both;min-width:320px;min-height:420px;max-width:min(90vw,960px);max-height:min(90vh,960px)}.ai-chat-widget-container.open{display:flex}.ai-chat-widget-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;background:var(--ai-widget-primary);color:#fff}.ai-chat-widget-header.ai-chat-widget-drag-handle{cursor:move;user-select:none;touch-action:none}.ai-chat-widget-header-actions{display:flex;align-items:center;gap:.15rem}.ai-chat-widget-toggle.ai-chat-widget-draggable{touch-action:none}.ai-chat-widget-container.ai-chat-widget-dragging,.ai-chat-widget-toggle.ai-chat-widget-dragging{transition:none}.ai-chat-widget-toggle.ai-chat-widget-dragging:hover{transform:none}.ai-chat-widget-header .title{font-weight:600;font-size:.95rem}.ai-chat-widget-header button{background:0 0;border:none;color:#fff;cursor:pointer;font-size:1rem;padding:0 .25rem;opacity:.8}.ai-chat-widget-header button:hover{opacity:1}.ai-chat-widget-profile-select{padding:.5rem .75rem;border-bottom:1px solid #e9ecef;background:#f8f9fa}.ai-chat-widget-profile-select select{width:100%;padding:.35rem .5rem;border:1px solid #ced4da;border-radius:6px;font-size:.85rem}.ai-chat-widget-messages{flex:1;overflow-y:auto;padding:.75rem;font-size:.9rem}.ai-chat-widget-messages .ai-chat-messages{padding:.5rem}.ai-chat-widget-messages .ai-chat-message-item{position:relative;padding:.5rem 0}.ai-chat-widget-messages .ai-chat-message-item+.ai-chat-message-item::before{content:'';display:block;width:100%;margin-bottom:.5rem;border-top:1px solid rgba(33,37,41,.08)}.ai-chat-widget-messages .ai-chat-msg-role{font-size:.7rem;font-weight:600;margin-bottom:2px}.ai-chat-widget-messages .ai-chat-msg-role-user{color:#0d6efd}.ai-chat-widget-messages .ai-chat-msg-role-assistant{color:#6f42c1}.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-streaming-icon{animation:ai-widget-pulse 1.5s infinite}.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-bot-icon{color:#6f42c1}.ai-chat-widget-messages .ai-chat-message-body{position:relative;padding:0;overflow-wrap:break-word;word-break:break-word;min-width:0}.ai-chat-widget-messages .ai-chat-message-body p:last-child{margin-bottom:0}.ai-chat-widget-messages .message-buttons-container{position:absolute;right:.1rem;bottom:0;display:inline-flex;align-items:center;gap:.35rem;width:auto;max-width:max-content;opacity:0;pointer-events:none;transition:opacity .15s ease-in-out;background:rgba(255,255,255,.96);padding:.2rem .35rem;border-radius:999px;box-shadow:0 1px 3px rgba(0,0,0,.08);margin-bottom:1rem;transform:translateY(50%);z-index:1}.ai-chat-widget-messages .ai-chat-message-item:focus-within .message-buttons-container,.ai-chat-widget-messages .ai-chat-message-item:hover .message-buttons-container{opacity:1;pointer-events:auto}.ai-chat-widget-messages .message-buttons-container>.button-message-toolbox{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;margin:0!important;padding:0!important;border-radius:50%;color:var(--bs-secondary-color,#6c757d)!important;text-decoration:none}.ai-chat-widget-messages .message-buttons-container .ai-chat-message-assistant-feedback{display:inline-flex;align-items:center;gap:.35rem}.ai-chat-widget-messages .message-buttons-container>.button-message-toolbox:focus,.ai-chat-widget-messages .message-buttons-container>.button-message-toolbox:hover{color:var(--bs-body-color,#212529)!important}.ai-chat-widget-messages .message-buttons-container>.button-message-toolbox.tts-playing{color:var(--bs-primary,#0d6efd)!important;opacity:1;pointer-events:auto}.ai-chat-widget-messages .ai-chat-notification{margin:.75rem .5rem 0;padding:.625rem .75rem;border:1px solid rgba(33,37,41,.12);border-radius:.5rem;background:rgba(248,249,250,.98)}.ai-chat-widget-messages .ai-chat-notification-content{display:flex;align-items:flex-start;gap:.5rem}.ai-chat-widget-messages .ai-chat-notification-icon{margin-top:.1rem;color:var(--bs-secondary-color,#6c757d)}.ai-chat-widget-messages .ai-chat-notification-text{flex:1 1 auto;min-width:0}.ai-chat-widget-messages .ai-chat-notification-dismiss{margin-left:auto!important;color:var(--bs-secondary-color,#6c757d)!important}.ai-chat-widget-messages .ai-chat-notification-actions{display:flex;gap:.5rem;margin-top:.5rem}.ai-chat-widget-messages .chart-container{width:100%;max-width:100%!important;min-height:280px}.ai-chat-widget-messages .ai-chat-message-body pre{background:#2d2d2d;color:#f8f8f2;padding:.5rem;border-radius:4px;overflow-x:auto;font-size:.8rem}.ai-chat-widget-messages .ai-chat-message-body code{font-size:.85em}@keyframes ai-widget-pulse{0%,100%{opacity:1}50%{opacity:.4}}.ai-chat-widget-input{border-top:1px solid #e9ecef;padding:.5rem .75rem;display:flex;gap:.5rem;align-items:flex-end}.ai-chat-widget-input textarea{flex:1;border:1px solid #ced4da;border-radius:8px;padding:.4rem .6rem;font-size:.9rem;resize:none;max-height:80px;min-height:36px;line-height:1.4;outline:0}.ai-chat-widget-input textarea:focus{border-color:var(--ai-widget-primary);box-shadow:0 0 0 2px rgba(65,182,112,.15)}.ai-chat-widget-input button{background:var(--ai-widget-primary);color:#fff;border:none;border-radius:8px;padding:.4rem .75rem;cursor:pointer;font-size:.9rem;white-space:nowrap}.ai-chat-widget-input button:disabled{opacity:.5;cursor:not-allowed}.ai-chat-widget-status{padding:.25rem .75rem;font-size:.8rem;color:#6c757d;display:none}.ai-chat-widget-status.visible{display:block}.ai-chat-widget-welcome{text-align:center;color:#6c757d;padding:2rem 1rem;font-size:.9rem}@media (max-width:576px){.ai-chat-widget-container{width:calc(100vw - 1rem);height:calc(100vh - 6rem);right:.5rem;bottom:4.5rem}} From 1a445bf45350b27db214afc3d7a14315be0110b1 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Thu, 16 Apr 2026 10:00:45 -0700 Subject: [PATCH 2/2] fix assets --- gulpfile.js | 36 +++++++++++++++++++ .../wwwroot/scripts/ai-chat.js.map | 2 +- .../wwwroot/scripts/ai-chat.min.js.map | 2 +- .../wwwroot/scripts/chat-interaction.js.map | 2 +- .../scripts/chat-interaction.min.js.map | 2 +- .../wwwroot/scripts/document-drop-zone.js.map | 2 +- .../scripts/technical-name-generator.js.map | 2 +- .../wwwroot/styles/chat-widget.css.map | 2 +- 8 files changed, 43 insertions(+), 7 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 401c7788..575e0962 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -19,6 +19,7 @@ var fs = require("graceful-fs"), postcss = require('gulp-postcss'), rtl = require('postcss-rtl'), babel = require('gulp-babel'); +const { Transform } = require("stream"); const { finished } = require("stream/promises"); // For compat with older versions of Node.js. @@ -176,6 +177,37 @@ function waitForTaskCompletion(task) { return typeof task.then === "function" ? task : finished(task); } +function normalizeSourceMapContents() { + return new Transform({ + objectMode: true, + transform(file, encoding, callback) { + if (!file || file.isNull() || path.extname(file.path).toLowerCase() !== ".map") { + callback(null, file); + return; + } + + try { + var sourceMap = JSON.parse(file.contents.toString("utf8")); + + if (Array.isArray(sourceMap.sourcesContent)) { + sourceMap.sourcesContent = sourceMap.sourcesContent.map(function (content) { + return typeof content === "string" + ? content.replace(/\r\n/g, "\n") + : content; + }); + + file.contents = Buffer.from(JSON.stringify(sourceMap), "utf8"); + } + + callback(null, file); + } + catch (error) { + callback(error); + } + } + }); +} + function createAssetGroupTask(assetGroup, doRebuild) { var outputExt = path.extname(assetGroup.output).toLowerCase(); var doConcat = path.basename(assetGroup.outputFileName, outputExt) !== "@"; @@ -269,6 +301,7 @@ function buildCssPipeline(assetGroup, doConcat, doRebuild) { .pipe(gulpif(doConcat, concat(assetGroup.outputFileName))) .pipe(gulpif(generateRTL, postcss([rtl()]))) .pipe(gulpif(generateSourceMaps, sourcemaps.write('.'))) + .pipe(normalizeSourceMapContents()) .pipe(eol('\n')) .pipe(gulp.dest(assetGroup.outputDir)); // Uncomment to copy assets to wwwroot @@ -324,6 +357,8 @@ function buildJsPipeline(assetGroup, doConcat, doRebuild) { var devStream = createJsStream(generateSourceMaps) .pipe(gulpif(generateSourceMaps, sourcemaps.write('.'))) + .pipe(normalizeSourceMapContents()) + .pipe(eol('\n')) .pipe(gulp.dest(assetGroup.outputDir)); // Uncomment to copy assets to wwwroot //.pipe(gulp.dest(assetGroup.webroot)); @@ -334,6 +369,7 @@ function buildJsPipeline(assetGroup, doConcat, doRebuild) { suffix: ".min" })) .pipe(gulpif(generateSourceMaps, sourcemaps.write('.'))) + .pipe(normalizeSourceMapContents()) .pipe(eol('\n')) .pipe(gulp.dest(assetGroup.outputDir)); // Uncomment to copy assets to wwwroot diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.js.map b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.js.map index c8961cb5..52553bb5 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.js.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.js.map @@ -1 +1 @@ -{"version":3,"sources":["ai-chat.js"],"names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","from","_arrayLikeToArray","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","push","_typeof","window","openAIChatManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","userLabel","assistantLabel","thumbsUpTitle","thumbsDownTitle","copyTitle","codeCopiedText","widget","chatWidgetContainer","chatWidgetStateName","chatHistorySection","showHistoryButton","closeHistoryButton","newChatButton","toggleButtonSelector","resetSizeButtonSelector","dragHandleSelector","enableDragging","enableResizing","persistLayout","defaultWidth","defaultHeight","minWidth","minHeight","messageTemplate","indicatorTemplate","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","parsePixelValue","Number","isFinite","parsed","parseFloat","clamp","min","max","Math","normalizeReference","reference","_ref","_normalized$index","_ref2","_normalized$text","_ref3","_normalized$link","normalized","assign","index","Index","Text","link","Link","normalizeReferences","references","_i","_Object$entries","entries","_normalizeReference","_Object$entries$_i","key","renderer","marked","Renderer","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","__chartConfigs","createChartHtml","chartId","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","tryExtractChartMarker","startIndex","type","raw","substring","endIndex","json","token","config","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","renderChartsInMessage","message","charts","requestAnimationFrame","_iterator","_step","renderChartOnCanvas","err","canvas","getElementById","Chart","console","warn","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","renderPendingCharts","configs","_i2","_Object$keys","keys","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","initialize","instanceConfig","hasWidgetConfig","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isSessionStarted","isPlaceholderVisible","chatWidgetStateSession","chatWidgetLayoutKey","widgetContainerElement","widgetToggleButtonElement","widgetResetSizeButtonElement","widgetResizeObserver","widgetViewportResizeHandler","widgetDefaultWidth","widgetDefaultHeight","widgetIsInitialized","isStreaming","isNavigatingAway","autoScroll","stream","messages","notifications","prompt","documents","existingDocuments","isUploading","uploadErrors","isDragOver","documentBar","metricsEnabled","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsButton","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","random","singleResponseMode","conversationModeEnabled","conversationButton","isConversationMode","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","getStoredWidgetLayout","storedLayout","localStorage","getItem","saveStoredWidgetLayout","partialLayout","currentLayout","nextLayout","panel","toggle","setItem","stringify","getElementSize","element","fallbackWidth","fallbackHeight","width","height","rect","getBoundingClientRect","getComputedStyle","round","clampWidgetPosition","left","top","viewportPadding","maxLeft","innerWidth","maxTop","innerHeight","applyAbsolutePosition","style","right","bottom","getWidgetDefaultSize","persistWidgetPanelPosition","panelRect","persistWidgetTogglePosition","toggleRect","persistWidgetPanelSize","defaultSize","currentSize","abs","updateWidgetResetSizeButtonVisibility","classList","add","isResized","resetWidgetSize","removeProperty","constrainWidgetElementsToViewport","restoreWidgetLayout","attachDraggableWidgetElement","handle","layoutKey","suppressClickOnDrag","_this","activePointerId","startX","startY","startLeft","startTop","dragged","dragThreshold","interactiveSelector","stopDragging","event","pointerId","removeEventListener","onPointerMove","remove","dataset","dragSuppressClick","setTimeout","deltaX","clientX","deltaY","clientY","hypot","nextPosition","addEventListener","button","target","closest","setPointerCapture","preventDefault","panelDefaultSize","panelSize","clampedPanel","toggleSize","clampedToggle","handleDragOver","sessionDocumentsEnabled","stopPropagation","inputArea","handleDragLeave","handleDrop","dataTransfer","files","uploadFiles","triggerFileInput","fileInput","click","handleFileInputChange","_this2","_callee","sessionId","profileId","formData","response","errorText","uploadError","result","j","_t","_context","uploadDocumentUrl","getSessionId","getProfileId","renderDocumentBar","FormData","append","fetch","method","body","ok","extractReadableErrorMessage","fileName","initializeSession","uploaded","failed","removeDocument","doc","_this3","_callee2","removeError","_t2","_context2","removeDocumentUrl","headers","itemId","documentId","splice","status","formatFileSize","bytes","toFixed","escapeHtml","failedItem","failedName","errorMsg","supportedExtensionsText","replaceChildren","RETURN_DOM_FRAGMENT","self","closeButtons","querySelectorAll","docToRemove","parseInt","getAttribute","errorCloseButtons","addBtn","querySelector","div","fallbackMessage","startsWith","title","detail","normalizeAssistantAppearance","appearance","label","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","startConnection","_this4","_callee3","_t3","_context3","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","forEach","msg","addMessage","$nextTick","refreshAllFeedbackIcons","initialPrompt","sendMessage","stopRecording","_attemptedSessionRecovery","removeItem","startNewSession","messageId","userRating","find","id","isFinal","_conversationPartialTranscript","escaped","replace","_conversationPartialMessage","hidePlaceholder","htmlContent","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","responseId","hideTypingIndicator","msgIndex","newMessage","base64Audio","contentType","binaryString","atob","Uint8Array","charCodeAt","playCollectedAudio","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentSession","autoCreateSession","onclose","addMessageInternal","_this5","fireEvent","CustomEvent","_this6","processedContent","citedRefs","filter","_ref4","_ref5","includes","sort","_ref6","_ref7","_ref8","_ref9","b","displayIndex","_iterator2","_step2","_step2$value","replaceAll","_displayIndex","_placeholder","_iterator3","_step3","_step3$value","_iterator4","_step4","_step4$value","addMessages","_this7","showPlaceholder","isOrchestratorAvailable","applyOrchestratorAvailability","unavailableMessage","orchestratorUnavailableMessage","disabled","micButtonElement","display","conversationButtonElement","isIndicator","trimmedPrompt","streamMessage","startRecording","_this8","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","subject","Subject","pendingChunk","size","_callee4","uint8Array","base64","_context4","arrayBuffer","reduce","str","byte","String","fromCharCode","btoa","getTracks","track","stop","complete","documentElement","send","updateMicButton","toggleRecording","sessionProfileId","_this9","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentSessionId","subscribe","chunk","_i3","_Object$entries2","_normalizeReference2","_Object$entries2$_i","_i4","_Object$entries3","_Object$entries3$_i","_this9$stream","processReferences","streamingFinished","synthesizeSpeech","_this9$stream2","getServiceDownMessage","_this0","_ref1","_ref10","_ref11","_ref12","_ref13","_ref14","processed","_iterator5","_step5","_step5$value","_iterator6","_step6","_step6$value","_iterator7","_step7","_step7$value","stopIcon","setAttribute","startIcon","removeAttribute","focus","icons","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this1","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","totalLength","sum","combined","offset","_iterator8","_step8","set","blob","Blob","_this10","URL","createObjectURL","Audio","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this11","updateConversationButton","_conversationSubject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","micSource","createMediaStreamSource","connect","analyser","interruptVolumeThreshold","freqData","frequencyBinCount","getByteFrequencyData","k","avg","_callee5","_context5","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","generatePrompt","templateProfileId","createSessionUrl","baseUrl","param","fullUrl","toLowerCase","location","origin","searchParams","originalLength","removedCount","_this12","clearNotificationDismiss","existingIndex","findIndex","scheduleNotificationDismiss","_this13","timerId","clearTimeout","dismissNotification","handleNotificationAction","actionName","_this14","scrollTop","scrollHeight","clientHeight","handleUserInput","setSessionId","resetSession","sessionRating","initializeApp","_this15","placeholderElementSelector","loadSession","documentBarSelector","className","multiple","allowedExtensions","accept","parentElement","appendChild","threshold","atBottom","shiftKey","lastMsg","pop","promptGenerators","getElementsByClassName","chatSessions","showChatScreen","btn","block","codeEl","clipboard","writeText","copiedText","micButtonElementSelector","conversationButtonElementSelector","force","initializeWidget","_this16","ResizeObserver","observe","dragHandle","copyResponse","updateFeedbackIcons","container","upBtn","downBtn","upClass","upIcon","fontSize","downClass","downIcon","FontAwesome","dom","i2svg","node","containers","$el","msgId","rateMessage","isPositive","newRating","feedbackContainer","btnClass","offsetWidth","onEnd","watch","handler","deep","active","mounted","_this17","_callee6","_context6","beforeUnmount","template","mount","download","toDataURL","img","res","removeChild"],"mappings":"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","file":"ai-chat.js","sourcesContent":["window.openAIChatManager = function () {\r\n\r\n // Defaults (can be overridden by instanceConfig)\r\n var defaultConfig = {\r\n // UI defaults for generated media\r\n generatedImageAltText: 'Generated Image',\r\n generatedImageMaxWidth: 400,\r\n downloadImageTitle: 'Download image',\r\n downloadChartTitle: 'Download chart as image',\r\n downloadChartButtonText: 'Download',\r\n userLabel: 'You',\r\n assistantLabel: 'Assistant',\r\n thumbsUpTitle: 'Thumbs up',\r\n thumbsDownTitle: 'Thumbs down',\r\n copyTitle: 'Click here to copy response to clipboard.',\r\n codeCopiedText: 'Copied!',\r\n widget: {\r\n chatWidgetContainer: null,\r\n chatWidgetStateName: null,\r\n chatHistorySection: null,\r\n showHistoryButton: null,\r\n closeHistoryButton: null,\r\n newChatButton: null,\r\n toggleButtonSelector: null,\r\n resetSizeButtonSelector: null,\r\n dragHandleSelector: '.ai-chat-widget-header',\r\n enableDragging: true,\r\n enableResizing: true,\r\n persistLayout: true,\r\n defaultWidth: null,\r\n defaultHeight: null,\r\n minWidth: 320,\r\n minHeight: 420\r\n },\r\n messageTemplate: `\r\n
\r\n
\r\n
\r\n
{{ userLabel }}
\r\n
\r\n \r\n {{ getAssistantLabel(message) }}\r\n
\r\n
\r\n

{{ message.title }}

\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{ notification.content }}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n `,\r\n indicatorTemplate: `\r\n
\r\n \r\n Assistant\r\n
\r\n `\r\n };\r\n\r\n // Sanitize URLs to prevent javascript: protocol injection.\r\n function sanitizeUrl(url) {\r\n if (!url) return '';\r\n var trimmed = url.trim();\r\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\r\n return '';\r\n }\r\n return url;\r\n }\r\n\r\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\r\n function escapeHtmlEntities(text) {\r\n var span = document.createElement('span');\r\n span.textContent = text;\r\n return span.innerHTML;\r\n }\r\n\r\n function parsePixelValue(value) {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n var parsed = parseFloat(value);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n }\r\n\r\n function clamp(value, min, max) {\r\n return Math.min(Math.max(value, min), max);\r\n }\r\n\r\n function normalizeReference(reference) {\r\n if (!reference || typeof reference !== 'object') {\r\n return null;\r\n }\r\n\r\n const normalized = Object.assign({}, reference);\r\n normalized.index = normalized.index ?? normalized.Index ?? 0;\r\n normalized.text = normalized.text ?? normalized.Text ?? null;\r\n normalized.link = normalized.link ?? normalized.Link ?? null;\r\n\r\n return normalized;\r\n }\r\n\r\n function normalizeReferences(references) {\r\n if (!references || typeof references !== 'object') {\r\n return {};\r\n }\r\n\r\n const normalized = {};\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n normalized[key] = normalizeReference(value) ?? {};\r\n }\r\n\r\n return normalized;\r\n }\r\n\r\n const renderer = new marked.Renderer();\r\n\r\n // Modify the link rendering to open in a new tab\r\n renderer.link = function (data) {\r\n var href = sanitizeUrl(data.href);\r\n if (!href) return data.text || '';\r\n return `
${data.text}`;\r\n };\r\n\r\n // Custom code block renderer with highlight.js integration and copy button.\r\n renderer.code = function (data) {\r\n var code = data.text || '';\r\n var lang = (data.lang || '').trim();\r\n var highlighted = code;\r\n\r\n if (typeof hljs !== 'undefined') {\r\n if (lang && hljs.getLanguage(lang)) {\r\n try {\r\n highlighted = hljs.highlight(code, { language: lang }).value;\r\n } catch (_) { }\r\n } else {\r\n try {\r\n highlighted = hljs.highlightAuto(code).value;\r\n } catch (_) { }\r\n }\r\n } else {\r\n highlighted = escapeHtmlEntities(code);\r\n }\r\n\r\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\r\n return `
${langDisplay}
${highlighted}
`;\r\n };\r\n\r\n // Custom image renderer for generated images with thumbnail styling and download button.\r\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\r\n renderer.image = function (data) {\r\n const src = sanitizeUrl(data.href);\r\n if (!src) return '';\r\n const alt = data.text || defaultConfig.generatedImageAltText;\r\n const maxWidth = defaultConfig.generatedImageMaxWidth;\r\n return `
\r\n \"${alt}\"\r\n
\r\n \r\n \r\n \r\n
\r\n
`;\r\n };\r\n\r\n // Chart counter for unique IDs\r\n let chartCounter = 0;\r\n\r\n // Collector for charts discovered during marked parsing.\r\n let _pendingCharts = [];\r\n\r\n // Global chart config map: any page (e.g., Chat Interactions) that uses\r\n // the shared marked instance can call window.renderPendingCharts() after\r\n // its DOM update to render charts it didn't create itself.\r\n window.__chartConfigs = window.__chartConfigs || {};\r\n\r\n function createChartHtml(chartId) {\r\n return `
`\r\n + ``\r\n + `
`\r\n + `
`\r\n + ``\r\n + `
`;\r\n }\r\n\r\n // Register [chart:{...json...}] as a native marked block extension so the\r\n // markdown parser handles chart markers inline with surrounding text.\r\n marked.use({\r\n extensions: [{\r\n name: 'chart',\r\n level: 'block',\r\n start(src) {\r\n const idx = src.indexOf('[chart:');\r\n return idx >= 0 ? idx : undefined;\r\n },\r\n tokenizer(src) {\r\n const extracted = tryExtractChartMarker(src);\r\n if (!extracted || extracted.startIndex !== 0) {\r\n return undefined;\r\n }\r\n\r\n const chartId = `chat_chart_${++chartCounter}`;\r\n\r\n return {\r\n type: 'chart',\r\n raw: src.substring(0, extracted.endIndex),\r\n chartId: chartId,\r\n json: extracted.json,\r\n };\r\n },\r\n renderer(token) {\r\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\r\n window.__chartConfigs[token.chartId] = token.json;\r\n return createChartHtml(token.chartId);\r\n }\r\n }]\r\n });\r\n\r\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\r\n function tryExtractChartMarker(text) {\r\n const token = '[chart:';\r\n const start = text.indexOf(token);\r\n if (start < 0) {\r\n return null;\r\n }\r\n\r\n // Find JSON object boundary by balancing braces\r\n const jsonStart = start + token.length;\r\n let i = jsonStart;\r\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\r\n i++;\r\n }\r\n\r\n if (i >= text.length || text[i] !== '{') {\r\n return null;\r\n }\r\n\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n\r\n for (; i < text.length; i++) {\r\n const ch = text[i];\r\n\r\n if (inString) {\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n if (ch === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n inString = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n depth++;\r\n } else if (ch === '}') {\r\n depth--;\r\n if (depth === 0) {\r\n const jsonEnd = i;\r\n // Expect closing bracket after JSON\r\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\r\n if (closeBracketIndex < 0) {\r\n return null;\r\n }\r\n\r\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\r\n return {\r\n startIndex: start,\r\n endIndex: closeBracketIndex + 1,\r\n json: json\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function renderChartsInMessage(message) {\r\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\r\n return;\r\n }\r\n\r\n // Copy and clear pending charts immediately to prevent duplicate renders.\r\n const charts = [...message._pendingCharts];\r\n message._pendingCharts = [];\r\n\r\n // Defer to requestAnimationFrame so the browser has fully laid out the\r\n // canvas elements before Chart.js reads their dimensions.\r\n requestAnimationFrame(() => {\r\n for (const c of charts) {\r\n renderChartOnCanvas(c.chartId, c.config);\r\n }\r\n });\r\n }\r\n\r\n function renderChartOnCanvas(chartId, config) {\r\n const canvas = document.getElementById(chartId);\r\n if (!canvas) {\r\n return false;\r\n }\r\n\r\n if (typeof Chart === 'undefined') {\r\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\r\n return false;\r\n }\r\n\r\n // When the canvas is inside a hidden container (e.g., a widget panel with\r\n // display:none), it has zero dimensions and Chart.js cannot render correctly.\r\n // Keep the config in __chartConfigs so renderPendingCharts() can retry later\r\n // once the container becomes visible.\r\n if (canvas.offsetParent === null) {\r\n window.__chartConfigs[chartId] = config;\r\n return false;\r\n }\r\n\r\n try {\r\n if (canvas._chartInstance) {\r\n canvas._chartInstance.destroy();\r\n }\r\n\r\n const cfg = typeof config === 'string' ? JSON.parse(config) : config;\r\n cfg.options ??= {};\r\n cfg.options.responsive = true;\r\n cfg.options.maintainAspectRatio = true;\r\n cfg.options.aspectRatio ??= 4 / 3;\r\n\r\n canvas._chartInstance = new Chart(canvas, cfg);\r\n delete window.__chartConfigs[chartId];\r\n return true;\r\n } catch (e) {\r\n console.error('Error creating chart:', e);\r\n return false;\r\n }\r\n }\r\n\r\n // Global function: renders any chart canvases whose configs are in the\r\n // global __chartConfigs map. Called by pages (e.g., Chat Interactions)\r\n // that share the marked instance but have their own rendering pipeline.\r\n window.renderPendingCharts = function () {\r\n if (typeof Chart === 'undefined') {\r\n return;\r\n }\r\n\r\n const configs = window.__chartConfigs;\r\n if (!configs) {\r\n return;\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n for (const chartId of Object.keys(configs)) {\r\n renderChartOnCanvas(chartId, configs[chartId]);\r\n }\r\n });\r\n };\r\n\r\n // Parse markdown content via marked (which natively handles [chart:...] markers\r\n // through the registered extension) and collect pending chart configs for later\r\n // Chart.js rendering.\r\n function parseMarkdownContent(content, message) {\r\n _pendingCharts = [];\r\n const html = marked.parse(content, { renderer });\r\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\r\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\r\n }\r\n\r\n const initialize = (instanceConfig) => {\r\n\r\n const config = Object.assign({}, defaultConfig, instanceConfig);\r\n config.widget = Object.assign({}, defaultConfig.widget || {}, instanceConfig && instanceConfig.widget ? instanceConfig.widget : {});\r\n const hasWidgetConfig = !!(instanceConfig && instanceConfig.widget && instanceConfig.widget.chatWidgetContainer && instanceConfig.widget.chatWidgetStateName);\r\n // Keep defaultConfig in sync so renderers use overridden values\r\n defaultConfig = config;\r\n\r\n if (!config.signalRHubUrl) {\r\n console.error('The signalRHubUrl is required.');\r\n return;\r\n }\r\n\r\n if (!config.appElementSelector) {\r\n console.error('The appElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.chatContainerElementSelector) {\r\n console.error('The chatContainerElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.inputElementSelector) {\r\n console.error('The inputElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.sendButtonElementSelector) {\r\n console.error('The sendButtonElementSelector is required.');\r\n return;\r\n }\r\n\r\n const app = Vue.createApp({\r\n data() {\r\n return {\r\n inputElement: null,\r\n buttonElement: null,\r\n chatContainer: null,\r\n placeholder: null,\r\n isSessionStarted: false,\r\n isPlaceholderVisible: true,\r\n chatWidgetStateName: null,\r\n chatWidgetStateSession: null,\r\n chatWidgetLayoutKey: null,\r\n chatHistorySection: null,\r\n widgetContainerElement: null,\r\n widgetToggleButtonElement: null,\r\n widgetResetSizeButtonElement: null,\r\n widgetResizeObserver: null,\r\n widgetViewportResizeHandler: null,\r\n widgetDefaultWidth: null,\r\n widgetDefaultHeight: null,\r\n widgetIsInitialized: false,\r\n isStreaming: false,\r\n isNavigatingAway: false,\r\n autoScroll: true,\r\n stream: null,\r\n messages: [],\r\n notifications: [],\r\n prompt: '',\r\n documents: config.existingDocuments || [],\r\n isUploading: false,\r\n uploadErrors: [],\r\n isDragOver: false,\r\n documentBar: null,\r\n metricsEnabled: !!config.metricsEnabled,\r\n userLabel: config.userLabel,\r\n assistantLabel: config.assistantLabel,\r\n thumbsUpTitle: config.thumbsUpTitle,\r\n thumbsDownTitle: config.thumbsDownTitle,\r\n copyTitle: config.copyTitle,\r\n isRecording: false,\r\n mediaRecorder: null,\r\n preRecordingPrompt: '',\r\n micButton: null,\r\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\r\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\r\n ttsVoiceName: config.ttsVoiceName || null,\r\n audioChunks: [],\r\n audioPlayQueue: [],\r\n isPlayingAudio: false,\r\n currentAudioElement: null,\r\n currentAudioUrl: null,\r\n ttsButton: null,\r\n ttsPlayingMessageIndex: -1,\r\n ttsAudioCache: {},\r\n ttsInstanceId: 'ai-chat-' + Math.random().toString(36).slice(2),\r\n singleResponseMode: !!config.singleResponseMode,\r\n conversationModeEnabled: config.chatMode === 'Conversation',\r\n conversationButton: null,\r\n isConversationMode: false,\r\n notificationDismissTimers: {},\r\n };\r\n },\r\n computed: {\r\n lastAssistantIndex() {\r\n for (var i = this.messages.length - 1; i >= 0; i--) {\r\n if (this.messages[i].role === 'assistant') {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n },\r\n methods: {\r\n handleBeforeUnload() {\r\n this.isNavigatingAway = true;\r\n },\r\n getStoredWidgetLayout() {\r\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\r\n return {};\r\n }\r\n\r\n try {\r\n var storedLayout = localStorage.getItem(this.chatWidgetLayoutKey);\r\n return storedLayout ? JSON.parse(storedLayout) || {} : {};\r\n } catch (error) {\r\n console.warn('Failed to read widget layout state.', error);\r\n return {};\r\n }\r\n },\r\n saveStoredWidgetLayout(partialLayout) {\r\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var currentLayout = this.getStoredWidgetLayout();\r\n var nextLayout = Object.assign({}, currentLayout);\r\n\r\n if (partialLayout.panel !== undefined) {\r\n nextLayout.panel = Object.assign({}, currentLayout.panel || {}, partialLayout.panel || {});\r\n }\r\n\r\n if (partialLayout.toggle !== undefined) {\r\n nextLayout.toggle = Object.assign({}, currentLayout.toggle || {}, partialLayout.toggle || {});\r\n }\r\n\r\n localStorage.setItem(this.chatWidgetLayoutKey, JSON.stringify(nextLayout));\r\n },\r\n getElementSize(element, fallbackWidth, fallbackHeight) {\r\n if (!element) {\r\n return {\r\n width: fallbackWidth || 0,\r\n height: fallbackHeight || 0\r\n };\r\n }\r\n\r\n var rect = element.getBoundingClientRect();\r\n var computed = window.getComputedStyle(element);\r\n\r\n return {\r\n width: Math.round(rect.width || parsePixelValue(computed.width) || fallbackWidth || 0),\r\n height: Math.round(rect.height || parsePixelValue(computed.height) || fallbackHeight || 0)\r\n };\r\n },\r\n clampWidgetPosition(left, top, width, height) {\r\n var viewportPadding = 8;\r\n var maxLeft = Math.max(viewportPadding, window.innerWidth - width - viewportPadding);\r\n var maxTop = Math.max(viewportPadding, window.innerHeight - height - viewportPadding);\r\n\r\n return {\r\n left: Math.round(clamp(left, viewportPadding, maxLeft)),\r\n top: Math.round(clamp(top, viewportPadding, maxTop))\r\n };\r\n },\r\n applyAbsolutePosition(element, left, top) {\r\n if (!element) {\r\n return;\r\n }\r\n\r\n element.style.left = left + 'px';\r\n element.style.top = top + 'px';\r\n element.style.right = 'auto';\r\n element.style.bottom = 'auto';\r\n },\r\n getWidgetDefaultSize() {\r\n return {\r\n width: this.widgetDefaultWidth || parsePixelValue(config.widget.defaultWidth) || 380,\r\n height: this.widgetDefaultHeight || parsePixelValue(config.widget.defaultHeight) || 520\r\n };\r\n },\r\n persistWidgetPanelPosition() {\r\n if (!this.widgetContainerElement || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\r\n this.saveStoredWidgetLayout({\r\n panel: {\r\n left: Math.round(panelRect.left),\r\n top: Math.round(panelRect.top)\r\n }\r\n });\r\n },\r\n persistWidgetTogglePosition() {\r\n if (!this.widgetToggleButtonElement || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\r\n this.saveStoredWidgetLayout({\r\n toggle: {\r\n left: Math.round(toggleRect.left),\r\n top: Math.round(toggleRect.top)\r\n }\r\n });\r\n },\r\n persistWidgetPanelSize() {\r\n if (!this.widgetContainerElement || !config.widget.enableResizing || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\r\n\r\n this.saveStoredWidgetLayout({\r\n panel: {\r\n width: Math.abs(currentSize.width - defaultSize.width) <= 1 ? null : currentSize.width,\r\n height: Math.abs(currentSize.height - defaultSize.height) <= 1 ? null : currentSize.height\r\n }\r\n });\r\n },\r\n updateWidgetResetSizeButtonVisibility() {\r\n if (!this.widgetResetSizeButtonElement) {\r\n return;\r\n }\r\n\r\n if (!config.widget.enableResizing || !this.widgetContainerElement) {\r\n this.widgetResetSizeButtonElement.classList.add('d-none');\r\n return;\r\n }\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\r\n var isResized =\r\n Math.abs(currentSize.width - defaultSize.width) > 1 ||\r\n Math.abs(currentSize.height - defaultSize.height) > 1 ||\r\n !!this.widgetContainerElement.style.width ||\r\n !!this.widgetContainerElement.style.height;\r\n\r\n this.widgetResetSizeButtonElement.classList.toggle('d-none', !isResized);\r\n },\r\n resetWidgetSize() {\r\n if (!this.widgetContainerElement || !config.widget.enableResizing) {\r\n return;\r\n }\r\n\r\n this.widgetContainerElement.style.removeProperty('width');\r\n this.widgetContainerElement.style.removeProperty('height');\r\n this.persistWidgetPanelSize();\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n },\r\n restoreWidgetLayout() {\r\n var storedLayout = this.getStoredWidgetLayout();\r\n\r\n if (this.widgetContainerElement && config.widget.enableResizing) {\r\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.width)) {\r\n this.widgetContainerElement.style.width = storedLayout.panel.width + 'px';\r\n } else {\r\n this.widgetContainerElement.style.removeProperty('width');\r\n }\r\n\r\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.height)) {\r\n this.widgetContainerElement.style.height = storedLayout.panel.height + 'px';\r\n } else {\r\n this.widgetContainerElement.style.removeProperty('height');\r\n }\r\n }\r\n\r\n if (this.widgetContainerElement && config.widget.enableDragging &&\r\n Number.isFinite(storedLayout.panel && storedLayout.panel.left) &&\r\n Number.isFinite(storedLayout.panel && storedLayout.panel.top)) {\r\n this.applyAbsolutePosition(this.widgetContainerElement, storedLayout.panel.left, storedLayout.panel.top);\r\n }\r\n\r\n if (this.widgetToggleButtonElement && config.widget.enableDragging &&\r\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.left) &&\r\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.top)) {\r\n this.applyAbsolutePosition(this.widgetToggleButtonElement, storedLayout.toggle.left, storedLayout.toggle.top);\r\n }\r\n\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n },\r\n attachDraggableWidgetElement(element, handle, layoutKey, suppressClickOnDrag) {\r\n if (!element || !handle || !config.widget.enableDragging) {\r\n return;\r\n }\r\n\r\n var activePointerId = null;\r\n var startX = 0;\r\n var startY = 0;\r\n var startLeft = 0;\r\n var startTop = 0;\r\n var dragged = false;\r\n var dragThreshold = 4;\r\n var interactiveSelector = 'button, a, input, textarea, select, option, label';\r\n\r\n var stopDragging = (event) => {\r\n if (activePointerId === null) {\r\n return;\r\n }\r\n\r\n if (event && event.pointerId !== undefined && event.pointerId !== activePointerId) {\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointermove', onPointerMove);\r\n document.removeEventListener('pointerup', stopDragging);\r\n document.removeEventListener('pointercancel', stopDragging);\r\n element.classList.remove('ai-chat-widget-dragging');\r\n activePointerId = null;\r\n\r\n if (!dragged) {\r\n return;\r\n }\r\n\r\n if (layoutKey === 'panel') {\r\n this.persistWidgetPanelPosition();\r\n } else if (layoutKey === 'toggle') {\r\n this.persistWidgetTogglePosition();\r\n }\r\n\r\n if (suppressClickOnDrag) {\r\n element.dataset.dragSuppressClick = 'true';\r\n window.setTimeout(() => {\r\n if (element.dataset.dragSuppressClick === 'true') {\r\n element.dataset.dragSuppressClick = 'false';\r\n }\r\n }, 0);\r\n }\r\n };\r\n\r\n var onPointerMove = (event) => {\r\n if (activePointerId === null || event.pointerId !== activePointerId) {\r\n return;\r\n }\r\n\r\n var deltaX = event.clientX - startX;\r\n var deltaY = event.clientY - startY;\r\n\r\n if (!dragged && Math.hypot(deltaX, deltaY) < dragThreshold) {\r\n return;\r\n }\r\n\r\n dragged = true;\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(\r\n element,\r\n layoutKey === 'panel' ? defaultSize.width : 52,\r\n layoutKey === 'panel' ? defaultSize.height : 52);\r\n var nextPosition = this.clampWidgetPosition(\r\n startLeft + deltaX,\r\n startTop + deltaY,\r\n currentSize.width,\r\n currentSize.height);\r\n\r\n this.applyAbsolutePosition(element, nextPosition.left, nextPosition.top);\r\n };\r\n\r\n handle.addEventListener('pointerdown', (event) => {\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n\r\n if (layoutKey === 'panel' && event.target.closest(interactiveSelector)) {\r\n return;\r\n }\r\n\r\n var rect = element.getBoundingClientRect();\r\n startX = event.clientX;\r\n startY = event.clientY;\r\n startLeft = rect.left;\r\n startTop = rect.top;\r\n dragged = false;\r\n activePointerId = event.pointerId;\r\n element.classList.add('ai-chat-widget-dragging');\r\n\r\n if (handle.setPointerCapture) {\r\n handle.setPointerCapture(event.pointerId);\r\n }\r\n\r\n document.addEventListener('pointermove', onPointerMove);\r\n document.addEventListener('pointerup', stopDragging);\r\n document.addEventListener('pointercancel', stopDragging);\r\n event.preventDefault();\r\n });\r\n },\r\n constrainWidgetElementsToViewport() {\r\n if (this.widgetContainerElement && this.widgetContainerElement.style.left) {\r\n var panelDefaultSize = this.getWidgetDefaultSize();\r\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\r\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\r\n var clampedPanel = this.clampWidgetPosition(panelRect.left, panelRect.top, panelSize.width, panelSize.height);\r\n\r\n this.applyAbsolutePosition(this.widgetContainerElement, clampedPanel.left, clampedPanel.top);\r\n\r\n if (config.widget.persistLayout) {\r\n this.persistWidgetPanelPosition();\r\n }\r\n }\r\n\r\n if (this.widgetToggleButtonElement && this.widgetToggleButtonElement.style.left) {\r\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\r\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\r\n var clampedToggle = this.clampWidgetPosition(toggleRect.left, toggleRect.top, toggleSize.width, toggleSize.height);\r\n\r\n this.applyAbsolutePosition(this.widgetToggleButtonElement, clampedToggle.left, clampedToggle.top);\r\n\r\n if (config.widget.persistLayout) {\r\n this.persistWidgetTogglePosition();\r\n }\r\n }\r\n },\r\n handleDragOver(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = true;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.add('ai-chat-drag-over');\r\n },\r\n handleDragLeave(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = false;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\r\n },\r\n handleDrop(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = false;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\r\n if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\r\n this.uploadFiles(e.dataTransfer.files);\r\n }\r\n },\r\n triggerFileInput() {\r\n if (!config.sessionDocumentsEnabled) return;\r\n var fileInput = document.getElementById('ai-chat-doc-input');\r\n if (fileInput) fileInput.click();\r\n },\r\n handleFileInputChange(e) {\r\n var files = e.target.files;\r\n if (files && files.length > 0) {\r\n this.uploadFiles(files);\r\n }\r\n e.target.value = '';\r\n },\r\n async uploadFiles(files) {\r\n if (!config.uploadDocumentUrl) return;\r\n\r\n var sessionId = this.getSessionId();\r\n var profileId = this.getProfileId();\r\n\r\n if (!sessionId && !profileId) {\r\n console.warn('Cannot upload documents without a session or profile.');\r\n return;\r\n }\r\n\r\n this.isUploading = true;\r\n this.uploadErrors = [];\r\n this.renderDocumentBar();\r\n try {\r\n var formData = new FormData();\r\n if (sessionId) {\r\n formData.append('sessionId', sessionId);\r\n } else {\r\n formData.append('profileId', profileId);\r\n }\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n\r\n var response = await fetch(config.uploadDocumentUrl, {\r\n method: 'POST',\r\n body: formData\r\n });\r\n\r\n if (!response.ok) {\r\n var errorText = await response.text();\r\n var uploadError = this.extractReadableErrorMessage(errorText, 'Upload failed. Please try again.');\r\n console.error('Upload failed:', errorText);\r\n this.uploadErrors = [{ fileName: '', error: uploadError }];\r\n return;\r\n }\r\n\r\n var result = await response.json();\r\n\r\n // If the server created a new session, initialize it.\r\n if (result.sessionId && !sessionId) {\r\n this.initializeSession(result.sessionId);\r\n }\r\n\r\n if (result.uploaded && result.uploaded.length > 0) {\r\n for (var j = 0; j < result.uploaded.length; j++) {\r\n this.documents.push(result.uploaded[j]);\r\n }\r\n }\r\n if (result.failed && result.failed.length > 0) {\r\n this.uploadErrors = result.failed;\r\n }\r\n } catch (err) {\r\n console.error('Upload error:', err);\r\n this.uploadErrors = [{ fileName: '', error: 'Upload failed. Please try again.' }];\r\n } finally {\r\n this.isUploading = false;\r\n this.renderDocumentBar();\r\n }\r\n },\r\n async removeDocument(doc) {\r\n if (!config.removeDocumentUrl) return;\r\n\r\n try {\r\n var sessionId = this.getSessionId();\r\n var response = await fetch(config.removeDocumentUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ itemId: sessionId, documentId: doc.documentId })\r\n });\r\n\r\n if (response.ok) {\r\n var idx = this.documents.indexOf(doc);\r\n if (idx > -1) this.documents.splice(idx, 1);\r\n } else {\r\n var errorText = await response.text();\r\n var removeError = this.extractReadableErrorMessage(errorText, 'Failed to remove document. Please try again.');\r\n console.error('Failed to remove document:', response.status, errorText);\r\n this.uploadErrors = [{ fileName: doc.fileName || '', error: removeError }];\r\n this.renderDocumentBar();\r\n }\r\n } catch (err) {\r\n console.error('Remove document error:', err);\r\n this.uploadErrors = [{ fileName: doc.fileName || '', error: 'Failed to remove document. Please try again.' }];\r\n this.renderDocumentBar();\r\n }\r\n },\r\n formatFileSize(bytes) {\r\n if (bytes < 1024) return bytes + ' B';\r\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\r\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\r\n },\r\n renderDocumentBar() {\r\n if (!this.documentBar) return;\r\n\r\n if (!config.sessionDocumentsEnabled) {\r\n this.documentBar.classList.add('d-none');\r\n return;\r\n }\r\n\r\n this.documentBar.classList.remove('d-none');\r\n\r\n var html = '
';\r\n html += '
';\r\n\r\n for (var i = 0; i < this.documents.length; i++) {\r\n var doc = this.documents[i];\r\n var name = doc.fileName || 'Document';\r\n if (name.length > 20) name = name.substring(0, 17) + '...';\r\n html += '';\r\n html += ' ';\r\n html += this.escapeHtml(name);\r\n html += ' ';\r\n html += '';\r\n }\r\n\r\n for (var m = 0; m < this.uploadErrors.length; m++) {\r\n var failedItem = this.uploadErrors[m];\r\n var failedName = failedItem.fileName || 'File';\r\n var errorMsg = failedItem.error || 'Upload failed';\r\n if (failedName.length > 15) failedName = failedName.substring(0, 12) + '...';\r\n html += '';\r\n html += ' ';\r\n html += this.escapeHtml(failedName);\r\n html += ' ';\r\n html += '';\r\n }\r\n\r\n if (this.isUploading) {\r\n html += '';\r\n html += ' Uploading...';\r\n html += '';\r\n }\r\n\r\n html += '';\r\n html += '
';\r\n if (config.supportedExtensionsText) {\r\n html += '
Supported formats: ' + this.escapeHtml(config.supportedExtensionsText) + '
';\r\n }\r\n\r\n html += '
';\r\n\r\n this.documentBar.replaceChildren(DOMPurify.sanitize(html, { RETURN_DOM_FRAGMENT: true }));\r\n\r\n // Bind remove handlers\r\n var self = this;\r\n var closeButtons = this.documentBar.querySelectorAll('[data-doc-index]');\r\n for (var j = 0; j < closeButtons.length; j++) {\r\n closeButtons[j].addEventListener('click', (function (idx) {\r\n return function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n var docToRemove = self.documents[idx];\r\n if (docToRemove) self.removeDocument(docToRemove);\r\n };\r\n })(parseInt(closeButtons[j].getAttribute('data-doc-index'))));\r\n }\r\n\r\n // Bind error dismiss handlers\r\n var errorCloseButtons = this.documentBar.querySelectorAll('[data-error-index]');\r\n for (var n = 0; n < errorCloseButtons.length; n++) {\r\n errorCloseButtons[n].addEventListener('click', (function (idx) {\r\n return function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n self.uploadErrors.splice(idx, 1);\r\n self.renderDocumentBar();\r\n };\r\n })(parseInt(errorCloseButtons[n].getAttribute('data-error-index'))));\r\n }\r\n\r\n // Bind add button\r\n var addBtn = this.documentBar.querySelector('.ai-chat-doc-add-btn');\r\n if (addBtn) {\r\n addBtn.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n self.triggerFileInput();\r\n });\r\n }\r\n },\r\n escapeHtml(text) {\r\n var div = document.createElement('div');\r\n div.textContent = text;\r\n return div.innerHTML;\r\n },\r\n extractReadableErrorMessage(errorText, fallbackMessage) {\r\n if (!errorText || typeof errorText !== 'string') {\r\n return fallbackMessage;\r\n }\r\n\r\n var trimmed = errorText.trim();\r\n if (!trimmed) {\r\n return fallbackMessage;\r\n }\r\n\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n try {\r\n var parsed = JSON.parse(trimmed);\r\n var message = parsed?.error || parsed?.message || parsed?.title || parsed?.detail;\r\n return typeof message === 'string' && message.trim()\r\n ? message.trim()\r\n : fallbackMessage;\r\n } catch (err) {\r\n return fallbackMessage;\r\n }\r\n }\r\n\r\n if (/<[^>]+>/.test(trimmed)) {\r\n return fallbackMessage;\r\n }\r\n\r\n return trimmed;\r\n },\r\n normalizeAssistantAppearance(appearance) {\r\n if (!appearance) {\r\n return null;\r\n }\r\n\r\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\r\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\r\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\r\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\r\n\r\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\r\n return null;\r\n }\r\n\r\n return {\r\n label: label,\r\n icon: icon,\r\n cssClass: cssClass,\r\n disableStreamingAnimation: disableStreamingAnimation,\r\n };\r\n },\r\n getAssistantLabel(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.label ? appearance.label : this.assistantLabel;\r\n },\r\n getAssistantRoleClasses(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n var classes = ['ai-chat-msg-role'];\r\n\r\n if (appearance && appearance.cssClass) {\r\n classes.push(appearance.cssClass);\r\n } else {\r\n classes.push('ai-chat-msg-role-assistant');\r\n }\r\n\r\n return classes;\r\n },\r\n getAssistantIconClasses(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\r\n },\r\n getAssistantIcon(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\r\n },\r\n shouldAnimateAssistantIcon(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return !!message &&\r\n message.isStreaming &&\r\n index === this.lastAssistantIndex &&\r\n !(appearance && appearance.disableStreamingAnimation);\r\n },\r\n async startConnection() {\r\n this.connection = new signalR.HubConnectionBuilder()\r\n .withUrl(config.signalRHubUrl)\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n // Allow long-running operations (e.g., multi-step MCP tool calls)\r\n // without the client disconnecting prematurely.\r\n this.connection.serverTimeoutInMilliseconds = 600000;\r\n this.connection.keepAliveIntervalInMilliseconds = 15000;\r\n\r\n this.connection.on(\"LoadSession\", (data) => {\r\n this.initializeSession(data.sessionId, true);\r\n this.messages = [];\r\n this.documents = data.documents || [];\r\n\r\n (data.messages ?? []).forEach(msg => {\r\n this.addMessage(msg);\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n });\r\n });\r\n\r\n // Update feedback icons in the DOM after all messages have rendered.\r\n this.$nextTick(() => {\r\n this.refreshAllFeedbackIcons();\r\n });\r\n\r\n // When the session is new (no messages) and an initial prompt is configured,\r\n // automatically send it as the first user message to trigger an AI response.\r\n if (this.messages.length === 0 && config.initialPrompt) {\r\n this.prompt = config.initialPrompt;\r\n this.sendMessage();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveError\", (error) => {\r\n console.error(\"SignalR Error: \", error);\r\n\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // If this is a widget with a stale cached session (e.g., profile was deleted),\r\n // clear the cached session and start fresh with the current profile.\r\n if (this.widgetIsInitialized && !this.isSessionStarted && !this._attemptedSessionRecovery) {\r\n this._attemptedSessionRecovery = true;\r\n localStorage.removeItem(this.chatWidgetStateSession);\r\n this.startNewSession();\r\n }\r\n });\r\n\r\n this.connection.on(\"MessageRated\", (messageId, userRating) => {\r\n var msg = this.messages.find(m => m.id === messageId);\r\n if (msg) {\r\n msg.userRating = userRating;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveTranscript\", (sessionId, text, isFinal) => {\r\n if (this.isConversationMode) {\r\n if (!isFinal && text) {\r\n this._conversationPartialTranscript = text;\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n var html = '

' + escaped + '

';\r\n\r\n // Show partial transcript as a live user message.\r\n if (!this._conversationPartialMessage) {\r\n this.hidePlaceholder();\r\n this._conversationPartialMessage = {\r\n role: 'user',\r\n content: text,\r\n htmlContent: html,\r\n isPartial: true\r\n };\r\n this.messages.push(this._conversationPartialMessage);\r\n } else {\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = html;\r\n }\r\n this.scrollToBottom();\r\n }\r\n return;\r\n }\r\n\r\n if (text && !this._audioInputSent) {\r\n this.prompt = this.preRecordingPrompt + text;\r\n if (this.inputElement) {\r\n this.inputElement.value = this.prompt;\r\n this.inputElement.dispatchEvent(new Event('input'));\r\n }\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationUserMessage\", (sessionId, text) => {\r\n if (text) {\r\n this.stopAudio();\r\n\r\n // If there's an interrupted assistant message still streaming,\r\n // mark it as done to stop the spinner animation.\r\n if (this._conversationAssistantMessage) {\r\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\r\n if (oldMsg) {\r\n oldMsg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Replace the partial transcript message with the final one.\r\n if (this._conversationPartialMessage) {\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\r\n this._conversationPartialMessage.isPartial = false;\r\n this._conversationPartialMessage = null;\r\n } else {\r\n this.addMessage({\r\n role: 'user',\r\n content: text\r\n });\r\n }\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantToken\", (sessionId, messageId, token, responseId, appearance) => {\r\n if (!this._conversationAssistantMessage) {\r\n this.stopAudio();\r\n this.hideTypingIndicator();\r\n\r\n // Ensure no stale streaming indicators remain from prior messages.\r\n for (var j = 0; j < this.messages.length; j++) {\r\n if (this.messages[j].isStreaming) {\r\n this.messages[j].isStreaming = false;\r\n }\r\n }\r\n\r\n var msgIndex = this.messages.length;\r\n var newMessage = {\r\n id: messageId,\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n userRating: null,\r\n appearance: this.normalizeAssistantAppearance(appearance),\r\n };\r\n this.messages.push(newMessage);\r\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\r\n }\r\n\r\n this._conversationAssistantMessage.content += token;\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n if (!msg.appearance) {\r\n msg.appearance = this.normalizeAssistantAppearance(appearance);\r\n }\r\n msg.content = this._conversationAssistantMessage.content;\r\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n this.scrollToBottom();\r\n });\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantComplete\", (sessionId, messageId) => {\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioChunk\", (sessionId, base64Audio, contentType) => {\r\n if (base64Audio) {\r\n const binaryString = atob(base64Audio);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n this.audioChunks.push(bytes);\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioComplete\", (sessionId) => {\r\n this.playCollectedAudio();\r\n });\r\n\r\n this.connection.on(\"ReceiveNotification\", (notification) => {\r\n this.receiveNotification(notification);\r\n });\r\n\r\n this.connection.on(\"UpdateNotification\", (notification) => {\r\n this.updateNotification(notification);\r\n });\r\n\r\n this.connection.on(\"RemoveNotification\", (notificationType) => {\r\n this.removeNotification(notificationType);\r\n });\r\n\r\n this.connection.onreconnecting(() => {\r\n console.warn(\"SignalR: reconnecting...\");\r\n });\r\n\r\n this.connection.onreconnected(() => {\r\n console.info(\"SignalR: reconnected.\");\r\n\r\n if (this.isSessionStarted) {\r\n this.reloadCurrentSession();\r\n } else if (config.autoCreateSession) {\r\n this.startNewSession();\r\n }\r\n });\r\n\r\n this.connection.onclose((error) => {\r\n if (this.isNavigatingAway) {\r\n return;\r\n }\r\n\r\n if (error) {\r\n console.warn(\"SignalR connection closed with error:\", error.message || error);\r\n }\r\n });\r\n\r\n try {\r\n await this.connection.start();\r\n } catch (err) {\r\n console.error(\"SignalR Connection Error: \", err);\r\n }\r\n },\r\n addMessageInternal(message) {\r\n if (message.role === 'assistant') {\r\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\r\n }\r\n\r\n if (message.content && !message.htmlContent) {\r\n message.htmlContent = parseMarkdownContent(message.content, message);\r\n }\r\n this.fireEvent(new CustomEvent(\"addingOpenAIPromotMessage\", { detail: { message: message } }));\r\n this.messages.push(message);\r\n\r\n this.$nextTick(() => {\r\n this.fireEvent(new CustomEvent(\"addedOpenAIPromotMessage\", { detail: { message: message } }));\r\n });\r\n },\r\n addMessage(message) {\r\n\r\n // Ensure userRating is always defined for Vue reactivity.\r\n if (message.userRating === undefined) {\r\n message.userRating = null;\r\n }\r\n\r\n if (message.content) {\r\n let processedContent = message.content.trim();\r\n message.references = normalizeReferences(message.references);\r\n\r\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\r\n\r\n // Only include references that were actually cited in the response.\r\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\r\n\r\n if (citedRefs.length) {\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders.\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processedContent = processedContent.replaceAll(key, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\r\n processedContent = processedContent.replaceAll('
', ',');\r\n\r\n processedContent += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || key;\r\n processedContent += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n }\r\n }\r\n\r\n message.content = processedContent;\r\n message.htmlContent = parseMarkdownContent(processedContent, message);\r\n }\r\n\r\n this.addMessageInternal(message);\r\n this.hidePlaceholder();\r\n\r\n this.$nextTick(() => {\r\n // Render any pending charts once the DOM is updated\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n addMessages(messages) {\r\n\r\n for (let i = 0; i < messages.length; i++) {\r\n this.addMessageInternal(messages[i]);\r\n }\r\n\r\n this.hidePlaceholder();\r\n this.$nextTick(() => {\r\n this.scrollToBottom();\r\n });\r\n },\r\n hidePlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.add('d-none');\r\n }\r\n this.isPlaceholderVisible = false;\r\n },\r\n showPlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.remove('d-none');\r\n }\r\n this.isPlaceholderVisible = true;\r\n },\r\n isOrchestratorAvailable() {\r\n return config.isOrchestratorAvailable !== false;\r\n },\r\n applyOrchestratorAvailability() {\r\n if (this.isOrchestratorAvailable()) {\r\n return true;\r\n }\r\n\r\n const unavailableMessage = config.orchestratorUnavailableMessage || \"This orchestrator is not currently available.\";\r\n\r\n if (this.inputElement) {\r\n this.inputElement.disabled = true;\r\n this.inputElement.value = '';\r\n this.inputElement.placeholder = unavailableMessage;\r\n }\r\n\r\n if (this.buttonElement) {\r\n this.buttonElement.disabled = true;\r\n }\r\n\r\n if (this.micButtonElement) {\r\n this.micButtonElement.disabled = true;\r\n this.micButtonElement.style.display = 'none';\r\n }\r\n\r\n if (this.conversationButtonElement) {\r\n this.conversationButtonElement.disabled = true;\r\n this.conversationButtonElement.style.display = 'none';\r\n }\r\n\r\n return false;\r\n },\r\n fireEvent(event) {\r\n document.dispatchEvent(event);\r\n },\r\n isIndicator(message) {\r\n return message.role === 'indicator';\r\n },\r\n sendMessage() {\r\n if (!this.applyOrchestratorAvailability()) {\r\n return;\r\n }\r\n\r\n let trimmedPrompt = this.prompt.trim();\r\n\r\n if (!trimmedPrompt) {\r\n return;\r\n }\r\n\r\n // Stop any active recording before sending.\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\r\n this._audioInputSent = true;\r\n\r\n // In single-response mode, clear all previous messages.\r\n if (this.singleResponseMode) {\r\n this.messages.splice(0, this.messages.length);\r\n }\r\n\r\n this.addMessage({\r\n role: 'user',\r\n content: trimmedPrompt\r\n });\r\n\r\n this.streamMessage(this.getProfileId(), trimmedPrompt, null);\r\n this.inputElement.value = '';\r\n this.prompt = '';\r\n },\r\n startRecording() {\r\n if (this.isRecording || !this.connection) {\r\n return;\r\n }\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this.preRecordingPrompt = this.prompt;\r\n this._audioInputSent = false;\r\n\r\n var subject = new signalR.Subject();\r\n var profileId = this.getProfileId();\r\n var sessionId = this.getSessionId() || '';\r\n var pendingChunk = Promise.resolve();\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n subject.next(base64);\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => subject.complete());\r\n });\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"SendAudioStream\", profileId, sessionId, subject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n this.updateMicButton();\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n });\r\n },\r\n stopRecording() {\r\n if (!this.isRecording || !this.mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n this.updateMicButton();\r\n },\r\n toggleRecording() {\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n } else {\r\n this.startRecording();\r\n }\r\n },\r\n updateMicButton() {\r\n if (!this.micButton) {\r\n return;\r\n }\r\n\r\n if (this.isRecording) {\r\n this.micButton.classList.add('stt-recording');\r\n this.micButton.innerHTML = '';\r\n } else {\r\n this.micButton.classList.remove('stt-recording');\r\n this.micButton.innerHTML = '';\r\n }\r\n },\r\n streamMessage(profileId, trimmedPrompt, sessionProfileId) {\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n\r\n this.streamingStarted();\r\n this.showTypingIndicator();\r\n this.autoScroll = true;\r\n\r\n var content = '';\r\n var references = {};\r\n var lastResponseId = null;\r\n\r\n // Get the index after showing typing indicator.\r\n var messageIndex = this.messages.length;\r\n var currentSessionId = this.getSessionId();\r\n\r\n this.stream = this.connection.stream(\"SendMessage\", profileId, trimmedPrompt, currentSessionId, sessionProfileId)\r\n .subscribe({\r\n next: (chunk) => {\r\n let message = this.messages[messageIndex];\r\n\r\n if (!message) {\r\n\r\n if (chunk.sessionId && !currentSessionId) {\r\n this.initializeSession(chunk.sessionId);\r\n }\r\n\r\n this.hideTypingIndicator();\r\n // Re-assign the index after hiding the typing indicator.\r\n messageIndex = this.messages.length;\r\n let newMessage = {\r\n id: chunk.messageId,\r\n role: \"assistant\",\r\n title: chunk.title,\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n userRating: null,\r\n };\r\n\r\n this.messages.push(newMessage);\r\n\r\n message = newMessage;\r\n }\r\n\r\n if (chunk.title && (!message.title || message.title !== chunk.title)) {\r\n message.title = chunk.title;\r\n }\r\n\r\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\r\n\r\n for (const [key, value] of Object.entries(chunk.references)) {\r\n references[key] = normalizeReference(value) ?? {};\r\n }\r\n }\r\n\r\n if (chunk.content) {\r\n\r\n // When the responseId changes (e.g., after an internal tool call),\r\n // insert a line break to visually separate response segments.\r\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\r\n content += '\\n\\n';\r\n }\r\n\r\n if (chunk.responseId) {\r\n lastResponseId = chunk.responseId;\r\n }\r\n\r\n let processedContent = chunk.content;\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n processedContent = processedContent.replaceAll(key, `${value.index}`);\r\n }\r\n\r\n // Append processed content to the message.\r\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\r\n content += processedContent.replaceAll('
', ',');\r\n }\r\n\r\n // Update the existing message\r\n message.content = content;\r\n\r\n message.htmlContent = parseMarkdownContent(content, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n complete: () => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n if (!msg || !msg.content) {\r\n // No content received at all.\r\n this.hideTypingIndicator();\r\n }\r\n\r\n // Trigger text-to-speech only in conversation mode.\r\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\r\n this.synthesizeSpeech(msg.content);\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n },\r\n error: (err) => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n this.hideTypingIndicator();\r\n\r\n if (!this.isNavigatingAway) {\r\n this.addMessage(this.getServiceDownMessage());\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n\r\n console.error(\"Stream error:\", err);\r\n }\r\n });\r\n },\r\n getServiceDownMessage() {\r\n let newMessage = {\r\n role: \"assistant\",\r\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\r\n htmlContent: \"\",\r\n };\r\n\r\n return newMessage;\r\n },\r\n processReferences(references, messageIndex) {\r\n references = normalizeReferences(references);\r\n\r\n if (Object.keys(references).length) {\r\n\r\n let message = this.messages[messageIndex];\r\n const content = message.content || '';\r\n\r\n // Only include references that were actually cited in the response.\r\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\r\n const citedRefs = Object.entries(references).filter(([key, value]) =>\r\n content.includes(key) || content.includes(`${value.index}`)\r\n );\r\n\r\n if (!citedRefs.length) {\r\n return;\r\n }\r\n\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\r\n let processed = content.trim();\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processed = processed.replaceAll(key, placeholder);\r\n processed = processed.replaceAll(`${value.index}`, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processed = processed.replaceAll('', ',');\r\n\r\n processed += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || key;\r\n processed += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n\r\n message.content = processed;\r\n message.htmlContent = parseMarkdownContent(processed, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n }\r\n },\r\n streamingStarted() {\r\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\r\n\r\n if (stopIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.setAttribute('disabled', 'disabled');\r\n }\r\n },\r\n streamingFinished() {\r\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\r\n\r\n if (startIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.removeAttribute('disabled');\r\n this.inputElement.focus();\r\n }\r\n\r\n // Directly manipulate the DOM to stop all streaming animations.\r\n if (this.chatContainer) {\r\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\r\n for (var i = 0; i < icons.length; i++) {\r\n icons[i].classList.remove('ai-streaming-icon');\r\n icons[i].classList.add('ai-bot-icon');\r\n }\r\n }\r\n\r\n // Also update Vue data for consistency.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n },\r\n handleExternalTtsStop(e) {\r\n if (e?.detail?.sourceId === this.ttsInstanceId) {\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n },\r\n synthesizeSpeech(text, cacheIndex) {\r\n if (!this.textToSpeechEnabled || !text || !this.connection) {\r\n return;\r\n }\r\n\r\n this.audioChunks = [];\r\n this.isPlayingAudio = true;\r\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\r\n\r\n this.connection.invoke(\"SynthesizeSpeech\", this.getProfileId(), this.getSessionId(), text, this.ttsVoiceName)\r\n .catch(err => {\r\n console.error(\"TTS synthesis error:\", err);\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this._ttsCacheIndex = -1;\r\n });\r\n },\r\n toggleMessageTts(message, index) {\r\n if (this.ttsPlayingMessageIndex === index) {\r\n this.stopAudio();\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\r\n detail: { sourceId: this.ttsInstanceId }\r\n }));\r\n this.ttsPlayingMessageIndex = index;\r\n\r\n if (this.ttsAudioCache[index]) {\r\n this.playAudioBlob(this.ttsAudioCache[index]);\r\n return;\r\n }\r\n\r\n this.synthesizeSpeech(message.content, index);\r\n },\r\n playCollectedAudio() {\r\n if (this.audioChunks.length === 0) {\r\n if (!this.currentAudioElement && this.audioPlayQueue.length === 0) {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n }\r\n return;\r\n }\r\n\r\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\r\n const combined = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const chunk of this.audioChunks) {\r\n combined.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n this.audioChunks = [];\r\n\r\n const blob = new Blob([combined], { type: 'audio/mp3' });\r\n\r\n if (this._ttsCacheIndex >= 0) {\r\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\r\n this._ttsCacheIndex = -1;\r\n }\r\n\r\n // If audio is already playing, queue this blob for sequential playback.\r\n if (this.currentAudioElement) {\r\n this.audioPlayQueue.push(blob);\r\n return;\r\n }\r\n\r\n this.playAudioBlob(blob);\r\n },\r\n playAudioBlob(blob) {\r\n const url = URL.createObjectURL(blob);\r\n const audio = new Audio(url);\r\n\r\n this.currentAudioUrl = url;\r\n this.currentAudioElement = audio;\r\n this.isPlayingAudio = true;\r\n\r\n audio.addEventListener('ended', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.addEventListener('error', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.play().catch(err => {\r\n console.error(\"Audio playback error:\", err);\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n });\r\n },\r\n playNextInQueue() {\r\n if (this.audioPlayQueue.length > 0) {\r\n var nextBlob = this.audioPlayQueue.shift();\r\n this.playAudioBlob(nextBlob);\r\n } else {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this.conversationModeOnAudioEnded();\r\n }\r\n },\r\n stopAudio() {\r\n if (this.currentAudioElement) {\r\n this.currentAudioElement.pause();\r\n this.currentAudioElement.currentTime = 0;\r\n this.currentAudioElement = null;\r\n }\r\n if (this.currentAudioUrl) {\r\n URL.revokeObjectURL(this.currentAudioUrl);\r\n this.currentAudioUrl = null;\r\n }\r\n this.audioChunks = [];\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n },\r\n toggleConversationMode() {\r\n if (this.isConversationMode) {\r\n this.stopConversationMode();\r\n } else {\r\n this.startConversationMode();\r\n }\r\n },\r\n startConversationMode() {\r\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = true;\r\n this.updateConversationButton();\r\n this._conversationPartialTranscript = '';\r\n this._conversationAssistantMessage = null;\r\n this._conversationPartialMessage = null;\r\n\r\n // Remove any previous conversation ended notification.\r\n this.removeNotification('conversation-ended');\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this._conversationSubject = new signalR.Subject();\r\n this._conversationStream = stream;\r\n\r\n // Create an AnalyserNode for volume-based interrupt detection.\r\n // During TTS playback, detect when the user speaks above\r\n // the threshold to stop TTS (interrupt). Audio chunks are\r\n // always forwarded — browser echo cancellation handles\r\n // speaker echo so the STT stream has no gaps.\r\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\r\n if (AudioCtx) {\r\n this._conversationAudioCtx = new AudioCtx();\r\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\r\n this._conversationAnalyser.fftSize = 256;\r\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\r\n micSource.connect(this._conversationAnalyser);\r\n }\r\n\r\n var pendingChunk = Promise.resolve();\r\n var analyser = this._conversationAnalyser;\r\n var interruptVolumeThreshold = 30;\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n // During TTS playback, check mic volume to detect\r\n // user interruption (speaking above threshold).\r\n if (this.isPlayingAudio && analyser) {\r\n var freqData = new Uint8Array(analyser.frequencyBinCount);\r\n analyser.getByteFrequencyData(freqData);\r\n var sum = 0;\r\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\r\n var avg = sum / freqData.length;\r\n\r\n if (avg >= interruptVolumeThreshold) {\r\n // User is speaking — interrupt TTS playback.\r\n this.stopAudio();\r\n }\r\n }\r\n\r\n // Always send audio to STT — browser echo cancellation\r\n // handles speaker echo; continuous audio avoids gaps\r\n // that increase recognition latency.\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n try {\r\n this._conversationSubject.next(base64);\r\n } catch (err) {\r\n // Subject may have been completed already.\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => {\r\n try {\r\n this._conversationSubject.complete();\r\n } catch (err) {\r\n // Already completed.\r\n }\r\n });\r\n });\r\n\r\n var profileId = this.getProfileId();\r\n var sessionId = this.getSessionId() || '';\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n\r\n this.connection.send(\"StartConversation\", profileId, sessionId, this._conversationSubject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n });\r\n },\r\n stopConversationMode() {\r\n if (!this.isConversationMode) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n\r\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\r\n if (this.connection) {\r\n this.connection.invoke(\"StopConversation\").catch(function () { });\r\n }\r\n\r\n if (this.isRecording && this.mediaRecorder) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n }\r\n\r\n this.stopAudio();\r\n this._conversationPartialTranscript = '';\r\n this._conversationPartialMessage = null;\r\n\r\n // Clean up the AudioContext used for volume monitoring.\r\n if (this._conversationAudioCtx) {\r\n this._conversationAudioCtx.close().catch(function () { });\r\n this._conversationAudioCtx = null;\r\n this._conversationAnalyser = null;\r\n }\r\n\r\n // Mark any in-flight assistant message as done to stop the spinner.\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Safety net: clear all lingering streaming indicators.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Show a \"conversation ended\" notification system message.\r\n this.receiveNotification({\r\n type: 'conversation-ended',\r\n content: 'Conversation ended.',\r\n icon: 'fa-solid fa-circle-check',\r\n dismissible: true,\r\n autoDismissMs: 5000\r\n });\r\n },\r\n updateConversationButton() {\r\n if (!this.conversationButton) {\r\n return;\r\n }\r\n\r\n if (this.isConversationMode) {\r\n this.conversationButton.classList.add('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\r\n var endHtml = this.conversationButton.getAttribute('data-end-html');\r\n if (endHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n } else {\r\n this.conversationButton.classList.remove('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\r\n this.conversationButton.classList.add('btn-outline-dark');\r\n this.conversationButton.blur();\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\r\n var startHtml = this.conversationButton.getAttribute('data-start-html');\r\n if (startHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n }\r\n },\r\n conversationModeSendPrompt() {\r\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\r\n },\r\n conversationModeOnAudioEnded() {\r\n // Legacy: in conversation mode, audio playback continuation\r\n // is handled by the persistent stream. This method is only\r\n // called from playCollectedAudio for non-conversation TTS.\r\n },\r\n generatePrompt(element) {\r\n if (!element) {\r\n console.error('The element paramter is required.');\r\n\r\n return;\r\n }\r\n\r\n let templateProfileId = element.getAttribute('data-profile-id');\r\n let sessionId = this.getSessionId();\r\n let sessionProfileId = this.getProfileId();\r\n\r\n if (!templateProfileId || !sessionId) {\r\n\r\n console.error('The given element is missing data-profile-id or the session has not yet started.');\r\n return;\r\n }\r\n\r\n // streamMessage() already shows the typing indicator.\r\n this.streamMessage(templateProfileId, null, sessionProfileId);\r\n },\r\n createSessionUrl(baseUrl, param, value) {\r\n\r\n const fullUrl = baseUrl.toLowerCase().startsWith('http') ? baseUrl : window.location.origin + baseUrl;\r\n const url = new URL(fullUrl);\r\n\r\n url.searchParams.set(param, value);\r\n\r\n return url.toString();\r\n },\r\n showTypingIndicator() {\r\n this.addMessage({\r\n role: 'indicator',\r\n htmlContent: config.indicatorTemplate\r\n });\r\n },\r\n hideTypingIndicator() {\r\n const originalLength = this.messages.length;\r\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\r\n const removedCount = originalLength - this.messages.length;\r\n return removedCount;\r\n },\r\n receiveNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\r\n if (existingIndex >= 0) {\r\n this.notifications.splice(existingIndex, 1, notification);\r\n } else {\r\n this.notifications.push(notification);\r\n }\r\n this.scheduleNotificationDismiss(notification);\r\n this.$nextTick(() => {\r\n this.scrollToBottom();\r\n });\r\n },\r\n updateNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\r\n if (existingIndex >= 0) {\r\n this.notifications.splice(existingIndex, 1, notification);\r\n this.scheduleNotificationDismiss(notification);\r\n }\r\n },\r\n scheduleNotificationDismiss(notification) {\r\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\r\n return;\r\n }\r\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\r\n this.removeNotification(notification.type);\r\n }, notification.autoDismissMs);\r\n },\r\n clearNotificationDismiss(notificationType) {\r\n var timerId = this.notificationDismissTimers[notificationType];\r\n if (!timerId) {\r\n return;\r\n }\r\n clearTimeout(timerId);\r\n delete this.notificationDismissTimers[notificationType];\r\n },\r\n removeNotification(notificationType) {\r\n this.clearNotificationDismiss(notificationType);\r\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\r\n },\r\n dismissNotification(notificationType) {\r\n this.removeNotification(notificationType);\r\n },\r\n handleNotificationAction(notificationType, actionName) {\r\n if (!this.connection) {\r\n return;\r\n }\r\n var sessionId = this.getSessionId();\r\n this.connection.invoke(\"HandleNotificationAction\", sessionId, notificationType, actionName).catch(function (err) {\r\n console.error(\"Error handling notification action:\", err);\r\n });\r\n },\r\n scrollToBottom() {\r\n if (!this.autoScroll) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\r\n }, 50);\r\n },\r\n handleUserInput(event) {\r\n this.prompt = event.target.value;\r\n },\r\n getProfileId() {\r\n return this.inputElement.getAttribute('data-profile-id');\r\n },\r\n setSessionId(sessionId) {\r\n this.inputElement.setAttribute('data-session-id', sessionId || '');\r\n },\r\n resetSession() {\r\n this.stopRecording();\r\n this.setSessionId('');\r\n this.isSessionStarted = false;\r\n this.sessionRating = null;\r\n if (this.widgetIsInitialized) {\r\n localStorage.removeItem(this.chatWidgetStateSession);\r\n }\r\n this.messages = [];\r\n this.documents = [];\r\n if (!config.autoCreateSession) {\r\n this.showPlaceholder();\r\n }\r\n\r\n if (config.autoCreateSession) {\r\n this.startNewSession();\r\n }\r\n },\r\n startNewSession() {\r\n if (!this.applyOrchestratorAvailability()) {\r\n return;\r\n }\r\n\r\n const profileId = this.getProfileId();\r\n if (!profileId || !this.connection) {\r\n return;\r\n }\r\n\r\n this.connection.invoke(\"StartSession\", profileId, null).catch(err => console.error(err));\r\n },\r\n initializeApp() {\r\n this.inputElement = document.querySelector(config.inputElementSelector);\r\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\r\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\r\n this.placeholder = document.querySelector(config.placeholderElementSelector);\r\n this.applyOrchestratorAvailability();\r\n\r\n const sessionId = this.getSessionId();\r\n if (!hasWidgetConfig && sessionId) {\r\n this.loadSession(sessionId);\r\n } else if (this.isOrchestratorAvailable() && config.autoCreateSession && !hasWidgetConfig && !sessionId) {\r\n this.startNewSession();\r\n }\r\n\r\n // Initialize document bar if enabled.\r\n if (config.sessionDocumentsEnabled && config.documentBarSelector) {\r\n this.documentBar = document.querySelector(config.documentBarSelector);\r\n if (this.documentBar) {\r\n this.renderDocumentBar();\r\n\r\n // Create hidden file input for document uploads.\r\n var fileInput = document.createElement('input');\r\n fileInput.type = 'file';\r\n fileInput.id = 'ai-chat-doc-input';\r\n fileInput.className = 'd-none';\r\n fileInput.multiple = true;\r\n if (config.allowedExtensions) {\r\n fileInput.accept = config.allowedExtensions;\r\n }\r\n fileInput.addEventListener('change', (e) => this.handleFileInputChange(e));\r\n this.documentBar.parentElement.appendChild(fileInput);\r\n\r\n // Set up drag-and-drop on the input area.\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) {\r\n inputArea.addEventListener('dragover', (e) => this.handleDragOver(e));\r\n inputArea.addEventListener('dragleave', (e) => this.handleDragLeave(e));\r\n inputArea.addEventListener('drop', (e) => this.handleDrop(e));\r\n }\r\n }\r\n }\r\n\r\n // Pause auto-scroll when the user manually scrolls up during streaming.\r\n this.chatContainer.addEventListener('scroll', () => {\r\n if (!this.stream) {\r\n return;\r\n }\r\n const threshold = 30;\r\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\r\n this.autoScroll = atBottom;\r\n });\r\n\r\n this.inputElement.addEventListener('keydown', event => {\r\n\r\n if (this.stream != null) {\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" && !event.shiftKey) {\r\n event.preventDefault();\r\n this.buttonElement.click();\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('input', (e) => {\r\n this.handleUserInput(e);\r\n\r\n if (e.target.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n });\r\n\r\n this.buttonElement.addEventListener('click', () => {\r\n\r\n if (this.stream != null) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n\r\n this.streamingFinished();\r\n this.hideTypingIndicator();\r\n\r\n // Clean up: remove empty assistant message or stop streaming animation.\r\n if (this.messages.length > 0) {\r\n const lastMsg = this.messages[this.messages.length - 1];\r\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\r\n this.messages.pop();\r\n } else if (lastMsg.isStreaming) {\r\n lastMsg.isStreaming = false;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.sendMessage();\r\n });\r\n\r\n const promptGenerators = document.getElementsByClassName('profile-generated-prompt');\r\n\r\n for (var i = 0; i < promptGenerators.length; i++) {\r\n promptGenerators[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n this.generatePrompt(e.target);\r\n });\r\n }\r\n\r\n const chatSessions = document.getElementsByClassName('chat-session-history-item');\r\n\r\n for (var i = 0; i < chatSessions.length; i++) {\r\n chatSessions[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n var sessionId = e.target.getAttribute('data-session-id');\r\n\r\n if (!sessionId) {\r\n console.error('an element with the class chat-session-history-item with no data-session-id set.');\r\n\r\n return;\r\n }\r\n\r\n this.loadSession(sessionId);\r\n this.showChatScreen();\r\n });\r\n }\r\n\r\n for (let i = 0; i < config.messages.length; i++) {\r\n this.addMessage(config.messages[i]);\r\n }\r\n\r\n // Update feedback icons in the DOM after initial messages have rendered.\r\n this.$nextTick(() => {\r\n this.refreshAllFeedbackIcons();\r\n });\r\n\r\n // Delegate click for code block copy buttons.\r\n if (this.chatContainer) {\r\n this.chatContainer.addEventListener('click', (e) => {\r\n var btn = e.target.closest('.ai-code-copy-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n\r\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\r\n if (!block) {\r\n return;\r\n }\r\n\r\n var codeEl = block.querySelector('code');\r\n if (codeEl) {\r\n navigator.clipboard.writeText(codeEl.textContent);\r\n var copiedText = config.codeCopiedText || 'Copied!';\r\n btn.innerHTML = ' ' + copiedText;\r\n setTimeout(() => {\r\n btn.innerHTML = '';\r\n }, 2000);\r\n }\r\n });\r\n }\r\n\r\n // Initialize speech-to-text microphone button.\r\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\r\n this.micButton = document.querySelector(config.micButtonElementSelector);\r\n if (this.micButton) {\r\n this.micButton.style.display = '';\r\n this.micButton.addEventListener('click', () => {\r\n this.toggleRecording();\r\n });\r\n }\r\n }\r\n\r\n // Initialize conversation mode button.\r\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\r\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\r\n if (this.conversationButton) {\r\n this.conversationButton.addEventListener('click', () => {\r\n this.toggleConversationMode();\r\n });\r\n }\r\n }\r\n },\r\n loadSession(sessionId) {\r\n this.connection.invoke(\"LoadSession\", sessionId).catch(err => console.error(err));\r\n },\r\n reloadCurrentSession() {\r\n\r\n var sessionId = this.getSessionId();\r\n if (sessionId) {\r\n this.loadSession(sessionId);\r\n }\r\n },\r\n initializeSession(sessionId, force) {\r\n if (this.isSessionStarted && !force) {\r\n return\r\n }\r\n this.fireEvent(new CustomEvent(\"initializingSessionOpenAIChat\", { detail: { sessionId: sessionId } }))\r\n this.setSessionId(sessionId);\r\n this.isSessionStarted = true;\r\n\r\n if (this.widgetIsInitialized) {\r\n localStorage.setItem(this.chatWidgetStateSession, sessionId);\r\n }\r\n },\r\n initializeWidget() {\r\n\r\n if (!config.widget.chatWidgetContainer) {\r\n console.error('The widget chatWidgetContainer is required.');\r\n return;\r\n }\r\n\r\n if (!config.widget.chatWidgetStateName) {\r\n console.error('The widget chatWidgetStateName is required.');\r\n return;\r\n }\r\n\r\n const chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);\r\n\r\n if (!chatWidgetContainer) {\r\n return;\r\n }\r\n\r\n if (config.widget.chatHistorySection) {\r\n this.chatHistorySection = document.querySelector(config.widget.chatHistorySection);\r\n }\r\n\r\n this.chatWidgetStateName = config.widget.chatWidgetStateName;\r\n this.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';\r\n this.chatWidgetLayoutKey = config.widget.chatWidgetStateName + 'Layout';\r\n this.widgetContainerElement = chatWidgetContainer;\r\n this.widgetToggleButtonElement = config.widget.toggleButtonSelector\r\n ? document.querySelector(config.widget.toggleButtonSelector)\r\n : null;\r\n this.widgetResetSizeButtonElement = config.widget.resetSizeButtonSelector\r\n ? document.querySelector(config.widget.resetSizeButtonSelector)\r\n : null;\r\n this.widgetDefaultWidth = parsePixelValue(config.widget.defaultWidth) ||\r\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).width) ||\r\n 380;\r\n this.widgetDefaultHeight = parsePixelValue(config.widget.defaultHeight) ||\r\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).height) ||\r\n 520;\r\n this.widgetIsInitialized = true;\r\n\r\n if (config.widget.enableResizing) {\r\n chatWidgetContainer.classList.add('ai-chat-widget-resizable');\r\n chatWidgetContainer.style.minWidth = (parsePixelValue(config.widget.minWidth) || 320) + 'px';\r\n chatWidgetContainer.style.minHeight = (parsePixelValue(config.widget.minHeight) || 420) + 'px';\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.widgetResizeObserver = new ResizeObserver(() => {\r\n this.persistWidgetPanelSize();\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n });\r\n\r\n this.widgetResizeObserver.observe(chatWidgetContainer);\r\n }\r\n }\r\n\r\n var dragHandleSelector = config.widget.dragHandleSelector || '.ai-chat-widget-header';\r\n var dragHandle = chatWidgetContainer.querySelector(dragHandleSelector);\r\n\r\n if (config.widget.enableDragging && dragHandle) {\r\n dragHandle.classList.add('ai-chat-widget-drag-handle');\r\n chatWidgetContainer.classList.add('ai-chat-widget-draggable');\r\n this.attachDraggableWidgetElement(chatWidgetContainer, dragHandle, 'panel', false);\r\n }\r\n\r\n if (config.widget.enableDragging && this.widgetToggleButtonElement) {\r\n this.widgetToggleButtonElement.classList.add('ai-chat-widget-draggable');\r\n this.attachDraggableWidgetElement(this.widgetToggleButtonElement, this.widgetToggleButtonElement, 'toggle', true);\r\n }\r\n\r\n if (this.widgetResetSizeButtonElement) {\r\n this.widgetResetSizeButtonElement.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n this.resetWidgetSize();\r\n });\r\n }\r\n\r\n this.restoreWidgetLayout();\r\n\r\n if (!this.widgetViewportResizeHandler) {\r\n this.widgetViewportResizeHandler = () => {\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n };\r\n\r\n window.addEventListener('resize', this.widgetViewportResizeHandler);\r\n }\r\n\r\n // Auto-load the last session so the user always sees previous chat history.\r\n this.reloadCurrentSession();\r\n\r\n if (config.autoCreateSession && !this.getSessionId()) {\r\n this.startNewSession();\r\n }\r\n\r\n if (config.widget.showHistoryButton && this.chatHistorySection) {\r\n\r\n const showHistoryButton = document.querySelector(config.widget.showHistoryButton);\r\n\r\n if (showHistoryButton) {\r\n showHistoryButton.addEventListener('click', () => {\r\n this.chatHistorySection.classList.toggle('show');\r\n });\r\n }\r\n\r\n if (config.widget.closeHistoryButton) {\r\n var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);\r\n\r\n if (closeHistoryButton) {\r\n closeHistoryButton.addEventListener('click', () => {\r\n this.showChatScreen();\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (config.widget.newChatButton) {\r\n const newChatButton = document.querySelector(config.widget.newChatButton);\r\n\r\n if (newChatButton) {\r\n newChatButton.addEventListener('click', () => {\r\n this.resetSession();\r\n this.showChatScreen();\r\n });\r\n }\r\n }\r\n },\r\n showChatScreen() {\r\n\r\n if (!this.chatHistorySection) {\r\n return;\r\n }\r\n\r\n this.chatHistorySection.classList.remove('show');\r\n },\r\n getSessionId() {\r\n let sessionId = this.inputElement.getAttribute('data-session-id');\r\n\r\n if (!sessionId && this.widgetIsInitialized) {\r\n sessionId = localStorage.getItem(this.chatWidgetStateSession);\r\n }\r\n\r\n return sessionId;\r\n },\r\n copyResponse(message) {\r\n navigator.clipboard.writeText(message);\r\n },\r\n updateFeedbackIcons(container, userRating) {\r\n if (!container) {\r\n return;\r\n }\r\n\r\n var upBtn = container.querySelector('.rate-up-btn');\r\n var downBtn = container.querySelector('.rate-down-btn');\r\n\r\n // Font Awesome SVG+JS replaces with , so we must replace\r\n // the entire button content and let Font Awesome re-process.\r\n if (upBtn) {\r\n var upClass = userRating === true ? 'fa-solid fa-thumbs-up' : 'fa-regular fa-thumbs-up';\r\n var upIcon = document.createElement('i');\r\n upIcon.className = upClass;\r\n upIcon.style.fontSize = '0.9rem';\r\n upBtn.textContent = '';\r\n upBtn.appendChild(upIcon);\r\n }\r\n\r\n if (downBtn) {\r\n var downClass = userRating === false ? 'fa-solid fa-thumbs-down' : 'fa-regular fa-thumbs-down';\r\n var downIcon = document.createElement('i');\r\n downIcon.className = downClass;\r\n downIcon.style.fontSize = '0.9rem';\r\n downBtn.textContent = '';\r\n downBtn.appendChild(downIcon);\r\n }\r\n\r\n // Trigger Font Awesome SVG+JS to convert the new elements.\r\n if (window.FontAwesome && FontAwesome.dom && FontAwesome.dom.i2svg) {\r\n FontAwesome.dom.i2svg({ node: container });\r\n }\r\n },\r\n refreshAllFeedbackIcons() {\r\n var containers = this.$el.querySelectorAll('.ai-chat-message-assistant-feedback');\r\n\r\n for (var i = 0; i < containers.length; i++) {\r\n var msgId = containers[i].getAttribute('data-message-id');\r\n var msg = this.messages.find(m => m.id === msgId);\r\n\r\n if (msg) {\r\n this.updateFeedbackIcons(containers[i], msg.userRating);\r\n }\r\n }\r\n },\r\n rateMessage(message, isPositive, event) {\r\n var sessionId = this.getSessionId();\r\n\r\n if (!sessionId || !message.id || !this.connection) {\r\n return;\r\n }\r\n\r\n // Toggle: clicking the same rating again clears it.\r\n var newRating = message.userRating === isPositive ? null : isPositive;\r\n message.userRating = newRating;\r\n\r\n // Find the feedback container by message ID for reliable DOM targeting.\r\n var feedbackContainer = this.$el.querySelector(\r\n '.ai-chat-message-assistant-feedback[data-message-id=\"' + message.id + '\"]'\r\n );\r\n\r\n this.updateFeedbackIcons(feedbackContainer, newRating);\r\n\r\n // Trigger spark animation after Font Awesome has re-processed icons.\r\n if (newRating !== null && feedbackContainer) {\r\n setTimeout(() => {\r\n var btnClass = isPositive ? '.rate-up-btn' : '.rate-down-btn';\r\n var btn = feedbackContainer.querySelector(btnClass);\r\n\r\n if (btn) {\r\n btn.classList.remove('spark-effect');\r\n void btn.offsetWidth;\r\n btn.classList.add('spark-effect');\r\n btn.addEventListener('animationend', function onEnd() {\r\n btn.removeEventListener('animationend', onEnd);\r\n btn.classList.remove('spark-effect');\r\n });\r\n }\r\n }, 50);\r\n }\r\n\r\n this.connection.invoke(\"RateMessage\", sessionId, message.id, isPositive).catch(function (err) {\r\n console.error('Failed to rate message:', err);\r\n });\r\n }\r\n },\r\n watch: {\r\n documents: {\r\n handler() { this.renderDocumentBar(); },\r\n deep: true\r\n },\r\n isUploading() { this.renderDocumentBar(); },\r\n isPlayingAudio() {\r\n // Reserved for future use — volume-based interrupt detection\r\n // no longer mutes tracks; browser echo cancellation handles echo.\r\n },\r\n isConversationMode(active) {\r\n // Hide/show mic button.\r\n if (this.micButton) {\r\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\r\n }\r\n\r\n // Hide/show send button.\r\n if (this.buttonElement) {\r\n this.buttonElement.style.display = active ? 'none' : '';\r\n }\r\n\r\n // Disable/enable textarea.\r\n if (this.inputElement) {\r\n this.inputElement.disabled = active;\r\n if (active) {\r\n this.inputElement.placeholder = '';\r\n }\r\n }\r\n }\r\n },\r\n mounted() {\r\n (async () => {\r\n await this.startConnection();\r\n this.initializeApp();\r\n if (hasWidgetConfig) {\r\n this.initializeWidget();\r\n }\r\n })();\r\n\r\n window.addEventListener('beforeunload', this.handleBeforeUnload);\r\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n },\r\n beforeUnmount() {\r\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\r\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n\r\n this.stopAudio(false);\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n },\r\n template: config.messageTemplate\r\n }).mount(config.appElementSelector);\r\n\r\n return app;\r\n };\r\n\r\n return {\r\n initialize: initialize\r\n };\r\n}();\r\n\r\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\r\ndocument.addEventListener('click', function (e) {\r\n const btn = e.target.closest('.download-chart-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n const chartId = btn.getAttribute('data-chart-id');\r\n const canvas = chartId ? document.getElementById(chartId) : null;\r\n if (!canvas) {\r\n console.error('Chart canvas not found:', chartId);\r\n return;\r\n }\r\n const link = document.createElement('a');\r\n link.download = 'chart-' + chartId + '.png';\r\n link.href = canvas.toDataURL('image/png');\r\n link.click();\r\n});\r\n\r\n// Intercept download clicks for data-URI images and convert to blob downloads.\r\ndocument.addEventListener('click', function (e) {\r\n const link = e.target.closest('.ai-download-image');\r\n if (!link) {\r\n return;\r\n }\r\n\r\n const container = link.closest('.generated-image-container');\r\n const img = container?.querySelector('img');\r\n if (!img) {\r\n return;\r\n }\r\n\r\n const src = img.src;\r\n if (!src || !src.startsWith('data:')) {\r\n return; // Normal URL – let the default behaviour handle it.\r\n }\r\n\r\n e.preventDefault();\r\n\r\n fetch(src)\r\n .then(function (res) { return res.blob(); })\r\n .then(function (blob) {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = link.getAttribute('download') || 'generated-image.png';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\r\n })\r\n .catch(function (err) { console.error('Failed to download image:', err); });\r\n});\r\n"]} \ No newline at end of file +{"version":3,"sources":["ai-chat.js"],"names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","from","_arrayLikeToArray","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","push","_typeof","window","openAIChatManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","userLabel","assistantLabel","thumbsUpTitle","thumbsDownTitle","copyTitle","codeCopiedText","widget","chatWidgetContainer","chatWidgetStateName","chatHistorySection","showHistoryButton","closeHistoryButton","newChatButton","toggleButtonSelector","resetSizeButtonSelector","dragHandleSelector","enableDragging","enableResizing","persistLayout","defaultWidth","defaultHeight","minWidth","minHeight","messageTemplate","indicatorTemplate","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","parsePixelValue","Number","isFinite","parsed","parseFloat","clamp","min","max","Math","normalizeReference","reference","_ref","_normalized$index","_ref2","_normalized$text","_ref3","_normalized$link","normalized","assign","index","Index","Text","link","Link","normalizeReferences","references","_i","_Object$entries","entries","_normalizeReference","_Object$entries$_i","key","renderer","marked","Renderer","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","__chartConfigs","createChartHtml","chartId","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","tryExtractChartMarker","startIndex","type","raw","substring","endIndex","json","token","config","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","renderChartsInMessage","message","charts","requestAnimationFrame","_iterator","_step","renderChartOnCanvas","err","canvas","getElementById","Chart","console","warn","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","renderPendingCharts","configs","_i2","_Object$keys","keys","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","initialize","instanceConfig","hasWidgetConfig","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isSessionStarted","isPlaceholderVisible","chatWidgetStateSession","chatWidgetLayoutKey","widgetContainerElement","widgetToggleButtonElement","widgetResetSizeButtonElement","widgetResizeObserver","widgetViewportResizeHandler","widgetDefaultWidth","widgetDefaultHeight","widgetIsInitialized","isStreaming","isNavigatingAway","autoScroll","stream","messages","notifications","prompt","documents","existingDocuments","isUploading","uploadErrors","isDragOver","documentBar","metricsEnabled","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsButton","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","random","singleResponseMode","conversationModeEnabled","conversationButton","isConversationMode","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","getStoredWidgetLayout","storedLayout","localStorage","getItem","saveStoredWidgetLayout","partialLayout","currentLayout","nextLayout","panel","toggle","setItem","stringify","getElementSize","element","fallbackWidth","fallbackHeight","width","height","rect","getBoundingClientRect","getComputedStyle","round","clampWidgetPosition","left","top","viewportPadding","maxLeft","innerWidth","maxTop","innerHeight","applyAbsolutePosition","style","right","bottom","getWidgetDefaultSize","persistWidgetPanelPosition","panelRect","persistWidgetTogglePosition","toggleRect","persistWidgetPanelSize","defaultSize","currentSize","abs","updateWidgetResetSizeButtonVisibility","classList","add","isResized","resetWidgetSize","removeProperty","constrainWidgetElementsToViewport","restoreWidgetLayout","attachDraggableWidgetElement","handle","layoutKey","suppressClickOnDrag","_this","activePointerId","startX","startY","startLeft","startTop","dragged","dragThreshold","interactiveSelector","stopDragging","event","pointerId","removeEventListener","onPointerMove","remove","dataset","dragSuppressClick","setTimeout","deltaX","clientX","deltaY","clientY","hypot","nextPosition","addEventListener","button","target","closest","setPointerCapture","preventDefault","panelDefaultSize","panelSize","clampedPanel","toggleSize","clampedToggle","handleDragOver","sessionDocumentsEnabled","stopPropagation","inputArea","handleDragLeave","handleDrop","dataTransfer","files","uploadFiles","triggerFileInput","fileInput","click","handleFileInputChange","_this2","_callee","sessionId","profileId","formData","response","errorText","uploadError","result","j","_t","_context","uploadDocumentUrl","getSessionId","getProfileId","renderDocumentBar","FormData","append","fetch","method","body","ok","extractReadableErrorMessage","fileName","initializeSession","uploaded","failed","removeDocument","doc","_this3","_callee2","removeError","_t2","_context2","removeDocumentUrl","headers","itemId","documentId","splice","status","formatFileSize","bytes","toFixed","escapeHtml","failedItem","failedName","errorMsg","supportedExtensionsText","replaceChildren","RETURN_DOM_FRAGMENT","self","closeButtons","querySelectorAll","docToRemove","parseInt","getAttribute","errorCloseButtons","addBtn","querySelector","div","fallbackMessage","startsWith","title","detail","normalizeAssistantAppearance","appearance","label","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","startConnection","_this4","_callee3","_t3","_context3","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","forEach","msg","addMessage","$nextTick","refreshAllFeedbackIcons","initialPrompt","sendMessage","stopRecording","_attemptedSessionRecovery","removeItem","startNewSession","messageId","userRating","find","id","isFinal","_conversationPartialTranscript","escaped","replace","_conversationPartialMessage","hidePlaceholder","htmlContent","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","responseId","hideTypingIndicator","msgIndex","newMessage","base64Audio","contentType","binaryString","atob","Uint8Array","charCodeAt","playCollectedAudio","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentSession","autoCreateSession","onclose","addMessageInternal","_this5","fireEvent","CustomEvent","_this6","processedContent","citedRefs","filter","_ref4","_ref5","includes","sort","_ref6","_ref7","_ref8","_ref9","b","displayIndex","_iterator2","_step2","_step2$value","replaceAll","_displayIndex","_placeholder","_iterator3","_step3","_step3$value","_iterator4","_step4","_step4$value","addMessages","_this7","showPlaceholder","isOrchestratorAvailable","applyOrchestratorAvailability","unavailableMessage","orchestratorUnavailableMessage","disabled","micButtonElement","display","conversationButtonElement","isIndicator","trimmedPrompt","streamMessage","startRecording","_this8","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","subject","Subject","pendingChunk","size","_callee4","uint8Array","base64","_context4","arrayBuffer","reduce","str","byte","String","fromCharCode","btoa","getTracks","track","stop","complete","documentElement","send","updateMicButton","toggleRecording","sessionProfileId","_this9","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentSessionId","subscribe","chunk","_i3","_Object$entries2","_normalizeReference2","_Object$entries2$_i","_i4","_Object$entries3","_Object$entries3$_i","_this9$stream","processReferences","streamingFinished","synthesizeSpeech","_this9$stream2","getServiceDownMessage","_this0","_ref1","_ref10","_ref11","_ref12","_ref13","_ref14","processed","_iterator5","_step5","_step5$value","_iterator6","_step6","_step6$value","_iterator7","_step7","_step7$value","stopIcon","setAttribute","startIcon","removeAttribute","focus","icons","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this1","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","totalLength","sum","combined","offset","_iterator8","_step8","set","blob","Blob","_this10","URL","createObjectURL","Audio","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this11","updateConversationButton","_conversationSubject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","micSource","createMediaStreamSource","connect","analyser","interruptVolumeThreshold","freqData","frequencyBinCount","getByteFrequencyData","k","avg","_callee5","_context5","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","generatePrompt","templateProfileId","createSessionUrl","baseUrl","param","fullUrl","toLowerCase","location","origin","searchParams","originalLength","removedCount","_this12","clearNotificationDismiss","existingIndex","findIndex","scheduleNotificationDismiss","_this13","timerId","clearTimeout","dismissNotification","handleNotificationAction","actionName","_this14","scrollTop","scrollHeight","clientHeight","handleUserInput","setSessionId","resetSession","sessionRating","initializeApp","_this15","placeholderElementSelector","loadSession","documentBarSelector","className","multiple","allowedExtensions","accept","parentElement","appendChild","threshold","atBottom","shiftKey","lastMsg","pop","promptGenerators","getElementsByClassName","chatSessions","showChatScreen","btn","block","codeEl","clipboard","writeText","copiedText","micButtonElementSelector","conversationButtonElementSelector","force","initializeWidget","_this16","ResizeObserver","observe","dragHandle","copyResponse","updateFeedbackIcons","container","upBtn","downBtn","upClass","upIcon","fontSize","downClass","downIcon","FontAwesome","dom","i2svg","node","containers","$el","msgId","rateMessage","isPositive","newRating","feedbackContainer","btnClass","offsetWidth","onEnd","watch","handler","deep","active","mounted","_this17","_callee6","_context6","beforeUnmount","template","mount","download","toDataURL","img","res","removeChild"],"mappings":"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","file":"ai-chat.js","sourcesContent":["window.openAIChatManager = function () {\n\n // Defaults (can be overridden by instanceConfig)\n var defaultConfig = {\n // UI defaults for generated media\n generatedImageAltText: 'Generated Image',\n generatedImageMaxWidth: 400,\n downloadImageTitle: 'Download image',\n downloadChartTitle: 'Download chart as image',\n downloadChartButtonText: 'Download',\n userLabel: 'You',\n assistantLabel: 'Assistant',\n thumbsUpTitle: 'Thumbs up',\n thumbsDownTitle: 'Thumbs down',\n copyTitle: 'Click here to copy response to clipboard.',\n codeCopiedText: 'Copied!',\n widget: {\n chatWidgetContainer: null,\n chatWidgetStateName: null,\n chatHistorySection: null,\n showHistoryButton: null,\n closeHistoryButton: null,\n newChatButton: null,\n toggleButtonSelector: null,\n resetSizeButtonSelector: null,\n dragHandleSelector: '.ai-chat-widget-header',\n enableDragging: true,\n enableResizing: true,\n persistLayout: true,\n defaultWidth: null,\n defaultHeight: null,\n minWidth: 320,\n minHeight: 420\n },\n messageTemplate: `\n
\n
\n
\n
{{ userLabel }}
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n `,\n indicatorTemplate: `\n
\n \n Assistant\n
\n `\n };\n\n // Sanitize URLs to prevent javascript: protocol injection.\n function sanitizeUrl(url) {\n if (!url) return '';\n var trimmed = url.trim();\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\n return '';\n }\n return url;\n }\n\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\n function escapeHtmlEntities(text) {\n var span = document.createElement('span');\n span.textContent = text;\n return span.innerHTML;\n }\n\n function parsePixelValue(value) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n return null;\n }\n\n var parsed = parseFloat(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n function clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n }\n\n function normalizeReference(reference) {\n if (!reference || typeof reference !== 'object') {\n return null;\n }\n\n const normalized = Object.assign({}, reference);\n normalized.index = normalized.index ?? normalized.Index ?? 0;\n normalized.text = normalized.text ?? normalized.Text ?? null;\n normalized.link = normalized.link ?? normalized.Link ?? null;\n\n return normalized;\n }\n\n function normalizeReferences(references) {\n if (!references || typeof references !== 'object') {\n return {};\n }\n\n const normalized = {};\n\n for (const [key, value] of Object.entries(references)) {\n normalized[key] = normalizeReference(value) ?? {};\n }\n\n return normalized;\n }\n\n const renderer = new marked.Renderer();\n\n // Modify the link rendering to open in a new tab\n renderer.link = function (data) {\n var href = sanitizeUrl(data.href);\n if (!href) return data.text || '';\n return `
${data.text}`;\n };\n\n // Custom code block renderer with highlight.js integration and copy button.\n renderer.code = function (data) {\n var code = data.text || '';\n var lang = (data.lang || '').trim();\n var highlighted = code;\n\n if (typeof hljs !== 'undefined') {\n if (lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(code, { language: lang }).value;\n } catch (_) { }\n } else {\n try {\n highlighted = hljs.highlightAuto(code).value;\n } catch (_) { }\n }\n } else {\n highlighted = escapeHtmlEntities(code);\n }\n\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\n return `
${langDisplay}
${highlighted}
`;\n };\n\n // Custom image renderer for generated images with thumbnail styling and download button.\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\n renderer.image = function (data) {\n const src = sanitizeUrl(data.href);\n if (!src) return '';\n const alt = data.text || defaultConfig.generatedImageAltText;\n const maxWidth = defaultConfig.generatedImageMaxWidth;\n return `
\n \"${alt}\"\n
\n \n \n \n
\n
`;\n };\n\n // Chart counter for unique IDs\n let chartCounter = 0;\n\n // Collector for charts discovered during marked parsing.\n let _pendingCharts = [];\n\n // Global chart config map: any page (e.g., Chat Interactions) that uses\n // the shared marked instance can call window.renderPendingCharts() after\n // its DOM update to render charts it didn't create itself.\n window.__chartConfigs = window.__chartConfigs || {};\n\n function createChartHtml(chartId) {\n return `
`\n + ``\n + `
`\n + `
`\n + ``\n + `
`;\n }\n\n // Register [chart:{...json...}] as a native marked block extension so the\n // markdown parser handles chart markers inline with surrounding text.\n marked.use({\n extensions: [{\n name: 'chart',\n level: 'block',\n start(src) {\n const idx = src.indexOf('[chart:');\n return idx >= 0 ? idx : undefined;\n },\n tokenizer(src) {\n const extracted = tryExtractChartMarker(src);\n if (!extracted || extracted.startIndex !== 0) {\n return undefined;\n }\n\n const chartId = `chat_chart_${++chartCounter}`;\n\n return {\n type: 'chart',\n raw: src.substring(0, extracted.endIndex),\n chartId: chartId,\n json: extracted.json,\n };\n },\n renderer(token) {\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\n window.__chartConfigs[token.chartId] = token.json;\n return createChartHtml(token.chartId);\n }\n }]\n });\n\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\n function tryExtractChartMarker(text) {\n const token = '[chart:';\n const start = text.indexOf(token);\n if (start < 0) {\n return null;\n }\n\n // Find JSON object boundary by balancing braces\n const jsonStart = start + token.length;\n let i = jsonStart;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\n i++;\n }\n\n if (i >= text.length || text[i] !== '{') {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n\n if (inString) {\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\') {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) {\n const jsonEnd = i;\n // Expect closing bracket after JSON\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\n if (closeBracketIndex < 0) {\n return null;\n }\n\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\n return {\n startIndex: start,\n endIndex: closeBracketIndex + 1,\n json: json\n };\n }\n }\n }\n\n return null;\n }\n\n function renderChartsInMessage(message) {\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\n return;\n }\n\n // Copy and clear pending charts immediately to prevent duplicate renders.\n const charts = [...message._pendingCharts];\n message._pendingCharts = [];\n\n // Defer to requestAnimationFrame so the browser has fully laid out the\n // canvas elements before Chart.js reads their dimensions.\n requestAnimationFrame(() => {\n for (const c of charts) {\n renderChartOnCanvas(c.chartId, c.config);\n }\n });\n }\n\n function renderChartOnCanvas(chartId, config) {\n const canvas = document.getElementById(chartId);\n if (!canvas) {\n return false;\n }\n\n if (typeof Chart === 'undefined') {\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n return false;\n }\n\n // When the canvas is inside a hidden container (e.g., a widget panel with\n // display:none), it has zero dimensions and Chart.js cannot render correctly.\n // Keep the config in __chartConfigs so renderPendingCharts() can retry later\n // once the container becomes visible.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[chartId] = config;\n return false;\n }\n\n try {\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof config === 'string' ? JSON.parse(config) : config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n delete window.__chartConfigs[chartId];\n return true;\n } catch (e) {\n console.error('Error creating chart:', e);\n return false;\n }\n }\n\n // Global function: renders any chart canvases whose configs are in the\n // global __chartConfigs map. Called by pages (e.g., Chat Interactions)\n // that share the marked instance but have their own rendering pipeline.\n window.renderPendingCharts = function () {\n if (typeof Chart === 'undefined') {\n return;\n }\n\n const configs = window.__chartConfigs;\n if (!configs) {\n return;\n }\n\n requestAnimationFrame(() => {\n for (const chartId of Object.keys(configs)) {\n renderChartOnCanvas(chartId, configs[chartId]);\n }\n });\n };\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n const initialize = (instanceConfig) => {\n\n const config = Object.assign({}, defaultConfig, instanceConfig);\n config.widget = Object.assign({}, defaultConfig.widget || {}, instanceConfig && instanceConfig.widget ? instanceConfig.widget : {});\n const hasWidgetConfig = !!(instanceConfig && instanceConfig.widget && instanceConfig.widget.chatWidgetContainer && instanceConfig.widget.chatWidgetStateName);\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isSessionStarted: false,\n isPlaceholderVisible: true,\n chatWidgetStateName: null,\n chatWidgetStateSession: null,\n chatWidgetLayoutKey: null,\n chatHistorySection: null,\n widgetContainerElement: null,\n widgetToggleButtonElement: null,\n widgetResetSizeButtonElement: null,\n widgetResizeObserver: null,\n widgetViewportResizeHandler: null,\n widgetDefaultWidth: null,\n widgetDefaultHeight: null,\n widgetIsInitialized: false,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n notifications: [],\n prompt: '',\n documents: config.existingDocuments || [],\n isUploading: false,\n uploadErrors: [],\n isDragOver: false,\n documentBar: null,\n metricsEnabled: !!config.metricsEnabled,\n userLabel: config.userLabel,\n assistantLabel: config.assistantLabel,\n thumbsUpTitle: config.thumbsUpTitle,\n thumbsDownTitle: config.thumbsDownTitle,\n copyTitle: config.copyTitle,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n currentAudioUrl: null,\n ttsButton: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n ttsInstanceId: 'ai-chat-' + Math.random().toString(36).slice(2),\n singleResponseMode: !!config.singleResponseMode,\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n notificationDismissTimers: {},\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n getStoredWidgetLayout() {\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\n return {};\n }\n\n try {\n var storedLayout = localStorage.getItem(this.chatWidgetLayoutKey);\n return storedLayout ? JSON.parse(storedLayout) || {} : {};\n } catch (error) {\n console.warn('Failed to read widget layout state.', error);\n return {};\n }\n },\n saveStoredWidgetLayout(partialLayout) {\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\n return;\n }\n\n var currentLayout = this.getStoredWidgetLayout();\n var nextLayout = Object.assign({}, currentLayout);\n\n if (partialLayout.panel !== undefined) {\n nextLayout.panel = Object.assign({}, currentLayout.panel || {}, partialLayout.panel || {});\n }\n\n if (partialLayout.toggle !== undefined) {\n nextLayout.toggle = Object.assign({}, currentLayout.toggle || {}, partialLayout.toggle || {});\n }\n\n localStorage.setItem(this.chatWidgetLayoutKey, JSON.stringify(nextLayout));\n },\n getElementSize(element, fallbackWidth, fallbackHeight) {\n if (!element) {\n return {\n width: fallbackWidth || 0,\n height: fallbackHeight || 0\n };\n }\n\n var rect = element.getBoundingClientRect();\n var computed = window.getComputedStyle(element);\n\n return {\n width: Math.round(rect.width || parsePixelValue(computed.width) || fallbackWidth || 0),\n height: Math.round(rect.height || parsePixelValue(computed.height) || fallbackHeight || 0)\n };\n },\n clampWidgetPosition(left, top, width, height) {\n var viewportPadding = 8;\n var maxLeft = Math.max(viewportPadding, window.innerWidth - width - viewportPadding);\n var maxTop = Math.max(viewportPadding, window.innerHeight - height - viewportPadding);\n\n return {\n left: Math.round(clamp(left, viewportPadding, maxLeft)),\n top: Math.round(clamp(top, viewportPadding, maxTop))\n };\n },\n applyAbsolutePosition(element, left, top) {\n if (!element) {\n return;\n }\n\n element.style.left = left + 'px';\n element.style.top = top + 'px';\n element.style.right = 'auto';\n element.style.bottom = 'auto';\n },\n getWidgetDefaultSize() {\n return {\n width: this.widgetDefaultWidth || parsePixelValue(config.widget.defaultWidth) || 380,\n height: this.widgetDefaultHeight || parsePixelValue(config.widget.defaultHeight) || 520\n };\n },\n persistWidgetPanelPosition() {\n if (!this.widgetContainerElement || !config.widget.persistLayout) {\n return;\n }\n\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\n this.saveStoredWidgetLayout({\n panel: {\n left: Math.round(panelRect.left),\n top: Math.round(panelRect.top)\n }\n });\n },\n persistWidgetTogglePosition() {\n if (!this.widgetToggleButtonElement || !config.widget.persistLayout) {\n return;\n }\n\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\n this.saveStoredWidgetLayout({\n toggle: {\n left: Math.round(toggleRect.left),\n top: Math.round(toggleRect.top)\n }\n });\n },\n persistWidgetPanelSize() {\n if (!this.widgetContainerElement || !config.widget.enableResizing || !config.widget.persistLayout) {\n return;\n }\n\n var defaultSize = this.getWidgetDefaultSize();\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\n\n this.saveStoredWidgetLayout({\n panel: {\n width: Math.abs(currentSize.width - defaultSize.width) <= 1 ? null : currentSize.width,\n height: Math.abs(currentSize.height - defaultSize.height) <= 1 ? null : currentSize.height\n }\n });\n },\n updateWidgetResetSizeButtonVisibility() {\n if (!this.widgetResetSizeButtonElement) {\n return;\n }\n\n if (!config.widget.enableResizing || !this.widgetContainerElement) {\n this.widgetResetSizeButtonElement.classList.add('d-none');\n return;\n }\n\n var defaultSize = this.getWidgetDefaultSize();\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\n var isResized =\n Math.abs(currentSize.width - defaultSize.width) > 1 ||\n Math.abs(currentSize.height - defaultSize.height) > 1 ||\n !!this.widgetContainerElement.style.width ||\n !!this.widgetContainerElement.style.height;\n\n this.widgetResetSizeButtonElement.classList.toggle('d-none', !isResized);\n },\n resetWidgetSize() {\n if (!this.widgetContainerElement || !config.widget.enableResizing) {\n return;\n }\n\n this.widgetContainerElement.style.removeProperty('width');\n this.widgetContainerElement.style.removeProperty('height');\n this.persistWidgetPanelSize();\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n },\n restoreWidgetLayout() {\n var storedLayout = this.getStoredWidgetLayout();\n\n if (this.widgetContainerElement && config.widget.enableResizing) {\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.width)) {\n this.widgetContainerElement.style.width = storedLayout.panel.width + 'px';\n } else {\n this.widgetContainerElement.style.removeProperty('width');\n }\n\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.height)) {\n this.widgetContainerElement.style.height = storedLayout.panel.height + 'px';\n } else {\n this.widgetContainerElement.style.removeProperty('height');\n }\n }\n\n if (this.widgetContainerElement && config.widget.enableDragging &&\n Number.isFinite(storedLayout.panel && storedLayout.panel.left) &&\n Number.isFinite(storedLayout.panel && storedLayout.panel.top)) {\n this.applyAbsolutePosition(this.widgetContainerElement, storedLayout.panel.left, storedLayout.panel.top);\n }\n\n if (this.widgetToggleButtonElement && config.widget.enableDragging &&\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.left) &&\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.top)) {\n this.applyAbsolutePosition(this.widgetToggleButtonElement, storedLayout.toggle.left, storedLayout.toggle.top);\n }\n\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n },\n attachDraggableWidgetElement(element, handle, layoutKey, suppressClickOnDrag) {\n if (!element || !handle || !config.widget.enableDragging) {\n return;\n }\n\n var activePointerId = null;\n var startX = 0;\n var startY = 0;\n var startLeft = 0;\n var startTop = 0;\n var dragged = false;\n var dragThreshold = 4;\n var interactiveSelector = 'button, a, input, textarea, select, option, label';\n\n var stopDragging = (event) => {\n if (activePointerId === null) {\n return;\n }\n\n if (event && event.pointerId !== undefined && event.pointerId !== activePointerId) {\n return;\n }\n\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', stopDragging);\n document.removeEventListener('pointercancel', stopDragging);\n element.classList.remove('ai-chat-widget-dragging');\n activePointerId = null;\n\n if (!dragged) {\n return;\n }\n\n if (layoutKey === 'panel') {\n this.persistWidgetPanelPosition();\n } else if (layoutKey === 'toggle') {\n this.persistWidgetTogglePosition();\n }\n\n if (suppressClickOnDrag) {\n element.dataset.dragSuppressClick = 'true';\n window.setTimeout(() => {\n if (element.dataset.dragSuppressClick === 'true') {\n element.dataset.dragSuppressClick = 'false';\n }\n }, 0);\n }\n };\n\n var onPointerMove = (event) => {\n if (activePointerId === null || event.pointerId !== activePointerId) {\n return;\n }\n\n var deltaX = event.clientX - startX;\n var deltaY = event.clientY - startY;\n\n if (!dragged && Math.hypot(deltaX, deltaY) < dragThreshold) {\n return;\n }\n\n dragged = true;\n\n var defaultSize = this.getWidgetDefaultSize();\n var currentSize = this.getElementSize(\n element,\n layoutKey === 'panel' ? defaultSize.width : 52,\n layoutKey === 'panel' ? defaultSize.height : 52);\n var nextPosition = this.clampWidgetPosition(\n startLeft + deltaX,\n startTop + deltaY,\n currentSize.width,\n currentSize.height);\n\n this.applyAbsolutePosition(element, nextPosition.left, nextPosition.top);\n };\n\n handle.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) {\n return;\n }\n\n if (layoutKey === 'panel' && event.target.closest(interactiveSelector)) {\n return;\n }\n\n var rect = element.getBoundingClientRect();\n startX = event.clientX;\n startY = event.clientY;\n startLeft = rect.left;\n startTop = rect.top;\n dragged = false;\n activePointerId = event.pointerId;\n element.classList.add('ai-chat-widget-dragging');\n\n if (handle.setPointerCapture) {\n handle.setPointerCapture(event.pointerId);\n }\n\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', stopDragging);\n document.addEventListener('pointercancel', stopDragging);\n event.preventDefault();\n });\n },\n constrainWidgetElementsToViewport() {\n if (this.widgetContainerElement && this.widgetContainerElement.style.left) {\n var panelDefaultSize = this.getWidgetDefaultSize();\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\n var clampedPanel = this.clampWidgetPosition(panelRect.left, panelRect.top, panelSize.width, panelSize.height);\n\n this.applyAbsolutePosition(this.widgetContainerElement, clampedPanel.left, clampedPanel.top);\n\n if (config.widget.persistLayout) {\n this.persistWidgetPanelPosition();\n }\n }\n\n if (this.widgetToggleButtonElement && this.widgetToggleButtonElement.style.left) {\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\n var clampedToggle = this.clampWidgetPosition(toggleRect.left, toggleRect.top, toggleSize.width, toggleSize.height);\n\n this.applyAbsolutePosition(this.widgetToggleButtonElement, clampedToggle.left, clampedToggle.top);\n\n if (config.widget.persistLayout) {\n this.persistWidgetTogglePosition();\n }\n }\n },\n handleDragOver(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = true;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.add('ai-chat-drag-over');\n },\n handleDragLeave(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = false;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\n },\n handleDrop(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = false;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\n if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.uploadFiles(e.dataTransfer.files);\n }\n },\n triggerFileInput() {\n if (!config.sessionDocumentsEnabled) return;\n var fileInput = document.getElementById('ai-chat-doc-input');\n if (fileInput) fileInput.click();\n },\n handleFileInputChange(e) {\n var files = e.target.files;\n if (files && files.length > 0) {\n this.uploadFiles(files);\n }\n e.target.value = '';\n },\n async uploadFiles(files) {\n if (!config.uploadDocumentUrl) return;\n\n var sessionId = this.getSessionId();\n var profileId = this.getProfileId();\n\n if (!sessionId && !profileId) {\n console.warn('Cannot upload documents without a session or profile.');\n return;\n }\n\n this.isUploading = true;\n this.uploadErrors = [];\n this.renderDocumentBar();\n try {\n var formData = new FormData();\n if (sessionId) {\n formData.append('sessionId', sessionId);\n } else {\n formData.append('profileId', profileId);\n }\n for (var i = 0; i < files.length; i++) {\n formData.append('files', files[i]);\n }\n\n var response = await fetch(config.uploadDocumentUrl, {\n method: 'POST',\n body: formData\n });\n\n if (!response.ok) {\n var errorText = await response.text();\n var uploadError = this.extractReadableErrorMessage(errorText, 'Upload failed. Please try again.');\n console.error('Upload failed:', errorText);\n this.uploadErrors = [{ fileName: '', error: uploadError }];\n return;\n }\n\n var result = await response.json();\n\n // If the server created a new session, initialize it.\n if (result.sessionId && !sessionId) {\n this.initializeSession(result.sessionId);\n }\n\n if (result.uploaded && result.uploaded.length > 0) {\n for (var j = 0; j < result.uploaded.length; j++) {\n this.documents.push(result.uploaded[j]);\n }\n }\n if (result.failed && result.failed.length > 0) {\n this.uploadErrors = result.failed;\n }\n } catch (err) {\n console.error('Upload error:', err);\n this.uploadErrors = [{ fileName: '', error: 'Upload failed. Please try again.' }];\n } finally {\n this.isUploading = false;\n this.renderDocumentBar();\n }\n },\n async removeDocument(doc) {\n if (!config.removeDocumentUrl) return;\n\n try {\n var sessionId = this.getSessionId();\n var response = await fetch(config.removeDocumentUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ itemId: sessionId, documentId: doc.documentId })\n });\n\n if (response.ok) {\n var idx = this.documents.indexOf(doc);\n if (idx > -1) this.documents.splice(idx, 1);\n } else {\n var errorText = await response.text();\n var removeError = this.extractReadableErrorMessage(errorText, 'Failed to remove document. Please try again.');\n console.error('Failed to remove document:', response.status, errorText);\n this.uploadErrors = [{ fileName: doc.fileName || '', error: removeError }];\n this.renderDocumentBar();\n }\n } catch (err) {\n console.error('Remove document error:', err);\n this.uploadErrors = [{ fileName: doc.fileName || '', error: 'Failed to remove document. Please try again.' }];\n this.renderDocumentBar();\n }\n },\n formatFileSize(bytes) {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n },\n renderDocumentBar() {\n if (!this.documentBar) return;\n\n if (!config.sessionDocumentsEnabled) {\n this.documentBar.classList.add('d-none');\n return;\n }\n\n this.documentBar.classList.remove('d-none');\n\n var html = '
';\n html += '
';\n\n for (var i = 0; i < this.documents.length; i++) {\n var doc = this.documents[i];\n var name = doc.fileName || 'Document';\n if (name.length > 20) name = name.substring(0, 17) + '...';\n html += '';\n html += ' ';\n html += this.escapeHtml(name);\n html += ' ';\n html += '';\n }\n\n for (var m = 0; m < this.uploadErrors.length; m++) {\n var failedItem = this.uploadErrors[m];\n var failedName = failedItem.fileName || 'File';\n var errorMsg = failedItem.error || 'Upload failed';\n if (failedName.length > 15) failedName = failedName.substring(0, 12) + '...';\n html += '';\n html += ' ';\n html += this.escapeHtml(failedName);\n html += ' ';\n html += '';\n }\n\n if (this.isUploading) {\n html += '';\n html += ' Uploading...';\n html += '';\n }\n\n html += '';\n html += '
';\n if (config.supportedExtensionsText) {\n html += '
Supported formats: ' + this.escapeHtml(config.supportedExtensionsText) + '
';\n }\n\n html += '
';\n\n this.documentBar.replaceChildren(DOMPurify.sanitize(html, { RETURN_DOM_FRAGMENT: true }));\n\n // Bind remove handlers\n var self = this;\n var closeButtons = this.documentBar.querySelectorAll('[data-doc-index]');\n for (var j = 0; j < closeButtons.length; j++) {\n closeButtons[j].addEventListener('click', (function (idx) {\n return function (e) {\n e.preventDefault();\n e.stopPropagation();\n var docToRemove = self.documents[idx];\n if (docToRemove) self.removeDocument(docToRemove);\n };\n })(parseInt(closeButtons[j].getAttribute('data-doc-index'))));\n }\n\n // Bind error dismiss handlers\n var errorCloseButtons = this.documentBar.querySelectorAll('[data-error-index]');\n for (var n = 0; n < errorCloseButtons.length; n++) {\n errorCloseButtons[n].addEventListener('click', (function (idx) {\n return function (e) {\n e.preventDefault();\n e.stopPropagation();\n self.uploadErrors.splice(idx, 1);\n self.renderDocumentBar();\n };\n })(parseInt(errorCloseButtons[n].getAttribute('data-error-index'))));\n }\n\n // Bind add button\n var addBtn = this.documentBar.querySelector('.ai-chat-doc-add-btn');\n if (addBtn) {\n addBtn.addEventListener('click', function (e) {\n e.preventDefault();\n self.triggerFileInput();\n });\n }\n },\n escapeHtml(text) {\n var div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n },\n extractReadableErrorMessage(errorText, fallbackMessage) {\n if (!errorText || typeof errorText !== 'string') {\n return fallbackMessage;\n }\n\n var trimmed = errorText.trim();\n if (!trimmed) {\n return fallbackMessage;\n }\n\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n var parsed = JSON.parse(trimmed);\n var message = parsed?.error || parsed?.message || parsed?.title || parsed?.detail;\n return typeof message === 'string' && message.trim()\n ? message.trim()\n : fallbackMessage;\n } catch (err) {\n return fallbackMessage;\n }\n }\n\n if (/<[^>]+>/.test(trimmed)) {\n return fallbackMessage;\n }\n\n return trimmed;\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : this.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadSession\", (data) => {\n this.initializeSession(data.sessionId, true);\n this.messages = [];\n this.documents = data.documents || [];\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n\n // Update feedback icons in the DOM after all messages have rendered.\n this.$nextTick(() => {\n this.refreshAllFeedbackIcons();\n });\n\n // When the session is new (no messages) and an initial prompt is configured,\n // automatically send it as the first user message to trigger an AI response.\n if (this.messages.length === 0 && config.initialPrompt) {\n this.prompt = config.initialPrompt;\n this.sendMessage();\n }\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // If this is a widget with a stale cached session (e.g., profile was deleted),\n // clear the cached session and start fresh with the current profile.\n if (this.widgetIsInitialized && !this.isSessionStarted && !this._attemptedSessionRecovery) {\n this._attemptedSessionRecovery = true;\n localStorage.removeItem(this.chatWidgetStateSession);\n this.startNewSession();\n }\n });\n\n this.connection.on(\"MessageRated\", (messageId, userRating) => {\n var msg = this.messages.find(m => m.id === messageId);\n if (msg) {\n msg.userRating = userRating;\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (sessionId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (sessionId, text) => {\n if (text) {\n this.stopAudio();\n\n // If there's an interrupted assistant message still streaming,\n // mark it as done to stop the spinner animation.\n if (this._conversationAssistantMessage) {\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\n if (oldMsg) {\n oldMsg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (sessionId, messageId, token, responseId, appearance) => {\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n userRating: null,\n appearance: this.normalizeAssistantAppearance(appearance),\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.content = this._conversationAssistantMessage.content;\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (sessionId, messageId) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (sessionId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n this.audioChunks.push(bytes);\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (sessionId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n\n if (this.isSessionStarted) {\n this.reloadCurrentSession();\n } else if (config.autoCreateSession) {\n this.startNewSession();\n }\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingOpenAIPromotMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedOpenAIPromotMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n\n // Ensure userRating is always defined for Vue reactivity.\n if (message.userRating === undefined) {\n message.userRating = null;\n }\n\n if (message.content) {\n let processedContent = message.content.trim();\n message.references = normalizeReferences(message.references);\n\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\n\n // Only include references that were actually cited in the response.\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\n\n if (citedRefs.length) {\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders.\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\n processedContent = processedContent.replaceAll('
', ',');\n\n processedContent += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || key;\n processedContent += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n }\n }\n\n message.content = processedContent;\n message.htmlContent = parseMarkdownContent(processedContent, message);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n addMessages(messages) {\n\n for (let i = 0; i < messages.length; i++) {\n this.addMessageInternal(messages[i]);\n }\n\n this.hidePlaceholder();\n this.$nextTick(() => {\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n isOrchestratorAvailable() {\n return config.isOrchestratorAvailable !== false;\n },\n applyOrchestratorAvailability() {\n if (this.isOrchestratorAvailable()) {\n return true;\n }\n\n const unavailableMessage = config.orchestratorUnavailableMessage || \"This orchestrator is not currently available.\";\n\n if (this.inputElement) {\n this.inputElement.disabled = true;\n this.inputElement.value = '';\n this.inputElement.placeholder = unavailableMessage;\n }\n\n if (this.buttonElement) {\n this.buttonElement.disabled = true;\n }\n\n if (this.micButtonElement) {\n this.micButtonElement.disabled = true;\n this.micButtonElement.style.display = 'none';\n }\n\n if (this.conversationButtonElement) {\n this.conversationButtonElement.disabled = true;\n this.conversationButtonElement.style.display = 'none';\n }\n\n return false;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n sendMessage() {\n if (!this.applyOrchestratorAvailability()) {\n return;\n }\n\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // In single-response mode, clear all previous messages.\n if (this.singleResponseMode) {\n this.messages.splice(0, this.messages.length);\n }\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n this.streamMessage(this.getProfileId(), trimmedPrompt, null);\n this.inputElement.value = '';\n this.prompt = '';\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var profileId = this.getProfileId();\n var sessionId = this.getSessionId() || '';\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", profileId, sessionId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n },\n streamMessage(profileId, trimmedPrompt, sessionProfileId) {\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n // Get the index after showing typing indicator.\n var messageIndex = this.messages.length;\n var currentSessionId = this.getSessionId();\n\n this.stream = this.connection.stream(\"SendMessage\", profileId, trimmedPrompt, currentSessionId, sessionProfileId)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n\n if (chunk.sessionId && !currentSessionId) {\n this.initializeSession(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n // Re-assign the index after hiding the typing indicator.\n messageIndex = this.messages.length;\n let newMessage = {\n id: chunk.messageId,\n role: \"assistant\",\n title: chunk.title,\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n userRating: null,\n };\n\n this.messages.push(newMessage);\n\n message = newMessage;\n }\n\n if (chunk.title && (!message.title || message.title !== chunk.title)) {\n message.title = chunk.title;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = normalizeReference(value) ?? {};\n }\n }\n\n if (chunk.content) {\n\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n let processedContent = chunk.content;\n\n for (const [key, value] of Object.entries(references)) {\n processedContent = processedContent.replaceAll(key, `${value.index}`);\n }\n\n // Append processed content to the message.\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\n content += processedContent.replaceAll('
', ',');\n }\n\n // Update the existing message\n message.content = content;\n\n message.htmlContent = parseMarkdownContent(content, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n let newMessage = {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n\n return newMessage;\n },\n processReferences(references, messageIndex) {\n references = normalizeReferences(references);\n\n if (Object.keys(references).length) {\n\n let message = this.messages[messageIndex];\n const content = message.content || '';\n\n // Only include references that were actually cited in the response.\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\n const citedRefs = Object.entries(references).filter(([key, value]) =>\n content.includes(key) || content.includes(`${value.index}`)\n );\n\n if (!citedRefs.length) {\n return;\n }\n\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\n let processed = content.trim();\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processed = processed.replaceAll(key, placeholder);\n processed = processed.replaceAll(`${value.index}`, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processed = processed.replaceAll('', ',');\n\n processed += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || key;\n processed += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n\n message.content = processed;\n message.htmlContent = parseMarkdownContent(processed, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n if (this.inputElement) {\n this.inputElement.setAttribute('disabled', 'disabled');\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n if (this.inputElement) {\n this.inputElement.removeAttribute('disabled');\n this.inputElement.focus();\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n },\n handleExternalTtsStop(e) {\n if (e?.detail?.sourceId === this.ttsInstanceId) {\n return;\n }\n\n this.stopAudio(false);\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getProfileId(), this.getSessionId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio(false);\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\n detail: { sourceId: this.ttsInstanceId }\n }));\n this.ttsPlayingMessageIndex = index;\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.currentAudioElement && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is already playing, queue this blob for sequential playback.\n if (this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioUrl = url;\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n var nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n if (this.currentAudioUrl) {\n URL.revokeObjectURL(this.currentAudioUrl);\n this.currentAudioUrl = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n // During TTS playback, detect when the user speaks above\n // the threshold to stop TTS (interrupt). Audio chunks are\n // always forwarded — browser echo cancellation handles\n // speaker echo so the STT stream has no gaps.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var profileId = this.getProfileId();\n var sessionId = this.getSessionId() || '';\n var language = navigator.language || document.documentElement.lang || 'en-US';\n\n this.connection.send(\"StartConversation\", profileId, sessionId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, audio playback continuation\n // is handled by the persistent stream. This method is only\n // called from playCollectedAudio for non-conversation TTS.\n },\n generatePrompt(element) {\n if (!element) {\n console.error('The element paramter is required.');\n\n return;\n }\n\n let templateProfileId = element.getAttribute('data-profile-id');\n let sessionId = this.getSessionId();\n let sessionProfileId = this.getProfileId();\n\n if (!templateProfileId || !sessionId) {\n\n console.error('The given element is missing data-profile-id or the session has not yet started.');\n return;\n }\n\n // streamMessage() already shows the typing indicator.\n this.streamMessage(templateProfileId, null, sessionProfileId);\n },\n createSessionUrl(baseUrl, param, value) {\n\n const fullUrl = baseUrl.toLowerCase().startsWith('http') ? baseUrl : window.location.origin + baseUrl;\n const url = new URL(fullUrl);\n\n url.searchParams.set(param, value);\n\n return url.toString();\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\n if (existingIndex >= 0) {\n this.notifications.splice(existingIndex, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.$nextTick(() => {\n this.scrollToBottom();\n });\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\n if (existingIndex >= 0) {\n this.notifications.splice(existingIndex, 1, notification);\n this.scheduleNotificationDismiss(notification);\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var sessionId = this.getSessionId();\n this.connection.invoke(\"HandleNotificationAction\", sessionId, notificationType, actionName).catch(function (err) {\n console.error(\"Error handling notification action:\", err);\n });\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getProfileId() {\n return this.inputElement.getAttribute('data-profile-id');\n },\n setSessionId(sessionId) {\n this.inputElement.setAttribute('data-session-id', sessionId || '');\n },\n resetSession() {\n this.stopRecording();\n this.setSessionId('');\n this.isSessionStarted = false;\n this.sessionRating = null;\n if (this.widgetIsInitialized) {\n localStorage.removeItem(this.chatWidgetStateSession);\n }\n this.messages = [];\n this.documents = [];\n if (!config.autoCreateSession) {\n this.showPlaceholder();\n }\n\n if (config.autoCreateSession) {\n this.startNewSession();\n }\n },\n startNewSession() {\n if (!this.applyOrchestratorAvailability()) {\n return;\n }\n\n const profileId = this.getProfileId();\n if (!profileId || !this.connection) {\n return;\n }\n\n this.connection.invoke(\"StartSession\", profileId, null).catch(err => console.error(err));\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n this.applyOrchestratorAvailability();\n\n const sessionId = this.getSessionId();\n if (!hasWidgetConfig && sessionId) {\n this.loadSession(sessionId);\n } else if (this.isOrchestratorAvailable() && config.autoCreateSession && !hasWidgetConfig && !sessionId) {\n this.startNewSession();\n }\n\n // Initialize document bar if enabled.\n if (config.sessionDocumentsEnabled && config.documentBarSelector) {\n this.documentBar = document.querySelector(config.documentBarSelector);\n if (this.documentBar) {\n this.renderDocumentBar();\n\n // Create hidden file input for document uploads.\n var fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.id = 'ai-chat-doc-input';\n fileInput.className = 'd-none';\n fileInput.multiple = true;\n if (config.allowedExtensions) {\n fileInput.accept = config.allowedExtensions;\n }\n fileInput.addEventListener('change', (e) => this.handleFileInputChange(e));\n this.documentBar.parentElement.appendChild(fileInput);\n\n // Set up drag-and-drop on the input area.\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) {\n inputArea.addEventListener('dragover', (e) => this.handleDragOver(e));\n inputArea.addEventListener('dragleave', (e) => this.handleDragLeave(e));\n inputArea.addEventListener('drop', (e) => this.handleDrop(e));\n }\n }\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keydown', event => {\n\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.buttonElement.addEventListener('click', () => {\n\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const promptGenerators = document.getElementsByClassName('profile-generated-prompt');\n\n for (var i = 0; i < promptGenerators.length; i++) {\n promptGenerators[i].addEventListener('click', (e) => {\n e.preventDefault();\n this.generatePrompt(e.target);\n });\n }\n\n const chatSessions = document.getElementsByClassName('chat-session-history-item');\n\n for (var i = 0; i < chatSessions.length; i++) {\n chatSessions[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var sessionId = e.target.getAttribute('data-session-id');\n\n if (!sessionId) {\n console.error('an element with the class chat-session-history-item with no data-session-id set.');\n\n return;\n }\n\n this.loadSession(sessionId);\n this.showChatScreen();\n });\n }\n\n for (let i = 0; i < config.messages.length; i++) {\n this.addMessage(config.messages[i]);\n }\n\n // Update feedback icons in the DOM after initial messages have rendered.\n this.$nextTick(() => {\n this.refreshAllFeedbackIcons();\n });\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n },\n loadSession(sessionId) {\n this.connection.invoke(\"LoadSession\", sessionId).catch(err => console.error(err));\n },\n reloadCurrentSession() {\n\n var sessionId = this.getSessionId();\n if (sessionId) {\n this.loadSession(sessionId);\n }\n },\n initializeSession(sessionId, force) {\n if (this.isSessionStarted && !force) {\n return\n }\n this.fireEvent(new CustomEvent(\"initializingSessionOpenAIChat\", { detail: { sessionId: sessionId } }))\n this.setSessionId(sessionId);\n this.isSessionStarted = true;\n\n if (this.widgetIsInitialized) {\n localStorage.setItem(this.chatWidgetStateSession, sessionId);\n }\n },\n initializeWidget() {\n\n if (!config.widget.chatWidgetContainer) {\n console.error('The widget chatWidgetContainer is required.');\n return;\n }\n\n if (!config.widget.chatWidgetStateName) {\n console.error('The widget chatWidgetStateName is required.');\n return;\n }\n\n const chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);\n\n if (!chatWidgetContainer) {\n return;\n }\n\n if (config.widget.chatHistorySection) {\n this.chatHistorySection = document.querySelector(config.widget.chatHistorySection);\n }\n\n this.chatWidgetStateName = config.widget.chatWidgetStateName;\n this.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';\n this.chatWidgetLayoutKey = config.widget.chatWidgetStateName + 'Layout';\n this.widgetContainerElement = chatWidgetContainer;\n this.widgetToggleButtonElement = config.widget.toggleButtonSelector\n ? document.querySelector(config.widget.toggleButtonSelector)\n : null;\n this.widgetResetSizeButtonElement = config.widget.resetSizeButtonSelector\n ? document.querySelector(config.widget.resetSizeButtonSelector)\n : null;\n this.widgetDefaultWidth = parsePixelValue(config.widget.defaultWidth) ||\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).width) ||\n 380;\n this.widgetDefaultHeight = parsePixelValue(config.widget.defaultHeight) ||\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).height) ||\n 520;\n this.widgetIsInitialized = true;\n\n if (config.widget.enableResizing) {\n chatWidgetContainer.classList.add('ai-chat-widget-resizable');\n chatWidgetContainer.style.minWidth = (parsePixelValue(config.widget.minWidth) || 320) + 'px';\n chatWidgetContainer.style.minHeight = (parsePixelValue(config.widget.minHeight) || 420) + 'px';\n\n if (typeof ResizeObserver !== 'undefined') {\n this.widgetResizeObserver = new ResizeObserver(() => {\n this.persistWidgetPanelSize();\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n });\n\n this.widgetResizeObserver.observe(chatWidgetContainer);\n }\n }\n\n var dragHandleSelector = config.widget.dragHandleSelector || '.ai-chat-widget-header';\n var dragHandle = chatWidgetContainer.querySelector(dragHandleSelector);\n\n if (config.widget.enableDragging && dragHandle) {\n dragHandle.classList.add('ai-chat-widget-drag-handle');\n chatWidgetContainer.classList.add('ai-chat-widget-draggable');\n this.attachDraggableWidgetElement(chatWidgetContainer, dragHandle, 'panel', false);\n }\n\n if (config.widget.enableDragging && this.widgetToggleButtonElement) {\n this.widgetToggleButtonElement.classList.add('ai-chat-widget-draggable');\n this.attachDraggableWidgetElement(this.widgetToggleButtonElement, this.widgetToggleButtonElement, 'toggle', true);\n }\n\n if (this.widgetResetSizeButtonElement) {\n this.widgetResetSizeButtonElement.addEventListener('click', (event) => {\n event.preventDefault();\n this.resetWidgetSize();\n });\n }\n\n this.restoreWidgetLayout();\n\n if (!this.widgetViewportResizeHandler) {\n this.widgetViewportResizeHandler = () => {\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n };\n\n window.addEventListener('resize', this.widgetViewportResizeHandler);\n }\n\n // Auto-load the last session so the user always sees previous chat history.\n this.reloadCurrentSession();\n\n if (config.autoCreateSession && !this.getSessionId()) {\n this.startNewSession();\n }\n\n if (config.widget.showHistoryButton && this.chatHistorySection) {\n\n const showHistoryButton = document.querySelector(config.widget.showHistoryButton);\n\n if (showHistoryButton) {\n showHistoryButton.addEventListener('click', () => {\n this.chatHistorySection.classList.toggle('show');\n });\n }\n\n if (config.widget.closeHistoryButton) {\n var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);\n\n if (closeHistoryButton) {\n closeHistoryButton.addEventListener('click', () => {\n this.showChatScreen();\n });\n }\n }\n }\n\n if (config.widget.newChatButton) {\n const newChatButton = document.querySelector(config.widget.newChatButton);\n\n if (newChatButton) {\n newChatButton.addEventListener('click', () => {\n this.resetSession();\n this.showChatScreen();\n });\n }\n }\n },\n showChatScreen() {\n\n if (!this.chatHistorySection) {\n return;\n }\n\n this.chatHistorySection.classList.remove('show');\n },\n getSessionId() {\n let sessionId = this.inputElement.getAttribute('data-session-id');\n\n if (!sessionId && this.widgetIsInitialized) {\n sessionId = localStorage.getItem(this.chatWidgetStateSession);\n }\n\n return sessionId;\n },\n copyResponse(message) {\n navigator.clipboard.writeText(message);\n },\n updateFeedbackIcons(container, userRating) {\n if (!container) {\n return;\n }\n\n var upBtn = container.querySelector('.rate-up-btn');\n var downBtn = container.querySelector('.rate-down-btn');\n\n // Font Awesome SVG+JS replaces with , so we must replace\n // the entire button content and let Font Awesome re-process.\n if (upBtn) {\n var upClass = userRating === true ? 'fa-solid fa-thumbs-up' : 'fa-regular fa-thumbs-up';\n var upIcon = document.createElement('i');\n upIcon.className = upClass;\n upIcon.style.fontSize = '0.9rem';\n upBtn.textContent = '';\n upBtn.appendChild(upIcon);\n }\n\n if (downBtn) {\n var downClass = userRating === false ? 'fa-solid fa-thumbs-down' : 'fa-regular fa-thumbs-down';\n var downIcon = document.createElement('i');\n downIcon.className = downClass;\n downIcon.style.fontSize = '0.9rem';\n downBtn.textContent = '';\n downBtn.appendChild(downIcon);\n }\n\n // Trigger Font Awesome SVG+JS to convert the new elements.\n if (window.FontAwesome && FontAwesome.dom && FontAwesome.dom.i2svg) {\n FontAwesome.dom.i2svg({ node: container });\n }\n },\n refreshAllFeedbackIcons() {\n var containers = this.$el.querySelectorAll('.ai-chat-message-assistant-feedback');\n\n for (var i = 0; i < containers.length; i++) {\n var msgId = containers[i].getAttribute('data-message-id');\n var msg = this.messages.find(m => m.id === msgId);\n\n if (msg) {\n this.updateFeedbackIcons(containers[i], msg.userRating);\n }\n }\n },\n rateMessage(message, isPositive, event) {\n var sessionId = this.getSessionId();\n\n if (!sessionId || !message.id || !this.connection) {\n return;\n }\n\n // Toggle: clicking the same rating again clears it.\n var newRating = message.userRating === isPositive ? null : isPositive;\n message.userRating = newRating;\n\n // Find the feedback container by message ID for reliable DOM targeting.\n var feedbackContainer = this.$el.querySelector(\n '.ai-chat-message-assistant-feedback[data-message-id=\"' + message.id + '\"]'\n );\n\n this.updateFeedbackIcons(feedbackContainer, newRating);\n\n // Trigger spark animation after Font Awesome has re-processed icons.\n if (newRating !== null && feedbackContainer) {\n setTimeout(() => {\n var btnClass = isPositive ? '.rate-up-btn' : '.rate-down-btn';\n var btn = feedbackContainer.querySelector(btnClass);\n\n if (btn) {\n btn.classList.remove('spark-effect');\n void btn.offsetWidth;\n btn.classList.add('spark-effect');\n btn.addEventListener('animationend', function onEnd() {\n btn.removeEventListener('animationend', onEnd);\n btn.classList.remove('spark-effect');\n });\n }\n }, 50);\n }\n\n this.connection.invoke(\"RateMessage\", sessionId, message.id, isPositive).catch(function (err) {\n console.error('Failed to rate message:', err);\n });\n }\n },\n watch: {\n documents: {\n handler() { this.renderDocumentBar(); },\n deep: true\n },\n isUploading() { this.renderDocumentBar(); },\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n // Hide/show mic button.\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n // Hide/show send button.\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n // Disable/enable textarea.\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n if (hasWidgetConfig) {\n this.initializeWidget();\n }\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n\n this.stopAudio(false);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n return {\n initialize: initialize\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.min.js.map b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.min.js.map index 1a896afc..8e3bea17 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.min.js.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/ai-chat.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["ai-chat.js"],"names":["_regenerator","e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","this","setPrototypeOf","__proto__","displayName","w","m","defineProperty","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","from","_arrayLikeToArray","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","push","_typeof","window","openAIChatManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","userLabel","assistantLabel","thumbsUpTitle","thumbsDownTitle","copyTitle","codeCopiedText","widget","chatWidgetContainer","chatWidgetStateName","chatHistorySection","showHistoryButton","closeHistoryButton","newChatButton","toggleButtonSelector","resetSizeButtonSelector","dragHandleSelector","enableDragging","enableResizing","persistLayout","defaultWidth","defaultHeight","minWidth","minHeight","messageTemplate","indicatorTemplate","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","parsePixelValue","Number","isFinite","parsed","parseFloat","clamp","min","max","Math","normalizeReference","reference","_ref","_normalized$index","_ref2","_normalized$text","_ref3","_normalized$link","normalized","assign","index","Index","Text","link","Link","normalizeReferences","references","_i","_Object$entries","entries","_normalizeReference","_Object$entries$_i","key","renderer","marked","Renderer","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","renderChartsInMessage","message","charts","requestAnimationFrame","_step","_iterator","renderChartOnCanvas","chartId","config","err","canvas","getElementById","Chart","console","warn","offsetParent","__chartConfigs","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","token","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","startIndex","endIndex","json","substring","tryExtractChartMarker","type","raw","renderPendingCharts","configs","_i2","_Object$keys","keys","initialize","instanceConfig","hasWidgetConfig","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isSessionStarted","isPlaceholderVisible","chatWidgetStateSession","chatWidgetLayoutKey","widgetContainerElement","widgetToggleButtonElement","widgetResetSizeButtonElement","widgetResizeObserver","widgetViewportResizeHandler","widgetDefaultWidth","widgetDefaultHeight","widgetIsInitialized","isStreaming","isNavigatingAway","autoScroll","stream","messages","notifications","prompt","documents","existingDocuments","isUploading","uploadErrors","isDragOver","documentBar","metricsEnabled","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsButton","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","random","singleResponseMode","conversationModeEnabled","conversationButton","isConversationMode","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","getStoredWidgetLayout","storedLayout","localStorage","getItem","saveStoredWidgetLayout","partialLayout","currentLayout","nextLayout","panel","toggle","setItem","stringify","getElementSize","element","fallbackWidth","fallbackHeight","width","height","rect","getBoundingClientRect","getComputedStyle","round","clampWidgetPosition","left","top","maxLeft","innerWidth","maxTop","innerHeight","applyAbsolutePosition","style","right","bottom","getWidgetDefaultSize","persistWidgetPanelPosition","panelRect","persistWidgetTogglePosition","toggleRect","persistWidgetPanelSize","defaultSize","currentSize","abs","updateWidgetResetSizeButtonVisibility","isResized","classList","add","resetWidgetSize","removeProperty","constrainWidgetElementsToViewport","restoreWidgetLayout","attachDraggableWidgetElement","handle","layoutKey","suppressClickOnDrag","_this","activePointerId","startX","startY","startLeft","startTop","dragged","stopDragging","event","pointerId","removeEventListener","onPointerMove","remove","dataset","dragSuppressClick","setTimeout","deltaX","clientX","deltaY","clientY","hypot","nextPosition","addEventListener","button","target","closest","setPointerCapture","preventDefault","panelDefaultSize","panelSize","clampedPanel","toggleSize","clampedToggle","handleDragOver","sessionDocumentsEnabled","stopPropagation","inputArea","handleDragLeave","handleDrop","dataTransfer","files","uploadFiles","triggerFileInput","fileInput","click","handleFileInputChange","_this2","_callee","sessionId","profileId","formData","response","errorText","uploadError","result","j","_t","_context","uploadDocumentUrl","getSessionId","getProfileId","renderDocumentBar","FormData","append","fetch","method","body","ok","extractReadableErrorMessage","fileName","initializeSession","uploaded","failed","removeDocument","doc","_this3","_callee2","removeError","_t2","_context2","removeDocumentUrl","headers","itemId","documentId","splice","status","formatFileSize","bytes","toFixed","escapeHtml","failedItem","failedName","errorMsg","supportedExtensionsText","replaceChildren","RETURN_DOM_FRAGMENT","self","closeButtons","querySelectorAll","docToRemove","parseInt","getAttribute","errorCloseButtons","addBtn","querySelector","div","fallbackMessage","startsWith","title","detail","normalizeAssistantAppearance","appearance","label","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","startConnection","_this4","_callee3","_t3","_context3","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","forEach","msg","addMessage","$nextTick","refreshAllFeedbackIcons","initialPrompt","sendMessage","stopRecording","_attemptedSessionRecovery","removeItem","startNewSession","messageId","userRating","find","id","isFinal","_conversationPartialTranscript","replace","_conversationPartialMessage","htmlContent","hidePlaceholder","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","escaped","responseId","hideTypingIndicator","msgIndex","newMessage","base64Audio","contentType","binaryString","atob","Uint8Array","charCodeAt","playCollectedAudio","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentSession","autoCreateSession","onclose","addMessageInternal","_this5","fireEvent","CustomEvent","_this6","processedContent","citedRefs","filter","_ref4","includes","sort","_ref6","_ref7","b","_step2","displayIndex","_iterator2","_step2$value","replaceAll","_displayIndex","_placeholder","_step3","_iterator3","_step4","_iterator4","_step4$value","addMessages","_this7","showPlaceholder","isOrchestratorAvailable","applyOrchestratorAvailability","unavailableMessage","orchestratorUnavailableMessage","disabled","micButtonElement","display","conversationButtonElement","isIndicator","trimmedPrompt","streamMessage","startRecording","_this8","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","subject","Subject","pendingChunk","size","_callee4","uint8Array","base64","_context4","arrayBuffer","reduce","str","byte","String","fromCharCode","btoa","getTracks","track","stop","complete","documentElement","send","updateMicButton","toggleRecording","sessionProfileId","_this9","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentSessionId","subscribe","chunk","_i3","_Object$entries2","_normalizeReference2","_Object$entries2$_i","_i4","_Object$entries3","_Object$entries3$_i","_this9$stream","processReferences","streamingFinished","synthesizeSpeech","_this9$stream2","getServiceDownMessage","_this0","_ref1","_ref10","_ref11","_ref12","_step5","processed","_iterator5","_step5$value","_step6","_iterator6","_step7","_iterator7","_step7$value","stopIcon","setAttribute","startIcon","removeAttribute","focus","icons","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this1","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","_step8","totalLength","sum","combined","offset","_iterator8","set","blob","Blob","_this10","URL","createObjectURL","Audio","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this11","updateConversationButton","_conversationSubject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","createMediaStreamSource","connect","analyser","freqData","frequencyBinCount","getByteFrequencyData","k","_callee5","_context5","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","generatePrompt","templateProfileId","createSessionUrl","baseUrl","param","fullUrl","toLowerCase","location","origin","searchParams","originalLength","_this12","clearNotificationDismiss","existingIndex","findIndex","scheduleNotificationDismiss","_this13","timerId","clearTimeout","dismissNotification","handleNotificationAction","actionName","_this14","scrollTop","scrollHeight","clientHeight","handleUserInput","setSessionId","resetSession","sessionRating","initializeApp","_this15","placeholderElementSelector","loadSession","documentBarSelector","className","multiple","allowedExtensions","accept","parentElement","appendChild","atBottom","shiftKey","lastMsg","pop","promptGenerators","getElementsByClassName","chatSessions","showChatScreen","btn","block","codeEl","clipboard","writeText","copiedText","micButtonElementSelector","conversationButtonElementSelector","force","initializeWidget","_this16","ResizeObserver","observe","dragHandle","copyResponse","updateFeedbackIcons","container","upBtn","downBtn","upClass","upIcon","fontSize","downClass","downIcon","FontAwesome","dom","i2svg","node","containers","$el","msgId","rateMessage","isPositive","newRating","feedbackContainer","btnClass","offsetWidth","onEnd","watch","handler","deep","active","mounted","_this17","_callee6","_context6","beforeUnmount","template","mount","download","toDataURL","img","res","removeChild"],"mappings":"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","file":"ai-chat.min.js","sourcesContent":["window.openAIChatManager = function () {\r\n\r\n // Defaults (can be overridden by instanceConfig)\r\n var defaultConfig = {\r\n // UI defaults for generated media\r\n generatedImageAltText: 'Generated Image',\r\n generatedImageMaxWidth: 400,\r\n downloadImageTitle: 'Download image',\r\n downloadChartTitle: 'Download chart as image',\r\n downloadChartButtonText: 'Download',\r\n userLabel: 'You',\r\n assistantLabel: 'Assistant',\r\n thumbsUpTitle: 'Thumbs up',\r\n thumbsDownTitle: 'Thumbs down',\r\n copyTitle: 'Click here to copy response to clipboard.',\r\n codeCopiedText: 'Copied!',\r\n widget: {\r\n chatWidgetContainer: null,\r\n chatWidgetStateName: null,\r\n chatHistorySection: null,\r\n showHistoryButton: null,\r\n closeHistoryButton: null,\r\n newChatButton: null,\r\n toggleButtonSelector: null,\r\n resetSizeButtonSelector: null,\r\n dragHandleSelector: '.ai-chat-widget-header',\r\n enableDragging: true,\r\n enableResizing: true,\r\n persistLayout: true,\r\n defaultWidth: null,\r\n defaultHeight: null,\r\n minWidth: 320,\r\n minHeight: 420\r\n },\r\n messageTemplate: `\r\n
\r\n
\r\n
\r\n
{{ userLabel }}
\r\n
\r\n \r\n {{ getAssistantLabel(message) }}\r\n
\r\n
\r\n

{{ message.title }}

\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{ notification.content }}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n `,\r\n indicatorTemplate: `\r\n
\r\n \r\n Assistant\r\n
\r\n `\r\n };\r\n\r\n // Sanitize URLs to prevent javascript: protocol injection.\r\n function sanitizeUrl(url) {\r\n if (!url) return '';\r\n var trimmed = url.trim();\r\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\r\n return '';\r\n }\r\n return url;\r\n }\r\n\r\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\r\n function escapeHtmlEntities(text) {\r\n var span = document.createElement('span');\r\n span.textContent = text;\r\n return span.innerHTML;\r\n }\r\n\r\n function parsePixelValue(value) {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n var parsed = parseFloat(value);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n }\r\n\r\n function clamp(value, min, max) {\r\n return Math.min(Math.max(value, min), max);\r\n }\r\n\r\n function normalizeReference(reference) {\r\n if (!reference || typeof reference !== 'object') {\r\n return null;\r\n }\r\n\r\n const normalized = Object.assign({}, reference);\r\n normalized.index = normalized.index ?? normalized.Index ?? 0;\r\n normalized.text = normalized.text ?? normalized.Text ?? null;\r\n normalized.link = normalized.link ?? normalized.Link ?? null;\r\n\r\n return normalized;\r\n }\r\n\r\n function normalizeReferences(references) {\r\n if (!references || typeof references !== 'object') {\r\n return {};\r\n }\r\n\r\n const normalized = {};\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n normalized[key] = normalizeReference(value) ?? {};\r\n }\r\n\r\n return normalized;\r\n }\r\n\r\n const renderer = new marked.Renderer();\r\n\r\n // Modify the link rendering to open in a new tab\r\n renderer.link = function (data) {\r\n var href = sanitizeUrl(data.href);\r\n if (!href) return data.text || '';\r\n return `
${data.text}`;\r\n };\r\n\r\n // Custom code block renderer with highlight.js integration and copy button.\r\n renderer.code = function (data) {\r\n var code = data.text || '';\r\n var lang = (data.lang || '').trim();\r\n var highlighted = code;\r\n\r\n if (typeof hljs !== 'undefined') {\r\n if (lang && hljs.getLanguage(lang)) {\r\n try {\r\n highlighted = hljs.highlight(code, { language: lang }).value;\r\n } catch (_) { }\r\n } else {\r\n try {\r\n highlighted = hljs.highlightAuto(code).value;\r\n } catch (_) { }\r\n }\r\n } else {\r\n highlighted = escapeHtmlEntities(code);\r\n }\r\n\r\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\r\n return `
${langDisplay}
${highlighted}
`;\r\n };\r\n\r\n // Custom image renderer for generated images with thumbnail styling and download button.\r\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\r\n renderer.image = function (data) {\r\n const src = sanitizeUrl(data.href);\r\n if (!src) return '';\r\n const alt = data.text || defaultConfig.generatedImageAltText;\r\n const maxWidth = defaultConfig.generatedImageMaxWidth;\r\n return `
\r\n \"${alt}\"\r\n
\r\n \r\n \r\n \r\n
\r\n
`;\r\n };\r\n\r\n // Chart counter for unique IDs\r\n let chartCounter = 0;\r\n\r\n // Collector for charts discovered during marked parsing.\r\n let _pendingCharts = [];\r\n\r\n // Global chart config map: any page (e.g., Chat Interactions) that uses\r\n // the shared marked instance can call window.renderPendingCharts() after\r\n // its DOM update to render charts it didn't create itself.\r\n window.__chartConfigs = window.__chartConfigs || {};\r\n\r\n function createChartHtml(chartId) {\r\n return `
`\r\n + ``\r\n + `
`\r\n + `
`\r\n + ``\r\n + `
`;\r\n }\r\n\r\n // Register [chart:{...json...}] as a native marked block extension so the\r\n // markdown parser handles chart markers inline with surrounding text.\r\n marked.use({\r\n extensions: [{\r\n name: 'chart',\r\n level: 'block',\r\n start(src) {\r\n const idx = src.indexOf('[chart:');\r\n return idx >= 0 ? idx : undefined;\r\n },\r\n tokenizer(src) {\r\n const extracted = tryExtractChartMarker(src);\r\n if (!extracted || extracted.startIndex !== 0) {\r\n return undefined;\r\n }\r\n\r\n const chartId = `chat_chart_${++chartCounter}`;\r\n\r\n return {\r\n type: 'chart',\r\n raw: src.substring(0, extracted.endIndex),\r\n chartId: chartId,\r\n json: extracted.json,\r\n };\r\n },\r\n renderer(token) {\r\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\r\n window.__chartConfigs[token.chartId] = token.json;\r\n return createChartHtml(token.chartId);\r\n }\r\n }]\r\n });\r\n\r\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\r\n function tryExtractChartMarker(text) {\r\n const token = '[chart:';\r\n const start = text.indexOf(token);\r\n if (start < 0) {\r\n return null;\r\n }\r\n\r\n // Find JSON object boundary by balancing braces\r\n const jsonStart = start + token.length;\r\n let i = jsonStart;\r\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\r\n i++;\r\n }\r\n\r\n if (i >= text.length || text[i] !== '{') {\r\n return null;\r\n }\r\n\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n\r\n for (; i < text.length; i++) {\r\n const ch = text[i];\r\n\r\n if (inString) {\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n if (ch === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n inString = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n depth++;\r\n } else if (ch === '}') {\r\n depth--;\r\n if (depth === 0) {\r\n const jsonEnd = i;\r\n // Expect closing bracket after JSON\r\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\r\n if (closeBracketIndex < 0) {\r\n return null;\r\n }\r\n\r\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\r\n return {\r\n startIndex: start,\r\n endIndex: closeBracketIndex + 1,\r\n json: json\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function renderChartsInMessage(message) {\r\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\r\n return;\r\n }\r\n\r\n // Copy and clear pending charts immediately to prevent duplicate renders.\r\n const charts = [...message._pendingCharts];\r\n message._pendingCharts = [];\r\n\r\n // Defer to requestAnimationFrame so the browser has fully laid out the\r\n // canvas elements before Chart.js reads their dimensions.\r\n requestAnimationFrame(() => {\r\n for (const c of charts) {\r\n renderChartOnCanvas(c.chartId, c.config);\r\n }\r\n });\r\n }\r\n\r\n function renderChartOnCanvas(chartId, config) {\r\n const canvas = document.getElementById(chartId);\r\n if (!canvas) {\r\n return false;\r\n }\r\n\r\n if (typeof Chart === 'undefined') {\r\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\r\n return false;\r\n }\r\n\r\n // When the canvas is inside a hidden container (e.g., a widget panel with\r\n // display:none), it has zero dimensions and Chart.js cannot render correctly.\r\n // Keep the config in __chartConfigs so renderPendingCharts() can retry later\r\n // once the container becomes visible.\r\n if (canvas.offsetParent === null) {\r\n window.__chartConfigs[chartId] = config;\r\n return false;\r\n }\r\n\r\n try {\r\n if (canvas._chartInstance) {\r\n canvas._chartInstance.destroy();\r\n }\r\n\r\n const cfg = typeof config === 'string' ? JSON.parse(config) : config;\r\n cfg.options ??= {};\r\n cfg.options.responsive = true;\r\n cfg.options.maintainAspectRatio = true;\r\n cfg.options.aspectRatio ??= 4 / 3;\r\n\r\n canvas._chartInstance = new Chart(canvas, cfg);\r\n delete window.__chartConfigs[chartId];\r\n return true;\r\n } catch (e) {\r\n console.error('Error creating chart:', e);\r\n return false;\r\n }\r\n }\r\n\r\n // Global function: renders any chart canvases whose configs are in the\r\n // global __chartConfigs map. Called by pages (e.g., Chat Interactions)\r\n // that share the marked instance but have their own rendering pipeline.\r\n window.renderPendingCharts = function () {\r\n if (typeof Chart === 'undefined') {\r\n return;\r\n }\r\n\r\n const configs = window.__chartConfigs;\r\n if (!configs) {\r\n return;\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n for (const chartId of Object.keys(configs)) {\r\n renderChartOnCanvas(chartId, configs[chartId]);\r\n }\r\n });\r\n };\r\n\r\n // Parse markdown content via marked (which natively handles [chart:...] markers\r\n // through the registered extension) and collect pending chart configs for later\r\n // Chart.js rendering.\r\n function parseMarkdownContent(content, message) {\r\n _pendingCharts = [];\r\n const html = marked.parse(content, { renderer });\r\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\r\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\r\n }\r\n\r\n const initialize = (instanceConfig) => {\r\n\r\n const config = Object.assign({}, defaultConfig, instanceConfig);\r\n config.widget = Object.assign({}, defaultConfig.widget || {}, instanceConfig && instanceConfig.widget ? instanceConfig.widget : {});\r\n const hasWidgetConfig = !!(instanceConfig && instanceConfig.widget && instanceConfig.widget.chatWidgetContainer && instanceConfig.widget.chatWidgetStateName);\r\n // Keep defaultConfig in sync so renderers use overridden values\r\n defaultConfig = config;\r\n\r\n if (!config.signalRHubUrl) {\r\n console.error('The signalRHubUrl is required.');\r\n return;\r\n }\r\n\r\n if (!config.appElementSelector) {\r\n console.error('The appElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.chatContainerElementSelector) {\r\n console.error('The chatContainerElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.inputElementSelector) {\r\n console.error('The inputElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.sendButtonElementSelector) {\r\n console.error('The sendButtonElementSelector is required.');\r\n return;\r\n }\r\n\r\n const app = Vue.createApp({\r\n data() {\r\n return {\r\n inputElement: null,\r\n buttonElement: null,\r\n chatContainer: null,\r\n placeholder: null,\r\n isSessionStarted: false,\r\n isPlaceholderVisible: true,\r\n chatWidgetStateName: null,\r\n chatWidgetStateSession: null,\r\n chatWidgetLayoutKey: null,\r\n chatHistorySection: null,\r\n widgetContainerElement: null,\r\n widgetToggleButtonElement: null,\r\n widgetResetSizeButtonElement: null,\r\n widgetResizeObserver: null,\r\n widgetViewportResizeHandler: null,\r\n widgetDefaultWidth: null,\r\n widgetDefaultHeight: null,\r\n widgetIsInitialized: false,\r\n isStreaming: false,\r\n isNavigatingAway: false,\r\n autoScroll: true,\r\n stream: null,\r\n messages: [],\r\n notifications: [],\r\n prompt: '',\r\n documents: config.existingDocuments || [],\r\n isUploading: false,\r\n uploadErrors: [],\r\n isDragOver: false,\r\n documentBar: null,\r\n metricsEnabled: !!config.metricsEnabled,\r\n userLabel: config.userLabel,\r\n assistantLabel: config.assistantLabel,\r\n thumbsUpTitle: config.thumbsUpTitle,\r\n thumbsDownTitle: config.thumbsDownTitle,\r\n copyTitle: config.copyTitle,\r\n isRecording: false,\r\n mediaRecorder: null,\r\n preRecordingPrompt: '',\r\n micButton: null,\r\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\r\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\r\n ttsVoiceName: config.ttsVoiceName || null,\r\n audioChunks: [],\r\n audioPlayQueue: [],\r\n isPlayingAudio: false,\r\n currentAudioElement: null,\r\n currentAudioUrl: null,\r\n ttsButton: null,\r\n ttsPlayingMessageIndex: -1,\r\n ttsAudioCache: {},\r\n ttsInstanceId: 'ai-chat-' + Math.random().toString(36).slice(2),\r\n singleResponseMode: !!config.singleResponseMode,\r\n conversationModeEnabled: config.chatMode === 'Conversation',\r\n conversationButton: null,\r\n isConversationMode: false,\r\n notificationDismissTimers: {},\r\n };\r\n },\r\n computed: {\r\n lastAssistantIndex() {\r\n for (var i = this.messages.length - 1; i >= 0; i--) {\r\n if (this.messages[i].role === 'assistant') {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n },\r\n methods: {\r\n handleBeforeUnload() {\r\n this.isNavigatingAway = true;\r\n },\r\n getStoredWidgetLayout() {\r\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\r\n return {};\r\n }\r\n\r\n try {\r\n var storedLayout = localStorage.getItem(this.chatWidgetLayoutKey);\r\n return storedLayout ? JSON.parse(storedLayout) || {} : {};\r\n } catch (error) {\r\n console.warn('Failed to read widget layout state.', error);\r\n return {};\r\n }\r\n },\r\n saveStoredWidgetLayout(partialLayout) {\r\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var currentLayout = this.getStoredWidgetLayout();\r\n var nextLayout = Object.assign({}, currentLayout);\r\n\r\n if (partialLayout.panel !== undefined) {\r\n nextLayout.panel = Object.assign({}, currentLayout.panel || {}, partialLayout.panel || {});\r\n }\r\n\r\n if (partialLayout.toggle !== undefined) {\r\n nextLayout.toggle = Object.assign({}, currentLayout.toggle || {}, partialLayout.toggle || {});\r\n }\r\n\r\n localStorage.setItem(this.chatWidgetLayoutKey, JSON.stringify(nextLayout));\r\n },\r\n getElementSize(element, fallbackWidth, fallbackHeight) {\r\n if (!element) {\r\n return {\r\n width: fallbackWidth || 0,\r\n height: fallbackHeight || 0\r\n };\r\n }\r\n\r\n var rect = element.getBoundingClientRect();\r\n var computed = window.getComputedStyle(element);\r\n\r\n return {\r\n width: Math.round(rect.width || parsePixelValue(computed.width) || fallbackWidth || 0),\r\n height: Math.round(rect.height || parsePixelValue(computed.height) || fallbackHeight || 0)\r\n };\r\n },\r\n clampWidgetPosition(left, top, width, height) {\r\n var viewportPadding = 8;\r\n var maxLeft = Math.max(viewportPadding, window.innerWidth - width - viewportPadding);\r\n var maxTop = Math.max(viewportPadding, window.innerHeight - height - viewportPadding);\r\n\r\n return {\r\n left: Math.round(clamp(left, viewportPadding, maxLeft)),\r\n top: Math.round(clamp(top, viewportPadding, maxTop))\r\n };\r\n },\r\n applyAbsolutePosition(element, left, top) {\r\n if (!element) {\r\n return;\r\n }\r\n\r\n element.style.left = left + 'px';\r\n element.style.top = top + 'px';\r\n element.style.right = 'auto';\r\n element.style.bottom = 'auto';\r\n },\r\n getWidgetDefaultSize() {\r\n return {\r\n width: this.widgetDefaultWidth || parsePixelValue(config.widget.defaultWidth) || 380,\r\n height: this.widgetDefaultHeight || parsePixelValue(config.widget.defaultHeight) || 520\r\n };\r\n },\r\n persistWidgetPanelPosition() {\r\n if (!this.widgetContainerElement || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\r\n this.saveStoredWidgetLayout({\r\n panel: {\r\n left: Math.round(panelRect.left),\r\n top: Math.round(panelRect.top)\r\n }\r\n });\r\n },\r\n persistWidgetTogglePosition() {\r\n if (!this.widgetToggleButtonElement || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\r\n this.saveStoredWidgetLayout({\r\n toggle: {\r\n left: Math.round(toggleRect.left),\r\n top: Math.round(toggleRect.top)\r\n }\r\n });\r\n },\r\n persistWidgetPanelSize() {\r\n if (!this.widgetContainerElement || !config.widget.enableResizing || !config.widget.persistLayout) {\r\n return;\r\n }\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\r\n\r\n this.saveStoredWidgetLayout({\r\n panel: {\r\n width: Math.abs(currentSize.width - defaultSize.width) <= 1 ? null : currentSize.width,\r\n height: Math.abs(currentSize.height - defaultSize.height) <= 1 ? null : currentSize.height\r\n }\r\n });\r\n },\r\n updateWidgetResetSizeButtonVisibility() {\r\n if (!this.widgetResetSizeButtonElement) {\r\n return;\r\n }\r\n\r\n if (!config.widget.enableResizing || !this.widgetContainerElement) {\r\n this.widgetResetSizeButtonElement.classList.add('d-none');\r\n return;\r\n }\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\r\n var isResized =\r\n Math.abs(currentSize.width - defaultSize.width) > 1 ||\r\n Math.abs(currentSize.height - defaultSize.height) > 1 ||\r\n !!this.widgetContainerElement.style.width ||\r\n !!this.widgetContainerElement.style.height;\r\n\r\n this.widgetResetSizeButtonElement.classList.toggle('d-none', !isResized);\r\n },\r\n resetWidgetSize() {\r\n if (!this.widgetContainerElement || !config.widget.enableResizing) {\r\n return;\r\n }\r\n\r\n this.widgetContainerElement.style.removeProperty('width');\r\n this.widgetContainerElement.style.removeProperty('height');\r\n this.persistWidgetPanelSize();\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n },\r\n restoreWidgetLayout() {\r\n var storedLayout = this.getStoredWidgetLayout();\r\n\r\n if (this.widgetContainerElement && config.widget.enableResizing) {\r\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.width)) {\r\n this.widgetContainerElement.style.width = storedLayout.panel.width + 'px';\r\n } else {\r\n this.widgetContainerElement.style.removeProperty('width');\r\n }\r\n\r\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.height)) {\r\n this.widgetContainerElement.style.height = storedLayout.panel.height + 'px';\r\n } else {\r\n this.widgetContainerElement.style.removeProperty('height');\r\n }\r\n }\r\n\r\n if (this.widgetContainerElement && config.widget.enableDragging &&\r\n Number.isFinite(storedLayout.panel && storedLayout.panel.left) &&\r\n Number.isFinite(storedLayout.panel && storedLayout.panel.top)) {\r\n this.applyAbsolutePosition(this.widgetContainerElement, storedLayout.panel.left, storedLayout.panel.top);\r\n }\r\n\r\n if (this.widgetToggleButtonElement && config.widget.enableDragging &&\r\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.left) &&\r\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.top)) {\r\n this.applyAbsolutePosition(this.widgetToggleButtonElement, storedLayout.toggle.left, storedLayout.toggle.top);\r\n }\r\n\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n },\r\n attachDraggableWidgetElement(element, handle, layoutKey, suppressClickOnDrag) {\r\n if (!element || !handle || !config.widget.enableDragging) {\r\n return;\r\n }\r\n\r\n var activePointerId = null;\r\n var startX = 0;\r\n var startY = 0;\r\n var startLeft = 0;\r\n var startTop = 0;\r\n var dragged = false;\r\n var dragThreshold = 4;\r\n var interactiveSelector = 'button, a, input, textarea, select, option, label';\r\n\r\n var stopDragging = (event) => {\r\n if (activePointerId === null) {\r\n return;\r\n }\r\n\r\n if (event && event.pointerId !== undefined && event.pointerId !== activePointerId) {\r\n return;\r\n }\r\n\r\n document.removeEventListener('pointermove', onPointerMove);\r\n document.removeEventListener('pointerup', stopDragging);\r\n document.removeEventListener('pointercancel', stopDragging);\r\n element.classList.remove('ai-chat-widget-dragging');\r\n activePointerId = null;\r\n\r\n if (!dragged) {\r\n return;\r\n }\r\n\r\n if (layoutKey === 'panel') {\r\n this.persistWidgetPanelPosition();\r\n } else if (layoutKey === 'toggle') {\r\n this.persistWidgetTogglePosition();\r\n }\r\n\r\n if (suppressClickOnDrag) {\r\n element.dataset.dragSuppressClick = 'true';\r\n window.setTimeout(() => {\r\n if (element.dataset.dragSuppressClick === 'true') {\r\n element.dataset.dragSuppressClick = 'false';\r\n }\r\n }, 0);\r\n }\r\n };\r\n\r\n var onPointerMove = (event) => {\r\n if (activePointerId === null || event.pointerId !== activePointerId) {\r\n return;\r\n }\r\n\r\n var deltaX = event.clientX - startX;\r\n var deltaY = event.clientY - startY;\r\n\r\n if (!dragged && Math.hypot(deltaX, deltaY) < dragThreshold) {\r\n return;\r\n }\r\n\r\n dragged = true;\r\n\r\n var defaultSize = this.getWidgetDefaultSize();\r\n var currentSize = this.getElementSize(\r\n element,\r\n layoutKey === 'panel' ? defaultSize.width : 52,\r\n layoutKey === 'panel' ? defaultSize.height : 52);\r\n var nextPosition = this.clampWidgetPosition(\r\n startLeft + deltaX,\r\n startTop + deltaY,\r\n currentSize.width,\r\n currentSize.height);\r\n\r\n this.applyAbsolutePosition(element, nextPosition.left, nextPosition.top);\r\n };\r\n\r\n handle.addEventListener('pointerdown', (event) => {\r\n if (event.button !== 0) {\r\n return;\r\n }\r\n\r\n if (layoutKey === 'panel' && event.target.closest(interactiveSelector)) {\r\n return;\r\n }\r\n\r\n var rect = element.getBoundingClientRect();\r\n startX = event.clientX;\r\n startY = event.clientY;\r\n startLeft = rect.left;\r\n startTop = rect.top;\r\n dragged = false;\r\n activePointerId = event.pointerId;\r\n element.classList.add('ai-chat-widget-dragging');\r\n\r\n if (handle.setPointerCapture) {\r\n handle.setPointerCapture(event.pointerId);\r\n }\r\n\r\n document.addEventListener('pointermove', onPointerMove);\r\n document.addEventListener('pointerup', stopDragging);\r\n document.addEventListener('pointercancel', stopDragging);\r\n event.preventDefault();\r\n });\r\n },\r\n constrainWidgetElementsToViewport() {\r\n if (this.widgetContainerElement && this.widgetContainerElement.style.left) {\r\n var panelDefaultSize = this.getWidgetDefaultSize();\r\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\r\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\r\n var clampedPanel = this.clampWidgetPosition(panelRect.left, panelRect.top, panelSize.width, panelSize.height);\r\n\r\n this.applyAbsolutePosition(this.widgetContainerElement, clampedPanel.left, clampedPanel.top);\r\n\r\n if (config.widget.persistLayout) {\r\n this.persistWidgetPanelPosition();\r\n }\r\n }\r\n\r\n if (this.widgetToggleButtonElement && this.widgetToggleButtonElement.style.left) {\r\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\r\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\r\n var clampedToggle = this.clampWidgetPosition(toggleRect.left, toggleRect.top, toggleSize.width, toggleSize.height);\r\n\r\n this.applyAbsolutePosition(this.widgetToggleButtonElement, clampedToggle.left, clampedToggle.top);\r\n\r\n if (config.widget.persistLayout) {\r\n this.persistWidgetTogglePosition();\r\n }\r\n }\r\n },\r\n handleDragOver(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = true;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.add('ai-chat-drag-over');\r\n },\r\n handleDragLeave(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = false;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\r\n },\r\n handleDrop(e) {\r\n if (!config.sessionDocumentsEnabled) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.isDragOver = false;\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\r\n if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\r\n this.uploadFiles(e.dataTransfer.files);\r\n }\r\n },\r\n triggerFileInput() {\r\n if (!config.sessionDocumentsEnabled) return;\r\n var fileInput = document.getElementById('ai-chat-doc-input');\r\n if (fileInput) fileInput.click();\r\n },\r\n handleFileInputChange(e) {\r\n var files = e.target.files;\r\n if (files && files.length > 0) {\r\n this.uploadFiles(files);\r\n }\r\n e.target.value = '';\r\n },\r\n async uploadFiles(files) {\r\n if (!config.uploadDocumentUrl) return;\r\n\r\n var sessionId = this.getSessionId();\r\n var profileId = this.getProfileId();\r\n\r\n if (!sessionId && !profileId) {\r\n console.warn('Cannot upload documents without a session or profile.');\r\n return;\r\n }\r\n\r\n this.isUploading = true;\r\n this.uploadErrors = [];\r\n this.renderDocumentBar();\r\n try {\r\n var formData = new FormData();\r\n if (sessionId) {\r\n formData.append('sessionId', sessionId);\r\n } else {\r\n formData.append('profileId', profileId);\r\n }\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n\r\n var response = await fetch(config.uploadDocumentUrl, {\r\n method: 'POST',\r\n body: formData\r\n });\r\n\r\n if (!response.ok) {\r\n var errorText = await response.text();\r\n var uploadError = this.extractReadableErrorMessage(errorText, 'Upload failed. Please try again.');\r\n console.error('Upload failed:', errorText);\r\n this.uploadErrors = [{ fileName: '', error: uploadError }];\r\n return;\r\n }\r\n\r\n var result = await response.json();\r\n\r\n // If the server created a new session, initialize it.\r\n if (result.sessionId && !sessionId) {\r\n this.initializeSession(result.sessionId);\r\n }\r\n\r\n if (result.uploaded && result.uploaded.length > 0) {\r\n for (var j = 0; j < result.uploaded.length; j++) {\r\n this.documents.push(result.uploaded[j]);\r\n }\r\n }\r\n if (result.failed && result.failed.length > 0) {\r\n this.uploadErrors = result.failed;\r\n }\r\n } catch (err) {\r\n console.error('Upload error:', err);\r\n this.uploadErrors = [{ fileName: '', error: 'Upload failed. Please try again.' }];\r\n } finally {\r\n this.isUploading = false;\r\n this.renderDocumentBar();\r\n }\r\n },\r\n async removeDocument(doc) {\r\n if (!config.removeDocumentUrl) return;\r\n\r\n try {\r\n var sessionId = this.getSessionId();\r\n var response = await fetch(config.removeDocumentUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ itemId: sessionId, documentId: doc.documentId })\r\n });\r\n\r\n if (response.ok) {\r\n var idx = this.documents.indexOf(doc);\r\n if (idx > -1) this.documents.splice(idx, 1);\r\n } else {\r\n var errorText = await response.text();\r\n var removeError = this.extractReadableErrorMessage(errorText, 'Failed to remove document. Please try again.');\r\n console.error('Failed to remove document:', response.status, errorText);\r\n this.uploadErrors = [{ fileName: doc.fileName || '', error: removeError }];\r\n this.renderDocumentBar();\r\n }\r\n } catch (err) {\r\n console.error('Remove document error:', err);\r\n this.uploadErrors = [{ fileName: doc.fileName || '', error: 'Failed to remove document. Please try again.' }];\r\n this.renderDocumentBar();\r\n }\r\n },\r\n formatFileSize(bytes) {\r\n if (bytes < 1024) return bytes + ' B';\r\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\r\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\r\n },\r\n renderDocumentBar() {\r\n if (!this.documentBar) return;\r\n\r\n if (!config.sessionDocumentsEnabled) {\r\n this.documentBar.classList.add('d-none');\r\n return;\r\n }\r\n\r\n this.documentBar.classList.remove('d-none');\r\n\r\n var html = '
';\r\n html += '
';\r\n\r\n for (var i = 0; i < this.documents.length; i++) {\r\n var doc = this.documents[i];\r\n var name = doc.fileName || 'Document';\r\n if (name.length > 20) name = name.substring(0, 17) + '...';\r\n html += '';\r\n html += ' ';\r\n html += this.escapeHtml(name);\r\n html += ' ';\r\n html += '';\r\n }\r\n\r\n for (var m = 0; m < this.uploadErrors.length; m++) {\r\n var failedItem = this.uploadErrors[m];\r\n var failedName = failedItem.fileName || 'File';\r\n var errorMsg = failedItem.error || 'Upload failed';\r\n if (failedName.length > 15) failedName = failedName.substring(0, 12) + '...';\r\n html += '';\r\n html += ' ';\r\n html += this.escapeHtml(failedName);\r\n html += ' ';\r\n html += '';\r\n }\r\n\r\n if (this.isUploading) {\r\n html += '';\r\n html += ' Uploading...';\r\n html += '';\r\n }\r\n\r\n html += '';\r\n html += '
';\r\n if (config.supportedExtensionsText) {\r\n html += '
Supported formats: ' + this.escapeHtml(config.supportedExtensionsText) + '
';\r\n }\r\n\r\n html += '
';\r\n\r\n this.documentBar.replaceChildren(DOMPurify.sanitize(html, { RETURN_DOM_FRAGMENT: true }));\r\n\r\n // Bind remove handlers\r\n var self = this;\r\n var closeButtons = this.documentBar.querySelectorAll('[data-doc-index]');\r\n for (var j = 0; j < closeButtons.length; j++) {\r\n closeButtons[j].addEventListener('click', (function (idx) {\r\n return function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n var docToRemove = self.documents[idx];\r\n if (docToRemove) self.removeDocument(docToRemove);\r\n };\r\n })(parseInt(closeButtons[j].getAttribute('data-doc-index'))));\r\n }\r\n\r\n // Bind error dismiss handlers\r\n var errorCloseButtons = this.documentBar.querySelectorAll('[data-error-index]');\r\n for (var n = 0; n < errorCloseButtons.length; n++) {\r\n errorCloseButtons[n].addEventListener('click', (function (idx) {\r\n return function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n self.uploadErrors.splice(idx, 1);\r\n self.renderDocumentBar();\r\n };\r\n })(parseInt(errorCloseButtons[n].getAttribute('data-error-index'))));\r\n }\r\n\r\n // Bind add button\r\n var addBtn = this.documentBar.querySelector('.ai-chat-doc-add-btn');\r\n if (addBtn) {\r\n addBtn.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n self.triggerFileInput();\r\n });\r\n }\r\n },\r\n escapeHtml(text) {\r\n var div = document.createElement('div');\r\n div.textContent = text;\r\n return div.innerHTML;\r\n },\r\n extractReadableErrorMessage(errorText, fallbackMessage) {\r\n if (!errorText || typeof errorText !== 'string') {\r\n return fallbackMessage;\r\n }\r\n\r\n var trimmed = errorText.trim();\r\n if (!trimmed) {\r\n return fallbackMessage;\r\n }\r\n\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n try {\r\n var parsed = JSON.parse(trimmed);\r\n var message = parsed?.error || parsed?.message || parsed?.title || parsed?.detail;\r\n return typeof message === 'string' && message.trim()\r\n ? message.trim()\r\n : fallbackMessage;\r\n } catch (err) {\r\n return fallbackMessage;\r\n }\r\n }\r\n\r\n if (/<[^>]+>/.test(trimmed)) {\r\n return fallbackMessage;\r\n }\r\n\r\n return trimmed;\r\n },\r\n normalizeAssistantAppearance(appearance) {\r\n if (!appearance) {\r\n return null;\r\n }\r\n\r\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\r\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\r\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\r\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\r\n\r\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\r\n return null;\r\n }\r\n\r\n return {\r\n label: label,\r\n icon: icon,\r\n cssClass: cssClass,\r\n disableStreamingAnimation: disableStreamingAnimation,\r\n };\r\n },\r\n getAssistantLabel(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.label ? appearance.label : this.assistantLabel;\r\n },\r\n getAssistantRoleClasses(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n var classes = ['ai-chat-msg-role'];\r\n\r\n if (appearance && appearance.cssClass) {\r\n classes.push(appearance.cssClass);\r\n } else {\r\n classes.push('ai-chat-msg-role-assistant');\r\n }\r\n\r\n return classes;\r\n },\r\n getAssistantIconClasses(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\r\n },\r\n getAssistantIcon(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\r\n },\r\n shouldAnimateAssistantIcon(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return !!message &&\r\n message.isStreaming &&\r\n index === this.lastAssistantIndex &&\r\n !(appearance && appearance.disableStreamingAnimation);\r\n },\r\n async startConnection() {\r\n this.connection = new signalR.HubConnectionBuilder()\r\n .withUrl(config.signalRHubUrl)\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n // Allow long-running operations (e.g., multi-step MCP tool calls)\r\n // without the client disconnecting prematurely.\r\n this.connection.serverTimeoutInMilliseconds = 600000;\r\n this.connection.keepAliveIntervalInMilliseconds = 15000;\r\n\r\n this.connection.on(\"LoadSession\", (data) => {\r\n this.initializeSession(data.sessionId, true);\r\n this.messages = [];\r\n this.documents = data.documents || [];\r\n\r\n (data.messages ?? []).forEach(msg => {\r\n this.addMessage(msg);\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n });\r\n });\r\n\r\n // Update feedback icons in the DOM after all messages have rendered.\r\n this.$nextTick(() => {\r\n this.refreshAllFeedbackIcons();\r\n });\r\n\r\n // When the session is new (no messages) and an initial prompt is configured,\r\n // automatically send it as the first user message to trigger an AI response.\r\n if (this.messages.length === 0 && config.initialPrompt) {\r\n this.prompt = config.initialPrompt;\r\n this.sendMessage();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveError\", (error) => {\r\n console.error(\"SignalR Error: \", error);\r\n\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // If this is a widget with a stale cached session (e.g., profile was deleted),\r\n // clear the cached session and start fresh with the current profile.\r\n if (this.widgetIsInitialized && !this.isSessionStarted && !this._attemptedSessionRecovery) {\r\n this._attemptedSessionRecovery = true;\r\n localStorage.removeItem(this.chatWidgetStateSession);\r\n this.startNewSession();\r\n }\r\n });\r\n\r\n this.connection.on(\"MessageRated\", (messageId, userRating) => {\r\n var msg = this.messages.find(m => m.id === messageId);\r\n if (msg) {\r\n msg.userRating = userRating;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveTranscript\", (sessionId, text, isFinal) => {\r\n if (this.isConversationMode) {\r\n if (!isFinal && text) {\r\n this._conversationPartialTranscript = text;\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n var html = '

' + escaped + '

';\r\n\r\n // Show partial transcript as a live user message.\r\n if (!this._conversationPartialMessage) {\r\n this.hidePlaceholder();\r\n this._conversationPartialMessage = {\r\n role: 'user',\r\n content: text,\r\n htmlContent: html,\r\n isPartial: true\r\n };\r\n this.messages.push(this._conversationPartialMessage);\r\n } else {\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = html;\r\n }\r\n this.scrollToBottom();\r\n }\r\n return;\r\n }\r\n\r\n if (text && !this._audioInputSent) {\r\n this.prompt = this.preRecordingPrompt + text;\r\n if (this.inputElement) {\r\n this.inputElement.value = this.prompt;\r\n this.inputElement.dispatchEvent(new Event('input'));\r\n }\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationUserMessage\", (sessionId, text) => {\r\n if (text) {\r\n this.stopAudio();\r\n\r\n // If there's an interrupted assistant message still streaming,\r\n // mark it as done to stop the spinner animation.\r\n if (this._conversationAssistantMessage) {\r\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\r\n if (oldMsg) {\r\n oldMsg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Replace the partial transcript message with the final one.\r\n if (this._conversationPartialMessage) {\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\r\n this._conversationPartialMessage.isPartial = false;\r\n this._conversationPartialMessage = null;\r\n } else {\r\n this.addMessage({\r\n role: 'user',\r\n content: text\r\n });\r\n }\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantToken\", (sessionId, messageId, token, responseId, appearance) => {\r\n if (!this._conversationAssistantMessage) {\r\n this.stopAudio();\r\n this.hideTypingIndicator();\r\n\r\n // Ensure no stale streaming indicators remain from prior messages.\r\n for (var j = 0; j < this.messages.length; j++) {\r\n if (this.messages[j].isStreaming) {\r\n this.messages[j].isStreaming = false;\r\n }\r\n }\r\n\r\n var msgIndex = this.messages.length;\r\n var newMessage = {\r\n id: messageId,\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n userRating: null,\r\n appearance: this.normalizeAssistantAppearance(appearance),\r\n };\r\n this.messages.push(newMessage);\r\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\r\n }\r\n\r\n this._conversationAssistantMessage.content += token;\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n if (!msg.appearance) {\r\n msg.appearance = this.normalizeAssistantAppearance(appearance);\r\n }\r\n msg.content = this._conversationAssistantMessage.content;\r\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n this.scrollToBottom();\r\n });\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantComplete\", (sessionId, messageId) => {\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioChunk\", (sessionId, base64Audio, contentType) => {\r\n if (base64Audio) {\r\n const binaryString = atob(base64Audio);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n this.audioChunks.push(bytes);\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioComplete\", (sessionId) => {\r\n this.playCollectedAudio();\r\n });\r\n\r\n this.connection.on(\"ReceiveNotification\", (notification) => {\r\n this.receiveNotification(notification);\r\n });\r\n\r\n this.connection.on(\"UpdateNotification\", (notification) => {\r\n this.updateNotification(notification);\r\n });\r\n\r\n this.connection.on(\"RemoveNotification\", (notificationType) => {\r\n this.removeNotification(notificationType);\r\n });\r\n\r\n this.connection.onreconnecting(() => {\r\n console.warn(\"SignalR: reconnecting...\");\r\n });\r\n\r\n this.connection.onreconnected(() => {\r\n console.info(\"SignalR: reconnected.\");\r\n\r\n if (this.isSessionStarted) {\r\n this.reloadCurrentSession();\r\n } else if (config.autoCreateSession) {\r\n this.startNewSession();\r\n }\r\n });\r\n\r\n this.connection.onclose((error) => {\r\n if (this.isNavigatingAway) {\r\n return;\r\n }\r\n\r\n if (error) {\r\n console.warn(\"SignalR connection closed with error:\", error.message || error);\r\n }\r\n });\r\n\r\n try {\r\n await this.connection.start();\r\n } catch (err) {\r\n console.error(\"SignalR Connection Error: \", err);\r\n }\r\n },\r\n addMessageInternal(message) {\r\n if (message.role === 'assistant') {\r\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\r\n }\r\n\r\n if (message.content && !message.htmlContent) {\r\n message.htmlContent = parseMarkdownContent(message.content, message);\r\n }\r\n this.fireEvent(new CustomEvent(\"addingOpenAIPromotMessage\", { detail: { message: message } }));\r\n this.messages.push(message);\r\n\r\n this.$nextTick(() => {\r\n this.fireEvent(new CustomEvent(\"addedOpenAIPromotMessage\", { detail: { message: message } }));\r\n });\r\n },\r\n addMessage(message) {\r\n\r\n // Ensure userRating is always defined for Vue reactivity.\r\n if (message.userRating === undefined) {\r\n message.userRating = null;\r\n }\r\n\r\n if (message.content) {\r\n let processedContent = message.content.trim();\r\n message.references = normalizeReferences(message.references);\r\n\r\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\r\n\r\n // Only include references that were actually cited in the response.\r\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\r\n\r\n if (citedRefs.length) {\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders.\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processedContent = processedContent.replaceAll(key, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\r\n processedContent = processedContent.replaceAll('
', ',');\r\n\r\n processedContent += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || key;\r\n processedContent += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n }\r\n }\r\n\r\n message.content = processedContent;\r\n message.htmlContent = parseMarkdownContent(processedContent, message);\r\n }\r\n\r\n this.addMessageInternal(message);\r\n this.hidePlaceholder();\r\n\r\n this.$nextTick(() => {\r\n // Render any pending charts once the DOM is updated\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n addMessages(messages) {\r\n\r\n for (let i = 0; i < messages.length; i++) {\r\n this.addMessageInternal(messages[i]);\r\n }\r\n\r\n this.hidePlaceholder();\r\n this.$nextTick(() => {\r\n this.scrollToBottom();\r\n });\r\n },\r\n hidePlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.add('d-none');\r\n }\r\n this.isPlaceholderVisible = false;\r\n },\r\n showPlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.remove('d-none');\r\n }\r\n this.isPlaceholderVisible = true;\r\n },\r\n isOrchestratorAvailable() {\r\n return config.isOrchestratorAvailable !== false;\r\n },\r\n applyOrchestratorAvailability() {\r\n if (this.isOrchestratorAvailable()) {\r\n return true;\r\n }\r\n\r\n const unavailableMessage = config.orchestratorUnavailableMessage || \"This orchestrator is not currently available.\";\r\n\r\n if (this.inputElement) {\r\n this.inputElement.disabled = true;\r\n this.inputElement.value = '';\r\n this.inputElement.placeholder = unavailableMessage;\r\n }\r\n\r\n if (this.buttonElement) {\r\n this.buttonElement.disabled = true;\r\n }\r\n\r\n if (this.micButtonElement) {\r\n this.micButtonElement.disabled = true;\r\n this.micButtonElement.style.display = 'none';\r\n }\r\n\r\n if (this.conversationButtonElement) {\r\n this.conversationButtonElement.disabled = true;\r\n this.conversationButtonElement.style.display = 'none';\r\n }\r\n\r\n return false;\r\n },\r\n fireEvent(event) {\r\n document.dispatchEvent(event);\r\n },\r\n isIndicator(message) {\r\n return message.role === 'indicator';\r\n },\r\n sendMessage() {\r\n if (!this.applyOrchestratorAvailability()) {\r\n return;\r\n }\r\n\r\n let trimmedPrompt = this.prompt.trim();\r\n\r\n if (!trimmedPrompt) {\r\n return;\r\n }\r\n\r\n // Stop any active recording before sending.\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\r\n this._audioInputSent = true;\r\n\r\n // In single-response mode, clear all previous messages.\r\n if (this.singleResponseMode) {\r\n this.messages.splice(0, this.messages.length);\r\n }\r\n\r\n this.addMessage({\r\n role: 'user',\r\n content: trimmedPrompt\r\n });\r\n\r\n this.streamMessage(this.getProfileId(), trimmedPrompt, null);\r\n this.inputElement.value = '';\r\n this.prompt = '';\r\n },\r\n startRecording() {\r\n if (this.isRecording || !this.connection) {\r\n return;\r\n }\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this.preRecordingPrompt = this.prompt;\r\n this._audioInputSent = false;\r\n\r\n var subject = new signalR.Subject();\r\n var profileId = this.getProfileId();\r\n var sessionId = this.getSessionId() || '';\r\n var pendingChunk = Promise.resolve();\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n subject.next(base64);\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => subject.complete());\r\n });\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"SendAudioStream\", profileId, sessionId, subject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n this.updateMicButton();\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n });\r\n },\r\n stopRecording() {\r\n if (!this.isRecording || !this.mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n this.updateMicButton();\r\n },\r\n toggleRecording() {\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n } else {\r\n this.startRecording();\r\n }\r\n },\r\n updateMicButton() {\r\n if (!this.micButton) {\r\n return;\r\n }\r\n\r\n if (this.isRecording) {\r\n this.micButton.classList.add('stt-recording');\r\n this.micButton.innerHTML = '';\r\n } else {\r\n this.micButton.classList.remove('stt-recording');\r\n this.micButton.innerHTML = '';\r\n }\r\n },\r\n streamMessage(profileId, trimmedPrompt, sessionProfileId) {\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n\r\n this.streamingStarted();\r\n this.showTypingIndicator();\r\n this.autoScroll = true;\r\n\r\n var content = '';\r\n var references = {};\r\n var lastResponseId = null;\r\n\r\n // Get the index after showing typing indicator.\r\n var messageIndex = this.messages.length;\r\n var currentSessionId = this.getSessionId();\r\n\r\n this.stream = this.connection.stream(\"SendMessage\", profileId, trimmedPrompt, currentSessionId, sessionProfileId)\r\n .subscribe({\r\n next: (chunk) => {\r\n let message = this.messages[messageIndex];\r\n\r\n if (!message) {\r\n\r\n if (chunk.sessionId && !currentSessionId) {\r\n this.initializeSession(chunk.sessionId);\r\n }\r\n\r\n this.hideTypingIndicator();\r\n // Re-assign the index after hiding the typing indicator.\r\n messageIndex = this.messages.length;\r\n let newMessage = {\r\n id: chunk.messageId,\r\n role: \"assistant\",\r\n title: chunk.title,\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n userRating: null,\r\n };\r\n\r\n this.messages.push(newMessage);\r\n\r\n message = newMessage;\r\n }\r\n\r\n if (chunk.title && (!message.title || message.title !== chunk.title)) {\r\n message.title = chunk.title;\r\n }\r\n\r\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\r\n\r\n for (const [key, value] of Object.entries(chunk.references)) {\r\n references[key] = normalizeReference(value) ?? {};\r\n }\r\n }\r\n\r\n if (chunk.content) {\r\n\r\n // When the responseId changes (e.g., after an internal tool call),\r\n // insert a line break to visually separate response segments.\r\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\r\n content += '\\n\\n';\r\n }\r\n\r\n if (chunk.responseId) {\r\n lastResponseId = chunk.responseId;\r\n }\r\n\r\n let processedContent = chunk.content;\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n processedContent = processedContent.replaceAll(key, `${value.index}`);\r\n }\r\n\r\n // Append processed content to the message.\r\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\r\n content += processedContent.replaceAll('
', ',');\r\n }\r\n\r\n // Update the existing message\r\n message.content = content;\r\n\r\n message.htmlContent = parseMarkdownContent(content, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n complete: () => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n if (!msg || !msg.content) {\r\n // No content received at all.\r\n this.hideTypingIndicator();\r\n }\r\n\r\n // Trigger text-to-speech only in conversation mode.\r\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\r\n this.synthesizeSpeech(msg.content);\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n },\r\n error: (err) => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n this.hideTypingIndicator();\r\n\r\n if (!this.isNavigatingAway) {\r\n this.addMessage(this.getServiceDownMessage());\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n\r\n console.error(\"Stream error:\", err);\r\n }\r\n });\r\n },\r\n getServiceDownMessage() {\r\n let newMessage = {\r\n role: \"assistant\",\r\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\r\n htmlContent: \"\",\r\n };\r\n\r\n return newMessage;\r\n },\r\n processReferences(references, messageIndex) {\r\n references = normalizeReferences(references);\r\n\r\n if (Object.keys(references).length) {\r\n\r\n let message = this.messages[messageIndex];\r\n const content = message.content || '';\r\n\r\n // Only include references that were actually cited in the response.\r\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\r\n const citedRefs = Object.entries(references).filter(([key, value]) =>\r\n content.includes(key) || content.includes(`${value.index}`)\r\n );\r\n\r\n if (!citedRefs.length) {\r\n return;\r\n }\r\n\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\r\n let processed = content.trim();\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processed = processed.replaceAll(key, placeholder);\r\n processed = processed.replaceAll(`${value.index}`, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processed = processed.replaceAll('', ',');\r\n\r\n processed += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || key;\r\n processed += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n\r\n message.content = processed;\r\n message.htmlContent = parseMarkdownContent(processed, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n }\r\n },\r\n streamingStarted() {\r\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\r\n\r\n if (stopIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.setAttribute('disabled', 'disabled');\r\n }\r\n },\r\n streamingFinished() {\r\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\r\n\r\n if (startIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.removeAttribute('disabled');\r\n this.inputElement.focus();\r\n }\r\n\r\n // Directly manipulate the DOM to stop all streaming animations.\r\n if (this.chatContainer) {\r\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\r\n for (var i = 0; i < icons.length; i++) {\r\n icons[i].classList.remove('ai-streaming-icon');\r\n icons[i].classList.add('ai-bot-icon');\r\n }\r\n }\r\n\r\n // Also update Vue data for consistency.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n },\r\n handleExternalTtsStop(e) {\r\n if (e?.detail?.sourceId === this.ttsInstanceId) {\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n },\r\n synthesizeSpeech(text, cacheIndex) {\r\n if (!this.textToSpeechEnabled || !text || !this.connection) {\r\n return;\r\n }\r\n\r\n this.audioChunks = [];\r\n this.isPlayingAudio = true;\r\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\r\n\r\n this.connection.invoke(\"SynthesizeSpeech\", this.getProfileId(), this.getSessionId(), text, this.ttsVoiceName)\r\n .catch(err => {\r\n console.error(\"TTS synthesis error:\", err);\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this._ttsCacheIndex = -1;\r\n });\r\n },\r\n toggleMessageTts(message, index) {\r\n if (this.ttsPlayingMessageIndex === index) {\r\n this.stopAudio();\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\r\n detail: { sourceId: this.ttsInstanceId }\r\n }));\r\n this.ttsPlayingMessageIndex = index;\r\n\r\n if (this.ttsAudioCache[index]) {\r\n this.playAudioBlob(this.ttsAudioCache[index]);\r\n return;\r\n }\r\n\r\n this.synthesizeSpeech(message.content, index);\r\n },\r\n playCollectedAudio() {\r\n if (this.audioChunks.length === 0) {\r\n if (!this.currentAudioElement && this.audioPlayQueue.length === 0) {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n }\r\n return;\r\n }\r\n\r\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\r\n const combined = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const chunk of this.audioChunks) {\r\n combined.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n this.audioChunks = [];\r\n\r\n const blob = new Blob([combined], { type: 'audio/mp3' });\r\n\r\n if (this._ttsCacheIndex >= 0) {\r\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\r\n this._ttsCacheIndex = -1;\r\n }\r\n\r\n // If audio is already playing, queue this blob for sequential playback.\r\n if (this.currentAudioElement) {\r\n this.audioPlayQueue.push(blob);\r\n return;\r\n }\r\n\r\n this.playAudioBlob(blob);\r\n },\r\n playAudioBlob(blob) {\r\n const url = URL.createObjectURL(blob);\r\n const audio = new Audio(url);\r\n\r\n this.currentAudioUrl = url;\r\n this.currentAudioElement = audio;\r\n this.isPlayingAudio = true;\r\n\r\n audio.addEventListener('ended', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.addEventListener('error', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.play().catch(err => {\r\n console.error(\"Audio playback error:\", err);\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n });\r\n },\r\n playNextInQueue() {\r\n if (this.audioPlayQueue.length > 0) {\r\n var nextBlob = this.audioPlayQueue.shift();\r\n this.playAudioBlob(nextBlob);\r\n } else {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this.conversationModeOnAudioEnded();\r\n }\r\n },\r\n stopAudio() {\r\n if (this.currentAudioElement) {\r\n this.currentAudioElement.pause();\r\n this.currentAudioElement.currentTime = 0;\r\n this.currentAudioElement = null;\r\n }\r\n if (this.currentAudioUrl) {\r\n URL.revokeObjectURL(this.currentAudioUrl);\r\n this.currentAudioUrl = null;\r\n }\r\n this.audioChunks = [];\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n },\r\n toggleConversationMode() {\r\n if (this.isConversationMode) {\r\n this.stopConversationMode();\r\n } else {\r\n this.startConversationMode();\r\n }\r\n },\r\n startConversationMode() {\r\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = true;\r\n this.updateConversationButton();\r\n this._conversationPartialTranscript = '';\r\n this._conversationAssistantMessage = null;\r\n this._conversationPartialMessage = null;\r\n\r\n // Remove any previous conversation ended notification.\r\n this.removeNotification('conversation-ended');\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this._conversationSubject = new signalR.Subject();\r\n this._conversationStream = stream;\r\n\r\n // Create an AnalyserNode for volume-based interrupt detection.\r\n // During TTS playback, detect when the user speaks above\r\n // the threshold to stop TTS (interrupt). Audio chunks are\r\n // always forwarded — browser echo cancellation handles\r\n // speaker echo so the STT stream has no gaps.\r\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\r\n if (AudioCtx) {\r\n this._conversationAudioCtx = new AudioCtx();\r\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\r\n this._conversationAnalyser.fftSize = 256;\r\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\r\n micSource.connect(this._conversationAnalyser);\r\n }\r\n\r\n var pendingChunk = Promise.resolve();\r\n var analyser = this._conversationAnalyser;\r\n var interruptVolumeThreshold = 30;\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n // During TTS playback, check mic volume to detect\r\n // user interruption (speaking above threshold).\r\n if (this.isPlayingAudio && analyser) {\r\n var freqData = new Uint8Array(analyser.frequencyBinCount);\r\n analyser.getByteFrequencyData(freqData);\r\n var sum = 0;\r\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\r\n var avg = sum / freqData.length;\r\n\r\n if (avg >= interruptVolumeThreshold) {\r\n // User is speaking — interrupt TTS playback.\r\n this.stopAudio();\r\n }\r\n }\r\n\r\n // Always send audio to STT — browser echo cancellation\r\n // handles speaker echo; continuous audio avoids gaps\r\n // that increase recognition latency.\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n try {\r\n this._conversationSubject.next(base64);\r\n } catch (err) {\r\n // Subject may have been completed already.\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => {\r\n try {\r\n this._conversationSubject.complete();\r\n } catch (err) {\r\n // Already completed.\r\n }\r\n });\r\n });\r\n\r\n var profileId = this.getProfileId();\r\n var sessionId = this.getSessionId() || '';\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n\r\n this.connection.send(\"StartConversation\", profileId, sessionId, this._conversationSubject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n });\r\n },\r\n stopConversationMode() {\r\n if (!this.isConversationMode) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n\r\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\r\n if (this.connection) {\r\n this.connection.invoke(\"StopConversation\").catch(function () { });\r\n }\r\n\r\n if (this.isRecording && this.mediaRecorder) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n }\r\n\r\n this.stopAudio();\r\n this._conversationPartialTranscript = '';\r\n this._conversationPartialMessage = null;\r\n\r\n // Clean up the AudioContext used for volume monitoring.\r\n if (this._conversationAudioCtx) {\r\n this._conversationAudioCtx.close().catch(function () { });\r\n this._conversationAudioCtx = null;\r\n this._conversationAnalyser = null;\r\n }\r\n\r\n // Mark any in-flight assistant message as done to stop the spinner.\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Safety net: clear all lingering streaming indicators.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Show a \"conversation ended\" notification system message.\r\n this.receiveNotification({\r\n type: 'conversation-ended',\r\n content: 'Conversation ended.',\r\n icon: 'fa-solid fa-circle-check',\r\n dismissible: true,\r\n autoDismissMs: 5000\r\n });\r\n },\r\n updateConversationButton() {\r\n if (!this.conversationButton) {\r\n return;\r\n }\r\n\r\n if (this.isConversationMode) {\r\n this.conversationButton.classList.add('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\r\n var endHtml = this.conversationButton.getAttribute('data-end-html');\r\n if (endHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n } else {\r\n this.conversationButton.classList.remove('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\r\n this.conversationButton.classList.add('btn-outline-dark');\r\n this.conversationButton.blur();\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\r\n var startHtml = this.conversationButton.getAttribute('data-start-html');\r\n if (startHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n }\r\n },\r\n conversationModeSendPrompt() {\r\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\r\n },\r\n conversationModeOnAudioEnded() {\r\n // Legacy: in conversation mode, audio playback continuation\r\n // is handled by the persistent stream. This method is only\r\n // called from playCollectedAudio for non-conversation TTS.\r\n },\r\n generatePrompt(element) {\r\n if (!element) {\r\n console.error('The element paramter is required.');\r\n\r\n return;\r\n }\r\n\r\n let templateProfileId = element.getAttribute('data-profile-id');\r\n let sessionId = this.getSessionId();\r\n let sessionProfileId = this.getProfileId();\r\n\r\n if (!templateProfileId || !sessionId) {\r\n\r\n console.error('The given element is missing data-profile-id or the session has not yet started.');\r\n return;\r\n }\r\n\r\n // streamMessage() already shows the typing indicator.\r\n this.streamMessage(templateProfileId, null, sessionProfileId);\r\n },\r\n createSessionUrl(baseUrl, param, value) {\r\n\r\n const fullUrl = baseUrl.toLowerCase().startsWith('http') ? baseUrl : window.location.origin + baseUrl;\r\n const url = new URL(fullUrl);\r\n\r\n url.searchParams.set(param, value);\r\n\r\n return url.toString();\r\n },\r\n showTypingIndicator() {\r\n this.addMessage({\r\n role: 'indicator',\r\n htmlContent: config.indicatorTemplate\r\n });\r\n },\r\n hideTypingIndicator() {\r\n const originalLength = this.messages.length;\r\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\r\n const removedCount = originalLength - this.messages.length;\r\n return removedCount;\r\n },\r\n receiveNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\r\n if (existingIndex >= 0) {\r\n this.notifications.splice(existingIndex, 1, notification);\r\n } else {\r\n this.notifications.push(notification);\r\n }\r\n this.scheduleNotificationDismiss(notification);\r\n this.$nextTick(() => {\r\n this.scrollToBottom();\r\n });\r\n },\r\n updateNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\r\n if (existingIndex >= 0) {\r\n this.notifications.splice(existingIndex, 1, notification);\r\n this.scheduleNotificationDismiss(notification);\r\n }\r\n },\r\n scheduleNotificationDismiss(notification) {\r\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\r\n return;\r\n }\r\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\r\n this.removeNotification(notification.type);\r\n }, notification.autoDismissMs);\r\n },\r\n clearNotificationDismiss(notificationType) {\r\n var timerId = this.notificationDismissTimers[notificationType];\r\n if (!timerId) {\r\n return;\r\n }\r\n clearTimeout(timerId);\r\n delete this.notificationDismissTimers[notificationType];\r\n },\r\n removeNotification(notificationType) {\r\n this.clearNotificationDismiss(notificationType);\r\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\r\n },\r\n dismissNotification(notificationType) {\r\n this.removeNotification(notificationType);\r\n },\r\n handleNotificationAction(notificationType, actionName) {\r\n if (!this.connection) {\r\n return;\r\n }\r\n var sessionId = this.getSessionId();\r\n this.connection.invoke(\"HandleNotificationAction\", sessionId, notificationType, actionName).catch(function (err) {\r\n console.error(\"Error handling notification action:\", err);\r\n });\r\n },\r\n scrollToBottom() {\r\n if (!this.autoScroll) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\r\n }, 50);\r\n },\r\n handleUserInput(event) {\r\n this.prompt = event.target.value;\r\n },\r\n getProfileId() {\r\n return this.inputElement.getAttribute('data-profile-id');\r\n },\r\n setSessionId(sessionId) {\r\n this.inputElement.setAttribute('data-session-id', sessionId || '');\r\n },\r\n resetSession() {\r\n this.stopRecording();\r\n this.setSessionId('');\r\n this.isSessionStarted = false;\r\n this.sessionRating = null;\r\n if (this.widgetIsInitialized) {\r\n localStorage.removeItem(this.chatWidgetStateSession);\r\n }\r\n this.messages = [];\r\n this.documents = [];\r\n if (!config.autoCreateSession) {\r\n this.showPlaceholder();\r\n }\r\n\r\n if (config.autoCreateSession) {\r\n this.startNewSession();\r\n }\r\n },\r\n startNewSession() {\r\n if (!this.applyOrchestratorAvailability()) {\r\n return;\r\n }\r\n\r\n const profileId = this.getProfileId();\r\n if (!profileId || !this.connection) {\r\n return;\r\n }\r\n\r\n this.connection.invoke(\"StartSession\", profileId, null).catch(err => console.error(err));\r\n },\r\n initializeApp() {\r\n this.inputElement = document.querySelector(config.inputElementSelector);\r\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\r\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\r\n this.placeholder = document.querySelector(config.placeholderElementSelector);\r\n this.applyOrchestratorAvailability();\r\n\r\n const sessionId = this.getSessionId();\r\n if (!hasWidgetConfig && sessionId) {\r\n this.loadSession(sessionId);\r\n } else if (this.isOrchestratorAvailable() && config.autoCreateSession && !hasWidgetConfig && !sessionId) {\r\n this.startNewSession();\r\n }\r\n\r\n // Initialize document bar if enabled.\r\n if (config.sessionDocumentsEnabled && config.documentBarSelector) {\r\n this.documentBar = document.querySelector(config.documentBarSelector);\r\n if (this.documentBar) {\r\n this.renderDocumentBar();\r\n\r\n // Create hidden file input for document uploads.\r\n var fileInput = document.createElement('input');\r\n fileInput.type = 'file';\r\n fileInput.id = 'ai-chat-doc-input';\r\n fileInput.className = 'd-none';\r\n fileInput.multiple = true;\r\n if (config.allowedExtensions) {\r\n fileInput.accept = config.allowedExtensions;\r\n }\r\n fileInput.addEventListener('change', (e) => this.handleFileInputChange(e));\r\n this.documentBar.parentElement.appendChild(fileInput);\r\n\r\n // Set up drag-and-drop on the input area.\r\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\r\n if (inputArea) {\r\n inputArea.addEventListener('dragover', (e) => this.handleDragOver(e));\r\n inputArea.addEventListener('dragleave', (e) => this.handleDragLeave(e));\r\n inputArea.addEventListener('drop', (e) => this.handleDrop(e));\r\n }\r\n }\r\n }\r\n\r\n // Pause auto-scroll when the user manually scrolls up during streaming.\r\n this.chatContainer.addEventListener('scroll', () => {\r\n if (!this.stream) {\r\n return;\r\n }\r\n const threshold = 30;\r\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\r\n this.autoScroll = atBottom;\r\n });\r\n\r\n this.inputElement.addEventListener('keydown', event => {\r\n\r\n if (this.stream != null) {\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" && !event.shiftKey) {\r\n event.preventDefault();\r\n this.buttonElement.click();\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('input', (e) => {\r\n this.handleUserInput(e);\r\n\r\n if (e.target.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n });\r\n\r\n this.buttonElement.addEventListener('click', () => {\r\n\r\n if (this.stream != null) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n\r\n this.streamingFinished();\r\n this.hideTypingIndicator();\r\n\r\n // Clean up: remove empty assistant message or stop streaming animation.\r\n if (this.messages.length > 0) {\r\n const lastMsg = this.messages[this.messages.length - 1];\r\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\r\n this.messages.pop();\r\n } else if (lastMsg.isStreaming) {\r\n lastMsg.isStreaming = false;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.sendMessage();\r\n });\r\n\r\n const promptGenerators = document.getElementsByClassName('profile-generated-prompt');\r\n\r\n for (var i = 0; i < promptGenerators.length; i++) {\r\n promptGenerators[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n this.generatePrompt(e.target);\r\n });\r\n }\r\n\r\n const chatSessions = document.getElementsByClassName('chat-session-history-item');\r\n\r\n for (var i = 0; i < chatSessions.length; i++) {\r\n chatSessions[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n var sessionId = e.target.getAttribute('data-session-id');\r\n\r\n if (!sessionId) {\r\n console.error('an element with the class chat-session-history-item with no data-session-id set.');\r\n\r\n return;\r\n }\r\n\r\n this.loadSession(sessionId);\r\n this.showChatScreen();\r\n });\r\n }\r\n\r\n for (let i = 0; i < config.messages.length; i++) {\r\n this.addMessage(config.messages[i]);\r\n }\r\n\r\n // Update feedback icons in the DOM after initial messages have rendered.\r\n this.$nextTick(() => {\r\n this.refreshAllFeedbackIcons();\r\n });\r\n\r\n // Delegate click for code block copy buttons.\r\n if (this.chatContainer) {\r\n this.chatContainer.addEventListener('click', (e) => {\r\n var btn = e.target.closest('.ai-code-copy-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n\r\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\r\n if (!block) {\r\n return;\r\n }\r\n\r\n var codeEl = block.querySelector('code');\r\n if (codeEl) {\r\n navigator.clipboard.writeText(codeEl.textContent);\r\n var copiedText = config.codeCopiedText || 'Copied!';\r\n btn.innerHTML = ' ' + copiedText;\r\n setTimeout(() => {\r\n btn.innerHTML = '';\r\n }, 2000);\r\n }\r\n });\r\n }\r\n\r\n // Initialize speech-to-text microphone button.\r\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\r\n this.micButton = document.querySelector(config.micButtonElementSelector);\r\n if (this.micButton) {\r\n this.micButton.style.display = '';\r\n this.micButton.addEventListener('click', () => {\r\n this.toggleRecording();\r\n });\r\n }\r\n }\r\n\r\n // Initialize conversation mode button.\r\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\r\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\r\n if (this.conversationButton) {\r\n this.conversationButton.addEventListener('click', () => {\r\n this.toggleConversationMode();\r\n });\r\n }\r\n }\r\n },\r\n loadSession(sessionId) {\r\n this.connection.invoke(\"LoadSession\", sessionId).catch(err => console.error(err));\r\n },\r\n reloadCurrentSession() {\r\n\r\n var sessionId = this.getSessionId();\r\n if (sessionId) {\r\n this.loadSession(sessionId);\r\n }\r\n },\r\n initializeSession(sessionId, force) {\r\n if (this.isSessionStarted && !force) {\r\n return\r\n }\r\n this.fireEvent(new CustomEvent(\"initializingSessionOpenAIChat\", { detail: { sessionId: sessionId } }))\r\n this.setSessionId(sessionId);\r\n this.isSessionStarted = true;\r\n\r\n if (this.widgetIsInitialized) {\r\n localStorage.setItem(this.chatWidgetStateSession, sessionId);\r\n }\r\n },\r\n initializeWidget() {\r\n\r\n if (!config.widget.chatWidgetContainer) {\r\n console.error('The widget chatWidgetContainer is required.');\r\n return;\r\n }\r\n\r\n if (!config.widget.chatWidgetStateName) {\r\n console.error('The widget chatWidgetStateName is required.');\r\n return;\r\n }\r\n\r\n const chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);\r\n\r\n if (!chatWidgetContainer) {\r\n return;\r\n }\r\n\r\n if (config.widget.chatHistorySection) {\r\n this.chatHistorySection = document.querySelector(config.widget.chatHistorySection);\r\n }\r\n\r\n this.chatWidgetStateName = config.widget.chatWidgetStateName;\r\n this.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';\r\n this.chatWidgetLayoutKey = config.widget.chatWidgetStateName + 'Layout';\r\n this.widgetContainerElement = chatWidgetContainer;\r\n this.widgetToggleButtonElement = config.widget.toggleButtonSelector\r\n ? document.querySelector(config.widget.toggleButtonSelector)\r\n : null;\r\n this.widgetResetSizeButtonElement = config.widget.resetSizeButtonSelector\r\n ? document.querySelector(config.widget.resetSizeButtonSelector)\r\n : null;\r\n this.widgetDefaultWidth = parsePixelValue(config.widget.defaultWidth) ||\r\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).width) ||\r\n 380;\r\n this.widgetDefaultHeight = parsePixelValue(config.widget.defaultHeight) ||\r\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).height) ||\r\n 520;\r\n this.widgetIsInitialized = true;\r\n\r\n if (config.widget.enableResizing) {\r\n chatWidgetContainer.classList.add('ai-chat-widget-resizable');\r\n chatWidgetContainer.style.minWidth = (parsePixelValue(config.widget.minWidth) || 320) + 'px';\r\n chatWidgetContainer.style.minHeight = (parsePixelValue(config.widget.minHeight) || 420) + 'px';\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.widgetResizeObserver = new ResizeObserver(() => {\r\n this.persistWidgetPanelSize();\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n });\r\n\r\n this.widgetResizeObserver.observe(chatWidgetContainer);\r\n }\r\n }\r\n\r\n var dragHandleSelector = config.widget.dragHandleSelector || '.ai-chat-widget-header';\r\n var dragHandle = chatWidgetContainer.querySelector(dragHandleSelector);\r\n\r\n if (config.widget.enableDragging && dragHandle) {\r\n dragHandle.classList.add('ai-chat-widget-drag-handle');\r\n chatWidgetContainer.classList.add('ai-chat-widget-draggable');\r\n this.attachDraggableWidgetElement(chatWidgetContainer, dragHandle, 'panel', false);\r\n }\r\n\r\n if (config.widget.enableDragging && this.widgetToggleButtonElement) {\r\n this.widgetToggleButtonElement.classList.add('ai-chat-widget-draggable');\r\n this.attachDraggableWidgetElement(this.widgetToggleButtonElement, this.widgetToggleButtonElement, 'toggle', true);\r\n }\r\n\r\n if (this.widgetResetSizeButtonElement) {\r\n this.widgetResetSizeButtonElement.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n this.resetWidgetSize();\r\n });\r\n }\r\n\r\n this.restoreWidgetLayout();\r\n\r\n if (!this.widgetViewportResizeHandler) {\r\n this.widgetViewportResizeHandler = () => {\r\n this.constrainWidgetElementsToViewport();\r\n this.updateWidgetResetSizeButtonVisibility();\r\n };\r\n\r\n window.addEventListener('resize', this.widgetViewportResizeHandler);\r\n }\r\n\r\n // Auto-load the last session so the user always sees previous chat history.\r\n this.reloadCurrentSession();\r\n\r\n if (config.autoCreateSession && !this.getSessionId()) {\r\n this.startNewSession();\r\n }\r\n\r\n if (config.widget.showHistoryButton && this.chatHistorySection) {\r\n\r\n const showHistoryButton = document.querySelector(config.widget.showHistoryButton);\r\n\r\n if (showHistoryButton) {\r\n showHistoryButton.addEventListener('click', () => {\r\n this.chatHistorySection.classList.toggle('show');\r\n });\r\n }\r\n\r\n if (config.widget.closeHistoryButton) {\r\n var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);\r\n\r\n if (closeHistoryButton) {\r\n closeHistoryButton.addEventListener('click', () => {\r\n this.showChatScreen();\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (config.widget.newChatButton) {\r\n const newChatButton = document.querySelector(config.widget.newChatButton);\r\n\r\n if (newChatButton) {\r\n newChatButton.addEventListener('click', () => {\r\n this.resetSession();\r\n this.showChatScreen();\r\n });\r\n }\r\n }\r\n },\r\n showChatScreen() {\r\n\r\n if (!this.chatHistorySection) {\r\n return;\r\n }\r\n\r\n this.chatHistorySection.classList.remove('show');\r\n },\r\n getSessionId() {\r\n let sessionId = this.inputElement.getAttribute('data-session-id');\r\n\r\n if (!sessionId && this.widgetIsInitialized) {\r\n sessionId = localStorage.getItem(this.chatWidgetStateSession);\r\n }\r\n\r\n return sessionId;\r\n },\r\n copyResponse(message) {\r\n navigator.clipboard.writeText(message);\r\n },\r\n updateFeedbackIcons(container, userRating) {\r\n if (!container) {\r\n return;\r\n }\r\n\r\n var upBtn = container.querySelector('.rate-up-btn');\r\n var downBtn = container.querySelector('.rate-down-btn');\r\n\r\n // Font Awesome SVG+JS replaces with , so we must replace\r\n // the entire button content and let Font Awesome re-process.\r\n if (upBtn) {\r\n var upClass = userRating === true ? 'fa-solid fa-thumbs-up' : 'fa-regular fa-thumbs-up';\r\n var upIcon = document.createElement('i');\r\n upIcon.className = upClass;\r\n upIcon.style.fontSize = '0.9rem';\r\n upBtn.textContent = '';\r\n upBtn.appendChild(upIcon);\r\n }\r\n\r\n if (downBtn) {\r\n var downClass = userRating === false ? 'fa-solid fa-thumbs-down' : 'fa-regular fa-thumbs-down';\r\n var downIcon = document.createElement('i');\r\n downIcon.className = downClass;\r\n downIcon.style.fontSize = '0.9rem';\r\n downBtn.textContent = '';\r\n downBtn.appendChild(downIcon);\r\n }\r\n\r\n // Trigger Font Awesome SVG+JS to convert the new elements.\r\n if (window.FontAwesome && FontAwesome.dom && FontAwesome.dom.i2svg) {\r\n FontAwesome.dom.i2svg({ node: container });\r\n }\r\n },\r\n refreshAllFeedbackIcons() {\r\n var containers = this.$el.querySelectorAll('.ai-chat-message-assistant-feedback');\r\n\r\n for (var i = 0; i < containers.length; i++) {\r\n var msgId = containers[i].getAttribute('data-message-id');\r\n var msg = this.messages.find(m => m.id === msgId);\r\n\r\n if (msg) {\r\n this.updateFeedbackIcons(containers[i], msg.userRating);\r\n }\r\n }\r\n },\r\n rateMessage(message, isPositive, event) {\r\n var sessionId = this.getSessionId();\r\n\r\n if (!sessionId || !message.id || !this.connection) {\r\n return;\r\n }\r\n\r\n // Toggle: clicking the same rating again clears it.\r\n var newRating = message.userRating === isPositive ? null : isPositive;\r\n message.userRating = newRating;\r\n\r\n // Find the feedback container by message ID for reliable DOM targeting.\r\n var feedbackContainer = this.$el.querySelector(\r\n '.ai-chat-message-assistant-feedback[data-message-id=\"' + message.id + '\"]'\r\n );\r\n\r\n this.updateFeedbackIcons(feedbackContainer, newRating);\r\n\r\n // Trigger spark animation after Font Awesome has re-processed icons.\r\n if (newRating !== null && feedbackContainer) {\r\n setTimeout(() => {\r\n var btnClass = isPositive ? '.rate-up-btn' : '.rate-down-btn';\r\n var btn = feedbackContainer.querySelector(btnClass);\r\n\r\n if (btn) {\r\n btn.classList.remove('spark-effect');\r\n void btn.offsetWidth;\r\n btn.classList.add('spark-effect');\r\n btn.addEventListener('animationend', function onEnd() {\r\n btn.removeEventListener('animationend', onEnd);\r\n btn.classList.remove('spark-effect');\r\n });\r\n }\r\n }, 50);\r\n }\r\n\r\n this.connection.invoke(\"RateMessage\", sessionId, message.id, isPositive).catch(function (err) {\r\n console.error('Failed to rate message:', err);\r\n });\r\n }\r\n },\r\n watch: {\r\n documents: {\r\n handler() { this.renderDocumentBar(); },\r\n deep: true\r\n },\r\n isUploading() { this.renderDocumentBar(); },\r\n isPlayingAudio() {\r\n // Reserved for future use — volume-based interrupt detection\r\n // no longer mutes tracks; browser echo cancellation handles echo.\r\n },\r\n isConversationMode(active) {\r\n // Hide/show mic button.\r\n if (this.micButton) {\r\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\r\n }\r\n\r\n // Hide/show send button.\r\n if (this.buttonElement) {\r\n this.buttonElement.style.display = active ? 'none' : '';\r\n }\r\n\r\n // Disable/enable textarea.\r\n if (this.inputElement) {\r\n this.inputElement.disabled = active;\r\n if (active) {\r\n this.inputElement.placeholder = '';\r\n }\r\n }\r\n }\r\n },\r\n mounted() {\r\n (async () => {\r\n await this.startConnection();\r\n this.initializeApp();\r\n if (hasWidgetConfig) {\r\n this.initializeWidget();\r\n }\r\n })();\r\n\r\n window.addEventListener('beforeunload', this.handleBeforeUnload);\r\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n },\r\n beforeUnmount() {\r\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\r\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n\r\n this.stopAudio(false);\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n },\r\n template: config.messageTemplate\r\n }).mount(config.appElementSelector);\r\n\r\n return app;\r\n };\r\n\r\n return {\r\n initialize: initialize\r\n };\r\n}();\r\n\r\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\r\ndocument.addEventListener('click', function (e) {\r\n const btn = e.target.closest('.download-chart-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n const chartId = btn.getAttribute('data-chart-id');\r\n const canvas = chartId ? document.getElementById(chartId) : null;\r\n if (!canvas) {\r\n console.error('Chart canvas not found:', chartId);\r\n return;\r\n }\r\n const link = document.createElement('a');\r\n link.download = 'chart-' + chartId + '.png';\r\n link.href = canvas.toDataURL('image/png');\r\n link.click();\r\n});\r\n\r\n// Intercept download clicks for data-URI images and convert to blob downloads.\r\ndocument.addEventListener('click', function (e) {\r\n const link = e.target.closest('.ai-download-image');\r\n if (!link) {\r\n return;\r\n }\r\n\r\n const container = link.closest('.generated-image-container');\r\n const img = container?.querySelector('img');\r\n if (!img) {\r\n return;\r\n }\r\n\r\n const src = img.src;\r\n if (!src || !src.startsWith('data:')) {\r\n return; // Normal URL – let the default behaviour handle it.\r\n }\r\n\r\n e.preventDefault();\r\n\r\n fetch(src)\r\n .then(function (res) { return res.blob(); })\r\n .then(function (blob) {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = link.getAttribute('download') || 'generated-image.png';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\r\n })\r\n .catch(function (err) { console.error('Failed to download image:', err); });\r\n});\r\n"]} +{"version":3,"sources":["ai-chat.js"],"names":["_regenerator","e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","this","setPrototypeOf","__proto__","displayName","w","m","defineProperty","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","from","_arrayLikeToArray","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","push","_typeof","window","openAIChatManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","userLabel","assistantLabel","thumbsUpTitle","thumbsDownTitle","copyTitle","codeCopiedText","widget","chatWidgetContainer","chatWidgetStateName","chatHistorySection","showHistoryButton","closeHistoryButton","newChatButton","toggleButtonSelector","resetSizeButtonSelector","dragHandleSelector","enableDragging","enableResizing","persistLayout","defaultWidth","defaultHeight","minWidth","minHeight","messageTemplate","indicatorTemplate","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","parsePixelValue","Number","isFinite","parsed","parseFloat","clamp","min","max","Math","normalizeReference","reference","_ref","_normalized$index","_ref2","_normalized$text","_ref3","_normalized$link","normalized","assign","index","Index","Text","link","Link","normalizeReferences","references","_i","_Object$entries","entries","_normalizeReference","_Object$entries$_i","key","renderer","marked","Renderer","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","renderChartsInMessage","message","charts","requestAnimationFrame","_step","_iterator","renderChartOnCanvas","chartId","config","err","canvas","getElementById","Chart","console","warn","offsetParent","__chartConfigs","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","token","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","startIndex","endIndex","json","substring","tryExtractChartMarker","type","raw","renderPendingCharts","configs","_i2","_Object$keys","keys","initialize","instanceConfig","hasWidgetConfig","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isSessionStarted","isPlaceholderVisible","chatWidgetStateSession","chatWidgetLayoutKey","widgetContainerElement","widgetToggleButtonElement","widgetResetSizeButtonElement","widgetResizeObserver","widgetViewportResizeHandler","widgetDefaultWidth","widgetDefaultHeight","widgetIsInitialized","isStreaming","isNavigatingAway","autoScroll","stream","messages","notifications","prompt","documents","existingDocuments","isUploading","uploadErrors","isDragOver","documentBar","metricsEnabled","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsButton","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","random","singleResponseMode","conversationModeEnabled","conversationButton","isConversationMode","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","getStoredWidgetLayout","storedLayout","localStorage","getItem","saveStoredWidgetLayout","partialLayout","currentLayout","nextLayout","panel","toggle","setItem","stringify","getElementSize","element","fallbackWidth","fallbackHeight","width","height","rect","getBoundingClientRect","getComputedStyle","round","clampWidgetPosition","left","top","maxLeft","innerWidth","maxTop","innerHeight","applyAbsolutePosition","style","right","bottom","getWidgetDefaultSize","persistWidgetPanelPosition","panelRect","persistWidgetTogglePosition","toggleRect","persistWidgetPanelSize","defaultSize","currentSize","abs","updateWidgetResetSizeButtonVisibility","isResized","classList","add","resetWidgetSize","removeProperty","constrainWidgetElementsToViewport","restoreWidgetLayout","attachDraggableWidgetElement","handle","layoutKey","suppressClickOnDrag","_this","activePointerId","startX","startY","startLeft","startTop","dragged","stopDragging","event","pointerId","removeEventListener","onPointerMove","remove","dataset","dragSuppressClick","setTimeout","deltaX","clientX","deltaY","clientY","hypot","nextPosition","addEventListener","button","target","closest","setPointerCapture","preventDefault","panelDefaultSize","panelSize","clampedPanel","toggleSize","clampedToggle","handleDragOver","sessionDocumentsEnabled","stopPropagation","inputArea","handleDragLeave","handleDrop","dataTransfer","files","uploadFiles","triggerFileInput","fileInput","click","handleFileInputChange","_this2","_callee","sessionId","profileId","formData","response","errorText","uploadError","result","j","_t","_context","uploadDocumentUrl","getSessionId","getProfileId","renderDocumentBar","FormData","append","fetch","method","body","ok","extractReadableErrorMessage","fileName","initializeSession","uploaded","failed","removeDocument","doc","_this3","_callee2","removeError","_t2","_context2","removeDocumentUrl","headers","itemId","documentId","splice","status","formatFileSize","bytes","toFixed","escapeHtml","failedItem","failedName","errorMsg","supportedExtensionsText","replaceChildren","RETURN_DOM_FRAGMENT","self","closeButtons","querySelectorAll","docToRemove","parseInt","getAttribute","errorCloseButtons","addBtn","querySelector","div","fallbackMessage","startsWith","title","detail","normalizeAssistantAppearance","appearance","label","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","startConnection","_this4","_callee3","_t3","_context3","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","forEach","msg","addMessage","$nextTick","refreshAllFeedbackIcons","initialPrompt","sendMessage","stopRecording","_attemptedSessionRecovery","removeItem","startNewSession","messageId","userRating","find","id","isFinal","_conversationPartialTranscript","replace","_conversationPartialMessage","htmlContent","hidePlaceholder","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","escaped","responseId","hideTypingIndicator","msgIndex","newMessage","base64Audio","contentType","binaryString","atob","Uint8Array","charCodeAt","playCollectedAudio","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentSession","autoCreateSession","onclose","addMessageInternal","_this5","fireEvent","CustomEvent","_this6","processedContent","citedRefs","filter","_ref4","includes","sort","_ref6","_ref7","b","_step2","displayIndex","_iterator2","_step2$value","replaceAll","_displayIndex","_placeholder","_step3","_iterator3","_step4","_iterator4","_step4$value","addMessages","_this7","showPlaceholder","isOrchestratorAvailable","applyOrchestratorAvailability","unavailableMessage","orchestratorUnavailableMessage","disabled","micButtonElement","display","conversationButtonElement","isIndicator","trimmedPrompt","streamMessage","startRecording","_this8","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","subject","Subject","pendingChunk","size","_callee4","uint8Array","base64","_context4","arrayBuffer","reduce","str","byte","String","fromCharCode","btoa","getTracks","track","stop","complete","documentElement","send","updateMicButton","toggleRecording","sessionProfileId","_this9","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentSessionId","subscribe","chunk","_i3","_Object$entries2","_normalizeReference2","_Object$entries2$_i","_i4","_Object$entries3","_Object$entries3$_i","_this9$stream","processReferences","streamingFinished","synthesizeSpeech","_this9$stream2","getServiceDownMessage","_this0","_ref1","_ref10","_ref11","_ref12","_step5","processed","_iterator5","_step5$value","_step6","_iterator6","_step7","_iterator7","_step7$value","stopIcon","setAttribute","startIcon","removeAttribute","focus","icons","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this1","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","_step8","totalLength","sum","combined","offset","_iterator8","set","blob","Blob","_this10","URL","createObjectURL","Audio","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this11","updateConversationButton","_conversationSubject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","createMediaStreamSource","connect","analyser","freqData","frequencyBinCount","getByteFrequencyData","k","_callee5","_context5","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","generatePrompt","templateProfileId","createSessionUrl","baseUrl","param","fullUrl","toLowerCase","location","origin","searchParams","originalLength","_this12","clearNotificationDismiss","existingIndex","findIndex","scheduleNotificationDismiss","_this13","timerId","clearTimeout","dismissNotification","handleNotificationAction","actionName","_this14","scrollTop","scrollHeight","clientHeight","handleUserInput","setSessionId","resetSession","sessionRating","initializeApp","_this15","placeholderElementSelector","loadSession","documentBarSelector","className","multiple","allowedExtensions","accept","parentElement","appendChild","atBottom","shiftKey","lastMsg","pop","promptGenerators","getElementsByClassName","chatSessions","showChatScreen","btn","block","codeEl","clipboard","writeText","copiedText","micButtonElementSelector","conversationButtonElementSelector","force","initializeWidget","_this16","ResizeObserver","observe","dragHandle","copyResponse","updateFeedbackIcons","container","upBtn","downBtn","upClass","upIcon","fontSize","downClass","downIcon","FontAwesome","dom","i2svg","node","containers","$el","msgId","rateMessage","isPositive","newRating","feedbackContainer","btnClass","offsetWidth","onEnd","watch","handler","deep","active","mounted","_this17","_callee6","_context6","beforeUnmount","template","mount","download","toDataURL","img","res","removeChild"],"mappings":"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","file":"ai-chat.min.js","sourcesContent":["window.openAIChatManager = function () {\n\n // Defaults (can be overridden by instanceConfig)\n var defaultConfig = {\n // UI defaults for generated media\n generatedImageAltText: 'Generated Image',\n generatedImageMaxWidth: 400,\n downloadImageTitle: 'Download image',\n downloadChartTitle: 'Download chart as image',\n downloadChartButtonText: 'Download',\n userLabel: 'You',\n assistantLabel: 'Assistant',\n thumbsUpTitle: 'Thumbs up',\n thumbsDownTitle: 'Thumbs down',\n copyTitle: 'Click here to copy response to clipboard.',\n codeCopiedText: 'Copied!',\n widget: {\n chatWidgetContainer: null,\n chatWidgetStateName: null,\n chatHistorySection: null,\n showHistoryButton: null,\n closeHistoryButton: null,\n newChatButton: null,\n toggleButtonSelector: null,\n resetSizeButtonSelector: null,\n dragHandleSelector: '.ai-chat-widget-header',\n enableDragging: true,\n enableResizing: true,\n persistLayout: true,\n defaultWidth: null,\n defaultHeight: null,\n minWidth: 320,\n minHeight: 420\n },\n messageTemplate: `\n
\n
\n
\n
{{ userLabel }}
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n `,\n indicatorTemplate: `\n
\n \n Assistant\n
\n `\n };\n\n // Sanitize URLs to prevent javascript: protocol injection.\n function sanitizeUrl(url) {\n if (!url) return '';\n var trimmed = url.trim();\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\n return '';\n }\n return url;\n }\n\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\n function escapeHtmlEntities(text) {\n var span = document.createElement('span');\n span.textContent = text;\n return span.innerHTML;\n }\n\n function parsePixelValue(value) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n return null;\n }\n\n var parsed = parseFloat(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n function clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n }\n\n function normalizeReference(reference) {\n if (!reference || typeof reference !== 'object') {\n return null;\n }\n\n const normalized = Object.assign({}, reference);\n normalized.index = normalized.index ?? normalized.Index ?? 0;\n normalized.text = normalized.text ?? normalized.Text ?? null;\n normalized.link = normalized.link ?? normalized.Link ?? null;\n\n return normalized;\n }\n\n function normalizeReferences(references) {\n if (!references || typeof references !== 'object') {\n return {};\n }\n\n const normalized = {};\n\n for (const [key, value] of Object.entries(references)) {\n normalized[key] = normalizeReference(value) ?? {};\n }\n\n return normalized;\n }\n\n const renderer = new marked.Renderer();\n\n // Modify the link rendering to open in a new tab\n renderer.link = function (data) {\n var href = sanitizeUrl(data.href);\n if (!href) return data.text || '';\n return `
${data.text}`;\n };\n\n // Custom code block renderer with highlight.js integration and copy button.\n renderer.code = function (data) {\n var code = data.text || '';\n var lang = (data.lang || '').trim();\n var highlighted = code;\n\n if (typeof hljs !== 'undefined') {\n if (lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(code, { language: lang }).value;\n } catch (_) { }\n } else {\n try {\n highlighted = hljs.highlightAuto(code).value;\n } catch (_) { }\n }\n } else {\n highlighted = escapeHtmlEntities(code);\n }\n\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\n return `
${langDisplay}
${highlighted}
`;\n };\n\n // Custom image renderer for generated images with thumbnail styling and download button.\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\n renderer.image = function (data) {\n const src = sanitizeUrl(data.href);\n if (!src) return '';\n const alt = data.text || defaultConfig.generatedImageAltText;\n const maxWidth = defaultConfig.generatedImageMaxWidth;\n return `
\n \"${alt}\"\n
\n \n \n \n
\n
`;\n };\n\n // Chart counter for unique IDs\n let chartCounter = 0;\n\n // Collector for charts discovered during marked parsing.\n let _pendingCharts = [];\n\n // Global chart config map: any page (e.g., Chat Interactions) that uses\n // the shared marked instance can call window.renderPendingCharts() after\n // its DOM update to render charts it didn't create itself.\n window.__chartConfigs = window.__chartConfigs || {};\n\n function createChartHtml(chartId) {\n return `
`\n + ``\n + `
`\n + `
`\n + ``\n + `
`;\n }\n\n // Register [chart:{...json...}] as a native marked block extension so the\n // markdown parser handles chart markers inline with surrounding text.\n marked.use({\n extensions: [{\n name: 'chart',\n level: 'block',\n start(src) {\n const idx = src.indexOf('[chart:');\n return idx >= 0 ? idx : undefined;\n },\n tokenizer(src) {\n const extracted = tryExtractChartMarker(src);\n if (!extracted || extracted.startIndex !== 0) {\n return undefined;\n }\n\n const chartId = `chat_chart_${++chartCounter}`;\n\n return {\n type: 'chart',\n raw: src.substring(0, extracted.endIndex),\n chartId: chartId,\n json: extracted.json,\n };\n },\n renderer(token) {\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\n window.__chartConfigs[token.chartId] = token.json;\n return createChartHtml(token.chartId);\n }\n }]\n });\n\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\n function tryExtractChartMarker(text) {\n const token = '[chart:';\n const start = text.indexOf(token);\n if (start < 0) {\n return null;\n }\n\n // Find JSON object boundary by balancing braces\n const jsonStart = start + token.length;\n let i = jsonStart;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\n i++;\n }\n\n if (i >= text.length || text[i] !== '{') {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n\n if (inString) {\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\') {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) {\n const jsonEnd = i;\n // Expect closing bracket after JSON\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\n if (closeBracketIndex < 0) {\n return null;\n }\n\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\n return {\n startIndex: start,\n endIndex: closeBracketIndex + 1,\n json: json\n };\n }\n }\n }\n\n return null;\n }\n\n function renderChartsInMessage(message) {\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\n return;\n }\n\n // Copy and clear pending charts immediately to prevent duplicate renders.\n const charts = [...message._pendingCharts];\n message._pendingCharts = [];\n\n // Defer to requestAnimationFrame so the browser has fully laid out the\n // canvas elements before Chart.js reads their dimensions.\n requestAnimationFrame(() => {\n for (const c of charts) {\n renderChartOnCanvas(c.chartId, c.config);\n }\n });\n }\n\n function renderChartOnCanvas(chartId, config) {\n const canvas = document.getElementById(chartId);\n if (!canvas) {\n return false;\n }\n\n if (typeof Chart === 'undefined') {\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n return false;\n }\n\n // When the canvas is inside a hidden container (e.g., a widget panel with\n // display:none), it has zero dimensions and Chart.js cannot render correctly.\n // Keep the config in __chartConfigs so renderPendingCharts() can retry later\n // once the container becomes visible.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[chartId] = config;\n return false;\n }\n\n try {\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof config === 'string' ? JSON.parse(config) : config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n delete window.__chartConfigs[chartId];\n return true;\n } catch (e) {\n console.error('Error creating chart:', e);\n return false;\n }\n }\n\n // Global function: renders any chart canvases whose configs are in the\n // global __chartConfigs map. Called by pages (e.g., Chat Interactions)\n // that share the marked instance but have their own rendering pipeline.\n window.renderPendingCharts = function () {\n if (typeof Chart === 'undefined') {\n return;\n }\n\n const configs = window.__chartConfigs;\n if (!configs) {\n return;\n }\n\n requestAnimationFrame(() => {\n for (const chartId of Object.keys(configs)) {\n renderChartOnCanvas(chartId, configs[chartId]);\n }\n });\n };\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n const initialize = (instanceConfig) => {\n\n const config = Object.assign({}, defaultConfig, instanceConfig);\n config.widget = Object.assign({}, defaultConfig.widget || {}, instanceConfig && instanceConfig.widget ? instanceConfig.widget : {});\n const hasWidgetConfig = !!(instanceConfig && instanceConfig.widget && instanceConfig.widget.chatWidgetContainer && instanceConfig.widget.chatWidgetStateName);\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isSessionStarted: false,\n isPlaceholderVisible: true,\n chatWidgetStateName: null,\n chatWidgetStateSession: null,\n chatWidgetLayoutKey: null,\n chatHistorySection: null,\n widgetContainerElement: null,\n widgetToggleButtonElement: null,\n widgetResetSizeButtonElement: null,\n widgetResizeObserver: null,\n widgetViewportResizeHandler: null,\n widgetDefaultWidth: null,\n widgetDefaultHeight: null,\n widgetIsInitialized: false,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n notifications: [],\n prompt: '',\n documents: config.existingDocuments || [],\n isUploading: false,\n uploadErrors: [],\n isDragOver: false,\n documentBar: null,\n metricsEnabled: !!config.metricsEnabled,\n userLabel: config.userLabel,\n assistantLabel: config.assistantLabel,\n thumbsUpTitle: config.thumbsUpTitle,\n thumbsDownTitle: config.thumbsDownTitle,\n copyTitle: config.copyTitle,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n currentAudioUrl: null,\n ttsButton: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n ttsInstanceId: 'ai-chat-' + Math.random().toString(36).slice(2),\n singleResponseMode: !!config.singleResponseMode,\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n notificationDismissTimers: {},\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n getStoredWidgetLayout() {\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\n return {};\n }\n\n try {\n var storedLayout = localStorage.getItem(this.chatWidgetLayoutKey);\n return storedLayout ? JSON.parse(storedLayout) || {} : {};\n } catch (error) {\n console.warn('Failed to read widget layout state.', error);\n return {};\n }\n },\n saveStoredWidgetLayout(partialLayout) {\n if (!this.chatWidgetLayoutKey || !config.widget.persistLayout) {\n return;\n }\n\n var currentLayout = this.getStoredWidgetLayout();\n var nextLayout = Object.assign({}, currentLayout);\n\n if (partialLayout.panel !== undefined) {\n nextLayout.panel = Object.assign({}, currentLayout.panel || {}, partialLayout.panel || {});\n }\n\n if (partialLayout.toggle !== undefined) {\n nextLayout.toggle = Object.assign({}, currentLayout.toggle || {}, partialLayout.toggle || {});\n }\n\n localStorage.setItem(this.chatWidgetLayoutKey, JSON.stringify(nextLayout));\n },\n getElementSize(element, fallbackWidth, fallbackHeight) {\n if (!element) {\n return {\n width: fallbackWidth || 0,\n height: fallbackHeight || 0\n };\n }\n\n var rect = element.getBoundingClientRect();\n var computed = window.getComputedStyle(element);\n\n return {\n width: Math.round(rect.width || parsePixelValue(computed.width) || fallbackWidth || 0),\n height: Math.round(rect.height || parsePixelValue(computed.height) || fallbackHeight || 0)\n };\n },\n clampWidgetPosition(left, top, width, height) {\n var viewportPadding = 8;\n var maxLeft = Math.max(viewportPadding, window.innerWidth - width - viewportPadding);\n var maxTop = Math.max(viewportPadding, window.innerHeight - height - viewportPadding);\n\n return {\n left: Math.round(clamp(left, viewportPadding, maxLeft)),\n top: Math.round(clamp(top, viewportPadding, maxTop))\n };\n },\n applyAbsolutePosition(element, left, top) {\n if (!element) {\n return;\n }\n\n element.style.left = left + 'px';\n element.style.top = top + 'px';\n element.style.right = 'auto';\n element.style.bottom = 'auto';\n },\n getWidgetDefaultSize() {\n return {\n width: this.widgetDefaultWidth || parsePixelValue(config.widget.defaultWidth) || 380,\n height: this.widgetDefaultHeight || parsePixelValue(config.widget.defaultHeight) || 520\n };\n },\n persistWidgetPanelPosition() {\n if (!this.widgetContainerElement || !config.widget.persistLayout) {\n return;\n }\n\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\n this.saveStoredWidgetLayout({\n panel: {\n left: Math.round(panelRect.left),\n top: Math.round(panelRect.top)\n }\n });\n },\n persistWidgetTogglePosition() {\n if (!this.widgetToggleButtonElement || !config.widget.persistLayout) {\n return;\n }\n\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\n this.saveStoredWidgetLayout({\n toggle: {\n left: Math.round(toggleRect.left),\n top: Math.round(toggleRect.top)\n }\n });\n },\n persistWidgetPanelSize() {\n if (!this.widgetContainerElement || !config.widget.enableResizing || !config.widget.persistLayout) {\n return;\n }\n\n var defaultSize = this.getWidgetDefaultSize();\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\n\n this.saveStoredWidgetLayout({\n panel: {\n width: Math.abs(currentSize.width - defaultSize.width) <= 1 ? null : currentSize.width,\n height: Math.abs(currentSize.height - defaultSize.height) <= 1 ? null : currentSize.height\n }\n });\n },\n updateWidgetResetSizeButtonVisibility() {\n if (!this.widgetResetSizeButtonElement) {\n return;\n }\n\n if (!config.widget.enableResizing || !this.widgetContainerElement) {\n this.widgetResetSizeButtonElement.classList.add('d-none');\n return;\n }\n\n var defaultSize = this.getWidgetDefaultSize();\n var currentSize = this.getElementSize(this.widgetContainerElement, defaultSize.width, defaultSize.height);\n var isResized =\n Math.abs(currentSize.width - defaultSize.width) > 1 ||\n Math.abs(currentSize.height - defaultSize.height) > 1 ||\n !!this.widgetContainerElement.style.width ||\n !!this.widgetContainerElement.style.height;\n\n this.widgetResetSizeButtonElement.classList.toggle('d-none', !isResized);\n },\n resetWidgetSize() {\n if (!this.widgetContainerElement || !config.widget.enableResizing) {\n return;\n }\n\n this.widgetContainerElement.style.removeProperty('width');\n this.widgetContainerElement.style.removeProperty('height');\n this.persistWidgetPanelSize();\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n },\n restoreWidgetLayout() {\n var storedLayout = this.getStoredWidgetLayout();\n\n if (this.widgetContainerElement && config.widget.enableResizing) {\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.width)) {\n this.widgetContainerElement.style.width = storedLayout.panel.width + 'px';\n } else {\n this.widgetContainerElement.style.removeProperty('width');\n }\n\n if (Number.isFinite(storedLayout.panel && storedLayout.panel.height)) {\n this.widgetContainerElement.style.height = storedLayout.panel.height + 'px';\n } else {\n this.widgetContainerElement.style.removeProperty('height');\n }\n }\n\n if (this.widgetContainerElement && config.widget.enableDragging &&\n Number.isFinite(storedLayout.panel && storedLayout.panel.left) &&\n Number.isFinite(storedLayout.panel && storedLayout.panel.top)) {\n this.applyAbsolutePosition(this.widgetContainerElement, storedLayout.panel.left, storedLayout.panel.top);\n }\n\n if (this.widgetToggleButtonElement && config.widget.enableDragging &&\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.left) &&\n Number.isFinite(storedLayout.toggle && storedLayout.toggle.top)) {\n this.applyAbsolutePosition(this.widgetToggleButtonElement, storedLayout.toggle.left, storedLayout.toggle.top);\n }\n\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n },\n attachDraggableWidgetElement(element, handle, layoutKey, suppressClickOnDrag) {\n if (!element || !handle || !config.widget.enableDragging) {\n return;\n }\n\n var activePointerId = null;\n var startX = 0;\n var startY = 0;\n var startLeft = 0;\n var startTop = 0;\n var dragged = false;\n var dragThreshold = 4;\n var interactiveSelector = 'button, a, input, textarea, select, option, label';\n\n var stopDragging = (event) => {\n if (activePointerId === null) {\n return;\n }\n\n if (event && event.pointerId !== undefined && event.pointerId !== activePointerId) {\n return;\n }\n\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', stopDragging);\n document.removeEventListener('pointercancel', stopDragging);\n element.classList.remove('ai-chat-widget-dragging');\n activePointerId = null;\n\n if (!dragged) {\n return;\n }\n\n if (layoutKey === 'panel') {\n this.persistWidgetPanelPosition();\n } else if (layoutKey === 'toggle') {\n this.persistWidgetTogglePosition();\n }\n\n if (suppressClickOnDrag) {\n element.dataset.dragSuppressClick = 'true';\n window.setTimeout(() => {\n if (element.dataset.dragSuppressClick === 'true') {\n element.dataset.dragSuppressClick = 'false';\n }\n }, 0);\n }\n };\n\n var onPointerMove = (event) => {\n if (activePointerId === null || event.pointerId !== activePointerId) {\n return;\n }\n\n var deltaX = event.clientX - startX;\n var deltaY = event.clientY - startY;\n\n if (!dragged && Math.hypot(deltaX, deltaY) < dragThreshold) {\n return;\n }\n\n dragged = true;\n\n var defaultSize = this.getWidgetDefaultSize();\n var currentSize = this.getElementSize(\n element,\n layoutKey === 'panel' ? defaultSize.width : 52,\n layoutKey === 'panel' ? defaultSize.height : 52);\n var nextPosition = this.clampWidgetPosition(\n startLeft + deltaX,\n startTop + deltaY,\n currentSize.width,\n currentSize.height);\n\n this.applyAbsolutePosition(element, nextPosition.left, nextPosition.top);\n };\n\n handle.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) {\n return;\n }\n\n if (layoutKey === 'panel' && event.target.closest(interactiveSelector)) {\n return;\n }\n\n var rect = element.getBoundingClientRect();\n startX = event.clientX;\n startY = event.clientY;\n startLeft = rect.left;\n startTop = rect.top;\n dragged = false;\n activePointerId = event.pointerId;\n element.classList.add('ai-chat-widget-dragging');\n\n if (handle.setPointerCapture) {\n handle.setPointerCapture(event.pointerId);\n }\n\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', stopDragging);\n document.addEventListener('pointercancel', stopDragging);\n event.preventDefault();\n });\n },\n constrainWidgetElementsToViewport() {\n if (this.widgetContainerElement && this.widgetContainerElement.style.left) {\n var panelDefaultSize = this.getWidgetDefaultSize();\n var panelSize = this.getElementSize(this.widgetContainerElement, panelDefaultSize.width, panelDefaultSize.height);\n var panelRect = this.widgetContainerElement.getBoundingClientRect();\n var clampedPanel = this.clampWidgetPosition(panelRect.left, panelRect.top, panelSize.width, panelSize.height);\n\n this.applyAbsolutePosition(this.widgetContainerElement, clampedPanel.left, clampedPanel.top);\n\n if (config.widget.persistLayout) {\n this.persistWidgetPanelPosition();\n }\n }\n\n if (this.widgetToggleButtonElement && this.widgetToggleButtonElement.style.left) {\n var toggleSize = this.getElementSize(this.widgetToggleButtonElement, 52, 52);\n var toggleRect = this.widgetToggleButtonElement.getBoundingClientRect();\n var clampedToggle = this.clampWidgetPosition(toggleRect.left, toggleRect.top, toggleSize.width, toggleSize.height);\n\n this.applyAbsolutePosition(this.widgetToggleButtonElement, clampedToggle.left, clampedToggle.top);\n\n if (config.widget.persistLayout) {\n this.persistWidgetTogglePosition();\n }\n }\n },\n handleDragOver(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = true;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.add('ai-chat-drag-over');\n },\n handleDragLeave(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = false;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\n },\n handleDrop(e) {\n if (!config.sessionDocumentsEnabled) return;\n e.preventDefault();\n e.stopPropagation();\n this.isDragOver = false;\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) inputArea.classList.remove('ai-chat-drag-over');\n if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.uploadFiles(e.dataTransfer.files);\n }\n },\n triggerFileInput() {\n if (!config.sessionDocumentsEnabled) return;\n var fileInput = document.getElementById('ai-chat-doc-input');\n if (fileInput) fileInput.click();\n },\n handleFileInputChange(e) {\n var files = e.target.files;\n if (files && files.length > 0) {\n this.uploadFiles(files);\n }\n e.target.value = '';\n },\n async uploadFiles(files) {\n if (!config.uploadDocumentUrl) return;\n\n var sessionId = this.getSessionId();\n var profileId = this.getProfileId();\n\n if (!sessionId && !profileId) {\n console.warn('Cannot upload documents without a session or profile.');\n return;\n }\n\n this.isUploading = true;\n this.uploadErrors = [];\n this.renderDocumentBar();\n try {\n var formData = new FormData();\n if (sessionId) {\n formData.append('sessionId', sessionId);\n } else {\n formData.append('profileId', profileId);\n }\n for (var i = 0; i < files.length; i++) {\n formData.append('files', files[i]);\n }\n\n var response = await fetch(config.uploadDocumentUrl, {\n method: 'POST',\n body: formData\n });\n\n if (!response.ok) {\n var errorText = await response.text();\n var uploadError = this.extractReadableErrorMessage(errorText, 'Upload failed. Please try again.');\n console.error('Upload failed:', errorText);\n this.uploadErrors = [{ fileName: '', error: uploadError }];\n return;\n }\n\n var result = await response.json();\n\n // If the server created a new session, initialize it.\n if (result.sessionId && !sessionId) {\n this.initializeSession(result.sessionId);\n }\n\n if (result.uploaded && result.uploaded.length > 0) {\n for (var j = 0; j < result.uploaded.length; j++) {\n this.documents.push(result.uploaded[j]);\n }\n }\n if (result.failed && result.failed.length > 0) {\n this.uploadErrors = result.failed;\n }\n } catch (err) {\n console.error('Upload error:', err);\n this.uploadErrors = [{ fileName: '', error: 'Upload failed. Please try again.' }];\n } finally {\n this.isUploading = false;\n this.renderDocumentBar();\n }\n },\n async removeDocument(doc) {\n if (!config.removeDocumentUrl) return;\n\n try {\n var sessionId = this.getSessionId();\n var response = await fetch(config.removeDocumentUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ itemId: sessionId, documentId: doc.documentId })\n });\n\n if (response.ok) {\n var idx = this.documents.indexOf(doc);\n if (idx > -1) this.documents.splice(idx, 1);\n } else {\n var errorText = await response.text();\n var removeError = this.extractReadableErrorMessage(errorText, 'Failed to remove document. Please try again.');\n console.error('Failed to remove document:', response.status, errorText);\n this.uploadErrors = [{ fileName: doc.fileName || '', error: removeError }];\n this.renderDocumentBar();\n }\n } catch (err) {\n console.error('Remove document error:', err);\n this.uploadErrors = [{ fileName: doc.fileName || '', error: 'Failed to remove document. Please try again.' }];\n this.renderDocumentBar();\n }\n },\n formatFileSize(bytes) {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n },\n renderDocumentBar() {\n if (!this.documentBar) return;\n\n if (!config.sessionDocumentsEnabled) {\n this.documentBar.classList.add('d-none');\n return;\n }\n\n this.documentBar.classList.remove('d-none');\n\n var html = '
';\n html += '
';\n\n for (var i = 0; i < this.documents.length; i++) {\n var doc = this.documents[i];\n var name = doc.fileName || 'Document';\n if (name.length > 20) name = name.substring(0, 17) + '...';\n html += '';\n html += ' ';\n html += this.escapeHtml(name);\n html += ' ';\n html += '';\n }\n\n for (var m = 0; m < this.uploadErrors.length; m++) {\n var failedItem = this.uploadErrors[m];\n var failedName = failedItem.fileName || 'File';\n var errorMsg = failedItem.error || 'Upload failed';\n if (failedName.length > 15) failedName = failedName.substring(0, 12) + '...';\n html += '';\n html += ' ';\n html += this.escapeHtml(failedName);\n html += ' ';\n html += '';\n }\n\n if (this.isUploading) {\n html += '';\n html += ' Uploading...';\n html += '';\n }\n\n html += '';\n html += '
';\n if (config.supportedExtensionsText) {\n html += '
Supported formats: ' + this.escapeHtml(config.supportedExtensionsText) + '
';\n }\n\n html += '
';\n\n this.documentBar.replaceChildren(DOMPurify.sanitize(html, { RETURN_DOM_FRAGMENT: true }));\n\n // Bind remove handlers\n var self = this;\n var closeButtons = this.documentBar.querySelectorAll('[data-doc-index]');\n for (var j = 0; j < closeButtons.length; j++) {\n closeButtons[j].addEventListener('click', (function (idx) {\n return function (e) {\n e.preventDefault();\n e.stopPropagation();\n var docToRemove = self.documents[idx];\n if (docToRemove) self.removeDocument(docToRemove);\n };\n })(parseInt(closeButtons[j].getAttribute('data-doc-index'))));\n }\n\n // Bind error dismiss handlers\n var errorCloseButtons = this.documentBar.querySelectorAll('[data-error-index]');\n for (var n = 0; n < errorCloseButtons.length; n++) {\n errorCloseButtons[n].addEventListener('click', (function (idx) {\n return function (e) {\n e.preventDefault();\n e.stopPropagation();\n self.uploadErrors.splice(idx, 1);\n self.renderDocumentBar();\n };\n })(parseInt(errorCloseButtons[n].getAttribute('data-error-index'))));\n }\n\n // Bind add button\n var addBtn = this.documentBar.querySelector('.ai-chat-doc-add-btn');\n if (addBtn) {\n addBtn.addEventListener('click', function (e) {\n e.preventDefault();\n self.triggerFileInput();\n });\n }\n },\n escapeHtml(text) {\n var div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n },\n extractReadableErrorMessage(errorText, fallbackMessage) {\n if (!errorText || typeof errorText !== 'string') {\n return fallbackMessage;\n }\n\n var trimmed = errorText.trim();\n if (!trimmed) {\n return fallbackMessage;\n }\n\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n try {\n var parsed = JSON.parse(trimmed);\n var message = parsed?.error || parsed?.message || parsed?.title || parsed?.detail;\n return typeof message === 'string' && message.trim()\n ? message.trim()\n : fallbackMessage;\n } catch (err) {\n return fallbackMessage;\n }\n }\n\n if (/<[^>]+>/.test(trimmed)) {\n return fallbackMessage;\n }\n\n return trimmed;\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : this.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadSession\", (data) => {\n this.initializeSession(data.sessionId, true);\n this.messages = [];\n this.documents = data.documents || [];\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n\n // Update feedback icons in the DOM after all messages have rendered.\n this.$nextTick(() => {\n this.refreshAllFeedbackIcons();\n });\n\n // When the session is new (no messages) and an initial prompt is configured,\n // automatically send it as the first user message to trigger an AI response.\n if (this.messages.length === 0 && config.initialPrompt) {\n this.prompt = config.initialPrompt;\n this.sendMessage();\n }\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // If this is a widget with a stale cached session (e.g., profile was deleted),\n // clear the cached session and start fresh with the current profile.\n if (this.widgetIsInitialized && !this.isSessionStarted && !this._attemptedSessionRecovery) {\n this._attemptedSessionRecovery = true;\n localStorage.removeItem(this.chatWidgetStateSession);\n this.startNewSession();\n }\n });\n\n this.connection.on(\"MessageRated\", (messageId, userRating) => {\n var msg = this.messages.find(m => m.id === messageId);\n if (msg) {\n msg.userRating = userRating;\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (sessionId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (sessionId, text) => {\n if (text) {\n this.stopAudio();\n\n // If there's an interrupted assistant message still streaming,\n // mark it as done to stop the spinner animation.\n if (this._conversationAssistantMessage) {\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\n if (oldMsg) {\n oldMsg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (sessionId, messageId, token, responseId, appearance) => {\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n userRating: null,\n appearance: this.normalizeAssistantAppearance(appearance),\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.content = this._conversationAssistantMessage.content;\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (sessionId, messageId) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (sessionId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n this.audioChunks.push(bytes);\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (sessionId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n\n if (this.isSessionStarted) {\n this.reloadCurrentSession();\n } else if (config.autoCreateSession) {\n this.startNewSession();\n }\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingOpenAIPromotMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedOpenAIPromotMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n\n // Ensure userRating is always defined for Vue reactivity.\n if (message.userRating === undefined) {\n message.userRating = null;\n }\n\n if (message.content) {\n let processedContent = message.content.trim();\n message.references = normalizeReferences(message.references);\n\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\n\n // Only include references that were actually cited in the response.\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\n\n if (citedRefs.length) {\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders.\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\n processedContent = processedContent.replaceAll('
', ',');\n\n processedContent += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || key;\n processedContent += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n }\n }\n\n message.content = processedContent;\n message.htmlContent = parseMarkdownContent(processedContent, message);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n addMessages(messages) {\n\n for (let i = 0; i < messages.length; i++) {\n this.addMessageInternal(messages[i]);\n }\n\n this.hidePlaceholder();\n this.$nextTick(() => {\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n isOrchestratorAvailable() {\n return config.isOrchestratorAvailable !== false;\n },\n applyOrchestratorAvailability() {\n if (this.isOrchestratorAvailable()) {\n return true;\n }\n\n const unavailableMessage = config.orchestratorUnavailableMessage || \"This orchestrator is not currently available.\";\n\n if (this.inputElement) {\n this.inputElement.disabled = true;\n this.inputElement.value = '';\n this.inputElement.placeholder = unavailableMessage;\n }\n\n if (this.buttonElement) {\n this.buttonElement.disabled = true;\n }\n\n if (this.micButtonElement) {\n this.micButtonElement.disabled = true;\n this.micButtonElement.style.display = 'none';\n }\n\n if (this.conversationButtonElement) {\n this.conversationButtonElement.disabled = true;\n this.conversationButtonElement.style.display = 'none';\n }\n\n return false;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n sendMessage() {\n if (!this.applyOrchestratorAvailability()) {\n return;\n }\n\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // In single-response mode, clear all previous messages.\n if (this.singleResponseMode) {\n this.messages.splice(0, this.messages.length);\n }\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n this.streamMessage(this.getProfileId(), trimmedPrompt, null);\n this.inputElement.value = '';\n this.prompt = '';\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var profileId = this.getProfileId();\n var sessionId = this.getSessionId() || '';\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", profileId, sessionId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n },\n streamMessage(profileId, trimmedPrompt, sessionProfileId) {\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n // Get the index after showing typing indicator.\n var messageIndex = this.messages.length;\n var currentSessionId = this.getSessionId();\n\n this.stream = this.connection.stream(\"SendMessage\", profileId, trimmedPrompt, currentSessionId, sessionProfileId)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n\n if (chunk.sessionId && !currentSessionId) {\n this.initializeSession(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n // Re-assign the index after hiding the typing indicator.\n messageIndex = this.messages.length;\n let newMessage = {\n id: chunk.messageId,\n role: \"assistant\",\n title: chunk.title,\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n userRating: null,\n };\n\n this.messages.push(newMessage);\n\n message = newMessage;\n }\n\n if (chunk.title && (!message.title || message.title !== chunk.title)) {\n message.title = chunk.title;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = normalizeReference(value) ?? {};\n }\n }\n\n if (chunk.content) {\n\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n let processedContent = chunk.content;\n\n for (const [key, value] of Object.entries(references)) {\n processedContent = processedContent.replaceAll(key, `${value.index}`);\n }\n\n // Append processed content to the message.\n // if we have multiple references, add a comma to ensure we don't concatenate numbers.\n content += processedContent.replaceAll('
', ',');\n }\n\n // Update the existing message\n message.content = content;\n\n message.htmlContent = parseMarkdownContent(content, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n let newMessage = {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n\n return newMessage;\n },\n processReferences(references, messageIndex) {\n references = normalizeReferences(references);\n\n if (Object.keys(references).length) {\n\n let message = this.messages[messageIndex];\n const content = message.content || '';\n\n // Only include references that were actually cited in the response.\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\n const citedRefs = Object.entries(references).filter(([key, value]) =>\n content.includes(key) || content.includes(`${value.index}`)\n );\n\n if (!citedRefs.length) {\n return;\n }\n\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\n let processed = content.trim();\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processed = processed.replaceAll(key, placeholder);\n processed = processed.replaceAll(`${value.index}`, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processed = processed.replaceAll('', ',');\n\n processed += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || key;\n processed += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n\n message.content = processed;\n message.htmlContent = parseMarkdownContent(processed, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n if (this.inputElement) {\n this.inputElement.setAttribute('disabled', 'disabled');\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n if (this.inputElement) {\n this.inputElement.removeAttribute('disabled');\n this.inputElement.focus();\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n },\n handleExternalTtsStop(e) {\n if (e?.detail?.sourceId === this.ttsInstanceId) {\n return;\n }\n\n this.stopAudio(false);\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getProfileId(), this.getSessionId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio(false);\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\n detail: { sourceId: this.ttsInstanceId }\n }));\n this.ttsPlayingMessageIndex = index;\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.currentAudioElement && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is already playing, queue this blob for sequential playback.\n if (this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioUrl = url;\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n var nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n if (this.currentAudioUrl) {\n URL.revokeObjectURL(this.currentAudioUrl);\n this.currentAudioUrl = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n // During TTS playback, detect when the user speaks above\n // the threshold to stop TTS (interrupt). Audio chunks are\n // always forwarded — browser echo cancellation handles\n // speaker echo so the STT stream has no gaps.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var profileId = this.getProfileId();\n var sessionId = this.getSessionId() || '';\n var language = navigator.language || document.documentElement.lang || 'en-US';\n\n this.connection.send(\"StartConversation\", profileId, sessionId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, audio playback continuation\n // is handled by the persistent stream. This method is only\n // called from playCollectedAudio for non-conversation TTS.\n },\n generatePrompt(element) {\n if (!element) {\n console.error('The element paramter is required.');\n\n return;\n }\n\n let templateProfileId = element.getAttribute('data-profile-id');\n let sessionId = this.getSessionId();\n let sessionProfileId = this.getProfileId();\n\n if (!templateProfileId || !sessionId) {\n\n console.error('The given element is missing data-profile-id or the session has not yet started.');\n return;\n }\n\n // streamMessage() already shows the typing indicator.\n this.streamMessage(templateProfileId, null, sessionProfileId);\n },\n createSessionUrl(baseUrl, param, value) {\n\n const fullUrl = baseUrl.toLowerCase().startsWith('http') ? baseUrl : window.location.origin + baseUrl;\n const url = new URL(fullUrl);\n\n url.searchParams.set(param, value);\n\n return url.toString();\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\n if (existingIndex >= 0) {\n this.notifications.splice(existingIndex, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.$nextTick(() => {\n this.scrollToBottom();\n });\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var existingIndex = this.notifications.findIndex(n => n.type === notification.type);\n if (existingIndex >= 0) {\n this.notifications.splice(existingIndex, 1, notification);\n this.scheduleNotificationDismiss(notification);\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var sessionId = this.getSessionId();\n this.connection.invoke(\"HandleNotificationAction\", sessionId, notificationType, actionName).catch(function (err) {\n console.error(\"Error handling notification action:\", err);\n });\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getProfileId() {\n return this.inputElement.getAttribute('data-profile-id');\n },\n setSessionId(sessionId) {\n this.inputElement.setAttribute('data-session-id', sessionId || '');\n },\n resetSession() {\n this.stopRecording();\n this.setSessionId('');\n this.isSessionStarted = false;\n this.sessionRating = null;\n if (this.widgetIsInitialized) {\n localStorage.removeItem(this.chatWidgetStateSession);\n }\n this.messages = [];\n this.documents = [];\n if (!config.autoCreateSession) {\n this.showPlaceholder();\n }\n\n if (config.autoCreateSession) {\n this.startNewSession();\n }\n },\n startNewSession() {\n if (!this.applyOrchestratorAvailability()) {\n return;\n }\n\n const profileId = this.getProfileId();\n if (!profileId || !this.connection) {\n return;\n }\n\n this.connection.invoke(\"StartSession\", profileId, null).catch(err => console.error(err));\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n this.applyOrchestratorAvailability();\n\n const sessionId = this.getSessionId();\n if (!hasWidgetConfig && sessionId) {\n this.loadSession(sessionId);\n } else if (this.isOrchestratorAvailable() && config.autoCreateSession && !hasWidgetConfig && !sessionId) {\n this.startNewSession();\n }\n\n // Initialize document bar if enabled.\n if (config.sessionDocumentsEnabled && config.documentBarSelector) {\n this.documentBar = document.querySelector(config.documentBarSelector);\n if (this.documentBar) {\n this.renderDocumentBar();\n\n // Create hidden file input for document uploads.\n var fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.id = 'ai-chat-doc-input';\n fileInput.className = 'd-none';\n fileInput.multiple = true;\n if (config.allowedExtensions) {\n fileInput.accept = config.allowedExtensions;\n }\n fileInput.addEventListener('change', (e) => this.handleFileInputChange(e));\n this.documentBar.parentElement.appendChild(fileInput);\n\n // Set up drag-and-drop on the input area.\n var inputArea = this.inputElement ? this.inputElement.closest('.ai-admin-widget-input, .text-bg-light') : null;\n if (inputArea) {\n inputArea.addEventListener('dragover', (e) => this.handleDragOver(e));\n inputArea.addEventListener('dragleave', (e) => this.handleDragLeave(e));\n inputArea.addEventListener('drop', (e) => this.handleDrop(e));\n }\n }\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keydown', event => {\n\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.buttonElement.addEventListener('click', () => {\n\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const promptGenerators = document.getElementsByClassName('profile-generated-prompt');\n\n for (var i = 0; i < promptGenerators.length; i++) {\n promptGenerators[i].addEventListener('click', (e) => {\n e.preventDefault();\n this.generatePrompt(e.target);\n });\n }\n\n const chatSessions = document.getElementsByClassName('chat-session-history-item');\n\n for (var i = 0; i < chatSessions.length; i++) {\n chatSessions[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var sessionId = e.target.getAttribute('data-session-id');\n\n if (!sessionId) {\n console.error('an element with the class chat-session-history-item with no data-session-id set.');\n\n return;\n }\n\n this.loadSession(sessionId);\n this.showChatScreen();\n });\n }\n\n for (let i = 0; i < config.messages.length; i++) {\n this.addMessage(config.messages[i]);\n }\n\n // Update feedback icons in the DOM after initial messages have rendered.\n this.$nextTick(() => {\n this.refreshAllFeedbackIcons();\n });\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n },\n loadSession(sessionId) {\n this.connection.invoke(\"LoadSession\", sessionId).catch(err => console.error(err));\n },\n reloadCurrentSession() {\n\n var sessionId = this.getSessionId();\n if (sessionId) {\n this.loadSession(sessionId);\n }\n },\n initializeSession(sessionId, force) {\n if (this.isSessionStarted && !force) {\n return\n }\n this.fireEvent(new CustomEvent(\"initializingSessionOpenAIChat\", { detail: { sessionId: sessionId } }))\n this.setSessionId(sessionId);\n this.isSessionStarted = true;\n\n if (this.widgetIsInitialized) {\n localStorage.setItem(this.chatWidgetStateSession, sessionId);\n }\n },\n initializeWidget() {\n\n if (!config.widget.chatWidgetContainer) {\n console.error('The widget chatWidgetContainer is required.');\n return;\n }\n\n if (!config.widget.chatWidgetStateName) {\n console.error('The widget chatWidgetStateName is required.');\n return;\n }\n\n const chatWidgetContainer = document.querySelector(config.widget.chatWidgetContainer);\n\n if (!chatWidgetContainer) {\n return;\n }\n\n if (config.widget.chatHistorySection) {\n this.chatHistorySection = document.querySelector(config.widget.chatHistorySection);\n }\n\n this.chatWidgetStateName = config.widget.chatWidgetStateName;\n this.chatWidgetStateSession = config.widget.chatWidgetStateName + 'Session';\n this.chatWidgetLayoutKey = config.widget.chatWidgetStateName + 'Layout';\n this.widgetContainerElement = chatWidgetContainer;\n this.widgetToggleButtonElement = config.widget.toggleButtonSelector\n ? document.querySelector(config.widget.toggleButtonSelector)\n : null;\n this.widgetResetSizeButtonElement = config.widget.resetSizeButtonSelector\n ? document.querySelector(config.widget.resetSizeButtonSelector)\n : null;\n this.widgetDefaultWidth = parsePixelValue(config.widget.defaultWidth) ||\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).width) ||\n 380;\n this.widgetDefaultHeight = parsePixelValue(config.widget.defaultHeight) ||\n parsePixelValue(window.getComputedStyle(chatWidgetContainer).height) ||\n 520;\n this.widgetIsInitialized = true;\n\n if (config.widget.enableResizing) {\n chatWidgetContainer.classList.add('ai-chat-widget-resizable');\n chatWidgetContainer.style.minWidth = (parsePixelValue(config.widget.minWidth) || 320) + 'px';\n chatWidgetContainer.style.minHeight = (parsePixelValue(config.widget.minHeight) || 420) + 'px';\n\n if (typeof ResizeObserver !== 'undefined') {\n this.widgetResizeObserver = new ResizeObserver(() => {\n this.persistWidgetPanelSize();\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n });\n\n this.widgetResizeObserver.observe(chatWidgetContainer);\n }\n }\n\n var dragHandleSelector = config.widget.dragHandleSelector || '.ai-chat-widget-header';\n var dragHandle = chatWidgetContainer.querySelector(dragHandleSelector);\n\n if (config.widget.enableDragging && dragHandle) {\n dragHandle.classList.add('ai-chat-widget-drag-handle');\n chatWidgetContainer.classList.add('ai-chat-widget-draggable');\n this.attachDraggableWidgetElement(chatWidgetContainer, dragHandle, 'panel', false);\n }\n\n if (config.widget.enableDragging && this.widgetToggleButtonElement) {\n this.widgetToggleButtonElement.classList.add('ai-chat-widget-draggable');\n this.attachDraggableWidgetElement(this.widgetToggleButtonElement, this.widgetToggleButtonElement, 'toggle', true);\n }\n\n if (this.widgetResetSizeButtonElement) {\n this.widgetResetSizeButtonElement.addEventListener('click', (event) => {\n event.preventDefault();\n this.resetWidgetSize();\n });\n }\n\n this.restoreWidgetLayout();\n\n if (!this.widgetViewportResizeHandler) {\n this.widgetViewportResizeHandler = () => {\n this.constrainWidgetElementsToViewport();\n this.updateWidgetResetSizeButtonVisibility();\n };\n\n window.addEventListener('resize', this.widgetViewportResizeHandler);\n }\n\n // Auto-load the last session so the user always sees previous chat history.\n this.reloadCurrentSession();\n\n if (config.autoCreateSession && !this.getSessionId()) {\n this.startNewSession();\n }\n\n if (config.widget.showHistoryButton && this.chatHistorySection) {\n\n const showHistoryButton = document.querySelector(config.widget.showHistoryButton);\n\n if (showHistoryButton) {\n showHistoryButton.addEventListener('click', () => {\n this.chatHistorySection.classList.toggle('show');\n });\n }\n\n if (config.widget.closeHistoryButton) {\n var closeHistoryButton = document.querySelector(config.widget.closeHistoryButton);\n\n if (closeHistoryButton) {\n closeHistoryButton.addEventListener('click', () => {\n this.showChatScreen();\n });\n }\n }\n }\n\n if (config.widget.newChatButton) {\n const newChatButton = document.querySelector(config.widget.newChatButton);\n\n if (newChatButton) {\n newChatButton.addEventListener('click', () => {\n this.resetSession();\n this.showChatScreen();\n });\n }\n }\n },\n showChatScreen() {\n\n if (!this.chatHistorySection) {\n return;\n }\n\n this.chatHistorySection.classList.remove('show');\n },\n getSessionId() {\n let sessionId = this.inputElement.getAttribute('data-session-id');\n\n if (!sessionId && this.widgetIsInitialized) {\n sessionId = localStorage.getItem(this.chatWidgetStateSession);\n }\n\n return sessionId;\n },\n copyResponse(message) {\n navigator.clipboard.writeText(message);\n },\n updateFeedbackIcons(container, userRating) {\n if (!container) {\n return;\n }\n\n var upBtn = container.querySelector('.rate-up-btn');\n var downBtn = container.querySelector('.rate-down-btn');\n\n // Font Awesome SVG+JS replaces with , so we must replace\n // the entire button content and let Font Awesome re-process.\n if (upBtn) {\n var upClass = userRating === true ? 'fa-solid fa-thumbs-up' : 'fa-regular fa-thumbs-up';\n var upIcon = document.createElement('i');\n upIcon.className = upClass;\n upIcon.style.fontSize = '0.9rem';\n upBtn.textContent = '';\n upBtn.appendChild(upIcon);\n }\n\n if (downBtn) {\n var downClass = userRating === false ? 'fa-solid fa-thumbs-down' : 'fa-regular fa-thumbs-down';\n var downIcon = document.createElement('i');\n downIcon.className = downClass;\n downIcon.style.fontSize = '0.9rem';\n downBtn.textContent = '';\n downBtn.appendChild(downIcon);\n }\n\n // Trigger Font Awesome SVG+JS to convert the new elements.\n if (window.FontAwesome && FontAwesome.dom && FontAwesome.dom.i2svg) {\n FontAwesome.dom.i2svg({ node: container });\n }\n },\n refreshAllFeedbackIcons() {\n var containers = this.$el.querySelectorAll('.ai-chat-message-assistant-feedback');\n\n for (var i = 0; i < containers.length; i++) {\n var msgId = containers[i].getAttribute('data-message-id');\n var msg = this.messages.find(m => m.id === msgId);\n\n if (msg) {\n this.updateFeedbackIcons(containers[i], msg.userRating);\n }\n }\n },\n rateMessage(message, isPositive, event) {\n var sessionId = this.getSessionId();\n\n if (!sessionId || !message.id || !this.connection) {\n return;\n }\n\n // Toggle: clicking the same rating again clears it.\n var newRating = message.userRating === isPositive ? null : isPositive;\n message.userRating = newRating;\n\n // Find the feedback container by message ID for reliable DOM targeting.\n var feedbackContainer = this.$el.querySelector(\n '.ai-chat-message-assistant-feedback[data-message-id=\"' + message.id + '\"]'\n );\n\n this.updateFeedbackIcons(feedbackContainer, newRating);\n\n // Trigger spark animation after Font Awesome has re-processed icons.\n if (newRating !== null && feedbackContainer) {\n setTimeout(() => {\n var btnClass = isPositive ? '.rate-up-btn' : '.rate-down-btn';\n var btn = feedbackContainer.querySelector(btnClass);\n\n if (btn) {\n btn.classList.remove('spark-effect');\n void btn.offsetWidth;\n btn.classList.add('spark-effect');\n btn.addEventListener('animationend', function onEnd() {\n btn.removeEventListener('animationend', onEnd);\n btn.classList.remove('spark-effect');\n });\n }\n }, 50);\n }\n\n this.connection.invoke(\"RateMessage\", sessionId, message.id, isPositive).catch(function (err) {\n console.error('Failed to rate message:', err);\n });\n }\n },\n watch: {\n documents: {\n handler() { this.renderDocumentBar(); },\n deep: true\n },\n isUploading() { this.renderDocumentBar(); },\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n // Hide/show mic button.\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n // Hide/show send button.\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n // Disable/enable textarea.\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n if (hasWidgetConfig) {\n this.initializeWidget();\n }\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n\n this.stopAudio(false);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n return {\n initialize: initialize\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map index 703f813c..af8c69f5 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.js.map @@ -1 +1 @@ -{"version":3,"sources":["chat-interaction.js"],"names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_arrayLikeToArray","toString","slice","constructor","name","from","test","window","chatInteractionManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","codeCopiedText","assistantLabel","messageTemplate","indicatorTemplate","untitledText","clearHistoryTitle","clearHistoryMessage","clearHistoryOkText","clearHistoryCancelText","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","renderer","marked","Renderer","link","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","__chartConfigs","createChartHtml","chartId","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","tryExtractChartMarker","startIndex","type","raw","substring","endIndex","json","token","push","config","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","renderChartsInMessage","message","charts","requestAnimationFrame","_iterator","_step","canvas","getElementById","Chart","console","warn","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","err","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","initialize","instanceConfig","assign","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isInteractionStarted","isPlaceholderVisible","isStreaming","isNavigatingAway","autoScroll","stream","messages","prompt","initialFieldValues","Map","settingsDirty","saveSettingsTimeout","saveIndicatorTimeout","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","Math","random","conversationModeEnabled","conversationButton","isConversationMode","notifications","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","startConnection","_this","_callee","_t","_context","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","initializeInteraction","itemId","titleInput","querySelector","title","forEach","msg","addMessage","$nextTick","historyItem","showSaveIndicator","stopRecording","isFinal","_conversationPartialTranscript","escaped","replace","_conversationPartialMessage","hidePlaceholder","htmlContent","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","index","messageId","responseId","appearance","hideTypingIndicator","j","msgIndex","newMessage","id","normalizeAssistantAppearance","base64Audio","contentType","binaryString","atob","bytes","Uint8Array","charCodeAt","playCollectedAudio","showPlaceholder","clearHistoryBtn","classList","add","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentInteraction","onclose","addMessageInternal","_this2","fireEvent","CustomEvent","detail","_this3","processedContent","references","_typeof","keys","citedRefs","entries","filter","_ref","_ref2","_slicedToArray","key","includes","sort","_ref3","_ref4","_ref5","_ref6","b","displayIndex","_iterator2","_step2","_step2$value","replaceAll","_displayIndex","_placeholder","_iterator3","_step3","_step3$value","_iterator4","_step4","_step4$value","label","remove","event","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","isIndicator","sendMessage","_this4","_callee2","trimmedPrompt","_context2","flushPendingSave","streamMessage","_this5","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentItemId","getItemId","subscribe","chunk","sessionId","setItemId","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","complete","_this5$stream","processReferences","streamingFinished","synthesizeSpeech","_this5$stream2","getServiceDownMessage","_this6","_ref7","_ref8","_ref9","_ref0","_ref1","_ref10","processed","_iterator5","_step5","_step5$value","_iterator6","_step6","_step6$value","_iterator7","_step7","_step7$value","stopIcon","getAttribute","replaceChildren","RETURN_DOM_FRAGMENT","startIcon","icons","querySelectorAll","debouncedSaveSettings","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this7","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","totalLength","reduce","sum","combined","offset","_iterator8","_step8","set","blob","Blob","_this8","URL","createObjectURL","audio","Audio","addEventListener","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this9","updateConversationButton","navigator","mediaDevices","getUserMedia","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","_conversationSubject","Subject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","micSource","createMediaStreamSource","connect","pendingChunk","analyser","interruptVolumeThreshold","size","freqData","frequencyBinCount","getByteFrequencyData","k","avg","_callee3","uint8Array","base64","_context3","arrayBuffer","str","byte","String","fromCharCode","btoa","getTracks","track","stop","documentElement","send","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","originalLength","removedCount","_this0","setTimeout","scrollTop","scrollHeight","clientHeight","handleUserInput","target","getSaveIndicatorElement","saveIndicatorElementSelector","className","_this1","indicator","clearTimeout","clearPendingSettingsSave","getFieldLabel","input","_input$closest","closest","dataset","setting","getValidationFeedbackElement","feedback","nextElementSibling","contains","insertAdjacentElement","clearSettingValidationError","removeAttribute","setSettingValidationError","setAttribute","getSettingValidationMessage","disabled","number","Number","fieldLabel","isNaN","min","max","validateSettingInput","validateSettings","_this10","isValid","getSettingInputs","queueSettingsSave","explicitInputs","getSelectedGroupValues","groupName","fallbackSelector","explicitSelections","values","checkbox","checkboxes","baseName","hiddenInput","getPromptTemplateSelections","promptTemplates","card","templateIdInput","promptParametersInput","templateId","promptParameters","clearNotificationDismiss","findIndex","splice","scheduleNotificationDismiss","_this11","timerId","dismissNotification","handleNotificationAction","actionName","resetInteraction","initializeApp","_this12","placeholderElementSelector","loadInteraction","threshold","atBottom","shiftKey","click","lastMsg","pop","chatInteractionItems","getElementsByClassName","preventDefault","btn","block","codeEl","clipboard","writeText","copiedText","matches","clearHistory","micButtonElementSelector","style","display","toggleRecording","conversationButtonElementSelector","self","confirmDialog","okText","cancelText","callback","confirmed","_this13","saveSettings","getSelectedToolNames","getSelectedMcpConnectionIds","getSelectedA2AConnectionIds","getSelectedAgentNames","_this14","settings","inputs","match","toLowerCase","checked","parseFloat","toolNames","mcpConnectionIds","a2aConnectionIds","agentNames","promptTemplateIds","map","template","force","copyResponse","startRecording","_this15","subject","_callee4","_context4","updateMicButton","watch","active","mounted","_this16","_callee5","_context5","beforeUnmount","removeEventListener","mount","download","toDataURL","container","img","startsWith","fetch","res","body","appendChild","removeChild"],"mappings":"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","file":"chat-interaction.js","sourcesContent":["window.chatInteractionManager = function () {\r\n\r\n // Defaults (can be overridden by instanceConfig)\r\n var defaultConfig = {\r\n // UI defaults for generated media\r\n generatedImageAltText: 'Generated Image',\r\n generatedImageMaxWidth: 400,\r\n downloadImageTitle: 'Download image',\r\n downloadChartTitle: 'Download chart as image',\r\n downloadChartButtonText: 'Download',\r\n codeCopiedText: 'Copied!',\r\n assistantLabel: 'Assistant',\r\n\r\n messageTemplate: `\r\n
\r\n
\r\n
\r\n
You
\r\n
\r\n \r\n {{ getAssistantLabel(message) }}\r\n
\r\n
\r\n

{{ message.title }}

\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{ notification.content }}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n `,\r\n indicatorTemplate: `\r\n
\r\n \r\n Assistant\r\n
\r\n `,\r\n // Localizable strings\r\n untitledText: 'Untitled',\r\n clearHistoryTitle: 'Clear History',\r\n clearHistoryMessage: 'Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.',\r\n clearHistoryOkText: 'Yes',\r\n clearHistoryCancelText: 'Cancel'\r\n };\r\n\r\n // Sanitize URLs to prevent javascript: protocol injection.\r\n function sanitizeUrl(url) {\r\n if (!url) return '';\r\n var trimmed = url.trim();\r\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\r\n return '';\r\n }\r\n return url;\r\n }\r\n\r\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\r\n function escapeHtmlEntities(text) {\r\n var span = document.createElement('span');\r\n span.textContent = text;\r\n return span.innerHTML;\r\n }\r\n\r\n const renderer = new marked.Renderer();\r\n\r\n // Modify the link rendering to open in a new tab\r\n renderer.link = function (data) {\r\n var href = sanitizeUrl(data.href);\r\n if (!href) return data.text || '';\r\n return `
${data.text}`;\r\n };\r\n\r\n // Custom code block renderer with highlight.js integration and copy button.\r\n renderer.code = function (data) {\r\n var code = data.text || '';\r\n var lang = (data.lang || '').trim();\r\n var highlighted = code;\r\n\r\n if (typeof hljs !== 'undefined') {\r\n if (lang && hljs.getLanguage(lang)) {\r\n try {\r\n highlighted = hljs.highlight(code, { language: lang }).value;\r\n } catch (_) { }\r\n } else {\r\n try {\r\n highlighted = hljs.highlightAuto(code).value;\r\n } catch (_) { }\r\n }\r\n } else {\r\n highlighted = escapeHtmlEntities(code);\r\n }\r\n\r\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\r\n return `
${langDisplay}
${highlighted}
`;\r\n };\r\n\r\n // Custom image renderer for generated images with thumbnail styling and download button.\r\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\r\n renderer.image = function (data) {\r\n const src = sanitizeUrl(data.href);\r\n if (!src) return '';\r\n const alt = data.text || defaultConfig.generatedImageAltText;\r\n const maxWidth = defaultConfig.generatedImageMaxWidth;\r\n return `
\r\n \"${alt}\"\r\n
\r\n \r\n \r\n \r\n
\r\n
`;\r\n };\r\n\r\n // Chart counter for unique IDs\r\n let chartCounter = 0;\r\n\r\n // Collector for charts discovered during marked parsing.\r\n let _pendingCharts = [];\r\n\r\n // Global chart config map shared with ai-chat.js\r\n window.__chartConfigs = window.__chartConfigs || {};\r\n\r\n function createChartHtml(chartId) {\r\n return `
`\r\n + ``\r\n + `
`\r\n + `
`\r\n + ``\r\n + `
`;\r\n }\r\n\r\n // Register [chart:{...json...}] as a native marked block extension so the\r\n // markdown parser handles chart markers inline with surrounding text.\r\n marked.use({\r\n extensions: [{\r\n name: 'chart',\r\n level: 'block',\r\n start(src) {\r\n const idx = src.indexOf('[chart:');\r\n return idx >= 0 ? idx : undefined;\r\n },\r\n tokenizer(src) {\r\n const extracted = tryExtractChartMarker(src);\r\n if (!extracted || extracted.startIndex !== 0) {\r\n return undefined;\r\n }\r\n\r\n const chartId = `chat_chart_${++chartCounter}`;\r\n\r\n return {\r\n type: 'chart',\r\n raw: src.substring(0, extracted.endIndex),\r\n chartId: chartId,\r\n json: extracted.json,\r\n };\r\n },\r\n renderer(token) {\r\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\r\n window.__chartConfigs[token.chartId] = token.json;\r\n return createChartHtml(token.chartId);\r\n }\r\n }]\r\n });\r\n\r\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\r\n function tryExtractChartMarker(text) {\r\n const token = '[chart:';\r\n const start = text.indexOf(token);\r\n if (start < 0) {\r\n return null;\r\n }\r\n\r\n // Find JSON object boundary by balancing braces\r\n const jsonStart = start + token.length;\r\n let i = jsonStart;\r\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\r\n i++;\r\n }\r\n\r\n if (i >= text.length || text[i] !== '{') {\r\n return null;\r\n }\r\n\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n\r\n for (; i < text.length; i++) {\r\n const ch = text[i];\r\n\r\n if (inString) {\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n if (ch === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n inString = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n depth++;\r\n } else if (ch === '}') {\r\n depth--;\r\n if (depth === 0) {\r\n const jsonEnd = i;\r\n // Expect closing bracket after JSON\r\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\r\n if (closeBracketIndex < 0) {\r\n return null;\r\n }\r\n\r\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\r\n return {\r\n startIndex: start,\r\n endIndex: closeBracketIndex + 1,\r\n json: json\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function renderChartsInMessage(message) {\r\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\r\n return;\r\n }\r\n\r\n // Copy and clear pending charts immediately to prevent duplicate renders.\r\n const charts = [...message._pendingCharts];\r\n message._pendingCharts = [];\r\n\r\n // Defer to requestAnimationFrame so the browser has fully laid out the\r\n // canvas elements before Chart.js reads their dimensions.\r\n requestAnimationFrame(() => {\r\n for (const c of charts) {\r\n const canvas = document.getElementById(c.chartId);\r\n if (!canvas) {\r\n continue;\r\n }\r\n\r\n if (typeof Chart === 'undefined') {\r\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\r\n continue;\r\n }\r\n\r\n // When the canvas is inside a hidden container (e.g., display:none),\r\n // it has zero dimensions. Keep the config for later rendering.\r\n if (canvas.offsetParent === null) {\r\n window.__chartConfigs[c.chartId] = c.config;\r\n continue;\r\n }\r\n\r\n try {\r\n // Destroy existing chart instance if re-rendering\r\n if (canvas._chartInstance) {\r\n canvas._chartInstance.destroy();\r\n }\r\n\r\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\r\n cfg.options ??= {};\r\n cfg.options.responsive = true;\r\n cfg.options.maintainAspectRatio = true;\r\n cfg.options.aspectRatio ??= 4 / 3;\r\n\r\n canvas._chartInstance = new Chart(canvas, cfg);\r\n } catch (e) {\r\n console.error('Error creating chart:', e);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Parse markdown content via marked (which natively handles [chart:...] markers\r\n // through the registered extension) and collect pending chart configs for later\r\n // Chart.js rendering.\r\n function parseMarkdownContent(content, message) {\r\n _pendingCharts = [];\r\n const html = marked.parse(content, { renderer });\r\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\r\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\r\n }\r\n\r\n const initialize = (instanceConfig) => {\r\n\r\n const config = Object.assign({}, defaultConfig, instanceConfig);\r\n // Keep defaultConfig in sync so renderers use overridden values\r\n defaultConfig = config;\r\n\r\n if (!config.signalRHubUrl) {\r\n console.error('The signalRHubUrl is required.');\r\n return;\r\n }\r\n\r\n if (!config.appElementSelector) {\r\n console.error('The appElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.chatContainerElementSelector) {\r\n console.error('The chatContainerElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.inputElementSelector) {\r\n console.error('The inputElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.sendButtonElementSelector) {\r\n console.error('The sendButtonElementSelector is required.');\r\n return;\r\n }\r\n\r\n const app = Vue.createApp({\r\n data() {\r\n return {\r\n inputElement: null,\r\n buttonElement: null,\r\n chatContainer: null,\r\n placeholder: null,\r\n isInteractionStarted: false,\r\n isPlaceholderVisible: true,\r\n isStreaming: false,\r\n isNavigatingAway: false,\r\n autoScroll: true,\r\n stream: null,\r\n messages: [],\r\n prompt: '',\r\n initialFieldValues: new Map(),\r\n settingsDirty: false,\r\n saveSettingsTimeout: null,\r\n saveIndicatorTimeout: null,\r\n isRecording: false,\r\n mediaRecorder: null,\r\n preRecordingPrompt: '',\r\n micButton: null,\r\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\r\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\r\n ttsVoiceName: config.ttsVoiceName || null,\r\n audioChunks: [],\r\n audioPlayQueue: [],\r\n isPlayingAudio: false,\r\n currentAudioElement: null,\r\n currentAudioUrl: null,\r\n ttsPlayingMessageIndex: -1,\r\n ttsAudioCache: {},\r\n ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2),\r\n conversationModeEnabled: config.chatMode === 'Conversation',\r\n conversationButton: null,\r\n isConversationMode: false,\r\n notifications: [],\r\n notificationDismissTimers: {},\r\n };\r\n },\r\n computed: {\r\n lastAssistantIndex() {\r\n for (var i = this.messages.length - 1; i >= 0; i--) {\r\n if (this.messages[i].role === 'assistant') {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n },\r\n methods: {\r\n handleBeforeUnload() {\r\n this.isNavigatingAway = true;\r\n },\r\n async startConnection() {\r\n this.connection = new signalR.HubConnectionBuilder()\r\n .withUrl(config.signalRHubUrl)\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n // Allow long-running operations (e.g., multi-step MCP tool calls)\r\n // without the client disconnecting prematurely.\r\n this.connection.serverTimeoutInMilliseconds = 600000;\r\n this.connection.keepAliveIntervalInMilliseconds = 15000;\r\n\r\n this.connection.on(\"LoadInteraction\", (data) => {\r\n this.initializeInteraction(data.itemId, true);\r\n this.messages = [];// Update the title field if it exists\r\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\r\n if (titleInput && data.title) {\r\n titleInput.value = data.title;\r\n }\r\n\r\n (data.messages ?? []).forEach(msg => {\r\n this.addMessage(msg);\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n });\r\n });\r\n });\r\n\r\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\r\n // Update the history list item if it exists\r\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\r\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\r\n if (historyItem) {\r\n historyItem.textContent = title || config.untitledText;\r\n }\r\n\r\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\r\n if (titleInput && title) {\r\n titleInput.value = title;\r\n }\r\n\r\n this.showSaveIndicator('Saved', 'text-success');\r\n });\r\n\r\n this.connection.on(\"ReceiveError\", (error) => {\r\n console.error(\"SignalR Error: \", error);\r\n this.showSaveIndicator('Save failed', 'text-danger');\r\n\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\r\n if (this.isConversationMode) {\r\n if (!isFinal && text) {\r\n this._conversationPartialTranscript = text;\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n var html = '

' + escaped + '

';\r\n\r\n // Show partial transcript as a live user message.\r\n if (!this._conversationPartialMessage) {\r\n this.hidePlaceholder();\r\n this._conversationPartialMessage = {\r\n role: 'user',\r\n content: text,\r\n htmlContent: html,\r\n isPartial: true\r\n };\r\n this.messages.push(this._conversationPartialMessage);\r\n } else {\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = html;\r\n }\r\n this.scrollToBottom();\r\n }\r\n return;\r\n }\r\n\r\n if (text && !this._audioInputSent) {\r\n this.prompt = this.preRecordingPrompt + text;\r\n if (this.inputElement) {\r\n this.inputElement.value = this.prompt;\r\n this.inputElement.dispatchEvent(new Event('input'));\r\n }\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, text) => {\r\n if (text) {\r\n this.stopAudio();\r\n\r\n // If there's an interrupted assistant message still streaming,\r\n // mark it as done to stop the spinner animation.\r\n if (this._conversationAssistantMessage) {\r\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\r\n if (oldMsg) {\r\n oldMsg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Replace the partial transcript message with the final one.\r\n if (this._conversationPartialMessage) {\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\r\n this._conversationPartialMessage.isPartial = false;\r\n this._conversationPartialMessage = null;\r\n } else {\r\n this.addMessage({\r\n role: 'user',\r\n content: text\r\n });\r\n }\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, appearance) => {\r\n if (!this._conversationAssistantMessage) {\r\n this.stopAudio();\r\n this.hideTypingIndicator();\r\n\r\n // Ensure no stale streaming indicators remain from prior messages.\r\n for (var j = 0; j < this.messages.length; j++) {\r\n if (this.messages[j].isStreaming) {\r\n this.messages[j].isStreaming = false;\r\n }\r\n }\r\n\r\n var msgIndex = this.messages.length;\r\n var newMessage = {\r\n id: messageId,\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n appearance: this.normalizeAssistantAppearance(appearance),\r\n };\r\n this.messages.push(newMessage);\r\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\r\n }\r\n\r\n this._conversationAssistantMessage.content += token;\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n if (!msg.appearance) {\r\n msg.appearance = this.normalizeAssistantAppearance(appearance);\r\n }\r\n msg.content = this._conversationAssistantMessage.content;\r\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n this.scrollToBottom();\r\n });\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId) => {\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\r\n if (base64Audio) {\r\n const binaryString = atob(base64Audio);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n this.audioChunks.push(bytes);\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\r\n this.playCollectedAudio();\r\n });\r\n\r\n this.connection.on(\"HistoryCleared\", (itemId) => {\r\n // Clear messages and show placeholder\r\n this.messages = [];\r\n this.showPlaceholder();\r\n\r\n // Hide the clear history button since there's no history now\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.classList.add('d-none');\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveNotification\", (notification) => {\r\n this.receiveNotification(notification);\r\n });\r\n\r\n this.connection.on(\"UpdateNotification\", (notification) => {\r\n this.updateNotification(notification);\r\n });\r\n\r\n this.connection.on(\"RemoveNotification\", (notificationType) => {\r\n this.removeNotification(notificationType);\r\n });\r\n\r\n this.connection.onreconnecting(() => {\r\n console.warn(\"SignalR: reconnecting...\");\r\n });\r\n\r\n this.connection.onreconnected(() => {\r\n console.info(\"SignalR: reconnected.\");\r\n this.reloadCurrentInteraction();\r\n });\r\n\r\n this.connection.onclose((error) => {\r\n if (this.isNavigatingAway) {\r\n return;\r\n }\r\n\r\n if (error) {\r\n console.warn(\"SignalR connection closed with error:\", error.message || error);\r\n }\r\n });\r\n\r\n try {\r\n await this.connection.start();\r\n } catch (err) {\r\n console.error(\"SignalR Connection Error: \", err);\r\n }\r\n },\r\n addMessageInternal(message) {\r\n if (message.role === 'assistant') {\r\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\r\n }\r\n\r\n if (message.content && !message.htmlContent) {\r\n message.htmlContent = parseMarkdownContent(message.content, message);\r\n }\r\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\r\n this.messages.push(message);\r\n\r\n this.$nextTick(() => {\r\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\r\n });\r\n },\r\n addMessage(message) {\r\n if (message.content) {\r\n let processedContent = message.content.trim();\r\n\r\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\r\n\r\n // Only include references that were actually cited in the response.\r\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\r\n\r\n if (citedRefs.length) {\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders.\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processedContent = processedContent.replaceAll(key, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processedContent = processedContent.replaceAll('
', ',');\r\n\r\n processedContent += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || `[doc:${value.index}]`;\r\n processedContent += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n }\r\n }\r\n\r\n message.content = processedContent;\r\n message.htmlContent = parseMarkdownContent(processedContent, message);\r\n }\r\n\r\n this.addMessageInternal(message);\r\n this.hidePlaceholder();\r\n\r\n this.$nextTick(() => {\r\n // Render any pending charts once the DOM is updated\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n hidePlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.add('d-none');\r\n }\r\n this.isPlaceholderVisible = false;\r\n },\r\n showPlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.remove('d-none');\r\n }\r\n this.isPlaceholderVisible = true;\r\n },\r\n fireEvent(event) {\r\n document.dispatchEvent(event);\r\n },\r\n normalizeAssistantAppearance(appearance) {\r\n if (!appearance) {\r\n return null;\r\n }\r\n\r\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\r\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\r\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\r\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\r\n\r\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\r\n return null;\r\n }\r\n\r\n return {\r\n label: label,\r\n icon: icon,\r\n cssClass: cssClass,\r\n disableStreamingAnimation: disableStreamingAnimation,\r\n };\r\n },\r\n getAssistantLabel(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\r\n },\r\n getAssistantRoleClasses(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n var classes = ['ai-chat-msg-role'];\r\n\r\n if (appearance && appearance.cssClass) {\r\n classes.push(appearance.cssClass);\r\n } else {\r\n classes.push('ai-chat-msg-role-assistant');\r\n }\r\n\r\n return classes;\r\n },\r\n getAssistantIconClasses(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\r\n },\r\n getAssistantIcon(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\r\n },\r\n shouldAnimateAssistantIcon(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return !!message &&\r\n message.isStreaming &&\r\n index === this.lastAssistantIndex &&\r\n !(appearance && appearance.disableStreamingAnimation);\r\n },\r\n isIndicator(message) {\r\n return message.role === 'indicator';\r\n },\r\n async sendMessage() {\r\n let trimmedPrompt = this.prompt.trim();\r\n\r\n if (!trimmedPrompt) {\r\n return;\r\n }\r\n\r\n // Stop any active recording before sending.\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\r\n this._audioInputSent = true;\r\n\r\n // Flush any pending settings save before sending a message\r\n // to prevent concurrent hub calls that can cause database deadlocks.\r\n await this.flushPendingSave();\r\n\r\n this.addMessage({\r\n role: 'user',\r\n content: trimmedPrompt\r\n });\r\n\r\n // Show the clear history button since we now have prompts\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.classList.remove('d-none');\r\n }\r\n\r\n this.streamMessage(trimmedPrompt);\r\n this.inputElement.value = '';\r\n this.prompt = '';\r\n },\r\n streamMessage(trimmedPrompt) {\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n\r\n this.streamingStarted();\r\n this.showTypingIndicator();\r\n this.autoScroll = true;\r\n\r\n var content = '';\r\n var references = {};\r\n var lastResponseId = null;\r\n\r\n var messageIndex = this.messages.length;\r\n var currentItemId = this.getItemId();\r\n\r\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\r\n .subscribe({\r\n next: (chunk) => {\r\n let message = this.messages[messageIndex];\r\n\r\n if (!message) {\r\n if (chunk.sessionId && !currentItemId) {\r\n this.setItemId(chunk.sessionId);\r\n }\r\n\r\n this.hideTypingIndicator();\r\n messageIndex = this.messages.length;\r\n let newMessage = {\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n };\r\n\r\n this.messages.push(newMessage);\r\n message = newMessage;\r\n }\r\n\r\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\r\n for (const [key, value] of Object.entries(chunk.references)) {\r\n references[key] = value;\r\n }\r\n }\r\n\r\n if (chunk.content) {\r\n // When the responseId changes (e.g., after an internal tool call),\r\n // insert a line break to visually separate response segments.\r\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\r\n content += '\\n\\n';\r\n }\r\n\r\n if (chunk.responseId) {\r\n lastResponseId = chunk.responseId;\r\n }\r\n\r\n let processedContent = chunk.content;\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n processedContent = processedContent.replaceAll(key, `${value.index}`);\r\n }\r\n\r\n content += processedContent.replaceAll('
', ',');\r\n }\r\n\r\n message.content = content;\r\n\r\n message.htmlContent = parseMarkdownContent(content, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n complete: () => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n if (!msg || !msg.content) {\r\n // No content received at all.\r\n this.hideTypingIndicator();\r\n }\r\n\r\n // Trigger text-to-speech only in conversation mode.\r\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\r\n this.synthesizeSpeech(msg.content);\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n },\r\n error: (err) => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n this.hideTypingIndicator();\r\n\r\n if (!this.isNavigatingAway) {\r\n this.addMessage(this.getServiceDownMessage());\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n\r\n console.error(\"Stream error:\", err);\r\n }\r\n });\r\n },\r\n getServiceDownMessage() {\r\n return {\r\n role: \"assistant\",\r\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\r\n htmlContent: \"\",\r\n };\r\n },\r\n processReferences(references, messageIndex) {\r\n if (Object.keys(references).length) {\r\n let message = this.messages[messageIndex];\r\n const content = message.content || '';\r\n\r\n // Only include references that were actually cited in the response.\r\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\r\n const citedRefs = Object.entries(references).filter(([key, value]) =>\r\n content.includes(key) || content.includes(`${value.index}`)\r\n );\r\n\r\n if (!citedRefs.length) {\r\n return;\r\n }\r\n\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\r\n let processed = content.trim();\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processed = processed.replaceAll(key, placeholder);\r\n processed = processed.replaceAll(`${value.index}`, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processed = processed.replaceAll('', ',');\r\n\r\n processed += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || `[doc:${value.index}]`;\r\n processed += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n\r\n message.content = processed;\r\n message.htmlContent = parseMarkdownContent(processed, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n }\r\n },\r\n streamingStarted() {\r\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\r\n\r\n if (stopIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n },\r\n streamingFinished() {\r\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\r\n\r\n if (startIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n // Directly manipulate the DOM to stop all streaming animations.\r\n if (this.chatContainer) {\r\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\r\n for (var i = 0; i < icons.length; i++) {\r\n icons[i].classList.remove('ai-streaming-icon');\r\n icons[i].classList.add('ai-bot-icon');\r\n }\r\n }\r\n\r\n // Also update Vue data for consistency.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Save any settings that were deferred during streaming.\r\n if (this.settingsDirty) {\r\n this.debouncedSaveSettings();\r\n }\r\n },\r\n handleExternalTtsStop(e) {\r\n if (e?.detail?.sourceId === this.ttsInstanceId) {\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n },\r\n synthesizeSpeech(text, cacheIndex) {\r\n if (!this.textToSpeechEnabled || !text || !this.connection) {\r\n return;\r\n }\r\n\r\n this.audioChunks = [];\r\n this.isPlayingAudio = true;\r\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\r\n\r\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\r\n .catch(err => {\r\n console.error(\"TTS synthesis error:\", err);\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this._ttsCacheIndex = -1;\r\n });\r\n },\r\n toggleMessageTts(message, index) {\r\n if (this.ttsPlayingMessageIndex === index) {\r\n this.stopAudio();\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\r\n detail: { sourceId: this.ttsInstanceId }\r\n }));\r\n this.ttsPlayingMessageIndex = index;\r\n\r\n if (this.ttsAudioCache[index]) {\r\n this.playAudioBlob(this.ttsAudioCache[index]);\r\n return;\r\n }\r\n\r\n this.synthesizeSpeech(message.content, index);\r\n },\r\n playCollectedAudio() {\r\n if (this.audioChunks.length === 0) {\r\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n }\r\n return;\r\n }\r\n\r\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\r\n const combined = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const chunk of this.audioChunks) {\r\n combined.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n this.audioChunks = [];\r\n\r\n const blob = new Blob([combined], { type: 'audio/mp3' });\r\n\r\n if (this._ttsCacheIndex >= 0) {\r\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\r\n this._ttsCacheIndex = -1;\r\n }\r\n\r\n // If audio is currently playing, queue this blob for later.\r\n if (this.isPlayingAudio && this.currentAudioElement) {\r\n this.audioPlayQueue.push(blob);\r\n return;\r\n }\r\n\r\n this.playAudioBlob(blob);\r\n },\r\n playAudioBlob(blob) {\r\n const url = URL.createObjectURL(blob);\r\n const audio = new Audio(url);\r\n\r\n this.currentAudioUrl = url;\r\n this.currentAudioElement = audio;\r\n this.isPlayingAudio = true;\r\n\r\n audio.addEventListener('ended', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.addEventListener('error', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.play().catch(err => {\r\n console.error(\"Audio playback error:\", err);\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n });\r\n },\r\n playNextInQueue() {\r\n if (this.audioPlayQueue.length > 0) {\r\n const nextBlob = this.audioPlayQueue.shift();\r\n this.playAudioBlob(nextBlob);\r\n } else {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this.conversationModeOnAudioEnded();\r\n }\r\n },\r\n stopAudio() {\r\n if (this.currentAudioElement) {\r\n this.currentAudioElement.pause();\r\n this.currentAudioElement.currentTime = 0;\r\n this.currentAudioElement = null;\r\n }\r\n if (this.currentAudioUrl) {\r\n URL.revokeObjectURL(this.currentAudioUrl);\r\n this.currentAudioUrl = null;\r\n }\r\n this.audioChunks = [];\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n },\r\n toggleConversationMode() {\r\n if (this.isConversationMode) {\r\n this.stopConversationMode();\r\n } else {\r\n this.startConversationMode();\r\n }\r\n },\r\n startConversationMode() {\r\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = true;\r\n this.updateConversationButton();\r\n this._conversationPartialTranscript = '';\r\n this._conversationAssistantMessage = null;\r\n this._conversationPartialMessage = null;\r\n\r\n // Remove any previous conversation ended notification.\r\n this.removeNotification('conversation-ended');\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this._conversationSubject = new signalR.Subject();\r\n this._conversationStream = stream;\r\n\r\n // Create an AnalyserNode for volume-based interrupt detection.\r\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\r\n if (AudioCtx) {\r\n this._conversationAudioCtx = new AudioCtx();\r\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\r\n this._conversationAnalyser.fftSize = 256;\r\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\r\n micSource.connect(this._conversationAnalyser);\r\n }\r\n\r\n var pendingChunk = Promise.resolve();\r\n var analyser = this._conversationAnalyser;\r\n var interruptVolumeThreshold = 30;\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n // During TTS playback, check mic volume to detect\r\n // user interruption (speaking above threshold).\r\n if (this.isPlayingAudio && analyser) {\r\n var freqData = new Uint8Array(analyser.frequencyBinCount);\r\n analyser.getByteFrequencyData(freqData);\r\n var sum = 0;\r\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\r\n var avg = sum / freqData.length;\r\n\r\n if (avg >= interruptVolumeThreshold) {\r\n // User is speaking — interrupt TTS playback.\r\n this.stopAudio();\r\n }\r\n }\r\n\r\n // Always send audio to STT — browser echo cancellation\r\n // handles speaker echo; continuous audio avoids gaps\r\n // that increase recognition latency.\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n try {\r\n this._conversationSubject.next(base64);\r\n } catch (err) {\r\n // Subject may have been completed already.\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => {\r\n try {\r\n this._conversationSubject.complete();\r\n } catch (err) {\r\n // Already completed.\r\n }\r\n });\r\n });\r\n\r\n var itemId = this.getItemId();\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n });\r\n },\r\n stopConversationMode() {\r\n if (!this.isConversationMode) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n\r\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\r\n if (this.connection) {\r\n this.connection.invoke(\"StopConversation\").catch(function () { });\r\n }\r\n\r\n if (this.isRecording && this.mediaRecorder) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n }\r\n\r\n this.stopAudio();\r\n this._conversationPartialTranscript = '';\r\n this._conversationPartialMessage = null;\r\n\r\n // Clean up the AudioContext used for volume monitoring.\r\n if (this._conversationAudioCtx) {\r\n this._conversationAudioCtx.close().catch(function () { });\r\n this._conversationAudioCtx = null;\r\n this._conversationAnalyser = null;\r\n }\r\n\r\n // Mark any in-flight assistant message as done to stop the spinner.\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Safety net: clear all lingering streaming indicators.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Show a \"conversation ended\" notification system message.\r\n this.receiveNotification({\r\n type: 'conversation-ended',\r\n content: 'Conversation ended.',\r\n icon: 'fa-solid fa-circle-check',\r\n dismissible: true,\r\n autoDismissMs: 5000\r\n });\r\n },\r\n updateConversationButton() {\r\n if (!this.conversationButton) {\r\n return;\r\n }\r\n\r\n if (this.isConversationMode) {\r\n this.conversationButton.classList.add('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\r\n var endHtml = this.conversationButton.getAttribute('data-end-html');\r\n if (endHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n } else {\r\n this.conversationButton.classList.remove('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\r\n this.conversationButton.classList.add('btn-outline-dark');\r\n this.conversationButton.blur();\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\r\n var startHtml = this.conversationButton.getAttribute('data-start-html');\r\n if (startHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n }\r\n },\r\n conversationModeSendPrompt() {\r\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\r\n },\r\n conversationModeOnAudioEnded() {\r\n // Legacy: in conversation mode, continuation is handled\r\n // by the persistent stream.\r\n },\r\n showTypingIndicator() {\r\n this.addMessage({\r\n role: 'indicator',\r\n htmlContent: config.indicatorTemplate\r\n });\r\n },\r\n hideTypingIndicator() {\r\n const originalLength = this.messages.length;\r\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\r\n const removedCount = originalLength - this.messages.length;\r\n return removedCount;\r\n },\r\n scrollToBottom() {\r\n if (!this.autoScroll) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\r\n }, 50);\r\n },\r\n handleUserInput(event) {\r\n this.prompt = event.target.value;\r\n },\r\n getItemId() {\r\n return this.inputElement.getAttribute('data-interaction-id')\r\n || this.inputElement.getAttribute('data-item-id');\r\n },\r\n getSaveIndicatorElement() {\r\n if (config.saveIndicatorElementSelector) {\r\n return document.querySelector(config.saveIndicatorElementSelector);\r\n }\r\n\r\n return document.querySelector('[data-chat-interaction-save-indicator]');\r\n },\r\n showSaveIndicator(text, className) {\r\n const indicator = this.getSaveIndicatorElement();\r\n if (!indicator) {\r\n return;\r\n }\r\n\r\n indicator.textContent = text || '';\r\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\r\n\r\n if (this.saveIndicatorTimeout) {\r\n clearTimeout(this.saveIndicatorTimeout);\r\n this.saveIndicatorTimeout = null;\r\n }\r\n\r\n if (!text) {\r\n return;\r\n }\r\n\r\n this.saveIndicatorTimeout = setTimeout(() => {\r\n indicator.textContent = '';\r\n this.saveIndicatorTimeout = null;\r\n }, 3000);\r\n },\r\n clearPendingSettingsSave() {\r\n if (this.saveSettingsTimeout) {\r\n clearTimeout(this.saveSettingsTimeout);\r\n this.saveSettingsTimeout = null;\r\n }\r\n },\r\n getFieldLabel(input) {\r\n const label = input\r\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\r\n ?.querySelector('label');\r\n\r\n if (!label) {\r\n return input.dataset.setting || 'This field';\r\n }\r\n\r\n return (label.textContent || '')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n || input.dataset.setting\r\n || 'This field';\r\n },\r\n getValidationFeedbackElement(input) {\r\n let feedback = input.nextElementSibling;\r\n if (feedback && feedback.classList.contains('invalid-feedback')) {\r\n return feedback;\r\n }\r\n\r\n feedback = document.createElement('div');\r\n feedback.className = 'invalid-feedback';\r\n input.insertAdjacentElement('afterend', feedback);\r\n\r\n return feedback;\r\n },\r\n clearSettingValidationError(input) {\r\n input.classList.remove('is-invalid');\r\n input.removeAttribute('aria-invalid');\r\n\r\n const feedback = input.nextElementSibling;\r\n if (feedback && feedback.classList.contains('invalid-feedback')) {\r\n feedback.textContent = '';\r\n }\r\n },\r\n setSettingValidationError(input, message) {\r\n const feedback = this.getValidationFeedbackElement(input);\r\n input.classList.add('is-invalid');\r\n input.setAttribute('aria-invalid', 'true');\r\n feedback.textContent = message;\r\n },\r\n getSettingValidationMessage(input) {\r\n if (!input || input.disabled || input.type !== 'number') {\r\n return null;\r\n }\r\n\r\n const value = (input.value || '').trim();\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const number = Number(value);\r\n const fieldLabel = this.getFieldLabel(input);\r\n\r\n if (Number.isNaN(number)) {\r\n return `${fieldLabel} must be a valid number.`;\r\n }\r\n\r\n const min = input.getAttribute('min');\r\n if (min !== null && number < Number(min)) {\r\n return `${fieldLabel} must be ${min} or greater.`;\r\n }\r\n\r\n const max = input.getAttribute('max');\r\n if (max !== null && number > Number(max)) {\r\n return `${fieldLabel} must be ${max} or less.`;\r\n }\r\n\r\n return null;\r\n },\r\n validateSettingInput(input) {\r\n const message = this.getSettingValidationMessage(input);\r\n if (!message) {\r\n this.clearSettingValidationError(input);\r\n return true;\r\n }\r\n\r\n this.setSettingValidationError(input, message);\r\n return false;\r\n },\r\n validateSettings() {\r\n let isValid = true;\r\n\r\n this.getSettingInputs().forEach(input => {\r\n isValid = this.validateSettingInput(input) && isValid;\r\n });\r\n\r\n return isValid;\r\n },\r\n queueSettingsSave() {\r\n if (!this.validateSettings()) {\r\n this.clearPendingSettingsSave();\r\n this.settingsDirty = false;\r\n this.showSaveIndicator('Fix errors', 'text-danger');\r\n return;\r\n }\r\n\r\n this.settingsDirty = true;\r\n this.showSaveIndicator('Saving...', 'text-warning');\r\n this.debouncedSaveSettings();\r\n },\r\n getSettingInputs() {\r\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\r\n if (explicitInputs.length > 0) {\r\n return explicitInputs;\r\n }\r\n\r\n return document.querySelectorAll(\r\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\r\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\r\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\r\n );\r\n },\r\n getSelectedGroupValues(groupName, fallbackSelector) {\r\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked`);\r\n if (explicitSelections.length > 0) {\r\n const values = [];\r\n\r\n explicitSelections.forEach(checkbox => {\r\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\r\n if (value) {\r\n values.push(value);\r\n }\r\n });\r\n\r\n return values;\r\n }\r\n\r\n if (!fallbackSelector) {\r\n return [];\r\n }\r\n\r\n const values = [];\r\n const checkboxes = document.querySelectorAll(fallbackSelector);\r\n\r\n checkboxes.forEach(checkbox => {\r\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\r\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\r\n\r\n if (hiddenInput && hiddenInput.value) {\r\n values.push(hiddenInput.value);\r\n }\r\n });\r\n\r\n return values;\r\n },\r\n getPromptTemplateSelections() {\r\n const promptTemplates = [];\r\n\r\n document.querySelectorAll('.prompt-template-card').forEach(card => {\r\n const templateIdInput = card.querySelector('.prompt-template-id-input');\r\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\r\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\r\n\r\n if (!templateId) {\r\n return;\r\n }\r\n\r\n promptTemplates.push({\r\n templateId: templateId,\r\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\r\n });\r\n });\r\n\r\n return promptTemplates;\r\n },\r\n receiveNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n // Replace existing notification with same type, or add new one.\r\n var idx = this.notifications.findIndex(n => n.type === notification.type);\r\n if (idx >= 0) {\r\n this.notifications.splice(idx, 1, notification);\r\n } else {\r\n this.notifications.push(notification);\r\n }\r\n this.scheduleNotificationDismiss(notification);\r\n this.scrollToBottom();\r\n },\r\n updateNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var idx = this.notifications.findIndex(n => n.type === notification.type);\r\n if (idx >= 0) {\r\n this.notifications.splice(idx, 1, notification);\r\n this.scheduleNotificationDismiss(notification);\r\n this.scrollToBottom();\r\n }\r\n },\r\n scheduleNotificationDismiss(notification) {\r\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\r\n return;\r\n }\r\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\r\n this.removeNotification(notification.type);\r\n }, notification.autoDismissMs);\r\n },\r\n clearNotificationDismiss(notificationType) {\r\n var timerId = this.notificationDismissTimers[notificationType];\r\n if (!timerId) {\r\n return;\r\n }\r\n clearTimeout(timerId);\r\n delete this.notificationDismissTimers[notificationType];\r\n },\r\n removeNotification(notificationType) {\r\n this.clearNotificationDismiss(notificationType);\r\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\r\n },\r\n dismissNotification(notificationType) {\r\n this.removeNotification(notificationType);\r\n },\r\n handleNotificationAction(notificationType, actionName) {\r\n if (!this.connection) {\r\n return;\r\n }\r\n var itemId = this.getItemId();\r\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\r\n .catch(err => console.error('Failed to handle notification action:', err));\r\n },\r\n setItemId(itemId) {\r\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\r\n this.inputElement.setAttribute('data-item-id', itemId || '');\r\n },\r\n resetInteraction() {\r\n this.setItemId('');\r\n this.isInteractionStarted = false;\r\n this.messages = [];\r\n this.showPlaceholder();\r\n },\r\n initializeApp() {\r\n this.inputElement = document.querySelector(config.inputElementSelector);\r\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\r\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\r\n this.placeholder = document.querySelector(config.placeholderElementSelector);\r\n\r\n const itemId = this.getItemId();\r\n if (itemId) {\r\n this.loadInteraction(itemId);\r\n }\r\n\r\n // Pause auto-scroll when the user manually scrolls up during streaming.\r\n this.chatContainer.addEventListener('scroll', () => {\r\n if (!this.stream) {\r\n return;\r\n }\r\n const threshold = 30;\r\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\r\n this.autoScroll = atBottom;\r\n });\r\n\r\n this.inputElement.addEventListener('keyup', event => {\r\n if (this.stream != null) {\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" && !event.shiftKey) {\r\n this.buttonElement.click();\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('input', (e) => {\r\n this.handleUserInput(e);\r\n\r\n if (e.target.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('paste', (e) => {\r\n // Use setTimeout to allow the paste to complete before checking the value\r\n setTimeout(() => {\r\n this.prompt = this.inputElement.value;\r\n if (this.inputElement.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n }, 0);\r\n });\r\n\r\n this.buttonElement.addEventListener('click', () => {\r\n if (this.stream != null) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n\r\n this.streamingFinished();\r\n this.hideTypingIndicator();\r\n\r\n // Clean up: remove empty assistant message or stop streaming animation.\r\n if (this.messages.length > 0) {\r\n const lastMsg = this.messages[this.messages.length - 1];\r\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\r\n this.messages.pop();\r\n } else if (lastMsg.isStreaming) {\r\n lastMsg.isStreaming = false;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.sendMessage();\r\n });\r\n\r\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\r\n\r\n for (var i = 0; i < chatInteractionItems.length; i++) {\r\n chatInteractionItems[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n var itemId = e.target.getAttribute('data-interaction-id');\r\n\r\n if (!itemId) {\r\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\r\n return;\r\n }\r\n\r\n this.loadInteraction(itemId);\r\n });\r\n }\r\n\r\n for (let i = 0; i < config.messages.length; i++) {\r\n this.addMessage(config.messages[i]);\r\n }\r\n\r\n // Delegate click for code block copy buttons.\r\n if (this.chatContainer) {\r\n this.chatContainer.addEventListener('click', (e) => {\r\n var btn = e.target.closest('.ai-code-copy-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n\r\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\r\n if (!block) {\r\n return;\r\n }\r\n\r\n var codeEl = block.querySelector('code');\r\n if (codeEl) {\r\n navigator.clipboard.writeText(codeEl.textContent);\r\n var copiedText = config.codeCopiedText || 'Copied!';\r\n btn.innerHTML = ' ' + copiedText;\r\n setTimeout(() => {\r\n btn.innerHTML = '';\r\n }, 2000);\r\n }\r\n });\r\n }\r\n\r\n document.addEventListener('input', event => {\r\n if (event.target.matches('.setting-input[data-setting]')) {\r\n this.validateSettingInput(event.target);\r\n this.queueSettingsSave();\r\n }\r\n });\r\n\r\n document.addEventListener('change', event => {\r\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .group-toggle, .ci-agent-global-toggle')) {\r\n if (event.target.matches('.setting-input[data-setting]')) {\r\n this.validateSettingInput(event.target);\r\n }\r\n\r\n this.queueSettingsSave();\r\n return;\r\n }\r\n\r\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\r\n this.queueSettingsSave();\r\n }\r\n });\r\n\r\n document.addEventListener('click', event => {\r\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n this.queueSettingsSave();\r\n }, 0);\r\n });\r\n\r\n // Add event listener for clear history button\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.addEventListener('click', () => {\r\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\r\n if (itemId) {\r\n this.clearHistory(itemId);\r\n }\r\n });\r\n }\r\n\r\n // Initialize speech-to-text microphone button.\r\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\r\n this.micButton = document.querySelector(config.micButtonElementSelector);\r\n if (this.micButton) {\r\n this.micButton.style.display = '';\r\n this.micButton.addEventListener('click', () => {\r\n this.toggleRecording();\r\n });\r\n }\r\n }\r\n\r\n // Initialize conversation mode button.\r\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\r\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\r\n if (this.conversationButton) {\r\n this.conversationButton.addEventListener('click', () => {\r\n this.toggleConversationMode();\r\n });\r\n }\r\n }\r\n },\r\n loadInteraction(itemId) {\r\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\r\n },\r\n reloadCurrentInteraction() {\r\n const itemId = this.getItemId();\r\n if (itemId) {\r\n this.loadInteraction(itemId);\r\n }\r\n },\r\n clearHistory(itemId) {\r\n const self = this;\r\n confirmDialog({\r\n title: config.clearHistoryTitle,\r\n message: config.clearHistoryMessage,\r\n okText: config.clearHistoryOkText,\r\n cancelText: config.clearHistoryCancelText,\r\n callback: function (confirmed) {\r\n if (confirmed) {\r\n // Cancel any active stream before clearing history.\r\n if (self.stream) {\r\n self.stream.dispose();\r\n self.stream = null;\r\n self.hideTypingIndicator();\r\n self.streamingFinished();\r\n }\r\n\r\n self.connection.invoke(\"ClearHistory\", itemId)\r\n .catch(err => console.error('Error clearing history:', err));\r\n }\r\n }\r\n });\r\n },\r\n debouncedSaveSettings() {\r\n // Clear any existing timeout to reset the debounce timer\r\n this.clearPendingSettingsSave();\r\n\r\n // Don't save while streaming — it will be saved when streaming completes.\r\n if (this.stream) {\r\n return;\r\n }\r\n\r\n // Set a new timeout to save after 850ms of no changes\r\n this.saveSettingsTimeout = setTimeout(() => {\r\n if (this.settingsDirty) {\r\n this.saveSettings();\r\n this.settingsDirty = false;\r\n }\r\n this.saveSettingsTimeout = null;\r\n }, 850);\r\n },\r\n getSelectedToolNames() {\r\n return this.getSelectedGroupValues(\r\n 'toolNames',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\r\n );\r\n },\r\n getSelectedMcpConnectionIds() {\r\n return this.getSelectedGroupValues(\r\n 'mcpConnectionIds',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\r\n );\r\n },\r\n getSelectedA2AConnectionIds() {\r\n return this.getSelectedGroupValues('a2aConnectionIds');\r\n },\r\n getSelectedAgentNames() {\r\n return this.getSelectedGroupValues(\r\n 'agentNames',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\r\n );\r\n },\r\n saveSettings() {\r\n const itemId = this.getItemId();\r\n if (!itemId) {\r\n return Promise.resolve();\r\n }\r\n\r\n if (!this.validateSettings()) {\r\n this.showSaveIndicator('Fix errors', 'text-danger');\r\n return Promise.resolve();\r\n }\r\n\r\n const settings = {};\r\n\r\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\r\n // This avoids coupling the JS to specific field names — new fields added by\r\n // any module are automatically included.\r\n const inputs = this.getSettingInputs();\r\n\r\n inputs.forEach(input => {\r\n const key = input.dataset.setting\r\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\r\n\r\n if (!key) {\r\n return;\r\n }\r\n\r\n if (input.type === 'checkbox') {\r\n settings[key] = input.checked;\r\n } else if (input.type === 'number') {\r\n settings[key] = input.value ? parseFloat(input.value) : null;\r\n } else {\r\n settings[key] = input.value || null;\r\n }\r\n });\r\n\r\n // Add tool, MCP connection, and agent collections (special handling).\r\n settings.toolNames = this.getSelectedToolNames();\r\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\r\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\r\n settings.agentNames = this.getSelectedAgentNames();\r\n\r\n const promptTemplates = this.getPromptTemplateSelections();\r\n if (promptTemplates.length > 0) {\r\n settings.promptTemplates = promptTemplates;\r\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\r\n }\r\n\r\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\r\n .catch(err => {\r\n console.error('Error saving settings:', err);\r\n this.showSaveIndicator('Save failed', 'text-danger');\r\n });\r\n },\r\n flushPendingSave() {\r\n if (this.saveSettingsTimeout) {\r\n clearTimeout(this.saveSettingsTimeout);\r\n this.saveSettingsTimeout = null;\r\n }\r\n\r\n if (this.settingsDirty) {\r\n this.settingsDirty = false;\r\n return this.saveSettings();\r\n }\r\n\r\n return Promise.resolve();\r\n },\r\n initializeInteraction(itemId, force) {\r\n if (this.isInteractionStarted && !force) {\r\n return;\r\n }\r\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\r\n this.setItemId(itemId);\r\n this.isInteractionStarted = true;\r\n },\r\n copyResponse(message) {\r\n navigator.clipboard.writeText(message);\r\n },\r\n startRecording() {\r\n if (this.isRecording || !this.connection) {\r\n return;\r\n }\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this.preRecordingPrompt = this.prompt;\r\n this._audioInputSent = false;\r\n\r\n var subject = new signalR.Subject();\r\n var itemId = this.getItemId();\r\n var pendingChunk = Promise.resolve();\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n subject.next(base64);\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => subject.complete());\r\n });\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n this.updateMicButton();\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n });\r\n },\r\n stopRecording() {\r\n if (!this.isRecording || !this.mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n this.updateMicButton();\r\n },\r\n toggleRecording() {\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n } else {\r\n this.startRecording();\r\n }\r\n },\r\n updateMicButton() {\r\n if (!this.micButton) {\r\n return;\r\n }\r\n\r\n if (this.isRecording) {\r\n this.micButton.classList.add('stt-recording');\r\n this.micButton.innerHTML = '';\r\n } else {\r\n this.micButton.classList.remove('stt-recording');\r\n this.micButton.innerHTML = '';\r\n }\r\n }\r\n },\r\n watch: {\r\n isPlayingAudio() {\r\n // Reserved for future use — volume-based interrupt detection\r\n // no longer mutes tracks; browser echo cancellation handles echo.\r\n },\r\n isConversationMode(active) {\r\n if (this.micButton) {\r\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\r\n }\r\n\r\n if (this.buttonElement) {\r\n this.buttonElement.style.display = active ? 'none' : '';\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.disabled = active;\r\n if (active) {\r\n this.inputElement.placeholder = '';\r\n }\r\n }\r\n }\r\n },\r\n mounted() {\r\n (async () => {\r\n await this.startConnection();\r\n this.initializeApp();\r\n })();\r\n\r\n window.addEventListener('beforeunload', this.handleBeforeUnload);\r\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n },\r\n beforeUnmount() {\r\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\r\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n\r\n this.stopAudio(false);\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n },\r\n template: config.messageTemplate\r\n }).mount(config.appElementSelector);\r\n\r\n return app;\r\n };\r\n\r\n return {\r\n initialize: initialize\r\n };\r\n}();\r\n\r\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\r\ndocument.addEventListener('click', function (e) {\r\n const btn = e.target.closest('.download-chart-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n const chartId = btn.getAttribute('data-chart-id');\r\n const canvas = chartId ? document.getElementById(chartId) : null;\r\n if (!canvas) {\r\n console.error('Chart canvas not found:', chartId);\r\n return;\r\n }\r\n const link = document.createElement('a');\r\n link.download = 'chart-' + chartId + '.png';\r\n link.href = canvas.toDataURL('image/png');\r\n link.click();\r\n});\r\n\r\n// Intercept download clicks for data-URI images and convert to blob downloads.\r\ndocument.addEventListener('click', function (e) {\r\n const link = e.target.closest('.ai-download-image');\r\n if (!link) {\r\n return;\r\n }\r\n\r\n const container = link.closest('.generated-image-container');\r\n const img = container?.querySelector('img');\r\n if (!img) {\r\n return;\r\n }\r\n\r\n const src = img.src;\r\n if (!src || !src.startsWith('data:')) {\r\n return; // Normal URL – let the default behaviour handle it.\r\n }\r\n\r\n e.preventDefault();\r\n\r\n fetch(src)\r\n .then(function (res) { return res.blob(); })\r\n .then(function (blob) {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = link.getAttribute('download') || 'generated-image.png';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\r\n })\r\n .catch(function (err) { console.error('Failed to download image:', err); });\r\n});\r\n"]} \ No newline at end of file +{"version":3,"sources":["chat-interaction.js"],"names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_arrayLikeToArray","toString","slice","constructor","name","from","test","window","chatInteractionManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","codeCopiedText","assistantLabel","messageTemplate","indicatorTemplate","untitledText","clearHistoryTitle","clearHistoryMessage","clearHistoryOkText","clearHistoryCancelText","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","renderer","marked","Renderer","link","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","__chartConfigs","createChartHtml","chartId","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","tryExtractChartMarker","startIndex","type","raw","substring","endIndex","json","token","push","config","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","renderChartsInMessage","message","charts","requestAnimationFrame","_iterator","_step","canvas","getElementById","Chart","console","warn","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","error","err","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","initialize","instanceConfig","assign","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","app","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isInteractionStarted","isPlaceholderVisible","isStreaming","isNavigatingAway","autoScroll","stream","messages","prompt","initialFieldValues","Map","settingsDirty","saveSettingsTimeout","saveIndicatorTimeout","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","Math","random","conversationModeEnabled","conversationButton","isConversationMode","notifications","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","startConnection","_this","_callee","_t","_context","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","initializeInteraction","itemId","titleInput","querySelector","title","forEach","msg","addMessage","$nextTick","historyItem","showSaveIndicator","stopRecording","isFinal","_conversationPartialTranscript","escaped","replace","_conversationPartialMessage","hidePlaceholder","htmlContent","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","index","messageId","responseId","appearance","hideTypingIndicator","j","msgIndex","newMessage","id","normalizeAssistantAppearance","base64Audio","contentType","binaryString","atob","bytes","Uint8Array","charCodeAt","playCollectedAudio","showPlaceholder","clearHistoryBtn","classList","add","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentInteraction","onclose","addMessageInternal","_this2","fireEvent","CustomEvent","detail","_this3","processedContent","references","_typeof","keys","citedRefs","entries","filter","_ref","_ref2","_slicedToArray","key","includes","sort","_ref3","_ref4","_ref5","_ref6","b","displayIndex","_iterator2","_step2","_step2$value","replaceAll","_displayIndex","_placeholder","_iterator3","_step3","_step3$value","_iterator4","_step4","_step4$value","label","remove","event","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","isIndicator","sendMessage","_this4","_callee2","trimmedPrompt","_context2","flushPendingSave","streamMessage","_this5","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentItemId","getItemId","subscribe","chunk","sessionId","setItemId","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","complete","_this5$stream","processReferences","streamingFinished","synthesizeSpeech","_this5$stream2","getServiceDownMessage","_this6","_ref7","_ref8","_ref9","_ref0","_ref1","_ref10","processed","_iterator5","_step5","_step5$value","_iterator6","_step6","_step6$value","_iterator7","_step7","_step7$value","stopIcon","getAttribute","replaceChildren","RETURN_DOM_FRAGMENT","startIcon","icons","querySelectorAll","debouncedSaveSettings","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this7","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","totalLength","reduce","sum","combined","offset","_iterator8","_step8","set","blob","Blob","_this8","URL","createObjectURL","audio","Audio","addEventListener","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this9","updateConversationButton","navigator","mediaDevices","getUserMedia","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","_conversationSubject","Subject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","micSource","createMediaStreamSource","connect","pendingChunk","analyser","interruptVolumeThreshold","size","freqData","frequencyBinCount","getByteFrequencyData","k","avg","_callee3","uint8Array","base64","_context3","arrayBuffer","str","byte","String","fromCharCode","btoa","getTracks","track","stop","documentElement","send","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","originalLength","removedCount","_this0","setTimeout","scrollTop","scrollHeight","clientHeight","handleUserInput","target","getSaveIndicatorElement","saveIndicatorElementSelector","className","_this1","indicator","clearTimeout","clearPendingSettingsSave","getFieldLabel","input","_input$closest","closest","dataset","setting","getValidationFeedbackElement","feedback","nextElementSibling","contains","insertAdjacentElement","clearSettingValidationError","removeAttribute","setSettingValidationError","setAttribute","getSettingValidationMessage","disabled","number","Number","fieldLabel","isNaN","min","max","validateSettingInput","validateSettings","_this10","isValid","getSettingInputs","queueSettingsSave","explicitInputs","getSelectedGroupValues","groupName","fallbackSelector","explicitSelections","values","checkbox","checkboxes","baseName","hiddenInput","getPromptTemplateSelections","promptTemplates","card","templateIdInput","promptParametersInput","templateId","promptParameters","clearNotificationDismiss","findIndex","splice","scheduleNotificationDismiss","_this11","timerId","dismissNotification","handleNotificationAction","actionName","resetInteraction","initializeApp","_this12","placeholderElementSelector","loadInteraction","threshold","atBottom","shiftKey","click","lastMsg","pop","chatInteractionItems","getElementsByClassName","preventDefault","btn","block","codeEl","clipboard","writeText","copiedText","matches","clearHistory","micButtonElementSelector","style","display","toggleRecording","conversationButtonElementSelector","self","confirmDialog","okText","cancelText","callback","confirmed","_this13","saveSettings","getSelectedToolNames","getSelectedMcpConnectionIds","getSelectedA2AConnectionIds","getSelectedAgentNames","_this14","settings","inputs","match","toLowerCase","checked","parseFloat","toolNames","mcpConnectionIds","a2aConnectionIds","agentNames","promptTemplateIds","map","template","force","copyResponse","startRecording","_this15","subject","_callee4","_context4","updateMicButton","watch","active","mounted","_this16","_callee5","_context5","beforeUnmount","removeEventListener","mount","download","toDataURL","container","img","startsWith","fetch","res","body","appendChild","removeChild"],"mappings":"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","file":"chat-interaction.js","sourcesContent":["window.chatInteractionManager = function () {\n\n // Defaults (can be overridden by instanceConfig)\n var defaultConfig = {\n // UI defaults for generated media\n generatedImageAltText: 'Generated Image',\n generatedImageMaxWidth: 400,\n downloadImageTitle: 'Download image',\n downloadChartTitle: 'Download chart as image',\n downloadChartButtonText: 'Download',\n codeCopiedText: 'Copied!',\n assistantLabel: 'Assistant',\n\n messageTemplate: `\n
\n
\n
\n
You
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n `,\n indicatorTemplate: `\n
\n \n Assistant\n
\n `,\n // Localizable strings\n untitledText: 'Untitled',\n clearHistoryTitle: 'Clear History',\n clearHistoryMessage: 'Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.',\n clearHistoryOkText: 'Yes',\n clearHistoryCancelText: 'Cancel'\n };\n\n // Sanitize URLs to prevent javascript: protocol injection.\n function sanitizeUrl(url) {\n if (!url) return '';\n var trimmed = url.trim();\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\n return '';\n }\n return url;\n }\n\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\n function escapeHtmlEntities(text) {\n var span = document.createElement('span');\n span.textContent = text;\n return span.innerHTML;\n }\n\n const renderer = new marked.Renderer();\n\n // Modify the link rendering to open in a new tab\n renderer.link = function (data) {\n var href = sanitizeUrl(data.href);\n if (!href) return data.text || '';\n return `
${data.text}`;\n };\n\n // Custom code block renderer with highlight.js integration and copy button.\n renderer.code = function (data) {\n var code = data.text || '';\n var lang = (data.lang || '').trim();\n var highlighted = code;\n\n if (typeof hljs !== 'undefined') {\n if (lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(code, { language: lang }).value;\n } catch (_) { }\n } else {\n try {\n highlighted = hljs.highlightAuto(code).value;\n } catch (_) { }\n }\n } else {\n highlighted = escapeHtmlEntities(code);\n }\n\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\n return `
${langDisplay}
${highlighted}
`;\n };\n\n // Custom image renderer for generated images with thumbnail styling and download button.\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\n renderer.image = function (data) {\n const src = sanitizeUrl(data.href);\n if (!src) return '';\n const alt = data.text || defaultConfig.generatedImageAltText;\n const maxWidth = defaultConfig.generatedImageMaxWidth;\n return `
\n \"${alt}\"\n
\n \n \n \n
\n
`;\n };\n\n // Chart counter for unique IDs\n let chartCounter = 0;\n\n // Collector for charts discovered during marked parsing.\n let _pendingCharts = [];\n\n // Global chart config map shared with ai-chat.js\n window.__chartConfigs = window.__chartConfigs || {};\n\n function createChartHtml(chartId) {\n return `
`\n + ``\n + `
`\n + `
`\n + ``\n + `
`;\n }\n\n // Register [chart:{...json...}] as a native marked block extension so the\n // markdown parser handles chart markers inline with surrounding text.\n marked.use({\n extensions: [{\n name: 'chart',\n level: 'block',\n start(src) {\n const idx = src.indexOf('[chart:');\n return idx >= 0 ? idx : undefined;\n },\n tokenizer(src) {\n const extracted = tryExtractChartMarker(src);\n if (!extracted || extracted.startIndex !== 0) {\n return undefined;\n }\n\n const chartId = `chat_chart_${++chartCounter}`;\n\n return {\n type: 'chart',\n raw: src.substring(0, extracted.endIndex),\n chartId: chartId,\n json: extracted.json,\n };\n },\n renderer(token) {\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\n window.__chartConfigs[token.chartId] = token.json;\n return createChartHtml(token.chartId);\n }\n }]\n });\n\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\n function tryExtractChartMarker(text) {\n const token = '[chart:';\n const start = text.indexOf(token);\n if (start < 0) {\n return null;\n }\n\n // Find JSON object boundary by balancing braces\n const jsonStart = start + token.length;\n let i = jsonStart;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\n i++;\n }\n\n if (i >= text.length || text[i] !== '{') {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n\n if (inString) {\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\') {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) {\n const jsonEnd = i;\n // Expect closing bracket after JSON\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\n if (closeBracketIndex < 0) {\n return null;\n }\n\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\n return {\n startIndex: start,\n endIndex: closeBracketIndex + 1,\n json: json\n };\n }\n }\n }\n\n return null;\n }\n\n function renderChartsInMessage(message) {\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\n return;\n }\n\n // Copy and clear pending charts immediately to prevent duplicate renders.\n const charts = [...message._pendingCharts];\n message._pendingCharts = [];\n\n // Defer to requestAnimationFrame so the browser has fully laid out the\n // canvas elements before Chart.js reads their dimensions.\n requestAnimationFrame(() => {\n for (const c of charts) {\n const canvas = document.getElementById(c.chartId);\n if (!canvas) {\n continue;\n }\n\n if (typeof Chart === 'undefined') {\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n continue;\n }\n\n // When the canvas is inside a hidden container (e.g., display:none),\n // it has zero dimensions. Keep the config for later rendering.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[c.chartId] = c.config;\n continue;\n }\n\n try {\n // Destroy existing chart instance if re-rendering\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n } catch (e) {\n console.error('Error creating chart:', e);\n }\n }\n });\n }\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n const initialize = (instanceConfig) => {\n\n const config = Object.assign({}, defaultConfig, instanceConfig);\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isInteractionStarted: false,\n isPlaceholderVisible: true,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n prompt: '',\n initialFieldValues: new Map(),\n settingsDirty: false,\n saveSettingsTimeout: null,\n saveIndicatorTimeout: null,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n currentAudioUrl: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2),\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n notifications: [],\n notificationDismissTimers: {},\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadInteraction\", (data) => {\n this.initializeInteraction(data.itemId, true);\n this.messages = [];// Update the title field if it exists\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && data.title) {\n titleInput.value = data.title;\n }\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n });\n\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\n // Update the history list item if it exists\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\n if (historyItem) {\n historyItem.textContent = title || config.untitledText;\n }\n\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && title) {\n titleInput.value = title;\n }\n\n this.showSaveIndicator('Saved', 'text-success');\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n this.showSaveIndicator('Save failed', 'text-danger');\n\n if (this.isRecording) {\n this.stopRecording();\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, text) => {\n if (text) {\n this.stopAudio();\n\n // If there's an interrupted assistant message still streaming,\n // mark it as done to stop the spinner animation.\n if (this._conversationAssistantMessage) {\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\n if (oldMsg) {\n oldMsg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, appearance) => {\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n appearance: this.normalizeAssistantAppearance(appearance),\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.content = this._conversationAssistantMessage.content;\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n this.audioChunks.push(bytes);\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"HistoryCleared\", (itemId) => {\n // Clear messages and show placeholder\n this.messages = [];\n this.showPlaceholder();\n\n // Hide the clear history button since there's no history now\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.add('d-none');\n }\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n this.reloadCurrentInteraction();\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n if (message.content) {\n let processedContent = message.content.trim();\n\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\n\n // Only include references that were actually cited in the response.\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\n\n if (citedRefs.length) {\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders.\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processedContent = processedContent.replaceAll('
', ',');\n\n processedContent += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || `[doc:${value.index}]`;\n processedContent += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n }\n }\n\n message.content = processedContent;\n message.htmlContent = parseMarkdownContent(processedContent, message);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n async sendMessage() {\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // Flush any pending settings save before sending a message\n // to prevent concurrent hub calls that can cause database deadlocks.\n await this.flushPendingSave();\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n // Show the clear history button since we now have prompts\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.remove('d-none');\n }\n\n this.streamMessage(trimmedPrompt);\n this.inputElement.value = '';\n this.prompt = '';\n },\n streamMessage(trimmedPrompt) {\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n var messageIndex = this.messages.length;\n var currentItemId = this.getItemId();\n\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n if (chunk.sessionId && !currentItemId) {\n this.setItemId(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n messageIndex = this.messages.length;\n let newMessage = {\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n };\n\n this.messages.push(newMessage);\n message = newMessage;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = value;\n }\n }\n\n if (chunk.content) {\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n let processedContent = chunk.content;\n\n for (const [key, value] of Object.entries(references)) {\n processedContent = processedContent.replaceAll(key, `${value.index}`);\n }\n\n content += processedContent.replaceAll('
', ',');\n }\n\n message.content = content;\n\n message.htmlContent = parseMarkdownContent(content, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n return {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n },\n processReferences(references, messageIndex) {\n if (Object.keys(references).length) {\n let message = this.messages[messageIndex];\n const content = message.content || '';\n\n // Only include references that were actually cited in the response.\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\n const citedRefs = Object.entries(references).filter(([key, value]) =>\n content.includes(key) || content.includes(`${value.index}`)\n );\n\n if (!citedRefs.length) {\n return;\n }\n\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\n let processed = content.trim();\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processed = processed.replaceAll(key, placeholder);\n processed = processed.replaceAll(`${value.index}`, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processed = processed.replaceAll('', ',');\n\n processed += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || `[doc:${value.index}]`;\n processed += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n\n message.content = processed;\n message.htmlContent = parseMarkdownContent(processed, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Save any settings that were deferred during streaming.\n if (this.settingsDirty) {\n this.debouncedSaveSettings();\n }\n },\n handleExternalTtsStop(e) {\n if (e?.detail?.sourceId === this.ttsInstanceId) {\n return;\n }\n\n this.stopAudio(false);\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio(false);\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\n detail: { sourceId: this.ttsInstanceId }\n }));\n this.ttsPlayingMessageIndex = index;\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is currently playing, queue this blob for later.\n if (this.isPlayingAudio && this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioUrl = url;\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n const nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n if (this.currentAudioUrl) {\n URL.revokeObjectURL(this.currentAudioUrl);\n this.currentAudioUrl = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var itemId = this.getItemId();\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, continuation is handled\n // by the persistent stream.\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getItemId() {\n return this.inputElement.getAttribute('data-interaction-id')\n || this.inputElement.getAttribute('data-item-id');\n },\n getSaveIndicatorElement() {\n if (config.saveIndicatorElementSelector) {\n return document.querySelector(config.saveIndicatorElementSelector);\n }\n\n return document.querySelector('[data-chat-interaction-save-indicator]');\n },\n showSaveIndicator(text, className) {\n const indicator = this.getSaveIndicatorElement();\n if (!indicator) {\n return;\n }\n\n indicator.textContent = text || '';\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\n\n if (this.saveIndicatorTimeout) {\n clearTimeout(this.saveIndicatorTimeout);\n this.saveIndicatorTimeout = null;\n }\n\n if (!text) {\n return;\n }\n\n this.saveIndicatorTimeout = setTimeout(() => {\n indicator.textContent = '';\n this.saveIndicatorTimeout = null;\n }, 3000);\n },\n clearPendingSettingsSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n },\n getFieldLabel(input) {\n const label = input\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\n ?.querySelector('label');\n\n if (!label) {\n return input.dataset.setting || 'This field';\n }\n\n return (label.textContent || '')\n .replace(/\\s+/g, ' ')\n .trim()\n || input.dataset.setting\n || 'This field';\n },\n getValidationFeedbackElement(input) {\n let feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n return feedback;\n }\n\n feedback = document.createElement('div');\n feedback.className = 'invalid-feedback';\n input.insertAdjacentElement('afterend', feedback);\n\n return feedback;\n },\n clearSettingValidationError(input) {\n input.classList.remove('is-invalid');\n input.removeAttribute('aria-invalid');\n\n const feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n feedback.textContent = '';\n }\n },\n setSettingValidationError(input, message) {\n const feedback = this.getValidationFeedbackElement(input);\n input.classList.add('is-invalid');\n input.setAttribute('aria-invalid', 'true');\n feedback.textContent = message;\n },\n getSettingValidationMessage(input) {\n if (!input || input.disabled || input.type !== 'number') {\n return null;\n }\n\n const value = (input.value || '').trim();\n if (!value) {\n return null;\n }\n\n const number = Number(value);\n const fieldLabel = this.getFieldLabel(input);\n\n if (Number.isNaN(number)) {\n return `${fieldLabel} must be a valid number.`;\n }\n\n const min = input.getAttribute('min');\n if (min !== null && number < Number(min)) {\n return `${fieldLabel} must be ${min} or greater.`;\n }\n\n const max = input.getAttribute('max');\n if (max !== null && number > Number(max)) {\n return `${fieldLabel} must be ${max} or less.`;\n }\n\n return null;\n },\n validateSettingInput(input) {\n const message = this.getSettingValidationMessage(input);\n if (!message) {\n this.clearSettingValidationError(input);\n return true;\n }\n\n this.setSettingValidationError(input, message);\n return false;\n },\n validateSettings() {\n let isValid = true;\n\n this.getSettingInputs().forEach(input => {\n isValid = this.validateSettingInput(input) && isValid;\n });\n\n return isValid;\n },\n queueSettingsSave() {\n if (!this.validateSettings()) {\n this.clearPendingSettingsSave();\n this.settingsDirty = false;\n this.showSaveIndicator('Fix errors', 'text-danger');\n return;\n }\n\n this.settingsDirty = true;\n this.showSaveIndicator('Saving...', 'text-warning');\n this.debouncedSaveSettings();\n },\n getSettingInputs() {\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\n if (explicitInputs.length > 0) {\n return explicitInputs;\n }\n\n return document.querySelectorAll(\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\n );\n },\n getSelectedGroupValues(groupName, fallbackSelector) {\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked`);\n if (explicitSelections.length > 0) {\n const values = [];\n\n explicitSelections.forEach(checkbox => {\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\n if (value) {\n values.push(value);\n }\n });\n\n return values;\n }\n\n if (!fallbackSelector) {\n return [];\n }\n\n const values = [];\n const checkboxes = document.querySelectorAll(fallbackSelector);\n\n checkboxes.forEach(checkbox => {\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\n\n if (hiddenInput && hiddenInput.value) {\n values.push(hiddenInput.value);\n }\n });\n\n return values;\n },\n getPromptTemplateSelections() {\n const promptTemplates = [];\n\n document.querySelectorAll('.prompt-template-card').forEach(card => {\n const templateIdInput = card.querySelector('.prompt-template-id-input');\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\n\n if (!templateId) {\n return;\n }\n\n promptTemplates.push({\n templateId: templateId,\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\n });\n });\n\n return promptTemplates;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n // Replace existing notification with same type, or add new one.\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var itemId = this.getItemId();\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\n .catch(err => console.error('Failed to handle notification action:', err));\n },\n setItemId(itemId) {\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\n this.inputElement.setAttribute('data-item-id', itemId || '');\n },\n resetInteraction() {\n this.setItemId('');\n this.isInteractionStarted = false;\n this.messages = [];\n this.showPlaceholder();\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keyup', event => {\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.inputElement.addEventListener('paste', (e) => {\n // Use setTimeout to allow the paste to complete before checking the value\n setTimeout(() => {\n this.prompt = this.inputElement.value;\n if (this.inputElement.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n }, 0);\n });\n\n this.buttonElement.addEventListener('click', () => {\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\n\n for (var i = 0; i < chatInteractionItems.length; i++) {\n chatInteractionItems[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var itemId = e.target.getAttribute('data-interaction-id');\n\n if (!itemId) {\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\n return;\n }\n\n this.loadInteraction(itemId);\n });\n }\n\n for (let i = 0; i < config.messages.length; i++) {\n this.addMessage(config.messages[i]);\n }\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n document.addEventListener('input', event => {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('change', event => {\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .group-toggle, .ci-agent-global-toggle')) {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n }\n\n this.queueSettingsSave();\n return;\n }\n\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('click', event => {\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\n return;\n }\n\n setTimeout(() => {\n this.queueSettingsSave();\n }, 0);\n });\n\n // Add event listener for clear history button\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.addEventListener('click', () => {\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\n if (itemId) {\n this.clearHistory(itemId);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n },\n loadInteraction(itemId) {\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\n },\n reloadCurrentInteraction() {\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n },\n clearHistory(itemId) {\n const self = this;\n confirmDialog({\n title: config.clearHistoryTitle,\n message: config.clearHistoryMessage,\n okText: config.clearHistoryOkText,\n cancelText: config.clearHistoryCancelText,\n callback: function (confirmed) {\n if (confirmed) {\n // Cancel any active stream before clearing history.\n if (self.stream) {\n self.stream.dispose();\n self.stream = null;\n self.hideTypingIndicator();\n self.streamingFinished();\n }\n\n self.connection.invoke(\"ClearHistory\", itemId)\n .catch(err => console.error('Error clearing history:', err));\n }\n }\n });\n },\n debouncedSaveSettings() {\n // Clear any existing timeout to reset the debounce timer\n this.clearPendingSettingsSave();\n\n // Don't save while streaming — it will be saved when streaming completes.\n if (this.stream) {\n return;\n }\n\n // Set a new timeout to save after 850ms of no changes\n this.saveSettingsTimeout = setTimeout(() => {\n if (this.settingsDirty) {\n this.saveSettings();\n this.settingsDirty = false;\n }\n this.saveSettingsTimeout = null;\n }, 850);\n },\n getSelectedToolNames() {\n return this.getSelectedGroupValues(\n 'toolNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\n );\n },\n getSelectedMcpConnectionIds() {\n return this.getSelectedGroupValues(\n 'mcpConnectionIds',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\n );\n },\n getSelectedA2AConnectionIds() {\n return this.getSelectedGroupValues('a2aConnectionIds');\n },\n getSelectedAgentNames() {\n return this.getSelectedGroupValues(\n 'agentNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\n );\n },\n saveSettings() {\n const itemId = this.getItemId();\n if (!itemId) {\n return Promise.resolve();\n }\n\n if (!this.validateSettings()) {\n this.showSaveIndicator('Fix errors', 'text-danger');\n return Promise.resolve();\n }\n\n const settings = {};\n\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\n // This avoids coupling the JS to specific field names — new fields added by\n // any module are automatically included.\n const inputs = this.getSettingInputs();\n\n inputs.forEach(input => {\n const key = input.dataset.setting\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\n\n if (!key) {\n return;\n }\n\n if (input.type === 'checkbox') {\n settings[key] = input.checked;\n } else if (input.type === 'number') {\n settings[key] = input.value ? parseFloat(input.value) : null;\n } else {\n settings[key] = input.value || null;\n }\n });\n\n // Add tool, MCP connection, and agent collections (special handling).\n settings.toolNames = this.getSelectedToolNames();\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\n settings.agentNames = this.getSelectedAgentNames();\n\n const promptTemplates = this.getPromptTemplateSelections();\n if (promptTemplates.length > 0) {\n settings.promptTemplates = promptTemplates;\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\n }\n\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\n .catch(err => {\n console.error('Error saving settings:', err);\n this.showSaveIndicator('Save failed', 'text-danger');\n });\n },\n flushPendingSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n\n if (this.settingsDirty) {\n this.settingsDirty = false;\n return this.saveSettings();\n }\n\n return Promise.resolve();\n },\n initializeInteraction(itemId, force) {\n if (this.isInteractionStarted && !force) {\n return;\n }\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\n this.setItemId(itemId);\n this.isInteractionStarted = true;\n },\n copyResponse(message) {\n navigator.clipboard.writeText(message);\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var itemId = this.getItemId();\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n }\n },\n watch: {\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n\n this.stopAudio(false);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n return {\n initialize: initialize\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js.map b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js.map index 9df0dc65..8936e09d 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/chat-interaction.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["chat-interaction.js"],"names":["_slicedToArray","r","e","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","l","t","Symbol","iterator","n","i","u","a","f","o","call","next","Object","done","push","value","length","Array","isArray","_typeof","constructor","prototype","_regenerator","toStringTag","c","Generator","create","_regeneratorDefine2","p","y","G","v","d","bind","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","this","setPrototypeOf","__proto__","displayName","w","m","defineProperty","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","_n","F","s","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_arrayLikeToArray","toString","slice","name","from","test","window","chatInteractionManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","codeCopiedText","assistantLabel","messageTemplate","indicatorTemplate","untitledText","clearHistoryTitle","clearHistoryMessage","clearHistoryOkText","clearHistoryCancelText","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","renderer","marked","Renderer","link","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","renderChartsInMessage","message","charts","requestAnimationFrame","_step","_iterator","canvas","getElementById","chartId","Chart","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","config","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","console","error","__chartConfigs","warn","err","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","token","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","startIndex","endIndex","json","substring","tryExtractChartMarker","type","raw","initialize","instanceConfig","assign","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isInteractionStarted","isPlaceholderVisible","isStreaming","isNavigatingAway","autoScroll","stream","messages","prompt","initialFieldValues","Map","settingsDirty","saveSettingsTimeout","saveIndicatorTimeout","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","Math","random","conversationModeEnabled","conversationButton","isConversationMode","notifications","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","startConnection","_this","_callee","_t","_context","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","initializeInteraction","itemId","titleInput","querySelector","title","forEach","msg","addMessage","$nextTick","historyItem","showSaveIndicator","stopRecording","isFinal","_conversationPartialTranscript","replace","_conversationPartialMessage","htmlContent","hidePlaceholder","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","index","escaped","messageId","responseId","appearance","hideTypingIndicator","j","msgIndex","newMessage","id","normalizeAssistantAppearance","base64Audio","contentType","binaryString","atob","bytes","Uint8Array","charCodeAt","playCollectedAudio","showPlaceholder","clearHistoryBtn","classList","add","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentInteraction","onclose","addMessageInternal","_this2","fireEvent","CustomEvent","detail","_this3","processedContent","references","keys","citedRefs","entries","filter","_ref","key","includes","sort","_ref3","_ref4","b","_step2","displayIndex","_iterator2","_step2$value","replaceAll","_displayIndex","_placeholder","_step3","_iterator3","_step4","_iterator4","_step4$value","label","remove","event","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","isIndicator","sendMessage","_this4","_callee2","trimmedPrompt","_context2","flushPendingSave","streamMessage","_this5","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentItemId","getItemId","subscribe","chunk","sessionId","setItemId","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","complete","_this5$stream","processReferences","streamingFinished","synthesizeSpeech","_this5$stream2","getServiceDownMessage","_this6","_ref7","_ref8","_ref9","_ref0","_step5","processed","_iterator5","_step5$value","_step6","_iterator6","_step7","_iterator7","_step7$value","stopIcon","getAttribute","replaceChildren","RETURN_DOM_FRAGMENT","startIcon","icons","querySelectorAll","debouncedSaveSettings","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this7","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","_step8","totalLength","reduce","sum","combined","offset","_iterator8","set","blob","Blob","_this8","URL","createObjectURL","audio","Audio","addEventListener","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this9","updateConversationButton","navigator","mediaDevices","getUserMedia","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","_conversationSubject","Subject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","createMediaStreamSource","connect","pendingChunk","analyser","size","freqData","frequencyBinCount","getByteFrequencyData","k","_callee3","uint8Array","base64","_context3","arrayBuffer","str","byte","String","fromCharCode","btoa","getTracks","track","stop","documentElement","send","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","originalLength","_this0","setTimeout","scrollTop","scrollHeight","clientHeight","handleUserInput","target","getSaveIndicatorElement","saveIndicatorElementSelector","className","_this1","indicator","clearTimeout","clearPendingSettingsSave","getFieldLabel","input","_input$closest","closest","dataset","setting","getValidationFeedbackElement","feedback","nextElementSibling","contains","insertAdjacentElement","clearSettingValidationError","removeAttribute","setSettingValidationError","setAttribute","getSettingValidationMessage","disabled","number","Number","fieldLabel","isNaN","min","max","validateSettingInput","validateSettings","_this10","isValid","getSettingInputs","queueSettingsSave","explicitInputs","getSelectedGroupValues","groupName","fallbackSelector","explicitSelections","values","checkbox","baseName","hiddenInput","getPromptTemplateSelections","promptTemplates","card","templateIdInput","promptParametersInput","templateId","promptParameters","clearNotificationDismiss","findIndex","splice","scheduleNotificationDismiss","_this11","timerId","dismissNotification","handleNotificationAction","actionName","resetInteraction","initializeApp","_this12","placeholderElementSelector","loadInteraction","atBottom","shiftKey","click","lastMsg","pop","chatInteractionItems","getElementsByClassName","preventDefault","btn","block","codeEl","clipboard","writeText","copiedText","matches","clearHistory","micButtonElementSelector","style","display","toggleRecording","conversationButtonElementSelector","self","confirmDialog","okText","cancelText","callback","confirmed","_this13","saveSettings","getSelectedToolNames","getSelectedMcpConnectionIds","getSelectedA2AConnectionIds","getSelectedAgentNames","_this14","settings","match","toLowerCase","checked","parseFloat","toolNames","mcpConnectionIds","a2aConnectionIds","agentNames","promptTemplateIds","map","template","force","copyResponse","startRecording","_this15","subject","_callee4","_context4","updateMicButton","watch","active","mounted","_this16","_callee5","_context5","beforeUnmount","removeEventListener","mount","download","toDataURL","container","img","startsWith","fetch","res","body","appendChild","removeChild"],"mappings":"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","file":"chat-interaction.min.js","sourcesContent":["window.chatInteractionManager = function () {\r\n\r\n // Defaults (can be overridden by instanceConfig)\r\n var defaultConfig = {\r\n // UI defaults for generated media\r\n generatedImageAltText: 'Generated Image',\r\n generatedImageMaxWidth: 400,\r\n downloadImageTitle: 'Download image',\r\n downloadChartTitle: 'Download chart as image',\r\n downloadChartButtonText: 'Download',\r\n codeCopiedText: 'Copied!',\r\n assistantLabel: 'Assistant',\r\n\r\n messageTemplate: `\r\n
\r\n
\r\n
\r\n
You
\r\n
\r\n \r\n {{ getAssistantLabel(message) }}\r\n
\r\n
\r\n

{{ message.title }}

\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{ notification.content }}\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n `,\r\n indicatorTemplate: `\r\n
\r\n \r\n Assistant\r\n
\r\n `,\r\n // Localizable strings\r\n untitledText: 'Untitled',\r\n clearHistoryTitle: 'Clear History',\r\n clearHistoryMessage: 'Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.',\r\n clearHistoryOkText: 'Yes',\r\n clearHistoryCancelText: 'Cancel'\r\n };\r\n\r\n // Sanitize URLs to prevent javascript: protocol injection.\r\n function sanitizeUrl(url) {\r\n if (!url) return '';\r\n var trimmed = url.trim();\r\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\r\n return '';\r\n }\r\n return url;\r\n }\r\n\r\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\r\n function escapeHtmlEntities(text) {\r\n var span = document.createElement('span');\r\n span.textContent = text;\r\n return span.innerHTML;\r\n }\r\n\r\n const renderer = new marked.Renderer();\r\n\r\n // Modify the link rendering to open in a new tab\r\n renderer.link = function (data) {\r\n var href = sanitizeUrl(data.href);\r\n if (!href) return data.text || '';\r\n return `
${data.text}`;\r\n };\r\n\r\n // Custom code block renderer with highlight.js integration and copy button.\r\n renderer.code = function (data) {\r\n var code = data.text || '';\r\n var lang = (data.lang || '').trim();\r\n var highlighted = code;\r\n\r\n if (typeof hljs !== 'undefined') {\r\n if (lang && hljs.getLanguage(lang)) {\r\n try {\r\n highlighted = hljs.highlight(code, { language: lang }).value;\r\n } catch (_) { }\r\n } else {\r\n try {\r\n highlighted = hljs.highlightAuto(code).value;\r\n } catch (_) { }\r\n }\r\n } else {\r\n highlighted = escapeHtmlEntities(code);\r\n }\r\n\r\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\r\n return `
${langDisplay}
${highlighted}
`;\r\n };\r\n\r\n // Custom image renderer for generated images with thumbnail styling and download button.\r\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\r\n renderer.image = function (data) {\r\n const src = sanitizeUrl(data.href);\r\n if (!src) return '';\r\n const alt = data.text || defaultConfig.generatedImageAltText;\r\n const maxWidth = defaultConfig.generatedImageMaxWidth;\r\n return `
\r\n \"${alt}\"\r\n
\r\n \r\n \r\n \r\n
\r\n
`;\r\n };\r\n\r\n // Chart counter for unique IDs\r\n let chartCounter = 0;\r\n\r\n // Collector for charts discovered during marked parsing.\r\n let _pendingCharts = [];\r\n\r\n // Global chart config map shared with ai-chat.js\r\n window.__chartConfigs = window.__chartConfigs || {};\r\n\r\n function createChartHtml(chartId) {\r\n return `
`\r\n + ``\r\n + `
`\r\n + `
`\r\n + ``\r\n + `
`;\r\n }\r\n\r\n // Register [chart:{...json...}] as a native marked block extension so the\r\n // markdown parser handles chart markers inline with surrounding text.\r\n marked.use({\r\n extensions: [{\r\n name: 'chart',\r\n level: 'block',\r\n start(src) {\r\n const idx = src.indexOf('[chart:');\r\n return idx >= 0 ? idx : undefined;\r\n },\r\n tokenizer(src) {\r\n const extracted = tryExtractChartMarker(src);\r\n if (!extracted || extracted.startIndex !== 0) {\r\n return undefined;\r\n }\r\n\r\n const chartId = `chat_chart_${++chartCounter}`;\r\n\r\n return {\r\n type: 'chart',\r\n raw: src.substring(0, extracted.endIndex),\r\n chartId: chartId,\r\n json: extracted.json,\r\n };\r\n },\r\n renderer(token) {\r\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\r\n window.__chartConfigs[token.chartId] = token.json;\r\n return createChartHtml(token.chartId);\r\n }\r\n }]\r\n });\r\n\r\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\r\n function tryExtractChartMarker(text) {\r\n const token = '[chart:';\r\n const start = text.indexOf(token);\r\n if (start < 0) {\r\n return null;\r\n }\r\n\r\n // Find JSON object boundary by balancing braces\r\n const jsonStart = start + token.length;\r\n let i = jsonStart;\r\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\r\n i++;\r\n }\r\n\r\n if (i >= text.length || text[i] !== '{') {\r\n return null;\r\n }\r\n\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n\r\n for (; i < text.length; i++) {\r\n const ch = text[i];\r\n\r\n if (inString) {\r\n if (escape) {\r\n escape = false;\r\n continue;\r\n }\r\n if (ch === '\\\\') {\r\n escape = true;\r\n continue;\r\n }\r\n if (ch === '\"') {\r\n inString = false;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inString = true;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n depth++;\r\n } else if (ch === '}') {\r\n depth--;\r\n if (depth === 0) {\r\n const jsonEnd = i;\r\n // Expect closing bracket after JSON\r\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\r\n if (closeBracketIndex < 0) {\r\n return null;\r\n }\r\n\r\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\r\n return {\r\n startIndex: start,\r\n endIndex: closeBracketIndex + 1,\r\n json: json\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function renderChartsInMessage(message) {\r\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\r\n return;\r\n }\r\n\r\n // Copy and clear pending charts immediately to prevent duplicate renders.\r\n const charts = [...message._pendingCharts];\r\n message._pendingCharts = [];\r\n\r\n // Defer to requestAnimationFrame so the browser has fully laid out the\r\n // canvas elements before Chart.js reads their dimensions.\r\n requestAnimationFrame(() => {\r\n for (const c of charts) {\r\n const canvas = document.getElementById(c.chartId);\r\n if (!canvas) {\r\n continue;\r\n }\r\n\r\n if (typeof Chart === 'undefined') {\r\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\r\n continue;\r\n }\r\n\r\n // When the canvas is inside a hidden container (e.g., display:none),\r\n // it has zero dimensions. Keep the config for later rendering.\r\n if (canvas.offsetParent === null) {\r\n window.__chartConfigs[c.chartId] = c.config;\r\n continue;\r\n }\r\n\r\n try {\r\n // Destroy existing chart instance if re-rendering\r\n if (canvas._chartInstance) {\r\n canvas._chartInstance.destroy();\r\n }\r\n\r\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\r\n cfg.options ??= {};\r\n cfg.options.responsive = true;\r\n cfg.options.maintainAspectRatio = true;\r\n cfg.options.aspectRatio ??= 4 / 3;\r\n\r\n canvas._chartInstance = new Chart(canvas, cfg);\r\n } catch (e) {\r\n console.error('Error creating chart:', e);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Parse markdown content via marked (which natively handles [chart:...] markers\r\n // through the registered extension) and collect pending chart configs for later\r\n // Chart.js rendering.\r\n function parseMarkdownContent(content, message) {\r\n _pendingCharts = [];\r\n const html = marked.parse(content, { renderer });\r\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\r\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\r\n }\r\n\r\n const initialize = (instanceConfig) => {\r\n\r\n const config = Object.assign({}, defaultConfig, instanceConfig);\r\n // Keep defaultConfig in sync so renderers use overridden values\r\n defaultConfig = config;\r\n\r\n if (!config.signalRHubUrl) {\r\n console.error('The signalRHubUrl is required.');\r\n return;\r\n }\r\n\r\n if (!config.appElementSelector) {\r\n console.error('The appElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.chatContainerElementSelector) {\r\n console.error('The chatContainerElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.inputElementSelector) {\r\n console.error('The inputElementSelector is required.');\r\n return;\r\n }\r\n\r\n if (!config.sendButtonElementSelector) {\r\n console.error('The sendButtonElementSelector is required.');\r\n return;\r\n }\r\n\r\n const app = Vue.createApp({\r\n data() {\r\n return {\r\n inputElement: null,\r\n buttonElement: null,\r\n chatContainer: null,\r\n placeholder: null,\r\n isInteractionStarted: false,\r\n isPlaceholderVisible: true,\r\n isStreaming: false,\r\n isNavigatingAway: false,\r\n autoScroll: true,\r\n stream: null,\r\n messages: [],\r\n prompt: '',\r\n initialFieldValues: new Map(),\r\n settingsDirty: false,\r\n saveSettingsTimeout: null,\r\n saveIndicatorTimeout: null,\r\n isRecording: false,\r\n mediaRecorder: null,\r\n preRecordingPrompt: '',\r\n micButton: null,\r\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\r\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\r\n ttsVoiceName: config.ttsVoiceName || null,\r\n audioChunks: [],\r\n audioPlayQueue: [],\r\n isPlayingAudio: false,\r\n currentAudioElement: null,\r\n currentAudioUrl: null,\r\n ttsPlayingMessageIndex: -1,\r\n ttsAudioCache: {},\r\n ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2),\r\n conversationModeEnabled: config.chatMode === 'Conversation',\r\n conversationButton: null,\r\n isConversationMode: false,\r\n notifications: [],\r\n notificationDismissTimers: {},\r\n };\r\n },\r\n computed: {\r\n lastAssistantIndex() {\r\n for (var i = this.messages.length - 1; i >= 0; i--) {\r\n if (this.messages[i].role === 'assistant') {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n },\r\n methods: {\r\n handleBeforeUnload() {\r\n this.isNavigatingAway = true;\r\n },\r\n async startConnection() {\r\n this.connection = new signalR.HubConnectionBuilder()\r\n .withUrl(config.signalRHubUrl)\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n // Allow long-running operations (e.g., multi-step MCP tool calls)\r\n // without the client disconnecting prematurely.\r\n this.connection.serverTimeoutInMilliseconds = 600000;\r\n this.connection.keepAliveIntervalInMilliseconds = 15000;\r\n\r\n this.connection.on(\"LoadInteraction\", (data) => {\r\n this.initializeInteraction(data.itemId, true);\r\n this.messages = [];// Update the title field if it exists\r\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\r\n if (titleInput && data.title) {\r\n titleInput.value = data.title;\r\n }\r\n\r\n (data.messages ?? []).forEach(msg => {\r\n this.addMessage(msg);\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n });\r\n });\r\n });\r\n\r\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\r\n // Update the history list item if it exists\r\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\r\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\r\n if (historyItem) {\r\n historyItem.textContent = title || config.untitledText;\r\n }\r\n\r\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\r\n if (titleInput && title) {\r\n titleInput.value = title;\r\n }\r\n\r\n this.showSaveIndicator('Saved', 'text-success');\r\n });\r\n\r\n this.connection.on(\"ReceiveError\", (error) => {\r\n console.error(\"SignalR Error: \", error);\r\n this.showSaveIndicator('Save failed', 'text-danger');\r\n\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\r\n if (this.isConversationMode) {\r\n if (!isFinal && text) {\r\n this._conversationPartialTranscript = text;\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n var html = '

' + escaped + '

';\r\n\r\n // Show partial transcript as a live user message.\r\n if (!this._conversationPartialMessage) {\r\n this.hidePlaceholder();\r\n this._conversationPartialMessage = {\r\n role: 'user',\r\n content: text,\r\n htmlContent: html,\r\n isPartial: true\r\n };\r\n this.messages.push(this._conversationPartialMessage);\r\n } else {\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = html;\r\n }\r\n this.scrollToBottom();\r\n }\r\n return;\r\n }\r\n\r\n if (text && !this._audioInputSent) {\r\n this.prompt = this.preRecordingPrompt + text;\r\n if (this.inputElement) {\r\n this.inputElement.value = this.prompt;\r\n this.inputElement.dispatchEvent(new Event('input'));\r\n }\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, text) => {\r\n if (text) {\r\n this.stopAudio();\r\n\r\n // If there's an interrupted assistant message still streaming,\r\n // mark it as done to stop the spinner animation.\r\n if (this._conversationAssistantMessage) {\r\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\r\n if (oldMsg) {\r\n oldMsg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Replace the partial transcript message with the final one.\r\n if (this._conversationPartialMessage) {\r\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\r\n this._conversationPartialMessage.content = text;\r\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\r\n this._conversationPartialMessage.isPartial = false;\r\n this._conversationPartialMessage = null;\r\n } else {\r\n this.addMessage({\r\n role: 'user',\r\n content: text\r\n });\r\n }\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, appearance) => {\r\n if (!this._conversationAssistantMessage) {\r\n this.stopAudio();\r\n this.hideTypingIndicator();\r\n\r\n // Ensure no stale streaming indicators remain from prior messages.\r\n for (var j = 0; j < this.messages.length; j++) {\r\n if (this.messages[j].isStreaming) {\r\n this.messages[j].isStreaming = false;\r\n }\r\n }\r\n\r\n var msgIndex = this.messages.length;\r\n var newMessage = {\r\n id: messageId,\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n appearance: this.normalizeAssistantAppearance(appearance),\r\n };\r\n this.messages.push(newMessage);\r\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\r\n }\r\n\r\n this._conversationAssistantMessage.content += token;\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n if (!msg.appearance) {\r\n msg.appearance = this.normalizeAssistantAppearance(appearance);\r\n }\r\n msg.content = this._conversationAssistantMessage.content;\r\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\r\n this.$nextTick(() => {\r\n renderChartsInMessage(msg);\r\n this.scrollToBottom();\r\n });\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId) => {\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\r\n if (base64Audio) {\r\n const binaryString = atob(base64Audio);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n this.audioChunks.push(bytes);\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\r\n this.playCollectedAudio();\r\n });\r\n\r\n this.connection.on(\"HistoryCleared\", (itemId) => {\r\n // Clear messages and show placeholder\r\n this.messages = [];\r\n this.showPlaceholder();\r\n\r\n // Hide the clear history button since there's no history now\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.classList.add('d-none');\r\n }\r\n });\r\n\r\n this.connection.on(\"ReceiveNotification\", (notification) => {\r\n this.receiveNotification(notification);\r\n });\r\n\r\n this.connection.on(\"UpdateNotification\", (notification) => {\r\n this.updateNotification(notification);\r\n });\r\n\r\n this.connection.on(\"RemoveNotification\", (notificationType) => {\r\n this.removeNotification(notificationType);\r\n });\r\n\r\n this.connection.onreconnecting(() => {\r\n console.warn(\"SignalR: reconnecting...\");\r\n });\r\n\r\n this.connection.onreconnected(() => {\r\n console.info(\"SignalR: reconnected.\");\r\n this.reloadCurrentInteraction();\r\n });\r\n\r\n this.connection.onclose((error) => {\r\n if (this.isNavigatingAway) {\r\n return;\r\n }\r\n\r\n if (error) {\r\n console.warn(\"SignalR connection closed with error:\", error.message || error);\r\n }\r\n });\r\n\r\n try {\r\n await this.connection.start();\r\n } catch (err) {\r\n console.error(\"SignalR Connection Error: \", err);\r\n }\r\n },\r\n addMessageInternal(message) {\r\n if (message.role === 'assistant') {\r\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\r\n }\r\n\r\n if (message.content && !message.htmlContent) {\r\n message.htmlContent = parseMarkdownContent(message.content, message);\r\n }\r\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\r\n this.messages.push(message);\r\n\r\n this.$nextTick(() => {\r\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\r\n });\r\n },\r\n addMessage(message) {\r\n if (message.content) {\r\n let processedContent = message.content.trim();\r\n\r\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\r\n\r\n // Only include references that were actually cited in the response.\r\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\r\n\r\n if (citedRefs.length) {\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders.\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processedContent = processedContent.replaceAll(key, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processedContent = processedContent.replaceAll('
', ',');\r\n\r\n processedContent += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || `[doc:${value.index}]`;\r\n processedContent += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n }\r\n }\r\n\r\n message.content = processedContent;\r\n message.htmlContent = parseMarkdownContent(processedContent, message);\r\n }\r\n\r\n this.addMessageInternal(message);\r\n this.hidePlaceholder();\r\n\r\n this.$nextTick(() => {\r\n // Render any pending charts once the DOM is updated\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n hidePlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.add('d-none');\r\n }\r\n this.isPlaceholderVisible = false;\r\n },\r\n showPlaceholder() {\r\n if (this.placeholder) {\r\n this.placeholder.classList.remove('d-none');\r\n }\r\n this.isPlaceholderVisible = true;\r\n },\r\n fireEvent(event) {\r\n document.dispatchEvent(event);\r\n },\r\n normalizeAssistantAppearance(appearance) {\r\n if (!appearance) {\r\n return null;\r\n }\r\n\r\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\r\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\r\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\r\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\r\n\r\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\r\n return null;\r\n }\r\n\r\n return {\r\n label: label,\r\n icon: icon,\r\n cssClass: cssClass,\r\n disableStreamingAnimation: disableStreamingAnimation,\r\n };\r\n },\r\n getAssistantLabel(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\r\n },\r\n getAssistantRoleClasses(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n var classes = ['ai-chat-msg-role'];\r\n\r\n if (appearance && appearance.cssClass) {\r\n classes.push(appearance.cssClass);\r\n } else {\r\n classes.push('ai-chat-msg-role-assistant');\r\n }\r\n\r\n return classes;\r\n },\r\n getAssistantIconClasses(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\r\n },\r\n getAssistantIcon(message) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\r\n },\r\n shouldAnimateAssistantIcon(message, index) {\r\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\r\n return !!message &&\r\n message.isStreaming &&\r\n index === this.lastAssistantIndex &&\r\n !(appearance && appearance.disableStreamingAnimation);\r\n },\r\n isIndicator(message) {\r\n return message.role === 'indicator';\r\n },\r\n async sendMessage() {\r\n let trimmedPrompt = this.prompt.trim();\r\n\r\n if (!trimmedPrompt) {\r\n return;\r\n }\r\n\r\n // Stop any active recording before sending.\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n }\r\n\r\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\r\n this._audioInputSent = true;\r\n\r\n // Flush any pending settings save before sending a message\r\n // to prevent concurrent hub calls that can cause database deadlocks.\r\n await this.flushPendingSave();\r\n\r\n this.addMessage({\r\n role: 'user',\r\n content: trimmedPrompt\r\n });\r\n\r\n // Show the clear history button since we now have prompts\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.classList.remove('d-none');\r\n }\r\n\r\n this.streamMessage(trimmedPrompt);\r\n this.inputElement.value = '';\r\n this.prompt = '';\r\n },\r\n streamMessage(trimmedPrompt) {\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n\r\n this.streamingStarted();\r\n this.showTypingIndicator();\r\n this.autoScroll = true;\r\n\r\n var content = '';\r\n var references = {};\r\n var lastResponseId = null;\r\n\r\n var messageIndex = this.messages.length;\r\n var currentItemId = this.getItemId();\r\n\r\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\r\n .subscribe({\r\n next: (chunk) => {\r\n let message = this.messages[messageIndex];\r\n\r\n if (!message) {\r\n if (chunk.sessionId && !currentItemId) {\r\n this.setItemId(chunk.sessionId);\r\n }\r\n\r\n this.hideTypingIndicator();\r\n messageIndex = this.messages.length;\r\n let newMessage = {\r\n role: \"assistant\",\r\n content: \"\",\r\n htmlContent: \"\",\r\n isStreaming: true,\r\n };\r\n\r\n this.messages.push(newMessage);\r\n message = newMessage;\r\n }\r\n\r\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\r\n for (const [key, value] of Object.entries(chunk.references)) {\r\n references[key] = value;\r\n }\r\n }\r\n\r\n if (chunk.content) {\r\n // When the responseId changes (e.g., after an internal tool call),\r\n // insert a line break to visually separate response segments.\r\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\r\n content += '\\n\\n';\r\n }\r\n\r\n if (chunk.responseId) {\r\n lastResponseId = chunk.responseId;\r\n }\r\n\r\n let processedContent = chunk.content;\r\n\r\n for (const [key, value] of Object.entries(references)) {\r\n processedContent = processedContent.replaceAll(key, `${value.index}`);\r\n }\r\n\r\n content += processedContent.replaceAll('
', ',');\r\n }\r\n\r\n message.content = content;\r\n\r\n message.htmlContent = parseMarkdownContent(content, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n },\r\n complete: () => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n if (!msg || !msg.content) {\r\n // No content received at all.\r\n this.hideTypingIndicator();\r\n }\r\n\r\n // Trigger text-to-speech only in conversation mode.\r\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\r\n this.synthesizeSpeech(msg.content);\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n },\r\n error: (err) => {\r\n this.processReferences(references, messageIndex);\r\n this.streamingFinished();\r\n\r\n let msg = this.messages[messageIndex];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n\r\n this.hideTypingIndicator();\r\n\r\n if (!this.isNavigatingAway) {\r\n this.addMessage(this.getServiceDownMessage());\r\n }\r\n\r\n this.stream?.dispose();\r\n this.stream = null;\r\n\r\n console.error(\"Stream error:\", err);\r\n }\r\n });\r\n },\r\n getServiceDownMessage() {\r\n return {\r\n role: \"assistant\",\r\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\r\n htmlContent: \"\",\r\n };\r\n },\r\n processReferences(references, messageIndex) {\r\n if (Object.keys(references).length) {\r\n let message = this.messages[messageIndex];\r\n const content = message.content || '';\r\n\r\n // Only include references that were actually cited in the response.\r\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\r\n const citedRefs = Object.entries(references).filter(([key, value]) =>\r\n content.includes(key) || content.includes(`${value.index}`)\r\n );\r\n\r\n if (!citedRefs.length) {\r\n return;\r\n }\r\n\r\n // Sort by original index so display indices follow a natural order.\r\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\r\n\r\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\r\n let processed = content.trim();\r\n let displayIndex = 1;\r\n for (const [key, value] of citedRefs) {\r\n const placeholder = `__CITE_${value.index}__`;\r\n processed = processed.replaceAll(key, placeholder);\r\n processed = processed.replaceAll(`${value.index}`, placeholder);\r\n value._displayIndex = displayIndex++;\r\n value._placeholder = placeholder;\r\n }\r\n\r\n // Phase 2: Replace placeholders with sequential display indices.\r\n for (const [, value] of citedRefs) {\r\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\r\n }\r\n\r\n processed = processed.replaceAll('', ',');\r\n\r\n processed += '

';\r\n\r\n for (const [key, value] of citedRefs) {\r\n const label = value.text || `[doc:${value.index}]`;\r\n processed += value.link\r\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\r\n : `**${value._displayIndex}**. ${label}
`;\r\n }\r\n\r\n message.content = processed;\r\n message.htmlContent = parseMarkdownContent(processed, message);\r\n\r\n this.messages[messageIndex] = message;\r\n\r\n this.$nextTick(() => {\r\n renderChartsInMessage(message);\r\n this.scrollToBottom();\r\n });\r\n }\r\n },\r\n streamingStarted() {\r\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\r\n\r\n if (stopIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n },\r\n streamingFinished() {\r\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\r\n\r\n if (startIcon) {\r\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n\r\n // Directly manipulate the DOM to stop all streaming animations.\r\n if (this.chatContainer) {\r\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\r\n for (var i = 0; i < icons.length; i++) {\r\n icons[i].classList.remove('ai-streaming-icon');\r\n icons[i].classList.add('ai-bot-icon');\r\n }\r\n }\r\n\r\n // Also update Vue data for consistency.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Save any settings that were deferred during streaming.\r\n if (this.settingsDirty) {\r\n this.debouncedSaveSettings();\r\n }\r\n },\r\n handleExternalTtsStop(e) {\r\n if (e?.detail?.sourceId === this.ttsInstanceId) {\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n },\r\n synthesizeSpeech(text, cacheIndex) {\r\n if (!this.textToSpeechEnabled || !text || !this.connection) {\r\n return;\r\n }\r\n\r\n this.audioChunks = [];\r\n this.isPlayingAudio = true;\r\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\r\n\r\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\r\n .catch(err => {\r\n console.error(\"TTS synthesis error:\", err);\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this._ttsCacheIndex = -1;\r\n });\r\n },\r\n toggleMessageTts(message, index) {\r\n if (this.ttsPlayingMessageIndex === index) {\r\n this.stopAudio();\r\n return;\r\n }\r\n\r\n this.stopAudio(false);\r\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\r\n detail: { sourceId: this.ttsInstanceId }\r\n }));\r\n this.ttsPlayingMessageIndex = index;\r\n\r\n if (this.ttsAudioCache[index]) {\r\n this.playAudioBlob(this.ttsAudioCache[index]);\r\n return;\r\n }\r\n\r\n this.synthesizeSpeech(message.content, index);\r\n },\r\n playCollectedAudio() {\r\n if (this.audioChunks.length === 0) {\r\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n }\r\n return;\r\n }\r\n\r\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\r\n const combined = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const chunk of this.audioChunks) {\r\n combined.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n this.audioChunks = [];\r\n\r\n const blob = new Blob([combined], { type: 'audio/mp3' });\r\n\r\n if (this._ttsCacheIndex >= 0) {\r\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\r\n this._ttsCacheIndex = -1;\r\n }\r\n\r\n // If audio is currently playing, queue this blob for later.\r\n if (this.isPlayingAudio && this.currentAudioElement) {\r\n this.audioPlayQueue.push(blob);\r\n return;\r\n }\r\n\r\n this.playAudioBlob(blob);\r\n },\r\n playAudioBlob(blob) {\r\n const url = URL.createObjectURL(blob);\r\n const audio = new Audio(url);\r\n\r\n this.currentAudioUrl = url;\r\n this.currentAudioElement = audio;\r\n this.isPlayingAudio = true;\r\n\r\n audio.addEventListener('ended', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.addEventListener('error', () => {\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.playNextInQueue();\r\n });\r\n\r\n audio.play().catch(err => {\r\n console.error(\"Audio playback error:\", err);\r\n this.currentAudioElement = null;\r\n this.currentAudioUrl = null;\r\n URL.revokeObjectURL(url);\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n });\r\n },\r\n playNextInQueue() {\r\n if (this.audioPlayQueue.length > 0) {\r\n const nextBlob = this.audioPlayQueue.shift();\r\n this.playAudioBlob(nextBlob);\r\n } else {\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n this.conversationModeOnAudioEnded();\r\n }\r\n },\r\n stopAudio() {\r\n if (this.currentAudioElement) {\r\n this.currentAudioElement.pause();\r\n this.currentAudioElement.currentTime = 0;\r\n this.currentAudioElement = null;\r\n }\r\n if (this.currentAudioUrl) {\r\n URL.revokeObjectURL(this.currentAudioUrl);\r\n this.currentAudioUrl = null;\r\n }\r\n this.audioChunks = [];\r\n this.audioPlayQueue = [];\r\n this.isPlayingAudio = false;\r\n this.ttsPlayingMessageIndex = -1;\r\n },\r\n toggleConversationMode() {\r\n if (this.isConversationMode) {\r\n this.stopConversationMode();\r\n } else {\r\n this.startConversationMode();\r\n }\r\n },\r\n startConversationMode() {\r\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = true;\r\n this.updateConversationButton();\r\n this._conversationPartialTranscript = '';\r\n this._conversationAssistantMessage = null;\r\n this._conversationPartialMessage = null;\r\n\r\n // Remove any previous conversation ended notification.\r\n this.removeNotification('conversation-ended');\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this._conversationSubject = new signalR.Subject();\r\n this._conversationStream = stream;\r\n\r\n // Create an AnalyserNode for volume-based interrupt detection.\r\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\r\n if (AudioCtx) {\r\n this._conversationAudioCtx = new AudioCtx();\r\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\r\n this._conversationAnalyser.fftSize = 256;\r\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\r\n micSource.connect(this._conversationAnalyser);\r\n }\r\n\r\n var pendingChunk = Promise.resolve();\r\n var analyser = this._conversationAnalyser;\r\n var interruptVolumeThreshold = 30;\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n // During TTS playback, check mic volume to detect\r\n // user interruption (speaking above threshold).\r\n if (this.isPlayingAudio && analyser) {\r\n var freqData = new Uint8Array(analyser.frequencyBinCount);\r\n analyser.getByteFrequencyData(freqData);\r\n var sum = 0;\r\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\r\n var avg = sum / freqData.length;\r\n\r\n if (avg >= interruptVolumeThreshold) {\r\n // User is speaking — interrupt TTS playback.\r\n this.stopAudio();\r\n }\r\n }\r\n\r\n // Always send audio to STT — browser echo cancellation\r\n // handles speaker echo; continuous audio avoids gaps\r\n // that increase recognition latency.\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n try {\r\n this._conversationSubject.next(base64);\r\n } catch (err) {\r\n // Subject may have been completed already.\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => {\r\n try {\r\n this._conversationSubject.complete();\r\n } catch (err) {\r\n // Already completed.\r\n }\r\n });\r\n });\r\n\r\n var itemId = this.getItemId();\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n });\r\n },\r\n stopConversationMode() {\r\n if (!this.isConversationMode) {\r\n return;\r\n }\r\n\r\n this.isConversationMode = false;\r\n this.updateConversationButton();\r\n\r\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\r\n if (this.connection) {\r\n this.connection.invoke(\"StopConversation\").catch(function () { });\r\n }\r\n\r\n if (this.isRecording && this.mediaRecorder) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n }\r\n\r\n this.stopAudio();\r\n this._conversationPartialTranscript = '';\r\n this._conversationPartialMessage = null;\r\n\r\n // Clean up the AudioContext used for volume monitoring.\r\n if (this._conversationAudioCtx) {\r\n this._conversationAudioCtx.close().catch(function () { });\r\n this._conversationAudioCtx = null;\r\n this._conversationAnalyser = null;\r\n }\r\n\r\n // Mark any in-flight assistant message as done to stop the spinner.\r\n if (this._conversationAssistantMessage) {\r\n var msg = this.messages[this._conversationAssistantMessage.index];\r\n if (msg) {\r\n msg.isStreaming = false;\r\n }\r\n this._conversationAssistantMessage = null;\r\n }\r\n\r\n // Safety net: clear all lingering streaming indicators.\r\n for (var i = 0; i < this.messages.length; i++) {\r\n if (this.messages[i].isStreaming) {\r\n this.messages[i].isStreaming = false;\r\n }\r\n }\r\n\r\n // Show a \"conversation ended\" notification system message.\r\n this.receiveNotification({\r\n type: 'conversation-ended',\r\n content: 'Conversation ended.',\r\n icon: 'fa-solid fa-circle-check',\r\n dismissible: true,\r\n autoDismissMs: 5000\r\n });\r\n },\r\n updateConversationButton() {\r\n if (!this.conversationButton) {\r\n return;\r\n }\r\n\r\n if (this.isConversationMode) {\r\n this.conversationButton.classList.add('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\r\n var endHtml = this.conversationButton.getAttribute('data-end-html');\r\n if (endHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n } else {\r\n this.conversationButton.classList.remove('active', 'btn-primary');\r\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\r\n this.conversationButton.classList.add('btn-outline-dark');\r\n this.conversationButton.blur();\r\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\r\n var startHtml = this.conversationButton.getAttribute('data-start-html');\r\n if (startHtml) {\r\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\r\n }\r\n }\r\n },\r\n conversationModeSendPrompt() {\r\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\r\n },\r\n conversationModeOnAudioEnded() {\r\n // Legacy: in conversation mode, continuation is handled\r\n // by the persistent stream.\r\n },\r\n showTypingIndicator() {\r\n this.addMessage({\r\n role: 'indicator',\r\n htmlContent: config.indicatorTemplate\r\n });\r\n },\r\n hideTypingIndicator() {\r\n const originalLength = this.messages.length;\r\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\r\n const removedCount = originalLength - this.messages.length;\r\n return removedCount;\r\n },\r\n scrollToBottom() {\r\n if (!this.autoScroll) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\r\n }, 50);\r\n },\r\n handleUserInput(event) {\r\n this.prompt = event.target.value;\r\n },\r\n getItemId() {\r\n return this.inputElement.getAttribute('data-interaction-id')\r\n || this.inputElement.getAttribute('data-item-id');\r\n },\r\n getSaveIndicatorElement() {\r\n if (config.saveIndicatorElementSelector) {\r\n return document.querySelector(config.saveIndicatorElementSelector);\r\n }\r\n\r\n return document.querySelector('[data-chat-interaction-save-indicator]');\r\n },\r\n showSaveIndicator(text, className) {\r\n const indicator = this.getSaveIndicatorElement();\r\n if (!indicator) {\r\n return;\r\n }\r\n\r\n indicator.textContent = text || '';\r\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\r\n\r\n if (this.saveIndicatorTimeout) {\r\n clearTimeout(this.saveIndicatorTimeout);\r\n this.saveIndicatorTimeout = null;\r\n }\r\n\r\n if (!text) {\r\n return;\r\n }\r\n\r\n this.saveIndicatorTimeout = setTimeout(() => {\r\n indicator.textContent = '';\r\n this.saveIndicatorTimeout = null;\r\n }, 3000);\r\n },\r\n clearPendingSettingsSave() {\r\n if (this.saveSettingsTimeout) {\r\n clearTimeout(this.saveSettingsTimeout);\r\n this.saveSettingsTimeout = null;\r\n }\r\n },\r\n getFieldLabel(input) {\r\n const label = input\r\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\r\n ?.querySelector('label');\r\n\r\n if (!label) {\r\n return input.dataset.setting || 'This field';\r\n }\r\n\r\n return (label.textContent || '')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n || input.dataset.setting\r\n || 'This field';\r\n },\r\n getValidationFeedbackElement(input) {\r\n let feedback = input.nextElementSibling;\r\n if (feedback && feedback.classList.contains('invalid-feedback')) {\r\n return feedback;\r\n }\r\n\r\n feedback = document.createElement('div');\r\n feedback.className = 'invalid-feedback';\r\n input.insertAdjacentElement('afterend', feedback);\r\n\r\n return feedback;\r\n },\r\n clearSettingValidationError(input) {\r\n input.classList.remove('is-invalid');\r\n input.removeAttribute('aria-invalid');\r\n\r\n const feedback = input.nextElementSibling;\r\n if (feedback && feedback.classList.contains('invalid-feedback')) {\r\n feedback.textContent = '';\r\n }\r\n },\r\n setSettingValidationError(input, message) {\r\n const feedback = this.getValidationFeedbackElement(input);\r\n input.classList.add('is-invalid');\r\n input.setAttribute('aria-invalid', 'true');\r\n feedback.textContent = message;\r\n },\r\n getSettingValidationMessage(input) {\r\n if (!input || input.disabled || input.type !== 'number') {\r\n return null;\r\n }\r\n\r\n const value = (input.value || '').trim();\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const number = Number(value);\r\n const fieldLabel = this.getFieldLabel(input);\r\n\r\n if (Number.isNaN(number)) {\r\n return `${fieldLabel} must be a valid number.`;\r\n }\r\n\r\n const min = input.getAttribute('min');\r\n if (min !== null && number < Number(min)) {\r\n return `${fieldLabel} must be ${min} or greater.`;\r\n }\r\n\r\n const max = input.getAttribute('max');\r\n if (max !== null && number > Number(max)) {\r\n return `${fieldLabel} must be ${max} or less.`;\r\n }\r\n\r\n return null;\r\n },\r\n validateSettingInput(input) {\r\n const message = this.getSettingValidationMessage(input);\r\n if (!message) {\r\n this.clearSettingValidationError(input);\r\n return true;\r\n }\r\n\r\n this.setSettingValidationError(input, message);\r\n return false;\r\n },\r\n validateSettings() {\r\n let isValid = true;\r\n\r\n this.getSettingInputs().forEach(input => {\r\n isValid = this.validateSettingInput(input) && isValid;\r\n });\r\n\r\n return isValid;\r\n },\r\n queueSettingsSave() {\r\n if (!this.validateSettings()) {\r\n this.clearPendingSettingsSave();\r\n this.settingsDirty = false;\r\n this.showSaveIndicator('Fix errors', 'text-danger');\r\n return;\r\n }\r\n\r\n this.settingsDirty = true;\r\n this.showSaveIndicator('Saving...', 'text-warning');\r\n this.debouncedSaveSettings();\r\n },\r\n getSettingInputs() {\r\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\r\n if (explicitInputs.length > 0) {\r\n return explicitInputs;\r\n }\r\n\r\n return document.querySelectorAll(\r\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\r\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\r\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\r\n );\r\n },\r\n getSelectedGroupValues(groupName, fallbackSelector) {\r\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked`);\r\n if (explicitSelections.length > 0) {\r\n const values = [];\r\n\r\n explicitSelections.forEach(checkbox => {\r\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\r\n if (value) {\r\n values.push(value);\r\n }\r\n });\r\n\r\n return values;\r\n }\r\n\r\n if (!fallbackSelector) {\r\n return [];\r\n }\r\n\r\n const values = [];\r\n const checkboxes = document.querySelectorAll(fallbackSelector);\r\n\r\n checkboxes.forEach(checkbox => {\r\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\r\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\r\n\r\n if (hiddenInput && hiddenInput.value) {\r\n values.push(hiddenInput.value);\r\n }\r\n });\r\n\r\n return values;\r\n },\r\n getPromptTemplateSelections() {\r\n const promptTemplates = [];\r\n\r\n document.querySelectorAll('.prompt-template-card').forEach(card => {\r\n const templateIdInput = card.querySelector('.prompt-template-id-input');\r\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\r\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\r\n\r\n if (!templateId) {\r\n return;\r\n }\r\n\r\n promptTemplates.push({\r\n templateId: templateId,\r\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\r\n });\r\n });\r\n\r\n return promptTemplates;\r\n },\r\n receiveNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n // Replace existing notification with same type, or add new one.\r\n var idx = this.notifications.findIndex(n => n.type === notification.type);\r\n if (idx >= 0) {\r\n this.notifications.splice(idx, 1, notification);\r\n } else {\r\n this.notifications.push(notification);\r\n }\r\n this.scheduleNotificationDismiss(notification);\r\n this.scrollToBottom();\r\n },\r\n updateNotification(notification) {\r\n if (!notification || !notification.type) {\r\n return;\r\n }\r\n this.clearNotificationDismiss(notification.type);\r\n var idx = this.notifications.findIndex(n => n.type === notification.type);\r\n if (idx >= 0) {\r\n this.notifications.splice(idx, 1, notification);\r\n this.scheduleNotificationDismiss(notification);\r\n this.scrollToBottom();\r\n }\r\n },\r\n scheduleNotificationDismiss(notification) {\r\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\r\n return;\r\n }\r\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\r\n this.removeNotification(notification.type);\r\n }, notification.autoDismissMs);\r\n },\r\n clearNotificationDismiss(notificationType) {\r\n var timerId = this.notificationDismissTimers[notificationType];\r\n if (!timerId) {\r\n return;\r\n }\r\n clearTimeout(timerId);\r\n delete this.notificationDismissTimers[notificationType];\r\n },\r\n removeNotification(notificationType) {\r\n this.clearNotificationDismiss(notificationType);\r\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\r\n },\r\n dismissNotification(notificationType) {\r\n this.removeNotification(notificationType);\r\n },\r\n handleNotificationAction(notificationType, actionName) {\r\n if (!this.connection) {\r\n return;\r\n }\r\n var itemId = this.getItemId();\r\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\r\n .catch(err => console.error('Failed to handle notification action:', err));\r\n },\r\n setItemId(itemId) {\r\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\r\n this.inputElement.setAttribute('data-item-id', itemId || '');\r\n },\r\n resetInteraction() {\r\n this.setItemId('');\r\n this.isInteractionStarted = false;\r\n this.messages = [];\r\n this.showPlaceholder();\r\n },\r\n initializeApp() {\r\n this.inputElement = document.querySelector(config.inputElementSelector);\r\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\r\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\r\n this.placeholder = document.querySelector(config.placeholderElementSelector);\r\n\r\n const itemId = this.getItemId();\r\n if (itemId) {\r\n this.loadInteraction(itemId);\r\n }\r\n\r\n // Pause auto-scroll when the user manually scrolls up during streaming.\r\n this.chatContainer.addEventListener('scroll', () => {\r\n if (!this.stream) {\r\n return;\r\n }\r\n const threshold = 30;\r\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\r\n this.autoScroll = atBottom;\r\n });\r\n\r\n this.inputElement.addEventListener('keyup', event => {\r\n if (this.stream != null) {\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" && !event.shiftKey) {\r\n this.buttonElement.click();\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('input', (e) => {\r\n this.handleUserInput(e);\r\n\r\n if (e.target.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n });\r\n\r\n this.inputElement.addEventListener('paste', (e) => {\r\n // Use setTimeout to allow the paste to complete before checking the value\r\n setTimeout(() => {\r\n this.prompt = this.inputElement.value;\r\n if (this.inputElement.value.trim()) {\r\n this.buttonElement.removeAttribute('disabled');\r\n } else {\r\n this.buttonElement.setAttribute('disabled', true);\r\n }\r\n }, 0);\r\n });\r\n\r\n this.buttonElement.addEventListener('click', () => {\r\n if (this.stream != null) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n\r\n this.streamingFinished();\r\n this.hideTypingIndicator();\r\n\r\n // Clean up: remove empty assistant message or stop streaming animation.\r\n if (this.messages.length > 0) {\r\n const lastMsg = this.messages[this.messages.length - 1];\r\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\r\n this.messages.pop();\r\n } else if (lastMsg.isStreaming) {\r\n lastMsg.isStreaming = false;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.sendMessage();\r\n });\r\n\r\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\r\n\r\n for (var i = 0; i < chatInteractionItems.length; i++) {\r\n chatInteractionItems[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n var itemId = e.target.getAttribute('data-interaction-id');\r\n\r\n if (!itemId) {\r\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\r\n return;\r\n }\r\n\r\n this.loadInteraction(itemId);\r\n });\r\n }\r\n\r\n for (let i = 0; i < config.messages.length; i++) {\r\n this.addMessage(config.messages[i]);\r\n }\r\n\r\n // Delegate click for code block copy buttons.\r\n if (this.chatContainer) {\r\n this.chatContainer.addEventListener('click', (e) => {\r\n var btn = e.target.closest('.ai-code-copy-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n\r\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\r\n if (!block) {\r\n return;\r\n }\r\n\r\n var codeEl = block.querySelector('code');\r\n if (codeEl) {\r\n navigator.clipboard.writeText(codeEl.textContent);\r\n var copiedText = config.codeCopiedText || 'Copied!';\r\n btn.innerHTML = ' ' + copiedText;\r\n setTimeout(() => {\r\n btn.innerHTML = '';\r\n }, 2000);\r\n }\r\n });\r\n }\r\n\r\n document.addEventListener('input', event => {\r\n if (event.target.matches('.setting-input[data-setting]')) {\r\n this.validateSettingInput(event.target);\r\n this.queueSettingsSave();\r\n }\r\n });\r\n\r\n document.addEventListener('change', event => {\r\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .group-toggle, .ci-agent-global-toggle')) {\r\n if (event.target.matches('.setting-input[data-setting]')) {\r\n this.validateSettingInput(event.target);\r\n }\r\n\r\n this.queueSettingsSave();\r\n return;\r\n }\r\n\r\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\r\n this.queueSettingsSave();\r\n }\r\n });\r\n\r\n document.addEventListener('click', event => {\r\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\r\n return;\r\n }\r\n\r\n setTimeout(() => {\r\n this.queueSettingsSave();\r\n }, 0);\r\n });\r\n\r\n // Add event listener for clear history button\r\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\r\n if (clearHistoryBtn) {\r\n clearHistoryBtn.addEventListener('click', () => {\r\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\r\n if (itemId) {\r\n this.clearHistory(itemId);\r\n }\r\n });\r\n }\r\n\r\n // Initialize speech-to-text microphone button.\r\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\r\n this.micButton = document.querySelector(config.micButtonElementSelector);\r\n if (this.micButton) {\r\n this.micButton.style.display = '';\r\n this.micButton.addEventListener('click', () => {\r\n this.toggleRecording();\r\n });\r\n }\r\n }\r\n\r\n // Initialize conversation mode button.\r\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\r\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\r\n if (this.conversationButton) {\r\n this.conversationButton.addEventListener('click', () => {\r\n this.toggleConversationMode();\r\n });\r\n }\r\n }\r\n },\r\n loadInteraction(itemId) {\r\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\r\n },\r\n reloadCurrentInteraction() {\r\n const itemId = this.getItemId();\r\n if (itemId) {\r\n this.loadInteraction(itemId);\r\n }\r\n },\r\n clearHistory(itemId) {\r\n const self = this;\r\n confirmDialog({\r\n title: config.clearHistoryTitle,\r\n message: config.clearHistoryMessage,\r\n okText: config.clearHistoryOkText,\r\n cancelText: config.clearHistoryCancelText,\r\n callback: function (confirmed) {\r\n if (confirmed) {\r\n // Cancel any active stream before clearing history.\r\n if (self.stream) {\r\n self.stream.dispose();\r\n self.stream = null;\r\n self.hideTypingIndicator();\r\n self.streamingFinished();\r\n }\r\n\r\n self.connection.invoke(\"ClearHistory\", itemId)\r\n .catch(err => console.error('Error clearing history:', err));\r\n }\r\n }\r\n });\r\n },\r\n debouncedSaveSettings() {\r\n // Clear any existing timeout to reset the debounce timer\r\n this.clearPendingSettingsSave();\r\n\r\n // Don't save while streaming — it will be saved when streaming completes.\r\n if (this.stream) {\r\n return;\r\n }\r\n\r\n // Set a new timeout to save after 850ms of no changes\r\n this.saveSettingsTimeout = setTimeout(() => {\r\n if (this.settingsDirty) {\r\n this.saveSettings();\r\n this.settingsDirty = false;\r\n }\r\n this.saveSettingsTimeout = null;\r\n }, 850);\r\n },\r\n getSelectedToolNames() {\r\n return this.getSelectedGroupValues(\r\n 'toolNames',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\r\n );\r\n },\r\n getSelectedMcpConnectionIds() {\r\n return this.getSelectedGroupValues(\r\n 'mcpConnectionIds',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\r\n );\r\n },\r\n getSelectedA2AConnectionIds() {\r\n return this.getSelectedGroupValues('a2aConnectionIds');\r\n },\r\n getSelectedAgentNames() {\r\n return this.getSelectedGroupValues(\r\n 'agentNames',\r\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\r\n );\r\n },\r\n saveSettings() {\r\n const itemId = this.getItemId();\r\n if (!itemId) {\r\n return Promise.resolve();\r\n }\r\n\r\n if (!this.validateSettings()) {\r\n this.showSaveIndicator('Fix errors', 'text-danger');\r\n return Promise.resolve();\r\n }\r\n\r\n const settings = {};\r\n\r\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\r\n // This avoids coupling the JS to specific field names — new fields added by\r\n // any module are automatically included.\r\n const inputs = this.getSettingInputs();\r\n\r\n inputs.forEach(input => {\r\n const key = input.dataset.setting\r\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\r\n\r\n if (!key) {\r\n return;\r\n }\r\n\r\n if (input.type === 'checkbox') {\r\n settings[key] = input.checked;\r\n } else if (input.type === 'number') {\r\n settings[key] = input.value ? parseFloat(input.value) : null;\r\n } else {\r\n settings[key] = input.value || null;\r\n }\r\n });\r\n\r\n // Add tool, MCP connection, and agent collections (special handling).\r\n settings.toolNames = this.getSelectedToolNames();\r\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\r\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\r\n settings.agentNames = this.getSelectedAgentNames();\r\n\r\n const promptTemplates = this.getPromptTemplateSelections();\r\n if (promptTemplates.length > 0) {\r\n settings.promptTemplates = promptTemplates;\r\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\r\n }\r\n\r\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\r\n .catch(err => {\r\n console.error('Error saving settings:', err);\r\n this.showSaveIndicator('Save failed', 'text-danger');\r\n });\r\n },\r\n flushPendingSave() {\r\n if (this.saveSettingsTimeout) {\r\n clearTimeout(this.saveSettingsTimeout);\r\n this.saveSettingsTimeout = null;\r\n }\r\n\r\n if (this.settingsDirty) {\r\n this.settingsDirty = false;\r\n return this.saveSettings();\r\n }\r\n\r\n return Promise.resolve();\r\n },\r\n initializeInteraction(itemId, force) {\r\n if (this.isInteractionStarted && !force) {\r\n return;\r\n }\r\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\r\n this.setItemId(itemId);\r\n this.isInteractionStarted = true;\r\n },\r\n copyResponse(message) {\r\n navigator.clipboard.writeText(message);\r\n },\r\n startRecording() {\r\n if (this.isRecording || !this.connection) {\r\n return;\r\n }\r\n\r\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\r\n .then(stream => {\r\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\r\n ? 'audio/ogg;codecs=opus'\r\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\r\n ? 'audio/webm;codecs=opus'\r\n : 'audio/webm';\r\n\r\n this.mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n audioBitsPerSecond: 128000,\r\n });\r\n\r\n this.preRecordingPrompt = this.prompt;\r\n this._audioInputSent = false;\r\n\r\n var subject = new signalR.Subject();\r\n var itemId = this.getItemId();\r\n var pendingChunk = Promise.resolve();\r\n\r\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\r\n if (e.data && e.data.size > 0) {\r\n pendingChunk = pendingChunk.then(async () => {\r\n var data = await e.data.arrayBuffer();\r\n var uint8Array = new Uint8Array(data);\r\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\r\n var base64 = btoa(binaryString);\r\n subject.next(base64);\r\n });\r\n }\r\n });\r\n\r\n this.mediaRecorder.addEventListener('stop', () => {\r\n stream.getTracks().forEach(track => track.stop());\r\n pendingChunk.then(() => subject.complete());\r\n });\r\n\r\n var language = navigator.language || document.documentElement.lang || 'en-US';\r\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\r\n this.mediaRecorder.start(250);\r\n this.isRecording = true;\r\n this.updateMicButton();\r\n })\r\n .catch(err => {\r\n console.error('Microphone access denied:', err);\r\n });\r\n },\r\n stopRecording() {\r\n if (!this.isRecording || !this.mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n this.updateMicButton();\r\n },\r\n toggleRecording() {\r\n if (this.isRecording) {\r\n this.stopRecording();\r\n } else {\r\n this.startRecording();\r\n }\r\n },\r\n updateMicButton() {\r\n if (!this.micButton) {\r\n return;\r\n }\r\n\r\n if (this.isRecording) {\r\n this.micButton.classList.add('stt-recording');\r\n this.micButton.innerHTML = '';\r\n } else {\r\n this.micButton.classList.remove('stt-recording');\r\n this.micButton.innerHTML = '';\r\n }\r\n }\r\n },\r\n watch: {\r\n isPlayingAudio() {\r\n // Reserved for future use — volume-based interrupt detection\r\n // no longer mutes tracks; browser echo cancellation handles echo.\r\n },\r\n isConversationMode(active) {\r\n if (this.micButton) {\r\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\r\n }\r\n\r\n if (this.buttonElement) {\r\n this.buttonElement.style.display = active ? 'none' : '';\r\n }\r\n\r\n if (this.inputElement) {\r\n this.inputElement.disabled = active;\r\n if (active) {\r\n this.inputElement.placeholder = '';\r\n }\r\n }\r\n }\r\n },\r\n mounted() {\r\n (async () => {\r\n await this.startConnection();\r\n this.initializeApp();\r\n })();\r\n\r\n window.addEventListener('beforeunload', this.handleBeforeUnload);\r\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n },\r\n beforeUnmount() {\r\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\r\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\r\n\r\n this.stopAudio(false);\r\n\r\n if (this.stream) {\r\n this.stream.dispose();\r\n this.stream = null;\r\n }\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n },\r\n template: config.messageTemplate\r\n }).mount(config.appElementSelector);\r\n\r\n return app;\r\n };\r\n\r\n return {\r\n initialize: initialize\r\n };\r\n}();\r\n\r\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\r\ndocument.addEventListener('click', function (e) {\r\n const btn = e.target.closest('.download-chart-btn');\r\n if (!btn) {\r\n return;\r\n }\r\n const chartId = btn.getAttribute('data-chart-id');\r\n const canvas = chartId ? document.getElementById(chartId) : null;\r\n if (!canvas) {\r\n console.error('Chart canvas not found:', chartId);\r\n return;\r\n }\r\n const link = document.createElement('a');\r\n link.download = 'chart-' + chartId + '.png';\r\n link.href = canvas.toDataURL('image/png');\r\n link.click();\r\n});\r\n\r\n// Intercept download clicks for data-URI images and convert to blob downloads.\r\ndocument.addEventListener('click', function (e) {\r\n const link = e.target.closest('.ai-download-image');\r\n if (!link) {\r\n return;\r\n }\r\n\r\n const container = link.closest('.generated-image-container');\r\n const img = container?.querySelector('img');\r\n if (!img) {\r\n return;\r\n }\r\n\r\n const src = img.src;\r\n if (!src || !src.startsWith('data:')) {\r\n return; // Normal URL – let the default behaviour handle it.\r\n }\r\n\r\n e.preventDefault();\r\n\r\n fetch(src)\r\n .then(function (res) { return res.blob(); })\r\n .then(function (blob) {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = link.getAttribute('download') || 'generated-image.png';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\r\n })\r\n .catch(function (err) { console.error('Failed to download image:', err); });\r\n});\r\n"]} +{"version":3,"sources":["chat-interaction.js"],"names":["_slicedToArray","r","e","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","l","t","Symbol","iterator","n","i","u","a","f","o","call","next","Object","done","push","value","length","Array","isArray","_typeof","constructor","prototype","_regenerator","toStringTag","c","Generator","create","_regeneratorDefine2","p","y","G","v","d","bind","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","this","setPrototypeOf","__proto__","displayName","w","m","defineProperty","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","_n","F","s","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_arrayLikeToArray","toString","slice","name","from","test","window","chatInteractionManager","defaultConfig","generatedImageAltText","generatedImageMaxWidth","downloadImageTitle","downloadChartTitle","downloadChartButtonText","codeCopiedText","assistantLabel","messageTemplate","indicatorTemplate","untitledText","clearHistoryTitle","clearHistoryMessage","clearHistoryOkText","clearHistoryCancelText","sanitizeUrl","url","trimmed","trim","escapeHtmlEntities","text","span","document","createElement","textContent","innerHTML","renderer","marked","Renderer","link","data","href","concat","code","lang","highlighted","hljs","getLanguage","highlight","language","_","highlightAuto","langDisplay","image","src","alt","maxWidth","chartCounter","_pendingCharts","renderChartsInMessage","message","charts","requestAnimationFrame","_step","_iterator","canvas","getElementById","chartId","Chart","offsetParent","_cfg$options","_cfg$options2","_cfg$options2$aspectR","_chartInstance","destroy","cfg","config","JSON","parse","options","responsive","maintainAspectRatio","aspectRatio","console","error","__chartConfigs","warn","err","parseMarkdownContent","content","html","DOMPurify","sanitize","ADD_TAGS","ADD_ATTR","use","extensions","level","start","idx","indexOf","undefined","tokenizer","extracted","token","jsonStart","depth","inString","escape","ch","jsonEnd","closeBracketIndex","startIndex","endIndex","json","substring","tryExtractChartMarker","type","raw","initialize","instanceConfig","assign","signalRHubUrl","appElementSelector","chatContainerElementSelector","inputElementSelector","sendButtonElementSelector","Vue","createApp","inputElement","buttonElement","chatContainer","placeholder","isInteractionStarted","isPlaceholderVisible","isStreaming","isNavigatingAway","autoScroll","stream","messages","prompt","initialFieldValues","Map","settingsDirty","saveSettingsTimeout","saveIndicatorTimeout","isRecording","mediaRecorder","preRecordingPrompt","micButton","speechToTextEnabled","chatMode","textToSpeechEnabled","ttsVoiceName","audioChunks","audioPlayQueue","isPlayingAudio","currentAudioElement","currentAudioUrl","ttsPlayingMessageIndex","ttsAudioCache","ttsInstanceId","Math","random","conversationModeEnabled","conversationButton","isConversationMode","notifications","notificationDismissTimers","computed","lastAssistantIndex","role","methods","handleBeforeUnload","startConnection","_this","_callee","_t","_context","connection","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","build","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","on","_data$messages","initializeInteraction","itemId","titleInput","querySelector","title","forEach","msg","addMessage","$nextTick","historyItem","showSaveIndicator","stopRecording","isFinal","_conversationPartialTranscript","replace","_conversationPartialMessage","htmlContent","hidePlaceholder","isPartial","scrollToBottom","_audioInputSent","dispatchEvent","Event","stopAudio","_conversationAssistantMessage","oldMsg","index","escaped","messageId","responseId","appearance","hideTypingIndicator","j","msgIndex","newMessage","id","normalizeAssistantAppearance","base64Audio","contentType","binaryString","atob","bytes","Uint8Array","charCodeAt","playCollectedAudio","showPlaceholder","clearHistoryBtn","classList","add","notification","receiveNotification","updateNotification","notificationType","removeNotification","onreconnecting","onreconnected","info","reloadCurrentInteraction","onclose","addMessageInternal","_this2","fireEvent","CustomEvent","detail","_this3","processedContent","references","keys","citedRefs","entries","filter","_ref","key","includes","sort","_ref3","_ref4","b","_step2","displayIndex","_iterator2","_step2$value","replaceAll","_displayIndex","_placeholder","_step3","_iterator3","_step4","_iterator4","_step4$value","label","remove","event","icon","cssClass","disableStreamingAnimation","getAssistantLabel","getAssistantRoleClasses","classes","getAssistantIconClasses","shouldAnimateAssistantIcon","getAssistantIcon","isIndicator","sendMessage","_this4","_callee2","trimmedPrompt","_context2","flushPendingSave","streamMessage","_this5","dispose","streamingStarted","showTypingIndicator","lastResponseId","messageIndex","currentItemId","getItemId","subscribe","chunk","sessionId","setItemId","_i","_Object$entries","_Object$entries$_i","_i2","_Object$entries2","_Object$entries2$_i","complete","_this5$stream","processReferences","streamingFinished","synthesizeSpeech","_this5$stream2","getServiceDownMessage","_this6","_ref7","_ref8","_ref9","_ref0","_step5","processed","_iterator5","_step5$value","_step6","_iterator6","_step7","_iterator7","_step7$value","stopIcon","getAttribute","replaceChildren","RETURN_DOM_FRAGMENT","startIcon","icons","querySelectorAll","debouncedSaveSettings","handleExternalTtsStop","_e$detail","sourceId","cacheIndex","_this7","_ttsCacheIndex","invoke","toggleMessageTts","playAudioBlob","_step8","totalLength","reduce","sum","combined","offset","_iterator8","set","blob","Blob","_this8","URL","createObjectURL","audio","Audio","addEventListener","revokeObjectURL","playNextInQueue","play","nextBlob","shift","conversationModeOnAudioEnded","pause","currentTime","toggleConversationMode","stopConversationMode","startConversationMode","_this9","updateConversationButton","navigator","mediaDevices","getUserMedia","echoCancellation","noiseSuppression","autoGainControl","mimeType","MediaRecorder","isTypeSupported","audioBitsPerSecond","_conversationSubject","Subject","_conversationStream","AudioCtx","AudioContext","webkitAudioContext","_conversationAudioCtx","_conversationAnalyser","createAnalyser","fftSize","createMediaStreamSource","connect","pendingChunk","analyser","size","freqData","frequencyBinCount","getByteFrequencyData","k","_callee3","uint8Array","base64","_context3","arrayBuffer","str","byte","String","fromCharCode","btoa","getTracks","track","stop","documentElement","send","close","dismissible","autoDismissMs","endHtml","blur","startHtml","conversationModeSendPrompt","originalLength","_this0","setTimeout","scrollTop","scrollHeight","clientHeight","handleUserInput","target","getSaveIndicatorElement","saveIndicatorElementSelector","className","_this1","indicator","clearTimeout","clearPendingSettingsSave","getFieldLabel","input","_input$closest","closest","dataset","setting","getValidationFeedbackElement","feedback","nextElementSibling","contains","insertAdjacentElement","clearSettingValidationError","removeAttribute","setSettingValidationError","setAttribute","getSettingValidationMessage","disabled","number","Number","fieldLabel","isNaN","min","max","validateSettingInput","validateSettings","_this10","isValid","getSettingInputs","queueSettingsSave","explicitInputs","getSelectedGroupValues","groupName","fallbackSelector","explicitSelections","values","checkbox","baseName","hiddenInput","getPromptTemplateSelections","promptTemplates","card","templateIdInput","promptParametersInput","templateId","promptParameters","clearNotificationDismiss","findIndex","splice","scheduleNotificationDismiss","_this11","timerId","dismissNotification","handleNotificationAction","actionName","resetInteraction","initializeApp","_this12","placeholderElementSelector","loadInteraction","atBottom","shiftKey","click","lastMsg","pop","chatInteractionItems","getElementsByClassName","preventDefault","btn","block","codeEl","clipboard","writeText","copiedText","matches","clearHistory","micButtonElementSelector","style","display","toggleRecording","conversationButtonElementSelector","self","confirmDialog","okText","cancelText","callback","confirmed","_this13","saveSettings","getSelectedToolNames","getSelectedMcpConnectionIds","getSelectedA2AConnectionIds","getSelectedAgentNames","_this14","settings","match","toLowerCase","checked","parseFloat","toolNames","mcpConnectionIds","a2aConnectionIds","agentNames","promptTemplateIds","map","template","force","copyResponse","startRecording","_this15","subject","_callee4","_context4","updateMicButton","watch","active","mounted","_this16","_callee5","_context5","beforeUnmount","removeEventListener","mount","download","toDataURL","container","img","startsWith","fetch","res","body","appendChild","removeChild"],"mappings":"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","file":"chat-interaction.min.js","sourcesContent":["window.chatInteractionManager = function () {\n\n // Defaults (can be overridden by instanceConfig)\n var defaultConfig = {\n // UI defaults for generated media\n generatedImageAltText: 'Generated Image',\n generatedImageMaxWidth: 400,\n downloadImageTitle: 'Download image',\n downloadChartTitle: 'Download chart as image',\n downloadChartButtonText: 'Download',\n codeCopiedText: 'Copied!',\n assistantLabel: 'Assistant',\n\n messageTemplate: `\n
\n
\n
\n
You
\n
\n \n {{ getAssistantLabel(message) }}\n
\n
\n

{{ message.title }}

\n
\n \n \n \n \n
\n
\n
\n
\n
\n \n {{ notification.content }}\n \n
\n
\n \n
\n
\n
\n `,\n indicatorTemplate: `\n
\n \n Assistant\n
\n `,\n // Localizable strings\n untitledText: 'Untitled',\n clearHistoryTitle: 'Clear History',\n clearHistoryMessage: 'Are you sure you want to clear the chat history? This action cannot be undone. Your documents, parameters, and tools will be preserved.',\n clearHistoryOkText: 'Yes',\n clearHistoryCancelText: 'Cancel'\n };\n\n // Sanitize URLs to prevent javascript: protocol injection.\n function sanitizeUrl(url) {\n if (!url) return '';\n var trimmed = url.trim();\n if (/^javascript:/i.test(trimmed) || /^vbscript:/i.test(trimmed) || /^data:text\\/html/i.test(trimmed)) {\n return '';\n }\n return url;\n }\n\n // Safely HTML-encode a string using the DOM (avoids regex-based HTML filtering).\n function escapeHtmlEntities(text) {\n var span = document.createElement('span');\n span.textContent = text;\n return span.innerHTML;\n }\n\n const renderer = new marked.Renderer();\n\n // Modify the link rendering to open in a new tab\n renderer.link = function (data) {\n var href = sanitizeUrl(data.href);\n if (!href) return data.text || '';\n return `
${data.text}`;\n };\n\n // Custom code block renderer with highlight.js integration and copy button.\n renderer.code = function (data) {\n var code = data.text || '';\n var lang = (data.lang || '').trim();\n var highlighted = code;\n\n if (typeof hljs !== 'undefined') {\n if (lang && hljs.getLanguage(lang)) {\n try {\n highlighted = hljs.highlight(code, { language: lang }).value;\n } catch (_) { }\n } else {\n try {\n highlighted = hljs.highlightAuto(code).value;\n } catch (_) { }\n }\n } else {\n highlighted = escapeHtmlEntities(code);\n }\n\n var langDisplay = lang ? escapeHtmlEntities(lang) : 'code';\n return `
${langDisplay}
${highlighted}
`;\n };\n\n // Custom image renderer for generated images with thumbnail styling and download button.\n // Handles both URL and data-URI sources (data URIs are converted to blobs for download).\n renderer.image = function (data) {\n const src = sanitizeUrl(data.href);\n if (!src) return '';\n const alt = data.text || defaultConfig.generatedImageAltText;\n const maxWidth = defaultConfig.generatedImageMaxWidth;\n return `
\n \"${alt}\"\n
\n \n \n \n
\n
`;\n };\n\n // Chart counter for unique IDs\n let chartCounter = 0;\n\n // Collector for charts discovered during marked parsing.\n let _pendingCharts = [];\n\n // Global chart config map shared with ai-chat.js\n window.__chartConfigs = window.__chartConfigs || {};\n\n function createChartHtml(chartId) {\n return `
`\n + ``\n + `
`\n + `
`\n + ``\n + `
`;\n }\n\n // Register [chart:{...json...}] as a native marked block extension so the\n // markdown parser handles chart markers inline with surrounding text.\n marked.use({\n extensions: [{\n name: 'chart',\n level: 'block',\n start(src) {\n const idx = src.indexOf('[chart:');\n return idx >= 0 ? idx : undefined;\n },\n tokenizer(src) {\n const extracted = tryExtractChartMarker(src);\n if (!extracted || extracted.startIndex !== 0) {\n return undefined;\n }\n\n const chartId = `chat_chart_${++chartCounter}`;\n\n return {\n type: 'chart',\n raw: src.substring(0, extracted.endIndex),\n chartId: chartId,\n json: extracted.json,\n };\n },\n renderer(token) {\n _pendingCharts.push({ chartId: token.chartId, config: token.json });\n window.__chartConfigs[token.chartId] = token.json;\n return createChartHtml(token.chartId);\n }\n }]\n });\n\n // Extract a [chart:{...json...}] marker. This avoids regex issues with nested brackets.\n function tryExtractChartMarker(text) {\n const token = '[chart:';\n const start = text.indexOf(token);\n if (start < 0) {\n return null;\n }\n\n // Find JSON object boundary by balancing braces\n const jsonStart = start + token.length;\n let i = jsonStart;\n while (i < text.length && (text[i] === ' ' || text[i] === '\\n' || text[i] === '\\r' || text[i] === '\\t')) {\n i++;\n }\n\n if (i >= text.length || text[i] !== '{') {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escape = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n\n if (inString) {\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\') {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n\n if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) {\n const jsonEnd = i;\n // Expect closing bracket after JSON\n const closeBracketIndex = text.indexOf(']', jsonEnd + 1);\n if (closeBracketIndex < 0) {\n return null;\n }\n\n const json = text.substring(jsonStart, jsonEnd + 1).trim();\n return {\n startIndex: start,\n endIndex: closeBracketIndex + 1,\n json: json\n };\n }\n }\n }\n\n return null;\n }\n\n function renderChartsInMessage(message) {\n if (!message || !message._pendingCharts || !message._pendingCharts.length) {\n return;\n }\n\n // Copy and clear pending charts immediately to prevent duplicate renders.\n const charts = [...message._pendingCharts];\n message._pendingCharts = [];\n\n // Defer to requestAnimationFrame so the browser has fully laid out the\n // canvas elements before Chart.js reads their dimensions.\n requestAnimationFrame(() => {\n for (const c of charts) {\n const canvas = document.getElementById(c.chartId);\n if (!canvas) {\n continue;\n }\n\n if (typeof Chart === 'undefined') {\n console.warn('Chart.js is not loaded. To render interactive charts, include the Chart.js library on the page (e.g., ).');\n continue;\n }\n\n // When the canvas is inside a hidden container (e.g., display:none),\n // it has zero dimensions. Keep the config for later rendering.\n if (canvas.offsetParent === null) {\n window.__chartConfigs[c.chartId] = c.config;\n continue;\n }\n\n try {\n // Destroy existing chart instance if re-rendering\n if (canvas._chartInstance) {\n canvas._chartInstance.destroy();\n }\n\n const cfg = typeof c.config === 'string' ? JSON.parse(c.config) : c.config;\n cfg.options ??= {};\n cfg.options.responsive = true;\n cfg.options.maintainAspectRatio = true;\n cfg.options.aspectRatio ??= 4 / 3;\n\n canvas._chartInstance = new Chart(canvas, cfg);\n } catch (e) {\n console.error('Error creating chart:', e);\n }\n }\n });\n }\n\n // Parse markdown content via marked (which natively handles [chart:...] markers\n // through the registered extension) and collect pending chart configs for later\n // Chart.js rendering.\n function parseMarkdownContent(content, message) {\n _pendingCharts = [];\n const html = marked.parse(content, { renderer });\n message._pendingCharts = _pendingCharts.length > 0 ? [..._pendingCharts] : [];\n return DOMPurify.sanitize(html, { ADD_TAGS: ['canvas'], ADD_ATTR: ['target'] });\n }\n\n const initialize = (instanceConfig) => {\n\n const config = Object.assign({}, defaultConfig, instanceConfig);\n // Keep defaultConfig in sync so renderers use overridden values\n defaultConfig = config;\n\n if (!config.signalRHubUrl) {\n console.error('The signalRHubUrl is required.');\n return;\n }\n\n if (!config.appElementSelector) {\n console.error('The appElementSelector is required.');\n return;\n }\n\n if (!config.chatContainerElementSelector) {\n console.error('The chatContainerElementSelector is required.');\n return;\n }\n\n if (!config.inputElementSelector) {\n console.error('The inputElementSelector is required.');\n return;\n }\n\n if (!config.sendButtonElementSelector) {\n console.error('The sendButtonElementSelector is required.');\n return;\n }\n\n const app = Vue.createApp({\n data() {\n return {\n inputElement: null,\n buttonElement: null,\n chatContainer: null,\n placeholder: null,\n isInteractionStarted: false,\n isPlaceholderVisible: true,\n isStreaming: false,\n isNavigatingAway: false,\n autoScroll: true,\n stream: null,\n messages: [],\n prompt: '',\n initialFieldValues: new Map(),\n settingsDirty: false,\n saveSettingsTimeout: null,\n saveIndicatorTimeout: null,\n isRecording: false,\n mediaRecorder: null,\n preRecordingPrompt: '',\n micButton: null,\n speechToTextEnabled: config.chatMode === 'AudioInput' || config.chatMode === 'Conversation',\n textToSpeechEnabled: config.chatMode === 'Conversation' || !!config.textToSpeechEnabled,\n ttsVoiceName: config.ttsVoiceName || null,\n audioChunks: [],\n audioPlayQueue: [],\n isPlayingAudio: false,\n currentAudioElement: null,\n currentAudioUrl: null,\n ttsPlayingMessageIndex: -1,\n ttsAudioCache: {},\n ttsInstanceId: 'chat-interaction-' + Math.random().toString(36).slice(2),\n conversationModeEnabled: config.chatMode === 'Conversation',\n conversationButton: null,\n isConversationMode: false,\n notifications: [],\n notificationDismissTimers: {},\n };\n },\n computed: {\n lastAssistantIndex() {\n for (var i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return i;\n }\n }\n return -1;\n }\n },\n methods: {\n handleBeforeUnload() {\n this.isNavigatingAway = true;\n },\n async startConnection() {\n this.connection = new signalR.HubConnectionBuilder()\n .withUrl(config.signalRHubUrl)\n .withAutomaticReconnect()\n .build();\n\n // Allow long-running operations (e.g., multi-step MCP tool calls)\n // without the client disconnecting prematurely.\n this.connection.serverTimeoutInMilliseconds = 600000;\n this.connection.keepAliveIntervalInMilliseconds = 15000;\n\n this.connection.on(\"LoadInteraction\", (data) => {\n this.initializeInteraction(data.itemId, true);\n this.messages = [];// Update the title field if it exists\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && data.title) {\n titleInput.value = data.title;\n }\n\n (data.messages ?? []).forEach(msg => {\n this.addMessage(msg);\n\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n });\n });\n });\n\n this.connection.on(\"SettingsSaved\", (itemId, title) => {\n // Update the history list item if it exists\n // Use a more specific selector to only target history list items, not other elements like the Clear History button\n const historyItem = document.querySelector(`.chat-interaction-history-item[data-interaction-id=\"${itemId}\"]`);\n if (historyItem) {\n historyItem.textContent = title || config.untitledText;\n }\n\n const titleInput = document.querySelector('[data-chat-interaction-title], .setting-input[data-setting=\"title\"], input[name=\"ChatInteraction.Title\"], input[name=\"Title\"]');\n if (titleInput && title) {\n titleInput.value = title;\n }\n\n this.showSaveIndicator('Saved', 'text-success');\n });\n\n this.connection.on(\"ReceiveError\", (error) => {\n console.error(\"SignalR Error: \", error);\n this.showSaveIndicator('Save failed', 'text-danger');\n\n if (this.isRecording) {\n this.stopRecording();\n }\n });\n\n this.connection.on(\"ReceiveTranscript\", (itemId, text, isFinal) => {\n if (this.isConversationMode) {\n if (!isFinal && text) {\n this._conversationPartialTranscript = text;\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n var html = '

' + escaped + '

';\n\n // Show partial transcript as a live user message.\n if (!this._conversationPartialMessage) {\n this.hidePlaceholder();\n this._conversationPartialMessage = {\n role: 'user',\n content: text,\n htmlContent: html,\n isPartial: true\n };\n this.messages.push(this._conversationPartialMessage);\n } else {\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = html;\n }\n this.scrollToBottom();\n }\n return;\n }\n\n if (text && !this._audioInputSent) {\n this.prompt = this.preRecordingPrompt + text;\n if (this.inputElement) {\n this.inputElement.value = this.prompt;\n this.inputElement.dispatchEvent(new Event('input'));\n }\n }\n });\n\n this.connection.on(\"ReceiveConversationUserMessage\", (itemId, text) => {\n if (text) {\n this.stopAudio();\n\n // If there's an interrupted assistant message still streaming,\n // mark it as done to stop the spinner animation.\n if (this._conversationAssistantMessage) {\n var oldMsg = this.messages[this._conversationAssistantMessage.index];\n if (oldMsg) {\n oldMsg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Replace the partial transcript message with the final one.\n if (this._conversationPartialMessage) {\n var escaped = text.replace(/&/g, '&').replace(//g, '>');\n this._conversationPartialMessage.content = text;\n this._conversationPartialMessage.htmlContent = '

' + escaped + '

';\n this._conversationPartialMessage.isPartial = false;\n this._conversationPartialMessage = null;\n } else {\n this.addMessage({\n role: 'user',\n content: text\n });\n }\n this.scrollToBottom();\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantToken\", (itemId, messageId, token, responseId, appearance) => {\n if (!this._conversationAssistantMessage) {\n this.stopAudio();\n this.hideTypingIndicator();\n\n // Ensure no stale streaming indicators remain from prior messages.\n for (var j = 0; j < this.messages.length; j++) {\n if (this.messages[j].isStreaming) {\n this.messages[j].isStreaming = false;\n }\n }\n\n var msgIndex = this.messages.length;\n var newMessage = {\n id: messageId,\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n appearance: this.normalizeAssistantAppearance(appearance),\n };\n this.messages.push(newMessage);\n this._conversationAssistantMessage = { index: msgIndex, content: '' };\n }\n\n this._conversationAssistantMessage.content += token;\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n if (!msg.appearance) {\n msg.appearance = this.normalizeAssistantAppearance(appearance);\n }\n msg.content = this._conversationAssistantMessage.content;\n msg.htmlContent = parseMarkdownContent(msg.content, msg);\n this.$nextTick(() => {\n renderChartsInMessage(msg);\n this.scrollToBottom();\n });\n }\n });\n\n this.connection.on(\"ReceiveConversationAssistantComplete\", (itemId, messageId) => {\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n });\n\n this.connection.on(\"ReceiveAudioChunk\", (itemId, base64Audio, contentType) => {\n if (base64Audio) {\n const binaryString = atob(base64Audio);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n this.audioChunks.push(bytes);\n }\n });\n\n this.connection.on(\"ReceiveAudioComplete\", (itemId) => {\n this.playCollectedAudio();\n });\n\n this.connection.on(\"HistoryCleared\", (itemId) => {\n // Clear messages and show placeholder\n this.messages = [];\n this.showPlaceholder();\n\n // Hide the clear history button since there's no history now\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.add('d-none');\n }\n });\n\n this.connection.on(\"ReceiveNotification\", (notification) => {\n this.receiveNotification(notification);\n });\n\n this.connection.on(\"UpdateNotification\", (notification) => {\n this.updateNotification(notification);\n });\n\n this.connection.on(\"RemoveNotification\", (notificationType) => {\n this.removeNotification(notificationType);\n });\n\n this.connection.onreconnecting(() => {\n console.warn(\"SignalR: reconnecting...\");\n });\n\n this.connection.onreconnected(() => {\n console.info(\"SignalR: reconnected.\");\n this.reloadCurrentInteraction();\n });\n\n this.connection.onclose((error) => {\n if (this.isNavigatingAway) {\n return;\n }\n\n if (error) {\n console.warn(\"SignalR connection closed with error:\", error.message || error);\n }\n });\n\n try {\n await this.connection.start();\n } catch (err) {\n console.error(\"SignalR Connection Error: \", err);\n }\n },\n addMessageInternal(message) {\n if (message.role === 'assistant') {\n message.appearance = this.normalizeAssistantAppearance(message.appearance);\n }\n\n if (message.content && !message.htmlContent) {\n message.htmlContent = parseMarkdownContent(message.content, message);\n }\n this.fireEvent(new CustomEvent(\"addingChatInteractionMessage\", { detail: { message: message } }));\n this.messages.push(message);\n\n this.$nextTick(() => {\n this.fireEvent(new CustomEvent(\"addedChatInteractionMessage\", { detail: { message: message } }));\n });\n },\n addMessage(message) {\n if (message.content) {\n let processedContent = message.content.trim();\n\n if (message.references && typeof message.references === \"object\" && Object.keys(message.references).length) {\n\n // Only include references that were actually cited in the response.\n const citedRefs = Object.entries(message.references).filter(([key]) => processedContent.includes(key));\n\n if (citedRefs.length) {\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders.\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processedContent = processedContent.replaceAll(key, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processedContent = processedContent.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processedContent = processedContent.replaceAll('
', ',');\n\n processedContent += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || `[doc:${value.index}]`;\n processedContent += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n }\n }\n\n message.content = processedContent;\n message.htmlContent = parseMarkdownContent(processedContent, message);\n }\n\n this.addMessageInternal(message);\n this.hidePlaceholder();\n\n this.$nextTick(() => {\n // Render any pending charts once the DOM is updated\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n hidePlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.add('d-none');\n }\n this.isPlaceholderVisible = false;\n },\n showPlaceholder() {\n if (this.placeholder) {\n this.placeholder.classList.remove('d-none');\n }\n this.isPlaceholderVisible = true;\n },\n fireEvent(event) {\n document.dispatchEvent(event);\n },\n normalizeAssistantAppearance(appearance) {\n if (!appearance) {\n return null;\n }\n\n var label = typeof appearance.label === 'string' ? appearance.label.trim() : '';\n var icon = typeof appearance.icon === 'string' ? appearance.icon.trim() : '';\n var cssClass = typeof appearance.cssClass === 'string' ? appearance.cssClass.trim() : '';\n var disableStreamingAnimation = !!appearance.disableStreamingAnimation;\n\n if (!label && !icon && !cssClass && !disableStreamingAnimation) {\n return null;\n }\n\n return {\n label: label,\n icon: icon,\n cssClass: cssClass,\n disableStreamingAnimation: disableStreamingAnimation,\n };\n },\n getAssistantLabel(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.label ? appearance.label : defaultConfig.assistantLabel;\n },\n getAssistantRoleClasses(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n var classes = ['ai-chat-msg-role'];\n\n if (appearance && appearance.cssClass) {\n classes.push(appearance.cssClass);\n } else {\n classes.push('ai-chat-msg-role-assistant');\n }\n\n return classes;\n },\n getAssistantIconClasses(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return [this.shouldAnimateAssistantIcon(message, index) ? 'ai-streaming-icon' : 'ai-bot-icon', appearance && appearance.cssClass ? appearance.cssClass : ''];\n },\n getAssistantIcon(message) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return appearance && appearance.icon ? appearance.icon : 'fa fa-robot';\n },\n shouldAnimateAssistantIcon(message, index) {\n var appearance = message ? this.normalizeAssistantAppearance(message.appearance) : null;\n return !!message &&\n message.isStreaming &&\n index === this.lastAssistantIndex &&\n !(appearance && appearance.disableStreamingAnimation);\n },\n isIndicator(message) {\n return message.role === 'indicator';\n },\n async sendMessage() {\n let trimmedPrompt = this.prompt.trim();\n\n if (!trimmedPrompt) {\n return;\n }\n\n // Stop any active recording before sending.\n if (this.isRecording) {\n this.stopRecording();\n }\n\n // Prevent stale ReceiveTranscript events from repopulating the prompt.\n this._audioInputSent = true;\n\n // Flush any pending settings save before sending a message\n // to prevent concurrent hub calls that can cause database deadlocks.\n await this.flushPendingSave();\n\n this.addMessage({\n role: 'user',\n content: trimmedPrompt\n });\n\n // Show the clear history button since we now have prompts\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.classList.remove('d-none');\n }\n\n this.streamMessage(trimmedPrompt);\n this.inputElement.value = '';\n this.prompt = '';\n },\n streamMessage(trimmedPrompt) {\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n\n this.streamingStarted();\n this.showTypingIndicator();\n this.autoScroll = true;\n\n var content = '';\n var references = {};\n var lastResponseId = null;\n\n var messageIndex = this.messages.length;\n var currentItemId = this.getItemId();\n\n this.stream = this.connection.stream(\"SendMessage\", currentItemId, trimmedPrompt)\n .subscribe({\n next: (chunk) => {\n let message = this.messages[messageIndex];\n\n if (!message) {\n if (chunk.sessionId && !currentItemId) {\n this.setItemId(chunk.sessionId);\n }\n\n this.hideTypingIndicator();\n messageIndex = this.messages.length;\n let newMessage = {\n role: \"assistant\",\n content: \"\",\n htmlContent: \"\",\n isStreaming: true,\n };\n\n this.messages.push(newMessage);\n message = newMessage;\n }\n\n if (chunk.references && typeof chunk.references === \"object\" && Object.keys(chunk.references).length) {\n for (const [key, value] of Object.entries(chunk.references)) {\n references[key] = value;\n }\n }\n\n if (chunk.content) {\n // When the responseId changes (e.g., after an internal tool call),\n // insert a line break to visually separate response segments.\n if (chunk.responseId && lastResponseId && chunk.responseId !== lastResponseId) {\n content += '\\n\\n';\n }\n\n if (chunk.responseId) {\n lastResponseId = chunk.responseId;\n }\n\n let processedContent = chunk.content;\n\n for (const [key, value] of Object.entries(references)) {\n processedContent = processedContent.replaceAll(key, `${value.index}`);\n }\n\n content += processedContent.replaceAll('
', ',');\n }\n\n message.content = content;\n\n message.htmlContent = parseMarkdownContent(content, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n },\n complete: () => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n if (!msg || !msg.content) {\n // No content received at all.\n this.hideTypingIndicator();\n }\n\n // Trigger text-to-speech only in conversation mode.\n if (this.isConversationMode && this.textToSpeechEnabled && msg && msg.content) {\n this.synthesizeSpeech(msg.content);\n }\n\n this.stream?.dispose();\n this.stream = null;\n },\n error: (err) => {\n this.processReferences(references, messageIndex);\n this.streamingFinished();\n\n let msg = this.messages[messageIndex];\n if (msg) {\n msg.isStreaming = false;\n }\n\n this.hideTypingIndicator();\n\n if (!this.isNavigatingAway) {\n this.addMessage(this.getServiceDownMessage());\n }\n\n this.stream?.dispose();\n this.stream = null;\n\n console.error(\"Stream error:\", err);\n }\n });\n },\n getServiceDownMessage() {\n return {\n role: \"assistant\",\n content: \"Our service is currently unavailable. Please try again later. We apologize for the inconvenience.\",\n htmlContent: \"\",\n };\n },\n processReferences(references, messageIndex) {\n if (Object.keys(references).length) {\n let message = this.messages[messageIndex];\n const content = message.content || '';\n\n // Only include references that were actually cited in the response.\n // Check both raw [doc:N] markers and already-rendered tags from streaming.\n const citedRefs = Object.entries(references).filter(([key, value]) =>\n content.includes(key) || content.includes(`${value.index}`)\n );\n\n if (!citedRefs.length) {\n return;\n }\n\n // Sort by original index so display indices follow a natural order.\n citedRefs.sort(([, a], [, b]) => a.index - b.index);\n\n // Phase 1: Replace all markers with unique placeholders to avoid collisions during remapping.\n let processed = content.trim();\n let displayIndex = 1;\n for (const [key, value] of citedRefs) {\n const placeholder = `__CITE_${value.index}__`;\n processed = processed.replaceAll(key, placeholder);\n processed = processed.replaceAll(`${value.index}`, placeholder);\n value._displayIndex = displayIndex++;\n value._placeholder = placeholder;\n }\n\n // Phase 2: Replace placeholders with sequential display indices.\n for (const [, value] of citedRefs) {\n processed = processed.replaceAll(value._placeholder, `${value._displayIndex}`);\n }\n\n processed = processed.replaceAll('', ',');\n\n processed += '

';\n\n for (const [key, value] of citedRefs) {\n const label = value.text || `[doc:${value.index}]`;\n processed += value.link\n ? `**${value._displayIndex}**. [${label}](${value.link})
`\n : `**${value._displayIndex}**. ${label}
`;\n }\n\n message.content = processed;\n message.htmlContent = parseMarkdownContent(processed, message);\n\n this.messages[messageIndex] = message;\n\n this.$nextTick(() => {\n renderChartsInMessage(message);\n this.scrollToBottom();\n });\n }\n },\n streamingStarted() {\n var stopIcon = this.buttonElement.getAttribute('data-stop-icon');\n\n if (stopIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(stopIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n },\n streamingFinished() {\n var startIcon = this.buttonElement.getAttribute('data-start-icon');\n\n if (startIcon) {\n this.buttonElement.replaceChildren(DOMPurify.sanitize(startIcon, { RETURN_DOM_FRAGMENT: true }));\n }\n\n // Directly manipulate the DOM to stop all streaming animations.\n if (this.chatContainer) {\n var icons = this.chatContainer.querySelectorAll('.ai-streaming-icon');\n for (var i = 0; i < icons.length; i++) {\n icons[i].classList.remove('ai-streaming-icon');\n icons[i].classList.add('ai-bot-icon');\n }\n }\n\n // Also update Vue data for consistency.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Save any settings that were deferred during streaming.\n if (this.settingsDirty) {\n this.debouncedSaveSettings();\n }\n },\n handleExternalTtsStop(e) {\n if (e?.detail?.sourceId === this.ttsInstanceId) {\n return;\n }\n\n this.stopAudio(false);\n },\n synthesizeSpeech(text, cacheIndex) {\n if (!this.textToSpeechEnabled || !text || !this.connection) {\n return;\n }\n\n this.audioChunks = [];\n this.isPlayingAudio = true;\n this._ttsCacheIndex = cacheIndex !== undefined ? cacheIndex : -1;\n\n this.connection.invoke(\"SynthesizeSpeech\", this.getItemId(), text, this.ttsVoiceName)\n .catch(err => {\n console.error(\"TTS synthesis error:\", err);\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this._ttsCacheIndex = -1;\n });\n },\n toggleMessageTts(message, index) {\n if (this.ttsPlayingMessageIndex === index) {\n this.stopAudio();\n return;\n }\n\n this.stopAudio(false);\n window.dispatchEvent(new CustomEvent('crestapps-ai-chat-stop-tts', {\n detail: { sourceId: this.ttsInstanceId }\n }));\n this.ttsPlayingMessageIndex = index;\n\n if (this.ttsAudioCache[index]) {\n this.playAudioBlob(this.ttsAudioCache[index]);\n return;\n }\n\n this.synthesizeSpeech(message.content, index);\n },\n playCollectedAudio() {\n if (this.audioChunks.length === 0) {\n if (!this.isPlayingAudio && this.audioPlayQueue.length === 0) {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n }\n return;\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n this.audioChunks = [];\n\n const blob = new Blob([combined], { type: 'audio/mp3' });\n\n if (this._ttsCacheIndex >= 0) {\n this.ttsAudioCache[this._ttsCacheIndex] = blob;\n this._ttsCacheIndex = -1;\n }\n\n // If audio is currently playing, queue this blob for later.\n if (this.isPlayingAudio && this.currentAudioElement) {\n this.audioPlayQueue.push(blob);\n return;\n }\n\n this.playAudioBlob(blob);\n },\n playAudioBlob(blob) {\n const url = URL.createObjectURL(blob);\n const audio = new Audio(url);\n\n this.currentAudioUrl = url;\n this.currentAudioElement = audio;\n this.isPlayingAudio = true;\n\n audio.addEventListener('ended', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.addEventListener('error', () => {\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.playNextInQueue();\n });\n\n audio.play().catch(err => {\n console.error(\"Audio playback error:\", err);\n this.currentAudioElement = null;\n this.currentAudioUrl = null;\n URL.revokeObjectURL(url);\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n });\n },\n playNextInQueue() {\n if (this.audioPlayQueue.length > 0) {\n const nextBlob = this.audioPlayQueue.shift();\n this.playAudioBlob(nextBlob);\n } else {\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n this.conversationModeOnAudioEnded();\n }\n },\n stopAudio() {\n if (this.currentAudioElement) {\n this.currentAudioElement.pause();\n this.currentAudioElement.currentTime = 0;\n this.currentAudioElement = null;\n }\n if (this.currentAudioUrl) {\n URL.revokeObjectURL(this.currentAudioUrl);\n this.currentAudioUrl = null;\n }\n this.audioChunks = [];\n this.audioPlayQueue = [];\n this.isPlayingAudio = false;\n this.ttsPlayingMessageIndex = -1;\n },\n toggleConversationMode() {\n if (this.isConversationMode) {\n this.stopConversationMode();\n } else {\n this.startConversationMode();\n }\n },\n startConversationMode() {\n if (!this.conversationModeEnabled || this.isConversationMode || !this.connection) {\n return;\n }\n\n this.isConversationMode = true;\n this.updateConversationButton();\n this._conversationPartialTranscript = '';\n this._conversationAssistantMessage = null;\n this._conversationPartialMessage = null;\n\n // Remove any previous conversation ended notification.\n this.removeNotification('conversation-ended');\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this._conversationSubject = new signalR.Subject();\n this._conversationStream = stream;\n\n // Create an AnalyserNode for volume-based interrupt detection.\n var AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (AudioCtx) {\n this._conversationAudioCtx = new AudioCtx();\n this._conversationAnalyser = this._conversationAudioCtx.createAnalyser();\n this._conversationAnalyser.fftSize = 256;\n var micSource = this._conversationAudioCtx.createMediaStreamSource(stream);\n micSource.connect(this._conversationAnalyser);\n }\n\n var pendingChunk = Promise.resolve();\n var analyser = this._conversationAnalyser;\n var interruptVolumeThreshold = 30;\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n // During TTS playback, check mic volume to detect\n // user interruption (speaking above threshold).\n if (this.isPlayingAudio && analyser) {\n var freqData = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(freqData);\n var sum = 0;\n for (var k = 0; k < freqData.length; k++) { sum += freqData[k]; }\n var avg = sum / freqData.length;\n\n if (avg >= interruptVolumeThreshold) {\n // User is speaking — interrupt TTS playback.\n this.stopAudio();\n }\n }\n\n // Always send audio to STT — browser echo cancellation\n // handles speaker echo; continuous audio avoids gaps\n // that increase recognition latency.\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n try {\n this._conversationSubject.next(base64);\n } catch (err) {\n // Subject may have been completed already.\n }\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => {\n try {\n this._conversationSubject.complete();\n } catch (err) {\n // Already completed.\n }\n });\n });\n\n var itemId = this.getItemId();\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"StartConversation\", itemId, this._conversationSubject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n this.isConversationMode = false;\n this.updateConversationButton();\n });\n },\n stopConversationMode() {\n if (!this.isConversationMode) {\n return;\n }\n\n this.isConversationMode = false;\n this.updateConversationButton();\n\n // Signal the server to cancel all in-progress STT/TTS streams immediately.\n if (this.connection) {\n this.connection.invoke(\"StopConversation\").catch(function () { });\n }\n\n if (this.isRecording && this.mediaRecorder) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n }\n\n this.stopAudio();\n this._conversationPartialTranscript = '';\n this._conversationPartialMessage = null;\n\n // Clean up the AudioContext used for volume monitoring.\n if (this._conversationAudioCtx) {\n this._conversationAudioCtx.close().catch(function () { });\n this._conversationAudioCtx = null;\n this._conversationAnalyser = null;\n }\n\n // Mark any in-flight assistant message as done to stop the spinner.\n if (this._conversationAssistantMessage) {\n var msg = this.messages[this._conversationAssistantMessage.index];\n if (msg) {\n msg.isStreaming = false;\n }\n this._conversationAssistantMessage = null;\n }\n\n // Safety net: clear all lingering streaming indicators.\n for (var i = 0; i < this.messages.length; i++) {\n if (this.messages[i].isStreaming) {\n this.messages[i].isStreaming = false;\n }\n }\n\n // Show a \"conversation ended\" notification system message.\n this.receiveNotification({\n type: 'conversation-ended',\n content: 'Conversation ended.',\n icon: 'fa-solid fa-circle-check',\n dismissible: true,\n autoDismissMs: 5000\n });\n },\n updateConversationButton() {\n if (!this.conversationButton) {\n return;\n }\n\n if (this.isConversationMode) {\n this.conversationButton.classList.add('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-dark', 'btn-outline-secondary');\n this.conversationButton.title = this.conversationButton.getAttribute('data-end-title') || 'End Conversation';\n var endHtml = this.conversationButton.getAttribute('data-end-html');\n if (endHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(endHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n } else {\n this.conversationButton.classList.remove('active', 'btn-primary');\n this.conversationButton.classList.remove('btn-dark', 'btn-outline-secondary');\n this.conversationButton.classList.add('btn-outline-dark');\n this.conversationButton.blur();\n this.conversationButton.title = this.conversationButton.getAttribute('data-start-title') || 'Start Conversation';\n var startHtml = this.conversationButton.getAttribute('data-start-html');\n if (startHtml) {\n this.conversationButton.replaceChildren(DOMPurify.sanitize(startHtml, { RETURN_DOM_FRAGMENT: true }));\n }\n }\n },\n conversationModeSendPrompt() {\n // Legacy: only used by AudioInput mode's ReceiveTranscript.\n },\n conversationModeOnAudioEnded() {\n // Legacy: in conversation mode, continuation is handled\n // by the persistent stream.\n },\n showTypingIndicator() {\n this.addMessage({\n role: 'indicator',\n htmlContent: config.indicatorTemplate\n });\n },\n hideTypingIndicator() {\n const originalLength = this.messages.length;\n this.messages = this.messages.filter(msg => msg.role !== 'indicator');\n const removedCount = originalLength - this.messages.length;\n return removedCount;\n },\n scrollToBottom() {\n if (!this.autoScroll) {\n return;\n }\n setTimeout(() => {\n this.chatContainer.scrollTop = this.chatContainer.scrollHeight - this.chatContainer.clientHeight;\n }, 50);\n },\n handleUserInput(event) {\n this.prompt = event.target.value;\n },\n getItemId() {\n return this.inputElement.getAttribute('data-interaction-id')\n || this.inputElement.getAttribute('data-item-id');\n },\n getSaveIndicatorElement() {\n if (config.saveIndicatorElementSelector) {\n return document.querySelector(config.saveIndicatorElementSelector);\n }\n\n return document.querySelector('[data-chat-interaction-save-indicator]');\n },\n showSaveIndicator(text, className) {\n const indicator = this.getSaveIndicatorElement();\n if (!indicator) {\n return;\n }\n\n indicator.textContent = text || '';\n indicator.className = 'settings-save-indicator ' + (className || 'text-muted');\n\n if (this.saveIndicatorTimeout) {\n clearTimeout(this.saveIndicatorTimeout);\n this.saveIndicatorTimeout = null;\n }\n\n if (!text) {\n return;\n }\n\n this.saveIndicatorTimeout = setTimeout(() => {\n indicator.textContent = '';\n this.saveIndicatorTimeout = null;\n }, 3000);\n },\n clearPendingSettingsSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n },\n getFieldLabel(input) {\n const label = input\n .closest('.mb-3, .col-6, .col, .form-group, .form-floating')\n ?.querySelector('label');\n\n if (!label) {\n return input.dataset.setting || 'This field';\n }\n\n return (label.textContent || '')\n .replace(/\\s+/g, ' ')\n .trim()\n || input.dataset.setting\n || 'This field';\n },\n getValidationFeedbackElement(input) {\n let feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n return feedback;\n }\n\n feedback = document.createElement('div');\n feedback.className = 'invalid-feedback';\n input.insertAdjacentElement('afterend', feedback);\n\n return feedback;\n },\n clearSettingValidationError(input) {\n input.classList.remove('is-invalid');\n input.removeAttribute('aria-invalid');\n\n const feedback = input.nextElementSibling;\n if (feedback && feedback.classList.contains('invalid-feedback')) {\n feedback.textContent = '';\n }\n },\n setSettingValidationError(input, message) {\n const feedback = this.getValidationFeedbackElement(input);\n input.classList.add('is-invalid');\n input.setAttribute('aria-invalid', 'true');\n feedback.textContent = message;\n },\n getSettingValidationMessage(input) {\n if (!input || input.disabled || input.type !== 'number') {\n return null;\n }\n\n const value = (input.value || '').trim();\n if (!value) {\n return null;\n }\n\n const number = Number(value);\n const fieldLabel = this.getFieldLabel(input);\n\n if (Number.isNaN(number)) {\n return `${fieldLabel} must be a valid number.`;\n }\n\n const min = input.getAttribute('min');\n if (min !== null && number < Number(min)) {\n return `${fieldLabel} must be ${min} or greater.`;\n }\n\n const max = input.getAttribute('max');\n if (max !== null && number > Number(max)) {\n return `${fieldLabel} must be ${max} or less.`;\n }\n\n return null;\n },\n validateSettingInput(input) {\n const message = this.getSettingValidationMessage(input);\n if (!message) {\n this.clearSettingValidationError(input);\n return true;\n }\n\n this.setSettingValidationError(input, message);\n return false;\n },\n validateSettings() {\n let isValid = true;\n\n this.getSettingInputs().forEach(input => {\n isValid = this.validateSettingInput(input) && isValid;\n });\n\n return isValid;\n },\n queueSettingsSave() {\n if (!this.validateSettings()) {\n this.clearPendingSettingsSave();\n this.settingsDirty = false;\n this.showSaveIndicator('Fix errors', 'text-danger');\n return;\n }\n\n this.settingsDirty = true;\n this.showSaveIndicator('Saving...', 'text-warning');\n this.debouncedSaveSettings();\n },\n getSettingInputs() {\n const explicitInputs = document.querySelectorAll('.setting-input[data-setting]');\n if (explicitInputs.length > 0) {\n return explicitInputs;\n }\n\n return document.querySelectorAll(\n 'input[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'select[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"]), ' +\n 'textarea[name^=\"ChatInteraction.\"]:not([name*=\".Tools[\"]):not([name*=\".Connections[\"])'\n );\n },\n getSelectedGroupValues(groupName, fallbackSelector) {\n const explicitSelections = document.querySelectorAll(`.capability-checkbox[data-save-group=\"${groupName}\"]:checked`);\n if (explicitSelections.length > 0) {\n const values = [];\n\n explicitSelections.forEach(checkbox => {\n const value = checkbox.getAttribute('data-item-id') || checkbox.value;\n if (value) {\n values.push(value);\n }\n });\n\n return values;\n }\n\n if (!fallbackSelector) {\n return [];\n }\n\n const values = [];\n const checkboxes = document.querySelectorAll(fallbackSelector);\n\n checkboxes.forEach(checkbox => {\n const baseName = checkbox.name.replace('.IsSelected', '.ItemId');\n const hiddenInput = document.querySelector(`input[type=\"hidden\"][name=\"${baseName}\"]`);\n\n if (hiddenInput && hiddenInput.value) {\n values.push(hiddenInput.value);\n }\n });\n\n return values;\n },\n getPromptTemplateSelections() {\n const promptTemplates = [];\n\n document.querySelectorAll('.prompt-template-card').forEach(card => {\n const templateIdInput = card.querySelector('.prompt-template-id-input');\n const promptParametersInput = card.querySelector('.prompt-template-parameters-input');\n const templateId = templateIdInput ? templateIdInput.value : card.getAttribute('data-template-id');\n\n if (!templateId) {\n return;\n }\n\n promptTemplates.push({\n templateId: templateId,\n promptParameters: promptParametersInput ? (promptParametersInput.value || '').trim() : ''\n });\n });\n\n return promptTemplates;\n },\n receiveNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n // Replace existing notification with same type, or add new one.\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n } else {\n this.notifications.push(notification);\n }\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n },\n updateNotification(notification) {\n if (!notification || !notification.type) {\n return;\n }\n this.clearNotificationDismiss(notification.type);\n var idx = this.notifications.findIndex(n => n.type === notification.type);\n if (idx >= 0) {\n this.notifications.splice(idx, 1, notification);\n this.scheduleNotificationDismiss(notification);\n this.scrollToBottom();\n }\n },\n scheduleNotificationDismiss(notification) {\n if (!notification || !notification.type || !notification.autoDismissMs || notification.autoDismissMs <= 0) {\n return;\n }\n this.notificationDismissTimers[notification.type] = setTimeout(() => {\n this.removeNotification(notification.type);\n }, notification.autoDismissMs);\n },\n clearNotificationDismiss(notificationType) {\n var timerId = this.notificationDismissTimers[notificationType];\n if (!timerId) {\n return;\n }\n clearTimeout(timerId);\n delete this.notificationDismissTimers[notificationType];\n },\n removeNotification(notificationType) {\n this.clearNotificationDismiss(notificationType);\n this.notifications = this.notifications.filter(n => n.type !== notificationType);\n },\n dismissNotification(notificationType) {\n this.removeNotification(notificationType);\n },\n handleNotificationAction(notificationType, actionName) {\n if (!this.connection) {\n return;\n }\n var itemId = this.getItemId();\n this.connection.invoke('HandleNotificationAction', itemId, notificationType, actionName)\n .catch(err => console.error('Failed to handle notification action:', err));\n },\n setItemId(itemId) {\n this.inputElement.setAttribute('data-interaction-id', itemId || '');\n this.inputElement.setAttribute('data-item-id', itemId || '');\n },\n resetInteraction() {\n this.setItemId('');\n this.isInteractionStarted = false;\n this.messages = [];\n this.showPlaceholder();\n },\n initializeApp() {\n this.inputElement = document.querySelector(config.inputElementSelector);\n this.buttonElement = document.querySelector(config.sendButtonElementSelector);\n this.chatContainer = document.querySelector(config.chatContainerElementSelector);\n this.placeholder = document.querySelector(config.placeholderElementSelector);\n\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n\n // Pause auto-scroll when the user manually scrolls up during streaming.\n this.chatContainer.addEventListener('scroll', () => {\n if (!this.stream) {\n return;\n }\n const threshold = 30;\n const atBottom = this.chatContainer.scrollHeight - this.chatContainer.clientHeight - this.chatContainer.scrollTop <= threshold;\n this.autoScroll = atBottom;\n });\n\n this.inputElement.addEventListener('keyup', event => {\n if (this.stream != null) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n this.buttonElement.click();\n }\n });\n\n this.inputElement.addEventListener('input', (e) => {\n this.handleUserInput(e);\n\n if (e.target.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n });\n\n this.inputElement.addEventListener('paste', (e) => {\n // Use setTimeout to allow the paste to complete before checking the value\n setTimeout(() => {\n this.prompt = this.inputElement.value;\n if (this.inputElement.value.trim()) {\n this.buttonElement.removeAttribute('disabled');\n } else {\n this.buttonElement.setAttribute('disabled', true);\n }\n }, 0);\n });\n\n this.buttonElement.addEventListener('click', () => {\n if (this.stream != null) {\n this.stream.dispose();\n this.stream = null;\n\n this.streamingFinished();\n this.hideTypingIndicator();\n\n // Clean up: remove empty assistant message or stop streaming animation.\n if (this.messages.length > 0) {\n const lastMsg = this.messages[this.messages.length - 1];\n if (lastMsg.role === 'assistant' && !lastMsg.content) {\n this.messages.pop();\n } else if (lastMsg.isStreaming) {\n lastMsg.isStreaming = false;\n }\n }\n\n return;\n }\n\n this.sendMessage();\n });\n\n const chatInteractionItems = document.getElementsByClassName('chat-interaction-history-item');\n\n for (var i = 0; i < chatInteractionItems.length; i++) {\n chatInteractionItems[i].addEventListener('click', (e) => {\n e.preventDefault();\n\n var itemId = e.target.getAttribute('data-interaction-id');\n\n if (!itemId) {\n console.error('An element with the class chat-interaction-history-item with no data-interaction-id set.');\n return;\n }\n\n this.loadInteraction(itemId);\n });\n }\n\n for (let i = 0; i < config.messages.length; i++) {\n this.addMessage(config.messages[i]);\n }\n\n // Delegate click for code block copy buttons.\n if (this.chatContainer) {\n this.chatContainer.addEventListener('click', (e) => {\n var btn = e.target.closest('.ai-code-copy-btn');\n if (!btn) {\n return;\n }\n\n var block = btn.closest('.ai-code-block') || btn.closest('pre');\n if (!block) {\n return;\n }\n\n var codeEl = block.querySelector('code');\n if (codeEl) {\n navigator.clipboard.writeText(codeEl.textContent);\n var copiedText = config.codeCopiedText || 'Copied!';\n btn.innerHTML = ' ' + copiedText;\n setTimeout(() => {\n btn.innerHTML = '';\n }, 2000);\n }\n });\n }\n\n document.addEventListener('input', event => {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('change', event => {\n if (event.target.matches('.setting-input[data-setting], .capability-checkbox[data-save-group], .group-toggle, .ci-agent-global-toggle')) {\n if (event.target.matches('.setting-input[data-setting]')) {\n this.validateSettingInput(event.target);\n }\n\n this.queueSettingsSave();\n return;\n }\n\n if (event.target.closest('.prompt-template-parameters-input, .prompt-template-id-input')) {\n this.queueSettingsSave();\n }\n });\n\n document.addEventListener('click', event => {\n if (!event.target.closest('.prompt-template-add-btn, .remove-prompt-template-btn')) {\n return;\n }\n\n setTimeout(() => {\n this.queueSettingsSave();\n }, 0);\n });\n\n // Add event listener for clear history button\n const clearHistoryBtn = document.getElementById('clearHistoryBtn');\n if (clearHistoryBtn) {\n clearHistoryBtn.addEventListener('click', () => {\n const itemId = clearHistoryBtn.getAttribute('data-interaction-id');\n if (itemId) {\n this.clearHistory(itemId);\n }\n });\n }\n\n // Initialize speech-to-text microphone button.\n if (this.speechToTextEnabled && config.micButtonElementSelector) {\n this.micButton = document.querySelector(config.micButtonElementSelector);\n if (this.micButton) {\n this.micButton.style.display = '';\n this.micButton.addEventListener('click', () => {\n this.toggleRecording();\n });\n }\n }\n\n // Initialize conversation mode button.\n if (this.conversationModeEnabled && config.conversationButtonElementSelector) {\n this.conversationButton = document.querySelector(config.conversationButtonElementSelector);\n if (this.conversationButton) {\n this.conversationButton.addEventListener('click', () => {\n this.toggleConversationMode();\n });\n }\n }\n },\n loadInteraction(itemId) {\n this.connection.invoke(\"LoadInteraction\", itemId).catch(err => console.error(err));\n },\n reloadCurrentInteraction() {\n const itemId = this.getItemId();\n if (itemId) {\n this.loadInteraction(itemId);\n }\n },\n clearHistory(itemId) {\n const self = this;\n confirmDialog({\n title: config.clearHistoryTitle,\n message: config.clearHistoryMessage,\n okText: config.clearHistoryOkText,\n cancelText: config.clearHistoryCancelText,\n callback: function (confirmed) {\n if (confirmed) {\n // Cancel any active stream before clearing history.\n if (self.stream) {\n self.stream.dispose();\n self.stream = null;\n self.hideTypingIndicator();\n self.streamingFinished();\n }\n\n self.connection.invoke(\"ClearHistory\", itemId)\n .catch(err => console.error('Error clearing history:', err));\n }\n }\n });\n },\n debouncedSaveSettings() {\n // Clear any existing timeout to reset the debounce timer\n this.clearPendingSettingsSave();\n\n // Don't save while streaming — it will be saved when streaming completes.\n if (this.stream) {\n return;\n }\n\n // Set a new timeout to save after 850ms of no changes\n this.saveSettingsTimeout = setTimeout(() => {\n if (this.settingsDirty) {\n this.saveSettings();\n this.settingsDirty = false;\n }\n this.saveSettingsTimeout = null;\n }, 850);\n },\n getSelectedToolNames() {\n return this.getSelectedGroupValues(\n 'toolNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Tools[\"]:checked'\n );\n },\n getSelectedMcpConnectionIds() {\n return this.getSelectedGroupValues(\n 'mcpConnectionIds',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Connections[\"]:checked'\n );\n },\n getSelectedA2AConnectionIds() {\n return this.getSelectedGroupValues('a2aConnectionIds');\n },\n getSelectedAgentNames() {\n return this.getSelectedGroupValues(\n 'agentNames',\n 'input[type=\"checkbox\"][name$=\"].IsSelected\"][name^=\"ChatInteraction.Agents[\"]:checked'\n );\n },\n saveSettings() {\n const itemId = this.getItemId();\n if (!itemId) {\n return Promise.resolve();\n }\n\n if (!this.validateSettings()) {\n this.showSaveIndicator('Fix errors', 'text-danger');\n return Promise.resolve();\n }\n\n const settings = {};\n\n // Collect all form inputs with the \"ChatInteraction.\" prefix generically.\n // This avoids coupling the JS to specific field names — new fields added by\n // any module are automatically included.\n const inputs = this.getSettingInputs();\n\n inputs.forEach(input => {\n const key = input.dataset.setting\n || ((input.name || '').replace('ChatInteraction.', '').replace(/^[A-Z]/, match => match.toLowerCase()));\n\n if (!key) {\n return;\n }\n\n if (input.type === 'checkbox') {\n settings[key] = input.checked;\n } else if (input.type === 'number') {\n settings[key] = input.value ? parseFloat(input.value) : null;\n } else {\n settings[key] = input.value || null;\n }\n });\n\n // Add tool, MCP connection, and agent collections (special handling).\n settings.toolNames = this.getSelectedToolNames();\n settings.mcpConnectionIds = this.getSelectedMcpConnectionIds();\n settings.a2aConnectionIds = this.getSelectedA2AConnectionIds();\n settings.agentNames = this.getSelectedAgentNames();\n\n const promptTemplates = this.getPromptTemplateSelections();\n if (promptTemplates.length > 0) {\n settings.promptTemplates = promptTemplates;\n settings.promptTemplateIds = promptTemplates.map(template => template.templateId);\n }\n\n return this.connection.invoke(\"SaveSettings\", itemId, settings)\n .catch(err => {\n console.error('Error saving settings:', err);\n this.showSaveIndicator('Save failed', 'text-danger');\n });\n },\n flushPendingSave() {\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n this.saveSettingsTimeout = null;\n }\n\n if (this.settingsDirty) {\n this.settingsDirty = false;\n return this.saveSettings();\n }\n\n return Promise.resolve();\n },\n initializeInteraction(itemId, force) {\n if (this.isInteractionStarted && !force) {\n return;\n }\n this.fireEvent(new CustomEvent(\"initializingChatInteraction\", { detail: { itemId: itemId } }));\n this.setItemId(itemId);\n this.isInteractionStarted = true;\n },\n copyResponse(message) {\n navigator.clipboard.writeText(message);\n },\n startRecording() {\n if (this.isRecording || !this.connection) {\n return;\n }\n\n navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true } })\n .then(stream => {\n var mimeType = MediaRecorder.isTypeSupported('audio/ogg;codecs=opus')\n ? 'audio/ogg;codecs=opus'\n : MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n this.mediaRecorder = new MediaRecorder(stream, {\n mimeType: mimeType,\n audioBitsPerSecond: 128000,\n });\n\n this.preRecordingPrompt = this.prompt;\n this._audioInputSent = false;\n\n var subject = new signalR.Subject();\n var itemId = this.getItemId();\n var pendingChunk = Promise.resolve();\n\n this.mediaRecorder.addEventListener('dataavailable', (e) => {\n if (e.data && e.data.size > 0) {\n pendingChunk = pendingChunk.then(async () => {\n var data = await e.data.arrayBuffer();\n var uint8Array = new Uint8Array(data);\n var binaryString = uint8Array.reduce(function (str, byte) { return str + String.fromCharCode(byte); }, '');\n var base64 = btoa(binaryString);\n subject.next(base64);\n });\n }\n });\n\n this.mediaRecorder.addEventListener('stop', () => {\n stream.getTracks().forEach(track => track.stop());\n pendingChunk.then(() => subject.complete());\n });\n\n var language = navigator.language || document.documentElement.lang || 'en-US';\n this.connection.send(\"SendAudioStream\", itemId, subject, mimeType, language);\n this.mediaRecorder.start(250);\n this.isRecording = true;\n this.updateMicButton();\n })\n .catch(err => {\n console.error('Microphone access denied:', err);\n });\n },\n stopRecording() {\n if (!this.isRecording || !this.mediaRecorder) {\n return;\n }\n\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.updateMicButton();\n },\n toggleRecording() {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n },\n updateMicButton() {\n if (!this.micButton) {\n return;\n }\n\n if (this.isRecording) {\n this.micButton.classList.add('stt-recording');\n this.micButton.innerHTML = '';\n } else {\n this.micButton.classList.remove('stt-recording');\n this.micButton.innerHTML = '';\n }\n }\n },\n watch: {\n isPlayingAudio() {\n // Reserved for future use — volume-based interrupt detection\n // no longer mutes tracks; browser echo cancellation handles echo.\n },\n isConversationMode(active) {\n if (this.micButton) {\n this.micButton.style.display = active ? 'none' : (this.speechToTextEnabled ? '' : 'none');\n }\n\n if (this.buttonElement) {\n this.buttonElement.style.display = active ? 'none' : '';\n }\n\n if (this.inputElement) {\n this.inputElement.disabled = active;\n if (active) {\n this.inputElement.placeholder = '';\n }\n }\n }\n },\n mounted() {\n (async () => {\n await this.startConnection();\n this.initializeApp();\n })();\n\n window.addEventListener('beforeunload', this.handleBeforeUnload);\n window.addEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n },\n beforeUnmount() {\n window.removeEventListener('beforeunload', this.handleBeforeUnload);\n window.removeEventListener('crestapps-ai-chat-stop-tts', this.handleExternalTtsStop);\n\n this.stopAudio(false);\n\n if (this.stream) {\n this.stream.dispose();\n this.stream = null;\n }\n if (this.connection) {\n this.connection.stop();\n }\n },\n template: config.messageTemplate\n }).mount(config.appElementSelector);\n\n return app;\n };\n\n return {\n initialize: initialize\n };\n}();\n\n// Download chart as image via event delegation (DOMPurify strips inline onclick).\ndocument.addEventListener('click', function (e) {\n const btn = e.target.closest('.download-chart-btn');\n if (!btn) {\n return;\n }\n const chartId = btn.getAttribute('data-chart-id');\n const canvas = chartId ? document.getElementById(chartId) : null;\n if (!canvas) {\n console.error('Chart canvas not found:', chartId);\n return;\n }\n const link = document.createElement('a');\n link.download = 'chart-' + chartId + '.png';\n link.href = canvas.toDataURL('image/png');\n link.click();\n});\n\n// Intercept download clicks for data-URI images and convert to blob downloads.\ndocument.addEventListener('click', function (e) {\n const link = e.target.closest('.ai-download-image');\n if (!link) {\n return;\n }\n\n const container = link.closest('.generated-image-container');\n const img = container?.querySelector('img');\n if (!img) {\n return;\n }\n\n const src = img.src;\n if (!src || !src.startsWith('data:')) {\n return; // Normal URL – let the default behaviour handle it.\n }\n\n e.preventDefault();\n\n fetch(src)\n .then(function (res) { return res.blob(); })\n .then(function (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = link.getAttribute('download') || 'generated-image.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(function () { URL.revokeObjectURL(url); }, 100);\n })\n .catch(function (err) { console.error('Failed to download image:', err); });\n});\n"]} diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/document-drop-zone.js.map b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/document-drop-zone.js.map index b8ced54d..77f92723 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/document-drop-zone.js.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/document-drop-zone.js.map @@ -1 +1 @@ -{"version":3,"sources":["document-drop-zone.js"],"names":["window","document","assignFiles","fileInput","files","dataTransfer","DataTransfer","Array","prototype","forEach","call","file","items","add","dispatchEvent","Event","bubbles","initDocumentDropZone","options","dropZone","querySelector","browseButton","openPicker","click","preventDefaults","event","preventDefault","stopPropagation","setDragState","isActive","classList","toggle","eventName","addEventListener","contains","relatedTarget","length","target","closest"],"mappings":"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","file":"document-drop-zone.js","sourcesContent":["(function (window, document) {\n 'use strict';\n\n function assignFiles(fileInput, files) {\n if (!fileInput || !files) {\n return;\n }\n\n var dataTransfer = new DataTransfer();\n\n Array.prototype.forEach.call(files, function (file) {\n dataTransfer.items.add(file);\n });\n\n fileInput.files = dataTransfer.files;\n fileInput.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n window.initDocumentDropZone = function initDocumentDropZone(options) {\n if (!options) {\n return;\n }\n\n var dropZone = typeof options.dropZone === 'string'\n ? document.querySelector(options.dropZone)\n : options.dropZone;\n var fileInput = typeof options.fileInput === 'string'\n ? document.querySelector(options.fileInput)\n : options.fileInput;\n var browseButton = typeof options.browseButton === 'string'\n ? document.querySelector(options.browseButton)\n : options.browseButton;\n\n if (!dropZone || !fileInput) {\n return;\n }\n\n function openPicker() {\n fileInput.click();\n }\n\n function preventDefaults(event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n function setDragState(isActive) {\n dropZone.classList.toggle('document-drop-zone--dragover', isActive);\n }\n\n ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(function (eventName) {\n dropZone.addEventListener(eventName, preventDefaults);\n });\n\n dropZone.addEventListener('dragenter', function () { setDragState(true); });\n dropZone.addEventListener('dragover', function () { setDragState(true); });\n dropZone.addEventListener('dragleave', function (event) {\n if (!dropZone.contains(event.relatedTarget)) {\n setDragState(false);\n }\n });\n dropZone.addEventListener('drop', function (event) {\n setDragState(false);\n var files = event.dataTransfer ? event.dataTransfer.files : null;\n if (files && files.length > 0) {\n assignFiles(fileInput, files);\n }\n });\n\n if (browseButton) {\n browseButton.addEventListener('click', function (event) {\n event.preventDefault();\n event.stopPropagation();\n openPicker();\n });\n }\n\n dropZone.addEventListener('click', function (event) {\n if (event.target.closest('[data-drop-zone-browse]')) {\n return;\n }\n\n openPicker();\n });\n };\n})(window, document);\n"]} \ No newline at end of file +{"version":3,"sources":["document-drop-zone.js"],"names":["window","document","assignFiles","fileInput","files","dataTransfer","DataTransfer","Array","prototype","forEach","call","file","items","add","dispatchEvent","Event","bubbles","initDocumentDropZone","options","dropZone","querySelector","browseButton","openPicker","click","preventDefaults","event","preventDefault","stopPropagation","setDragState","isActive","classList","toggle","eventName","addEventListener","contains","relatedTarget","length","target","closest"],"mappings":"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","file":"document-drop-zone.js","sourcesContent":["(function (window, document) {\n 'use strict';\n\n function assignFiles(fileInput, files) {\n if (!fileInput || !files) {\n return;\n }\n\n var dataTransfer = new DataTransfer();\n\n Array.prototype.forEach.call(files, function (file) {\n dataTransfer.items.add(file);\n });\n\n fileInput.files = dataTransfer.files;\n fileInput.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n window.initDocumentDropZone = function initDocumentDropZone(options) {\n if (!options) {\n return;\n }\n\n var dropZone = typeof options.dropZone === 'string'\n ? document.querySelector(options.dropZone)\n : options.dropZone;\n var fileInput = typeof options.fileInput === 'string'\n ? document.querySelector(options.fileInput)\n : options.fileInput;\n var browseButton = typeof options.browseButton === 'string'\n ? document.querySelector(options.browseButton)\n : options.browseButton;\n\n if (!dropZone || !fileInput) {\n return;\n }\n\n function openPicker() {\n fileInput.click();\n }\n\n function preventDefaults(event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n function setDragState(isActive) {\n dropZone.classList.toggle('document-drop-zone--dragover', isActive);\n }\n\n ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(function (eventName) {\n dropZone.addEventListener(eventName, preventDefaults);\n });\n\n dropZone.addEventListener('dragenter', function () { setDragState(true); });\n dropZone.addEventListener('dragover', function () { setDragState(true); });\n dropZone.addEventListener('dragleave', function (event) {\n if (!dropZone.contains(event.relatedTarget)) {\n setDragState(false);\n }\n });\n dropZone.addEventListener('drop', function (event) {\n setDragState(false);\n var files = event.dataTransfer ? event.dataTransfer.files : null;\n if (files && files.length > 0) {\n assignFiles(fileInput, files);\n }\n });\n\n if (browseButton) {\n browseButton.addEventListener('click', function (event) {\n event.preventDefault();\n event.stopPropagation();\n openPicker();\n });\n }\n\n dropZone.addEventListener('click', function (event) {\n if (event.target.closest('[data-drop-zone-browse]')) {\n return;\n }\n\n openPicker();\n });\n };\n})(window, document);\n"]} diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/technical-name-generator.js.map b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/technical-name-generator.js.map index 75503a02..e0a4f7e7 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/technical-name-generator.js.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/scripts/technical-name-generator.js.map @@ -1 +1 @@ -{"version":3,"sources":["technical-name-generator.js"],"names":["toTitleCaseNoSpaces","value","trim","split","filter","w","length","map","charAt","toUpperCase","slice","toLowerCase","join","initAutoGenerateTechnicalName","displayId","nameId","document","addEventListener","displayEl","getElementById","nameEl","userEdited","generated","autoEls","querySelectorAll","i","el","getAttribute","window"],"mappings":";;;;;AAAA,CAAC,YAAY;EACX;EACA,SAASA,mBAAmBA,CAACC,KAAK,EAAE;IAClC,OAAO,CAACA,KAAK,IAAI,EAAE,EAChBC,IAAI,CAAC;IACN;IAAA,CACCC,KAAK,CAAC,eAAe,CAAC,CACtBC,MAAM,CAAC,UAAUC,CAAC,EAAE;MAAE,OAAOA,CAAC,CAACC,MAAM,GAAG,CAAC;IAAE,CAAC,CAAC,CAC7CC,GAAG,CAAC,UAAUF,CAAC,EAAE;MAAE,OAAOA,CAAC,CAACG,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAGJ,CAAC,CAACK,KAAK,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAAE,CAAC,CAAC,CAClFC,IAAI,CAAC,EAAE,CAAC;EACb;EAEA,SAASC,6BAA6BA,CAACC,SAAS,EAAEC,MAAM,EAAE;IACxD,IAAI,CAACD,SAAS,IAAI,CAACC,MAAM,EAAE;IAC3BC,QAAQ,CAACC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY;MACxD,IAAIC,SAAS,GAAGF,QAAQ,CAACG,cAAc,CAACL,SAAS,CAAC;MAClD,IAAIM,MAAM,GAAGJ,QAAQ,CAACG,cAAc,CAACJ,MAAM,CAAC;MAC5C,IAAI,CAACG,SAAS,IAAI,CAACE,MAAM,EAAE;;MAE3B;MACA,IAAIC,UAAU,GAAGD,MAAM,CAACnB,KAAK,CAACC,IAAI,CAAC,CAAC,KAAK,EAAE;;MAE3C;MACAkB,MAAM,CAACH,gBAAgB,CAAC,OAAO,EAAE,YAAY;QAC3CI,UAAU,GAAGD,MAAM,CAACnB,KAAK,CAACC,IAAI,CAAC,CAAC,KAAK,EAAE;MACzC,CAAC,CAAC;;MAEF;MACAgB,SAAS,CAACD,gBAAgB,CAAC,OAAO,EAAE,YAAY;QAC9C,IAAII,UAAU,EAAE;QAChB,IAAIC,SAAS,GAAGtB,mBAAmB,CAACkB,SAAS,CAACjB,KAAK,IAAI,EAAE,CAAC;QAC1DmB,MAAM,CAACnB,KAAK,GAAGqB,SAAS;MAC1B,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;;EAEA;EACAN,QAAQ,CAACC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY;IACxD,IAAIM,OAAO,GAAGP,QAAQ,CAACQ,gBAAgB,CAAC,uBAAuB,CAAC;IAChE,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,OAAO,CAACjB,MAAM,EAAEmB,CAAC,EAAE,EAAE;MACvC,IAAIC,EAAE,GAAGH,OAAO,CAACE,CAAC,CAAC;MACnB,IAAIX,SAAS,GAAGY,EAAE,CAACC,YAAY,CAAC,iBAAiB,CAAC;MAClD,IAAIZ,MAAM,GAAGW,EAAE,CAACC,YAAY,CAAC,cAAc,CAAC;MAC5C,IAAIb,SAAS,IAAIC,MAAM,EAAE;QACvB;QACAF,6BAA6B,CAACC,SAAS,EAAEC,MAAM,CAAC;MAClD;IACF;EACF,CAAC,CAAC;EAEFa,MAAM,CAACf,6BAA6B,GAAGA,6BAA6B;AACtE,CAAC,EAAE,CAAC","file":"technical-name-generator.js","sourcesContent":["(function () {\n // Expose initializer globally so views can call it with specific field IDs.\n function toTitleCaseNoSpaces(value) {\n return (value || '')\n .trim()\n // split on whitespace or common separators or any non-alphanumeric\n .split(/[^A-Za-z0-9]+/)\n .filter(function (w) { return w.length > 0; })\n .map(function (w) { return w.charAt(0).toUpperCase() + w.slice(1).toLowerCase(); })\n .join('');\n }\n\n function initAutoGenerateTechnicalName(displayId, nameId) {\n if (!displayId || !nameId) return;\n document.addEventListener('DOMContentLoaded', function () {\n var displayEl = document.getElementById(displayId);\n var nameEl = document.getElementById(nameId);\n if (!displayEl || !nameEl) return;\n\n // Track whether the user has entered a non-empty value in the Name field.\n var userEdited = nameEl.value.trim() !== '';\n\n // Resume auto-generation only when the Name field is empty again.\n nameEl.addEventListener('input', function () {\n userEdited = nameEl.value.trim() !== '';\n });\n\n // Generate on keyup as requested\n displayEl.addEventListener('keyup', function () {\n if (userEdited) return;\n var generated = toTitleCaseNoSpaces(displayEl.value || '');\n nameEl.value = generated;\n });\n });\n }\n\n // Automatically initialize for any elements using the data attributes.\n document.addEventListener('DOMContentLoaded', function () {\n var autoEls = document.querySelectorAll('[data-auto-tech-name]');\n for (var i = 0; i < autoEls.length; i++) {\n var el = autoEls[i];\n var displayId = el.getAttribute('data-display-id');\n var nameId = el.getAttribute('data-name-id');\n if (displayId && nameId) {\n // call initializer immediately (it will attach listeners)\n initAutoGenerateTechnicalName(displayId, nameId);\n }\n }\n });\n\n window.initAutoGenerateTechnicalName = initAutoGenerateTechnicalName;\n})();\n"]} \ No newline at end of file +{"version":3,"sources":["technical-name-generator.js"],"names":["toTitleCaseNoSpaces","value","trim","split","filter","w","length","map","charAt","toUpperCase","slice","toLowerCase","join","initAutoGenerateTechnicalName","displayId","nameId","document","addEventListener","displayEl","getElementById","nameEl","userEdited","generated","autoEls","querySelectorAll","i","el","getAttribute","window"],"mappings":";;;;;AAAA,CAAC,YAAY;EACX;EACA,SAASA,mBAAmBA,CAACC,KAAK,EAAE;IAClC,OAAO,CAACA,KAAK,IAAI,EAAE,EAChBC,IAAI,CAAC;IACN;IAAA,CACCC,KAAK,CAAC,eAAe,CAAC,CACtBC,MAAM,CAAC,UAAUC,CAAC,EAAE;MAAE,OAAOA,CAAC,CAACC,MAAM,GAAG,CAAC;IAAE,CAAC,CAAC,CAC7CC,GAAG,CAAC,UAAUF,CAAC,EAAE;MAAE,OAAOA,CAAC,CAACG,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAGJ,CAAC,CAACK,KAAK,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAAE,CAAC,CAAC,CAClFC,IAAI,CAAC,EAAE,CAAC;EACb;EAEA,SAASC,6BAA6BA,CAACC,SAAS,EAAEC,MAAM,EAAE;IACxD,IAAI,CAACD,SAAS,IAAI,CAACC,MAAM,EAAE;IAC3BC,QAAQ,CAACC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY;MACxD,IAAIC,SAAS,GAAGF,QAAQ,CAACG,cAAc,CAACL,SAAS,CAAC;MAClD,IAAIM,MAAM,GAAGJ,QAAQ,CAACG,cAAc,CAACJ,MAAM,CAAC;MAC5C,IAAI,CAACG,SAAS,IAAI,CAACE,MAAM,EAAE;;MAE3B;MACA,IAAIC,UAAU,GAAGD,MAAM,CAACnB,KAAK,CAACC,IAAI,CAAC,CAAC,KAAK,EAAE;;MAE3C;MACAkB,MAAM,CAACH,gBAAgB,CAAC,OAAO,EAAE,YAAY;QAC3CI,UAAU,GAAGD,MAAM,CAACnB,KAAK,CAACC,IAAI,CAAC,CAAC,KAAK,EAAE;MACzC,CAAC,CAAC;;MAEF;MACAgB,SAAS,CAACD,gBAAgB,CAAC,OAAO,EAAE,YAAY;QAC9C,IAAII,UAAU,EAAE;QAChB,IAAIC,SAAS,GAAGtB,mBAAmB,CAACkB,SAAS,CAACjB,KAAK,IAAI,EAAE,CAAC;QAC1DmB,MAAM,CAACnB,KAAK,GAAGqB,SAAS;MAC1B,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;;EAEA;EACAN,QAAQ,CAACC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY;IACxD,IAAIM,OAAO,GAAGP,QAAQ,CAACQ,gBAAgB,CAAC,uBAAuB,CAAC;IAChE,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,OAAO,CAACjB,MAAM,EAAEmB,CAAC,EAAE,EAAE;MACvC,IAAIC,EAAE,GAAGH,OAAO,CAACE,CAAC,CAAC;MACnB,IAAIX,SAAS,GAAGY,EAAE,CAACC,YAAY,CAAC,iBAAiB,CAAC;MAClD,IAAIZ,MAAM,GAAGW,EAAE,CAACC,YAAY,CAAC,cAAc,CAAC;MAC5C,IAAIb,SAAS,IAAIC,MAAM,EAAE;QACvB;QACAF,6BAA6B,CAACC,SAAS,EAAEC,MAAM,CAAC;MAClD;IACF;EACF,CAAC,CAAC;EAEFa,MAAM,CAACf,6BAA6B,GAAGA,6BAA6B;AACtE,CAAC,EAAE,CAAC","file":"technical-name-generator.js","sourcesContent":["(function () {\n // Expose initializer globally so views can call it with specific field IDs.\n function toTitleCaseNoSpaces(value) {\n return (value || '')\n .trim()\n // split on whitespace or common separators or any non-alphanumeric\n .split(/[^A-Za-z0-9]+/)\n .filter(function (w) { return w.length > 0; })\n .map(function (w) { return w.charAt(0).toUpperCase() + w.slice(1).toLowerCase(); })\n .join('');\n }\n\n function initAutoGenerateTechnicalName(displayId, nameId) {\n if (!displayId || !nameId) return;\n document.addEventListener('DOMContentLoaded', function () {\n var displayEl = document.getElementById(displayId);\n var nameEl = document.getElementById(nameId);\n if (!displayEl || !nameEl) return;\n\n // Track whether the user has entered a non-empty value in the Name field.\n var userEdited = nameEl.value.trim() !== '';\n\n // Resume auto-generation only when the Name field is empty again.\n nameEl.addEventListener('input', function () {\n userEdited = nameEl.value.trim() !== '';\n });\n\n // Generate on keyup as requested\n displayEl.addEventListener('keyup', function () {\n if (userEdited) return;\n var generated = toTitleCaseNoSpaces(displayEl.value || '');\n nameEl.value = generated;\n });\n });\n }\n\n // Automatically initialize for any elements using the data attributes.\n document.addEventListener('DOMContentLoaded', function () {\n var autoEls = document.querySelectorAll('[data-auto-tech-name]');\n for (var i = 0; i < autoEls.length; i++) {\n var el = autoEls[i];\n var displayId = el.getAttribute('data-display-id');\n var nameId = el.getAttribute('data-name-id');\n if (displayId && nameId) {\n // call initializer immediately (it will attach listeners)\n initAutoGenerateTechnicalName(displayId, nameId);\n }\n }\n });\n\n window.initAutoGenerateTechnicalName = initAutoGenerateTechnicalName;\n})();\n"]} diff --git a/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css.map b/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css.map index f0ce1bb2..ea8d1efd 100644 --- a/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css.map +++ b/src/Resources/CrestApps.AI.Resources/wwwroot/styles/chat-widget.css.map @@ -1 +1 @@ -{"version":3,"sources":["chat-widget.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"chat-widget.css","sourcesContent":["/* CrestApps AI Chat Widget */\r\n:root {\r\n --ai-widget-primary: var(--bs-secondary, #6c757d);\r\n --ai-widget-width: 380px;\r\n --ai-widget-height: 520px;\r\n}\r\n\r\n.ai-chat-widget-toggle {\r\n position: fixed;\r\n bottom: 1.25rem;\r\n right: 1.25rem;\r\n z-index: 10000;\r\n width: 52px;\r\n height: 52px;\r\n border-radius: 50%;\r\n background: var(--ai-widget-primary);\r\n color: white;\r\n border: none;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 1.5rem;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.2);\r\n transition: transform 0.2s, box-shadow 0.2s;\r\n}\r\n\r\n.ai-chat-widget-toggle:hover {\r\n transform: scale(1.1);\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.3);\r\n}\r\n\r\n.ai-chat-widget-container {\r\n position: fixed;\r\n bottom: 5rem;\r\n right: 1.25rem;\r\n z-index: 10001;\r\n width: var(--ai-widget-width);\r\n height: var(--ai-widget-height);\r\n background: #fff;\r\n border-radius: 12px;\r\n box-shadow: 0 8px 32px rgba(0,0,0,0.18);\r\n display: none;\r\n flex-direction: column;\r\n overflow: hidden;\r\n}\r\n\r\n.ai-chat-widget-container.ai-chat-widget-resizable {\r\n resize: both;\r\n min-width: 320px;\r\n min-height: 420px;\r\n max-width: min(90vw, 960px);\r\n max-height: min(90vh, 960px);\r\n}\r\n\r\n.ai-chat-widget-container.open {\r\n display: flex;\r\n}\r\n\r\n.ai-chat-widget-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 0.75rem 1rem;\r\n background: var(--ai-widget-primary);\r\n color: white;\r\n}\r\n\r\n.ai-chat-widget-header.ai-chat-widget-drag-handle {\r\n cursor: move;\r\n user-select: none;\r\n touch-action: none;\r\n}\r\n\r\n.ai-chat-widget-header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.15rem;\r\n}\r\n\r\n.ai-chat-widget-toggle.ai-chat-widget-draggable {\r\n touch-action: none;\r\n}\r\n\r\n.ai-chat-widget-container.ai-chat-widget-dragging,\r\n.ai-chat-widget-toggle.ai-chat-widget-dragging {\r\n transition: none;\r\n}\r\n\r\n.ai-chat-widget-toggle.ai-chat-widget-dragging:hover {\r\n transform: none;\r\n}\r\n\r\n.ai-chat-widget-header .title {\r\n font-weight: 600;\r\n font-size: 0.95rem;\r\n}\r\n\r\n.ai-chat-widget-header button {\r\n background: none;\r\n border: none;\r\n color: white;\r\n cursor: pointer;\r\n font-size: 1rem;\r\n padding: 0 0.25rem;\r\n opacity: 0.8;\r\n}\r\n\r\n.ai-chat-widget-header button:hover {\r\n opacity: 1;\r\n}\r\n\r\n.ai-chat-widget-profile-select {\r\n padding: 0.5rem 0.75rem;\r\n border-bottom: 1px solid #e9ecef;\r\n background: #f8f9fa;\r\n}\r\n\r\n.ai-chat-widget-profile-select select {\r\n width: 100%;\r\n padding: 0.35rem 0.5rem;\r\n border: 1px solid #ced4da;\r\n border-radius: 6px;\r\n font-size: 0.85rem;\r\n}\r\n\r\n.ai-chat-widget-messages {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 0.75rem;\r\n font-size: 0.9rem;\r\n}\r\n\r\n/* ── Widget message items (ai-chat.js Vue template) ── */\r\n.ai-chat-widget-messages .ai-chat-messages {\r\n padding: 0.5rem;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-item {\r\n position: relative;\r\n padding: 0.5rem 0;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-item + .ai-chat-message-item::before {\r\n content: '';\r\n display: block;\r\n width: 100%;\r\n margin-bottom: 0.5rem;\r\n border-top: 1px solid rgba(33, 37, 41, 0.08);\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-msg-role {\r\n font-size: 0.7rem;\r\n font-weight: 600;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-msg-role-user {\r\n color: #0d6efd;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-msg-role-assistant {\r\n color: #6f42c1;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-streaming-icon {\r\n animation: ai-widget-pulse 1.5s infinite;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-bot-icon {\r\n color: #6f42c1;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-body {\r\n position: relative;\r\n padding: 0;\r\n overflow-wrap: break-word;\r\n word-break: break-word;\r\n min-width: 0;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-body p:last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n/* ── Message action buttons (copy, thumbs up/down) ── */\r\n.ai-chat-widget-messages .message-buttons-container {\r\n position: absolute;\r\n right: 0.1rem;\r\n bottom: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0.35rem;\r\n width: auto;\r\n max-width: max-content;\r\n opacity: 0;\r\n pointer-events: none;\r\n transition: opacity 0.15s ease-in-out;\r\n background: rgba(255, 255, 255, 0.96);\r\n padding: 0.2rem 0.35rem;\r\n border-radius: 999px;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\r\n margin-bottom: 1rem;\r\n transform: translateY(50%);\r\n z-index: 1;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-item:hover .message-buttons-container,\r\n.ai-chat-widget-messages .ai-chat-message-item:focus-within .message-buttons-container {\r\n opacity: 1;\r\n pointer-events: auto;\r\n}\r\n\r\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: 0 0 auto;\r\n width: 1.75rem;\r\n height: 1.75rem;\r\n margin: 0 !important;\r\n padding: 0 !important;\r\n border-radius: 50%;\r\n color: var(--bs-secondary-color, #6c757d) !important;\r\n text-decoration: none;\r\n}\r\n\r\n.ai-chat-widget-messages .message-buttons-container .ai-chat-message-assistant-feedback {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 0.35rem;\r\n}\r\n\r\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:hover,\r\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:focus {\r\n color: var(--bs-body-color, #212529) !important;\r\n}\r\n\r\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox.tts-playing {\r\n color: var(--bs-primary, #0d6efd) !important;\r\n opacity: 1;\r\n pointer-events: auto;\r\n}\r\n\r\n/* ── Notifications ── */\r\n.ai-chat-widget-messages .ai-chat-notification {\r\n margin: 0.75rem 0.5rem 0;\r\n padding: 0.625rem 0.75rem;\r\n border: 1px solid rgba(33, 37, 41, 0.12);\r\n border-radius: 0.5rem;\r\n background: rgba(248, 249, 250, 0.98);\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-notification-content {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 0.5rem;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-notification-icon {\r\n margin-top: 0.1rem;\r\n color: var(--bs-secondary-color, #6c757d);\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-notification-text {\r\n flex: 1 1 auto;\r\n min-width: 0;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-notification-dismiss {\r\n margin-left: auto !important;\r\n color: var(--bs-secondary-color, #6c757d) !important;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-notification-actions {\r\n display: flex;\r\n gap: 0.5rem;\r\n margin-top: 0.5rem;\r\n}\r\n\r\n/* ── Chart containers inside widget ── */\r\n.ai-chat-widget-messages .chart-container {\r\n width: 100%;\r\n max-width: 100% !important;\r\n min-height: 280px;\r\n}\r\n\r\n/* ── Code blocks & inline code ── */\r\n.ai-chat-widget-messages .ai-chat-message-body pre {\r\n background: #2d2d2d;\r\n color: #f8f8f2;\r\n padding: 0.5rem;\r\n border-radius: 4px;\r\n overflow-x: auto;\r\n font-size: 0.8rem;\r\n}\r\n\r\n.ai-chat-widget-messages .ai-chat-message-body code {\r\n font-size: 0.85em;\r\n}\r\n\r\n@keyframes ai-widget-pulse {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.4; }\r\n}\r\n\r\n.ai-chat-widget-input {\r\n border-top: 1px solid #e9ecef;\r\n padding: 0.5rem 0.75rem;\r\n display: flex;\r\n gap: 0.5rem;\r\n align-items: flex-end;\r\n}\r\n\r\n.ai-chat-widget-input textarea {\r\n flex: 1;\r\n border: 1px solid #ced4da;\r\n border-radius: 8px;\r\n padding: 0.4rem 0.6rem;\r\n font-size: 0.9rem;\r\n resize: none;\r\n max-height: 80px;\r\n min-height: 36px;\r\n line-height: 1.4;\r\n outline: none;\r\n}\r\n\r\n.ai-chat-widget-input textarea:focus {\r\n border-color: var(--ai-widget-primary);\r\n box-shadow: 0 0 0 2px rgba(65,182,112,0.15);\r\n}\r\n\r\n.ai-chat-widget-input button {\r\n background: var(--ai-widget-primary);\r\n color: white;\r\n border: none;\r\n border-radius: 8px;\r\n padding: 0.4rem 0.75rem;\r\n cursor: pointer;\r\n font-size: 0.9rem;\r\n white-space: nowrap;\r\n}\r\n\r\n.ai-chat-widget-input button:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n\r\n.ai-chat-widget-status {\r\n padding: 0.25rem 0.75rem;\r\n font-size: 0.8rem;\r\n color: #6c757d;\r\n display: none;\r\n}\r\n\r\n.ai-chat-widget-status.visible {\r\n display: block;\r\n}\r\n\r\n.ai-chat-widget-welcome {\r\n text-align: center;\r\n color: #6c757d;\r\n padding: 2rem 1rem;\r\n font-size: 0.9rem;\r\n}\r\n\r\n@media (max-width: 576px) {\r\n .ai-chat-widget-container {\r\n width: calc(100vw - 1rem);\r\n height: calc(100vh - 6rem);\r\n right: 0.5rem;\r\n bottom: 4.5rem;\r\n }\r\n}\r\n"]} +{"version":3,"sources":["chat-widget.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"chat-widget.css","sourcesContent":["/* CrestApps AI Chat Widget */\n:root {\n --ai-widget-primary: var(--bs-secondary, #6c757d);\n --ai-widget-width: 380px;\n --ai-widget-height: 520px;\n}\n\n.ai-chat-widget-toggle {\n position: fixed;\n bottom: 1.25rem;\n right: 1.25rem;\n z-index: 10000;\n width: 52px;\n height: 52px;\n border-radius: 50%;\n background: var(--ai-widget-primary);\n color: white;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.5rem;\n box-shadow: 0 4px 12px rgba(0,0,0,0.2);\n transition: transform 0.2s, box-shadow 0.2s;\n}\n\n.ai-chat-widget-toggle:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 16px rgba(0,0,0,0.3);\n}\n\n.ai-chat-widget-container {\n position: fixed;\n bottom: 5rem;\n right: 1.25rem;\n z-index: 10001;\n width: var(--ai-widget-width);\n height: var(--ai-widget-height);\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0,0,0,0.18);\n display: none;\n flex-direction: column;\n overflow: hidden;\n}\n\n.ai-chat-widget-container.ai-chat-widget-resizable {\n resize: both;\n min-width: 320px;\n min-height: 420px;\n max-width: min(90vw, 960px);\n max-height: min(90vh, 960px);\n}\n\n.ai-chat-widget-container.open {\n display: flex;\n}\n\n.ai-chat-widget-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n background: var(--ai-widget-primary);\n color: white;\n}\n\n.ai-chat-widget-header.ai-chat-widget-drag-handle {\n cursor: move;\n user-select: none;\n touch-action: none;\n}\n\n.ai-chat-widget-header-actions {\n display: flex;\n align-items: center;\n gap: 0.15rem;\n}\n\n.ai-chat-widget-toggle.ai-chat-widget-draggable {\n touch-action: none;\n}\n\n.ai-chat-widget-container.ai-chat-widget-dragging,\n.ai-chat-widget-toggle.ai-chat-widget-dragging {\n transition: none;\n}\n\n.ai-chat-widget-toggle.ai-chat-widget-dragging:hover {\n transform: none;\n}\n\n.ai-chat-widget-header .title {\n font-weight: 600;\n font-size: 0.95rem;\n}\n\n.ai-chat-widget-header button {\n background: none;\n border: none;\n color: white;\n cursor: pointer;\n font-size: 1rem;\n padding: 0 0.25rem;\n opacity: 0.8;\n}\n\n.ai-chat-widget-header button:hover {\n opacity: 1;\n}\n\n.ai-chat-widget-profile-select {\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid #e9ecef;\n background: #f8f9fa;\n}\n\n.ai-chat-widget-profile-select select {\n width: 100%;\n padding: 0.35rem 0.5rem;\n border: 1px solid #ced4da;\n border-radius: 6px;\n font-size: 0.85rem;\n}\n\n.ai-chat-widget-messages {\n flex: 1;\n overflow-y: auto;\n padding: 0.75rem;\n font-size: 0.9rem;\n}\n\n/* ── Widget message items (ai-chat.js Vue template) ── */\n.ai-chat-widget-messages .ai-chat-messages {\n padding: 0.5rem;\n}\n\n.ai-chat-widget-messages .ai-chat-message-item {\n position: relative;\n padding: 0.5rem 0;\n}\n\n.ai-chat-widget-messages .ai-chat-message-item + .ai-chat-message-item::before {\n content: '';\n display: block;\n width: 100%;\n margin-bottom: 0.5rem;\n border-top: 1px solid rgba(33, 37, 41, 0.08);\n}\n\n.ai-chat-widget-messages .ai-chat-msg-role {\n font-size: 0.7rem;\n font-weight: 600;\n margin-bottom: 2px;\n}\n\n.ai-chat-widget-messages .ai-chat-msg-role-user {\n color: #0d6efd;\n}\n\n.ai-chat-widget-messages .ai-chat-msg-role-assistant {\n color: #6f42c1;\n}\n\n.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-streaming-icon {\n animation: ai-widget-pulse 1.5s infinite;\n}\n\n.ai-chat-widget-messages .ai-chat-msg-role-assistant i.ai-bot-icon {\n color: #6f42c1;\n}\n\n.ai-chat-widget-messages .ai-chat-message-body {\n position: relative;\n padding: 0;\n overflow-wrap: break-word;\n word-break: break-word;\n min-width: 0;\n}\n\n.ai-chat-widget-messages .ai-chat-message-body p:last-child {\n margin-bottom: 0;\n}\n\n/* ── Message action buttons (copy, thumbs up/down) ── */\n.ai-chat-widget-messages .message-buttons-container {\n position: absolute;\n right: 0.1rem;\n bottom: 0;\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n width: auto;\n max-width: max-content;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.15s ease-in-out;\n background: rgba(255, 255, 255, 0.96);\n padding: 0.2rem 0.35rem;\n border-radius: 999px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n margin-bottom: 1rem;\n transform: translateY(50%);\n z-index: 1;\n}\n\n.ai-chat-widget-messages .ai-chat-message-item:hover .message-buttons-container,\n.ai-chat-widget-messages .ai-chat-message-item:focus-within .message-buttons-container {\n opacity: 1;\n pointer-events: auto;\n}\n\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 1.75rem;\n height: 1.75rem;\n margin: 0 !important;\n padding: 0 !important;\n border-radius: 50%;\n color: var(--bs-secondary-color, #6c757d) !important;\n text-decoration: none;\n}\n\n.ai-chat-widget-messages .message-buttons-container .ai-chat-message-assistant-feedback {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n}\n\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:hover,\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox:focus {\n color: var(--bs-body-color, #212529) !important;\n}\n\n.ai-chat-widget-messages .message-buttons-container > .button-message-toolbox.tts-playing {\n color: var(--bs-primary, #0d6efd) !important;\n opacity: 1;\n pointer-events: auto;\n}\n\n/* ── Notifications ── */\n.ai-chat-widget-messages .ai-chat-notification {\n margin: 0.75rem 0.5rem 0;\n padding: 0.625rem 0.75rem;\n border: 1px solid rgba(33, 37, 41, 0.12);\n border-radius: 0.5rem;\n background: rgba(248, 249, 250, 0.98);\n}\n\n.ai-chat-widget-messages .ai-chat-notification-content {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n\n.ai-chat-widget-messages .ai-chat-notification-icon {\n margin-top: 0.1rem;\n color: var(--bs-secondary-color, #6c757d);\n}\n\n.ai-chat-widget-messages .ai-chat-notification-text {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.ai-chat-widget-messages .ai-chat-notification-dismiss {\n margin-left: auto !important;\n color: var(--bs-secondary-color, #6c757d) !important;\n}\n\n.ai-chat-widget-messages .ai-chat-notification-actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.5rem;\n}\n\n/* ── Chart containers inside widget ── */\n.ai-chat-widget-messages .chart-container {\n width: 100%;\n max-width: 100% !important;\n min-height: 280px;\n}\n\n/* ── Code blocks & inline code ── */\n.ai-chat-widget-messages .ai-chat-message-body pre {\n background: #2d2d2d;\n color: #f8f8f2;\n padding: 0.5rem;\n border-radius: 4px;\n overflow-x: auto;\n font-size: 0.8rem;\n}\n\n.ai-chat-widget-messages .ai-chat-message-body code {\n font-size: 0.85em;\n}\n\n@keyframes ai-widget-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n}\n\n.ai-chat-widget-input {\n border-top: 1px solid #e9ecef;\n padding: 0.5rem 0.75rem;\n display: flex;\n gap: 0.5rem;\n align-items: flex-end;\n}\n\n.ai-chat-widget-input textarea {\n flex: 1;\n border: 1px solid #ced4da;\n border-radius: 8px;\n padding: 0.4rem 0.6rem;\n font-size: 0.9rem;\n resize: none;\n max-height: 80px;\n min-height: 36px;\n line-height: 1.4;\n outline: none;\n}\n\n.ai-chat-widget-input textarea:focus {\n border-color: var(--ai-widget-primary);\n box-shadow: 0 0 0 2px rgba(65,182,112,0.15);\n}\n\n.ai-chat-widget-input button {\n background: var(--ai-widget-primary);\n color: white;\n border: none;\n border-radius: 8px;\n padding: 0.4rem 0.75rem;\n cursor: pointer;\n font-size: 0.9rem;\n white-space: nowrap;\n}\n\n.ai-chat-widget-input button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.ai-chat-widget-status {\n padding: 0.25rem 0.75rem;\n font-size: 0.8rem;\n color: #6c757d;\n display: none;\n}\n\n.ai-chat-widget-status.visible {\n display: block;\n}\n\n.ai-chat-widget-welcome {\n text-align: center;\n color: #6c757d;\n padding: 2rem 1rem;\n font-size: 0.9rem;\n}\n\n@media (max-width: 576px) {\n .ai-chat-widget-container {\n width: calc(100vw - 1rem);\n height: calc(100vh - 6rem);\n right: 0.5rem;\n bottom: 4.5rem;\n }\n}\n"]}