0.134.27

Fixed (MEDIUM-аудит: 14 находок группы 4.3 Server, см. docs/audit/backend-2026-06.md §4.3)

  • M-S-1 handler.ProviderHandler.cleanTestCachelastCleanup time.Time заменён на lastCleanupUnixNano atomic.Int64 с CompareAndSwap. Устраняет race detector warning при параллельных вызовах List().
  • M-S-2 handler.ChatHandler.SendMessagechatID = "rest:%d" расширен до "rest:%d:%s", где session ID берётся из X-Chat-Session-ID header или генерируется через crypto/rand. Multi-device поддержка: 2+ устройств одного user’а больше не конфликтуют на одной сессии.
  • M-S-3 handler.WebhookHandlerchatID = "webhook:%d:%s" упрощён до "webhook:%d". requestID остаётся в metadata для корреляции логов, но не попадает в chatID (потенциальная утечка в RAG-контекст).
  • M-S-4 handler.MemoryHandler.GetSettingsmap[string]any заменён на типизированный MemorySettings struct. JSON-имена полей сохранены (backward compatible с фронтом). Устраняет type confusion (int vs string).
  • M-S-5 store.SetCronJobEnabledAndReset — новый атомарный метод, объединяющий ToggleCronJob + GetCronJob + UpdateCronJob (3 roundtrip) в один SQL UPDATE. Handler использует его вместо 3-шаговой операции. Устраняет lost-update window.
  • M-S-6 store.UpdateAgentIfNotChanged + store.ErrConcurrentModification — оптимистическая блокировка через updated_at. Если агент изменён между GetAgent и Update, возвращается 409 Conflict. Handler agent.Update использует новый метод.
  • M-S-7 handler.UserHandler.Update — добавлена проверка GetUserByUsername перед UpdateUser. При коллизии возвращается 409 Conflict (раньше — 500 Internal Server Error от UNIQUE constraint).
  • M-S-8 handler.AvatarHandler — добавлен whitelist allowedAvatarSizes = {32, 40, 48, 128}. Невалидный size (включая path-traversal) → default 128. Закрывает file-enumeration через ?size=999.
  • M-S-9 store.ListAuditLogFiltered — расширен параметром action. Handler audit.List всегда вызывает его (раньше — разные методы с тихим ignore’ом фильтров). Сигнатура: ListAuditLogFiltered(ctx, action, resourceType, resourceID, limit, offset).
  • M-S-10 handler.KGHandler.Stats — 6 _ = заменены на if err != nil { slog.Warn(...) }. Ошибки Count-функций теперь видны в логах (раньше — silent zero values).
  • M-S-11 handler.UpdateHandler.Check30*1e930*time.Second. Добавлен "time" import.
  • M-S-12 handler.ConnectionHandler.extractIDr.PathValue("id")chi.URLParam(r, "id"). Согласовано с остальными handler’ами. Также json.Number().Int64() упрощён до strconv.ParseInt.
  • M-S-13 handler.ChatHandler.GetAgentMessages — добавлена валидация beforeID > 0 (раньше принимались 0 и отрицательные значения, store возвращал пустой результат).
  • M-S-14 handler.WebhookHandler.generateRequestIDrand.Read ошибка теперь пробрасывается (раньше глоталась, requestID был всегда нулевым). Caller в HandleHook обрабатывает ошибку → 500.

Build / Tests

  • go test ./internal/... — все тесты проходят.
  • go build — OK.