Pular para o conteúdo principal

API de Frontend do Plugin

A API de frontend é o que um plugin do lado do navegador recebe em sua chamada activate(): um conjunto de registradores para cada superfície de interface, o barramento de eventos e i18n.

Ponto de Entrada

Um plugin de frontend exporta uma definição com uma função activate(api). O host a chama com o objeto FrontendPluginApi assim que o plugin é consentido e ativo:

import { definePlugin } from '@neotavern/plugin-sdk';

export default definePlugin({
activate(api) {
// Registre superfícies aqui.
},
deactivate() {
// Teardown explícito opcional.
},
});

Todo registrador retorna uma função de limpeza. O runtime as recolhe automaticamente, então seu plugin não precisa rastreá-las à mão — embora deactivate() ainda possa desmontar qualquer coisa que você gerencie por conta própria.

Superfícies de Registro

O namespace api.ui agrupa os registradores de interface:

  • Páginasapi.ui.pages.register({ id, path, title, mount }) adiciona uma rota sob o namespace do plugin. mount recebe um contêiner fornecido pelo host e pode retornar um teardown.
  • Painéis de configuraçõesapi.ui.settingsPanels.register(...) adiciona um painel à tela de Configurações.
  • Ações de barra de ferramentasapi.ui.toolbarActions.register({ id, title, icon, run }). O host renderiza a ação como um botão padrão; você fornece apenas a semântica, nunca layout ou breakpoints.
  • Ações de mensagemapi.ui.messageActions.register({ id, title, icon, order, placement, run }). O callback run recebe um snapshot imutável da mensagem mais um AbortSignal que dispara no teardown, na reinvocação ou no timeout.
  • Itens de menu de contextoapi.ui.contextMenuItems.register({ id, title, context, run }) para context: 'message' | 'character'.
  • Renderizadores de mensagemapi.ui.messageRenderers.register({ id, title, render }). render retorna texto simples com um placement de 'replace' ou 'after' — nunca HTML.
  • Abas de personagemapi.ui.characterTabs.register({ id, title, mount }). mount recebe { characterId } como contexto.
  • Painéis de barra lateralapi.ui.sidebarPanels.register({ id, title, slot, mount }) com slot: 'left' | 'right'.
  • Diálogosapi.ui.dialogs.register({ id, title, description, mount }).
  • Ações da paleta de comandosapi.ui.commands.register({ id, title, run }).
  • Atalhos de tecladoapi.ui.hotkeys.register({ id, combo, run }), por exemplo combo: 'mod+shift+k'.

Comandos de barra (slash commands) são registrados separadamente por meio de api.slash.register({ name, description, run }), e interceptadores de prompt por meio de api.interceptors.

Interceptadores de Prompt

Um interceptador roda sobre o prompt montado antes de ele ser enviado:

api.interceptors.register({
id: 'example.format',
priority: 100,
timeoutMs: 5000,
intercept(context) {
// context.messages é um array de { id, role, content, name }.
return context;
},
});

priority menor roda antes; um plugin que excede timeoutMs é ignorado sem quebrar a cadeia. Interceptadores que apenas inspecionam o prompt precisam de prompt.inspect; aqueles que o alteram precisam de prompt.modify.

Eventos

O barramento de eventos é tipado e compartilhado com o host. api.events.on(event, handler) retorna uma função de cancelamento de inscrição:

const off = api.events.on('chat.message.created', ({ chatId, messageId }) => {
console.log('new message', chatId, messageId);
});

Eventos integrados incluem chat.created, chat.opened, chat.message.created, chat.message.updated, chat.message.deleted, character.selected, generation.started, generation.delta, generation.finished, generation.error, theme.changed e language.changed. Plugins também podem emitir e escutar eventos customizados, com nomes com namespace por convenção, por exemplo myplugin.foo.

Snapshots de Mensagem e Gate de Conteúdo

Ações de mensagem recebem um MessageActionSnapshot imutável com messageId, chatId, branchId, role, content, name, meta e revision. O campo content é null a menos que o plugin também tenha chat.read, de modo que uma ação pode renderizar metadados sem nunca ver o texto da mensagem.

Notificações e i18n

api.notify({ title, description, variant, timeoutMs }) mostra uma notificação e retorna uma função de dispensar. variant é info, success, warning ou error.

api.i18n gerencia recursos de tradução em um namespace de plugin isolado:

api.i18n.addResources('ru', { greet: 'Привет' });
const label = api.i18n.t('greet');

addResources retorna uma função de limpeza como qualquer outro registro.

Garantias de Limpeza

Como todo registro retorna uma função de limpeza e o runtime as rastreia, desativar um plugin remove todos os seus handlers, timers, nós de DOM, inscrições e requisições em segundo plano. Veja Ciclo de Vida para o contrato completo de teardown, e a Referência do Plugin SDK gerada para os tipos precisos.