${escapeHtml((source.text || "").slice(0, 360))}
const messages = document.getElementById("messages"); const form = document.getElementById("chatForm"); const input = document.getElementById("queryInput"); const sendBtn = document.getElementById("sendBtn"); const sourcesPanel = document.getElementById("sourcesPanel"); const sourcesBox = document.getElementById("sources"); const latency = document.getElementById("latency"); const sourceCount = document.getElementById("sourceCount"); function appendMessage(role, text) { const article = document.createElement("article"); article.className = `message ${role}`; const bubble = document.createElement("div"); bubble.className = "bubble"; bubble.textContent = text; article.appendChild(bubble); messages.appendChild(article); messages.scrollTop = messages.scrollHeight; return bubble; } function renderSources(data) { const sources = data.sources || []; latency.textContent = `Latency: ${Math.round(data.latency_ms || 0)} ms`; sourceCount.textContent = `Sources: ${sources.length}`; sourcesPanel.hidden = false; if (!sources.length) { sourcesBox.innerHTML = "
No source was returned for this answer.
"; return; } sourcesBox.innerHTML = sources.map((source, index) => { const page = source.page === undefined || source.page === null ? "" : ` · page ${Number(source.page) + 1}`; const score = source.score ? ` · score ${Number(source.score).toFixed(2)}` : ""; return `${escapeHtml((source.text || "").slice(0, 360))}