0.14.0

Итерация 10 плана аудита: функциональные баги в tools — Scanner buffer, Glob, Grep, EditFile, ToolResult, MCP collisions.

Added

  • bufio.Scanner.Buffer(1MB, 16MB) в read_file и grep — поддержка строк длиной до 16 МБ (раньше падали на >64KB)
  • Glob через github.com/bmatcuk/doublestar/v4 — корректная поддержка **/*.go, вложенных **/sub/**/*.ts и др.
  • Grep context_lines: правильная нумерация строк до совпадения (m.lineNum-len(before)+i вместо сломанной формулы)
  • Read-before-edit warning теперь возвращается в tool_result LLM (раньше игнорировался через _ = warn)
  • HTML→text парсинг через golang.org/x/net/html.Parse — корректно обрабатывает < в тексте, сущности &amp; и т.п. (раньше плоский regex ломался)
  • MCPToolWrapper коллизии имён: Registry.RegisterMCP автоматически добавляет суффикс _2, _3 (до 99) при коллизии; первая регистрация без коллизии — без суффикса
  • Registry.RegisterChecked(Tool) error — строгая регистрация с проверкой коллизий (для встроенных инструментов)
  • validateValue в helpers.go: добавлены ветки array (с рекурсивной валидацией items), object (с проверкой required/properties), number, целочисленность дробных float64
  • Registry.ExecuteStructuredToolResult{Content, IsError}; не-string результаты сериализуются через json.Marshal (объекты MCP-инструментов и пр.)
  • MessageTool лимит MaxMessageBytes = 64 KB — защита шины/UI/БД от выгрузки многомегабайтных сообщений
  • EditFileTool: подсчёт совпадений до правки, ошибка с инструкцией добавить контекст при count > 1, новый параметр replace_all bool для массовой замены
  • BaseTool.SetName(string) — для переименования при коллизиях MCP
  • 26 новых тестов в iter10_test.go: длинные строки, doublestar-паттерны, before-line numbering, count matches, replace_all, HTML-сущности и script/style stripping, MessageTool лимит, MCP-коллизии, structured ToolResult, validateValue для массивов/объектов/чисел

Changed

  • Registry.Register остался обратно-совместимым (без проверки коллизий, перезаписывает); строгая семантика — RegisterChecked
  • extractTextFromHTML переписан с правильным парсером DOM; убраны stripTag и плоские regex-замены
  • Glob использует filepath.WalkDir + doublestar.PathMatch для поддержки skipDirs (node_modules, .git, и пр.) совместно с глоб-паттернами

Fixed

  • Падение read_file/grep на файлах с длинными строками (>64 KB)
  • Неправильные номера строк в before-секции grep --context_lines (формула содержала len(m.before)-len(m.before))
  • Тихое игнорирование read-before-edit warning — LLM теперь видит предупреждение
  • Уязвимость HTML-парсинга на тексте с < и > (например, в неравенствах)
  • MCP-коллизии: при наличии двух MCP-серверов с одинаковыми именами инструментов второй молча перезаписывал первый