- «Истекает оплата» строится только по VPS текущего space
- ключ notification_state разделён по space: второй space больше не
падает на PRIMARY KEY и не получает дубль каждый тик
- таймаут 10 с для Telegram и webhook
- текст от хостеров экранируется для parse_mode=HTML
- сообщения длиннее 4096 символов обрезаются по строке
- повторное падение того же VPS снова уведомляет
- ошибки по отдельным чатам пишутся в журнал при частичной доставке
- удалён неиспользуемый sendWebhook/notifyWebhook
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- раз в сутки удаляются notification_log и sync_log старше 90 дней и
vps_health_checks старше 30 дней; синки, зависшие в running дольше
часа, помечаются ошибкой
- dashboard stats не грузит тарифы, домены и проекты
- запросы характеристик VPS в BILLmanager идут по 4 параллельно
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Скачивание и восстановление файла БД, JSON-бэкап и legacy-импорт
затрагивают все spaces и содержат учётные данные API, поэтому прав
vps:settings:admin в одном space для них недостаточно.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- rates-proxy запрашивает только сохранённый settings.ratesUrl
- viewer в space не может писать в платежи, баланс, провайдеров,
аккаунты, проекты и запускать синк
- /api/sync/status показывает журнал только текущего space
- повторный синк аккаунта во время текущего отвечает 409
- тики планировщика не накладываются, каждый space идёт по своему интервалу
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ошибка запроса тарифов превращалась в пустой список: active_tariffs
удалялись, а следующий успешный синк объявлял все тарифы новыми.
Пустой ответ теперь оставляет старый список, замена идёт в транзакции.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Вставки VPS, платежей, тарифов и uptime-проверок не задавали spaceId и
уходили в space-main. Поиск существующего VPS матчил bm-1 с bm-12 и
сервера с пустым IP между собой; теперь сначала по id, затем по точному
токену в заметке, затем по непустому IP.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Пустая строка в vpsId/providerAccountId/providerId давала 500
SQLITE_CONSTRAINT_FOREIGNKEY при создании платежа, записи баланса и VPS
без провайдера. Старые БД падали с «no such column apiType»: добавлены
колонки providers.apiType/apiBaseUrl и перенос URL BILLmanager с аккаунтов.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Детальные VPS и проекта показывают «раздел / запись» в крошках, warning-значения
KPI читаемы в светлой теме, мобильный сайдбар в светлой теме остаётся тёмным,
заголовки групп не попадают в Tab-порядок свёрнутого меню.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Настройки — line-вкладки сверху вместо боковой навигации, детали VPS —
line-вкладки и действия в шапке, журнал — общие CountedLineTabs, шапка
страницы 20px. Детальные маршруты VPS и проекта вынесены из вложенности
(vps_.$vpsId, projects_.$projectId): списки не рендерят Outlet, и детали
не открывались.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Сворачиваемые группы меню с точками проблем, приложения в AppSwitcher вместо
AppsMenu в шапке, пилюля монитора со счётчиками, KPI со значением и бейджем
в одной строке, вкладки дашборда на уровне страницы.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Membership идёт bezier по ближайшей грани; клик по сервису выделяет VPS-членов. Badge HA только при двух уникальных origin IP.
Co-authored-by: Cursor <cursoragent@cursor.com>
Общий binding с несколькими origin-IP больше не остаётся unmatched: строка размножается на каждый однозначно совпавший VPS.
Co-authored-by: Cursor <cursoragent@cursor.com>
RouterOS serialize превращает results в объект с ключами 0,1 — API отвечал 400. ros-6 собирает массив, ingest принимает оба формата.
Co-authored-by: Cursor <cursoragent@cursor.com>
RouterOS скрывает HTTP 4xx как fetch error. ros-5 печатает код и тело ответа, затем повторяет POST без src-address.
Co-authored-by: Cursor <cursoragent@cursor.com>
src-address недостаточно при нескольких default route: добавляем policy routing и снимаем правила после прогона.
Co-authored-by: Cursor <cursoragent@cursor.com>
Пробы выполняются на роутере через /tool fetch и уходят в те же ingest API. Ежедневный запуск ставит scheduler, который каждый день заново качает .rsc со свежим токеном.
Co-authored-by: Cursor <cursoragent@cursor.com>
Флаг --daily ставит cron, который раз в сутки заново качает launcher со свежим токеном. Снять: --remove-daily.
Co-authored-by: Cursor <cursoragent@cursor.com>
CDN-значения вида SE (ARN) больше не помечаются как ошибка. У каждого GeoIP-сервиса — бренд-иконка, как в разделе блокировок.
Co-authored-by: Cursor <cursoragent@cursor.com>
Kit больше не перебивает defaults примитива: header без серой полосы, CRUD с table-fixed. Матрица /blocking получает sticky identity, иконки сервисов и статусы без текста ОК/Блок.
Co-authored-by: Cursor <cursoragent@cursor.com>
Обновить registry data-grid на TanStack Table v9 и показать статус DPI компактной матрицей по VPS и сервисам.
Co-authored-by: Cursor <cursoragent@cursor.com>
Сломанный here-doc съел is_installed; launcher определяет дистрибутив и ставит jq/dig/column без prompt, скрипты отдаются с LF.
Co-authored-by: Cursor <cursoragent@cursor.com>
Прогон с VPS через HMAC-токен матчится к существующим серверам; UI /blocking показывает текущие проверки и историю.
Co-authored-by: Cursor <cursoragent@cursor.com>
Монитор больше не ставит «Внимание» по скрытому счётчику. Telegram можно слать через локальный telegram-bot-api.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Expanded the ReUI skill description to include 20 free building blocks.
- Updated references in various documentation files to reflect the new count of components.
- Enhanced the data-grid documentation to specify the use of TanStack Table v9.
- Added new component details, including the icon-tile, and clarified usage instructions across multiple files.
This update improves clarity and ensures that all references are consistent with the latest component offerings.
Updated fetch mocks in settings and audit test files to improve type safety by specifying the fetch type. Adjusted handling of mock call parameters to ensure proper access to request options. This enhances test reliability and clarity in error handling scenarios.