Ir al contenido

Panel de administración Web

El panel de administración web es la UI de APX basada en navegador. Corre enteramente en tu navegador, habla con el daemon sobre su API HTTP y no requiere ningún servidor público. Cualquier navegador en la misma máquina — o en la misma LAN tras la vinculación — puede usarlo.

Panel web de APX — pantalla de inicio mostrando la salud del daemon y la lista de proyectos

El daemon sirve el panel compilado en http://127.0.0.1:7430/. Arrancá el daemon y abrí esa URL:

Ventana de terminal
apx status # boots the daemon if it isn't running yet
# then open http://127.0.0.1:7430 in your browser

En la primera carga el panel obtiene su token de autenticación automáticamente desde /api/admin/web-token (endpoint solo loopback). No necesitás copiar un token a mano cuando lo abrís desde la misma máquina.

Abrir desde otro dispositivo (vinculación por LAN)

Sección titulada «Abrir desde otro dispositivo (vinculación por LAN)»

Para abrir el panel en tu teléfono u otra computadora en la misma LAN, usá apx pair web. El comando imprime un código QR y una URL directa:

Ventana de terminal
apx pair web
# Prints:
# http://192.168.1.42:7430/#token=<token>
# [QR code for scanning with a phone camera]

Escaneá el QR con la cámara de tu teléfono (no hace falta ninguna app) o compartí la URL. El fragmento #token=… lleva el token bearer — el panel lo usa automáticamente.

apx
$ apx pair web
  APX pairing (web)  ·  expires in 90s

  █▀▀▀▀▀█ ▀▄█▀▄ █▀▀▀▀▀█
  █ ███ █ ▀█▄▀  █ ███ █
  █ ▀▀▀ █ █▄▀█▀ █ ▀▀▀ █
  ▀▀▀▀▀▀▀ █ ▀ █ ▀▀▀▀▀▀▀
  ██▀▄ ▀▀▄▀█▄▀▄█▀ ▄█▀▄█
  ▀ ▀▀▀▀▀ █▄▀ ▄██▀▀▄ ▄▀
  █▀▀▀▀▀█ ▄▀█▄▀▀█▄▀ █▄█
  █ ███ █ ▀█▄ ▀▄█▀▄▀▀▀▀
  █ ▀▀▀ █ ▀▄█▀█ ▄▀▄█▄ ▄
  ▀▀▀▀▀▀▀ ▀▀ ▀▀▀▀ ▀ ▀▀▀

escaneá con la cámara del teléfono — abre la web ya vinculada
link: http://192.168.1.42:7430/#token=8f3a…d10c
code: pr_7QF2K  (o pegalo en la pantalla de vinculación de la web)
apx pair web — código QR y enlace de LAN impresos en la terminal

Para ver todos los clientes vinculados actualmente o revocar uno:

Ventana de terminal
apx pair list
apx pair revoke <id>

El panel es una app de Vite + React + TypeScript bajo src/interfaces/web/. La salida compilada cae en src/interfaces/web/dist/ y es servida por el daemon.

Ventana de terminal
# Build once (from repo root)
node scripts/build-web.js
# Or rebuild manually
cd src/interfaces/web
pnpm install
pnpm build
# Development with hot reload (proxies API calls to :7430)
pnpm dev

El script npm build:web y el hook prepack llaman ambos a node scripts/build-web.js, así que un npm install -g . global siempre envía un bundle fresco. Configurá APX_SKIP_WEB_BUILD=1 para saltearlo durante flujos de dev que no tocan la UI.

El panel tiene dos niveles de navegación:

  • Base (/p/0/…) — el espacio global del daemon: workspaces, modelos, sesiones, logs y configuración global. El chat en Base habla con el super-agente.
  • Proyecto (/p/:pid/…) — un único workspace de proyecto: agentes, chat, tareas, rutinas, MCPs, memorias y configuración.

Un riel izquierdo muestra todos los proyectos registrados más accesos directos a los módulos (Voces, Desktop, Deck, Code). Debajo del riel hay un botón Roby que abre una hoja flotante de chat conectada al super-agente.

Hay otros dos espacios de URL además de los de proyecto. Los módulos del panel son rutas de primer nivel — /inbox, /code, /desktop — y /m/… es enteramente la superficie del celular: /m/chat, /m/tasks, /m/commitments. La dirección vieja del celular, /mobile, sigue funcionando: redirige a /m/… para que los links que ya andan dando vueltas (QR impresos, la app Android) no se rompan.

