Files
angel 4c3026a80f
Tests / test (push) Has been cancelled
Tests / test-max-bot (push) Has been cancelled
v1.8.2: AGENTS.md, consent revocation, delete bot users, dialogues fix, intent improvements, CI for max_bot
2026-06-02 18:22:45 +03:00

96 lines
7.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog — AegisOne MAX Bot
## 1.8.2 (02.06.2026)
### Новые функции
- **AGENTS.md:** правила проекта для AI-агентов
- **Отзыв согласия:** handle_revoke_consent(), паттерн «отозвать согласие» в handle_message
- **Удаление бот-пользователей:** DELETE /api/bot/users/{user_id} (каскад: user + conversations + messages + logs)
- **consent_revoked_date:** поле в BotUser для фиксации даты отзыва согласия
### Исправления
- **Диалоги:** одна переписка = одна карточка (убрано создание new conv при completed/escalated)
- **Analyze intent:** агрессивное определение ticket по ключевым словам услуг, улучшен промпт
- **Clarify intent:** ограничение 1 раз за диалог (prev_intent == unknown), маркерные слова пропускают уточнение
- **History context:** фильтр по времени (10 мин) вместо лимита 10 сообщений
- **Быстрые правила:** ticket-паттерны и приветствие до NLP
- **Send message:** параметр conversation_id + сохранение исходящих сообщений в BotMessage
## 1.8.1 (01.06.2026)
### Новые функции
- **YandexGPT-only NLP:** удалены Groq/Gemini, YandexGPT единственный провайдер
- **Unknown questions:** BotUnknownQuestion, автогенерация KB-карточки при 3+ уникальных пользователях, UI
- **Callback dedup:** processed_callbacks set в main.py — пропуск дублей callback_id, очистка при 1000
- **Consent flow:** split-based word matching (_matches_any), refuse words до quick_intent, operator handler
- **DELETE conversations:** каскадное удаление (BotMessage + BotProcessingLog + BotConversation)
- **UTC+3:** moscow_now() в greeting.py и inquiry.py
- **Bot tickets:** contact_name, contact_phone, contact_email в BotTicket
- **Payload parsing:** message_created из body.message.body.text, message_callback из body.callback.payload + recipient.user_id
### Исправления
- **Plain text phones:** MAX Platform не рендерит markdown-ссылки — 📞 +7 (xxx) xxx-xx-xx
- **Webhook secret:** _verify_secret() возвращает True если заголовок пуст (optional)
- **Nginx:** добавлен /webhook proxy на HTTP порт 80
## 1.8.0 (01.06.2026)
### Новые функции
- **Consent keyboard:** consent_keyboard(), contact_keyboard(), return_to_consent_keyboard()
- **Escape hatch:** locked states проверяют analyze_intent — «question» → analyze_and_respond
- **Completed state:** completed/escalated → анализируем и создаём новый диалог
- **handle_greeting fix:** убран analyze_and_respond после приветствия, state=awaiting_input
- **Auto-detect sidebar:** parse_sidebar_menu() определяет пункты меню через API
### Исправления
- **handle_message:** refuse слова проверяются ДО analyze_intent в состояниях consent
- **operator_words:** «оператор» → contacts вместо analyze_intent
- **handle_manual_contact:** refuse words → consent_refused
- **clarify_intent:** temperature 0.1, пост-обработка удаление приветствий, anti-AI-signs
## 1.7.1 (29.05.2026)
### Новые функции
- **Тестовый прогон:** мок MAX API для test user_id (>=999999000) — сообщения не уходят в MAX
### Исправления
- **P1 (CRITICAL):** _add_column_if_not_exists — async def + await, миграции выполняются
- **P2 (CSS):** bot_consent, bot_tickets, bot_kb, bot_settings — var(--light-bg) → var(--bg-card), хардкод цвета → CSS-переменные
- **P3 (Event loop):** email_sender.send_ticket_escalation — обёрнут в run_in_executor
- **P4 (SQL injection):** _add_column_if_not_exists — валидация _validate_sql_name/type
- **C1 (CRITICAL):** BotConversation импортирован в main.py
- **C2 (VCF N-field):** regex исправлен, захватывает полную строку N:
- **C3 (Email typo):** contact.py — user.email вместо user.phone
- **C4 (None user):** inquiry.py — проверка user is None
- **C5 (Висячий тикет):** inquiry.py — flush + единый commit
- **C6 (Secrets):** docker-compose.yml — переменные через .env
- **H1 (Prompt injection):** yandex_gpt.py — instruction boundary, _sanitize_input
- **H2 (Дубль BotMessage):** contact.py — удалён дублирующий save
- **H3 (VCF phone regex):** расширен захват полного номера
- **H4 (Race condition):** greeting.py — try/except + rollback при IntegrityError
- **H5 (Silent error):** email_sender.py — logger.error добавлен
- **M1 (TOCTOU):** main.py — audit-log только при изменении статуса
- **M2 (Двухсессионный дизайн):** inquiry.py — единая транзакция
- **M3 (Stale state):** greeting.py — conv из текущей сессии
- **M4 (Double-load race):** settings_cache.py — asyncio.Lock
- **M5 (ORG regex):** захват полного ORG без обрезки по ;
- **M7 (bot_test.html):** тема наследуется через CSS-переменные + скрипт инициализации
- **bot_test.html:** исправлен ключ localStorage (theme → aegisone_service_theme), var(--bg-page) → var(--bg-body), добавлена стилизация скроллбара
- **L1 (Dead code):** _extract_name_from_vcf удалена
- **L2 (Импорты):** неиспользуемые Optional, json, config_reader удалены
- **L3 (.gitignore):** .opencode/, .env.example добавлены
## 1.7.0 (29.05.2026)
### Новые функции
- **Рефакторинг архитектуры:** плоская структура модулей (models.py, yandex_gpt.py, keyboards.py, email_sender.py, config_reader.py) вместо вложенных пакетов
- **VCF + User Model (Q2):**
- BotUser расширен: patronymic, email, organization, address, vcf_raw, contact_hash, phone_verified, email_verified
- VCF-парсер: FN, N, TEL, EMAIL, ORG, ADR — все поля сохраняются
- Upsert пользователя при повторном контакте (greeting.py)
- total_conversations инкремент, last_interaction обновление
- handle_contact_share сохраняет все VCF-поля (handoff.py)
- total_tickets инкремент в _finalize_ticket (inquiry.py)
- **NLP history context:** _get_user_history_context() — последние 10 сообщений + открытые заявки → YandexGPT
- **Broadcast с превью и таймером (Q1):** модалка подтверждения с таймером 10 секунд
- **CSS-переменные (Q3):** var(--white)→var(--bg-card), var(--text)→var(--text-primary)
- **bot_settings (Q4):** showNotification(), max_bot_id редактируемый
- **Webhook secret (Q5):** проброс X-Max-Bot-Api-Secret через прокси
- Маскировка sensitive API-ключей в /api/bot/settings
- dialog_cleared handler — сброс состояния диалога
- Миграции через _add_column_if_not_exists() — новые колонки BotUser
- Rate limit в broadcast: asyncio.sleep(0.5) после каждых 10
- Уточнение сообщения (contact.py) с учётом conv.intent
- Тесты: test_yandex_gpt.py, test_email_sender.py