0.160.0

Added

  • MCP: per-user / per-context credentials (ADR docs/adr/2026-07-02-mcp-full-coverage.md, Фаза 2, ). Разные пользователи/контексты могут иметь разные креды (api_key, headers, env) к одному MCP-серверу. Иерархия мержа: server defaults → context (channel/group/role) → per-user (самый специфичный). Поддержка env:VARNAME синтаксиса с allowlist (12 переменных) и fail-closed на неразрешённых.
  • Миграция 101 (SQLite + PG): две таблицы mcp_user_credentials (FK→users, UNIQUE server_id+user_id) и mcp_context_credentials (CHECK scope_type IN channel/group/user/role, UNIQUE server_id+scope_type+scope_key). api_key шифруется на уровне приложения (mcp.EncryptAPIKey через KeyManager.Encrypt AES-256-GCM). PG JSONB defaults с явным '{}'::jsonb cast.
  • Store: типы MCPUserCredential/MCPContextCredential + CRUD (Upsert/Get/List/Delete) в SQLite/PG/DualStore.
  • Resolver (internal/mcp/credentials.go): CredentialResolver.ResolveCredentials(ctx, srv, userID, scopeType, scopeKey) — мерж server→context→user, decrypt api_key, resolve env:VARNAME через allowlist (HOME, USER, PATH, SHELL, LANG, LC_ALL, TZ, TERM, NODE_ENV, ENVIRONMENT, LOG_LEVEL, DEBUG), fail-closed на неразрешённых.
  • API (6 endpoints, все RequireGlobalAdmin): GET/POST /mcp-servers/{id}/credentials/user, DELETE .../user/{userID}, GET/POST .../credentials/context, DELETE .../context/{scopeType}/{scopeKey}. Headers/Env маскируются (***) в ответах наравне с api_key.
  • Проверки: go test ./internal/... — зелёные; новые тесты: TestResolveEnvVars_{Allowlist,ResolvesValue} (env:TZ — OK, env:SECRET — fail-closed), TestCredentialResolver_{Hierarchy,NoCredentials} (мерж слоёв, decrypt, server defaults preservation); go vet + golangci-lint — 0 issues; make build-cross — проходит; ocr review — 0 HIGH/MEDIUM (35 LOW/improvement: pagination, sentinel errors, struct dedup, audit trail — отложены).