Riel izquierdo — lista de proyectos más accesos directos a módulos

Cada pantalla que muestra una conversación se actualiza sola. El panel mantiene un WebSocket abierto contra el daemon (/api/events/ws, autenticado con el mismo token que la API HTTP), y el daemon avisa por ahí cada vez que una conversación se mueve, sin importar en qué superficie se produjo el turno.

Así, un mensaje que llega por Telegram aparece en la bandeja de la notebook y en el teléfono al mismo tiempo, sin recargar, y tres dispositivos abiertos en el mismo hilo quedan sincronizados. El socket lleva una señal, nunca contenido: dice qué hilo se movió, y cada pantalla vuelve a leer ese hilo por la misma API que ya usaba.

Se repara solo. Un teléfono que suspende la pestaña, una notebook que se duerme, un tailnet que se cae: al volver, el panel se reconecta y revalida una vez, así no se pierde nada de lo que pasó mientras estuvo afuera. Si el socket no se puede abrir (un proxy que rechaza upgrades), las listas vuelven a su refresco de 15 segundos y el panel sigue funcionando, sólo que menos inmediato.

Los turnos activos y mensajes encolados también sobreviven la navegación dentro del panel. Si salís de un chat y volvés, se recuperan respuesta parcial y tarjetas de tools terminadas en orden original; luego continúa streaming. Todas listas chats usan mismo indicador compacto junto badge agente: spinner mientras agente escribe y punto azul cuando respuesta termina fuera chat abierto. Abrir chat limpia punto. Cambio chat limpia historial anterior enseguida; turno viejo sigue daemon, pero no puede escribir chat nuevo.

El punto es compartido, no de cada dispositivo. Lo leído vive en el daemon (~/.apx/read-marks.json), así que leer una conversación en la laptop lo apaga en el teléfono en el mismo segundo — las demás superficies se enteran por el mismo socket. Antes era la memoria de cada navegador, y por eso una tarde de lectura en un aparato dejaba cuarenta filas azules en el otro, todas ya leídas. Una instalación que ya venía andando toma su línea de base la primera vez que se le pregunta: todo lo dicho antes de ese momento cuenta como leído, y sólo lo que llega después levanta un punto.

El panel puede avisarte cuando un agente escribe y vos no estás mirando: una notificación por conversación, a través del service worker, y tocarla abre ese chat. Se activa en Settings → Notificaciones (o desde la hoja de preferencias del celular). Necesita https — apx panel tailscale on — y necesita que la app esté corriendo, aunque sea en segundo plano; despertar una app cerrada del todo es web push, que APX todavía no hace.

Lo que dispara una es la respuesta de un agente, y nada más. Tu propio mensaje no, y el trabajo del medio tampoco: un turno puede correr dos docenas de herramientas y cada una mueve la conversación, que es por qué un mismo turno llegaba como una pila de notificaciones. Una respuesta que se transmite de a pedazos suena una vez y después actualiza el mismo cartel en silencio.

Qué canales pueden sonar se responde por dispositivo. En el celular tenés Telegram instalado, así que una notificación de APX sobre una respuesta de Telegram es la misma noticia dos veces: ahí arranca apagado. En la compu es la única forma de enterarte, así que ahí arranca todo prendido. Los chips de Settings → Notificaciones prenden y apagan cada canal en el dispositivo donde estás; la elección vive en ese navegador (localStorage) y no sale de ahí.

Lo mismo vale para las listas. La bandeja y /m/chat muestran todos los canales donde puede pasar una conversación, y un solo picker plegado — “Canales · 6 de 11” — apaga y prende cada uno para ese dispositivo, de nuevo con Telegram apagado por defecto en el celu. Un canal apagado conserva su switch (y su contador), así que la vuelta está donde estaba la ida, y una lista vacía por un filtro dice qué filtro la vació en vez de hacerte creer que no hay nada. Las dos listas son planas y ordenadas por lo más reciente, así que cada fila lleva su canal como etiqueta.

