Skip to content

Interfaz web (alisio serve) ​

alisio serve arranca un servidor HTTP local que da acceso desde el navegador a varios workspaces y sesiones a la vez. Conduce el mismo núcleo de agente que la terminal: sesiones, ejecuciones, aprobaciones y la base de datos de sesiones se comparten con la TUI y con alisio run.

Estado

El servidor, su API y la interfaz del navegador están disponibles, incluidos los adjuntos de imagen, el panel de archivos, la vista de trayectoria, los renderizadores de desarrollo (diff, terminal, JSON, resultados de tests), los diagramas Mermaid, las fórmulas TeX y las páginas de Ajustes para modelos, complementos, skills, servidores MCP y presets de agente. Consulta Limitaciones conocidas.

Arrancar el servidor ​

sh
alisio serve                      # http://127.0.0.1:4317, opens the browser
alisio serve --no-open --port 0   # any free port, print the URL only
alisio serve --allow-write        # web sessions may write files without asking

El comando imprime una URL de arranque con un token de un solo uso, por ejemplo http://127.0.0.1:4317/?token=…. Al abrirla, el token se canjea por una cookie de sesión y se redirige a /. Mantén la URL en privado: quien la abra primero en un navegador puede conducir el agente con sus permisos. Pulsa Ctrl+C (o envía SIGTERM) para detener el servidor; un segundo Ctrl+C fuerza la salida.

alisio, alisio run y la TUI nunca cargan el servidor: solo lo importa alisio serve.

Flags ​

FlagPor defectoDescripción
--port <port>4317Puerto de escucha; 0 elige uno libre
--host <address>127.0.0.1Dirección de enlace; cualquier cosa que no sea loopback exige --allow-remote
--allow-remotedesactivadoPermite un --host que no sea loopback (sin TLS; mejor un túnel SSH)
--no-openabreNo abre el navegador
--max-workspaces <n>4Workspaces con una aplicación abierta a la vez
--max-runs <n>4Ejecuciones simultáneas entre todas las sesiones; las demás esperan en cola

También se aplican los flags globales. Los flags de permisos (--allow-write, --allow-process, --allow-analysis, --allow-external, --allow-mcp, --read-only) son el techo de toda sesión web: el navegador puede estrecharlos por sesión, pero nunca superarlos. --trust-project y --config se aplican a cada workspace que abre el servidor, igual que en la terminal. --db elige la base de datos de sesiones compartida. Define ALISIO_LOG_LEVEL (debug, info, warn, error, silent) para controlar las líneas de log JSON que el servidor escribe en stderr.

Usar la interfaz web ​

La página tiene una barra lateral a la izquierda y la sesión abierta a la derecha.

Barra lateral. Nueva sesión empieza una sesión en el proyecto que está viendo. Bajo Proyectos (un proyecto es una carpeta de workspace), cada carpeta lista sus sesiones, primero las fijadas y luego las usadas más recientemente, con un tiempo relativo ("4 min"). Un punto antes del título indica una sesión en ejecución, que espera su respuesta, en uso por otro proceso o cuya última ejecución falló. En cuanto hay un proyecto fijado, la lista se divide en Fijados (los proyectos fijados, ordenados por ruta, porque el servidor no guarda cuándo se fijó) y Recientes (los demás, con la actividad más reciente primero: su última apertura o la última actualización de una sesión); sin ninguno fijado es una sola lista ordenada como Recientes. Cada encabezado es un botón que contrae su grupo (se recuerda por navegador, como las carpetas). Los iconos junto al encabezado contraen o expanden todas las carpetas de proyecto a la vez (los grupos Fijados / Recientes conservan su propio estado), buscan sesiones (también Ctrl+K / Cmd+K), muestran las sesiones y los proyectos archivados y abren otro proyecto (mira Abrir un proyecto). Las carpetas que contraes siguen contraídas tras recargar (se recuerda por navegador; los proyectos nuevos empiezan abiertos y una búsqueda abre las carpetas sin cambiar eso). Al pasar sobre una sesión aparecen Fijar y Archivar, y sobre una carpeta, una nueva sesión dentro de ella y su menú de acciones (Fijar, Color, Ajustes del proyecto…, Archivar / Desarchivar). Color abre una fila de círculos de colores (o Predeterminado) que tiñe el icono de carpeta del proyecto; se guarda en el servidor junto con el proyecto y se maneja con el teclado (flechas, Intro). Ajustes del proyecto… abre un diálogo de ese proyecto (más abajo). Ajustes está abajo; el icono de panel contrae la barra a un riel estrecho. Por debajo de 900 px la barra lateral pasa a ser un cajón que se abre desde la cabecera. Con muchas aplicaciones de complementos, Aplicaciones muestra las cinco primeras (más la abierta) y un botón Mostrar todas (N); la lista completa se desplaza dentro de su propia zona, así que Nueva sesión, Complementos, Proyectos y Ajustes y herramientas quedan siempre a la vista (la elección se recuerda en cada navegador). En el riel, los iconos de las aplicaciones se desplazan entre el botón Complementos y el engranaje. Las barras de desplazamiento de toda la interfaz son finas y superpuestas: aparecen al desplazarte, al mover el puntero sobre un panel o al usar el teclado, y se ocultan al poco; los bloques de código y las tablas conservan una barra fina propia.

La barra lateral con los grupos Fijados y Recientes, una carpeta de proyecto con color y la paleta de colores de proyecto
Proyectos en la barra lateral: grupos de fijados y recientes, colores de carpeta y paleta de colores.

Ajustes del proyecto. El elemento Ajustes del proyecto… del menú de un proyecto abre un diálogo con un campo Nombre, la Carpeta (su nombre y la ruta completa, seleccionable y con botón de copiar), la paleta de Color e interruptores para Fijado, Proyecto de confianza y Archivado. El nombre es solo lo que Alisio muestra en la barra lateral: cambia la etiqueta del proyecto, nunca renombra la carpeta en el disco, y un nombre vacío vuelve al nombre de la carpeta (el texto de ejemplo del campo). El nombre se guarda con Guardar o Intro (máximo 200 caracteres); el color, fijado, confianza y archivado se aplican en cuanto los cambias, y dar confianza a un proyecto pide la misma confirmación que el elemento del menú. Un proyecto cuya carpeta ya no existe lo indica y oculta el interruptor de confianza. El diálogo es el mismo en el navegador y en Alisio Desktop. Escape o Cerrar lo cierra y el foco vuelve al botón de menú del proyecto.

El diálogo Ajustes del proyecto con el nombre, la ruta de la carpeta, la paleta de colores y los interruptores de fijado, confianza y archivado
El diálogo Ajustes del proyecto: nombre, carpeta, color y los interruptores de fijado, confianza y archivado.

Cabecera. Haz clic en el título para renombrar la sesión (las sesiones sin título muestran su primer prompt). La insignia muestra el agente y el preset de permisos. Log de sesión descarga la sesión como JSON Lines: cada evento durable en el formato de alisio run --json y después una línea {"type":"message"} por cada mensaje guardado. El icono de panel a la derecha abre el panel de archivos (más abajo). Las pestañas Conversación, Trayectoria y, con el complemento de memoria habilitado, Memoria cambian la vista principal.

Conversación. Tus mensajes aparecen a la derecha con un botón de copiar. El trabajo del agente aparece como filas de una línea: Razonamiento · …, Inyección de contexto · AGENTS.md y una fila por llamada a herramienta, como Read · README.md o Shell · npm test. Haz clic en una fila para ver su entrada y su salida. La respuesta llega en streaming como Markdown; los bloques de código tienen etiqueta de lenguaje, Ajustar líneas y Copiar, y se resaltan cuando entran en pantalla. Los enlaces a rutas del workspace abren el archivo en el panel de archivos. Los bloques ```mermaid se convierten en diagramas, y ```math, los párrafos $$ … $$ y \( … \) en línea, en fórmulas (un $ suelto sigue siendo texto, así que los precios no se alteran). La página carga Mermaid solo cuando un diagrama entra en pantalla y KaTeX con la primera fórmula. Los diagramas tienen Fuente, zoom, Exportar SVG, pantalla completa y Copiar; las fórmulas, un botón para copiar su TeX. Un diagrama o una fórmula no válidos muestran su fuente y el error, sin romper el mensaje. El razonamiento es solo de visualización: tras recargar, las filas de razonamiento anteriores desaparecen porque nunca se guarda. Al desplazarse hacia arriba, un botón vuelve al último mensaje; las sesiones largas muestran los últimos 30 turnos y cargan los mensajes anteriores a demanda.

Estado de la ejecución. Mientras una ejecución está en curso, una línea al final de la conversación dice lo que realmente está haciendo, a partir únicamente de los eventos y la salida en streaming que la página ha recibido: Esperando al modelo…, Pensando…, Redactando la respuesta…, Leyendo tus datos (ventas.csv)…, Ejecutando Python (analisis.py)…, Publicando el artefacto (dashboard.html)…, Ejecutando <herramienta>…, Compactando el contexto… (también durante un /compact manual, cuando no hay ejecución; el envío se bloquea hasta que termina y el borrador se conserva), El modelo no respondió; reintentando (1/1)… (mientras se reenvía una petición silenciosa, ver limits.firstTokenRetries), La respuesta se cortó; reintentando en pasos más pequeños (1/2)… (el límite de tokens de salida cortó la respuesta y se vuelve a pedir el turno, ver limits.truncationRecoveries) o Esperando tu aprobación / tu respuesta (estas dos nunca cuentan como bloqueo). Junto a ella aparecen el tiempo transcurrido de la ejecución, el del paso actual y cuándo llegó algo por última vez (última actualización hace 3 s). Si no llega nada durante 15 s, la línea indica cuánto lleva en silencio y muestra Detener; a los 60 s dice sin rodeos Sin respuesta del modelo desde hace 60 s (o «herramienta» no ha producido salida… cuando es una herramienta la que se ejecuta) y sugiere esperar o detener. La espera de un subagente nunca se informa como bloqueo, porque sus eventos pertenecen a otra sesión. La línea solo lee frames y nunca inventa actividad. Se anuncia a los lectores de pantalla únicamente cuando cambia el paso o el nivel de silencio (no cada segundo) y su indicador se detiene con reducir movimiento. Tras recargar, el tiempo transcurrido continúa desde la hora de inicio del servidor; la hora de la última actualización se reinicia con la recarga, porque la página no puede saber cuándo llegó el frame anterior.

