Перейти к основному содержимому

Совместимость с наследием

NeoTavern сохраняет набор документированных контрактов для существующих расширений эпохи SillyTavern, чтобы плагины, написанные под эти API, могли продолжать работать, пока нативный Plugin SDK остаётся путём в будущее.

Глобальные объекты окна

Пакет @neotavern/legacy-compat устанавливает документированные глобальные объекты окна, которые ожидают старые расширения:

  • window.SillyTavern — с getContext(), eventSource и event_types.
  • window.eventSource — устаревший источник событий.
  • window.event_types — константы имён событий.
  • window.extension_settings — общий объект настроек расширений.
  • window.$ и window.jQuery — встроенный экземпляр jQuery.

Эти глобальные объекты устанавливаются идемпотентно и подключаются к хосту через мост, поэтому устаревший код читает те же контекст и события, что и нативный код.

Неуправляемые DOM-островки

Устаревшие frontend-расширения ожидают владения частью страницы. Для этого хост предоставляет неуправляемые DOM-островки: стабильный контейнер, к которому устаревший код может подключаться и которым может управлять напрямую, вне дерева React. Расширения получают контейнер, а хост обрабатывает остальную часть приложения вокруг него.

Устаревшие серверные плагины

Устаревшие серверные плагины работают через совместимый с Express хост. Их маршруты проксируются в /api/plugins/{pluginId}/..., в том же пространстве имён, которое используют нативные backend-плагины. Интеграция @fastify/express используется только внутри этого слоя совместимости — новое ядро нативно для Fastify и не маршрутизирует через Express.

Доверенная граница

Устаревшие точки входа — это доверенный режим, а не обход песочницы. Пакет, который их использует, должен объявить legacy.frontend или legacy.backend в своём манифесте и запросить разрешение legacy.trusted, которое экран согласия показывает с усиленным предупреждением. Устаревший frontend-код выполняется в главном окне, а устаревший backend-код получает роутер Express, ограниченный собственным пространством имён плагина. Безопасный режим вообще не загружает устаревшие точки входа. Подробности см. в Песочнице плагинов и Манифесте плагина.

Что не поддерживается

Совместимость — это документированный контракт, а не обещание универсального поведения. Плагины, зависящие от любого из перечисленного, не поддерживаются:

  • Случайные внутренние имена CSS-классов.
  • Монки-патчинг внутренностей приложения.
  • Приватные импорты из пакетов, которыми они не владеют.

Это детали реализации, которые меняются между релизами. Когда устаревший API всё же меняется, изменение сопровождается руководством по миграции и тестом совместимости.

Миграция вперёд

Для новой функциональности нативный Plugin SDK — поддерживаемый путь: версионируемый, проверяемый на разрешения, изолированный в песочнице и очищаемый хостом. Совместимость с наследием существует, чтобы поддерживать жизнь существующих расширений, а не для роста. Переносите расширения на SDK, чтобы получить полные гарантии безопасности и жизненного цикла.