La bandeja cruza todos los proyectos a la vez, y eso abre una segunda pregunta que el canal no contesta: dos proyectos pueden tener cada uno una agente Zoya, y “Zoya · Web” no dice de quién es. Por eso la procedencia tiene badge propio — el nombre del proyecto, al lado de la etiqueta de canal y nunca metido adentro de ella — en la fila de la lista y en el encabezado de la conversación que abre, tanto en la compu como en el celular.

Solo se marcan los agentes de otro proyecto. En el proyecto default vive el super-agente y ahí cae toda conversación que no tiene proyecto propio, así que ponerle badge sería etiquetar casi toda la lista con el único lugar que se da por sentado.

Al lado del picker de canales hay uno de Proyectos con la misma forma, con un contador por proyecto, para leer las conversaciones de un proyecto solo. Como el de canales, es una elección por dispositivo que queda en ese navegador.

Adentro del tab Chat de un proyecto (/p/:pid/chat) no aparece ni el badge ni el filtro: la respuesta es la pantalla donde ya estás parado.

Abrir un proyecto te lleva a su Resumen — un “mission control” con tarjetas de conteo en vivo (agentes, tareas abiertas, rutinas activas, artifacts), una franja de flujo de tareas desglosada por estado, el roster de agentes (orquestadores vs. especialistas) y las tareas abiertas más recientes. Cada pestaña de abajo mapea a un namespace de la API del daemon.

🖥️ SCREENSHOT · web Resumen del proyecto — tarjetas de conteo, franja de flujo de tareas y roster de agentes apx web, luego abrí cualquier proyecto (su pestaña de aterrizaje)
Resumen del proyecto — tarjetas de conteo, franja de flujo de tareas y roster de agentes

La pestaña Chat habla con el super-agente (Roby) y con cada agente del proyecto. La barra lateral es channel-first, agrupada como Web, Telegram, Desktop, Voice, Agent ↔ Agent, Schedule, Other — en ese orden. Además de tus propias conversaciones web, también muestra los hilos por día del super-agente de cualquier otro canal (Telegram, Desktop, Deck), así una conversación que pasó por Telegram queda visible desde la web — y se puede seguir ahí, en una sesión aparte.

El botón ”+ New” abre un selector de agente (super-agente o cualquier agente del proyecto) e inicia una sesión nueva que recién se materializa bajo el grupo Web cuando mandás el primer mensaje. Cada conversación abierta tiene una acción “New session” (reinicia en el lugar) y una acción “Delete” (detrás de un diálogo de confirmación) que elimina permanentemente el archivo de conversación o el hilo del canal.

Debajo del nombre del agente, el título del hilo es un selector: lista las otras sesiones de la conversación que estás leyendo — el mismo canal y, en un canal donde escriben varias personas (WhatsApp), la misma persona, una fila por día. No todos los hilos que tiene APX: abrir el WhatsApp de un contacto ofrece sus días, no el día de Telegram ni la conversación de otra persona. Alguien que escribió desde dos números sigue siendo una sola persona ahí, porque lo dice la agenda. Un par agente-a-agente y una sala de grupo son una conversación cada uno, así que ninguno de los dos lleva selector.

Un turno de varios pasos no se imprime como un log. Todas las herramientas que corrió el agente se colapsan en una fila N acciones — abierta mientras trabaja, cerrada cuando termina, un clic para ver argumentos y resultados, y cualquier error nombrado en la fila misma. Lo que queda a la vista es el mensaje de cierre: la respuesta para la que existía el turno. Si volvés a abrir la conversación más tarde ves lo mismo: los pasos quedan guardados con el turno, no solo streameados y olvidados. Prosa progreso sigue visible, pero no vuelve al prompt siguiente; sólo respuesta final entra historial conversación.

Invitar a alguien convierte el chat en grupo

Sección titulada «Invitar a alguien convierte el chat en grupo»

Una conversación nunca se abandona para empezar otra. Sumar un agente a un 1:1 convierte ese chat: la transcripción pasa a una sala de grupo, el agente que entra puede leer todo lo que se dijo antes de que llegara, y el 1:1 queda archivado con un puntero a dónde sigue.

Un par agente-a-agente también es una sala — dos agentes hablando — así que se dibuja como tal, con cada hablante nombrado arriba de su burbuja en vez de etiquetado abajo. No tiene asiento para vos hasta que lo quieras: apenas escribís en un par, también se convierte, sentando a los que sean agentes de este proyecto (el asiento del super-agente pasa a ser el tuyo), y tu línea es lo primero que se dice en la sala nueva.

