landing 26.800.0: ассистент умеет публиковать сайт, установщик — на миграциях
Небольшой релиз с одним ломающим краем: у AI-ассистента появился инструмент публикации сайта, у инструментов — логирование вызовов, а установщик модуля переехал на UpdateSystem\Migration. Ломается ровно один метод — и ломается тихо.
Публикация сайта как инструмент ассистента
Полный набор под одну операцию: PublishLandingSiteDto, PublishLandingSiteSchema, PublishLandingSiteTool, PublishLandingSiteHandler с методами publishSite(), unpublishSite(), getSitePublicUrl(). Зарегистрировано в LandingSiteToolRegistry.
Логичное продолжение прошлого релиза: ассистент уже умел создавать и менять сайт, но довести дело до публикации пользователь должен был руками. Теперь цикл закрыт — включая снятие с публикации, что важнее, чем кажется: инструмент, который умеет только публиковать, оставляет пользователя без способа откатиться тем же путём.
Доступность закрыта гейтом AiSiteRuntimeAvailabilityToolGate::isAiSitesReleaseOptionEnabled() — фича управляется опцией релиза, а не приезжает включённой всем.
Логирование вызовов инструментов
У базового класса появились BaseTool::isToolCallLogEnabled() и logToolCall(...).
Мелочь, которая много значит на практике. Инструмент ассистента — это код, который вызывает не человек и не ваш контроллер, а модель, по своему разумению, с аргументами, которые она сама собрала. Когда что-то идёт не так, вопрос «что именно было вызвано и с чем» становится первым, и без журнала на него ответить нечем.
Что сломается
Одно изменение, зато неприятное:
// было
AiSiteChatContextService::getEditorContext($siteId, $pageId, $suggestedTitle, ...)
// стало
AiSiteChatContextService::getEditorContext($siteId, $pageId, $siteTitle = '', $pageTitle = '', $suggestedTitle, ...)
Между $pageId и $suggestedTitle вставлены два строковых параметра. Все аргументы строковые, поэтому позиционный вызов со старым порядком не упадёт — он просто положит ваш $suggestedTitle в $siteTitle. Ошибка проявится как странное поведение ассистента, а не как исключение. Если вызываете этот метод — переходите на именованные аргументы.
Со стороны JS landing/aiassistant/widgetpanel теперь передаёт siteTitle и pageTitle в контекст чата — ради этого всё и затевалось: ассистент должен знать, как называются сайт и страница, с которыми работает.
Установщик
installDB / uninstallDB вызывают installMigrations() / uninstallMigrations($dropTables) вместо RunSQLBatch и массива $eventsData. SQL-файлы install/db/{mysql,pgsql}/install.sql, install_ft.sql, uninstall.sql удалены, схема — в install/migrations/tables.php (вместе с колонкой HTML_BLOCKS и таблицей b_landing_ai_site_binding из 26.700.0), события и агенты — в events.php / agents.php, конфиг — migration_config.json.
Для уже установленного модуля новой схемы здесь нет: это рефакторинг установщика. Механику разбираем отдельно.
Что делать
- Найдите вызовы
AiSiteChatContextService::getEditorContext— это единственная реальная опасность релиза, и она молчаливая. - Пишете свои инструменты ассистента — включите
logToolCall, пока не пришлось разбираться постфактум. - Проверьте опцию релиза AI-сайтов, если ждёте появления публикации в ассистенте.