Задания, отчёты и патчи, лежавшие в C:\Users\Ochenstarik\projects и в домашней папке, перенесены в agents/. Разложено по агентам там, где имя файла позволяло определить автора; остальное — в _salvage-2026-08-18/ и разбирается вручную. Патчи в notes/salvage-2026-08-18/ — незакоммиченная работа из брошенных рабочих копий: она существовала только на диске. Тяжёлое (релизные архивы, инсталляторы, наборы данных) в репозиторий не попало: оно лежит рядом, в Agent_projects/_archive и Agent_projects/_data. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
3.2 KiB
Правила работы: прочитай C:\Users\Ochenstarik\kagent-tasks\hermes-work-protocol.md.
Файлы: services/control-plane/src/main.ts, services/control-plane/src/auth.ts,
при необходимости services/control-plane/package.json. Тесты в этой задаче не пишутся —
они в задаче A4.
Дефект 1: сервис не стартует
В main.ts логгер сконфигурирован с transport.target: "pino-pretty", а пакета
pino-pretty нет в зависимостях. Fastify падает при инициализации.
Предпочтительное решение: убрать transport и оставить структурный JSON-вывод. В
контейнере человекочитаемый вывод не нужен, а зависимость попадёт в образ. Если выберешь
добавить pino-pretty в devDependencies и включать транспорт только вне продакшена —
обоснуй в отчёте.
Дефект 2: регистрация и вход не работают
В auth.ts функция pbkdf2 получает модуль через require("node:crypto"). Пакет объявлен
как "type": "module", поэтому require не определён и вызов бросает ReferenceError при
каждом хешировании пароля. То есть POST /v1/auth/register и POST /v1/auth/login не
работают вообще.
В первой строке файла уже есть статический импорт
import { randomBytes, createHash, timingSafeEqual } from "node:crypto". Добавь в него
pbkdf2 и убери динамическое получение модуля.
Дефект 3: испорченный хеш даёт 500 вместо 401
verifyPassword разбирает хранимую строку через split(":") и передаёт результат в
timingSafeEqual, который бросает исключение при разной длине буферов. Испорченное или
устаревшее значение в базе превращается в 500.
Разбор должен проверять формат и возвращать false, а не бросать исключение. Сравнение
остаётся постоянного времени.
Критерий приёмки
pnpm --filter @kagent/control-plane typecheck
Проходит без ошибок при включённых strict, noUncheckedIndexedAccess,
exactOptionalPropertyTypes. Тип any не использовать.
Сервис запускается: pnpm --filter @kagent/control-plane dev поднимается и отвечает на
GET /health/live. Если PostgreSQL недоступен — это ожидаемо на данном этапе, важно, что
процесс не падает при старте. Вывод приложить к отчёту.
Изменения зависимостей перечислить отдельно с указанием лицензии.