From d197b6635d8c97c42e77ef4eea4910b4bf34bf9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20L=C3=B3pez?= Date: Wed, 15 Apr 2026 21:50:28 -0400 Subject: [PATCH 1/8] docs(extensions): add extensions overview page --- apps/extensiones/README.md | 47 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 apps/extensiones/README.md diff --git a/apps/extensiones/README.md b/apps/extensiones/README.md new file mode 100644 index 0000000..fd01a74 --- /dev/null +++ b/apps/extensiones/README.md @@ -0,0 +1,47 @@ +--- +description: >- + Las extensiones permiten embeber aplicaciones externas (iframe o web + components) dentro de los productos de Videsk, configurables por segmento. +--- + +# Extensiones + +Las extensiones son aplicaciones embebidas que se renderizan dentro de la Consola de Videsk. Pueden ser de dos tipos: + +| Tipo | Descripcion | Aislamiento | +| --- | --- | --- | +| **iframe** | Carga una URL externa en un iframe con sandbox | Completo (proceso separado) | +| **web-component** | Carga un modulo JS que define un Custom Element | Parcial (mismo contexto) | + +## Caracteristicas + +- **Configurables por segmento**: cada extension puede estar disponible solo para ciertos segmentos, o para todos (si no se especifica ninguno). +- **Placement flexible**: pueden renderizarse en el panel de llamada (`call-panel`), la barra lateral (`sidebar`) o como pagina independiente (`standalone`). +- **Permisos controlados**: los iframes reciben atributos `sandbox` y `allow` validados contra una lista blanca del backend. +- **Contexto de host**: la extension recibe datos del contexto actual (usuario, segmento, llamada, contacto) segun los scopes configurados. + +## Tipos de extension + +### Iframe + +Ideal para aplicaciones que necesitan aislamiento completo. La pagina embebida corre en un proceso separado del navegador, con permisos controlados por `sandbox` y `allow`. + +{% content-ref url="iframe.md" %} +[iframe.md](iframe.md) +{% endcontent-ref %} + +### Web Component + +Ideal para integraciones ligeras que necesitan acceso directo al DOM del host. El modulo JS registra un Custom Element que se monta directamente en la consola. + +{% content-ref url="web-components.md" %} +[web-components.md](web-components.md) +{% endcontent-ref %} + +## Protocolo de comunicacion + +Ambos tipos de extension se comunican con el host mediante un protocolo basado en `postMessage` (iframes) o `CustomEvent` (web components). + +{% content-ref url="postmessage.md" %} +[postmessage.md](postmessage.md) +{% endcontent-ref %} From 0260a17419b4ad80cf2f371f24a8ee7ff441acc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20L=C3=B3pez?= Date: Wed, 15 Apr 2026 21:51:25 -0400 Subject: [PATCH 2/8] docs(extensions): add iframe extensions spec --- apps/extensiones/iframe.md | 135 +++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 apps/extensiones/iframe.md diff --git a/apps/extensiones/iframe.md b/apps/extensiones/iframe.md new file mode 100644 index 0000000..eafc863 --- /dev/null +++ b/apps/extensiones/iframe.md @@ -0,0 +1,135 @@ +--- +description: >- + Como configurar extensiones de tipo iframe en la Consola de Videsk, + incluyendo permisos, sandbox y requisitos de seguridad. +--- + +# Iframe + +Las extensiones de tipo `iframe` cargan una pagina web externa dentro de un iframe aislado. Es el mecanismo recomendado para la mayoria de integraciones. + +## Requisitos + +### HTTPS obligatorio + +La URL de la extension **debe** servirse sobre `https://`. Contenido HTTP sera bloqueado por el navegador. + +### Content-Security-Policy + +Tu aplicacion debe permitir ser embebida por los dominios de Videsk: + +``` +Content-Security-Policy: frame-ancestors 'self' https://*.videsk.io; +``` + +Si tu app usa `X-Frame-Options`, eliminalo a favor de CSP. + +### Cookies + +Si la app embebida requiere sesion con cookies: + +``` +Set-Cookie: session=xxx; SameSite=None; Secure; HttpOnly +``` + +Si usa `localStorage` o `sessionStorage`, no es necesario. + +## Esquema de configuracion + +Al crear una extension via `POST /extensions`: + +```json +{ + "name": "Mi App", + "kind": "iframe", + "placement": "call-panel", + "segments": ["635c843f35f1254a417612d9"], + "iframe": { + "url": "https://app.example.com/embed", + "allow": ["camera", "microphone", "clipboard-write"], + "sandbox": ["allow-scripts", "allow-same-origin", "allow-forms"], + "width": "100%", + "height": "500px" + }, + "contextScopes": ["user", "segment", "call"] +} +``` + +### Campos de `iframe` + +| Campo | Tipo | Requerido | Descripcion | +| --- | --- | --- | --- | +| `url` | String | Si | URL HTTPS de la pagina a embeber | +| `allow` | String[] | No | Permisos del atributo `allow` del iframe | +| `sandbox` | String[] | No | Valores del atributo `sandbox` del iframe | +| `width` | String | No | Ancho CSS (default: `100%`) | +| `height` | String | No | Alto CSS (default: `100%`) | + +## Permisos `allow` + +Valores aceptados por el backend (otros seran rechazados): + +| Valor | Descripcion | +| --- | --- | +| `camera` | Acceso a la camara | +| `microphone` | Acceso al microfono | +| `display-capture` | Captura de pantalla | +| `clipboard-write` | Escritura en clipboard | +| `clipboard-read` | Lectura de clipboard | +| `autoplay` | Reproduccion automatica de audio/video | +| `fullscreen` | Modo pantalla completa | +| `geolocation` | Acceso a ubicacion | +| `picture-in-picture` | Modo picture-in-picture | + +**Valores por defecto** (si no se especifican): + +``` +camera; microphone; display-capture; clipboard-write; autoplay +``` + +## Permisos `sandbox` + +Valores aceptados: + +| Valor | Descripcion | +| --- | --- | +| `allow-scripts` | Ejecucion de JavaScript | +| `allow-same-origin` | Acceso a recursos del mismo origen | +| `allow-forms` | Envio de formularios | +| `allow-popups` | `window.open()` y links `target="_blank"` | +| `allow-popups-to-escape-sandbox` | Popups sin restricciones de sandbox | +| `allow-downloads` | Descargas de archivos | +| `allow-modals` | `alert()`, `confirm()`, `prompt()` | + +**Valores por defecto:** + +``` +allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads +``` + +{% hint style="warning" %} +Valores como `allow-top-navigation` no son aceptados por seguridad, ya que permitirian a la extension navegar la ventana principal. +{% endhint %} + +## HTML renderizado + +El iframe resultante en la consola sera similar a: + +```html +