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.