// UI-вспомогательные функции function showStatus(message, kind) { const el = document.getElementById('status'); el.style.display = 'block'; el.className = 'status ' + (kind || ''); el.textContent = message; } function clearStatus() { const el = document.getElementById('status'); el.style.display = 'none'; el.className = 'status'; el.textContent = ''; } function setText(id, value) { document.getElementById(id).textContent = String(value); } function h(v) { return String(v == null ? '' : v) .replaceAll('&', '&') .replaceAll('<', '<') .replaceAll('>', '>') .replaceAll('"', '"') .replaceAll("'", '''); } function formatTimestamp(ts) { if (!ts) return '—'; var d = new Date(ts); if (isNaN(d.getTime())) return String(ts); return d.toLocaleString('ru-RU', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); } function timestampCell(ts) { var text = formatTimestamp(ts); return '' + h(text) + ''; } // AI Ассистент var _assistantOpen = true; function toggleAssistant() { _assistantOpen = !_assistantOpen; document.getElementById('assistant-body').style.display = _assistantOpen ? 'flex' : 'none'; document.getElementById('assistant-toggle-icon').textContent = _assistantOpen ? '▲' : '▼'; } async function askAssistant() { var inp = document.getElementById('assistant-input'); var msgs = document.getElementById('assistant-messages'); var q = inp.value.trim(); if (!q) return; inp.value = ''; msgs.textContent += '\n\n👤 ' + q + '\n⏳ ...'; msgs.scrollTop = msgs.scrollHeight; try { var r = await fetch('/console/api/ai/ask', { method: 'POST', headers: { 'Content-Type': 'application/json', ...authHeaders() }, body: JSON.stringify({ mode: 'chat', question: q }) }); var d = await r.json(); msgs.textContent = msgs.textContent.replace('⏳ ...', '🤖 ' + (d.answer || d.error || 'Нет ответа')); } catch (e) { msgs.textContent = msgs.textContent.replace('⏳ ...', '❌ Ошибка: ' + e.message); } msgs.scrollTop = msgs.scrollHeight; }