Una conversación durante un /compact manual: la línea de estado bajo la última respuesta dice Compactando el contexto…, el botón de enviar está deshabilitado y el borrador escrito en el cuadro de mensaje se conserva.
Un /compact manual en curso: se muestra la línea de estado, el envío queda bloqueado y el borrador permanece en el cuadro de mensaje.

Si una ejecución se detiene por su límite de tiempo, la conversación muestra un mensaje que nombra el modelo y el proveedor, los segundos de tiempo activo y cómo continuar (reintentar, cambiar de modelo, subir limits.timeoutMs; ver configuración). El tiempo que tardas en decidir una aprobación, una pregunta o la revisión del plan no cuenta para ese límite.

Salida de herramientas. Las herramientas que devuelven bloques estructurados tienen una vista nativa, que se carga la primera vez que hace falta: las escrituras y ediciones de archivos muestran un diff (unificado por defecto, Lado a lado a demanda, hunks plegables y una lista de archivos cuando un parche toca varios); los comandos de shell muestran su salida con colores ANSI, el código de salida y la duración, en streaming mientras se ejecutan y con las últimas 2 000 líneas visibles detrás de Mostrar líneas anteriores; JSON se muestra como un árbol plegable con copia de valores y de su JSONPath; los resultados de tests muestran el total de correctos, fallidos y omitidos con un filtro Solo fallos; los bloques de progreso muestran sus pasos. El texto original de la herramienta, que es lo que recibió el modelo, queda bajo Salida en bruto. Un bloque que la página no conoce muestra su texto y el JSON plegado. El icono de panel de una fila de herramienta con ruta abre ese archivo. Las herramientas que aportan los complementos muestran su propio nombre seguido del nombre del complemento como etiqueta (por ejemplo Test report · Smoke tools).

Trayectoria. La pestaña Trayectoria lista los eventos durables de la sesión agrupados por ejecución: estado, hora de inicio, turnos y duración de cada ejecución, y una fila por evento con su hora, turno, tipo, un resumen breve y su duración cuando la tiene. Se actualiza a medida que llegan eventos; las ejecuciones antiguas quedan detrás de Mostrar runs anteriores.

La pestaña Trayectoria con los eventos durables de una sesión (tool_started, tool_completed, turn_completed, artifact_published, memory_save) y un dashboard ejecutivo de ventas abierto en el panel de artefactos a la derecha.
La pestaña Trayectoria: una fila por evento durable, con un artefacto abierto en el panel lateral.

Panel de archivos. El icono de panel de la cabecera abre un panel a la derecha (una hoja inferior por debajo de 900 px) con tres pestañas. Archivos recorre el workspace a demanda, de 1 000 en 1 000 entradas, ocultando .git y, en repositorios git, lo que excluye .gitignore. Cambios lista los archivos que esta sesión (y sus subagentes) escribió, los más recientes primero, con su código de git status; al elegir uno se ven su diff frente a HEAD y el archivo. Vista previa muestra texto y código resaltado, Markdown, JSON como árbol e imágenes; los archivos de más de 2 MB se recortan con un enlace Descargar, los binarios solo se pueden descargar, y HTML o SVG se muestran como código, nunca como página. Desde la vista previa se puede copiar la ruta, descargar el archivo o mencionarlo (@ruta) en el compositor.

Compositor. Enter envía, Shift+Enter inserta un salto de línea, y ↑/↓ en la primera línea recorren los prompts enviados. Escribir / abre la paleta de comandos (flechas para moverse, Enter o Tab para elegir, Esc para cerrar): los comandos se ejecutan en el servidor y su salida aparece en la conversación; las plantillas de prompt, las skills y /ask se convierten en un prompt. / fuera de un campo de texto lleva el foco al compositor.

Preguntas laterales (/btw). /btw pregunta consulta algo sobre la sesión actual sin añadirlo a la conversación, también mientras un run trabaja. Un panel flotante muestra la pregunta pendiente (con Cancelar), luego la respuesta en Markdown, el modelo y los tokens usados, un botón de copiar y ‹ 2/5 › para recorrer las respuestas laterales anteriores (←/→ cuando el foco no está en un campo de texto; Esc lo cierra y cancela una pregunta pendiente). /btw solo abre el panel en tu respuesta lateral más reciente, o muestra Usage: /btw <question> si no hay ninguna. Las preguntas laterales nunca se escriben en la transcripción, los eventos, los runs ni los tokens de la sesión; se guardan las 20 últimas por sesión, compartidas con la TUI.

Debajo del cuadro de texto:

ControlQué hace
+Adjuntar imágenes PNG, JPEG, GIF o WebP, de hasta 10 MB cada una y 8 por mensaje (también se pueden pegar o arrastrar)
Preset de permisosSolo lectura, Preguntar, Escritura en workspace o Acceso total para esta sesión
Modelo y esfuerzoModelo del proveedor del workspace y el esfuerzo de razonamiento que admite
Anillo de contextoContexto estimado de la próxima petición frente a la ventana del modelo
Enviar / DetenerDetener sustituye a Enviar mientras hay una ejecución activa y el cuadro está vacío

Mientras hay una ejecución activa puedes seguir escribiendo: el texto se encola para el siguiente turno de la sesión. Las imágenes se suben en cuanto se añaden y aparecen como miniaturas que se pueden quitar; solo se pueden enviar cuando no hay una ejecución activa.

Línea de estadísticas. Bajo el compositor, una línea resume la última ejecución: turnos, pasos (llamadas a herramientas), tiempo en el modelo y en herramientas, tiempo medio hasta el primer token, tokens de salida por segundo, la parte de la entrada servida desde la caché de prompts del proveedor y los tokens de entrada. Al pasar el ratón se ven los totales de toda la sesión; cuando hubo decisiones, el tooltip también indica cuántas se respondieron y cuántas recurrieron al valor por defecto (consulta Decision Intelligence). La caché muestra — cuando el proveedor no informa de la entrada en caché. El comando /decisions funciona en el cuadro de mensaje igual que en la terminal: consulta /decisions.

Aprobaciones y preguntas. Cuando una herramienta necesita aprobación, un panel ocupa el lugar del compositor y recibe el foco: indica la herramienta, el efecto y su entrada. Responde con Denegar (D), Permitir una vez (O) o Permitir en la sesión (S); las teclas pulsadas en los primeros 300 ms se ignoran para que un Enter accidental no apruebe. Las preguntas de complementos (por ejemplo ask_user_question) aparecen del mismo modo.

Ajustes. El menú Ajustes y herramientas al pie de la barra lateral agrupa Agentes, Creador de skills y Ajustes; Ajustes abre esta ventana. Las páginas que gestionan recursos del agente actúan sobre el workspace de la sesión abierta (o el primer workspace si no hay ninguna):

El menú Ajustes y herramientas al pie de la barra lateral, abierto, con Agentes, Creador de skills y Ajustes.
El menú Ajustes y herramientas: Agentes, Creador de skills y Ajustes.
PáginaQué hace
GeneralIdioma de la interfaz (este navegador) y los ajustes del agente: compactación, contexto, límites, tiempo máximo de los hooks de complementos y proveedor de búsqueda web, guardados en tu config.json de usuario
ModelosPerfiles de proveedor con sus valores no secretos, credenciales y Activar en este workspace con un modelo del perfil; Añadir un perfil crea uno
ComplementosCuatro pestañas: Configuración de complementos (sin aislamiento, cómo se instalan, el archivo del proyecto), Complementos instalados (búsqueda, píldoras de actualización, interruptor y Desinstalar), Catálogo de complementos (explorar e instalar) e Instalar desde archivo (complementos privados .tgz); consulta Catálogo de complementos, instalación y actualizaciones. El menú Complementos de la barra lateral también abre el Creador de complementos
SkillsSkills descubiertas con su ámbito, tamaño e interruptor; las deshabilitadas salen de la paleta /. Nueva skill abre el Creador de skills
Servidores MCPEstado, transporte y contadores de cada servidor configurado, interruptor y Conectar; Conceder acceso MCP pide antes una confirmación explícita. La pestaña Explorar recorre el catálogo MCP guardado en este equipo (búsqueda, categoría, dónde se ejecuta, filtro de listos para instalar, 24 por página, actualizar ahora); Instalar o Conectar abre un formulario compacto (solo lo que Alisio no puede decidir: claves como campos de contraseña y el consentimiento MCP existente sin marcar), permite elegir Solo este proyecto o Todos mis proyectos, muestra el progreso con Cancelar y termina con Instalar y comprobar / Conectar y comprobar. La lista Conectados muestra dónde se ejecuta cada servidor (En este equipo / Servicio remoto) y dónde está disponible (Global / Proyecto) como distintivos separados y, en un servidor web o sin interfaz, dice En el equipo donde se ejecuta Alisio en lugar de atribuirlo al equipo del navegador. Cada fila ofrece Comprobar conexión (una comprobación aislada que lista lo que anuncia el servicio sin llamar a ninguna herramienta, con sus etapas y una vía de recuperación), Configurar (un formulario tipado donde una clave guardada solo aparece como Clave guardada), Actualizar para paquetes instalados, Iniciar sesión / Cerrar sesión para servicios con OAuth, y un Quitar / Desconectar según el ámbito que nunca promete cancelar una cuenta. Detalles en una ficha del catálogo muestra quién lo ofrece, dónde se ejecuta, qué necesita y qué le pedirá. Las fichas PyPI, OCI, MCPB y SSE lo dicen y remiten a la configuración manual (consulta Configuración). Hay una guía paso a paso con capturas en Catálogo MCP
Presets de agentebuild, plan y los agentes de usuario o de complementos aptos para la sesión principal, con instrucciones y modelo sugerido; Usar en esta sesión cambia la sesión abierta
AparienciaTema (oscuro, claro o sistema) y si las filas de herramientas empiezan plegadas o desplegadas, guardado en este navegador