Un turno agente-a-agente es un loop de herramientas completo que puede durar minutos. Sin importar cómo arrancó — por HTTP, o porque un agente llamó a send_to_agent / call_agent, incluido el trabajo que quedó corriendo de fondo — el par muestra la misma narración en vivo que cualquier otro chat: dice que alguien está respondiendo antes del primer token, las herramientas aparecen mientras corren, y Stop llega al trabajo. Cancelar un job de fondo frena a su peer por la misma razón.

Un chat que arrancás dentro de un proyecto queda listado en ese proyecto. El workspace Base sigue mostrando todos los hilos de todos los canales; un proyecto muestra los que se abrieron desde él, más los hilos de canal (Telegram, Desktop) que no pertenecen a ningún proyecto en particular.

Pestaña Chat — barra lateral channel-first con hilos del super-agente y por agente

Cualquier mensaje de cualquier conversación —tuyo o de un agente— tiene una acción Reenviar al lado de Copiar. Pregunta dos cosas: a quién le llega y en qué parte de su historia cae. La sesión más reciente de quien elijas viene preseleccionada, así seguir una charla que ya venías teniendo es un solo clic; Sesión nueva es siempre la primera opción para el otro caso. Lo que escribas va debajo de la cita, y podés dejarlo vacío: “mirá esto” es un mensaje completo, y el agente responde al mensaje reenviado.

La lista no se limita a este proyecto. Para vos la instalación es un solo conjunto de agentes, así que el selector cruza todos los proyectos registrados, agrupados por el nombre de cada uno, con un buscador que matchea el nombre de la persona, su slug o el proyecto donde está (lo sirve GET /api/agents). Reenviar a otro proyecto te lleva ahí y la charla sigue en el chat de ese proyecto — la cita guarda de qué proyecto SALIÓ, así el link de la tarjeta sigue abriendo la conversación correcta.

Del otro lado llega como una tarjeta que dice de dónde salió, quién lo dijo y cuándo, con un link de vuelta a esa sesión — así el reenvío se lee como una cita y no como un texto pegado sin autor. El agente lee los mismos tres datos: la cita viaja en el prompt, marcada como palabras de otro.

Hay conversaciones que no pueden recibir un reenvío, y quedan fuera de la lista en vez de ofrecerse para después rebotar: los hilos de Telegram y WhatsApp (el mensaje está en el teléfono de alguien; un turno escrito acá sale por web), los transcripts entre agentes, los grupos, y cualquier hilo del super-agente que no sea el de hoy en esta superficie — el super-agente no tiene archivo de conversación, sus turnos se escriben con el reloj, y un mensaje puesto en el de ayer se vería en un hilo y quedaría registrado en otro.

Responder dentro de un hilo de Telegram o WhatsApp

Sección titulada «Responder dentro de un hilo de Telegram o WhatsApp»

Esos hilos se leen acá y no se pueden escribir: el mensaje se entregó en la plataforma de otro, y APX no puede retirarlo ni agregarle nada. El composer lo dice arriba del campo, y después hace lo honesto — lo que escribas sigue en una sesión nueva con el super-agente, con el último mensaje del hilo citado arriba del tuyo, y el panel se mueve ahí mientras manda. Antes la respuesta parecía caer en el hilo de Telegram y desaparecía en la siguiente recarga.

La pestaña Tasks es el backlog del proyecto. Además de los campos clásicos de id/título/tags/fecha de vencimiento/agente asignado, las tareas ahora llevan un estado de flujo de trabajo — pending, running, in_review o blocked mientras están abiertas, y done/dropped una vez cerradas — mostrado con un ícono y color de estado. Al abrir una tarea aparece un panel de detalle con estado y cuerpo editables, y un enlace “View thread” cuando la tarea está vinculada a un hilo de chat. La lista tiene paginación de servidor (ver más abajo) y se puede filtrar por estado (open / done / dropped).

Pestaña Tasks — tareas abiertas con estado de flujo de trabajo, tags, fechas de vencimiento y agentes asignados

La pestaña Routines programa trabajo recurrente — un prompt del super-agente, un comando de shell, un mensaje de Telegram, o un heartbeat — en una expresión cron.

