Публичный реестр изменений платформы «Бобер Боб». Каждая версия хранится в базе данных и доступна по собственной ссылке из интернета — без авторизации: заголовок, подзаголовок, описание, что сделано и какой результат это даёт.
Текущая версия — v1.14.1 (от 29.09.2026)
79
Версий в истории
v1.14.1
Текущая версия платформы
18.07.2026
Разработка начата
8.4.27
Версия PHP
О платформе
«Бобер Боб»
Автоматизация складского учёта, остатков и логистики импорта продовольствия: товары, склады, движения, Telegram-боты и ИИ-агенты в одной панели.
Разработка и сопровождение платформы силами внутренней команды.
Начато разработки
18.07.2026
Первая версия платформы — v0.1.0.
Технологии
Laravel + Filament
Laravel, MariaDB, Tailwind CSS. Подробности — в карточках стека ниже.
Стек платформы
PHP 8.4.27 · MYSQL (MariaDB)
ƛ
Фреймворк
Laravel 13.22.0 + Filament v5
⚙
PHP
8.4.27
🗄
База данных
MYSQL (MariaDB)
🖥
Сервер
VDS 185.66.68.122 · Ubuntu 22.04
🎨
Интерфейс
Tailwind CSS
📊
Excel
PhpSpreadsheet
💬
Уведомления
Telegram Bot API
🔐
Авторизация
Bcrypt + Spatie Permission
v1.14.1patchТекущаяот 29.09.2026
Задание 139. Кебаб-меню в Telegram-пользователях: все действия строки (Просмотр, Изменить, Удалить) в «⋮» и адаптивная таблица
Действия строки на странице «Telegram-пользователи» собраны в полноценное кебаб-меню «⋮» в конце каждой строки: Просмотр, Изменить и Удалить больше не показываются отдельными ссылками, а лежат в едином выпадающем меню. Таблица стала адаптивной с самого начала: на узких экранах скрыты второстепенные колонки — Username и Последнее сообщение появляются от md (768px), Активен — от sm (640px), Платформа и Сообщений — от lg (1024px); всегда видимы ID, Имя, Роль и Этап, поэтому горизонтальная прокрутка не возникает при ширине от планшета и выше. Версия платформы 1.14.0 → 1.14.1.
Кебаб-меню строки
Всё в «⋮» — Просмотр, Изменить и Удалить собраны в единое кебаб-меню в конце строки; инлайн-ссылок в строках больше нет
Правило методологии — на таблицах с большим числом колонок безопасные действия тоже уходят в кебаб-меню, чтобы не растягивать строку
Адаптивная таблица
Колонки по ширине экрана — Username и Последнее сообщение от md (768px), Активен от sm (640px), Платформа и Сообщений от lg (1024px)
Всегда видимы — ID, Имя, Роль и Этап; при широком окне не появляется горизонтальная прокрутка
Задание 138. Пользователи из Telegram-переписки: загрузка в Telegram-пользователей, назначение ролей и уведомление о новом пользователе
Система собирает пользователей из Telegram-переписки (n8n-telegram admin_dump.php) и заносит их в «Telegram-пользователи»: уникальный ключ — Telegram chat_id (user_id из дампа, для бизнес-сессий — приватный чат), из переписки берутся username, число сообщений и время последней активности. Привязка пользователя теперь в первую очередь к Телеграму, а не к электронной почте: в карточке Telegram-пользователя назначается роль (админ, кладовщик, поставщик и т.д.) и связь с пользователем платформы. При появлении НОВОГО пользователя в Telegram система сообщает об этом в канал уведомлений «Новый пользователь в Telegram» (уровень «Важное», каналы: платформа и бот администратора, ссылка ведёт на карточку пользователя для назначения роли). Событие срабатывает и вживую (вебхук /webhook/ai), и при загрузке пользователей из переписки кнопкой «Загрузить из переписки» на странице /admin/telegram-users. Дубли из разных форм сессии (dm:X, dm:X_cX, голый X) схлопываются в одного пользователя; тестовые псевдонимы (test:123) и нечисловые id игнорируются. Версия платформы 1.13.0 → 1.14.0.
Пользователи из переписки
Загрузка из переписки — кнопка «Загрузить из переписки» на странице «Telegram-пользователи»: берёт дамп переписки включённых ботов, собирает уникальных пользователей (по Telegram chat_id) и заносит их в систему
Каждый, кто писал в Telegram, — в системе — из переписки переносятся username, число сообщений и время последней активности; дубли сессий разных форматов (dm:X, dm:X_cX, голый X) — один пользователь
Привязка к Telegram
Основное — Telegram, не email — роль и привязка к пользователю платформы назначаются в карточке Telegram-пользователя; система опирается на Telegram-идентичность
Уведомление о новом пользователе
«Новый пользователь в Telegram» — при появлении нового пользователя система сообщает в канал уведомлений (уровень «Важное», категория «Пользователи»): вживую через вебхук и при загрузке из переписки
Ссылка на карточку — уведомление ведёт на карточку пользователя, где сразу назначается роль (админ, кладовщик, поставщик и т.д.) и привязка к платформе
Задание 137. Переписка бота: год в датах диалогов, последняя запись сверху, отдельная страница диалога с ответом оператора в единой системе
Доработка переписки бота по образцу платформы Алексея (n8n-telegram admin/chat.php): 1) во всех датах и времени диалогов добавлен год — формат ДД.ММ.ГГГГ, ЧЧ:ММ (JS formatTime и PHP), правило закреплено в методологии «даты и время всегда с годом»; 2) диалоги сортируются по последней записи — сессии с последней активностью идут сверху, сразу видно, где ведётся переписка; 3) отдельная страница диалога по прямой ссылке /admin/bot-conversation?bot=...&session=... — полная лента переписки с клиентом (кто что написал), сведения о сессии (session_id, username, user_id, число сообщений, последняя активность), ссылка «Обновить диалог» и форма ответа оператора: отправить клиенту сообщение от лица бота через n8n (админское действие operator_reply, маршрут POST /admin/telegram-bots/reply), после отправки лента обновляется. Ссылка «Открыть» добавлена к каждому диалогу в списках «Переписка бота» и на странице бота. N8nTelegramService дополнен методом replyAsOperator(). Версия платформы 1.12.0 → 1.13.0.
Год в датах
Формат ДД.ММ.ГГГГ, ЧЧ:ММ во всех датах диалогов — JS formatTime и PHP-вывод; правило «даты и время всегда с годом» закреплено в методологии разработки и стиле интерфейса
Пользователи работают с годом — на платформе и в методологии Алексей использует год в рабочих датах
Сортировка диалогов
Последняя запись сверху — сессии сортируются по last_at по убыванию: любой диалог, где идёт переписка, сразу виден в начале списка
Отдельная страница диалога
Прямая ссылка /admin/bot-conversation?bot=...&session=... — полная лента переписки с клиентом, кто что написал, сведения о сессии
Ответ оператора — форма отправки сообщения клиенту от лица бота через n8n (operator_reply); после отправки лента обновляется
Кнопка «Открыть» у каждого диалога в списках «Переписка бота» и на странице бота — переход к отдельной странице диалога
Задание 136-2. Знания по продукту: карта «пути» чат-бота (7 этапов, как воронка/CRM), источники данных, актуальность инструкций и данных, сигнал рассинхрона платформа ↔ бот; отдельная вкладка «Переписка бота»
Новый функционал «Знания по продукту»: отдельная вкладка слева «Переписка бота» (отдельный URL /admin/bot-conversations, полная переписка сессий с ответами, автобновление) и «Знания бота» (/admin/bot-knowledge) — визуальная карта «пути» чат-бота из 7 этапов в стиле воронки/CRM (площадка онлайн, связь n8n, поток и подключение бота, мозг regex /webhook/ai или LLM, база знаний ai-kb с датами обновления инструкций, данные проекта: товары/остатки/движения и свежесть синхронизации, диалоги и ответы). Каждый этап подсвечен статусом «работает/нет, подключён/нет, пишет/отвечает, видит/не видит данные, данные актуальны/устарели» — видно, на каком этапе бот застрял. Блок «Источники данных» перечисляет, что знает бот и откуда берётся информация (n8n-база знаний ai-kb, Google-таблица из agent.meta.json, БД платформы, диалоги n8n, LLM-прокси на VDS). Сигнал актуальности сравнивает даты: обновления инструкций (Last-Modified файлов ai-kb) ↔ данные платформы (SheetConfig.last_sync_at, последние движения/правки товаров) ↔ активность диалогов — предупреждает, если платформа обновилась, а бот пользуется старыми инструкциями или мозг ещё LLM (поток не переключён на /webhook/ai). N8nTelegramService дополнен методом getKbFileInfo() (HEAD-запрос Last-Modified/Content-Length). Сервис BotKnowledgeService собирает снапшот знаний; страницы BotKnowledge и BotConversations в группе «Чаты». Версия платформы 1.11.0 → 1.12.0.
Вкладка «Переписка бота»
Отдельный URL /admin/bot-conversations (группа «Чаты», sort 10) — полная переписка основного бота: список сессий, разворачивание сообщений с ответами бота, автообновление
Ссылка с главной страницы бота — быстрый переход «Переписка →»
Вкладка «Знания бота»
Карта пути из 7 этапов (площадка, связь n8n, поток, мозг, база знаний, данные проекта, диалоги) — статусы ok/warn/error, как этапы воронки продаж
Блок «Источники данных» — что знает бот и откуда (ai-kb, Google-таблица, БД платформы, диалоги, LLM-прокси)
Свежесть и рассинхрон — Last-Modified инструкций ai-kb vs данные платформы vs активность диалогов; предупреждение, если бот пользуется старыми данными/LLM-мозгом
Техника
N8nTelegramService::getKbFileInfo() — HEAD-запрос к /ai-kb/bots/{bot}/{file} (Last-Modified, Content-Length), кэш 60 сек
Задание 136. Основной Telegram-бот: отдельная вкладка слева — карточка, откуда берётся, как устроен, инструкции (правка с площадки) и диалоги
Основной чат бот (@BBmsk_admin_bot, bot_id bober-bob-client) — наконец «рабочий» и на виду. Причина жалобы клиента («бот просто здоровается и не видит данные проекта»): сейчас ответы формирует LLM-мозг на VDS (n8n-поток + база знаний ai-kb), а данные проекта живут в площадке — их знает regex-агент /webhook/ai. По заданию мозг основного бота — regex-агент площадки с данными проекта; переключение потока n8n на webhook площадки делается при публикации платформы (тестовая ipd.test не доступна из интернета). В платформе появилась отдельная вкладка слева «Бот Бобер Боб (основной)»: карточка бота (роль primary, @username, статус, ссылка перехода), блок «Откуда берётся» (n8n-telegram_ipd.by, workflow, когда подключён, таблица), схема «Как устроен» (Telegram → n8n → /webhook/ai → ответ; вопросы/ответы пишутся в диалоги), инструкции бота редактируются прямо с площадки (welcome.md, persona.md, system.md, status.md, support-clients.md — читаются с /ai-kb/bots/… и сохраняются через admin API kb_save) и живая переписка. Методология «08 ИИ-боты и Telegram» дополнена конструктором основного бота и командой подключения мозга. Версия платформы 1.10.0 → 1.11.0.
Вкладка основного бота
«Бот Бобер Боб (основной)» в левом меню (Чаты, /admin/bot-bober-bob) — отдельная страница именно основного бота, для показа клиенту: карточка (роль primary, @BBmsk_admin_bot, статус, ссылка перехода), версия и инстанс площадки
Откуда берётся: n8n-telegram (https://n8n-telegram.ipd.by), workflow_id из agent.meta.json, дата подключения, ссылка на дашборд n8n-telegram
Как устроен: схема потока Telegram → n8n → /webhook/ai (regex-агент с данными проекта) → ответ; пары «вопрос → ответ» агрегируются с n8n-telegram и показываются здесь
Диалоги: живая переписка основного бота (тот же источник admin_dump.php, автообновление)
Инструкции бота правятся с площадки
Пять файлов базы знаний: welcome.md, persona.md, system.md, status.md, support-clients.md
Чтение: GET /ai-kb/bots/bober-bob-client/{file} с n8n-telegram (raw-файлы), показ в редакторе с предупреждением о влиянии на живой бот
Сохранение: POST /admin/telegram-bots/kb-save → admin API n8n-telegram (action=kb_save) — инструкции применяются к живому боту на VDS
Регулярно обновлять: кнопка «Обновить инструкции» перечитывает файлы
Мозг бота — данные проекта
Проблема: бот отвечал LLM-заготовками («привет, как я могу помочь тебе сегодня») и не видел остатки/операции — данные проекта в другом месте (regex-агент площадки /webhook/ai)
Решение по заданию: мозг основного бота — regex-агент площадки; поток n8n должен вызывать /webhook/ai (bober-bob-платформы) с секретом N8N_WEBHOOK_SECRET
Ограничение теста: bober-bob.ipd.test доступен только с ноутбука — переключение потока выполняется при публикации платформы (по приказу)
Задание 135. Телеграм-боты: бот администратора с уведомлениями, один резервный, тестовый и будущий боты, ссылки перехода, раздел ботов в меню
Telegram-боты выстроены в систему ролей: основной (с которым общается клиент), бот администратора (принимает уведомления платформы — кто-то вошёл в систему, кто-то написал боту), тестовый бот, будущий бот на перспективу и один резервный. Резервных ботов вместо трёх стал ровно один — «если создавать их много, это было бы неправильно». Раздел «Телеграм боты» вынесен в левое меню (Чаты) — быстрый доступ к настройке. У каждого бота появилась настраиваемая ссылка перехода (источник, откуда приходят пользователи) — видна в карточке бота, на рабочем столе и заполняется в настройках. Уведомления платформы (вход пользователя, новое сообщение в Telegram) теперь уходят и в Telegram — на бота администратора. Версия платформы 1.9.0 → 1.10.0.
Система ботов
Роли ботов: primary (основной/клиентский), admin (бота администратора — принимает уведомления), test (тестовый), future (будущий/перспектива), reserve — единственный резервный
config/instances.php: 3 резервных → 1 (bober-bob-reserve-1), добавлены bober-bob-admin, bober-bob-test, bober-bob-future; у каждой записи поле link
TelegramBotConfigService: роли и метки (ROLES), adminKey()/testKey()/futureKey(), roleLabel(), reserveKeys() теперь строго роль reserve
Меню и страница ботов
Раздел «Телеграм боты» в левом меню (Чаты) — shouldRegisterNavigation: false → true
Страница ботов: бейджи всех ролей (осн./адм./тест/буд./рез.), строка «Ссылка перехода» в карточке и поле «Ссылка перехода (источник)» в настройках (сохраняется через /admin/telegram-bots/update)
Рабочий стол: бейджи ролей в блоке «Телеграм» + показ ссылки при её наличии
Уведомления на бота администратора
Вход пользователя (уже было в AppServiceProvider) — теперь с каналом telegram
Новое сообщение в Telegram — при вебхуке /webhook/ai создаётся уведомление категории message (кто-то написал боту: имя и первые 120 символов), канал in_app + telegram
Доставка в Telegram идёт через существующую интеграцию (Настройки → Уведомления), получатель открывает бота администратора
Задание 134. Телеграм-бот — приоритетный канал: блок на рабочем столе, роли пользователей, основной и резервные боты
Telegram-бот — цель и приоритет платформы: через него автоматизируются заказы (ИИ-агент). Раньше бот был «невидим»: в меню его нет, на рабочем столе — только карточка светофора, назначение ролей скрыто, резервирования нет. Теперь на дашборде появился приоритетный блок «Телеграм»: карточки ботов (основной + 3 резервных, статус, число диалогов/сообщений, последняя активность), статистика (пользователи, активные, сообщений сегодня) и лента последней переписки — видно, кто писал, когда и что, с ролью пользователя (клиент/бот). Раздел «Telegram-пользователи» стал видимым в меню (Администрирование) — роль пользователю назначается прямо из интерфейса. Боты различаются по роли: основной (primary) и резервные (reserve, по умолчанию выключены) — включаются, если основной недоступен. На странице «Телеграм боты» роль показана бейджем «осн.»/«Резервный».
Рабочий стол — блок «Телеграм»
Приоритетный блок сразу после КПИ-карточек (Telegram — цель платформы, заказы через ИИ-агента)
Боты: карточка каждого бота — статус-точка (включён/выключен), название, @username, бейдж «Основной»/«Резерв», число диалогов и сообщений, последняя активность
Статистика: пользователей в Telegram, активных, сообщений сегодня
Лента последней переписки: кто писал (имя/username из Telegram), роль пользователя цветным бейджем, метка «клиент/бот», время и превью сообщения → все переходы на страницу переписки
Роли и боты
«Telegram-пользователи» показаны в меню (Администрирование): назначение роли (Тестировщик/Поставщик/Кладовщик/Складовщик/Администратор/Партнёр), активность, привязка к пользователю платформы
Резервирование: ботов теперь 4 (1 основной + 3 резервных по умолчанию выключены); роль бота живёт в config/instances.php (telegram_bots.role: primary/reserve) и в TelegramBotConfigService::primaryKey()/reserveKeys()
Страница ботов: бейдж «осн.» на вкладочках и строки «Роль» в карточке бота
Реализация
custom-dashboard.blade.php — блок «Телеграм — приоритетный канал» (DashboardOverview::getTelegramOverview(), данные с n8n-telegram читаются только для включённых ботов, вне тестов)
TelegramUserResource — shouldRegisterNavigation: false → true; AiConversation::tgUser() — связь с TelegramUser по telegram_chat_id
config/instances.php — 3 резервных бота (bober-bob-reserve-1/2/3); версия платформы 1.8.0 → 1.9.0
Задание 133. SVG-иконки: крупные «живые» иконки на карточках рабочего стола (80–120px)
Иконки на карточках дашборда стали крупными выразительными «иероглифами» интерфейса: раньше они были 16px (w-4 h-4) и терялись — мелкая иконка «портит внешний вид, нечитаемая». Теперь КПИ-карточки имеют иконки 36px в подложке 56px, ячейки светофора — 28px в подложке 48px, навигация — 24px (ранее 16px). Каждая иконка «оживает» при наведении: приподнимается (-2px), подрастает (scale 1.08) пружинной кривой, а для «Движений» — мягко покачивается по смыслу (движение туда-сюда). Реализовано через CSS-классы bb-icon-live / bb-icon-shake в app.css, keyframes — только в файле токенов. Цвет иконок — по правилу «цвет по назначению»: базис серый, статус — светофор, без пёстрых палитр; обе темы (светлая/тёмная) выдержаны. Работа с иконками зафиксирована в методологии: новый файл «07 Иконки и анимация.md» (таблица размеров 12–120px по контексту, единый источник heroicons, правила анимаций, чек-лист), обновлены README методологии (1.6.0), «03 Стиль интерфейса» (п. 7.1), «04 Темы и дизайн» (п. 5a).
Иконки живут: что изменилось
КПИ-карточки (6): иконки 20px → 36px (w-9 h-9) в подложке 56px (w-14) rounded-xl
Светофор системы: иконки 16px → 28px (w-7 h-7) в подложке 48px (w-12), точка статуса — отдельно справа
Задание 132. Верхняя панель по образцу Production: поиск → колокольчик → пользователь (пользователь в крайнем правом углу)
Верхняя панель приведена к удобному порядку, как на платформе Production (Задание 132): слева направо — глобальный поиск, колокольчик уведомлений, пользователь в крайнем правом углу. Раньше колокольчик висел самым правым элементом, а подпись и аватар пользователя — левее него: «сначала значка, потом буквочка, потом администратор» было неудобно. Теперь поиск идёт первым (фильтрация товаров, паллет, складов, штрих-кодов, пользователей прямо из шапки), затем уведомления, а пользователь (аватар + имя) — строго в крайнем правом углу, как в Google-аккаунте. Реализация: колокольчик перенесён с renderHook TOPBAR_END (позиция после user-menu) на GLOBAL_SEARCH_AFTER (внутри блока topbar-end Filament, между поиском и user-menu); включён встроенный GlobalSearch Filament — добавлены getGloballySearchableAttributes()/recordTitleAttribute в ресурсах Товары, Паллеты, Склады, Пользователи, Штрих-коды; CSS-отступ колокольчика убран (отступы даёт flex-gap топбара).
Задание 131. Уведомления: 4 уровня критичности, YouTube-чтение, настройки пользователя, почта и Telegram — без тысяч записей
Система уведомлений переработана с нуля в полноценный механизм платформы (Задание 131): вместо тысяч сырых записей БД Filament — события с четырьмя уровнями критичности: 1 «Информация» (произошло событие), 2 «Внимание» (проактивная защита — что-то не так), 3 «Важное» (привезли товар, новый пользователь), 4 «Критично» (система упала, ошибка — глобальное уведомление всем). Открыл уведомление — автоматически прочитано, как в YouTube: красный счётчик убавляется сам, кнопок «отметить прочитанным» нет. Логируется, кто и когда просмотрел (viewed_at). Пользователь настраивает, какие уровни показывать; критичные скрыть нельзя. Одинаковые события схлопываются в одну запись с счётчиком «×N» (агрегация): импорт 222 движений даёт одно сводное уведомление — не тысячи. Каналы: внутри приложения, письмо администратору, Telegram-бот. Собственный колокольчик Livewire в шапке (вместо вендорного).
4 уровня критичности
1 Информация — произошло событие: перемещение товара, добавлен товар в каталог
2 Внимание — проактивная защита «что-то не так»: вход пользователя, низкий остаток, лид веб-чата
3 Важное — привезли/увезли товар, создан новый пользователь, итог импорта данных
4 Критично — система упала, ошибка: глобальное уведомление, приходит всем, скрыть нельзя
YouTube-семантика чтения
Открыл список в колокольчике — показанные уведомления автоматически помечены прочитанными
Кликнул строку — отмечено прочитанным + переход к событию (related_url)
Кнопок «прочитано» нет — циферка убавляется при просмотре, как в YouTube
Логирование — таблица notification_recipients.viewed_at: кто и когда посмотрел (система и ИИ-агент видят)
Задание 127. VDS — Кебаб меню: кнопки «Удалить» спрятаны в «⋮», чтобы не нажать случайно
Все деструктивные кнопки «Удалить» в админ-панели убраны с открытого обзора и спрятаны в кебаб-меню (вертикальные три точки «⋮»): удаление теперь в один лишний клик и защищает от случайного нажатия. Правило применено и к таблицам, и к формам редактирования: в таблицах (склады, паллеты, операции, версии, пользователи, локации, штрих-коды, остатки, товары, движения, конфиги листов, уведомления) строчная кнопка «Удалить» перенесена в кебаб-группу («⋮» в конце строки), при этом полезные действия «Просмотр»/«Изменить» и массовые действия остаются видимыми; в шапке форм редактирования (Edit-страницы) кнопка «Удалить» также свёрнута в кебаб-группу. Добавлен переиспользуемый компонент App\Filament\Actions\KebabMenu (ActionGroup с иконкой heroicon-m-ellipsis-vertical, iconButton, серый цвет) — 8 строчных и 9 заголовочных правок; в раздел «03 Стиль интерфейса» методологии дописано правило: деструктивные действия — только в кебабе.
Правило интерфейса
Кнопка «Удалить» - не висит открытой кнопкой ни в строке таблицы, ни в шапке формы редактирования — спрятана в кебаб-меню «⋮» (группа действий), чтобы пользователь не нажал случайно
Безопасные действия остаются видимыми - «Просмотр»/«Изменить», массовые («Удалить выбранные») и быстрые действия не тронуты
Таблицы (11 ресурсов) - Warehouse/Pallet/Operation/Version/User/Location/Barcode/Stock/Product/StockMove/SheetConfig: DeleteAction обёрнут в KebabMenu::make([DeleteAction::make()])
Формы редактирования (9 Edit-страниц) - EditWarehouse/EditVersion/EditOperation/EditUser/EditLocation/EditBarcode/EditProduct/EditStock/EditStockMove: DeleteAction в getHeaderActions() обёрнут в KebabMenu::make([Actions\DeleteAction::make()])
Уведомления (/admin/notifications) - delete переведён в кебаб, toggleRead — компактная иконка-кнопка; убран импорт App\Models\User
Методология
03 Стиль интерфейса §5 - дописано явное правило: деструктивные действия («Удалить») — только в кебаб-меню «⋮», не открытыми кнопками
Версия платформы - 1.6.1 → 1.6.2 (config/app.php, config/instances.php, versions.json)
Результат
Кнопки «Удалить» в таблицах и формах редактирования спрятаны в кебаб «⋮»: защита от случайного нажатия; строки не перегружены кнопками; тесты KebabMenuTask127Test проверяют структуру рендера (нет открытой ссылки-удаления, есть кебаб-группа с danger-пунктом)
Задание 124. Уведомления: красный бейдж-счётчик в шапке (как Google) и в боковом меню «Уведомления»
Индикатор непрочитанных уведомлений в админ-панели перекрашен с серо-синего на красный фон с белыми цифрами (как в Google): обновлён бейдж-счётчик у колокольчика в верхнем правом углу (database notifications) и добавлен такой же красный счётчик непрочитанных уведомлений на пункт «Уведомления» в левом боковом меню (/admin/notifications). Счётчик считается по непрочитанным записям таблицы notifications формата filament и обновляется автоматически. Дополнительно таблица «Уведомления» и все стандартные Filament-таблицы переведены на единую палитру платформы: вместо почти чёрного текста ячеек и заголовков (var(--gray-950)/#030712), серых подписей (var(--gray-500)) и почти чёрного фона контейнера в тёмной теме (var(--gray-900)/#111827) используются токены тем (--text-primary/--text-secondary/--text-muted, фон — белый/--bg-surface #1e293b).
Красный бейдж в шапке
Колокольчик в верхнем правом углу (database notifications) — счётчик непрочитанных уведомлений на красном фоне (#dc2626) с белыми цифрами, как в Google
Счётчик в боковом меню
Пункт «Уведомления» (/admin/notifications) — красный бейдж с числом непрочитанных уведомлений на пункте в левом меню (getNavigationBadge + цвет danger)
Подсчёт
Не прочитанные - user->notifications()->where('data->format', 'filament')->whereNull('read_at') — единый подсчёт для шапки и меню
Стили - перекрытие цвета бейджей в resources/css/app.css (сборка Vite)
Таблица уведомлений — единая палитра
Текст ячеек - заголовки/значения (.fi-ta-text-item) вместо почти чёрного Filament-дефолта (var(--gray-950)) окрашены токеном --text-primary (светлая #0f172a, тёмная #f8fafc; в тёмной теме — var(--bg-surface)), контраст > 6:1
Подписи - описания (.fi-ta-text-description) вместо серого var(--gray-500) — токен --text-muted (#475569/#94a3b8)
Фон контейнера - .fi-ta-ctn вместо почти чёрного var(--gray-900)/#111827: в светлой теме белый, в тёмной --bg-surface #1e293b
Результат
Версия 1.5.0 → 1.6.1: счётчики уведомлений в шапке и в боковом меню стали красными с белыми цифрами; таблица «Уведомления» и стандартные Filament-таблицы приведены к единой палитре платформы (токены обеих тем) вместо почти чёрных Filament-дефолтов
Плавающая кнопка «Спросить у ИИ» (нижний правый угол) получила собственные настройки показа. В шапке виджета возле крестика появилась шестерёнка, которая ведёт на новую страницу «Настройки → Виджет ИИ» (/admin/settings/ai-widget). На странице можно просмотреть все параметры, прописанные в виджете, и одним переключателем включить/выключить показ виджета на платформе (код сохраняется, не удаляется). Выключенный виджет полностью скрыт в админ-панели и на публичной странице «О сервисе» /about. Параметры хранятся в кеше settings.ai_widget (по образцу settings.ai_agents) и используются шаблоном resources/views/partials/ai_agent.blade.php при рендере.
Шестерёнка в шапке виджета
Кнопка-шестерёнка возле крестика в шапке виджета «Спросить у ИИ» — переход к настройкам виджета (/admin/settings/ai-widget)
Страница настроек виджета
Настройки → Виджет ИИ - просмотр параметров, прописанных в виджете (кнопка, имя в шапке, статус, приветствие, лимит сообщений, форма контактов, поле ввода)
Переключатель «Показывать виджет на платформе» — вкл/выкл (не удаление)
Показ и скрытие
Включено - виджет виден в админ-панели (renderHook BODY_END) и на публичной странице «О сервисе» (/about)
Выключено - виджет полностью скрыт на платформе, код сохраняется
Задание 60. Ченджлог от проектов: JSON-эндпоинт /api/v1/changelog для платформ-потребителей
Публичный JSON-эндпоинт changelog для платформ, которые потребляют версии ИИ-агента: GET /api/v1/changelog отдаёт все опубликованные версии (version, title, subtitle, description, result, type, released_at, sections) с индексом платформы (bober-bob, version). Обращение защищено токеном X-API-Key (CHANGELOG_API_TOKEN в .env, config/services.php → changelog.token). Эндпоинт используется платформой Production (Задание 60) — блок «Ченджлог от проекта» и индикатор свежести на карточках проектов из производства.
JSON-эндпоинт
GET /api/v1/changelog - опубликованные версии (orderedByVersion, version/title/subtitle/description/result/type/released_at/sections), status, platform, version, count
production.ipd.test - синхронизация changelog по кнопке на карточке проекта (/production/production-projects/{id}/changelog-sync), таблица project_changelogs, индикатор свежести в списке проектов из производства
Результат
Платформа задач видит, что Бобер Боб сделал - Production получает версии и сделанное (что/когда/результат) из публичного endpoint Бобера
Задание 122. Changelog и ссылки: публичная история версий
Версионность выведена в отдельную публичную экосистему: история версий открывается клиенту без авторизации по ссылкам /changelog и /changelog/{version}, каждая запись доступна поисковым системам (SEO: title, description, canonical, og:title/og:description/og:url). В админ-панели «Настройки → Версии» у каждой версии появилась видимая ссылка «Ссылка ↗» и кликабельный заголовок, ведущие на публичную страницу версии. В методологию добавлен раздел «05 Версионность и changelog».
Публичные ссылки
/changelog и /changelog/{version} - история версий открыта без авторизации, страницы индексируются поисковиками
SEO - у каждой страницы title, description, canonical и og-разметка
Ссылки из админ-панели
Настройки → Версии - у каждой версии видимая ссылка «Ссылка ↗» и кликабельный заголовок
Дашборд - кнопка «Публичная история ↗» на `/changelog`
Методология
05 Версионность и changelog.md - правила версионности (SemVer, sort_key, is_current, is_published) и экосистемы публичных страниц
Результат
Версия 1.3.1 → 1.4.0: клиент может открыть историю версий по прямой ссылке
Задание 121. Дизайн и цвет: нейтральный рабочий стол, крупные часы и дата, правило «цвет по назначению»
Ставка «дизайн под систему, а не система под дизайн». Рабочий стол (дашборд) приведён к правилу «цвет по назначению»: серый/нейтральный базис, цвет только там, где он несёт смысл (светофор: красный/жёлтый/зелёный), синий — единственная кнопка действия «Следующий шаг» и основные ссылки Filament, фиолетовый и пёстрые палитры карточек удалены. Герой больше не кричит «Бобер Боб» большими буквами: на виду крупные живые часы и дата, версия — вторична. Убрана бессмысленная кнопка «Обновить» из шапки дашборда. Правило «цвет по назначению» записано в методологию (02 Правила разработки, 03 Стиль интерфейса, 04 Темы и дизайн).
Дизайн и цвет
Герой дашборда - нейтральная карточка вместо синего градиента; крупные живые часы (data-live-clock) и дата, «Бобер Боб · Платформа складского учёта» скромно сверху, версия вторична справа
Правило «цвет по назначению» - серый/нейтральный базис, цвет только по смыслу: светофор красный/жёлтый/зелёный, синий — единственная кнопка действия, фиолетовый удалён
KPI-карточки нейтральны - все 6 KPI и быстрые действия переведены на серые чипы и нейтральные hover-рамки (были blue/emerald/violet/indigo/cyan/sky/teal)
Задание 119. Темы темная и светлая: методология дизайна и новый файл дизайн-гайда
Платформа пройдена «глазами» обеих тем (тёмная и светлая), оформление финализировано и задокументировано. Методология разработки перестроена по образцу Marketing (папка «разработка платформы»): созданы файлы «01 Среда и команды», «02 Правила разработки», «03 Стиль интерфейса» и новый «04 Темы и дизайн» — style-guide платформы (палитра обеих тем, токены html.dark и :root, правило специфичности html.dark > :root, компоненты: Repeatable-таблица «Движение товара», кебаб-меню, светофор, мобильная версия, чек-лист проверки дизайна). README стал хабом с описанием всей экосистемы разработки в одном месте: дизайн (как выглядит), вёрстка (видимая часть), программирование (невидимая часть), мобильная версия. Описания правил улучшены, добавлены перекрёстные ссылки. Дизайн-система: холодный slate + Google Material Blue, контраст >6:1, шрифт ≥14px.
Методология
04 Темы и дизайн.md - новый файл style-guide платформы: токены тёмной (html.dark) и светлой (:root) тем с контрастами, почему html.dark побеждает :root, перекрытия Filament, правильное применение токенов в blade, Repeatable-таблица, светофор, мобильная версия, проверка перед сдачей
01 Среда и команды.md - среда (C:\Herd\bober-bob.ipd, БД bober_bob_test, сайт ipd.test/admin), команды тестов, tinker через stdin-pipe, рендер-проверки, сборка CSS, состав команды
02 Правила разработки.md - железные правила: запреты (деплой/миграции/версии/дамбы через PowerShell >), контраст и шрифты, токены тем, стиль кода, версионирование SemVer, проверка перед сдачей, git
03 Стиль интерфейса.md - компоновка экранов: страница = один шаг пути, одна синяя кнопка, светофор, дашборд (герой/КПИ/светофор/навигация), кебаб-меню, breadcrumbs, SVG-инфографика, правила ссылок
README хаб
Экосистема разработки в одном README - дизайн (как выглядит), вёрстка (видимая часть), программирование (невидимая часть), мобильная версия; общее правило: дизайн не подменяется программированием и наоборот
Версия методологии 1.0.0 → 1.1.0, журнал пополнен записью 1.2.6
Версия
config/app.php - 1.2.5 → 1.2.6
config/instances.php - agent version 1.2.5 → 1.2.6
resources/json/versions.json - добавлена запись 1.2.6
Задание 117. Реальные данные клиента загружены: страница товара показывает источник и движение
На платформу загружены реальные данные клиента из первоисточника «2026-07-15 Продажи и остатки 1 фура.xlsx» (листы «До 01.06», «После 01.06» и «ББ_склад»): 55 товаров, 19 паллет, 35 строк остатков и 222 движения (62 прихода по двум поставкам, 160 расходов по покупателям — «кто заказал»). На странице товара (клик по товару, например /admin/products/48) теперь видно, откуда взяты данные (файл-первоисточник, лист, строка) и движение товара: поставки и заказы с датами, покупателями и суммами. Цены на страницах товаров и движений переведены из BYN в рублёвые ₽ (в файле клиента цены в рублях). Импорт идемпотентен: повторный запуск не дублирует данные.
Импорт из первоисточника клиента
app/Services/ImportSkladService.php - новый сервис импорта xlsx (листы продаж и складского остатка) с нормализацией ключей товаров: «Жареные бобы соль (1 кг)» ↔ «бобы соль 1», сопоставлением с каталогом, созданием новых товаров только при реальном несовпадении
app/Console/Commands/ImportSkladCommand.php - artisan bober:import-sklad {--file=}: идемпотентный (движения с меткой file:2026-07-15 пересоздаются, товары обновляются, а не дублируются), с отчётом в консоли
Лист «27-07-2026 Move» - демо-данные бота не загружаются; мусорная AI-строка с количеством 12 345 678 и служебные строки-итоги пропускаются
Паллеты и остатки - 19 уникальных паллет («9 нов», «18 стар» и т.п., статус по тексту), остатки агрегируются по товару (например, «Бобы соль 1» = 251 упаковка из нескольких паллет)
Движения - 222: поставки периода 1 и 2 (60 и 150+ упаковок с ценами из файла) и расходы по покупателям (Меликишвили, Лебедев, Афина, Гуднат, ИП Меликишвили и др.) с датами 01.06.2026 и 15.07.2026
Страница товара
Источник данных - infolist-секция на странице товара (/admin/products/{id}): Файл-источник, Лист в файле, Строка в файле + примечание (данные из актуального файла клиента, цены в ₽)
Движение товара - RepeatableEntry-таблица: Дата, Событие (Поставка / Заказ), Покупатель/документ, Кол-во шт, Сумма ₽; до 200 последних движений
Валюта BYN→RUB - цены на страницах товаров (ProductResource, клиентский ProductResource), движений (MovementResource) и валюта по умолчанию в настройках переведены в рублёвые ₽
Версия
config/app.php - 1.2.4 → 1.2.5
config/instances.php - agent version 1.2.4 → 1.2.5
resources/json/versions.json - добавлена запись 1.2.5
Тесты
tests/Feature/ImportSkladTask117Test.php - 5 тестов: нормализация ключей, привязка строк продаж к каталогу, создание нового товара с ценой из файла, идемпотентность повторного импорта, страница товара (источник + движение)
Задание 116. Рабочий стол: живые часы и «движение» платформы
Рабочий стол стал «живым»: в нижнем левом углу боковой панели добавлены часы (часы:минуты:секунды) рядом с версией платформы — как на платформе маркетинга (marketing.ipd.test) — блок кликабельный и ведёт на страницу версий. В hero рабочего стола добавлены живые часы с секундами и датой (обновляются раз в секунду), а строка «Версия» стала кликабельной ссылкой на версии. Рабочий стол показывает, что происходит на платформе: последние движения, светофор системы, FEFO, экономия времени и сводка по остаткам.
Нижний левый угол боковой панели
Часы + версия - в SIDEBAR_FOOTER добавлены живые часы ЧЧ:ММ:СС (data-live-clock, JS раз в секунду) и версия v{{ config('app.version') }}
Клик → версии - весь блок является ссылкой на /admin/settings/versions (образец - marketing.ipd.test: версия кликабельна и ведёт на /about)
Рабочий стол
Живые часы - в hero добавлены часы с секундами и дата (now()->translatedFormat('l, d F')), обновляются каждую секунду
Версия кликабельна - строка «Версия» на рабочем столе ведёт на /admin/settings/versions
Движение - стол показывает происходящее: последние движения (приход/списание/перемещение), светофор системы, FEFO-предупреждения, топ товаров, экономия времени, сводка по остаткам
Версия
config/app.php - 1.2.3 → 1.2.4
config/instances.php - agent version 1.2.3 → 1.2.4
resources/json/versions.json - добавлена запись 1.2.4
CSS - пересобран при необходимости новых классов (text-[15px], tabular-nums)
Задание 115. Методология разработки платформы применена — контраст и шрифт ≥14px
Создана и применена методология разработки платформы Бобер Боб (копия методологии Production, адаптированная под складскую платформу; путь: «Разработчик 2/Бобер Боб/Методология разработки платформы»). Аудит интерфейса по 12 правилам: исправлена нечитаемость страницы «Версии» в светлой теме (были хардкод-стили только тёмной темы — белый текст #f8fafc на белом фоне; теперь тема-зависимые CSS-переменные --text-primary/--text-secondary/--text-muted для обеих тем), поднят контраст вторичного текста на всех страницах (text-gray-400 → text-gray-600, #64748b → #94a3b8/#475569 во всех темах, минимум 6:1), запрещены шрифты меньше 14px (text-xs → text-sm по всей платформе, text-[8px]/text-[10px] убраны из сборки CSS, из tailwind-сканирования исключены тесты). Пересобран CSS-бандл. Контраст и типографика соответствуют правилам 8 методологии. Платформа переведена на версию 1.2.3.
Методология
README методологии - создан и адаптирован под склад: «Бобер Боб/Методология разработки платформы/README.md» (v1.0.0), 12 правил, правило 8 ужесточено - обе темы обязательны
Аудит интерфейса - все страницы панели проверены на контраст и размер шрифта по правилам 8
Контраст ≥ 6:1
settings/versions - убраны хардкод-стили тёмной темы: белый текст на белом фоне заменён на переменные --text-primary/--text-secondary/--text-muted, карточки через --ver-card-bg/--ver-card-border (свои значения для светлой и тёмной темы)
custom-dashboard - text-gray-400/#64748b (≈4.6:1) подняты до text-gray-600/#94a3b8 (≥6:1)
login-custom - #64748b на #0f172a (≈4.6:1) → #94a3b8 (≥7:1)
Цветовое оформление платформы приведено к единой дизайн-системе экосистемы (эталон — https://my.ipd.test «Экосистема забот», design-система v0.19.0): убрана тёплая «коричневая» палитра (Total Commander) и золотой корпоративный акцент. Теперь используются токены my.ipd: холодный slate (тёмная #0f172a/#1e293b/#334155, светлая #f1f5f9/#ffffff/#e2e8f0), текст #f8fafc/#cbd5e1/#94a3b8 и #0f172a/#334155/#475569, акцент Google Material Blue #3b82f6 (hover #2563eb, в светлой — #2563eb). Подключён шрифт Inter (400–800) — тот же, что на my.ipd — во все панели (Filament ->font('Inter') + Google Fonts в head, theme-color #0f172a). Заменены все вьюшки с жёсткими hex тёплой палитры на slate-токены; золото #c9a96e/#a0845e в about/login/versions заменено на синий акцент. Дефолты настроек внешнего вида: primary #2563eb, accent #3b82f6, фон «тёмный». Платформа переведена на версию 1.2.2.
Палитра = дизайн-система my.ipd
Тёмная тема — фон #0f172a (slate-900), поверхности #1e293b (slate-800), elevated/borders #334155 (slate-700), текст #f8fafc/#cbd5e1/#94a3b8
Светлая тема — фон #f1f5f9, карточки #ffffff, границы #e2e8f0, текст #0f172a/#334155/#475569
Акцент — Google Material Blue #3b82f6 (hover #2563eb); в светлой теме #2563eb (hover #1d4ed8)
Шрифт Inter
Filament — ->font('Inter') в AdminPanelProvider и ClientPanelProvider
Google Fonts — preconnect + Inter 400–800 в partials/favicon-head (все панели и публичные страницы)
Базовая типографика — font-family 'Inter', system-ui в app.css
Замена тёплой палитры во вьюшках
resources/css/app.css — токены переписаны с тёплого чёрного (161613…) на slate-токены my.ipd
~19 blade-вьюшек — жёсткие hex-значения тёплой палитры заменены на slate-токены (ai-agents, webchat, kebab-menu, user-menu-caption, custom-dashboard и др.)
Золото → синее — #c9a96e/#a0845e в about, login-custom, settings/versions заменены на #3b82f6/#2563eb
about/login/versions — полный свип — убраны тёмно-синие/тёплые фоны (navy-градиенты #1a237e/#0a0e27/#0d1442 и золотые hover #dabf8c) → холодный slate + синий герой-градиент как на my.ipd (linear-gradient(135deg,#3b82f6,#2563eb))
custom-dashboard — тёплые серые (#a0a09a/#606058/#808078/#252522/#1a1a18) заменены на slate (#94a3b8/#64748b/#334155/#263447); янтарные/оранжевые декоративные акценты карточек заменены на холодные (indigo/violet); статусные цвета светофора (зелёный/жёлтый/красный) сохранены как семантические
Версия
config/app.php — 1.2.1 → 1.2.2
config/instances.php — default agent version 1.2.1 → 1.2.2
resources/json/versions.json — добавлена запись 1.2.2
Задание 114. Платформа = связь данных: меню-логистика, экономия времени, ИИ вынесен
Платформа переосмыслена как обработчик складских данных (импорт/экспорт 1С в следующем этапе), а не как чат: ИИ-чат убран с рабочего стола (агент управляется через Telegram), не-логистические разделы скрыты из меню (Telegram-боты, карточки клиентов, отчёты, Google-таблицы, n8n, журнал синхронизации, системный монитор, старые движения, webchat-сессии — доступ сохранён по URL). Левое меню пересобрано в две группы: «Склад» и «Администрирование». На рабочем столе добавлен блок «Экономия времени»: число операций (operations + legacy movements) умножается на норматив ручной обработки (приход 15 мин, отгрузка 10 мин, перемещение 5 мин, инвентаризация 30 мин, заказ 4 мин) и показывается как сэкономленные часы за сегодня/неделю/месяц. Карточка KPI «Telegram» заменена на «Штрихкоды» (barcode-first учёт). Зелёный веб-виджет в правом нижнем углу сохранён. Платформа переведена на версию 1.2.1.
Меню = логистика
Группы — остались только «Склад» и «Администрирование»; «Чаты», «Отчёты», «Основное», «Интеграции» исчезли как пустые
Скрыты из меню (работают по URL): TelegramBots, ClientCards, AuditSummary, SystemMonitor, SyncLogs, N8nWebhookSettings, SheetConfig, WebchatSession, TelegramUser, MovementResource (устаревшая таблица движений)
ProductResource — перенесён из «Основное» в «Склад» (сортировка 1)
ИИ вынесен с платформы
AI-чат удалён с рабочего стола — блок с fetch(/admin/sheets/agent) заменён блоком «Экономия времени»
Ссылки навигации — убраны AI Агенты, AI Чат, Виджет, Telegram
Зелёный виджет (partials.ai_agent, BODY_END) — сохранён по указанию; управление агентами переходит в Telegram
Модель данных платформы расширена до целевых сущностей под задание 113 к логистике в рамках Задания 113: добавлены локации (locations), операции (operations) с позициями (operation_items) и журналом движения остатков (stock_moves — было→стало, delta, from/to location), а также штрихкоды (barcodes) для товаров. Паллеты и склады привязаны к локациям (pallets.location_id). В админ-панель добавлены Filament-ресурсы Location, Operation, StockMove и Barcode. Остаток теперь может вычисляться как результат операций, движение фиксируется с точностью до локации. Платформа переведена на версию 1.2.0.
Миграции
locations — code, kind, note (склады/паллетные зоны как локации)
operations + operation_items — документы и строки операций
FEFO-учёт по паллетам: приход/списание с приоритетом «стар» → «нов»
Паллеты теперь полноценно участвуют в операциях прихода и списания. Списание (take) распределяется по паллетам в порядке FEFO: сначала списывается с паллет со статусом «стар», затем «нов», затем без статуса. При подтверждении пользователь видит план распределения по паллетам. Приход (add) автоматически попадает на ту паллету, где уже есть остатки товара; если такой нет — создаётся новая паллета со статусом «нов» и автонумерацией. Поле «Статус поставки» (нов/стар) добавлено в админку PalletResource. Движения (Movement) привязаны к конкретной паллете, отмена (cancel) корректно работает с паллетным остатком. Тесты: FEFO-приоритет, приход на существующую паллету, приход с созданием новой паллеты.
FEFO-списание по паллетам
buildTakePlan — FEFO-распределение: стар(0) → нов(1) → без статуса(2), с сортировкой по ID
applyTakePlan — транзакционное списание по паллетам с Movement per pallet, проверка достаточности
Pending-сообщение — показывает план по паллетам: «22 стар: 1 короб.(24 шт), 9 нов: 1 короб.(24 шт)»
Приход на паллету
resolveAddPallet — находит существующую паллету товара; если нет — создаёт новую с номером «N нов»
Задание 111. Telegram-бот работает без ошибок и берёт данные с платформы
Исправление Telegram-бота @BBmsk_admin_bot под задание 111: бот без ошибок отвечает клиентам и берёт актуальные данные напрямую с платформы (база данных: товары и остатки), а не из внешних сервисов. Убрана китайская битая строка в приветствии и справке бота («Привет! Я бот Бобер Боб帮你管理库存ом» → корректный русский текст), исправлен битый placeholder «Например: поставщик,联系人...» в карточке Telegram-пользователя, smoke-тест бота переведён на публичный webhook /webhook/telegram/public. LLM-агент синхронизирован с конфигом: api=openrouter, model=openai/gpt-4o-mini. Платформа переведена на версию 1.0.3.
Telegram-бот без ошибок
Приветствие/справка - убрана битая китайская строка «帮你管理库存», текст заменён на «Привет! Я бот Бобер Боб, помощник по учёту склада»
AiAgentService - исправлены ответы unknown и help (строки 106 и 523)
Задание 109. Цвет — обновлена цветовая схема платформы (Material Design)
Обновление цветовой схемы админ-панели под задание 109: тёмная тема переведена с холодного серого zinc на тёплый нейтральный чёрный (стиль Terminal/Total Commander) с тёплыми светлыми оттенками текста и контрастом выше 6:1 (до ~11–17:1). Светлая тема приведена к единому профилю Google Material Design с тёмно-серыми буквами и контрастом выше 6:1. Первичный цвет primary изменён с серого (Color::Gray) на стандартный акцент Material Design Material Blue 600 (Color::Blue). Использованы стандартные цвета Google Material, рекомендованные при разработке. Платформа переведена на версию 1.0.2.
Тёмная тема — тёплый нейтральный чёрный (как Total Commander)
BG base - тёплый чёрный #161613 вместо холодного zinc-950 #09090b
BG surface/elevated - тёплые поверхности #1f1f1c / #2a2a26
Текст - тёплый белый #f5f5ef (≈17:1) и тёплые серые #d3d3cc (≈11:1), #b8b8b0 (≈9:1) вместо холодного #a1a1aa
Акцент - Material Blue 600 #1e88e5 (hover #1976d2)
Светлая тема — единый профиль Material Design
Текст - тёмно-серый #161616 (≈18:1), #3d3d3d (≈12:1), #5a5a5a (≈7:1) - контраст > 6:1 на белом
Фон - #f5f5f2, границы #d4d4cf
Акцент - Material Blue 600
Primary акцент
AdminPanelProvider - primary изменён с Color::Gray на Color::Blue
Кнопки, ссылки и активные элементы теперь используют стандартный Material Blue
Задание 108. Глобальное изменение - убираем Google и чаты (часть 2)
Вторая итерация глобальной перестройки платформы под задание 108: Telegram-бот полностью переведён на прямую работу с базой данных платформы (запись прихода/расхода, движения, остатки) без обращения к Google Таблицам. Все вызовы экспорта/импорта/синхронизации с Google удалены из пути работы агента и Telegram-бота: из AiAgentService убраны syncStockToSheet и logMovementToSheet, кнопка «Синхронизировать» (импорт из Google) убрана из списка товаров. Данные хранятся в базе платформы (Stock, Movement), часть данных не удалялась. Платформа переведена на версию 1.0.1.
Telegram-бот работает с базой напрямую
Схема «Telegram-бот → БД» — приход/расход/отмена пишутся сразу в таблицы Stock и Movement платформы; лишние вызовы в Google убраны
AiAgentService — удалены блоки syncStockToSheet и logMovementToSheet из executeOperation и handleCancel; удалён конструктор GoogleSheetService и setSheetService
ConfiguresSheetServices — больше не настраивает Google-сервис для агента, только источник (source)
Google: убраны обращения
Импорт из Google — кнопка «Синхронизировать» в списке товаров (ProductSyncService) удалена
Экспорт/синхронизация — вызовы записи в Google Таблицы (updateCell, appendRow, ensureSheet) больше не вызываются из пути работы агента и Telegram-бота
Данные не удалены — конфигурация Google Таблиц и накопленные данные (last_sync_data) сохранены в базе
Версия
config/app.php — версия 1.0.0 → 1.0.1 (env('APP_VERSION', '1.0.1'))
resources/json/versions.json — добавлена запись 1.0.1
Проверка — на bober-bob.ipd.test версия платформы теперь 1.0.1
Задание 107. Глобальное изменение - убираем Google и чаты
Первая итерация глобальной перестройки платформы под задание 107: левое меню освобождено от лишних точек коммуникации (тестовый/стейдж/прод чаты, Webchat-сессии, AI-чаты, AI-агенты), оставлена единственная точка общения с клиентами - Telegram-бот. Google-дашборд скрыт из навигации, пути страниц сохранены для обратной совместимости. Платформа переведена на версию 1.0.0.
Система светофора рабочего стола расширена с 6 до 11 блоков: добавлены Товары, Остатки, Склады, Версии/релизы и AI-агенты. Сводный индикатор теперь охватывает весь жизненный цикл платформы — от каталога товаров и движения остатков по складам до выпуска новых версий и подключения ИИ-агентов к нейросети.
Новые блоки светофора
Товары — зелёный при недавнем обновлении каталога, красный при давнем изменении, серый если каталог пуст; показывает число активных товаров
Остатки — статус по последнему движению средств/товара, показывает суммарное количество единиц в стоках
Склады — количество активных складов, серый при отсутствии активного склада
Версии / релизы — статус по дате последнего релиза из журнала версий, показывает число релизов
AI-агенты — зелёный если хотя бы один агент подключён к LLM, жёлтый при работе только на regex; отдельно показывает число агентов с нейросетью
Изменения в UI
Расширенный блок «Что требует внимания» — новые красные/жёлтые блоки попадают в список проактивных уведомлений с человеческим объяснением и ссылкой
Сетка карточек — увеличена с 6 до 4 колонок (xl:grid-cols-4) для размещения 11 блоков
Иконки — у всех карточек заданы корректные иконки heroicons (cube, archive-box, building-office-2, code-bracket, user-group)
Backend bober-bob
app/Services/TrafficLightService.php — добавлены методы productsStatus/stocksStatus/warehousesStatus/versionsStatus/aiAgentsStatus
resources/views/filament/pages/custom-dashboard.blade.php — рендер новых блоков и поле «с LLM» у AI-агентов
resources/json/versions.json — добавлена запись 0.31.1
Рабочий стол 2.0: система светофора и проактивные уведомления
Рабочий стол стал центром навигации: сверху — «Светофор системы» с цветными индикаторами (зелёный/жёлтый/красный/серый) по всем ключевым блокам платформы (Пользователи, Движения, Google Таблица, AI-чаты, ИИ-агент виджет, Telegram-бот), клик по карточке ведёт в соответствующий раздел. Подсветка сотрудникам: есть ли заходы, когда было движение средств, когда обновлялась таблица, кто и когда писал ИИ-агенту.
Светофор рабочего стола
6 карточек-светофоров — Пользователи, Движения, Google Таблица, AI-чаты, ИИ-агент (виджет), Telegram-бот — каждая с цветным индикатором, датой последней активности и ссылкой-переходом в раздел
Зелёный — активность до 3 дней, жёлтый — 4–7 дней, красный — более 7 дней или ошибка/нет настроек, серый — блок не используется
Общий статус — сводная лампа сверху: красный если любой блок красный, иначе жёлтый при жёлтых, иначе зелёный
Проактивные уведомления
Что требует внимания — список красных/жёлтых блоков с человеческим объяснением проблемы и ссылкой для перехода («Никто не заходил на платформу», «Google Таблица не обновлялась», «Не было движения средств»)
Счётчик — количество требующих внимания пунктов в шапке светофора
Трекинг входов
users.last_login_at/last_login_ip — теперь записываются при каждом логине (слушатель события Login в AppServiceProvider, работает и для Filament, и для switchUser)
Светофор «Пользователи» — показывает красный, если никто не заходил, и дату последнего входа
Backend bober-bob
app/Services/TrafficLightService.php — новый сервис: статусы всех блоков, пороги 3/7 дней, список «пристального внимания»
DashboardOverview — методы getTrafficStatuses/getTrafficAttention/getTrafficOverall
custom-dashboard.blade.php — блок светофора в начале рабочего стола
Доступность: минимальный шрифт 14px и контраст 6.55:1 по всей платформе
Весь интерфейс платформы приведён к единому стандарту доступности: минимальный размер шрифта 14px, контраст текста 6.55:1 (выше требования WCAG AA 4.5:1). Исправлено 47 жёстко заданных font-size меньше 14px, 100+ Tailwind-классов text-xs (12px) заменены на text-sm (14px), приглушённый цвет #71717a (4.5:1) заменён на #a1a1aa (6.55:1) в 60 местах.
100+ text-xs (12px) — заменены на text-sm (14px) в 16 blade-файлах (dashboard, ai-chat, ai-agents, client-cards, audit-summary, system-monitor, n8n-webhook-settings, google-sheets-dashboard и др.)
Настройка типографики — опция «12px — Маленький» удалена из админ-панели (SettingsTypography), минимум теперь 14px
Контраст 6.55:1
#71717a (4.5:1) — заменён на #a1a1aa (6.55:1) в 60 местах: палитра CSS (--text-muted), webchat, ai-chat, ai-agents, dashboard, таблицы
Тёмная тема — все приглушённые тексты теперь читаемы на фоне #09090b
files — resources/css/app.css, все blade-шаблоны ресурсов и страниц Filament
Backend bober-bob
config/app.php — версия 0.30.0 → 0.30.1
Безопасность — /telegram-chat и /telegram-chat/{id} переведены за middleware auth (ранее публично доступна вся история чатов)
Проверка — /about и /admin/settings/versions показывают v0.30.1 с бейджем «Текущая»
Полноценный AI-агент: веб-чат, Telegram-бот через LLM, аналитика сессий
AI-агент полностью подключён к LLM (OpenRouter, gpt-4o-mini): веб-виджет на публичных страницах, Telegram-бот @BBmsk_admin_bot отвечает через ИИ вместо regex-меню, в админке — просмотр всех сессий с перепиской, латентностью ответов и захватом лидов. База знаний 45 товаров, системный промпт, webhook-маршруты для n8n.
Веб-чат AI
ai_agent.blade.php — виджет веб-чата: плавающая кнопка, панель с историей, подсказками, захватом лидов и rate-limit
WebchatController — 5 API-методов: send, history, track, suggestions, lead
WebchatService — бэкенд агента: обработка через LLM, сохранение в AiConversation, уведомление администратора в Telegram
Telegram-бот через LLM
SheetController::telegramWebhook — вызов processWithAgent вместо regex-меню; фолбэк на env('AI_OPENAI_KEY') при пустом кеше
Профессиональная страница версий: единый источник данных, 50 записей, детализация по секциям
Страница версий (/admin/settings/versions) переведена на единый источник данных resources/json/versions.json — ту же базу, что и страница /about. Отображаются 50 последних версий с полной детализацией: заголовок, описание, секции с техническими деталями и результатами. Каждая версия — карточка с бейджем типа (major/minor/patch), датой и пометкой «Текущая» для активной.
Единый источник версий
SettingsVersions.php — чтение из resources/json/versions.json вместо таблицы versions в БД; страница /about и /admin/settings/versions теперь используют один источник
resources/json/versions.json — единый ресурс: 47 записей (v0.1.0–v0.29.2), каждая с version, date, title, description, sections[{title, items}]
Результат — больше нет дублирования данных между страницами; обновление одной обновляет обе
Детализация по секциям
Каждая версия — заголовок, описание, секции с техническими деталями (какие файлы изменены, что сделано, какой результат)
Секции — группы изменений: например, «Фавикон и иконки», «PWA (установка как приложение)», «Backend bober-bob»
Формат — Markdown-жирный (**) для имён файлов и ключевых слов, человекочитаемые описания для каждого пункта
Отображение 50 записей
Лимит 50 — показываются 50 последних версий без пагинации; достаточно для полной картины истории платформы
Сортировка — от новой к старой (как в versions.json); текущая версия помечена бейджем «Текущая»
Карточки — каждая версия в отдельном блоке с hover-эффектом и цветовой маркировкой по типу
Backend bober-bob
config/app.php — версия 0.29.1 → 0.29.2 (env('APP_VERSION', '0.29.2'))
resources/json/versions.json — добавлена запись 0.29.2
Проверка — /admin/settings/versions показывает 50 версий с полной детализацией
Фавикон и PWA: иконка сайта в браузере и установка как приложение
Платформа получила современный фавикон и иконки PWA: теперь сайт узнаваем в браузере (вкладка, закладки) и красиво устанавливается как приложение на Android с подписью «Бобер Боб». Иконка выполнена в фирменном стиле: тёмно-синий градиент и золотое «созвездие» с логотипа.
Фавикон и иконки
public/favicon.svg — основной фавикон (SVG, современный формат, масштабируется без потерь)
public/favicon.ico — многоразмерный ICO (16/32/48) для старых браузеров и системных значков
Проверка сайта: исправлен раздел «Безопасность», вход «Запомнить меня» ~3 месяца, индикатор платформы в Telegram-ботах
Проверка тестовой площадки после недельного перерыва: восстановлен раздел «Безопасность» (падал с ошибкой при открытии), «Запомнить меня» на странице входа теперь включён по умолчанию и действует ~3 месяца (как у Google — повторный ввод пароля лишь спустя время, а не при каждом заходе), на странице «Телеграм боты» показана текущая платформа (test/stage/prod) и адрес n8n-telegram.
Раздел «Безопасность»
app/Filament/Pages/Security.php — запрос таблицы сессий переведён с DB::table() на Eloquent-модель (Filament требует Eloquent Builder); раньше страница падала с TypeError при открытии
app/Models/Session.php — новая модель для таблицы sessions (id-строка, каст last_activity в datetime)
Результат — раздел открывается: смена пароля и список активных сессий с кнопкой «Завершить остальные сессии»
Вход «Запомнить меня»
app/Filament/Auth/CustomLoginPage.php — чекбокс «Запомнить меня» включён по умолчанию (default(true))
config/auth.php — для guard web задан срок cookie «запомнить меня» 129600 минут (~3 месяца, 90 дней) вместо дефолтных 400 дней
Результат — после входа платформа помнит пользователя ~3 месяца, пароль спрашивается заново только после этого срока, а не при каждом заходе
Индикатор платформы в Telegram-ботах
app/Filament/Pages/TelegramBots.php — метод getPlatform(): текущий инстанс (test/stage/prod), его label, url и базовый адрес n8n-telegram
resources/views/filament/pages/telegram-bots.blade.php — бейдж «Платформа: Тестовый чат» с цветовой меткой и ссылкой на площадку + адрес n8n
Результат — сразу видно, с какой площадки смотрят переписку ботов
Backend bober-bob
config/app.php — версия 0.27.0 → 0.27.1 (env('APP_VERSION', '0.27.1'))
resources/json/versions.json — запись 0.27.1 добавлена в начало истории
Проверка — на bober-bob.ipd.test версия платформы теперь 0.27.1
Верхний правый угол админ-панели: подпись пользователя и уведомления
Верхний правый угол админ-панели переработан: рядом с аватаром теперь подпись пользователя (имя и роль), появился колокольчик уведомлений с красным бейджем-циферкой непрочитанных событий (как в YouTube), список уведомлений в выпадающей панели и полноценная страница уведомлений с отметкой прочитанными.
Подпись пользователя
app/Providers/Filament/AdminPanelProvider.php — renderHook USER_MENU_BEFORE выводит блок с именем и ролью пользователя слева от аватара в верхнем правом углу
resources/views/filament/user-menu-caption.blade.php — имя + человекочитаемая роль (Администратор / Кладовщик / Поставщик / Тестировщик), тёмная тема учтена
Вместо анонимной буквочки — администратор сразу видит, кто зашёл в систему и с какой ролью
Колокольчик уведомлений
AdminPanelProvider.php — включён встроенный механизм Filament database notifications: колокольчик в топбаре с красным бейджем количества непрочитанных, выпадающий список последних событий
Модалка — список уведомлений, отметка «прочитано/не прочитано», удаление, «Отметить все прочитанными»
Страница уведомлений
app/Filament/Pages/Notifications.php — страница /admin/notifications (группа «Администрирование») с таблицей всех уведомлений: заголовок, описание, дата, статус прочтения
Действия — «Отметить прочитанным / непрочитанным», «Удалить», bulk «Удалить выбранные», кнопка «Отметить все прочитанными»
Версия платформы в нижнем левом углу админ-панели (футер сайдбара Filament) стала кликабельной ссылкой: теперь администратор может перейти по ней на страницу /admin/settings/versions и посмотреть полную историю версий платформы. Раньше это был обычный текст без ссылки.
Футер админ-панели
app/Providers/Filament/AdminPanelProvider.php — renderHook SIDEBAR_FOOTER: версия v{config('app.version')} обёрнута в ссылку на url('/admin/settings/versions')
Стили — сохранены классы футера (p-4, text-center, text-xs, border-t), добавлены hover:underline и hover:text-серый для явной индикации кликабельности
Удобство — версия в футере ведёт на страницу «Версии», где виден changelog всех релизов и «Информация о системе»
Единый источник версий
config/app.php — версия 0.26.0 → 0.26.1 (env('APP_VERSION', '0.26.1'))
resources/json/versions.json — добавлена запись 0.26.1 наверх списка; страницы /about и /admin/settings/versions показывают актуальную версию
Проверка — футер админки: клик по версии открывает /admin/settings/versions
Витрина «О платформе» (/about) и единый источник версий
Страница /about полностью переработана в витрину в стиле admin-platform-heart: hero-блок с текущей версией платформы, сетка возможностей (складской учёт, Telegram-боты, ИИ-агенты, Google Таблицы, RBAC, отчёты), блок «Информация о системе» (PHP, Laravel, MariaDB, сервер), блок доверия (ООО «Студия ИПД»), контакты (Алексей Гапеев: Telegram/телефон/email) и история версий. Устранён источник дублирования: жёстко зашитый массив версий в routes/web.php удалён, страница /about теперь читает единый ресурс resources/json/versions.json (как и /admin/settings/versions). Версия платформы поднята до v0.26.0.
Витрина /about
Hero-блок — брендинг Бобер Боб (navy #0a0e27 + gold #c9a96e), бейдж «Платформа складского учёта», текущая версия платформы (config app.version)
Возможности — 6 карточек: складской учёт, Telegram-боты, ИИ-агенты, Google Таблицы, RBAC и безопасность, отчёты и экспорт
Информация о системе — версия платформы, PHP, Laravel + Filament v5 + Livewire, MariaDB utf8mb4, Bcrypt + Spatie Permission, сервер VDS 185.66.68.122 Ubuntu 22.04
Доверие — блок «Платформу развивает ООО «Студия ИПД»» с пояснением про юридическое лицо
Контакты — карточка Алексея Гапеева, ссылки Telegram @aleksey_gapeev, телефон +375 29 576-39-28, email info@ipd.by
История версий — рендер всех записей versions.json с бейджами типа (major/minor/patch) и меткой «Текущая» на активной версии
Полезные ссылки — «Войти в систему», «Админ-панель», ipd.by
Тёмная тема — только тёмный стиль, адаптив под мобильные
Добавлена страница «Карточки клиентов» (/admin/client-cards, группа «Чаты»): список карточек клиентов бота bober-bob-client с синхронизацией с живым n8n-telegram.ipd.by (первоисточник). Персональный контекст клиента хранится в файле ai-kb/bots/bober-bob-client/clients/{telegram_id}.md на n8n-telegram и при разговоре подгружается ботом. Управление из админки bober-bob: просмотр списка (данные с живого через api/clients_list.php), создание новой карточки, редактирование и удаление. Запись/правка идёт через admin/action.php живого n8n-telegram (import_contact, kb_save, delete_contact) с использованием нового N8N_TELEGRAM_ADMIN_TOKEN из .env. Добавлен селектор ботов, детальный просмотр карточки с историей чата, подтверждение удаления и тосты об успехе/ошибке. Версия обновлена до v0.25.0.
Страница «Карточки клиентов»
Список клиентов — загрузка с живого n8n-telegram (api/clients_list.php: support-clients.md + clients/*.md + chat_history/*.md), кеш 60 сек, refresh=0 байпас кеша
Детали карточки — имя, telegram_id, бот, персональный контекст (markdown) и история чата (последние ходы)
Селектор ботов — переключение между ботами n8n-telegram (по умолчанию bober-bot-client)
Создание/редактирование — модал с полями (имя, telegram_id, контекст); создание через action.php create_client_card + kb_save, правка через import_contact/kb_save
Удаление — delete_contact с подтверждением; тосты об успехе/ошибке
API n8n-telegram
api/clients_list.php — POST с secret + target_bot_id; парсит support-clients.md, clients/*.md, chat_history/*.md; отдаёт {ok, target_bot_id, count, clients[]}
admin/action.php — AJAX-ответы JSON при ajax=1 или X-Requested-With: XMLHttpRequest для delete_contact, kb_save, create_client_card, import_contact (hub_ajax_reply)
Права — ai-kb/bots/bober-bot-client на живом: www-data:www-data (755, файлы 644); 11 эталонных файлов синхронизированы с локалью
Backend bober-bob
N8N_TELEGRAM_ADMIN_TOKEN — добавлен в .env/.env.example, ключ config/services.php admin_token
N8nTelegramService — getClients (кеш 60 сек, refresh=0 байпас), saveClientCard, deleteClientCard, createClientCard, saveClientFile, приватный postAdminAction (form POST на action.php?token=..., заголовок X-Requested-With)
ClientCardsController — index/save/delete/create; маршруты GET /admin/client-cards/data, POST /admin/client-cards/save|delete|create
Filament-страница — ClientCards (slug client-cards, группа «Чаты», navigationSort=13) + blade-шаблон
Проверка — полный php artisan test зелёный (кроме предсуществующего ExampleTest 302); live-проверки api/clients_list.php (count=2) и action.php (kb_save → {"ok":true}) на живом n8n-telegram.ipd.by
Автообновление переписки и подсказки по настройке ботов
Раздел «Телеграм боты» (/admin/telegram-bots) теперь обновляет переписку автоматически: каждые 15 секунд выполняется тихий poll с refresh=1, открытый диалог при обновлении не сворачивается, а новые ходы появляются сами с уведомлением «Появились новые сообщения». Добавлен переключатель «Автообновление: вкл/выкл» и живой индикатор «Обновлено: N сек назад». Исправлен корневой баг обновления: Cache::remember с TTL=0 возвращал устаревшие данные из кеша, из-за чего кнопка «Обновить» фактически не подтягивала свежие ходы — теперь refresh=1 полностью обходит кеш (getConversations/getConversationsWithMeta при cacheSeconds<=0 читают источник напрямую). Добавлен сворачиваемый блок «Как настроить бота»: подсказки про bot_id и target_bot_id, отправку ходов из n8n в api/log_turn.php, настройки N8N_TELEGRAM_BASE_URL/N8N_TELEGRAM_API_SECRET в .env, автообновление, тест соединения и получение прямой ссылки на сессию. Версия обновлена до v0.24.6.
Автообновление
Тихий poll каждые 15 секунд — loadConversations(refresh, silent) с refresh=1; открытый диалог не сворачивается, меню и модалы не перекрываются
Уведомление о новых сообщениях — при росте числа ходов показывается toast «Появились новые сообщения»
Переключатель — «Автообновление: вкл/выкл» в шапке страницы; пауза при открытых модалах и скрытой вкладке (document.hidden)
Индикатор свежести — «Обновлено: только что / N сек назад / N мин назад» в карточке бота
Исправление refresh (корень жалобы)
Баг — Cache::remember(key, 0, …) сначала читал живой ключ и возвращал устаревшие данные; refresh=1 не сбрасывал кеш
Фикс — N8nTelegramService: при cacheSeconds<=0 getConversations/getConversationsWithMeta идут напрямую в fetchRaw, минуя Cache::remember
Проверка — тест: новый ход на n8n-telegram появляется в ответе при refresh=1 сразу, без ожидания 60 сек
Подсказки по настройке
Блок «Как настроить бота» — сворачиваемая карточка: bot_id = target_bot_id, отправка ходов в api/log_turn.php, N8N_TELEGRAM_BASE_URL/N8N_TELEGRAM_API_SECRET в .env
Практика — автообновление каждые 15 сек, тест соединения, получение прямой ссылки на сессию через «⋯»
Технически
config/app.php — версия 0.24.5 → 0.24.6
routes/web.php — /about: блок 0.24.6
N8nTelegramService — приватный fetchWithMeta, ранний выход из кеша при cacheSeconds<=0
Тесты — TelegramBotsTask76Test: автообновление на странице, подсказки, refresh обходит кеш, новые ходы подтягиваются сразу, отсутствие утечки секрета (9 тестов, 34 ассерта)
Проверка — полный php artisan test зелёный (кроме предсуществующего ExampleTest 302); E2E в headless Chrome
Телеграм боты: шрифт и контраст, кебаб-меню переписки, публичные ссылки на диалоги, нумерация диалогов
В разделе «Телеграм боты» (/admin/telegram-bots) шрифт интерфейса увеличен с 8-10px до 14px и усилен контраст текста (метки и значения вместо серых тонов). У каждой переписки появилось кебаб-меню с пунктами «Скопировать ссылку» и «Открыть в новом окне». Реализованы публичные ссылки на диалоги: при выборе пункта меню снимок диалога (имя бота, username, имя пользователя, пары «вопрос → ответ») сохраняется в таблицу telegram_conversation_shares (токен Str::random(40), уникальность по bot_key+session_id) и доступен без авторизации по /shared/telegram/{token}. Диалоги пронумерованы №1/№2/... и выводится общее число переписок. Версия обновлена до v0.24.5.
Страница Телеграм боты
Шрифт 14px — тексты интерфейса переведены с 8-10px на 14px (text-sm), значения читаемые (text-gray-800/text-gray-100 вместо серого на сером)
Кебаб-меню переписки — у каждого диалога пункты «Скопировать ссылку» (в буфер обмена, toast) и «Открыть в новом окне» (window.open)
Публичная ссылка — снимок диалога сохраняется в telegram_conversation_shares и доступен без авторизации по /shared/telegram/{token}
Нумерация диалогов — №1/№2/... на каждой переписке и общее число переписок
TelegramShareController.store — snapshot свежего диалога (без кеша) в таблицу, firstOrNew по (bot_key, session_id), отдаёт ok/token/url; только для авторизованных
TelegramShareController.show — публичный просмотр по токену, view telegram-share (noindex)
routes/web.php — POST /admin/telegram-bots/share (auth), GET /shared/telegram/{token} (public)
Телеграм боты: раздел в настройках, управление ботами, переписка из n8n-telegram
Добавлен раздел «Телеграм боты» (/admin/telegram-bots) по образцу «ИИ агентов»: вкладки-селектор ботов (ботов может быть несколько), карточка выбранного бота (имя, username, bot_id, статус, число диалогов/сообщений, время и латентность обновления), панель переписки с раскрывающимися диалогами и парами «вопрос → ответ» из n8n-telegram (admin_dump.php, кеш 60 сек). Управление ботами — модал настроек (имя, username, описание, вкл/выкл, сброс к заводским), кебаб-меню, тест соединения с n8n-telegram и кнопка «Обновить». В /admin/settings добавлена карточка «Телеграм боты». Секрет API n8n-telegram убран из config/services.php в .env (N8N_TELEGRAM_BASE_URL, N8N_TELEGRAM_API_SECRET). TelegramBotConfigService хранит ботов в кеше (settings.telegram_bots) аналогично ai_agents. N8nTelegramService получил getConversationsWithMeta (ошибки, статус, латентность, fetched_at) и отдаёт явный ответ «данные не приходят» при недоступности API. Версия обновлена до v0.24.4.
Страница Телеграм боты
Вкладочки-селектор — список ботов (name + username + зелёный/серый статус); при нескольких ботах переключение между ними
Карточка бота — bot_id, статус «Включён/Выключен», число диалогов и сообщений, время обновления, латентность API
Переписка — раскрывающиеся диалоги, пары «вопрос пользователя → ответ бота» с цветовой маркировкой и временем, авто-скролл вниз, ссылка на дашборд n8n-telegram
Кебаб-меню — Настроить, Тест соединения, Обновить данные, Включить/Выключить (телепорт в body)
ИИ-агенты: карточки со статусом, настройки, тест соединения, реальное подключение LLM
Раздел «AI Агенты» (/admin/ai-agents) переработан из формы в наглядные карточки: зелёный индикатор «Включён» (виден и на тёмной теме), детальная информация об агенте (версия, модель, API, тариф, подключение, источник данных, база знаний, баланс/токены), кебаб-меню с быстрым включением/выключением. Настройки каждого агента открываются модалом: имя, модель, провайдер API (regex/OpenAI/OpenRouter/Anthropic), API URL, API-ключ (хранится зашифрованным и показывается частично), подключение, источник данных, описание, база знаний, методология, вкл/выкл, сброс к заводским. Добавлены кнопка «Тест соединения» (проверяет агента: детерминированный режим или реальный вызов LLM) и автоматический запрос баланса (кредиты OpenAI/OpenRouter). В /admin/settings добавлена карточка «ИИ агенты». Реальная LLM-интеграция: AiAgentService.processWithLLM (OpenAI-совместимый chat/completions и Anthropic messages) с системным промптом на базе знаний и актуальных остатков склада; dispatch по агенту в SheetController.agentCommand: если у агента указан API-ключ — отвечает LLM, иначе — детерминированный regex-парсер. API-ключи — только в .env (AI_API, AI_OPENAI_KEY) и в шифрованном виде в кэше настроек. Версия обновлена до v0.24.3.
Страница AI Агенты
Карточки агентов — имя, ключ, зелёный/серый статус «Включён/Выключен» (работает на тёмной теме), метка провайдера
Информация об агенте — версия, модель, API, тариф, подключение, источник данных, статус API-ключа (маскирован), баланс/токены, база знаний
Кебаб-меню — Настроить, Тест соединения, Включить/Выключить (телепорт в body, как в ai-chat)
Модал настроек — все поля агента + зелёный переключатель «Включён» + Сбросить к заводским
Модал теста соединения — результат, латентность, пример ответа, повторный тест
Реальная LLM-интеграция
AgentConfigService — единый доступ к конфигурации агентов: дефолты config/instances.php + оверрайды кэша; API-ключ шифруется (Crypt::encryptString) и нигде не выводится целиком
AiAgentService.processWithLLM — OpenAI-совместимый POST {api_url}/chat/completions и Anthropic /messages; системный промпт из роли, методологии, базы знаний и актуальных остатков склада (stockSnapshot)
SheetController.agentCommand — диспетчер по агенту: есть API-ключ → LLM, иначе regex; выключенный агент отвечает отказом
Баланс — кредиты OpenAI (dashboard/billing/credit_grants) и OpenRouter (credits); для regex — «Встроенный (бесплатно)», для Anthropic — «не публикуется»
Настройки и безопасность
/admin/settings — новая карточка «ИИ агенты» → /admin/ai-agents
API-ключи — только в .env (AI_API, AI_OPENAI_KEY) и шифрованными в кэше; в интерфейсе — только маска sk-…xxxx
Тесты — Task67Test обновлён под новую страницу; добавлены тесты endpoints update/test/balance и LLM-пути с Http::fake
Технически
config/app.php — версия 0.24.2 → 0.24.3
routes/web.php — POST /admin/ai-agents/update, POST /admin/ai-agents/test, GET /admin/ai-agents/balance
Проверка — полный php artisan test зелёный; E2E в headless Chrome (карточка в settings, статусы, модал настроек, тест)
Кебаб-меню работает: телепорт на <template>, модалы в скоупе, публичные ссылки диалогов
Исправлена ошибка из 0.24.1: меню «появлялось, но раздвигало поле» — Alpine предупреждал «x-teleport can only be used on a <template> tag»: директива была на <div>, из-за чего Alpine не инициализировал поддерево (без позиционирования и обработчиков, оверлей блокировал клики). Теперь единое меню на уровне страницы: <template x-teleport="body"> с x-show (элемент всегда в DOM — стили и клики работают), position:fixed по координатам кнопки «⋯», z-index 1000, закрытие прозрачным оверлеем. Модалы (Агенты, Поделиться, Редактировать, Оценить, Заметки, Удалить) перенесены внутрь x-data — пункты меню открывают их. Ссылки диалогов публикуются через уже публичный маршрут /admin/shared-conversation/{token} (без авторизации — можно открыть в инкогнито и передать клиенту). Версия обновлена до v0.24.2.
Исправление кебаб-меню (корень бага)
x-teleport только на <template> — в Alpine 3 директива работает исключительно на шаблоне; на <div> она не телепортировала меню, Alpine ронял инициализацию (cloneNode), меню оставалось в потоке и раздвигало таб-бар
Единое меню на уровне страницы — <template x-teleport="body"> вне цикла вкладок; x-show вместо x-if, чтобы элемент всегда был в DOM
position: fixed + getBoundingClientRect() — координаты по кнопке «⋯», прижатие к границам окна
Закрытие прозрачным оверлеем — fixed inset-0 z-index 999 перехватывает клики мимо меню (без гонки кликов, которая была у @click.outside с телепортом)
Модалы внутри x-data — Агенты/Поделиться/Редактировать/Оценить/Заметки/Удалить теперь в скоупе страницы, пункты меню открывают их
Публичные ссылки диалогов
/admin/shared-conversation/{token} — маршрут вне middleware auth: ссылку можно открыть без входа (инкогнито) и передать клиенту
Поделиться из меню — публикация создаёт share_token и URL; копирование кнопкой в модале
Технически
config/app.php — версия 0.24.1 → 0.24.2
Тесты — Task67Test расширен (assertSee menuConv/closeTabMenu), общий прогон зелёный
Проверка — воспроизведение в headless Chrome (Playwright) до и после фикса, E2E-проверка публичной ссылки без авторизации
Исправлен баг в /admin/ai-chat: кебаб-меню вкладки диалога обрезалось скролл-контейнером таб-бара (overflow-x-auto) и карточкой чата (overflow-hidden) — меню «загружалось тремя пикселями внизу» и перекрывалось другими элементами. Меню теперь телепортируется в <body> через Alpine x-teleport, позиционируется position:fixed по координатам кнопки «⋯» (расчёт через getBoundingClientRect), z-index поднят до 1000 — меню видно целиком, поверх всего, и не создаёт лишний скролл. Добавлены методы openTabMenu/closeTabMenu, меню закрывается по клику вне его (click.outside). Версия обновлена до v0.24.1.
Дизайн чата: вкладки диалогов, большое поле ввода, агенты и их настройки
Интерфейс /admin/ai-chat переработан по требованиям Алексея: диалоги стали вкладочками-переключателями сверху (чат больше не уезжает вниз при множестве диалогов, при загрузке сразу виден первый диалог — скроллить не нужно). Поле ввода стало большим и раздвигающимся (минимум 2 строки, авто-рост до 50% высоты окна, растягивается за угол) с явной видимой кнопкой «Отправить» и индикатором «Отправка…». У каждого диалога — кебаб-меню (Поделиться, Редактировать, Оценить, Заметки, Удалить) и копирование ссылки у опубликованных. Добавлен знак «?» об агентах: модал показывает, чем отличаются агенты — описание, модель, подключение, база знаний, методология. Создана страница настройки агентов /admin/ai-agents с формой (имя, модель, подключение, описание, база знаний, методология, вкл/выкл). Агенты описаны в config/instances.php (default/analyst/support). Версия обновлена до v0.24.0.
Дизайн чата (требования Алексея)
Диалоги вкладочками — таб-бар сверху: «Новый диалог» + вкладка на каждый диалог; при загрузке автоматически открыт первый диалог; чат не смещается вниз при многих диалогах
Большое поле ввода — textarea rows=2, resize-y, min-h-[76px], авто-рост до 50% высоты окна, растягивается за угол вниз
Явная кнопка «Отправить» — видимая, со спиннером и текстом «Отправка…» во время запроса
Кебаб-меню на вкладке — Поделиться / Редактировать / Оценить / Заметки / Удалить; у опубликованных — иконка-ссылка копирования
Знак «?» об агентах — модал «Агенты платформы»: у каждого агента описание, модель, подключение, база знаний, методология и статус
Дизайн чата как в ChatGPT: бетонный фон, полный ввод, явный шаринг
Интерфейс /admin/ai-chat переработан под стиль ChatGPT. Убран коричневый фон (панель Filament переведена с золотого #c9a96e на серый Color::Gray; тёмная тема заменена с «кирпичной» на серый бетон). Поле ввода растягивается на всю ширину, автоматически растёт по мере набора, отправка по Enter (Shift+Enter — новая строка). Список диалогов и область сообщений прокручиваются независимо. Кнопка «Поделиться» в шапке и в меню диалога открывает модал с явными действиями «Опубликовать» / «Отменить публикацию»; у опубликованных диалогов в списке слева появилась кнопка копирования ссылки. Версия обновлена до v0.23.1.
Полная история версий: ретроспективное версионирование
Проведена полная ревизия всех 55+ заданий проекта Бобер Боб. Восстановлена непрерывная история версий: задокументированы 11 ранее пропущенных версий (v0.11.0→v0.20.0). Каждая версия содержит заголовок, техническое описание и секции с детализацией. Страница /admin/settings/versions обновлена. Версия обновлена до v0.20.1.
Версионирование
Ретроспектива — проанализированы 55+ файлов заданий и отчётов за 30.07.2026
Telegram-диалоги на дашборде: интеграция с n8n-telegram
Дашборд Google Sheets теперь отображает историю Telegram-диалогов бота @BBmsk_admin_bot. Создан N8nTelegramService, который проксирует данные из API n8n-telegram.ipd.by (admin_dump.php) и группирует по сессиям. Карточка Telegram Бот на дашборде стала интерактивной: раскрывающийся список диалогов с сообщениями пользователя и ответами AI. Добавлен публичный эндпоинт POST /webhook/telegram-log для прямой отправки ходов из n8n в bober-bob.
Архитектура
N8nTelegramService — сервис с кешированием (60 сек), группировка по сессиям, парсинг JSON
TelegramController — conversations() для дашборда (auth) + logTurn() для n8n (public)
Маршруты — GET /admin/telegram/conversations, POST /webhook/telegram-log
Дашборд
Telegram Бот — карточка с количеством диалогов, раскрывающийся список сессий
Каждая сессия — user → bot пары с цветовой маркировкой (голубой/серый)
Live-обновление — данные с кешированием 60 сек через n8n-telegram API
Исправлен стиль чата AI-агента на дашборде: сообщения ассистента перекрашены в серую гамму (bg-gray-200, text-gray-800, border-gray-400). Созданы две новые страницы в sidebar: «n8n Webhook» (N8nWebhookSettings) в группе «Интеграции» и «Мониторинг системы» (SystemMonitor) в группе «Основное». Версия обновлена до v0.19.0.
Создан N8nWebhookController с эндпоинтами POST /webhook/ai (приём запросов, логирование в AiConversation, вызов AiAgentService, JSON-ответ) и GET /webhook/ai/health (диагностика со статусом таблицы). Добавлен Bearer token auth через config('services.n8n.webhook_secret'), CSRF-исключение, дашборд-карточка с тестовой формой.
AI-диалоги: AiConversation модель и SheetController
Создана модель AiConversation с миграцией (conversation_id, user_id, telegram_chat_id, role, content, metadata, agent, source). Разработан SheetController с тремя методами: conversations() — получение истории диалогов, agentCommand() — вызов AI-агента из панели, telegramWebhook() — приём Telegram-запросов с отправкой ответов. Создана страница AiChat (sidebar, группа «Интеграции») для просмотра всех диалогов.
Страницы SyncLogs, Settings, Security и AuditSummary переписаны с использованием стандартных компонентов Filament. Blade-шаблоны сокращены: кастомный HTML-код форм заменён на {{ $this->form }}. Исправлен конфликт reset() с Livewire (переименован в resetForm()). Старые CSS-правила (fi-section-content) удалены.
Платформа переведена на принудительную тёмную тему: удалён переключатель light/dark, все шаблоны используют только dark-варианты стилей. Основной фон — bg-gray-900, текст — text-gray-200/300/400/500. Единая мягкая цветовая схема для панели настроек и безопасности. Исправлен рендеринг SVG-иконок (@svg() → x-filament::icon).
Тёмная тема
Принудительный dark-mode — переключатель light/dark удалён, все элементы только dark
Синхронизация с Google Таблицей и журнал синхронизации
Добавлена синхронизация товаров с Google Таблицей: ProductSyncService с автоопределением колонок (Название, Артикул, Категория, Цена) и upsert товаров по артикулу. Создана страница «Журнал синхронизации» (/admin/sync-logs) с историей всех операций импорта. Логирование через Spatie Activitylog. Кнопка «Синхронизировать» на странице товаров.
Google Таблицы: интеграция, Ignition, экраны и уведомления
Реализована интеграция с Google Sheets API: SheetConfig модель, GoogleSheetService (read/write/append/update), привязка таблицы через Filament Resource. Установлен Ignition (интеграция с Spatie). Создана страница Screens и система уведомлений (NotificationController, NotificationLogs).
Google Sheets
SheetConfig — модель с полями: name, url, sheet_id, range, is_active, last_sync_at
UserMenu, NotificationBell, регистрация и верификация
Добавлен UserMenu в правом верхнем углу с аватаром, именем, ролью и кнопкой выхода. NotificationBell с выпадающим списком последних уведомлений. Реализована регистрация через email с 5-значным кодом подтверждения. Привязка номера телефона к учётной записи.
UserMenu
UserMenu — аватар, имя, роль, кнопка выхода (TopRight)
NotificationBell — выпадающий список последних 5 уведомлений
Регистрация
Регистрация — через email, 5-значный код подтверждения
Верификация — подтверждение email перед доступом к панели
Телефон — привязка номера к учётной записи
Статистика
Новые компоненты: 2 (UserMenu, NotificationBell) · Новые страницы: 2 (Register, Verify)
Тёмная тема установлена по умолчанию для всех пользователей. Добавлен User Switcher — переключение между 5 тестовыми учётными записями (Administrator, Warehouse, Partner, Test, User). Решён конфликт авторизации Filament через кастомный LoginPage.
Тёмная тема
Dark mode — установлен по умолчанию, отключён переключатель light/dark
Все страницы настроек (/admin/settings/*) переписаны с использованием HasForms + getFormSchema(). 6 PHP-классов созданы (SettingsGeneral, Appearance, Typography, Notifications, Mail, Deploy). Blade-шаблоны сокращены: кастомный HTML заменён на {{ $this->form }}. Исправлен конфликт reset() с Livewire.
Архитектура
HasForms — все страницы настроек используют Filament Forms API
Полная переработка страницы Release Notes: обновлена типографика с улучшенной контрастностью, добавлены цветовые акценты на ключевых технологиях, убрана вся конфиденциальная информация (учётные данные, пароли, порты). Версионность теперь безопасна для публичного доступа. Текущая версия платформы обновлена до v0.10.1.
Безопасность
Удалены все учётные данные — пароли, имена пользователей, IP-адреса, порты SSH удалены из всех записей версий
Безопасность публикации — страница версий теперь безопасна для публичного доступа в интернете
Типографика
Улучшена контрастность — даты и описания теперь имеют достаточный контраст для чтения
Цветовые акценты — ключевые технологии выделены золотым цветом (#c9a96e)
Жирные акценты — важные термины и компоненты выделены жирным шрифтом
Структурированные секции — каждая версия разделена на логические блоки (описание, технологии, статистика)
Переработка страницы входа и создание страницы «О платформе»
Полная переработка страницы авторизации по образцу MedTech: логотип БОБЕР БОБ, заголовок, описание для пользователей, форма входа с поддержкой светлой и тёмной тем. Создана публичная страница «О платформе» (/about) с описанием системы, технической информацией, полезными ссылками и историей версий. Добавлен переключатель темы (light/dark) с сохранением выбора в localStorage. Версия обновлена до v0.10.0.
Страница входа
Новый дизайн — логотип БОБЕР БОБ (SVG), заголовок «Вход в систему», подзаголовок «Платформа автоматизации складского учёта»
Описание для пользователей — краткая инструкция по использованию системы
Переключатель темы — кнопка в правом верхнем углу для переключения light/dark
Ссылка на About — версия внизу формы кликабельна и ведёт на страницу «О платформе»
Поддержка темы — все элементы адаптируются под выбранную тему (light/dark)
Страница «О платформе»
Публичная страница — доступна без авторизации по адресу /about
Описание платформы — Бобер Боб: система управления складами, товарами и остатками
Развёртывание платформы на боевых серверах: staging (bober-bob-dev.ipd.by) и production (bober-bob.ipd.by). Инфраструктура: Nginx с SSL, MariaDB 10.6, VDS. Настроены DNS-записи через Cloudflare, выпущены SSL-сертификаты, настроен reverse proxy для Laravel. Обе площадки отвечают HTTPS 200.
Деплой staging
Nginx — reverse proxy для Laravel, SSL termination, статические ресурсы
SSL-сертификат — выпущен через Let's Encrypt, автоматическое обновление
MariaDB 10.6 — база данных staging, пользователь с ограниченными правами
DNS — A-запись через Cloudflare, настроен proxy
Деплой production
Бекап предыдущей версии — архив кода и дамп базы данных перед обновлением
Миграция данных — импорт структуры БД и тестовых данных
Проверка — все маршруты отвечают корректно (login, dashboard, admin)
Восстановление тестовых данных после migrate:fresh. Создан бекап v0.9.0 в архиве. Проверена корректность работы всех модулей после пересоздания базы данных.
Восстановление
Тестовые данные — восстановлены после migrate:fresh --seed
Реализована ролевая модель доступа (RBAC) через Filament Shield: 70 разрешений для 4 моделей, 4 роли. Установлена Filament v5 — PHP-админ-панель для Laravel с 4 CRUD-ресурсами. Добавлен экспорт данных в Excel, дашборд-виджет LowStockWidget и отдельная панель для клиентов.
RBAC через Filament Shield
70 разрешений — view/create/edit/delete для 4 моделей (Product, Warehouse, Stock, Movement) + дополнительные
4 роли — Administrator (полный доступ), Warehouse (складские операции), Partner (товары и остатки), Test (тестирование)
Воспроизводимый сидер — roles и permissions создаются автоматически при migrate:fresh --seed
Filament v5 admin panel: CRUD ресурсы, роли, база знаний
Установлена Filament v5.7.3 — PHP-админ-панель для Laravel. Созданы 4 CRUD-ресурса: ProductResource, WarehouseResource, StockResource, MovementResource. Добавлен role middleware на все маршруты настроек. Создана база знаний по Laravel (12 секций).
Создан постоянный левый сайдбар (AdminLayout.tsx) с SVG-иконками, навигационными секциями и информацией о пользователе. Добавлен SettingsLayout.tsx с горизонтальными вкладками для 9 страниц настроек. Все маршруты перенесены под /admin/* префикс с 301-редиректами.
Навигация
AdminLayout.tsx — постоянное левое меню (256px): SVG-иконки, навигационные секции (Основное, Склад, Администрация), информация о пользователе, badge роли, кнопка выхода
SettingsLayout.tsx — горизонтальные вкладки для страниц настроек
9 страниц настроек — General, Appearance, Typography, Security, Notifications, Mail, Deploy, Versions, History
Маршрутизация
/admin/* префикс — все маршруты перенесены под единый префикс
301-редиректы — старые маршруты автоматически перенаправляют на новые
Расширена ролевая модель с 2 до 4 ролей: Administrator, Warehouse Worker, Partner, Test. Dashboard.tsx обновлён: динамические карточки модулей в зависимости от роли пользователя. RolesAndAdminSeeder воспроизводимо создаёт роли и пользователей.
Ролевая модель
4 роли — Administrator (полный доступ), Warehouse Worker (складские операции), Partner (товары и остатки), Test (тестирование)
4 учётные записи — каждая роль имеет свою тестовую учётную запись
Ролевой Dashboard — разные модули для разных ролей: Administrator видит всё, Warehouse Worker — остатки/движения/товары, Partner — товары/остатки
Статистика
Роли: 4 · Пользователи: 4 (каждый с уникальной ролью)
Проверено: все 4 роли авторизуются и видят контент по ролям
Реализована система авторизации: Login.tsx — форма входа с React Hook Form + Zod, клиентская + серверная валидация, дизайн в фирменных цветах. Dashboard.tsx — дашборд с информацией о пользователе и навигацией. AuthController — login/logout с редиректами. HandleInertiaRequests middleware.
Авторизация
Login.tsx — форма входа (login + пароль) с React Hook Form + Zod, клиентская + серверная валидация
Modern ecosystem: TypeScript, Sanctum, Spatie, React Hook Form
Установлена современная экосистема пакетов для Laravel и React. Laravel Sanctum для API-токенов. Spatie Permission для ролевой модели. Spatie Activity Log для аудит-лога. TypeScript для строгой типизации. React Hook Form + Zod для форм. TanStack Query для кеширования.
Установлено
Laravel Sanctum — API-токены для интеграций
Spatie Permission — ролевая модель (admin/user)
Spatie Activity Log — аудит-лог для складских операций
TypeScript — строгий режим, tsconfig.json
React Hook Form + Zod — формы с валидацией
TanStack Query — кеширование данных, background-обновления
Полная перезапись платформы: старый MVC-код заменён на Laravel 13.20.0 + React 19 + Inertia.js v3.1.1. Установлен Vite 8.1.5 для сборки. Созданы Welcome.jsx и app.blade.php. БД: MariaDB (utf8mb4), 9 миграций Laravel.
Создан профессиональный SVG-логотип (~1.5KB) — стилизованный бобёр, тёмно-зелёный фон, тематика складского учёта. Логотип интегрирован в страницу логина и заголовок приложения.
Критическое исправление безопасности: конфиденциальная информация удалена из публичного контента. About-страница переработана: техническая информация оформлена в формате Markdown с подзаголовками.
Безопасность
Удалена конфиденциальная информация — учётные данные, пароли, порты удалены из публичного контента
Создан бекап — архив предыдущей версии для отката
Описание платформы
About-страница переработана: техническая информация оформлена в формате Markdown с подзаголовками
Жирное выделение ключевых слов (технологии, функции, компоненты)
Статистика
Безопасность: конфиденциальная информация удалена из публичного доступа
Настроен веб-сервер Nginx на VDS для bober-bob.ipd.by. SSL-сертификат выпущен через Certbot (Let's Encrypt). MariaDB: импортирована база данных, создан пользователь с ограниченными правами. Cloudflare DNS: A-запись для bober-bob.ipd.by.
Инфраструктура
Nginx — reverse proxy для Laravel, SSL termination, статические ресурсы
Развёртывание VDS-сервера для проекта Бобер Боб. Ubuntu 22.04, Nginx, MariaDB. Cloudflare: DNS-зона для *.ipd.by, wildcard SSL. SSH-ключ для доступа. fail2ban, UFW, rate limiting для безопасности.