Актор действия: сессия — владелец, токен — агент (0.85)
- app/actor.py: Actor (kind, name, via, token_id, owner_name) — кто и через что
  сделал. Bearer-токен по умолчанию даёт агентский актор: иначе действие
  ИИ-агента в базе неотличимо от действия браузерного расширения, а оба ходят
  одним токеном владельца. declares_user() читает заголовок X-Actor: user;
  declaring_user() превращает агентский актор во владельческий, сохраняя
  канал — в журнале читается «я, но действие пришло от агента». Нет сведений о
  токене (тесты подменяют авторизацию) — актор владельца: агентских полномочий
  ни у кого нет.
- dependencies.user_from_bearer выбирает строку токена целиком (id, label,
  имя владельца — OUTER JOIN, строки users может не быть) и кладёт актора в
  request.state. require_user для сессии SSO кладёт актора-владельца с именем
  из профиля. Новые actor_of() и ActorDep рядом с UserIdDep: зависимость
  объявлена после require_user, поэтому 401 приходит раньше, чем кто-либо
  спросит «кто действует».
- main.McpAuthMiddleware: тот же выбор строки токена для /mcp, актор всегда
  агентский — объявить действие владельца тул может только своим аргументом
  is_user, а не заголовком запроса.

ТЗ 0.85.
1 parent e6df8f4 commit 028b1f4233b3518b15425b8e51aa405c73485f84
@root root authored 9 hours ago
Showing 3 changed files
View
backend/app/actor.py 0 → 100644
View
backend/app/dependencies.py
View
backend/app/main.py