0.6.0

Added

  • Изоляция памяти между пользователями (multi-tenancy): колонки user_id в memory_facts и memory_chunks, миграция 017_user_isolation (SQLite + PG)
  • Параметр userID *int64 в SearchFacts/ListFacts/SearchChunks: nil — общая память (admin/системный режим), не-nil — общие + свои факты
  • Store.GetAPIToken(id) — получение токена по ID для проверки владельца
  • Helper-методы в internal/server/handler: requireFactInAgent, requireSessionInAgent, scopeUserID, canAccessFact, canAccessSession — единообразные ownership-проверки
  • Базовые cross-tenant integration-тесты в internal/store/user_isolation_test.go и internal/server/handler/cross_tenant_test.go (12 тестов)

Changed

  • Consolidator.ConsolidateAgent привязывает извлечённые факты к sess.UserID; приватные категории (user_fact, preference, personal) не сохраняются для анонимных сессий
  • ContextBuilder.buildMemoryContext принимает userID *int64 — RAG отдаёт только видимые caller-у факты и чанки
  • MemoryHandler.{GetFact,UpdateFact,DeleteFact,DeactivateFact} проверяют принадлежность факта агенту и доступ caller-а; неавторизованный доступ → 404 (anti-enumeration)
  • MemoryHandler.{ListFacts,Search,CreateFact,AddChunks} фильтруют/создают данные по scope caller-а
  • ChatHandler.{GetSessionMessages,UpdateSession,DeleteSession,ListSessions} ограничивают доступ к чужим сессиям
  • UserHandler.DeleteToken проверяет владельца токена; чужой токен → 404
  • middleware/authorize.go использует strconv.ParseInt вместо самописного парсера; невалидный agentID → 404 вместо 403/200

Fixed

  • IDOR-уязвимости в /agents/{id}/memory/facts/{factID}, /agents/{id}/sessions/{sessionID}, /users/me/tokens/{id} (раздел C-3 аудита)
  • Утечка приватных фактов между пользователями одного агента через SearchFacts/SearchChunks (раздел C1, C2 аудита памяти)
  • Cross-tenant утечка через consolidator: автоматически извлечённые preferences пользователя A могли становиться общими и попадать в RAG пользователя B