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.EncryptAES-256-GCM). PG JSONB defaults с явным'{}'::jsonbcast. - 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, resolveenv: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 — отложены).