Los plugins sandboxed están aislados por defecto. Para hacer algo más allá de leer y escribir su propio KV y almacenamiento, un plugin debe declarar una capacidad en su manifiesto.
Declarar capacidades
{
"slug": "plugin-hello",
"capabilities": ["content:read", "network:request"],
"allowedHosts": ["api.example.com"]
}
Referencia de capacidades
| Capacidad | Otorga acceso a |
|---|---|
content:read | ctx.content.get(), ctx.content.list() |
content:write | ctx.content.create(), ctx.content.update(), ctx.content.delete() |
taxonomies:read | ctx.taxonomies.getAll(), ctx.taxonomies.getTerms() |
media:read | ctx.media.get(), ctx.media.list() |
media:write | ctx.media.getUploadUrl(), ctx.media.upload(), ctx.media.delete() |
network:request | ctx.http.fetch() — restringido a allowedHosts |
network:request:unrestricted | ctx.http.fetch() sin restricción de host |
users:read | ctx.users.get(), ctx.users.getByEmail(), ctx.users.list() |
email:send | ctx.email.send() |
Allowlists de hosts de red
"capabilities": ["network:request"],
"allowedHosts": ["api.example.com", "*.cdn.example.com"]
Lo que el sandbox impone
- Control de capacidades. El PluginContext solo llena las capacidades declaradas.
- Alcance de Storage y KV. Cada operación está limitada al slug del plugin.
- Aislamiento de red.
fetch()directo está bloqueado. - Sin bindings del host. Los plugins sandboxed no ven variables de entorno.
- Límites de recursos. El runner puede imponer límites de CPU, subrequests, tiempo y memoria.
Lo que el sandbox no impone
- Comportamiento dentro de una capacidad otorgada.
- Confianza del operador en Node.js.
- Canales laterales.
Consentimiento de capacidades
Al instalar un plugin, EmDash muestra un diálogo de consentimiento con las capacidades declaradas.
Validación en tiempo de build
Véase Bundling y publicación.