Pestaña Routines — rutinas programadas de super-agente, shell, Telegram y heartbeat

La pestaña MCPs lista los servidores Model Context Protocol disponibles para el proyecto en los tres scopes (shared, runtime, global), con un panel de logs en vivo. Los valores de header/config en el editor de MCP soportan el selector de tokens de variables — mirá Variables más abajo.

Servidores MCP — filesystem, GitHub, Postgres y un servidor HTTP a través de los scopes

La pestaña Memories muestra el contexto de larga vida que leen los agentes, un archivo por fila. Un proyecto tiene dos. Memoria interna (~/.apx/projects/<id>/memory.md) va primera y es la que abre: la escribe la tool remember del super-agente y git no la ve nunca, así un dato levantado en medio de una charla no te mete una credencial pegada en el historial. Memoria del proyecto (.apc/memory.md) es la curada, la que viaja con el repo. Promover una línea de la interna a la committeada es una edición manual acá. Abajo va la memoria propia de cada agente. La libreta del super-agente (~/.apx/memory.md) es global, no de un proyecto, así que aparece solamente en Base.

Pestaña Memories — el editor del memory.md del proyecto

La pestaña Skills incrusta el mismo gestor de skills que se usa en Settings (mirá Skills), fijado al scope de este proyecto — habilitar, deshabilitar, agregar e inspeccionar skills sin salir del proyecto.

Structure Proyectos de empresa

Sección titulada «Structure »

Para proyectos con kind: "company", aparece una pestaña Structure para gestionar el modelo organizacional detrás de la asignación de agentes: Areas (por ejemplo “Engineering”, “Sales”) y Roles dentro o fuera de un área. Las áreas y roles se pueden crear, editar y eliminar acá, y están respaldados por .apc/organization.json. Los mismos diálogos de creación rápida son accesibles desde los selectores de Area/Role del editor de agentes.

🖥️ SCREENSHOT · web Pestaña Structure — Areas y Roles para un proyecto de tipo empresa apx web, luego abrí un proyecto de empresa → Structure
Pestaña Structure — Areas y Roles para un proyecto de tipo empresa

Dos pestañas navegan los archivos del proyecto con el mismo componente visor:

  • Docs — editable. Enraizado en la carpeta de docs configurada del proyecto (docs.root, default docs/). Soporta crear, editar (un editor de markdown split sin dependencias con preview en vivo) y eliminar archivos.
  • Files — de solo lectura. Navega todo el árbol del proyecto. Consciente del tipo: Markdown se renderiza, el código se muestra con números de línea, las imágenes se previsualizan inline.
🖥️ SCREENSHOT · web Pestaña Docs — editor de markdown split con preview en vivo apx web, luego abrí un proyecto → Docs → creá o abrí un archivo
Pestaña Docs — editor de markdown split con preview en vivo

La pestaña Artifacts lista los artifacts guardados bajo <project>/artifacts/ — la misma lista que usa el panel lateral del módulo Code, ahora accesible desde la navegación propia del proyecto. Run y Edit delegan al módulo Code para que puedas pasar argumentos (por ejemplo una URL) en la terminal o editar el archivo directamente, en lugar de ejecutar sin cabeza en el lugar.

La pestaña Config muestra la configuración efectiva del proyecto fusionada desde los archivos .apc/ del proyecto y los defaults globales.

Pestaña Config — configuración efectiva del proyecto y sus fuentes

La pestaña Variables (vars) gestiona valores secretos/de config nombrados y enmascarados, en scope de proyecto o global (por ejemplo MY_API_KEY). Los valores están ocultos por default con un toggle de revelar por fila y uno global. Donde sea que un valor pueda referenciar una variable — por ejemplo los headers de un servidor MCP — un selector de tokens (el botón ”+” junto al campo) te deja buscar e insertar ${var.NAME}, renderizado inline como un badge $NAME para que la referencia se lea como parte de la línea en vez de un string de template crudo.

🖥️ SCREENSHOT · web Pestaña Variables — valores enmascarados con el selector de tokens usado para referenciarlos en otro lado apx web, luego abrí un proyecto → Variables, y MCPs → campo de header
Pestaña Variables — valores enmascarados con el selector de tokens usado para referenciarlos en otro lado

