0.27.0
Итерация P2 (часть): безопасность и расширение возможностей агента.
Закрыты задачи docs/audit/P2/README.md: P2-S1, P2-S2, P2-S3, P2-M3, P2-T1.
Added
- CSRF protection (P2-S1): новое middleware
internal/server/middleware/csrf.goс double-submit token + Origin/Referer-проверкой. При/oauth/loginустанавливается cookietc_csrf(без HttpOnly) и токен возвращается в JSON-теле; на/oauth/authorizemiddleware требует совпадения cookie ↔ заголовкаX-CSRF-Token(constant-time). 10 unit-тестов покрывают GET-bypass, отсутствие cookie/header, mismatch, Origin/Referer-проверку. - Ротация мастер-ключа шифрования (P2-S2): новый
KeyManagerвinternal/secrets/keymanager.go— поддерживает active + retired keys, читает/пишет<dataDir>/keys.json. МетодыRotate(),PurgeRetired(),Decrypt()с автоматическим перебором ключей. Командаsecrets.ReencryptAll()обходит settings, llm_providers и email_accounts. Admin-эндпоинтыGET /api/v1/admin/secrets/status,POST /api/v1/admin/secrets/rotate,POST /api/v1/admin/secrets/reencrypt. 5 unit-тестов покрывают encrypt/rotate/purge/legacy-rejection. - Memory tools для агента (P2-M3): три новых инструмента в
internal/agent/tools/memory.go: memory_search— гибридный поиск (vector + FTS + RRF) по фактам с фильтром категории.memory_remember— сохранение нового факта с дедупликацией (cosine ≥ 0.95).memory_forget— деактивация факта по id (с проверкой scope). Регистрируются приperms.Tools.Memory = true. Все три работают строго в user-scope текущей сессии. 4 unit-теста (create/forget/cross-scope-reject/dedup).- Skills trigger-активация (P2-T1): новый файл
internal/skills/triggers.goс типомSkillMetadata(хранится вSkill.Metadataкак JSON, без миграции схемы). Поддерживаются паттерныkw:текст,regex:^..., plain (alias дляkw:). Skills с непустымTriggersи совпавшим паттерном инжектятся как Triggered Skill в system prompt. SkillsHandler принимаетtriggers: []stringв Create/Update и синхронизирует FS-конфиг. 13 unit-тестов покрывают match-логику и metadata roundtrip.
Changed
- Dream user-scope (P2-S3):
Dream.Runтеперь принимаетuserID *int64и работает строго в одном scope. Новый методRunForAllScopesобходит общий scope (user_id IS NULL) и каждого пользователя агента отдельно. Все merge/update/deactivate-actions проверяются на cross-scope: попытка merge фактов разных пользователей блокируется с warning-логом. Курсоры теперь хранятся какdream_cursor:<agentID>:sharedиdream_cursor:<agentID>:user:<userID>.DreamService.runOnceиMemoryHandler.RunDreamобновлены на новый API. 3 unit-теста покрывают cross-scope reject и create-with-userID. - Legacy plaintext API-ключи (P2-S2):
SettingsHandler.TestProviderбольше не принимает незашифрованные значения из БД — возвращает 424 с просьбой переввести ключ через UI. registerToolsForAgentтеперь принимаетuserID *int64для проброса в memory tools и согласованного user-scope.
Fixed
- Dream merge утечка между пользователями (P2-S3): ранее Dream работал в admin-режиме с
nil userID, что позволяло LLM предложить merge приватных фактов разных пользователей.