1.6.0

Added (#397)

  • Проброс файловых вложений в подагента — новый параметр attachments тула spawn (массив путей относительно workspace, ≤ 8; #397). Мотивация: сценарий «text-only родитель делегирует разбор изображений vision-специалисту» был нерабочим — граница spawn передавала только текст, prepareChildRun собирал дочерние сообщения как {Role, Content} и отбрасывал мультимодальные Parts, инструментов с image-частями нет: подагент получал только текст и не видел картинку. Теперь: валидация путей fail-fast (spawnAttachmentsFromParams): safeWorkspacePath анти-escape + symlink-containment против канонического workspace (EvalSymlinks; в FileAttachment.Path кладётся канонический относительный путь — symlink-компоненты раскрыты, подмена ссылки между spawn и стартом run’а не меняет читаемые байты), сниффинг содержимого для заявленных изображений (mislabel → путь-заметка вместо data-URL-400), image-кап 5 MiB (maxAttachmentImageBytes, паритет с #388; не-изображения не капаются — инструменты ребёнка имеют свои лимиты); в prepareChildRun (единая точка для sync и async) вложения проходят vision-гейт по модели ребёнка (profile.ModelID / дефолт агента + его провайдер; resolveChildImageGate — общая точка для фидбека и инъекции): image-части встраиваются инлайном через imagePartsFromAttachments в ctxBuilder.CurrentParts (конверсия сообщений теперь переносит Parts; чтение — через открытый один раз дескриптор, пин inode против TOCTOU), всё остальное (не-изображения, text-only модель) — текстовой заметкой attachmentNote; ответ spawn сообщает сплит-вердикт attachments_delivered (image-пути, инлайн best-effort) + attachments_by_path, либо attachments_text_only — родительская модель знает, дошло ли. Провайдеры не менялись: OpenAI-compat и Anthropic уже несут image-части в user-сообщениях. Стык с #396: правильные vision-метки реестра — условие сценария (glm-5.3 больше не получает картинку инлайном и не падает 400; glm-5.3-flash видит её в подагенте). Попутно imagePartsFromAttachments (chat-путь #388) получил best-effort symlink-containment (не активируется только когда сам workspace неканоникализуем — без регрессии на бинд-маунтах).

Review (#397)

  • ocr review — находки и решения см. в комментарии. Проверки: go test ./... -count=1, golangci-lint run ./... (0), go vet, make build-cross (6 платформ) — зелёные; фронт не менялся (схема тула — только для LLM). Тесты: TestSpawnAttachmentsFromParams (валидация/escape/лимиты), TestSpawn_AttachmentsForwardedToVisionChild_Sync/Async и TestSpawn_AttachmentsTextOnlyChild_Sync (энд-ту-энд через requestCaptureProvider: image-part в последнем user-сообщении ребёнка / только заметка), TestSpawn_AttachmentsInvalidPathFailsFast.