- version 1.0.0 во всех package.json monorepo
- версия в GET /health и в меню пользователя (vite define)
- Docker: тег vX.Y.Z собирает образ :X.Y.Z и :X.Y, latest остаётся за main
- README: как закрепить версию образа
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Скриншоты сняты заново на демо-данных с неделей истории проверок.
В docs/features.md — навигация по точкам измерений и новые матрицы
блокировок и GeoIP. В мониторе цвет текста предупреждений читается
в светлой теме (*-foreground, как в KPI).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- шкала по часовым точкам измерений: капсулы с долей проблемных прогонов,
пресеты «Сейчас / −1 ч / −6 ч / −24 ч / −7 д», кнопки и клавиши ← →
- статусы блокировок — цветные IconTile, короткие подписи сервисов
с иконками брендов, колонка «Доступно X из Y» с полосой
- GeoIP: флаги стран в ячейках, расхождение с большинством подсвечено,
колонка «Страна · совпадает N/M»; расхождения считаются по сервисам
- флаг страны VPS в первой колонке, фильтры и вид в шапке матрицы
- демо-данные: неделя истории прогонов по полному списку сервисов
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- поиск и фильтры страниц перенесены в шапку рамки рядом с заголовком,
ListFiltersBar стал однострочным тулбаром
- шапка таблицы с подложкой, строки без зебры (общий kitDataGridTableLayout)
- у таблиц заголовки и подписи из досок макета
- IP в списке VPS моноширинным шрифтом и без обрезки, компактная
иконка в ячейке-названии
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- монитор в шапке: пилюля «Внимание ●N ●M», в попапе сводка сбой /
предупреждения / в норме, список проблем со ссылками, плитки метрик
с полосами и время обновления
- KPI одной полосой в Frame с разделителями 1px, как доски макета
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- README: главные возможности, галерея, быстрый старт, ссылки на документы
- docs/features.md: гид по всем разделам с новыми скриншотами
- docs/configuration.md: переменные окружения, права, роли, планировщик
- 26 скриншотов нового дизайна на демо-данных (в т.ч. мобильные)
- scripts/seed-demo.ts и scripts/docs-screenshots.mjs для пересъёмки
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
KPI складывал балансы аккаунтов в разных валютах как есть (46,8 EUR +
1120 RUB показывалось как 1166,80 ₽). Теперь каждый баланс переводится
в базовую валюту с учётом курса хостера.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SQLite LOWER() и LIKE понижают только ASCII, поэтому «Сайт и API» не
находился и каждый новый VPS с таким проектом создавал дубль; подсказки
по «сай» тоже были пустыми. Сравнение перенесено в JS.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- «Истекает оплата» строится только по 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.
Убран fallback на локальный App Switcher (192.168.x). URL из portal подставляется в форму для сохранения; кнопка sync требует URL в БД.
Co-authored-by: Cursor <cursoragent@cursor.com>
Устраняет fetch failed при ручном sync, когда CFDM не может достучаться до VPS Tracker. Ошибки показывают URL; UI подсказывает URL из App Switcher.
Co-authored-by: Cursor <cursoragent@cursor.com>
Introduced a new test to verify the persistence of the CFDM API URL via the settings endpoint. Updated the integration form to reflect saved credentials more clearly, enhancing user feedback for the API URL and integration token. Improved sync button behavior to prevent actions without saved credentials. Updated settings schema to include CFDM API URL validation.
Renamed test cases for clarity and added new tests for handling missing CFDM URL and token scenarios. Removed unnecessary checks in the sync request function to streamline the process. Updated integration form to ensure proper boolean handling for settings. Enhanced sync button behavior based on saved credentials.
Enhanced DataGridColumn interface to include a sorting function option. Updated the frame-data-grid component to utilize the new sorting function. Introduced a new function for calculating comparable daily rates for VPS tariffs, improving the accuracy of monthly burn calculations. Updated the VpsPage to implement the new sorting function and daily rate logic.
Changed the step attribute for NumberField components in the VpsEditSheet to "any" for vCPU, RAM, and disk inputs. Updated the vpsSchema to accept real numbers for vCPU, diskGb, and bandwidthTb. Adjusted database schema to store vCPU, diskGb, and bandwidthTb as REAL instead of INTEGER for better precision.
Лента в стиле solution-users-6 с раскрываемым diff; переключение на ResourcePage.
Исправлено: монитор считает ошибку синка только по последней записи аккаунта.
Co-authored-by: Cursor <cursoragent@cursor.com>
Для daily FirstByte считать dailyRate из cost/30 и общий paidUntil по балансу аккаунта; для 4VPS парсить страну/город из dc_name+flag.
Co-authored-by: Cursor <cursoragent@cursor.com>
Парсинг страны/города и paidUntil из list vds; CPU/RAM/диск из vds.order по pricelist_id, иначе vds.edit.
Co-authored-by: Cursor <cursoragent@cursor.com>
Разбить монолитную Card-форму на вкладки Общие/Синхронизация/Уведомления/Интеграции с SettingRow и SettingsCard по эталонам settings-16/3/2.
Co-authored-by: Cursor <cursoragent@cursor.com>
Центрирование заглушек в графиках/Frame; лимит тела backup 100 MiB;
WAL checkpoint при экспорте и очистка -wal/-shm при импорте.
Co-authored-by: Cursor <cursoragent@cursor.com>
Пустой volume больше не отдаёт 500 на /api/data из-за отсутствующих таблиц. В compose добавлены json-file логи с ротацией и LOG_LEVEL для Fastify.
Co-authored-by: Cursor <cursoragent@cursor.com>
Обновлен оглавление и добавлен новый раздел с пошаговой инструкцией по развертыванию контейнера VPS Tracker с использованием Traefik и Cloudflare для HTTPS. Включены ссылки на необходимые файлы и команды для настройки.
Связи показывают тип, подпись, протокол и IP туннеля вместе; группы на заднем слое, узлы внутри прилипают к группе.
Co-authored-by: Cursor <cursoragent@cursor.com>