La pestaña Projects (Base → Workspaces) lista todos los proyectos registrados como tarjetas. Hacé clic en una tarjeta para entrar a ese proyecto. El botón “New project” abre un diálogo inline (?action=add-project).

Pestaña Workspaces — tarjetas de proyecto con nombre, tipo y ruta

Cada proyecto tiene una pestaña Agents. Podés crear, editar y eliminar agentes; ver y editar el memory.md de cada agente; y asignar skills. En el espacio Base la pestaña Agents muestra la configuración del super-agente (resumen de solo lectura).

Pestaña Agents — lista de agentes con conteos de memoria y skills

Abrí un agente para inspeccionar su memoria, skills, herramientas, sub-agentes y grafo cerebral. El editor también define un emoji (que se muestra junto al agente en toda la UI, incluido el roster del Resumen), un nivel de autonomy — un selector de tres opciones para los mismos modos de permiso que la CLI/config (total, automatico, permiso, etiquetados Total / Auto / Permission) — y, para proyectos de tipo empresa, un Area y Role tomados de Structure, con botones de creación rápida junto a cada selector.

Detalle de agente — pestañas de memoria, skills, sub-agentes y el grafo cerebral

La pestaña Base Sessions (/p/0/sessions) lista todas las sesiones grabadas a través de los engines. Un buscador (coincidencia por título por default, con un toggle “Deep” para escanear el contenido de la transcripción) reutiliza la misma lógica de matching que apx session find, más un filtro de engine y un botón Clear. Cada fila expone cuatro acciones: copiar el comando apx session resume <id> --continue, pedirle al asistente que continúe esa sesión desde una burbuja de chat rápido, abrir la carpeta de trabajo de la sesión, y copiar su ruta.

Pestaña Sessions — búsqueda, filtro de engine y acciones por fila

El módulo Voices (/m/voice) configura TTS y STT globalmente. Muestra el estado en vivo de cada motor TTS configurado (Piper, ElevenLabs, OpenAI, Gemini, mock), te deja elegir un default o un modo de cadena-con-fallback, reordenar la cadena, configurar credenciales por motor y correr una reproducción de prueba en vivo. La sección STT configura el modelo y el idioma de Whisper para la entrada de micrófono.

Mirá Voz para la referencia completa de la CLI.

Módulo Voices — lista de proveedores TTS con badges de estado y selector de default

El módulo Desktop (/desktop) muestra si la ventana flotante de Electron está corriendo (clientes WebSocket conectados), te deja editar el atajo global y alternar si el daemon responde a los mensajes de desktop. No podés iniciar ni detener el proceso de Electron desde el panel web — usá apx desktop start / stop.

Mirá Desktop para la referencia completa de la CLI.

El módulo Deck (/m/deck) expondrá el payload de GET /api/deck/manifest: salud del daemon, proyecto activo, plugins registrados y la grilla de widgets/desktop, y te dejará habilitar o deshabilitar widgets individuales desde esta vista.

Mirá Deck para la referencia de la CLI de vinculación.

El módulo Code (/code) es la superficie de administración del asistente de codificación de APX. Trabaja sobre una sesión de código: una transcripción persistente con su propio baseline de git, modo plan/build y, opcionalmente, un agente del proyecto.

Abre con las sesiones de todos los proyectos, las más recientes primero — el selector de proyecto arriba del riel filtra la lista en vez de definirla. Importa porque una sesión pertenece al proyecto que resolvió su directorio de trabajo, así que una corrida arrancada en otro lado quedaría invisible acá. Cada fila dice de qué proyecto es y, si tiene uno, qué agente responde.

Nueva sesión hace las dos preguntas que son decisiones: en qué proyecto corre (archivos, terminal y diff quedan acotados a él) y qué agente responde — el super-agente, o cualquier agente de ese proyecto. Las dos quedan a la vista después en el panel Contexto, donde además se puede cambiar el agente de esa sesión.

La terminal comparte las mismas sesiones:

Ventana de terminal
apx exec --code "refactorizá el middleware de auth"

corre un turno en una sesión nueva titulada con tu prompt, imprime la respuesta por stdout e imprime el id de la sesión por stderr para que puedas abrirla en el panel. Pasá --session <id> para continuar una existente.

Si lo corrés desde una carpeta que no es un proyecto registrado, la sesión trabaja en esa carpeta.

