96 lines
7.8 KiB
Markdown
96 lines
7.8 KiB
Markdown
# 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
|