Iniciar sesión en un proveedor ​

Un proveedor cuyo complemento declara métodos de inicio de sesión muestra un bloque Iniciar sesión en la tarjeta de su perfil, con un botón por método (la etiqueta y la descripción las aporta el complemento). Mientras corre un inicio de sesión, el bloque consulta al servidor cada segundo y muestra lo que pide el complemento: un código de dispositivo y su dirección con botones Copiar, un botón que abre la página de autorización en una pestaña nueva, líneas de progreso y un campo para la respuesta que el complemento te pide pegar (enmascarado si es secreto), rotulado con el propio mensaje del complemento. Cancelar detiene el inicio de sesión. Un proveedor que solo inicia sesión no muestra campo de clave de API; con la sesión iniciada, la tarjeta ofrece Cerrar sesión, y una sesión vencida muestra Sesión caducada e Iniciar sesión de nuevo.

  • Un método marcado no oficial muestra un aviso de riesgo fijo (el proveedor no lo ha autorizado oficialmente, el servicio puede cambiar y la cuenta podría ser restringida) y solo empieza tras Entiendo el riesgo.
  • Los enlaces se abren únicamente con window.open(url, "_blank", "noopener,noreferrer") y solo si son https: (o http: en localhost/127.0.0.1); cualquier otro enlace se bloquea y nunca se abre.
  • El texto del complemento (etiquetas, descripciones, instrucciones y mensajes de petición) se muestra siempre como texto plano, nunca como HTML ni Markdown.
  • Si el servidor se reinicia mientras corre un inicio de sesión, el flujo desaparece: el bloque dice Inicio de sesión interrumpido, empieza de nuevo y ofrece empezar otra vez. Cuando termina un inicio de sesión, la página vuelve a pedir el perfil en lugar de fiarse de su estado local.
  • El navegador nunca recibe un token: solo el estado de la sesión (iniciada, caducada, vencimiento). El inicio de sesión no está disponible con --read-only. En Limitaciones conocidas se explica cómo se guardan las sesiones.
Ajustes, Modelos: un perfil con un método de inicio de sesión no oficial, marcado como tal, y un perfil con un inicio de sesión en curso con un código de dispositivo, su dirección con botones Copiar y Abrir enlace, una línea de progreso, un campo para el código de confirmación y un botón Cancelar.
Inicio de sesión desde Ajustes → Modelos, con un proveedor falso programado: el código y la dirección, un campo enmascarado para la respuesta que pide el complemento y Cancelar.

Abrir archivo de configuración (arriba a la derecha) muestra el archivo de configuración efectivo del workspace, tu archivo de ajustes de usuario y el de perfiles de proveedor, cada uno con un botón de copiar. El servidor nunca abre un editor. La versión de Alisio (la del servidor, la que imprime alisio --version) se muestra en Ajustes → Acerca de y, de forma discreta, al pie de la barra lateral.

Las credenciales son de solo escritura. El campo de una credencial es de tipo contraseña: tras Guardar se vacía y la página solo indica si hay un valor guardado, si viene de una variable de entorno y, para valores guardados de 16 caracteres o más, los tres últimos caracteres (Guardada · termina en …71B). Ninguna respuesta de la API contiene un secreto.

Habilitar o deshabilitar un complemento escribe un ajuste del proyecto (.alisio/config.json) y requiere que el workspace sea de confianza. Los complementos se cargan al arrancar la aplicación del workspace, así que el servidor recarga esa aplicación en cuanto no tiene runs: de inmediato si está inactiva o, si no, cuando termina su último run (mientras tanto la tarjeta muestra Requiere reinicio). Las sesiones conservan su historial y todas las paletas de comandos abiertas se actualizan. Los interruptores de skills se aplican al momento.

Catálogo de complementos, instalación y actualizaciones ​

Ajustes → Complementos instala, actualiza y elimina complementos sin usar la terminal. Tiene cuatro pestañas: Configuración de complementos, Complementos instalados, Catálogo de complementos e Instalar desde archivo. Cada instalación muestra antes la misma advertencia que la CLI: npm se ejecuta con los permisos de tu usuario y puede ejecutar los scripts de instalación del paquete, y los complementos no están aislados. No volver a preguntar en esta sesión la omite hasta que recargues la página (una versión anterior siempre pregunta). Instalar y desinstalar se rechazan con --read-only, y solo se ejecuta una operación a la vez.

Complementos instalados. Cada tarjeta muestra la versión; Desinstalar (con confirmación) elimina los complementos de npm instalados en su directorio global de complementos. Los complementos integrados y los de proyecto o locales no se pueden desinstalar aquí y se indica el motivo. Cuando existe una versión más reciente, la tarjeta muestra Actualización disponible: vX → vY y un botón Actualizar, y el encabezado las cuenta (2 actualizaciones disponibles) con un botón Actualizar todo que las actualiza todas en una sola instalación combinada de npm (así npm resuelve juntos todos los rangos peer de @alisio/sdk) y termina con un resumen. Si actualizar un solo complemento falla porque otros complementos instalados aún dependen del SDK anterior, Alisio reintenta una vez como una sola instalación de ese complemento más los demás complementos instalados que tienen una versión más reciente, y te dice cuáles se actualizaron junto con él; nunca fuerza ni relaja las reglas peer. Buscar actualizaciones refresca el catálogo para ambas pestañas. Las actualizaciones se conocen solo para los complementos del catálogo; no hay consulta al registro para otros complementos de npm, y un complemento instalado desde un archivo no tiene origen remoto, así que muestra Paquete local vX y Actualizar desde archivo…, que abre Instalar desde archivo para ese paquete. Una actualización que requiere un @alisio/sdk más reciente que el de Alisio queda deshabilitada con La actualización requiere una versión más reciente de Alisio.

Ajustes, Complementos, Complementos instalados: una actualización disponible, la tarjeta de Context7 con la píldora Actualización disponible v0.4.0 a v0.5.0 y un botón Actualizar, y la tarjeta de Brave Search desplegada con su interruptor y el botón Desinstalar.
Complementos instalados: el contador de actualizaciones, Buscar actualizaciones, el botón Actualizar y Desinstalar con el nombre del paquete.

Catálogo de complementos. Los complementos publicados como una lista compacta, una fila por complemento: su icono, su nombre, una descripción corta (cortada con la misma longitud en todas las filas; el texto completo es el tooltip y la descripción accesible) y un botón con icono para la acción: Instalar (+), Actualizar, Reinstalar cuando ya está instalada la misma versión, o Instalar versión anterior. Un complemento incompatible tiene el botón deshabilitado con un tooltip que explica el motivo, y las filas llevan una insignia Instalado, Actualizar o Incompatible. La lista tiene una columna si es estrecha, dos con el ancho predeterminado del diálogo y tres con el diálogo maximizado. La búsqueda cubre nombre, descripción, etiquetas y paquete; se filtra por categoría y etiquetas y, opcionalmente, se agrupa por categoría. Diez complementos por página, con esqueletos de carga y un estado de error con Reintentar. La acción nunca abre el detalle; haz clic en la fila (o pulsa Enter o Espacio sobre ella) para abrirlo.

Ajustes, Complementos, Catálogo de complementos: cuadro de búsqueda, Buscar actualizaciones, filtros de categoría y etiquetas, y una lista de dos columnas de complementos, cada uno con su icono, nombre, descripción corta y un botón con icono de Instalar o Reinstalar.
El Catálogo de complementos: una lista compacta con icono, nombre, descripción corta y el botón de acción.

Detalle del complemento. Al abrir una fila, el complemento se muestra dentro de la misma pestaña: el icono, el nombre, el autor y un resumen de una línea, la acción principal (Instalar, Actualizar, Reinstalar o Instalar versión anterior), Desinstalar si está instalado y enlaces a npm y al sitio web. Debajo van la portada, la descripción completa, una lista de Información (última versión e instalada, desarrollador, licencia, categoría, etiquetas, el rango de @alisio/sdk que necesita y si esta versión de Alisio lo cumple, el paquete de npm, la fecha de publicación y los enlaces a npm, repositorio y sitio web; solo lo que el catálogo ofrece) y un aviso de que los complementos no están aislados. Volver al catálogo (o Esc) regresa a la lista con la misma búsqueda, filtros y página, y con el foco en la fila que abriste.

