> For the complete documentation index, see [llms.txt](https://book.microcrm.online/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.microcrm.online/changelog/1.2.0.md).

# 1.2.0

## Крупное обновление платформы:&#x20;

* чат-виджет для сайтов
* промокоды
* магазин AI-токенов
* 6 новых узлов конструктора (распознавание и синтез речи, задержка, генерация изображений, запрос данных, возврат клиента)
* веб-поиск у ИИ-агента
* подписанные ссылки и полная изоляция файлового хранилища
* защита от перегрузок и флуда
* публичные шаринг-ссылки с TTL
* ИИ-агенты платформы понимают токены и черновики
* undo/redo в редакторе сценариев
* десятки улучшений UX и безопасности.

***

## Добавлено

***

### **1. Чат-виджет для сайта**

Новый канал связи — встраиваемый чат-виджет для сайтов клиентов (аналог JivoSite), настраивается в разделе **Интеграции**.

* Подключается одним `<script>`, работает через WebSocket — сообщения оператора приходят мгновенно без опроса
* Поддерживает сценарии бота с инлайн-кнопками, обмен файлами и фото, смайлы, markdown в ответах
* **Кнопки быстрого старта** — до 5 кнопок на приветственном экране с привязкой к отдельным сценариям через триггер **«Виджет: Callback кнопка»**
* **Prechat-форма** идентификации посетителя (имя, email, телефон)
* **Узел «Запросить данные»** — инлайн-форма с полями (текст, email, телефон, число, дата, выбор из списка) с маской и валидацией; заменяет поле ввода, а не показывается как сообщение в истории
* **Мобильная адаптация** — на экранах уже 640px виджет открывается в полный экран; inline-кнопки переносятся; iOS Safari больше не зумит инпуты
* **Бейдж непрочитанных** на баббле, если оператор написал пока вы были вне сайта
* **Бейдж «Бот» / «Оператор»** над каждым сообщением — видно, кто пишет
* **Передача содержимого страницы** в ИИ-агента через переменную `{{context.page_body}}` — можно отвечать на вопросы по тексту страницы, где сейчас клиент
* **URL страницы** клиента в контексте сценария через `{{context.page_url}}` — обновляется при каждом сообщении
* **Пауза бота** при ответе оператора на 5 минут — после паузы сценарий стартует с чистого состояния
* **Тайм-аут сессии** 3 часа — после паузы клиент видит приветствие с кнопками быстрого старта
* **Защита от переполнения хранилища** — если у компании закончилось место, скрепка автоматически скрывается
* Разрешённые типы файлов: изображения (JPEG, PNG, GIF, WebP) и PDF — опасные типы отклоняются на сервере
* Виджет учитывается как отдельный источник клиентов в статистике

***

### **2. Промокоды для активации платных тарифов**

Система промокодов — администратор платформы может раздавать бесплатный доступ к платным тарифам на фиксированный срок.

**Для пользователя** (Настройки → Подписка):

* Кнопка **«Ввести промокод»** рядом со «Сменить тариф»
* По успешной активации вы мгновенно переходите на указанный тариф — без списания с баланса
* Во время промо карточка баланса показывает **«Промо до DD.MM.YYYY»** и подпись «После — даунгрейд, без списания», чтобы не было страха неожиданного автосписания
* По окончании срока система сама возвращает прежний тариф, токены не обнуляются — переносятся с кэпом по лимиту нового тарифа

**Для администратора** (Админка → Управление тарифами → вкладка «Промокоды»):

* Создание кода (только латиница, цифры, дефис и подчёркивание)
* Привязка к любому активному платному тарифу (Pro, Business)
* Срок промо в днях, дата окончания, максимальное число использований
* Ограничение на список пользователей через мультиселект с поиском по email и названию компании — или публичный код
* Статистика активаций: сколько раз применили, в скольких компаниях, когда последний раз
* Включение / выключение / удаление

**Проверки:**

* Нельзя применить промокод на тариф **ниже** текущего
* Нельзя применить промокод на **тот же** тариф — продлевать через промо не получится
* Параллельные промокоды не активируются — пока идёт один, второй отклоняется
* Промо на Business поверх админского `custom_token_limit` корректно перебивает override на время промо и восстанавливает его после
* Защита от перебора: 10 неверных попыток в час — блокировка на 60 минут

***

### **3. Магазин дополнительных AI-токенов**

В карточке **«AI Токены»** появилась кнопка **«Пополнить токены»** с 4 пакетами: 100K за 150 ₽, 500K за 600 ₽ (−20%), 1M за 1000 ₽ (−33%), 5M за 4000 ₽ (−47%). Оплата с баланса компании; если средств не хватает — кнопка превращается в «Пополнить баланс на N ₽» и ведёт в обычный топ-ап.

Купленные токены — **отдельный кошелёк**: не сгорают в конце месяца, переносятся между месяцами. Расход идёт в правильном порядке: сначала тратится тарифный лимит, и только когда он исчерпан — купленные. При остатке ниже 10% карточка подсвечивается красным с предупреждением «рекомендуем пополнить». Если и тарифные, и купленные закончились — AI-запросы блокируются с понятным сообщением.

В **Админка → Управление тарифами → Пакеты AI-токенов** можно создавать, редактировать, включать/выключать и удалять пакеты — у каждого настраивается название, количество токенов, цена, процент скидки, порядок сортировки и видимость. Изменения применяются мгновенно.

***

### **4. Новые узлы конструктора**

**Текст в речь** (иконка громкоговорителя, изумрудная). Озвучивает текст голосом через Gemini TTS:

* 30 голосов с русско-английскими описаниями характера (Уверенный, Бодрый, Информативный, Лёгкий и т.д.)
* Одноголосая озвучка или диалог двух спикеров с указанием их имён
* Два режима: **Авто** (ИИ-режиссёр сам расставляет интонации) и **Ручной** (вы сами добавляете теги)
* Каталог аудио-тегов прямо в редакторе: эмоции (`[excited]`, `[sad]`...), манера речи (`[whispers]`, `[sarcastic]`...), звуковые эффекты (`[laughs]`, `[sighs]`...)
* Доставка как настоящее **голосовое** в Telegram (`sendVoice`), как audio-attachment в MAX, как audio-сообщение в виджете
* Лимит 30 000 символов ввода, максимум 2 спикера
* Индикатор «записывает голосовое» в чате во время генерации

**Речь в текст** (иконка микрофона). Принимает URL аудио и возвращает распознанный текст в переменную сценария. По умолчанию автоматически берёт аудио из входящего сообщения — работает с голосовыми Telegram, MAX, Avito, виджета. Автоопределение языка или принудительный код. Результат сохраняется в `{{transcript_text}}`, `{{transcript_text_lang}}`, `{{transcript_text_confidence}}`.

**ИИ-агент с распознаванием голоса** — галочка «Расшифровывать голосовые» в настройках узла ИИ-агент. При входящем аудио от клиента агент автоматически получает текстовую расшифровку и может ответить как на обычное сообщение. Транскрипт доступен в переменных `{{_user_audio_transcript}}`.

**Nano Banana** — генерация и редактирование изображений через Gemini / OpenAI-совместимые API. Поддерживает вход из переменных (фото от клиента) и статических изображений из хранилища компании.

**Задержка** — после полной переработки узел наконец реально работает. Поддерживает интервалы от 1 секунды до суток и больше, надёжно переживает перезапуски сервера. Новая опция **«Поведение при повторном входе»**: «Сбрасывать таймер» или **«Игнорировать (fire-once)»** — для кейсов «напомнить через 24 часа после первого контакта», когда вторичные заходы не должны обнулять обратный отсчёт.

**Возврат клиента** — новый триггер для автоматической реактивации лидов. Сам инициирует общение с клиентами, которые уже побывали в сценарии и замолчали: брошенная корзина, реактивация, дожим лида. Настройки: база отсчёта (последнее сообщение клиента или активность сессии), задержка N минут/часов/дней, частота (1 раз / после каждого прохождения / раз в N времени), поведение при активной сессии (не трогать или заменить на новую ветку). Жёсткие лимиты от спама: минимум 5 минут на задержку, 1 час между повторами, максимум 100 срабатываний на клиента, не более 50 за один прогон планировщика — чтобы не попасть под рейт-лимит Telegram / MAX / Avito.

**Запросить данные** — инлайн-форма для виджета (см. пункт 1 про виджет).

***

### **5. ИИ-агент с веб-поиском и доступом к содержимому страницы**

В узле **«ИИ-агент»** появилась опция **«Разрешить поиск в интернете»** — модель Gemini может искать актуальную информацию в Google, читать страницы и проверять факты перед ответом. Полезно для анализа URL клиента, свежих новостей, цен, справок. Работает одновременно с continueTriggers — модель сама решает, искать или перейти по сценарию.

Плюс **сервер-сайд фетч страницы** для кейса «документный ассистент»: если в system prompt есть `{{context.page_url}}` и включён веб-поиск, handler автоматически качает HTML, очищает и докладывает в промпт. Модель видит реальный текст документа и отвечает по нему.

Источники, которые модель реально использовала, сохраняются в логах узла: список URL с заголовками и поисковые запросы, улетевшие в Google — полезно для отладки.

В логах сценария теперь сохраняется:

* `grounding_sources` — список URL с заголовками, которые модель использовала
* `grounding_queries` — поисковые запросы, которые улетели в Google

Повышенное списание токенов: +5000 токенов за каждый grounded-запрос (отражает фиксированную цену Google Search у Google). Настраивается в админке → «Биллинг ИИ».

***

### **6. Undo/Redo в редакторе сценариев**

Добавили классическое отмена/возврат действий на холсте, как в текстовых редакторах:

* **`Ctrl+Z`** (или `Cmd+Z` на Mac) — откатить последнее действие: перемещение узла, удаление узла/связи, добавление узла/связи, редактирование свойств
* **`Ctrl+Shift+Z`** / **`Ctrl+Y`** — вернуть отменённое действие

Хранится до 50 последних состояний в рамках сессии редактирования. Работает на любой раскладке клавиатуры (русской, английской) — распознаёт физическую клавишу, а не символ. Горячие клавиши показаны в подсказке внизу холста.

***

### **7. Новые возможности AI-ассистента платформы**

AI-ассистент в шапке теперь видит существенно больше контекста:

* **Разделение черновик / опубликованная версия** сценария — на вопрос «что я изменил в боте X» ассистент покажет отдельно опубликованную версию и draft
* **Цели сценария** — отвечает на запросы «какие цели у бота Y», «что считается успехом»
* **Честная картина по токенам** — на вопрос «сколько осталось токенов» показывает использование / лимит / остаток, с разбивкой по планированию, генерации, агентам, RAG и задачам. Раньше отвечал «весь лимит в вашем распоряжении» без счётчика использованных
* **Понимание типовых фраз** — «последний сценарий», «включи бота X», «какие задачи на сегодня»

ИИ-ассистент конструктора обновлён до версии v11 — знает про все новые узлы (TTS, STT, Возврат клиента, Задержка с режимом ignore, форматирование markdown) и корректно генерирует сценарии с первого раза.

Кнопка **«Очистить историю»** действительно удаляет сессию, а не только прячет сообщения в UI.

***

### **8. Публичные шаринг-ссылки с TTL**

В меню каждого файла хранилища появился пункт **«Поделиться (TTL-ссылка)»** с выбором срока действия: 1 час / 6 часов / 1 сутки / 7 дней / 30 дней / бессрочно.

* Мгновенный **отзыв** по клику — получатель увидит страницу «Ссылка недоступна»
* В таблице файлов бейдж **«Расшарен»** с подсказкой о сроке и количестве скачиваний
* Фото, видео, аудио, PDF — открываются прямо в браузере
* HTML, SVG, XML — принудительно скачиваются
* Имя файла в диалоге «Сохранить как» — чистое, без технических префиксов

Старое «Копировать URL» теперь выдаёт подписанную ссылку на 1 час; для долговременного шаринга — «Поделиться».

***

**9. Память ИИ-агентов**

В настройках узлов **ИИ-агент** и **RAG-диалог** появился чекбокс **«Память о клиенте»** с опциональной настраиваемой инструкцией. Агент может запоминать важные факты о клиентах (предпочтения, бюджет, историю обращений) между разговорами. Клиент определяется автоматически из текущего чата. Записи памяти сохраняются в базу знаний (коллекция «Память ИИ-агентов»), привязываются к клиентам и видны:

* В разделе **База знаний** с бейджами привязанных клиентов
* В карточке клиента на вкладке **«Память ИИ»**

***

**10. Защита от спама и флуда**

Введены лимиты на все входные точки:

* **Виджет** — 5 сообщений за 10 сек / 20 за минуту на посетителя
* **Telegram / MAX / Avito webhook** — 30 сообщений в минуту на внешнего пользователя (один спамер не блокирует остальных клиентов компании)
* **Отправка сообщений оператором** — 15/60 на пару `оператор + чат`
* При превышении виджет показывает клиенту «⏳ Вы пишете слишком быстро…» вместо падения
* Квота считается **per-вкладку** — открыли конструктор в нескольких вкладках, каждая получает свой бюджет

***

**11. Изоляция файлового хранилища по компаниям**

Критичный апдейт безопасности:

* **Кнопки «Скачать»** и превью используют короткоживущие подписанные ссылки — никаких постоянных публичных URL
* **Логотипы виджетов** подписываются индивидуально под каждого гостя чата
* Двойная проверка доступа для виджета

***

## Улучшено

***

### **Сайдбар**

* **Новый логотип** MicroCRM в шапке вместо иконки-молнии на градиенте. Название без градиента — обычным текстом, читается в любой теме
* **Контекстное меню на логотипе** — правый клик открывает меню: открыть сайт, скопировать логотип в буфер (PNG), скачать логотип, скачать favicon
* **ФИО и тариф вместо email** — в футере сайдбара ФИО из профиля и бейдж тарифа (Free / Pro / Business). При наведении — карточка со статистикой (AI токены, клиенты, сотрудники, сценарии, чаты, шаблоны, проекты) с прогресс-барами: жёлтым при приближении к лимиту, красным при превышении
* **Версия продукта** в правом нижнем углу — клик открывает <https://book.microcrm.online/changelog> в новой вкладке
* **Колокольчик уведомлений** переехал к имени пользователя в футер — в шапке стало свободнее, подсказки о непрочитанных рядом с личным блоком

### **Чаты**

* **Разделители дат** в чате — «Сегодня», «Вчера», «5 апреля» с учётом таймзоны
* **Визуальное выделение бот-сообщений** — фиолетовый фон, рамка и иконка бота
* **Вкладки «Сообщения» / «Бот»** — вкладка «Сообщения» показывает только переписку с оператором, диалог с ботом — на вкладке «Бот». Входящие сообщения во время бот-сессии больше не падают в «Сообщения»
* **Непрочитанные наверху списка** — чаты с непрочитанными всегда в начале списка, внутри каждой группы по времени последнего сообщения
* **Бейдж непрочитанных в сайдбаре** — красная цифра рядом с пунктом «Чаты» в реальном времени
* **Сохранение бот-диалога в CRM** — вкладка «Бот» показывает и вопросы клиента, и ответы бота
* **Форма `request_input`** от узла «Запросить данные» рендерится как карточка с полями и иконками
* **Инлайн-кнопки виджета** отмечаются индикатором «Нажата кнопка» — видно что клиент нажал, а не написал
* **Кросс-канальная передача медиа** между Telegram и MAX сохраняется корректно, включая ссылки в тексте
* **Видео любого размера** пересылается между Telegram и MAX — раньше файлы больше 20 МБ не передавались

### **Экран входа**

* **Переключатель темы** в правом верхнем углу — можно адаптировать экран входа до логина
* **Новые фоновые видео** (светлая / тёмная тема) — раздаются с нашего прокси, без зависимости от стороннего CDN

### **Переключатель компаний**

* **Сортировка по алфавиту** — сначала активные русские, потом активные английские, затем так же неактивные
* **Выравнивание по левому краю** — название в шапке больше не «прыгает» по центру
* **Автовыбор самой старой компании-владельца** при входе — больше не нужно переключаться после логина

### **Редактор сценариев**

* **AI-кнопка на холсте** переименована с «ИИ помощник» на короткое **«AI»**, автоматически уезжает при открытой панели свойств узла, скрывается когда уже открыт AI-ассистент
* **Анимированная подсветка AI-кнопки** — вращающаяся conic-gradient рамка, пульсирующее свечение, shimmer на иконке.
* **Хендлы (точки соединения)** обновлены: 22px, бордер в цвете узла, фон узла — визуально аккуратнее
* **Плавное перемещение узлов** — `snapToGrid` выключен
* **Тултипы переменных** в текстах сообщений — наведение на `{{...}}` показывает, к чему относится переменная (имя клиента, текст сообщения и т.д.)
* **Клик по переменной** ставит курсор для редактирования — раньше тултип перехватывал клик
* **Логи сценария** — длинные ошибки не растягивают панель, есть скролл внутри блока. В свёрнутой карточке превью ошибки до 70 символов с многоточием. Короткий ID виджет-посетителя (первые 6 символов) вместо полного UUID
* **Статичные иконки lucide** вместо эмодзи в типах триггеров — единообразно с остальным UI

### **Сообщения и форматирование**

* **Markdown-редактор для всех сообщений** во всех узлах-отправителях (Отправить сообщение, Уведомления, Avito, каналы Telegram и MAX, Выход из бота) — жирный, курсив, зачёркнутый, моноширинный, ссылки, маркированные и нумерованные списки, предпросмотр. Переменные `{{context.xxx}}` подсвечены цветом — сразу видно подстановки
* **Автоконвертация формата** под получателя: Telegram и MAX — HTML, Avito — plain text, виджет — markdown напрямую
* **Markdown в ответах бота виджета** — жирный, курсив, код, зачёркнутый, ссылки, заголовки, списки, блоки кода. Безопасно, без XSS

### **AI-провайдеры**

* **Редизайн карточек** в админке в стиле «Подписки»: градиент, скруглённые углы, крупное название модели, pulse-индикатор, стеклянная плашка статистики
* **Три назначения на карточке**: Текст / Картинки / Звук — без открытия редактора
* **Актуальный список моделей Gemini** — убраны устаревшие 1.5, добавлены 2.5/2.0/3.x включая TTS
* **Выбор модели из списка** у всех провайдеров + возможность ввести свою
* **Переключатели возможностей** (текст / изображения / звук) отдельными тогглами вместо одного чекбокса
* **Тест подключения** работает для TTS-моделей Gemini с правильным форматом запроса

### **Узел ТТС**

* Компактное отображение «куда сохранится аудио» — одна строка с иконкой дискеты
* Чистый UI — без лишних пояснений и технических подписей

### **Прочее**

* **Стилизация «Настройки клиентов»** в стиле «Подписки»: gradient-header, rounded-2xl карточки, иконки типов переменных
* **Оффканвас «Добавить клиента»** — hero-header с gradient, стилизованные бейджи TG / MAX
* **Раздел Интеграции** в настройках — две колонки на десктопе, одна на мобилке
* **Все системные AI-вызовы** (cron, webhook, задачи, каналы, RAG) идут через прокси — IP-лимиты внешних API больше не упираются в один адрес

***

## Исправлено

***

* **Дубликаты клиентов** при одновременных сообщениях — если один посетитель писал несколько сообщений почти одновременно, создавалось 2-5 клиентов. Теперь параллельные запросы физически не могут создать дубль
* **Сохранение ссылок** при кросспостинге Telegram → MAX — ранее markdown-ссылки теряли кликабельность
* **Промо-тариф не показывает автосписание** — вместо «Веха списания / 9990 ₽» во время промо видно «Промо до / без списания»
* **UI после активации промокода обновляется мгновенно** — без перезагрузки страницы
* **Двойной учёт токенов** в некоторых кейсах исчерпания тарифа — расход корректно распределяется между тарифом и купленным кошельком
* **Триггер «Возврат клиента»** — исправлена частота «после каждого нового прохождения сценария»
* **Включение тёмной темы на экране входа** — переключатель теперь доступен до логина
* **Ошибка 409 при создании виджета** для второй компании — владелец нескольких компаний наконец может создать виджет для каждой
* **WebSocket виджета** — исправлена корневая причина, из-за которой сообщения оператора не доходили до клиента в виджете
* **Классификация Сообщения vs Бот** в виджете — если модель вернула пустой ответ, но сессия активна, сообщение всё равно идёт на вкладку «Бот»
* **Порядок сообщений в Telegram-чате** — клиентское `/start` больше не отображается после ответа бота
* **Ctrl+Z на русской раскладке** — работает на любой раскладке (распознаём физическую клавишу)
* **Ctrl+Z реально откатывает** — раньше snapshot находился, но визуально ничего не менялось из-за ошибки в стеке истории
* **Кнопки на узлах после Ctrl+Z** — больше не «мёртвые», обработчики re-attach'ятся
* **Телеграм-индикатор** при обработке голосовых — теперь «печатает», а раньше «записывает голосовое»-
* **ИИ-ассистент задач путал вопросы с командами** — «какие задачи просрочены?» больше не обрабатывается как попытка создать задачу
* **Тултип тарифа в сайдбаре** больше не прячется за виджетами дашборда
* **AI-ассистент платформы** не отвечает пустым сообщением — пользователь получает понятный текст «Не получил содержательного ответа, попробуйте переформулировать»
* **ИИ-ассистент конструктора** правит черновик сценария, а не опубликованную рабочую версию
* **Кнопка «Применить план»** не затирает существующий сценарий — при наличии узлов идёт в режим редактирования, при пустом — в режим создания
* **Кнопка «Применить изменения»** под сообщением AI больше не висит активной после применения
* **Image-only AI-ключи** больше не показываются в текстовых ИИ-узлах — они видны только в узле Nano Banana для генерации изображений
* **Email-подтверждение при регистрации** — раньше при регистрации любой фейковый email автоподтверждался. Теперь подтверждение только после клика по ссылке в письме
* **Диалог «Поделиться файлом»** — кнопка копирования реально кладёт ссылку в буфер обмена; ссылка всегда HTTPS; работает в HTTP-контексте через fallback
* **Сообщения клиента во время бот-сессии** не увеличивают счётчик непрочитанных
* **Настройки узлов «MAX Канал» и «Триггер поста в канале»** не сбрасываются при сохранении сценария
* **Токены каналов** корректно находятся в кросс-платформенных сценариях (TG-бот управляет MAX-каналом и наоборот)
* **Защита от зацикливания кросспостинга** — бот не подхватывает свои же сообщения

***

## Безопасность

***

* **ACL-проверки на финансовых RPC** — нельзя дёрнуть с чужим company\_id и сжечь токены, купить пакет за счёт чужого баланса, прочитать чужие балансы или статистику
* **Изоляция файлового хранилища** по компаниям — все приватные bucket'ы (чат-медиа, озвучка, пользовательское хранилище, документы) закрыты на уровне БД
* **Подписанные ссылки с TTL** вместо постоянных публичных URL — для скачивания, превью, шаринга, виджет-чатов
* **SSRF-защита** в сервер-сайд фетче страниц из виджета — блокируются loopback, приватные сети, link-local (AWS metadata), IPv6 ULA
* **Stored-XSS защита** для расшаренных файлов — HTML/SVG/XML/JS принудительно скачиваются, а не рендерятся в браузере под доменом CRM
* **Защита от перебора промокодов**
* **Whitelist по расширению файла** при отдаче через shared-ссылку — даже если заливать `picture.jpg` с HTML-байтами внутри, он отдастся как image/jpeg, HTML не выполнится
* **Rate-limiting** на все входные точки с настраиваемыми лимитами

***


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://book.microcrm.online/changelog/1.2.0.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
