Plugin SDK reference
Descripción general del SDK de Plugin
El SDK de Plugin es el contrato tipado entre los plugins y el núcleo. Esta página es la referencia de qué importar y qué puedes registrar.
Convención de importación
Importa siempre desde una subruta específica:
Cada subruta es un módulo pequeño y autónomo. Esto mantiene el arranque rápido y
evita problemas de dependencias circulares. Para helpers de entrada/compilación
específicos de canal, prefiere openclaw/plugin-sdk/channel-core; reserva
openclaw/plugin-sdk/core para la superficie general más amplia y helpers
compartidos como buildChannelConfigSchema.
Para la configuración de canal, publica el JSON Schema propiedad del canal a través de
openclaw.plugin.json#channelConfigs. La subruta plugin-sdk/channel-config-schema
es para primitivas de esquema compartidas y el constructor genérico. Los plugins
incluidos de OpenClaw usan plugin-sdk/bundled-channel-config-schema para conservar
esquemas de canales incluidos. Las exportaciones de compatibilidad obsoletas permanecen en
plugin-sdk/channel-config-schema-legacy; ninguna subruta de esquema incluido es un
patrón para plugins nuevos.
Referencia de subrutas
El SDK de Plugin se expone como un conjunto de subrutas estrechas agrupadas por área (entrada de Plugin, canal, proveedor, autenticación, runtime, capacidad, memoria y helpers reservados de plugins incluidos). Para ver el catálogo completo, agrupado y enlazado, consulta Subrutas del SDK de Plugin.
El inventario de puntos de entrada del compilador vive en
scripts/lib/plugin-sdk-entrypoints.json; las exportaciones del paquete se generan desde
el subconjunto público después de restar las subrutas locales de pruebas/internas del repo listadas en
scripts/lib/plugin-sdk-private-local-only-subpaths.json. Ejecuta
pnpm plugin-sdk:surface para auditar el recuento de exportaciones públicas. Las subrutas públicas
obsoletas que son lo bastante antiguas y no se usan en código de producción de extensiones incluidas se
rastrean en scripts/lib/plugin-sdk-deprecated-public-subpaths.json; los barrels amplios
de reexportación obsoleta se rastrean en
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json.
API de registro
El callback register(api) recibe un objeto OpenClawPluginApi con estos
métodos:
Registro de capacidades
| Método | Qué registra |
|---|---|
api.registerProvider(...) |
Inferencia de texto (LLM) |
api.registerAgentHarness(...) |
Ejecutor de agentes experimental de bajo nivel |
api.registerCliBackend(...) |
Backend local de inferencia de CLI |
api.registerChannel(...) |
Canal de mensajería |
api.registerEmbeddingProvider(...) |
Proveedor reutilizable de embeddings vectoriales |
api.registerSpeechProvider(...) |
Síntesis de texto a voz / STT |
api.registerRealtimeTranscriptionProvider(...) |
Transcripción en tiempo real por streaming |
api.registerRealtimeVoiceProvider(...) |
Sesiones de voz en tiempo real dúplex |
api.registerMediaUnderstandingProvider(...) |
Análisis de imagen/audio/video |
api.registerImageGenerationProvider(...) |
Generación de imágenes |
api.registerMusicGenerationProvider(...) |
Generación de música |
api.registerVideoGenerationProvider(...) |
Generación de video |
api.registerWebFetchProvider(...) |
Proveedor de fetch / scraping web |
api.registerWebSearchProvider(...) |
Búsqueda web |
Los proveedores de embeddings registrados con api.registerEmbeddingProvider(...) también deben
figurar en contracts.embeddingProviders en el manifiesto del Plugin. Esta
es la superficie genérica de embeddings para la generación vectorial reutilizable. La búsqueda de memoria
puede consumir esta superficie genérica de proveedor. El seam anterior
api.registerMemoryEmbeddingProvider(...) y
contracts.memoryEmbeddingProviders es compatibilidad obsoleta mientras
migran los proveedores existentes específicos de memoria.
Los proveedores específicos de memoria que todavía exponen un runtime batchEmbed(...) permanecen en
el contrato existente de procesamiento por lotes por archivo, salvo que su runtime establezca explícitamente
sourceWideBatchEmbed: true. Esa opción permite que el host de memoria envíe fragmentos de
varios archivos de memoria sucios y fuentes habilitadas en una sola llamada batchEmbed(...) hasta
los límites de lote del host. Los adaptadores de lote que suben archivos de solicitud JSONL deben
dividir los trabajos del proveedor antes de su límite de tamaño de subida, además de su límite de
cantidad de solicitudes. El proveedor debe devolver un embedding por cada fragmento de entrada en el
mismo orden que batch.chunks; omite la marca cuando el proveedor espera lotes locales al archivo o
no puede preservar el orden de entrada en un trabajo más grande de toda la fuente.
Herramientas y comandos
Usa defineToolPlugin para plugins simples solo de herramientas
con nombres de herramienta fijos. Usa api.registerTool(...) directamente para plugins mixtos
o registro de herramientas totalmente dinámico.
| Método | Qué registra |
|---|---|
api.registerTool(tool, opts?) |
Herramienta de agente (obligatoria o { optional: true }) |
api.registerCommand(def) |
Comando personalizado (omite el LLM) |
Los comandos de Plugin pueden establecer agentPromptGuidance cuando el agente necesita una pista corta
de enrutamiento propiedad del comando. Mantén ese texto sobre el comando en sí; no añadas
política específica de proveedor o Plugin a los constructores de prompts del núcleo.
Las entradas de guía pueden ser cadenas heredadas, que se aplican a toda superficie de prompt, o entradas estructuradas:
agentPromptGuidance: [ "Global command hint.", { text: "Only show this in the main OpenClaw prompt.", surfaces: ["openclaw_main"] },];surfaces estructuradas pueden incluir openclaw_main, codex_app_server,
cli_backend, acp_backend o subagent. pi_main sigue siendo un alias obsoleto
de openclaw_main. Omite surfaces para guías intencionalmente aplicables a todas las superficies. No
pases un array surfaces vacío; se rechaza para que una pérdida accidental de alcance no
se convierta en texto de prompt global.
Las instrucciones de desarrollador nativas del app-server de Codex son más estrictas que otras superficies de
prompt: solo la guía explícitamente acotada a codex_app_server se promueve al
carril de mayor prioridad. La guía heredada como cadena y la guía estructurada sin alcance
siguen disponibles para superficies de prompt que no son Codex por compatibilidad.
Infraestructura
| Método | Qué registra |
|---|---|
api.registerHook(events, handler, opts?) |
Hook de evento |
api.registerHttpRoute(params) |
Endpoint HTTP de Gateway |
api.registerGatewayMethod(name, handler) |
Método RPC de Gateway |
api.registerGatewayDiscoveryService(service) |
Anunciante de descubrimiento de Gateway local |
api.registerCli(registrar, opts?) |
Subcomando de CLI |
api.registerNodeCliFeature(registrar, opts?) |
CLI de funcionalidad de Node bajo openclaw nodes |
api.registerService(service) |
Servicio en segundo plano |
api.registerInteractiveHandler(registration) |
Handler interactivo |
api.registerAgentToolResultMiddleware(...) |
Middleware de resultados de herramientas en runtime |
api.registerMemoryPromptSupplement(builder) |
Sección aditiva de prompt adyacente a memoria |
api.registerMemoryCorpusSupplement(adapter) |
Corpus aditivo de búsqueda/lectura de memoria |
Hooks de host para plugins de flujo de trabajo
Los hooks de host son los seams del SDK para plugins que necesitan participar en el ciclo de vida del host en vez de limitarse a añadir un proveedor, canal o herramienta. Son contratos genéricos; Plan Mode puede usarlos, pero también flujos de aprobación, controles de política de workspace, monitores en segundo plano, asistentes de configuración y plugins compañeros de UI.
| Método | Contrato que posee |
|---|---|
api.session.state.registerSessionExtension(...) |
Estado de sesión propiedad del Plugin, compatible con JSON, proyectado a través de sesiones del Gateway |
api.session.workflow.enqueueNextTurnInjection(...) |
Contexto duradero de exactamente una vez inyectado en el siguiente turno del agente para una sesión |
api.registerTrustedToolPolicy(...) |
Política de herramientas de confianza previa al Plugin, protegida por manifiesto, que puede bloquear o reescribir parámetros de herramientas |
api.registerToolMetadata(...) |
Metadatos de visualización del catálogo de herramientas sin cambiar la implementación de la herramienta |
api.registerCommand(...) |
Comandos de Plugin con ámbito; los resultados de comandos pueden establecer continueAgent: true o suppressReply: true; los comandos nativos de Discord admiten descriptionLocalizations |
api.session.controls.registerControlUiDescriptor(...) |
Descriptores de contribución de la IU de control para superficies de sesión, herramienta, ejecución o configuración |
api.lifecycle.registerRuntimeLifecycle(...) |
Callbacks de limpieza para recursos de runtime propiedad del Plugin en rutas de restablecimiento, eliminación o recarga |
api.agent.events.registerAgentEventSubscription(...) |
Suscripciones a eventos saneadas para estado de workflow y monitores |
api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
Estado temporal de Plugin por ejecución borrado en el ciclo de vida terminal de la ejecución |
api.session.workflow.registerSessionSchedulerJob(...) |
Metadatos de limpieza para trabajos del planificador propiedad del Plugin; no planifica trabajo ni crea registros de tareas |
api.session.workflow.sendSessionAttachment(...) |
Entrega de adjuntos de archivo mediada por el host, solo para incluidos, a la ruta activa de sesión directa saliente |
api.session.workflow.scheduleSessionTurn(...) / unscheduleSessionTurnsByTag(...) |
Turnos de sesión programados respaldados por Cron, solo para incluidos, más limpieza basada en etiquetas |
api.session.controls.registerSessionAction(...) |
Acciones de sesión tipadas que los clientes pueden despachar a través del Gateway |
Usa los espacios de nombres agrupados para el código de Plugin nuevo:
api.session.state.registerSessionExtension(...)api.session.workflow.enqueueNextTurnInjection(...)api.session.workflow.registerSessionSchedulerJob(...)api.session.workflow.sendSessionAttachment(...)api.session.workflow.scheduleSessionTurn(...)api.session.workflow.unscheduleSessionTurnsByTag(...)api.session.controls.registerSessionAction(...)api.session.controls.registerControlUiDescriptor(...)api.agent.events.registerAgentEventSubscription(...)api.agent.events.emitAgentEvent(...)api.runContext.setRunContext(...)/getRunContext(...)/clearRunContext(...)api.lifecycle.registerRuntimeLifecycle(...)
Los métodos planos equivalentes siguen disponibles como alias de compatibilidad
obsoletos para plugins existentes. No agregues código de Plugin nuevo que llame
directamente a api.registerSessionExtension, api.enqueueNextTurnInjection,
api.registerControlUiDescriptor, api.registerRuntimeLifecycle,
api.registerAgentEventSubscription, api.emitAgentEvent,
api.setRunContext, api.getRunContext, api.clearRunContext,
api.registerSessionSchedulerJob, api.registerSessionAction,
api.sendSessionAttachment, api.scheduleSessionTurn o
api.unscheduleSessionTurnsByTag.
scheduleSessionTurn(...) es una comodidad con ámbito de sesión sobre el
planificador Cron del Gateway. Cron posee la temporización y crea el registro de
tarea en segundo plano cuando se ejecuta el turno; el SDK de Plugin solo limita
la sesión de destino, los nombres propiedad del Plugin y la limpieza. Usa
api.runtime.tasks.managedFlows dentro del turno programado cuando el trabajo
en sí necesita estado duradero de Task Flow de varios pasos.
Los contratos dividen intencionalmente la autoridad:
- Los plugins externos pueden poseer extensiones de sesión, descriptores de IU, comandos, metadatos de herramientas, inyecciones del siguiente turno y hooks normales.
- Las políticas de herramientas de confianza se ejecutan antes de los hooks
before_tool_callordinarios y son de confianza para el host. Las políticas incluidas se ejecutan primero; las políticas de plugins instalados requieren habilitación explícita más sus ids locales encontracts.trustedToolPolicies, y se ejecutan después en el orden de carga de plugins. Los ids de política tienen el ámbito del Plugin que los registra. - La propiedad de comandos reservados es solo para incluidos. Los plugins externos deben usar sus propios nombres de comandos o alias.
allowPromptInjection=falsedeshabilita los hooks que mutan prompts, incluidosagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, los campos de prompt delbefore_agent_startheredado yenqueueNextTurnInjection.
Ejemplos de consumidores que no son de Plan:
| Arquetipo de Plugin | Hooks usados |
|---|---|
| Workflow de aprobación | Extensión de sesión, continuación de comando, inyección del siguiente turno, descriptor de IU |
| Puerta de política de presupuesto/espacio de trabajo | Política de herramientas de confianza, metadatos de herramientas, proyección de sesión |
| Monitor de ciclo de vida en segundo plano | Limpieza de ciclo de vida de runtime, suscripción a eventos de agente, propiedad/limpieza del planificador de sesión, contribución al prompt Heartbeat, descriptor de IU |
| Asistente de configuración u onboarding | Extensión de sesión, comandos con ámbito, descriptor de IU de control |
Cuándo usar middleware de resultado de herramienta
Los plugins incluidos y los plugins instalados habilitados explícitamente con contratos de
manifiesto coincidentes pueden usar api.registerAgentToolResultMiddleware(...) cuando
necesitan reescribir un resultado de herramienta después de la ejecución y antes de que el runtime
devuelva ese resultado al modelo. Esta es la unión de confianza neutral al runtime
para reductores de salida asíncronos como tokenjuice.
Los plugins deben declarar contracts.agentToolResultMiddleware para cada runtime
objetivo, por ejemplo ["openclaw", "codex"]. Los plugins instalados sin ese
contrato, o sin habilitación explícita, no pueden registrar este middleware; conserva
los hooks normales de Plugin de OpenClaw para el trabajo que no necesita temporización
de resultado de herramienta previa al modelo. La antigua ruta de registro de fábrica
de extensiones solo para el ejecutor embebido se eliminó.
Registro de descubrimiento del Gateway
api.registerGatewayDiscoveryService(...) permite a un Plugin anunciar el
Gateway activo en un transporte de descubrimiento local como mDNS/Bonjour. OpenClaw llama al
servicio durante el inicio del Gateway cuando el descubrimiento local está habilitado, pasa los
puertos actuales del Gateway y datos de pista TXT no secretos, y llama al handler
stop devuelto durante el apagado del Gateway.
api.registerGatewayDiscoveryService({ id: "my-discovery", async advertise(ctx) { const handle = await startMyAdvertiser({ gatewayPort: ctx.gatewayPort, tls: ctx.gatewayTlsEnabled, displayName: ctx.machineDisplayName, }); return { stop: () => handle.stop() }; },});Los plugins de descubrimiento del Gateway no deben tratar los valores TXT anunciados como secretos ni autenticación. El descubrimiento es una pista de enrutamiento; la autenticación del Gateway y el pinning TLS siguen siendo responsables de la confianza.
Metadatos de registro de CLI
api.registerCli(registrar, opts?) acepta dos tipos de metadatos de comandos:
commands: nombres de comandos explícitos propiedad del registradordescriptors: descriptores de comandos en tiempo de análisis usados para la ayuda de CLI, enrutamiento y registro diferido de la CLI del PluginparentPath: ruta opcional de comando padre para grupos de comandos anidados, como["nodes"]
Para funciones de nodos emparejados, prefiere
api.registerNodeCliFeature(registrar, opts?). Es un pequeño wrapper alrededor de
api.registerCli(..., { parentPath: ["nodes"] }) y hace que comandos como
openclaw nodes canvas sean funciones de nodo explícitas propiedad del Plugin.
Si quieres que un comando de Plugin permanezca con carga diferida en la ruta normal de la CLI raíz,
proporciona descriptors que cubran cada raíz de comando de nivel superior expuesta por ese
registrador.
api.registerCli( async ({ program }) => { const { registerMatrixCli } = await import("./src/cli.js"); registerMatrixCli({ program }); }, { descriptors: [ { name: "matrix", description: "Manage Matrix accounts, verification, devices, and profile state", hasSubcommands: true, }, ], },);Los comandos anidados reciben el comando padre resuelto como program:
api.registerCli( async ({ program }) => { const { registerNodesCanvasCommands } = await import("./src/cli.js"); registerNodesCanvasCommands(program); }, { parentPath: ["nodes"], descriptors: [ { name: "canvas", description: "Capture or render canvas content from a paired node", hasSubcommands: true, }, ], },);Usa commands por sí solo únicamente cuando no necesites registro diferido de la CLI raíz.
Esa ruta de compatibilidad temprana sigue siendo compatible, pero no instala
marcadores de posición respaldados por descriptores para la carga diferida en tiempo de análisis.
Registro de backend de CLI
api.registerCliBackend(...) permite a un Plugin poseer la configuración predeterminada para un backend de CLI
de IA local como claude-cli o my-cli.
- El
iddel backend se convierte en el prefijo del proveedor en refs de modelo comomy-cli/gpt-5. - La
configdel backend usa la misma forma queagents.defaults.cliBackends.<id>. - La configuración del usuario sigue teniendo prioridad. OpenClaw combina
agents.defaults.cliBackends.<id>sobre el valor predeterminado del Plugin antes de ejecutar la CLI. - Usa
normalizeConfigcuando un backend necesita reescrituras de compatibilidad después de la combinación (por ejemplo, normalizar formas antiguas de flags). - Usa
resolveExecutionArgspara reescrituras de argv con alcance de solicitud que pertenecen al dialecto de la CLI, como mapear los niveles de razonamiento de OpenClaw a un flag nativo de esfuerzo. El hook recibectx.executionMode; usa"side-question"para añadir flags de aislamiento nativos del backend para llamadas efímeras de/btw. Si esos flags deshabilitan de forma fiable las herramientas nativas para una CLI que de otro modo estaría siempre activa, declara tambiénsideQuestionToolMode: "disabled".
Para una guía de autoría de extremo a extremo, consulta Plugins de backend de CLI.
Ranuras exclusivas
| Método | Qué registra |
|---|---|
api.registerContextEngine(id, factory) |
Motor de contexto (uno activo a la vez). Las callbacks de ciclo de vida reciben runtimeSettings cuando el host puede proporcionar diagnósticos de modelo/proveedor/modo; los motores estrictos antiguos se reintentan sin esa clave. |
api.registerMemoryCapability(capability) |
Capacidad de memoria unificada |
api.registerMemoryPromptSection(builder) |
Constructor de sección de prompt de memoria |
api.registerMemoryFlushPlan(resolver) |
Resolvedor de plan de vaciado de memoria |
api.registerMemoryRuntime(runtime) |
Adaptador de runtime de memoria |
Adaptadores obsoletos de embeddings de memoria
| Método | Qué registra |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
Adaptador de embeddings de memoria para el Plugin activo |
registerMemoryCapabilityes la API exclusiva preferida para Plugins de memoria.registerMemoryCapabilitytambién puede exponerpublicArtifacts.listArtifacts(...)para que los Plugins complementarios puedan consumir artefactos de memoria exportados medianteopenclaw/plugin-sdk/memory-host-coreen lugar de acceder al diseño privado de un Plugin de memoria específico.registerMemoryPromptSection,registerMemoryFlushPlanyregisterMemoryRuntimeson API exclusivas compatibles con sistemas heredados para Plugins de memoria.MemoryFlushPlan.modelpuede fijar el turno de vaciado a una referencia exacta deprovider/model, comoollama/qwen3:8b, sin heredar la cadena de fallback activa.registerMemoryEmbeddingProviderestá obsoleto. Los proveedores nuevos de embeddings deben usarapi.registerEmbeddingProvider(...)ycontracts.embeddingProviders.- Los proveedores existentes específicos de memoria siguen funcionando durante la ventana de migración, pero la inspección de Plugins informa esto como deuda de compatibilidad para Plugins no empaquetados.
Eventos y ciclo de vida
| Método | Qué hace |
|---|---|
api.on(hookName, handler, opts?) |
Hook de ciclo de vida tipado |
api.onConversationBindingResolved(handler) |
Callback de enlace de conversación |
Consulta hooks de Plugin para ver ejemplos, nombres comunes de hooks y semántica de guards.
Semántica de decisión de hooks
before_install es un hook de ciclo de vida del runtime de Plugins, no la superficie de política de instalación
del operador. Usa security.installPolicy cuando una decisión de permitir/bloquear debe
cubrir rutas de instalación o actualización respaldadas por CLI y Gateway.
before_tool_call: devolver{ block: true }es terminal. Una vez que cualquier handler lo establece, se omiten los handlers de menor prioridad.before_tool_call: devolver{ block: false }se trata como ausencia de decisión (igual que omitirblock), no como una anulación.before_install: devolver{ block: true }es terminal. Una vez que cualquier handler lo establece, se omiten los handlers de menor prioridad.before_install: devolver{ block: false }se trata como ausencia de decisión (igual que omitirblock), no como una anulación.reply_dispatch: devolver{ handled: true, ... }es terminal. Una vez que cualquier handler reclama el despacho, se omiten los handlers de menor prioridad y la ruta predeterminada de despacho del modelo.message_sending: devolver{ cancel: true }es terminal. Una vez que cualquier handler lo establece, se omiten los handlers de menor prioridad.message_sending: devolver{ cancel: false }se trata como ausencia de decisión (igual que omitircancel), no como una anulación.message_received: usa el campo tipadothreadIdcuando necesites enrutamiento entrante de hilo/tema. Manténmetadatapara extras específicos del canal.message_sending: usa los campos tipados de enrutamientoreplyToId/threadIdantes de recurrir ametadataespecífico del canal.gateway_start: usactx.config,ctx.workspaceDiryctx.getCron?.()para el estado de arranque propiedad del Gateway en lugar de depender de hooks internosgateway:startup.cron_changed: observa los cambios de ciclo de vida de Cron propiedad del Gateway. Usaevent.job?.state?.nextRunAtMsyctx.getCron?.()al sincronizar programadores de activación externos, y mantén OpenClaw como la fuente de verdad para las comprobaciones de vencimiento y la ejecución.
Campos del objeto API
| Campo | Tipo | Descripción |
|---|---|---|
api.id |
string |
ID del Plugin |
api.name |
string |
Nombre para mostrar |
api.version |
string? |
Versión del Plugin (opcional) |
api.description |
string? |
Descripción del Plugin (opcional) |
api.source |
string |
Ruta de origen del Plugin |
api.rootDir |
string? |
Directorio raíz del Plugin (opcional) |
api.config |
OpenClawConfig |
Instantánea de configuración actual (instantánea activa del runtime en memoria cuando esté disponible) |
api.pluginConfig |
Record<string, unknown> |
Configuración específica del Plugin desde plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Helpers de runtime |
api.logger |
PluginLogger |
Logger con alcance (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
Modo de carga actual; "setup-runtime" es la ventana ligera de arranque/configuración previa a la entrada completa |
api.resolvePath(input) |
(string) => string |
Resuelve una ruta relativa a la raíz del Plugin |
Convención de módulos internos
Dentro de tu Plugin, usa archivos barrel locales para imports internos:
my-plugin/ api.ts # Public exports for external consumers runtime-api.ts # Internal-only runtime exports index.ts # Plugin entry point setup-entry.ts # Lightweight setup-only entry (optional)Las superficies públicas de Plugins empaquetados cargadas por facade (api.ts, runtime-api.ts,
index.ts, setup-entry.ts y archivos públicos de entrada similares) prefieren la
instantánea de configuración activa del runtime cuando OpenClaw ya se está ejecutando. Si aún no existe una
instantánea de runtime, recurren al archivo de configuración resuelto en disco.
Las facades de Plugins empaquetados deben cargarse mediante los cargadores de facade de Plugins de OpenClaw;
los imports directos desde dist/extensions/... omiten el manifiesto
y las comprobaciones de sidecar de runtime que las instalaciones empaquetadas usan para código propiedad del Plugin.
Los Plugins de proveedor pueden exponer un barrel estrecho de contrato local al Plugin cuando un helper es intencionalmente específico del proveedor y todavía no pertenece a una subruta genérica del SDK. Ejemplos empaquetados:
- Anthropic: seam público
api.ts/contract-api.tspara helpers de stream de beta-header de Claude yservice_tier. @openclaw/openai-provider:api.tsexporta constructores de proveedor, helpers de modelo predeterminado y constructores de proveedor realtime.@openclaw/openrouter-provider:api.tsexporta el constructor de proveedor más helpers de onboarding/configuración.
Relacionado
Opciones de definePluginEntry y defineChannelPluginEntry.
Referencia completa del espacio de nombres api.runtime.
Empaquetado, manifiestos y esquemas de configuración.
Utilidades de prueba y reglas de lint.
Migración desde superficies obsoletas.
Arquitectura profunda y modelo de capacidades.