Ajustes, Complementos, Detalle de OpenAI: icono, nombre, autor, los botones Actualizar, Desinstalar, npm y Sitio web, la portada grande, la descripción, la lista de Información y el aviso de que no está aislado.
El detalle del complemento: acciones, portada, descripción completa y la lista de Información.

Iconos de complementos. Junto a cada complemento aparece un icono en el catálogo, en Complementos instalados, en las confirmaciones de instalar, actualizar y desinstalar y en la vista previa de Instalar desde archivo. Es el icono del catálogo si el paquete está en el catálogo; si no, el icono que incluye el paquete instalado (consulta Icono del complemento); si no, un icono predeterminado (una pieza de rompecabezas), que también se usa cuando un icono no carga y para los complementos integrados, de proyecto y de archivo aún sin instalar. Los iconos pasan por el servidor como las portadas, así que el navegador nunca contacta el origen del catálogo.

Caché del catálogo. El servidor descarga el catálogo (ALISIO_PLUGIN_CATALOG_URL, por defecto el catálogo publicado de alisio-plugins) y lo guarda en su directorio de estado. No vuelve a consultarlo durante 24 horas salvo que pulses Buscar actualizaciones; entonces envía una petición condicional, así que un catálogo sin cambios cuesta un 304. La pestaña muestra cuándo se comprobó por última vez y si es una copia en caché o está sin conexión. Sin conexión se muestra la copia guardada con un aviso; sin conexión y sin copia se muestra un error con Reintentar. Las portadas pasan por el servidor (el navegador nunca contacta el origen del catálogo) y se guardan en disco. Cada campo del catálogo se valida: los enlaces deben ser https:, las portadas deben venir del origen del propio catálogo y un paquete con un nombre npm inválido se descarta.

Instalar desde el catálogo. Un clic, un estado de carga y el complemento aparece de inmediato en Complementos instalados. Se instala la versión del catálogo; si npm aún no la publica, se instala la última del registro.

Instalar desde archivo. Para complementos privados que nunca se publican: genera un tarball con pnpm pack o npm pack y elígelo o suéltalo en la pestaña. El servidor lee solo package/package.json (no necesita el binario tar) y muestra una tarjeta de validación: nombre, versión, descripción, autor, licencia, tamaño, el rango de @alisio/sdk (una discrepancia es una advertencia, no un bloqueo), si es un complemento de Alisio válido (la keyword alisio-plugin, nombre y versión válidos, un punto de entrada), una advertencia destacada si declara scripts preinstall, install o postinstall, y si actualizará, reinstalará o instalará una versión anterior de la ya instalada. Límites: 50 MB para el archivo y 1 MB para package.json.

Ajustes, Complementos, Instalar desde archivo: la tarjeta de validación de un complemento privado con nombre, versión, autor, licencia, tamaño, el rango del SDK y una advertencia de que esta versión de Alisio tiene un SDK más reciente, y el botón Instalar.
Instalar desde archivo: la tarjeta de validación con la advertencia del SDK antes de instalar nada.

Tras la confirmación, un indicador de pasos muestra las fases: Subiendo, Validando, Copiando el paquete, Instalando dependencias (npm), Registrando, Recargando el workspace y Limpiando. Si falla, la instalación se revierte por completo y se muestran las últimas líneas de la salida de npm.

Ajustes, Complementos, Instalar desde archivo: el progreso de una instalación, con las tres primeras fases marcadas, Instalando dependencias en curso y el resto en espera.
El progreso de la instalación: las fases terminadas se marcan y la actual gira.

El archivo se copia a <config home>/plugins/local-packages/<nombre>-<versión>.tgz y se instala desde esa copia, así que la dependencia file:local-packages/... que registra npm sigue siendo válida aunque el archivo original se mueva. La carga se guarda temporalmente en <state home>/tmp/plugin-uploads/ y se borra tras la instalación, un fallo o una cancelación; lo que quede con más de una hora se limpia. Al desinstalar se elimina la copia guardada.

Actualizar en el sitio. Instalar un paquete que ya está instalado lo reemplaza y nunca crea un duplicado: Actualizar vX → vY, Reinstalar o Volver a vX (desde vY) (con una advertencia). La entrada plugins de tu configuración sigue siendo una sola y el tarball guardado anterior se elimina cuando el nuevo funciona. Un complemento instalado antes desde un archivo que aún apunta fuera de local-packages se migra al almacén estable en su siguiente actualización. Si la actualización falla, se restaura la versión anterior.

Reinicio tras una actualización. Node conserva el código de un complemento que ya cargó, así que reemplazar un complemento cargado no puede surtir efecto en el proceso en ejecución. Entonces el resultado pide un reinicio: un aviso (Complemento actualizado. Reinicia Alisio para usar la versión nueva.) y una píldora Reinicio pendiente en la tarjeta. En la aplicación de escritorio el aviso tiene Reiniciar ahora, que reinicia el proceso en segundo plano y recarga la ventana. Con alisio serve no hay botón: reinicia el comando tú mismo. La primera instalación de un complemento que nunca se cargó no necesita reinicio.

Modelo de seguridad ​

El servidor está pensado para un usuario en una máquina:

  • Se enlaza a 127.0.0.1 por defecto. Exponerlo en una red exige --host <address> --allow-remote y muestra una advertencia; no hay TLS, así que usa un túnel SSH en su lugar.
  • Se genera un token de arranque de 256 bits por proceso que nunca se escribe en disco. El navegador lo canjea una vez por una cookie HttpOnly; SameSite=Strict que guarda otro secreto.
  • Toda petición debe nombrar a este servidor en Host (defensa contra DNS rebinding), y las peticiones con efectos necesitan un Origin coincidente y Content-Type: application/json (defensa contra CSRF).
  • Las respuestas llevan una Content-Security-Policy estricta, X-Frame-Options: DENY, nosniff, Referrer-Policy: no-referrer y políticas de opener/recursos del mismo origen; las respuestas de la API no se cachean.
  • Las aprobaciones fallan cerradas: si ninguna pestaña del navegador observa la sesión durante 30 segundos, si la ejecución se cancela o tras 10 minutos, la respuesta es denegar.
  • Los complementos no están aislados: los complementos de un proyecto de confianza se ejecutan dentro del proceso del servidor con sus permisos del sistema operativo, exactamente igual que en la terminal.
  • El diálogo nativo de carpetas y el explorador de carpetas integrado solo existen en loopback. El explorador lista nombres de directorios (nunca archivos ni contenidos) que el usuario del servidor puede leer, la misma confianza que la terminal de ese usuario; con --allow-remote ambos se desactivan y solo se acepta una ruta escrita.

Workspaces y confianza ​

Un workspace es un directorio (su raíz git cuando está dentro de un repositorio). El servidor lista los workspaces de las sesiones existentes más el directorio donde arrancó alisio serve, y abre una aplicación para un workspace solo cuando se usa. Como mucho hay --max-workspaces abiertos a la vez: el inactivo usado hace más tiempo se cierra para dejar sitio y, cuando todos están ocupados, la petición falla con workspace_limit. Los workspaces inactivos se cierran tras 10 minutos.

Un workspace cuya carpeta se eliminó o se movió sigue en la barra lateral, atenuado y marcado como "carpeta no encontrada": sus sesiones siguen visibles, pero no se pueden crear sesiones ni enviar prompts en él (el servidor responde 404 workspace_missing). Nueva sesión usa el workspace de la sesión actual o el usado más recientemente que todavía exista; si no hay ninguno, pide abrir un workspace. Las carpetas con el mismo nombre muestran junto a él una ruta padre corta, y la ruta completa al pasar el ratón.

Archiva un workspace desde su menú de acciones para ocultarlo, junto con sus sesiones, de la barra lateral; Mostrar archivados vuelve a mostrar ambos (los workspaces archivados van al final). Archivar conserva todas las sesiones, que siguen visibles, cierra la aplicación inactiva del workspace y se rechaza con 409 runs_active mientras haya una ejecución activa. Las sesiones nuevas en un workspace archivado se rechazan con 409 workspace_archived; Desarchívalo, o vuelve a abrir la misma carpeta, para usarlo. Así se oculta también un workspace cuya carpeta ya no existe.

Abrir un proyecto ​

El botón de carpeta junto a Proyectos (y Nueva sesión cuando aún no hay ningún proyecto) pide una carpeta de la mejor forma que admita el servidor:

  1. Diálogo nativo de carpetas. Los navegadores nunca dan a una página la ruta absoluta de una carpeta, así que el servidor abre el diálogo del propio sistema operativo en su escritorio y usa la carpeta elegida (una nota en la barra lateral lo indica mientras está abierto; solo un diálogo a la vez).
    • Linux (y BSD): zenity, si no kdialog, si no yad, buscados en PATH; necesita una sesión de escritorio (DISPLAY o WAYLAND_DISPLAY).
    • macOS: osascript con choose folder de AppleScript.
    • Windows: Windows PowerShell (o pwsh) con el diálogo de carpetas de WinForms y, como alternativa, el explorador de carpetas de Shell.
  2. Explorador de carpetas integrado cuando no hay herramienta de diálogo (máquina sin escritorio, sesión SSH, ALISIO_NATIVE_PICKER=0): una ventana que solo lista nombres de carpetas, empieza en tu carpeta personal y tiene migas de pan, un botón de carpeta superior y Mostrar carpetas ocultas. En Windows, el nivel superior lista las unidades.
  3. Escribir una ruta está siempre disponible como enlace y es la única opción cuando el servidor escucha para acceso remoto (--allow-remote), porque un diálogo o un listado de carpetas mostraría la máquina del servidor y no la tuya.

