diff --git a/integrations/paradiz-web/dist/paradiz-web-chat-1.0.6.zip b/integrations/paradiz-web/dist/paradiz-web-chat-1.0.6.zip new file mode 100644 index 0000000..711da59 Binary files /dev/null and b/integrations/paradiz-web/dist/paradiz-web-chat-1.0.6.zip differ diff --git a/integrations/paradiz-web/wordpress-plugin/paradiz-web-chat/chat.js b/integrations/paradiz-web/wordpress-plugin/paradiz-web-chat/chat.js index d980b39..fccc358 100644 --- a/integrations/paradiz-web/wordpress-plugin/paradiz-web-chat/chat.js +++ b/integrations/paradiz-web/wordpress-plugin/paradiz-web-chat/chat.js @@ -9,14 +9,51 @@ if(!fab || !modal || !closeBtn || !sendBtn || !input || !log) return; + const STORAGE_KEY = 'paradiz_web_chat_history_v1'; + const MAX_MESSAGES = 80; + + const saveHistory = () => { + try { + const items = Array.from(log.querySelectorAll('.paradiz-msg')).map((el) => ({ + text: el.textContent || '', + type: el.classList.contains('paradiz-user') ? 'user' : 'bot' + })); + const trimmed = items.slice(-MAX_MESSAGES); + localStorage.setItem(STORAGE_KEY, JSON.stringify(trimmed)); + } catch(_) {} + }; + + const restoreHistory = () => { + try { + const raw = localStorage.getItem(STORAGE_KEY); + if(!raw) return false; + const arr = JSON.parse(raw); + if(!Array.isArray(arr) || !arr.length) return false; + log.innerHTML = ''; + for(const item of arr){ + const p = document.createElement('p'); + p.className = 'paradiz-msg ' + (item.type === 'user' ? 'paradiz-user' : 'paradiz-bot'); + p.textContent = String(item.text || ''); + log.appendChild(p); + } + log.scrollTop = log.scrollHeight; + return true; + } catch(_) { + return false; + } + }; + const addMsg = (text, type) => { const p = document.createElement('p'); p.className = 'paradiz-msg ' + (type === 'user' ? 'paradiz-user' : 'paradiz-bot'); p.textContent = text; log.appendChild(p); log.scrollTop = log.scrollHeight; + saveHistory(); }; + restoreHistory(); + fab.addEventListener('click', () => { modal.style.display = (modal.style.display === 'block') ? 'none' : 'block'; if(modal.style.display === 'block') input.focus(); @@ -35,7 +72,11 @@ addMsg('Вы: ' + q, 'user'); input.value = ''; - addMsg('Печатают…', 'bot'); + const typingEl = document.createElement('p'); + typingEl.className = 'paradiz-msg paradiz-bot'; + typingEl.textContent = 'Печатают…'; + log.appendChild(typingEl); + log.scrollTop = log.scrollHeight; try { const body = new URLSearchParams(); @@ -51,12 +92,14 @@ }); const data = await resp.json(); + if(typingEl && typingEl.parentNode) typingEl.parentNode.removeChild(typingEl); if(data && data.success){ addMsg((data.data && data.data.answer) ? data.data.answer : 'Нет ответа', 'bot'); } else { addMsg((data && data.data && data.data.message) ? data.data.message : 'Ошибка', 'bot'); } } catch (e) { + if(typingEl && typingEl.parentNode) typingEl.parentNode.removeChild(typingEl); addMsg('Сетевая ошибка: ' + (e && e.message ? e.message : 'unknown'), 'bot'); } }; diff --git a/integrations/paradiz-web/wordpress-plugin/paradiz-web-chat/paradiz-web-chat.php b/integrations/paradiz-web/wordpress-plugin/paradiz-web-chat/paradiz-web-chat.php index ecc51ae..7a5136a 100644 --- a/integrations/paradiz-web/wordpress-plugin/paradiz-web-chat/paradiz-web-chat.php +++ b/integrations/paradiz-web/wordpress-plugin/paradiz-web-chat/paradiz-web-chat.php @@ -2,7 +2,7 @@ /** * Plugin Name: Paradiz Web Chat * Description: Чат-плагин для сайта vparadize.ru, который отправляет вопросы в изолированного агента OpenClaw paradizweb. - * Version: 1.0.5 + * Version: 1.0.6 * Author: EVA */ @@ -57,7 +57,7 @@ class ParadizWebChat { } public function enqueue_assets() { - wp_register_script('paradiz-web-chat', plugins_url('chat.js', __FILE__), [], '1.0.2', true); + wp_register_script('paradiz-web-chat', plugins_url('chat.js', __FILE__), [], '1.0.6', true); wp_localize_script('paradiz-web-chat', 'ParadizWebChatCfg', [ 'ajaxUrl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('paradiz_web_chat_nonce') diff --git a/memory/текущий-день.md b/memory/текущий-день.md index 5995b79..6b498b8 100644 --- a/memory/текущий-день.md +++ b/memory/текущий-день.md @@ -30,6 +30,7 @@ - 21:36 МСК — добавлено новое правило для `paradiz`: в начале диалога обязательно сообщать, что отвечает ИИ-агент по бронированию; при запросе живого менеджера — уточнять контакт и канал связи, отправлять уведомление Виталию в Telegram. - 21:40 МСК — обновлён WordPress-плагин `paradiz-web-chat`: виджет чата теперь рендерится глобально через `wp_footer` для всех посетителей (включая неавторизованных), с защитой от дублей. - 21:50 МСК — усилены боевые контуры `paradizweb` и `paradizvk`: добавлен обязательный дисклеймер «ИИ-агент» в ответах; для запросов на живого менеджера включён сбор контакта и Telegram-уведомление Виталию. +- 21:57 МСК — в web-чате плагина добавлено клиентское сохранение истории диалога (localStorage), чтобы переписка не сбрасывалась при перезагрузке страницы; собран архив `paradiz-web-chat-1.0.6.zip`. - 08:49 МСК — повторная оптимизация контекста: профиль подтверждён и точечно уточнён (календарная синхронизация Google ↔ Nextcloud), лишний шум не добавлялся, секреты не включались. - 11:49 МСК — выполнена плановая оптимизация: `memory/ops-profile.md` обновлён по устойчивым настройкам (добавлен бухконтур по умолчанию: УСН 6% без сотрудников), шум из оперативного контекста убран, секреты не включались. - 14:49 МСК — повторная оптимизация: профиль очищен от шума и уточнён стабильным правилом по общим чатам (отвечать только при прямом обращении), секреты не добавлялись.