Manifesto do Plugin
O manifesto do plugin (plugin.json) é a fonte única de verdade de um plugin:
identidade, pontos de entrada, permissões solicitadas e capacidades
declaradas.
Estrutura do Pacote
Um pacote .stplugin é um arquivo ZIP que contém plugin.json na raiz, os
arquivos de entrada que ele referencia e quaisquer ativos. O host valida o
arquivo antes de qualquer instalação: path traversal, symlinks, payloads
executáveis e limites de tamanho são todos rejeitados.
Campos do Manifesto
{
"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" }
}
Os campos principais são:
id— identificador reverse-DNS, por exemploauthor.plugin-name. Ele é único entre todos os plugins instalados e estável entre atualizações.name— nome legível mostrado no Gerenciador de Plugins.version— versão semântica (major.minor.patch). Alimenta comparações de versão e invalidação de cache.apiVersion— a versão da API do SDK que o plugin visa. A versão atual é 3; a versão 2 permanece como padrão até o novo runtime chegar em produção.engines— restrições de compatibilidade comoneotavern: "^0.1.0".frontend— caminho relativo para a entrada ESM do navegador.backend— caminho relativo para a entrada ESM do Node.js.styles— folha de estilo opcional do plugin.i18n— código de locale para caminho relativo dos arquivos JSON de tradução.
Permissões
O array permissions é a lista plana legada do SDK v2. Manifestos novos
devem declarar capacidades com escopo por meio de requiredCapabilities e
optionalCapabilities:
{
"requiredCapabilities": [
{ "name": "chat.read" },
{ "name": "network", "scope": "api.example.com" }
],
"optionalCapabilities": [{ "name": "lorebook.read" }]
}
requiredCapabilities são capacidades sem as quais o plugin não pode
funcionar; optionalCapabilities são aquelas sem as quais ele pode degradar.
O usuário confirma toda capacidade solicitada na instalação. Adicionar novas
permissões em uma atualização exige novo consentimento — veja
Permissões.
Pontos de Entrada Legados
{
"legacy": {
"frontend": "legacy/main-window.js",
"backend": "legacy/server.mjs"
}
}
O bloco legacy aponta para entradas de compatibilidade confiáveis para
extensões SillyTavern existentes. Pacotes que usam qualquer uma das entradas
devem solicitar a permissão legacy.trusted, e a interface mostra um aviso
mais forte durante o consentimento. O modo de segurança nunca carrega pontos
de entrada legados. Veja Sandboxing para saber como isso
difere dos plugins nativos.
Clientes OAuth
Plugins que se conectam a um serviço externo podem declarar clientes públicos OAuth 2.0 usando fluxo authorization-code com 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"]
}
]
}
Apenas clientes públicos são permitidos: clientSecret é proibido porque o
código do plugin roda em sandbox. Os endpoints devem ser HTTPS, com uma
exceção de loopback HTTP simples para provedores de identidade locais durante
o desenvolvimento. Alterar um descritor exige reinstalar o pacote.
Campos de Worker e Assinatura
Manifestos avançados podem declarar módulos adicionais:
workers— módulos de entrada relativos ao pacote que o plugin pode iniciar como workers de computação isolados. Iniciar uma entrada não declarada é rejeitado.publisheresignature— assinatura do pacote.keyIdé a impressão digitaled25519:<hex>da chave pública de assinatura, esignatureé a assinatura Ed25519 em base64 sobre o manifesto canônico. Eles são definidos pela ferramenta de build de plugins, nunca escritos à mão.
A função validateManifest do SDK verifica cada campo, e a
Referência do Plugin SDK gerada documenta o tipo exato
PluginManifest.