Un directorio en el que no hayas confiado se abre sin sus recursos de proyecto (configuración, complementos, agentes, skills, prompts) y se marca como no confiable. Confía en él desde su menú ⋯ de la barra lateral (Confiar en este proyecto…) o desde el editor de Agentes, tras una confirmación que explica lo que desbloquea la confianza; o ejecuta alisio en ese directorio para responder a la pregunta de la terminal. Ambos guardan la misma decisión, ligada al contenido de .alisio/config.json: si ese archivo cambia, el workspace vuelve a no ser de confianza hasta que lo confirmes. El workspace se reabre para que el cambio se aplique al momento (se rechaza mientras tenga ejecuciones activas, con --read-only y cuando --trust-project/--config fijan la confianza del servidor). Dejar de confiar en este proyecto… la retira.

Sesiones, ejecuciones y permisos ​

Varias sesiones pueden ejecutarse a la vez, en uno o varios workspaces. Una sesión ejecuta un prompt cada vez: el texto enviado mientras se ejecuta se encola para su siguiente turno, mientras que los adjuntos deben esperar a que quede inactiva. Las ejecuciones que superan --max-runs esperan en una cola por orden de llegada. Reintentar un prompt con el mismo id de petición nunca inicia una segunda ejecución.

Una sesión que usa otro proceso de Alisio (por ejemplo la TUI) aparece bloqueada y es de solo lectura en la web hasta que ese proceso la libere.

Cada sesión tiene un preset de permisos, que también es su modo de permisos (ask, auto o full, consulta Modos de permisos). Los efectos que los flags de arranque no permiten siguen preguntando, sea cual sea el preset:

PresetModoPermitido sin preguntarOtros efectos
read-onlyningunolecturasdenegados
askasklecturaspiden aprobación
workspace-write (por defecto)autolecturas, escrituraspiden aprobación
full-accessfulllecturas, escrituras, procesos, redpiden aprobación

"Permitir para la sesión" en una aprobación amplía solo esa sesión, nunca las demás sesiones del mismo workspace.

Selector de agente y Shift+Tab ​

La barra del compositor muestra el agente activo (Agente: build) junto al menú de permisos. Ábrelo para elegir cualquier agente principal; la elección se guarda en la sesión y se aplica desde el siguiente prompt. Mayús+Tab con el foco en el cuadro de mensaje recorre la misma lista: build, plan y después sus agentes primarios por nombre, con vuelta al inicio. El atajo se ignora mientras la paleta / está abierta, durante una composición IME y con cualquier otro modificador, y un lector de pantalla anuncia el agente nuevo.

Compromiso de accesibilidad: Mayús+Tab normalmente mueve el foco hacia atrás, así que interceptarlo en el cuadro de mensaje cambia lo que los usuarios de teclado esperan allí. El selector de agente es la vía accesible (se alcanza con Tab) y siempre está disponible; el atajo solo actúa con el foco en el cuadro de mensaje y en cualquier otro sitio Mayús+Tab conserva su significado habitual. Alternar se permite durante un turno porque solo guarda el agente siguiente.

Modos de permisos ​

/permission (también /permissions) abre el menú de permisos de la cabecera: tres opciones excluyentes, Preguntar, Auto y Acceso total, el estado de la sesión y Gestionar permisos guardados…, que muestra las concesiones guardadas (por ejemplo análisis en Python permitido para esta sesión) con Revocar. Elegir Acceso total pide una confirmación que dice que no es un sandbox. Un modo que el servidor no puede ofrecer (sus flags de arranque son el techo, o corre con --read-only) aparece como no disponible con el motivo. /permission ask, /permission auto, /permission full y /permission status se ejecutan sin abrir el menú y responden en la conversación; el menú de permisos del compositor conserva los cuatro presets.

Modo plan y revisión del plan ​

Cambia un chat al agente plan (el selector, Mayús+Tab o /agent:plan): investiga con herramientas de solo lectura y entrega su plan con exit_plan. El plan se abre en la conversación, se guarda como artefacto plan.md y el compositor deja paso a la pantalla de decisión: Aceptar y empezar la implementación, Omitir por ahora (Esc hace lo mismo) o Añadir contexto. La ejecución del plan es de solo lectura sea cual sea el modo de permisos. La guía completa, con capturas, las reglas de decisión y las revisiones, es Modo plan y revisión del plan.

Diagramas del plan y visor del plan ​

Un plan puede llevar pequeños diagramas Mermaid. La pantalla de decisión ofrece Abrir el visor del plan y la tarjeta del plan abre el mismo visor en el panel lateral: secciones, diagramas dibujados con la paleta de Alisio, enlaces entre diagramas y texto, y una descarga en ZIP. Consulta El visor del plan; desactiva los diagramas o límitalos con plan.diagrams y plan.maxDiagrams.

Tareas en segundo plano ​

Los comandos que el agente inicia con bg_run siguen corriendo mientras tú conversas. El icono de panel de la cabecera abre el panel derecho, cuya pestaña Tareas las lista (la pestaña indica cuántas corren y el icono de panel muestra un punto mientras haya alguna). Elige una para seguir su salida en vivo: se lee de forma incremental una vez por segundo, se muestra en la misma vista de terminal que los resultados de shell (colores, copiar, las últimas 2 000 líneas) y conserva los últimos 200 000 caracteres. Detener termina una tarea en ejecución como tú (queda Detenida, nunca Fallida). La lista también muestra los subagentes de la sesión como una vista de solo lectura de su estado; se gestionan como siempre. /tasks en el compositor abre la pestaña, y el panel se carga bajo demanda (no forma parte del bundle inicial).

La pestaña Tareas del panel derecho siguiendo un comando en segundo plano en ejecución: el estado de la tarea, el comando y el tiempo transcurrido, un botón rojo Detener y las líneas de salida en vivo en la vista de terminal, mientras el chat muestra la llamada bg_run del agente.
La pestaña Tareas siguiendo una tarea en ejecución: salida en vivo y el botón Detener.

Cuando una tarea termina por sí sola, un aviso lo dice (no para una tarea que detuviste tú o el agente) y un mensaje coalescido despierta al agente: aparece en el chat como Background task finished: … y el agente puede leer la salida con bg_output. El mensaje espera mientras la sesión corre, hay una aprobación o una pregunta abierta, o la TUI tiene bloqueada la sesión. Las tareas no están aisladas, terminan cuando alisio serve se detiene (o se cierra la aplicación del workspace) y aparecen como Perdida tras una parada abrupta; un workspace con tareas en ejecución no se expulsa por inactividad, y /reload responde 409 hasta que terminen o se detengan. Una tarea solo es accesible a través de la sesión que la posee.

Objetivos de sesión ​

/goal <objetivo> le da al agente un objetivo para la sesión y lo deja seguir trabajando en él, turno tras turno, hasta que esté terminado, bloqueado, en pausa o sin presupuesto. La barra del objetivo, sobre el cuadro de mensaje, lo muestra, se carga bajo demanda (no forma parte del bundle inicial) y vuelve tras recargar (el snapshot del stream lleva el objetivo). El agente marca el objetivo como completo o bloqueado con update_goal, con evidencia; solo tú lo pausas, reanudas, editas o borras, o cambias su presupuesto. Los comandos, los estados y los límites son los mismos que en la terminal: consulta Objetivos de sesión.

Costo. Un objetivo sigue gastando tokens por sí solo, y cada turno vuelve a enviar todo el contexto. Un objetivo sin presupuesto de tokens solo se detiene por sus límites de turnos y de tiempo (goal.maxTurns 50, goal.maxMinutes 120): ponle presupuesto a los objetivos largos (/goal <objetivo> budget=50k).

La barra muestra el estado (Activo, En pausa, Bloqueado, Presupuesto agotado, Completado), el objetivo, una barra de progreso del presupuesto de tokens (se vuelve ámbar al 80 % y roja al agotarse), el turno n/máx, el tiempo gastado en ejecuciones y por qué el objetivo espera o se detuvo (Esperando tu respuesta, Esperando un permiso, Esperando tareas en segundo plano, modo plan, o el código de motivo en palabras), anunciado a los lectores de pantalla. Sus botones siguen el estado: Pausar (mientras está activo), Reanudar (en pausa o bloqueado), Editar y Borrar (siempre; Borrar pregunta antes). Editar abre un formulario con el objetivo y el presupuesto de tokens (50k, 1.5M, clear; Ctrl/Cmd+Enter guarda, Esc cancela). Un objetivo completado o bloqueado muestra el informe del agente y su evidencia en Informe del agente.

La barra del objetivo sobre el cuadro de mensaje de un objetivo en marcha: la etiqueta Activo, el objetivo, una barra de progreso del presupuesto de tokens con 600 de 2k tokens, el turno 2 de 50, el tiempo en ejecuciones y los botones Pausar, Editar y Borrar, mientras el chat muestra los turnos del agente.
La barra de un objetivo en marcha: progreso del presupuesto, turnos y sus botones.

En el compositor, /goal y sus subcomandos funcionan como en la terminal: al escribir /goal la paleta lista /goal pause, /goal resume, /goal edit y /goal clear (los que permite el estado actual); un objetivo nuevo sobre uno existente pide confirmación; /goal edit sin texto abre el formulario. Cada cambio es un compare-and-set, así que dos ventanas no pueden pelearse: una acción basada en una vista desactualizada se rechaza y la barra recarga el objetivo.

