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иdedupmaps.recordOrderиdedupOrderslices отслеживают порядок вставки. Ранее при долгоживущем процессе с тысячами уникальных путей 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_send—os.ReadFileдля attachment’ов предваряетсяos.Statс проверкойmaxAttachmentSize=100MiBper-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_send—FetchUnseen("")→FetchUnseen("INBOX")(явное имя mailbox). RFC 3501 standard; некоторые IMAP-серверы отвергали пустую строку.
Build / Tests
go test ./internal/...— все тесты проходят.go build— OK.