En modo build el asistente lee el AGENTS.md del proyecto, lleva una checklist en trabajos de varios pasos, edita con patches (apply_patch) o reemplazos exactos, corre los tests o checks del propio proyecto antes de dar el cambio por hecho y termina con el diff. Arranca sólo con las tools de código; lo demás (navegador, calendario, mensajería) lo activa cuando lo necesita. Cada turno nuevo de una sesión sabe qué archivos leyeron y cambiaron los turnos anteriores.

La configuración global vive bajo Settings (/settings/*), agrupada en secciones. Sub-secciones:

RutaSecciónQué edita
/settings/identityAccountNombre del asistente, persona, zona horaria
/settings/super-agentAgentsNombre, avatar, personalidad y prompt extra; modelo propio, modo de permisos, guardas (riesgo por acción, detección de loops, freno de gasto) y límite de pasos por canal
/settings/enginesAgentsProveedores de modelos (agregar, editar, alternar)
/settings/memoryAgentsMemory (RAG) — config de embeddings y retrieval
/settings/skillsAgentsGestor de skills + RAG (Skill Inspector) — mirá Skills
/settings/telegramChannelsToken del bot de Telegram y canales
/settings/devicesChannelsLista de dispositivos vinculados
/settings/voiceModulesTTS/STT — igual que el módulo Voices del riel
/settings/desktopModulesConfiguración de la ventana Desktop
/settings/deckModulesConfiguración del companion Deck
/settings/webModulesWeb — tema, idioma y (vía Identity) zona horaria propios del panel
/settings/advancedAdvancedEditor crudo de ~/.apx/config.json

La vieja ruta /settings/appearance sigue funcionando — ahora abre /settings/web.

Settings — panel de proveedores de modelos

El panel Super-agent define el modo de permisos de Roby, su personalidad y su system prompt; el modelo activo y la cadena de fallback se configuran en el router de modelos.

Settings — comportamiento del super-agente, modo de permisos y system prompt

El panel Web controla la UX propia del panel en vez de la identidad del agente: elegí Light, Dark o System (sigue el esquema de color del sistema operativo) para el tema, y cambiá el idioma de la UI — la página se recarga una vez para que todos los strings renderizados tomen el nuevo locale.

🖥️ SCREENSHOT · web Settings → Web — selectores de tema (light/dark/system) e idioma apx web, luego Settings → Modules → Web
Settings → Web — selectores de tema (light/dark/system) e idioma

El panel Telegram gestiona los canales del bot, los contactos y los permisos de herramientas por rol.

Settings — canales, contactos y roles de Telegram

El panel Devices lista cada navegador o teléfono vinculado y te deja revocar un token.

Settings — dispositivos vinculados con última conexión y revocación

Vistas de lista: paginación y layout de altura completa

Sección titulada «Vistas de lista: paginación y layout de altura completa»

Las listas de Sessions, Tasks globales y Tasks por proyecto usan paginación real de servidor: el daemon pagina por ?limit y ?offset y devuelve el conteo total de filas en un header X-Total-Count, así el panel solo trae la página actual y muestra un rango real (“1–20 of 485”) y un conteo de páginas en vez de estar topeado a un tamaño de fetch fijo. El tamaño de página es seleccionable (10/20/50/100, default 20). Estas pestañas de lista también usan un layout de altura completa: la lista scrollea internamente mientras el paginador queda fijo abajo, así toda la vista entra en una pantalla.

El panel es un cliente liviano: no tiene estado local más allá de la sesión actual. Cada lectura es un GET contra la API HTTP del daemon; cada escritura es un PATCH o POST. El daemon es la única fuente de verdad.

Browser → GET/POST → http://127.0.0.1:7430/<route>
↓
APX daemon (host/daemon/)
↓
core/ (logic, memory, agents…)

El bundle web es servido por src/host/daemon/api/web.js. Las rutas de la API siempre tienen prioridad sobre el catch-all de la SPA, así que una petición a /api/projects/1/agents pega en el endpoint real, no en index.html.

  • Desktop — la ventana flotante de Electron
  • Voz — CLI y proveedores de TTS/STT
  • Deck — vinculación de la app companion
  • Skills — el gestor de skills, los scopes y el Skill Inspector (RAG)