Un objetivo nunca continúa mientras haya una aprobación, una pregunta o una revisión de plan abiertas, mientras corran tareas en segundo plano de la sesión, en modo plan, mientras tengas un turno en curso, ni después de que lo interrumpas (Detener pausa el objetivo). Si el servidor se detiene con un objetivo activo, vuelve en pausa (motivo restart) tras el reinicio y nunca se reanuda solo. Los objetivos usan el preset de permisos de la sesión como cualquier turno y nunca lo amplían. alisio run no tiene /goal en la v1.

Proof: criterios de aceptación ​

Cuando una sesión tiene criterios de Proof, aparece una tarjeta compacta sobre la caja de mensaje y el panel derecho gana una pestaña Proof (que también abre /proof). Ambas cargan bajo demanda y leen el ledger del servidor, así que muestran los mismos estados que la terminal y alisio run --json. La pestaña permite añadir un criterio (con un comando opcional), editar su texto o su marca de requerido, marcarlo No aplica con un motivo y descargar proof.md o proof.json. Con un objetivo que tiene criterios requeridos sin cumplir, ofrece también Completar el objetivo de todos modos (el motivo es obligatorio; solo tú puedes). En una revisión de plan que propone criterios puedes conservar, editar o rechazar cada uno antes de aprobar.

La tarjeta Proof sobre la caja de mensaje y la pestaña Proof del panel derecho con cinco criterios de aceptación en distintos estados.
La tarjeta Proof y la pestaña Proof con datos sintéticos (interfaz en inglés).

Las rutas (misma autenticación y reglas de Origin que las demás rutas de sesión):

RutaPropósito
GET /api/sessions/:sid/proofEl ledger: criterios, evidencia y las afirmaciones sin evidencia de la última ejecución
POST /api/sessions/:sid/proof/criteriaCrear un criterio, o editar uno (criterionId con text y required)
POST /api/sessions/:sid/proof/criteria/:id/not-applicable{"reason"}: marcarlo como no aplicable
GET /api/sessions/:sid/proof/export?format=md|jsonDescargar proof.md o el JSON proof/v1
POST /api/sessions/:sid/goal/override{"reason"}: completas el objetivo sobre criterios requeridos sin cumplir

Flujo: proof_updated y proof_divergence llegan como frames event normales, y el snapshot lleva proof: {criteria: n} cuando la sesión tiene criterios.

Panel de contexto ​

Con el Context Governor en shadow o on, el panel derecho gana una pestaña Contexto en cuanto la sesión abierta emite su primer evento context_governed (/context la abre en cualquier momento). Carga bajo demanda y lee el mismo informe de contexto que /context imprime en la terminal, así que ambos muestran los mismos segmentos y razones. La pestaña muestra el modo y la política, los tokens estimados antes y después de la política, cuántos resultados de herramientas se elidieron (o se elidirían, en shadow) y por qué, la proporción de resultados que el agente usó después, los recuentos de invariantes por tipo (nunca su texto) y los segmentos que conviene explicar: los fijados, de criticidad baja y elididos, cada uno con su tipo, origen, tokens, criticidad y razón. Una casilla lista todos los segmentos. Nada de la pestaña cambia la sesión; solo lee.

La pestaña Contexto del panel derecho en modo on: el resumen de la política, dos resultados de herramientas elididos con su razón, el recuento de invariantes por tipo y la lista de segmentos.
La pestaña Contexto con datos sintéticos (interfaz en inglés).

La ruta (misma autenticación y reglas de Origin que las demás rutas de sesión; la anterior GET /api/sessions/:sid/context, la estimación de la barra de contexto, no cambia):

RutaPropósito
GET /api/sessions/:sid/context/reportEl ContextReport: segmentos con sus razones, los totales de elisión por razón, los invariantes y el uso heurístico

Flujo: context_governed llega como un frame event duradero normal, uno por petición al modelo.

/reload y /changelog ​

/reload vuelve a leer la configuración, los agentes, las skills, las plantillas de prompt y los servidores MCP del workspace de la sesión. Se rechaza (409) mientras el workspace tiene ejecuciones. El servidor valida la configuración y construye la aplicación nueva junto a la actual antes de intercambiarlas, así que un archivo roto no cambia nada y el error explica por qué. La conversación muestra el informe (qué cambió por área y qué necesita un reinicio, como el código de complementos ya importado), un aviso lo confirma y las paletas y páginas de ajustes abiertas se actualizan con catalog_changed. /changelog [version] abre un diálogo con el changelog incluido, que funciona sin conexión. Tras una actualización un único aviso discreto lo dice; la última versión vista se guarda en el localStorage del navegador y nada falla si el almacenamiento está bloqueado. Ambos comandos son solo interactivos: alisio run no cambia.

Pestaña Memoria ​

Mientras el complemento de memoria integrado está habilitado, aparece una pestaña Memoria junto a Conversación y Trayectoria. Muestra, solo en lectura, lo que el complemento guarda para el chat abierto, en tres secciones:

  • Guardado en este chat: las memorias guardadas mientras este chat estaba abierto (por el modelo, por la compactación o por el resumen de fin de sesión), primero las fijadas y luego las más recientes. Se puede filtrar por tipo, buscar en título, contenido y tema, y pulsar Cargar más para leer de 20 en 20. Cada entrada muestra su tipo y título, un resumen de su contenido (Ver más / Ver menos), cuándo se actualizó, de dónde viene y el registro sin procesar en Detalles.
  • Resumen de la sesión: el resumen que el complemento guardó para este chat (uno por sesión; la compactación y el resumen de fin de sesión lo sobrescriben).
  • Contexto cargado: el contexto de memoria que el complemento añadió cuando empezó este chat, que es lo primero que vio el modelo.
La pestaña Memoria de un chat: la sección Guardado en este chat muestra 20 de 27 memorias con un filtro por tipo y un cuadro de búsqueda, una entrada fijada primero y cada entrada con su tipo, título, resumen del contenido, hora de actualización y origen.
La pestaña Memoria: las memorias guardadas en este chat, primero las fijadas, con filtro, búsqueda y Cargar más.

Cada sección carga, falla y reintenta por separado. Nada se actualiza en vivo: Actualizar vuelve a cargar las tres secciones y conserva los filtros, y las memorias guardadas mientras se navega aparecen tras actualizar (la lista nunca repite ni se salta una entrada al paginar). Cambiar de chat recarga la pestaña y nunca muestra datos de otro chat. La pestaña existe solo mientras el complemento está habilitado: desactivarlo en Ajustes → Complementos la quita y vuelve a Conversación. Un chat vacío muestra Aún no hay memoria guardada para este chat.

La memoria puede contener datos sensibles del proyecto. La pestaña se sirve por las mismas rutas de sesión autenticadas que la conversación (GET /api/sessions/:sid/views/memory/…, consulta las vistas de datos de complementos) y se la muestra a quien tenga la cookie de sesión de este servidor. Es una vista: fijar y olvidar siguen en la TUI (/memory) y en las herramientas del modelo. De dónde sale cada sección y sus límites están en Memoria.

Análisis en Python y artefactos ​

Los archivos que publica el análisis en Python aparecen como tarjetas debajo de las filas de herramientas del turno que los produjo: icono del tipo, nombre del archivo, etiqueta del tipo y un botón de descarga siempre visible. Con el puntero encima o el foco del teclado, una tarjeta previsualizable dice Abrir archivo en lugar de su tipo; una tarjeta que no se puede previsualizar (DOCX, ZIP, archivos desconocidos o por encima del límite) nunca lo dice, y el clic la descarga. Las tarjetas sobreviven a las recargas (salen de los resultados de herramienta guardados) y muestran Eliminado o Caducado cuando el artefacto ya no existe, o No disponible con Reintentar cuando no se pudo abrir.

Abrir una tarjeta muestra el panel de artefactos a la derecha del chat, en la misma ranura que el panel de archivos (abrir uno cierra el otro):

  • Menú del título: cambia entre los artefactos de la sesión (los más recientes primero, con filtro a partir de ocho, flechas, Enter, Esc y escritura para saltar; los publicados mientras tanto llevan un punto y nunca cambian la vista), y después Abrir en una pestaña nueva (dashboards y PDF), Expandir panel, Descargar fuentes del análisis (salidas de python_run), Copiar al workspace…, Detalles, Ejecutar de nuevo (salidas de python_run) y Eliminar. Un artefacto caducado sigue en la lista marcado como Caducado; al abrirlo solo ofrece Detalles y Ejecutar de nuevo.
  • Descargar, Pantalla completa y Cerrar a la derecha; Cerrar devuelve el foco a la tarjeta.
  • Redimensionar con el asa entre el chat y el panel (compartida con el panel de archivos): arrastrar, doble clic para restablecer, o enfocarla y usar ←/→ (16 px, 64 px con Shift), Inicio/Fin y Enter. El ancho se recuerda por navegador; el chat conserva al menos 360 px.
  • Vistas previas: Markdown con el renderer del chat (las imágenes relativas se resuelven dentro del artefacto), dashboards HTML en el visor aislado, imágenes con Ajustar/100 %, PDF en el visor del propio navegador, JSON con el renderer de JSON, CSV, TSV y XLSX en el visor de tablas, y código y texto con el renderer de código. Cualquier otro tipo, o lo que supere su límite, muestra el motivo y un botón Descargar.
  • Por debajo de 900 px el panel es un diálogo a pantalla completa. Esc cierra primero el menú abierto y después el panel. Ajustes y Agentes se abren encima del panel, que sigue cargado detrás.
  • Copiar al workspace… pide una carpeta y ejecuta la herramienta artifact_export en la sesión: se aplica la aprobación de escritura habitual y los archivos copiados aparecen en Cambios. /artifacts [filtro] abre el panel con su menú.
