0.38.0

Fixed

  • Auth flow: восстановлена работа авторизации за HTTPS reverse-proxy (chat.a2v.space)
  • PostgreSQL GetRefreshTokenByHash: pgx не сканирует timestamptz в *string, scan падал и refresh-токены считались просроченными — переписано через time.Time с форматированием в RFC3339Nano
  • Secure cookie: helper isSecure(r) теперь учитывает X-Forwarded-Proto: https от прокси, иначе Chrome отклонял non-Secure cookie на HTTPS-странице (в auth.go, csrf.go, securityheaders.go)
  • auth store: callback onAuthRefresh теперь обновляет isAuthenticated, без этого после SPA-навигации все защищённые layout зависали на «Перенаправление…»
  • Memory page: убран бесконечный цикл $effect на вкладках Dream/Scratchpad — добавлены флаги dreamRunsLoaded/scratchpadLoaded вместо проверки длины массива
  • Логирование причин отказа в Token() handler (grant_type, has_refresh_cookie, has_refresh_body, error)

Changed

  • client.ts: refresh-токен снова в теле ответа /oauth/token + хранится в localStorage (в окружении за HTTPS-прокси cookie не доходят до браузера, fallback на токен в теле обязателен)
  • client.ts: api.login() сохраняет refresh_token в localStorage; api.logout() чистит его
  • client.ts: doRefresh() отправляет refresh_token в теле POST-запроса вместо опоры только на cookie

Added

  • Эндпоинты памяти агента: dream/runs (история запусков), scratchpad (рабочая память), facts/{id}/history (история изменений факта)
  • Миграция 031_dream_runs_soul_evolved (SQLite + PostgreSQL): таблица dream_runs, поле agents.soul_evolved
  • WebUI: вкладка Dream с историей запусков, вкладка Scratchpad, история изменений факта
  • Soul page: отображение и очистка soul_evolved

Notes

  • Документ docs/todo.md отмечает: cookie-based auth остаётся целевым решением; текущий localStorage-fallback нужен из-за невозможности передать Set-Cookie через текущую цепочку прокси на проде. Возврат к cookie-only — после настройки terminating-прокси с правильным Set-Cookie passthrough.