0.134.28

Fixed (MEDIUM-аудит: 6 находок группы 4.2 Tools + 2 DEFERRED, см. docs/audit/backend-2026-06.md §4.2)

  • M-T-1 tools.FileStates — добавлен FIFO eviction при превышении fileStatesMaxEntries=1000 для state и dedup maps. recordOrder и dedupOrder slices отслеживают порядок вставки. Ранее при долгоживущем процессе с тысячами уникальных путей maps росли неограниченно.
  • M-T-2 tools.FileStates.RecordRead — I/O (os.Stat + hashFileContent) вынесен из-под мьютекса. Ранее под fs.mu.Lock() делались 2 syscall’а, что блокировало другие горутины (GetDedup, IsUnchanged) на время I/O. Аналогично IsUnchanged: сначала читаем state под мьютексом, потом делаем I/O.
  • M-T-3 (DEFERRED) tools.WebFetchTool.ExecuteStream — caller не читает → горутина зависает. Требует переделки streaming API (сложный refactor, отдельный PR).
  • M-T-4 (DEFERRED) tools.WebFetchTool.walkHTMLNode — рекурсивный обход DOM может вызвать stack overflow на вложенных HTML. Требует перехода на iterative traversal.
  • M-T-5 tools.email_sendos.ReadFile для attachment’ов предваряется os.Stat с проверкой maxAttachmentSize=100MiB per-file. Защита от случайного чтения /dev/zero и огромных файлов в память.
  • M-T-6 tools.CheckMemoryAccessHint — 17 отдельных regex’ов объединены в один с alternation (?i)\b(cat|grep|...|ls)\b[^\n]*(MEMORY|memory/...). MatchString через единый DFA-lite matcher Go быстрее серии отдельных regex.MatchString.
  • M-T-7 tools.sanitizeFilename — добавлен 6-символьный hex-суффикс (crypto/rand) к очищенному имени. Исключает коллизии: “report.pdf” и “report pdf” → “report_pdf_a3f9c2” и “report_pdf_7e1b08” соответственно.
  • M-T-8 tools.email_sendFetchUnseen("")FetchUnseen("INBOX") (явное имя mailbox). RFC 3501 standard; некоторые IMAP-серверы отвергали пустую строку.

Build / Tests

  • go test ./internal/... — все тесты проходят.
  • go build — OK.