| |
| |
| |
| |
| |
| |
|
|
| (function() { |
| 'use strict'; |
|
|
| var chatPanel = null; |
| var messagesContainer = null; |
| var inputField = null; |
| var sendBtn = null; |
| var finishBtn = null; |
| var stepCounter = null; |
| var isSending = false; |
|
|
| |
| |
| |
| |
| function agentChatInit() { |
| chatPanel = document.getElementById('agent-chat-panel'); |
| if (!chatPanel) return; |
|
|
| messagesContainer = document.getElementById('agent-chat-messages'); |
| inputField = document.getElementById('agent-chat-input'); |
| sendBtn = document.getElementById('agent-chat-send-btn'); |
| finishBtn = document.getElementById('agent-chat-finish-btn'); |
| stepCounter = document.getElementById('agent-chat-step-counter'); |
|
|
| |
| var container = chatPanel.closest('[data-chat-active]'); |
| if (container && container.getAttribute('data-chat-active') === 'false') { |
| |
| return; |
| } |
|
|
| |
| document.body.classList.add('agent-chat-active'); |
|
|
| |
| if (inputField) { |
| inputField.addEventListener('keydown', function(e) { |
| if (e.key === 'Enter' && !e.shiftKey) { |
| e.preventDefault(); |
| agentChatSend(); |
| } |
| }); |
| } |
|
|
| |
| fetch('/agent_chat/status', { |
| method: 'GET', |
| credentials: 'same-origin' |
| }) |
| .then(function(resp) { return resp.json(); }) |
| .then(function(data) { |
| if (data.active) { |
| |
| restoreMessages(data.messages || []); |
| updateStepCounter(data.step_count || 0, data.max_steps || 20); |
| } |
| }) |
| .catch(function(err) { |
| console.log('No active agent session:', err); |
| }); |
| } |
|
|
| |
| |
| |
| function agentChatSend() { |
| if (isSending || !inputField) return; |
|
|
| var message = inputField.value.trim(); |
| if (!message) return; |
|
|
| isSending = true; |
| inputField.value = ''; |
| inputField.disabled = true; |
| if (sendBtn) sendBtn.disabled = true; |
| if (finishBtn) finishBtn.disabled = true; |
|
|
| |
| var placeholder = messagesContainer.querySelector('.agent-chat-placeholder'); |
| if (placeholder) placeholder.remove(); |
|
|
| |
| appendMessage('user', message); |
|
|
| |
| var typingEl = showTypingIndicator(); |
|
|
| fetch('/agent_chat/send', { |
| method: 'POST', |
| credentials: 'same-origin', |
| headers: { 'Content-Type': 'application/json' }, |
| body: JSON.stringify({ message: message }) |
| }) |
| .then(function(resp) { return resp.json(); }) |
| .then(function(data) { |
| removeTypingIndicator(typingEl); |
|
|
| if (data.error) { |
| appendMessage('error', data.error); |
| } else { |
| appendMessage('agent', data.content || ''); |
| updateStepCounter(data.step_count || 0, data.max_steps || 20); |
| } |
| }) |
| .catch(function(err) { |
| removeTypingIndicator(typingEl); |
| appendMessage('error', 'Failed to send message: ' + err.message); |
| }) |
| .finally(function() { |
| isSending = false; |
| inputField.disabled = false; |
| if (sendBtn) sendBtn.disabled = false; |
| if (finishBtn) finishBtn.disabled = false; |
| inputField.focus(); |
| }); |
| } |
|
|
| |
| |
| |
| function agentChatFinish() { |
| if (isSending) return; |
|
|
| |
| var messages = messagesContainer.querySelectorAll('.agent-chat-message'); |
| if (messages.length === 0) { |
| if (!confirm('No messages have been sent. Are you sure you want to finish?')) { |
| return; |
| } |
| } |
|
|
| isSending = true; |
| if (sendBtn) sendBtn.disabled = true; |
| if (finishBtn) finishBtn.disabled = true; |
| inputField.disabled = true; |
|
|
| fetch('/agent_chat/finish', { |
| method: 'POST', |
| credentials: 'same-origin', |
| headers: { 'Content-Type': 'application/json' } |
| }) |
| .then(function(resp) { return resp.json(); }) |
| .then(function(data) { |
| if (data.error) { |
| appendMessage('error', data.error); |
| isSending = false; |
| if (sendBtn) sendBtn.disabled = false; |
| if (finishBtn) finishBtn.disabled = false; |
| inputField.disabled = false; |
| } else { |
| |
| window.location.reload(); |
| } |
| }) |
| .catch(function(err) { |
| appendMessage('error', 'Failed to finish: ' + err.message); |
| isSending = false; |
| if (sendBtn) sendBtn.disabled = false; |
| if (finishBtn) finishBtn.disabled = false; |
| inputField.disabled = false; |
| }); |
| } |
|
|
| |
| |
| |
| function appendMessage(role, content) { |
| var msgDiv = document.createElement('div'); |
| msgDiv.className = 'agent-chat-message ' + role; |
|
|
| var senderDiv = document.createElement('div'); |
| senderDiv.className = 'agent-chat-sender'; |
| senderDiv.textContent = role === 'user' ? 'You' : role === 'agent' ? 'Agent' : ''; |
|
|
| var bubbleDiv = document.createElement('div'); |
| bubbleDiv.className = 'agent-chat-bubble'; |
| bubbleDiv.textContent = content; |
|
|
| if (role !== 'error') { |
| msgDiv.appendChild(senderDiv); |
| } |
| msgDiv.appendChild(bubbleDiv); |
| messagesContainer.appendChild(msgDiv); |
|
|
| |
| messagesContainer.scrollTop = messagesContainer.scrollHeight; |
| } |
|
|
| |
| |
| |
| function restoreMessages(messages) { |
| |
| var placeholder = messagesContainer.querySelector('.agent-chat-placeholder'); |
| if (placeholder) placeholder.remove(); |
|
|
| for (var i = 0; i < messages.length; i++) { |
| var msg = messages[i]; |
| appendMessage(msg.role, msg.content); |
| } |
| } |
|
|
| |
| |
| |
| function showTypingIndicator() { |
| var el = document.createElement('div'); |
| el.className = 'agent-chat-typing'; |
| el.innerHTML = '<div class="dot"></div><div class="dot"></div><div class="dot"></div>'; |
| messagesContainer.appendChild(el); |
| messagesContainer.scrollTop = messagesContainer.scrollHeight; |
| return el; |
| } |
|
|
| |
| |
| |
| function removeTypingIndicator(el) { |
| if (el && el.parentNode) { |
| el.parentNode.removeChild(el); |
| } |
| } |
|
|
| |
| |
| |
| function updateStepCounter(current, max) { |
| if (stepCounter) { |
| stepCounter.textContent = 'Step ' + current + ' / ' + max; |
| } |
| } |
|
|
| |
| window.agentChatSend = agentChatSend; |
| window.agentChatFinish = agentChatFinish; |
| window.agentChatInit = agentChatInit; |
|
|
| |
| if (document.readyState === 'loading') { |
| document.addEventListener('DOMContentLoaded', agentChatInit); |
| } else { |
| agentChatInit(); |
| } |
|
|
| })(); |
|
|