Un dashboard ejecutivo de ventas generado por Alisio en el panel de artefactos: ranking de vendedores, ventas por canal, segmentos de clientes y estado de los pedidos.
Un dashboard ejecutivo generado en el panel de artefactos.

Los dashboards se ejecutan en un iframe con sandbox="allow-scripts allow-downloads" (nunca allow-same-origin), servido desde /artifact-view/<token>/… con un enlace firmado que caduca a los 10 minutos. Su Content-Security-Policy prohíbe toda conexión (connect-src 'none') y añade la directiva sandbox, así que la página tiene un origen opaco: no puede leer la cookie, la página de Alisio, localStorage ni la red, tampoco al abrirla en una pestaña nueva. Los datos deben ir incrustados en el HTML.

Un dashboard creado con alisio_runtime.charts: cifras destacadas, una dona del estado de los pedidos, una tarta del reparto por canal y un gráfico de barras agrupadas de ventas y beneficio por vendedor, ajustados a sus tarjetas.
Un dashboard hecho con alisio_runtime.charts (Chart.js incluido; consulta Gráficos).

Ejecutar Python pregunta en el panel de aprobación con el título ¿Ejecutar análisis en Python?, la advertencia de que Python administrado no es un sandbox y las primeras 40 líneas del script; S (Permitir en esta sesión) guarda el permiso para la sesión. El botón de llave de la cabecera abre Permisos de la sesión, que lista los permisos guardados con Revocar; /permissions también lo abre. Las demás pestañas se actualizan cuando se guarda o revoca un permiso. alisio serve --allow-analysis permite Python sin preguntar en las sesiones cuyo preset permite procesos (full-access); en las demás pregunta.

Ejecutar de nuevo repite el análisis como una ejecución nueva con artefactos nuevos (los antiguos se conservan). Es una llamada python_run { rerunOf } de la sesión, así que se aplica el permiso anterior y la aprobación muestra el script guardado; Detalles nombra la ejecución que repite una repetición. Instalar los paquetes opcionales de Python pregunta con ¿Instalar paquetes de Python?, la lista de paquetes, la estimación de descarga y que necesita red, y ofrece solo Permitir esta vez y Denegar (S no hace nada: nunca se guarda).

Ajustes → Forja ​

La página Forja de Ajustes recoge lo que antes era la página Análisis de datos, ahora como la sección Python. Muestra el runtime en solo lectura (los tres backends con su estado y aislamiento, la política analysis.runtime y analysis.isolation y el que se usaría ahora, el Python encontrado o cómo instalarlo, los paquetes opcionales, el motor e imagen de contenedor y el recordatorio de que Python administrado no es un sandbox) y edita el interruptor (analysis.enabled), el tiempo máximo de ejecución y los tres valores de retención. El servidor valida los cambios, se escriben en el archivo de configuración global y se muestra cuándo fue la última limpieza. runtime, isolation, wasm.* y oci.* no se editan aquí. Las secciones JavaScript y Guías contienen los interruptores forge.javascript.enabled y forge.guides.enabled. Consulta Forja: modo código y Configuración.

Tablas y datos adjuntos ​

El botón + del compositor (y arrastrar y soltar) acepta archivos de datos junto a las imágenes: CSV, TSV, JSON, JSONL y XLSX. Un archivo se sube como cuerpo crudo de POST /api/sessions/:sid/datasets, se guarda en el almacén de blobs por contenido y se ingiere en segundo plano en un dataset SQLite (consulta Datos tabulares). El chip dice Leyendo sales.csv… mientras el servidor trabaja; el servidor sigue respondiendo (salud, latido) porque la ingesta se ejecuta en un proceso aparte. Cuando llega el frame dataset_ready, el chip muestra el tamaño de la tabla; un frame dataset_failed (archivo no admitido, por encima de analysis.data.maxUploadBytes o maxRows, XLSX sin Python) lo convierte en un error con el motivo. Al enviar el mensaje, el modelo recibe además un resumen acotado (esquema, cinco filas, estadísticas; como máximo 4 KB), mientras que la conversación muestra lo que escribiste con los chips; un chip abre la tabla en el panel derecho. Si solo envías datos, se manda una petición por defecto para que los revise.

El visor de tablas con un CSV de 300 filas, su filtro y los botones de copiar y descargar, junto al chip del dataset adjunto en la conversación.
El visor de tablas con un CSV de 300 filas y el chip de datos adjuntos en el chat.

El visor de tablas (SpreadsheetView) también abre artefactos de hoja de cálculo (CSV, TSV, XLSX), que se ingieren la primera vez que se previsualizan:

  • Filas de 28 px fijos y una ventana de filas y columnas, así que una hoja de un millón de filas se desplaza con fluidez. Las páginas de 200 filas salen de la API de filas con paginación por clave (cursores de rowid) mediante una caché de 20 páginas: desplazarse u ordenar nunca repite ni se salta una fila. El salto a una fila funciona en cualquier posición sin orden; con orden o filtro llega a las primeras 100 000 filas, y las más lejanas se cargan al desplazarse.
  • Haz clic en un encabezado para ordenar (ascendente, descendente, ninguno; aria-sort), escribe en el cuadro de filtro (una columna, o todas hasta 100 000 filas; coincidencia por subcadena), elige una hoja en un libro y cambia el ancho de las columnas arrastrando el asa del borde de un encabezado, o con Alt+←/→ (Mayús para pasos mayores) sobre un encabezado enfocado. El orden y el filtro se desactivan por encima de analysis.data.maxInteractiveRows (1 000 000) con un aviso: el archivo no tiene índices.
  • role="grid" con recuentos e índices de filas y columnas, una sola parada de tabulador (las flechas, Inicio/Fin, RePág/AvPág y Ctrl+Inicio/Fin se mueven entre celdas; ↑ desde la primera fila llega al encabezado). Ctrl/Cmd+C copia la celda y Ctrl/Cmd+Mayús+C la fila (también hay un botón en la barra); Descargar el original está en la barra.

API y eventos ​

El navegador habla con rutas JSON bajo /api y con un único stream de Server-Sent Events por pestaña:

