Manifiesto del plugin
El manifiesto del plugin (plugin.json) es la única fuente de verdad de un
plugin: identidad, puntos de entrada, permisos solicitados y capacidades
declaradas.
Estructura del Paquete
Un paquete .stplugin es un archivo ZIP que contiene plugin.json en la
raíz, los archivos de entrada a los que hace referencia y cualquier recurso.
El host valida el archivo antes de instalar nada: se rechazan la traversal
de rutas, los enlaces simbólicos, las cargas ejecutables y los límites de
tamaño.
Campos del Manifiesto
{
"id": "author.plugin-name",
"name": "Plugin Name",
"version": "1.0.0",
"apiVersion": 2,
"engines": { "neotavern": "^0.1.0" },
"frontend": "dist/frontend.js",
"backend": "dist/backend.mjs",
"styles": "dist/plugin.css",
"permissions": ["chat.read", "ui.messageActions", "network:api.example.com"],
"i18n": { "ru": "locales/ru.json", "de": "locales/de.json" }
}
Los campos principales son:
id— identificador de DNS inverso, por ejemploauthor.plugin-name. Es único entre todos los plugins instalados y estable entre actualizaciones.name— nombre legible que se muestra en el gestor de plugins.version— versión semántica (major.minor.patch). Alimenta las comparaciones de versiones y la invalidación de caché.apiVersion— la versión de la API del SDK a la que apunta el plugin. La versión actual es 3; la versión 2 sigue siendo la predeterminada hasta que el nuevo runtime llegue a producción.engines— restricciones de compatibilidad comoneotavern: "^0.1.0".frontend— ruta relativa a la entrada ESM del navegador.backend— ruta relativa a la entrada ESM de Node.js.styles— hoja de estilos opcional del plugin.i18n— código de locale a ruta relativa de los archivos JSON de traducción.
Permisos
La matriz permissions es la lista plana heredada del SDK v2. Los
manifiestos nuevos deberían declarar capacidades con ámbito en su lugar, a
través de requiredCapabilities y optionalCapabilities:
{
"requiredCapabilities": [
{ "name": "chat.read" },
{ "name": "network", "scope": "api.example.com" }
],
"optionalCapabilities": [{ "name": "lorebook.read" }]
}
requiredCapabilities son capacidades sin las cuales el plugin no puede
funcionar; optionalCapabilities son aquellas sin las que puede degradarse.
El usuario confirma cada capacidad solicitada en el momento de la
instalación. Agregar permisos nuevos en una actualización requiere un nuevo
consentimiento — consulta Permisos.
Puntos de Entrada Heredados
{
"legacy": {
"frontend": "legacy/main-window.js",
"backend": "legacy/server.mjs"
}
}
El bloque legacy apunta a entradas de compatibilidad de confianza para
extensiones existentes de SillyTavern. Los paquetes que usan cualquiera de
las dos entradas deben solicitar el permiso legacy.trusted, y la interfaz
muestra una advertencia más fuerte durante el consentimiento. El modo seguro
nunca carga puntos de entrada heredados. Consulta Sandbox
para saber en qué se diferencia de los plugins nativos.
Clientes OAuth
Los plugins que se conectan a un servicio externo pueden declarar clientes públicos OAuth 2.0 con flujo de código de autorización y PKCE:
{
"authClients": [
{
"serviceId": "com.example.idp",
"name": "Example IdP",
"authorizationUrl": "https://idp.example.com/oauth/authorize",
"tokenUrl": "https://idp.example.com/oauth/token",
"clientId": "neotavern-author.plugin-name",
"scopes": ["profile.read"]
}
]
}
Solo se permiten clientes públicos: clientSecret está prohibido porque el
código del plugin se ejecuta en un sandbox. Los endpoints deben ser HTTPS,
con una excepción de loopback HTTP plano para proveedores de identidad
locales durante el desarrollo. Cambiar un descriptor requiere reinstalar el
paquete.
Campos de Workers y Firma
Los manifiestos avanzados pueden declarar módulos adicionales:
workers— módulos de entrada relativos al paquete que el plugin puede lanzar como workers de cómputo aislados. Lanzar una entrada no declarada se rechaza.publisherysignature— firma del paquete.keyIdes la huellaed25519:<hex>de la clave pública de firma, ysignaturees la firma Ed25519 en base64 sobre el manifiesto canónico. Los define la herramienta de compilación de plugins, nunca se escriben a mano.
La función validateManifest del SDK verifica cada campo, y la
referencia del Plugin SDK generada documenta el tipo
exacto PluginManifest.