Reference in New Issue
Block a user
Delete Branch "batch/issues-189-187-170"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Батч из трёх задач, каждая — отдельным коммитом.
#189— feat(ai-chat): бейдж контекста «текущий / максимум» в шапкеБейдж в шапке плавающего окна AI-чата больше не «прыгает» между live-счётчиком хода и размером контекста — теперь он всегда показывает
текущий / максимум(например572 / 200k). Максимум берётся из новой настройки AI «Context window (tokens)»: сервер резолвит её и кладётmaxContextTokensв метаданные завершённого ассистентского хода (рядом сcontextTokens), поэтому клиенту не нужно резолвить модель, и это переживает публичные шары / пер-ролевые модели. Live-фидбек «Thinking · N tokens» в теле чата сохранён; из шапки убран только дублирующий live-счётчик. Подводный камень: провайдерные настройки хранятся как::text, поэтому значение коэрсится обратно в положительное целое вresolve()/getMasked().Коммит:
feat(ai-chat): header badge shows current/max context, max from AI settings (#189)#187— ci(develop): e2e на каждый push в develop, без блокировки деплояВ
develop.ymlдобавлены два независимых job —e2e-serverиe2e-mcp(pgvector + redis, миграции, для MCP — сборка, старт прод-сервера с REST +/collab, seed через/api/auth/setup).buildостаётсяneeds: testи не зависит от e2e: падение e2e не блокирует публикацию образа:develop, а делает run красным и шлёт письмо GitHub автору пуша.Коммит:
ci(develop): run server + mcp e2e on every develop push without blocking deploy (#187)#170— feat(ai-chat): кнопка «Test» на каждой строке списка MCP-серверовInline-проверка подключения прямо из строки списка внешних MCP-серверов, без попапов. Строка вынесена в
AiMcpServerRowсо своим инстансом мутации (изоляция состояния — нет глобального мигания). Состояния: покой (Test), проверка (loading), успех (зелёная,OK · Nпо числу инструментов), ошибка (красная,Failed); тултип показывает список инструментов или текст ошибки. Результат сбрасывается при смене url/transport/headers. Бэкенд/сервис/мутация не менялись.Коммит:
feat(ai-chat): inline Test button per external MCP server row (#170)Closes #189
Closes #187
Closes #170
🤖 Generated with Claude Code
Add a per-row Test button to the external MCP servers list that shows the connection result inline (no toasts). Extract the row into AiMcpServerRow so each row owns its own useTestAiMcpServerMutation instance — independent loading and result, no cross-row flicker. States: idle (Test), pending (loading), success (green, "OK · N" with the tool count), failure (red, "Failed"); a tooltip shows the tool list or the error. The result resets when url/transport/headers change (the row is keyed by id, so it does not remount). Backend, service and mutation are unchanged. - ai-mcp-servers.tsx: AiMcpServerRow + Test button + reset effect + tooltip. - i18n: add Failed / "OK · {{n}}" (en, ru) and ru Test / tool-list keys. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>The per-row MCP Test button derived its presentation solely from the test mutation's data ({ ok, tools } | { ok, error }). When the request itself rejected (401/403/500/network) there is no payload, so the row silently spun back to the idle "Test" instead of reporting the failure. Feed the mutation error into mcpTestButtonView so a reject also renders a red "Failed", with the tooltip taken from the server message (error.response.data.message) or a generic i18n fallback. Enable the tooltip for any non-idle state. Cover the reject branch (with and without a server message) in the helper unit test. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>Ghost referenced this pull request2026-06-26 17:39:55 +03:00
Ghost referenced this pull request2026-06-26 17:39:55 +03:00
Code review (re-review) — PR #197: батч context badge (#189) + e2e в CI (#187) + inline MCP test (#170)
Вердикт: Approve. Дельта — это чистый test-coverage + поведенчески-нейтральный рефакторинг: две вынесенные pure-функции (
selectContextBadge,mcpTestButtonView) и серверный хелперparsePositiveInt, каждый теперь покрыт юнит-тестами, плюс захват лога сервера в CI. Новых блокеров нет, прошлые замечания закрыты.Ре-ревью дельты
9b61024b..ba5cd024(9 файлов, +357/−85). Аспекты: security, stability, conventions, documentation, regressions, test-coverage (параллельные ревьюеры + judge).Статус прошлых блокеров
context-badge.test.ts(8 кейсов),ai-mcp-server-test-view.test.ts(4 состояния),ai-settings.service.spec.ts(8 кейсов дляparsePositiveInt).chatContextWindow(::text→ число): семантикаNumber.isFinite && > 0+Math.floorсохранена дословно, продублированный inline-код заменён единымparsePositiveInt, дрейф> 0→>= 0теперь ловится тестом. Закрыто.IAiMcpServerTestResult(errorуже санитизирован сервером) не изменён. Не затронуто."OK · {{n}}","No tools available","Failed","Test"проходят через тот жеt()с уже существующими ключами. Закрыто.Must fix before merge
Нет.
Non-blocking
Нет. (Проверено против исходников:
selectContextBadgeточно воспроизводит прежний двойной backward-scan с независимым подбором числителя/знаменателя и legacy-usage-fallback;metadata: {...} | nullделаетrow(null)в тесте типобезопасным; серверный.spec.tsсоответствует jest-конвенции каталога.)Test coverage
Покрыто. Вся новая/изменённая логика дельты сопровождается тестами: бейдж (пустой ввод, оба значения из свежей строки, legacy-fallback, числитель/знаменатель с разных строк, не-затенение свежим нулём, пропуск null-metadata, без клампа); MCP-кнопка (idle/ok-с-tools/ok-без-tools/failed + ветки тултипа);
parsePositiveInt(целое/дробь/0/отрицательное/пустое/нечисловое/undefined/null/number). Измененияai-chat-window.tsx,ai-mcp-servers.tsx,ai-settings.service.ts— делегация в покрытые хелперы; CI-правкаdevelop.yml(> /tmp/server.log 2>&1+ dump on failure) логики не несёт.