0.28.0

Added

  • Подключение PostgreSQL на этапе онбординга: на шаге 2 страницы /onboarding появилась форма ввода реквизитов PostgreSQL (host/port/database/user/password/ssl_mode) с проверкой подключения и расширения pgvector. При успехе — переключение текущего стора на PostgreSQL без миграции данных (SQLite на старте ещё пуст), и шаг 3 (создание администратора) выполняется уже на новой БД.
  • Backend: новые публичные (защищённые setup-токеном) эндпоинты POST /api/v1/setup/database/test и POST /api/v1/setup/database/configure. Новый метод store.DualStore.TestPGConnectionDetailed возвращает структурированный результат (server_version, pgvector_installed, pgvector_version) — UI различает «коннект провален» и «коннект OK, но pgvector нет», во втором случае показывает инструкцию CREATE EXTENSION vector;. Новый метод store.DualStore.EnablePGFresh атомарно проверяет коннект+pgvector, прогоняет миграции, сохраняет pg_config/pg_enabled=true и переключает текущий стор на PG (без копирования из пустого SQLite).

Changed

  • internal/server/handler/database.go рефакторинг: общая структура запроса для test/configure, опциональный setupGuard через NewDatabaseHandlerWithSetup. Поведение admin-эндпоинтов /api/v1/admin/database/* не изменилось.

Fixed

  • Сканирование timestamptz в *string для PostgreSQL: pgx-пул для PG теперь использует QueryExecModeSimpleProtocol (internal/store/postgres.go:newPGPool). В extended protocol pgx отдаёт timestamptz в бинарном формате как time.Time и не может присвоить его в *string, на котором построены все наши struct’ы (User.CreatedAt, Agent.CreatedAt и т.д.). Без этой правки oauth.Setup падал с cannot scan timestamptz (OID 1184) in binary format into *string сразу после INSERT в PG. Все точки создания пула (NewPostgresStore, EnablePGFresh, MigrateToPG, PGStatus) теперь идут через общий newPGPool.