Hotfix таймаута вызовов git на Windows. Схема SQLite и BUILDER_VERSION (15) не тронуты — при переходе с 1.33.0 пересборка индексов не требуется; при обновлении с версий ниже 1.33.0 обязательная пересборка на v15 остаётся в силе. Контракты хелперов, состав MCP-тулов и поведение на Linux/macOS не меняются вовсе.
Исправлено
- Таймаут
gitна Windows не возвращал управление и не останавливал сам git (#26). Было так: все вызовы git (проверка репозитория, определение изменённых файлов при инкрементальном обновлении индекса, полнотекстовыйgit_search) читали вывод через трубы. По истечении таймаута стандартная библиотека Python завершает только корневой процесс, после чего снова уходит в ожидание конца вывода — теперь уже без ограничения по времени. Пока хотя бы один потомок держит унаследованный конец трубы, конца вывода не наступает, и вызов, заявленный как ограниченный, длится столько, сколько живёт потомок. Замер на контрольном примере: таймаут 0,2 с фактически отпускал вызывающего через ~1,3 с — по выходу потомка, а не по таймауту. Вторая половина проблемы серьёзнее:C:\Program Files\Git\cmd\git.exe— это программа-запускала (~45 КиБ), а не сам git. Точечная проверка на реальной установке Git for Windows показала живую цепочкуcmd\git.exe→mingw64\bin\git.exe→usr\bin\sh.exe→ вспомогательный процесс, и после завершения корня все три потомка продолжали работать: настоящий git дальше обходил репозиторий, удерживал файлы и накапливался от таймаута к таймауту в пределах одной живой сессии. Стало: на Windows вывод git пишется во временные файлы, а не в трубы, поэтому ожидание корня не зависит от потомков; сам корень создаётся сразу внутри объекта задания Windows (Job Object), и по таймауту завершается всё порождённое дерево целиком. На том же контрольном примере вызывающий возвращается за ~0,2 с, а все процессы цепочки исчезают. Временные файлы удаляются автоматически при закрытии последнего использующего их дескриптора. - Аргументы команд git, пути к репозиторию и текст поисковых шаблонов больше не попадают в
server.log. Было так: диагностика неудачных вызовов git писала в лог полную командную строку, путь к репозиторию, введённый шаблон поиска и сырой текст ошибки git. Стало: в лог идёт только код возврата или класс исключения. Диагностика, которую получает агент (полеdetailи текст ошибки git), не изменилась.
Изменено
- Отказ подготовки временного каталога для вывода git отключает только ускорение через git, а не сервер. Если каталог недоступен для записи, вызовы git не выполняются: проверка репозитория отвечает «git недоступен», инкрементальное обновление индекса честно уходит в полный обход, а
git_searchвозвращает свою обычную ошибку запуска. MCP-сервер при этом стартует и работает как прежде. - Служба Windows держит вывод git в собственном защищённом каталоге внутри каталога конфигурации, а не в общем временном (
C:\Users\<пользователь>\.config\rlm-tools-bsl\git-captureпри установке по умолчанию). Каталог создаётся при старте службы, проверяется на подмену ссылкой и закрывается правами так, что доступ к нему есть только у учётной записи службы,SYSTEMи администраторов. Если подготовить его не удалось, служба всё равно запускается — в журнале появляется одна строка о том, что ускорение через git отключено. Для ручного запуска сервера и CLI используется системный временный каталог; на многопользовательских хостах он должен быть закрыт стандартными правами Windows. - Служба убирает временные файлы, оставшиеся от прошлого запуска. Обычно чистить нечего: удаление выполняет сама Windows при закрытии последнего дескриптора, поэтому файлы исчезают и после нормального завершения git, и после снятия зависшего дерева по таймауту, и даже когда процессы убивают жёстко. Но при аварийном выключении машины (пропало питание, BSOD, перезагрузка по кнопке) дескрипторы не закрываются вовсе, и файл остаётся на диске. Раньше такой остаток лежал бы в каталоге службы бессрочно: общий временный каталог Windows со временем чистит сама, а приватный каталог службы — никто. Теперь при старте службы, до запуска сервера, выполняется однократный проход по каталогу; удаляются только файлы вида
rlm-tools-bsl-git-*.tmp, а посторонние файлы и вложенные каталоги не трогаются. Если что-то было убрано, в журнал пишется строка с числом файлов — регулярное её появление означает, что хост уходит в перезагрузку некорректно.
Известные ограничения
- Если объект задания Windows создать не удалось, git всё равно запускается с записью вывода в файлы: вызывающий по-прежнему возвращается по таймауту, но завершение всего дерева процессов в этой ветке не гарантируется — осиротевший потомок может доработать сам и до своего выхода удерживать временный файл (имя и занятое место на диске). Ветка диагностируется и отмечается в журнале.
Полный список изменений: CHANGELOG.md