text
GET  /api/health                       unauthenticated: name, version, protocolVersion, capabilities
GET  /api/workspaces?archived=false|true|all   POST /api/workspaces {path}
PATCH /api/workspaces/:wid {label?, pinned?, color?, archived?}
POST /api/workspaces/pick {start?}     diálogo nativo de carpetas → {path} | {cancelled: true} (loopback)
GET  /api/fs/dirs?path=&hidden=        nombres de carpetas para el explorador integrado (loopback)
GET  /api/sessions                     POST /api/sessions            GET|PATCH /api/sessions/:sid
GET  /api/sessions/:sid/messages       GET /api/sessions/:sid/events GET /api/sessions/:sid/runs
POST /api/sessions/:sid/prompts        POST /api/sessions/:sid/cancel  POST /api/sessions/:sid/compact
GET  /api/sessions/:sid/models         GET /api/sessions/:sid/context GET /api/sessions/:sid/export
GET  /api/sessions/:sid/context/report   the Context Governor's ContextReport (segments, reasons, invariants)
GET  /api/sessions/:sid/views/:plugin/:view?<params>   read-only data view of an enabled plugin
GET  /api/commands?session=<sid>       POST /api/sessions/:sid/commands {requestId, name, args?}
GET  /api/sessions/:sid/btw            POST /api/sessions/:sid/btw {question}  POST /api/sessions/:sid/btw/cancel
GET  /api/approvals                    POST /api/approvals/:aid      POST /api/interactions/:iid
GET  /api/sessions/:sid/artifacts      GET /api/artifacts/:aid       GET /api/artifacts/:aid/download
GET  /api/artifacts/:aid/files/*       POST /api/artifacts/:aid/view  POST /api/artifacts/:aid/export {target, overwrite?}
GET  /api/artifacts/:aid/sources?logs=1   DELETE /api/artifacts/:aid
GET  /artifact-view/:token/*           isolated viewer (signed link, no cookie)
GET  /api/sessions/:sid/capabilities   DELETE /api/sessions/:sid/capabilities/:gid
GET  /api/sessions/:sid/tasks          background tasks of the root session (+ read-only subagent mirror)
GET  /api/sessions/:sid/tasks/:tid/output?offset=&limit=   {text, nextOffset, eof, status}
POST /api/sessions/:sid/tasks/:tid/stop   the user's stop → {task}; 404 task_not_found for another session's task
GET  /api/sessions/:sid/goal           the session's goal (GoalInfo or null)  PUT /api/sessions/:sid/goal {objective, tokenBudget?, replace?, expect?}
PATCH /api/sessions/:sid/goal {objective?, tokenBudget?: number|null, expect?}   DELETE /api/sessions/:sid/goal?goalId=&epoch=
POST /api/sessions/:sid/goal/pause     POST /api/sessions/:sid/goal/resume   {expect?: {goalId, epoch}} → {goal}; 409 goal_conflict
GET  /api/workspaces/:wid/tree?path=&cursor=   GET /api/workspaces/:wid/file?path=&maxBytes=&download=1
GET  /api/workspaces/:wid/diff?path=   GET /api/sessions/:sid/changes
GET  /api/sessions/:sid/scratch        scratchpad of the root session: {available, files:[{name,size,mtime}], usedBytes, quotaBytes}
GET  /api/sessions/:sid/scratch/files/*   download one file (attachment, no symlinks); 404 outside the scratchpad
DELETE /api/sessions/:sid/scratch      empty it → {removed, freedBytes}; 409 runs_active while a Forja script runs
GET  /api/forge?workspace=<wid>        Forja engines (JavaScript + Python), limits, scratch settings, Python isolation policy
POST /api/blobs                        raw image body (not JSON) → BlobRef   GET /api/blobs/:hash
POST /api/sessions/:sid/datasets       raw data file, X-File-Name header → 202 {pending} | 200 {dataset}
GET  /api/sessions/:sid/datasets       GET /api/datasets/:did        GET /api/datasets/:did/download
GET  /api/datasets/:did/rows?sheet=&after=&offset=&limit=&sort=&dir=&filter=&column=
POST /api/artifacts/:aid/dataset       ingest a spreadsheet artifact on first preview
GET  /api/events?session=<sid>         the event stream (snapshot, then live frames)
GET  /api/plugins?workspace=<wid>      PATCH /api/plugins/:id {workspace, enabled}
GET  /api/plugin-catalog?refresh=0|1   catalog, cache metadata and installed versions
GET  /api/plugin-catalog/covers/:slug  a cover through the server cache
GET  /api/plugin-catalog/icons/:slug   an icon through the server cache
GET  /api/plugins/package-icon?package=  the icon an installed package ships (alisio.icon)
GET  /api/plugins/packages?workspace=<wid>   installed npm packages, update and restart flags
POST /api/plugins/install {package, version?, confirmed: true}   a catalog package only
POST /api/plugins/update-all {confirmed: true}   every outdated plugin in one npm install
DELETE /api/plugins/package/:name      uninstall a global npm plugin (URL-encoded name)
POST /api/plugins/local/inspect        raw .tgz body (application/gzip) → validation card
POST /api/plugins/local/install {stagingId, confirmed: true}   202 {jobId}
GET  /api/plugins/jobs/:jobId          {phase, phases, done, error?, result?, logTail?}
DELETE /api/plugins/local/staged/:stagingId   discard an upload
GET|POST /api/server/restart           availability, restart (only when supervised)
GET  /api/skills?workspace=<wid>       PATCH /api/skills/:id {workspace, enabled}
POST /api/workspaces/:wid/skills/draft {idea, ...}   POST /api/workspaces/:wid/skills {scope, draft, overwrite?}
GET  /api/mcp?workspace=<wid>          PATCH /api/mcp/:name {workspace, enabled, connect?}
POST /api/mcp/consent {workspace, confirmed: true, remember?}
GET  /api/mcp/catalog?q&category&execution&ready&status&page&pageSize   GET /api/mcp/catalog/detail?name&version?
POST /api/mcp/catalog/sync   (inicia una actualización en segundo plano; 403 mcp_not_permitted con --read-only)
GET  /api/agents?workspace=<wid>       GET /api/settings?workspace=<wid>  PATCH /api/settings {workspace, key, value}
GET  /api/changelog?version=&lastSeen= POST /api/workspaces/:wid/reload   409 runs_active while it has runs
GET  /api/providers?workspace=<wid>    PUT /api/providers/:profile {workspace, provider, values, model}
PUT|DELETE /api/providers/:profile/credentials {apiKey?, bearerToken?}   write-only
POST /api/providers/:profile/activate {workspace, model}   GET /api/models?workspace=<wid>

Las vistas de datos de complementos responden 404 ante una sesión, un complemento o una vista desconocidos o un complemento deshabilitado, 400 ante parámetros no válidos y view_failed (502), view_too_large (502) o view_timeout (504) cuando la vista falla, responde más de 1 MiB o tarda más de 5 segundos.

Una tarea en segundo plano que aparece o cambia de estado envía un frame tasks_changed ({sessionId, task}) al stream de su sesión raíz; la salida se obtiene con offset.

Un objetivo que se crea, cambia de estado o gasta tokens envía un frame goal_changed ({sessionId, goal}, goal: null al borrarlo) al stream de su sesión, y el snapshot de una (re)conexión lleva el objetivo. 409 goal_conflict responde a una acción basada en un expect desactualizado o que el estado no permite, 404 goal_not_found a una sesión sin objetivo y 409 goal_disabled a un objetivo nuevo mientras goal.enabled es false; PUT sobre un objetivo existente necesita replace: true.

Las subidas de datasets terminan con un frame dataset_ready o dataset_failed en el stream de la sesión. Los errores de datos usan los códigos dataset_unsupported (415), query_rejected (400) y query_timeout (408).

Los cambios de gestión envían un frame catalog_changed (commands, plugins, skills, mcp, models o agents) a todos los streams, para que otras pestañas se actualicen. Activar un perfil responde 409 runs_active mientras el workspace tiene runs, y el acceso MCP concedido desde la web queda registrado con la fuente interactive-web.

En cada (re)conexión el stream envía un snapshot de cada sesión suscrita (mensajes recientes, texto que aún se está generando, la hora de inicio de la ejecución, aprobaciones pendientes) seguido de frames en vivo; los eventos durables llevan su eventId como id de SSE, y el texto generado llega agrupado unas 30 veces por segundo. La versión del protocolo aparece en /api/health y en el primer frame del stream.

Aplicaciones de complementos ​

Los complementos pueden registrar aplicaciones de página completa (consulta Aplicaciones de complementos). Cuando el proyecto abierto tiene al menos una, aparece un grupo Aplicaciones en el panel izquierdo justo encima de Proyectos; si no hay ninguna, el grupo no se muestra. La lista se refresca cada 15 segundos. Abrir una aplicación sustituye toda el área del chat: el encabezado, los mensajes, el cuadro de escritura, las estadísticas y el panel lateral se ocultan y el panel de proyectos permanece. Volver al chat devuelve la conversación con su borrador y los adjuntos pendientes, y una aplicación que dejaste conserva su edición sin guardar hasta que recargues la página. Otro proyecto es otra instancia. En pantallas estrechas, el botón Proyectos de la barra de la aplicación abre el panel habitual. Las aplicaciones siguen el idioma de la interfaz y se ejecutan en un frame con sandbox sin acceso a la red: solo llegan a Alisio mediante acciones autenticadas y con permisos comprobados.

La aplicación de ejemplo abierta en lugar del chat: el panel izquierdo muestra un grupo Aplicaciones sobre Proyectos con la aplicación seleccionada, la barra tiene un botón Volver al chat y la aplicación saluda a Marta.
La aplicación de ejemplo en lugar del chat, con el grupo Aplicaciones sobre Proyectos.

Limitaciones ​

  • Un solo host: los bloqueos de sesión dependen de ids de proceso, y la web no ve en vivo los cambios que una TUI hace en una sesión hasta que la sesión se vuelve a abrir.
  • Las tareas en segundo plano son hijas del proceso del servidor: terminan cuando alisio serve se detiene, y una tarea iniciada desde la TUI solo se ve (no se puede detener) desde la web mientras esa TUI corre.
  • Un objetivo iniciado desde la TUI se lee de la base de datos compartida al abrir la sesión, pero la web no ve sus cambios en vivo (como cualquier actividad de la TUI), y solo continúa un objetivo el proceso que lo conduce; un objetivo cuyo servidor se detiene vuelve en pausa.
  • Sin TLS; el acceso remoto es opcional y está pensado para túneles SSH.
  • El proveedor es por workspace: Activar en este workspace cambia la aplicación de ese workspace (y guarda el perfil como predeterminado para los próximos arranques); los demás workspaces abiertos conservan su proveedor hasta que se vuelven a abrir. Las credenciales guardadas se aplican la próxima vez que se activa el perfil.
  • El acceso MCP concedido desde la web dura hasta que se detiene alisio serve y cubre un workspace, salvo que elijas recordarlo para el usuario.
  • El binario independiente sirve solo la API; los assets de la interfaz web se distribuyen con el paquete npm.
  • La interfaz web conserva la salida de comandos, los avisos y el razonamiento solo mientras la página está abierta; al recargar, la conversación se reconstruye desde los mensajes guardados.
  • Mayús+Tab alterna agentes solo desde el cuadro de mensaje (consulta Selector de agente); el changelog está solo en inglés y /reload no puede recargar el código de complementos ya importado.
  • El panel de archivos muestra solo el workspace: los directorios añadidos con --add-dir no se pueden recorrer, los enlaces simbólicos se listan pero nunca se siguen (aunque apunten dentro del workspace) y el filtrado por .gitignore necesita git en el PATH. Cambios solo conoce los archivos escritos con write_file y edit_file; los que cambia un comando de shell aparecen en git status, no ahí.
  • Vistas previas de artefactos: Esc pulsado dentro de un dashboard nunca llega a Alisio (usa Cerrar); los dashboards no pueden usar la red, localStorage, scripts de módulo ni fuentes web desde archivos (las fuentes deben ser URL data: en línea); un enlace de visualización caduca a los 10 minutos (al reabrir se renueva); los PDF usan el visor del navegador sin sandbox y pasan a descarga donde no lo hay. Las descargas de artefactos multiarchivo son archivos ZIP.
  • Tablas: ordenar y filtrar recorren la hoja (el archivo del dataset no tiene índices), así que se desactivan por encima de analysis.data.maxInteractiveRows; las celdas de más de 4 096 caracteres se cortan en la cuadrícula (el dataset las conserva enteras); un XLSX necesita Python 3.10+ para leerse.
  • Las imágenes subidas se guardan una vez por hash de contenido junto a la base de datos de sesiones y no se borran automáticamente.
  • Los renderizadores ricos necesitan fragmentos de JavaScript que la página carga a demanda: Mermaid es grande (unos cientos de KB comprimidos entre sus fragmentos) y solo se carga cuando se muestra un diagrama.

Publicado bajo la licencia MIT.