Control remoto y móvil
Control Center es una app de escritorio, pero el trabajo que sigue no se detiene
cuando te alejas del escritorio. El control remoto empareja tu teléfono con
tu cc_server mediante Remote, la app
compañera de remote.usectrl.dev, para que puedas seguir la flota desde ahí: leer
mensajes y tickets, responder a un agente, clasificar tu fuente de noticias, sin
que el audio, la transcripción, el código fuente ni las credenciales que residen
en el servidor lleguen a salir de él.
Piensa en él como un compañero del escritorio centrado en la lectura. No pretende sustituir al cliente de escritorio completo.
Transporte
Sección titulada «Transporte»El teléfono llega a cc_server por WebSocket: ya sea una conexión directa
(loopback, LAN, tailnet o wss://) o una sala con acceso por invitación en un
broker de señalización que retransmite tramas selladas. No hay ningún canal de
datos punto a punto.
Qué puede hacer el teléfono
Sección titulada «Qué puede hacer el teléfono»El teléfono emparejado llega a una porción pequeña e intencionada de la superficie del servidor:
- Leer tickets, agentes, espacios y sus mensajes, y tu fuente de noticias
- Responder: enviar un mensaje en un espacio, actualizar o asignar un ticket, marcar un artículo como leído o guardado
- Ejecutar un playbook: instanciar una plantilla de plan guardada con sus parámetros. Esto solo propone un plan; nada se ejecuta ni se gasta hasta que un operador lo apruebe en Estudio de planes en un cliente completo
- Cambiar de espacio de trabajo, desde el propio selector del teléfono
Eso es casi todo. Un teléfono es un principal con menos privilegios que un cliente completo. No puede lanzar procesos, gastar presupuesto de LLM, hacer push a GitHub ni crear espacios de trabajo. Consulta el modelo de acceso para ver cómo se aplica en lugar de limitarse a la intención.
Cómo se construye el enlace
Sección titulada «Cómo se construye el enlace»La conexión viaja por un relé intermediado: el servidor entra como
propietario en una sala con acceso por invitación en un broker wss://, y cada
cliente emparejado —escritorio, web, teléfono— entra en la misma sala con un
token de admisión con límite de tiempo. Concurren tres piezas:
| Pieza | Función |
|---|---|
| Remote (app para el teléfono) | La app web compañera, alojada en remote.usectrl.dev por defecto, o autoalojada. Se carga en un navegador y guarda el registro de emparejamiento en IndexedDB. |
| Broker de relé | Un relé wss:// sin estado (cc_signaling_server) que aloja salas de N vías. Transporta solo tramas opacas: cada carga útil se sella de extremo a extremo entre el teléfono y el servidor, así que el broker nunca ve los datos de la app ni el secreto de emparejamiento y nunca interpreta lo que reenvía. |
cc_server |
El propietario de la sala. Responde a las llamadas del teléfono a través del mismo despachador que usa cualquier otro cliente. |
Una oferta de emparejamiento incluye un descriptor de conexión que enumera
todas las rutas hasta el servidor (LAN, tailnet, wss:// público, relé) más su
huella de identidad. El resolvedor del teléfono elige la mejor ruta accesible y
fija la huella en la primera conexión (TOFU); el relé garantiza la conectividad
incluso cuando no existe ninguna ruta directa, sin poder leer nunca el tráfico.
Qué es la carga útil de emparejamiento
Sección titulada «Qué es la carga útil de emparejamiento»El emparejamiento se genera desde la app y se entrega como enlace profundo; consulta Emparejar un dispositivo para ver el procedimiento. Aquí lo que importa es su anatomía.
https://<pwa-host>/#<payload>La carga útil viaja en el fragmento de la URL, la parte que va después de #
y que los navegadores nunca envían al servidor, así que el host HTTPS de la PWA
nunca la ve. Incluye todo lo que el teléfono necesita para llegar al servidor y
demostrar quién es: el descriptor de conexión (todas las rutas más la huella de
identidad), un id de dispositivo recién generado, una clave precompartida de 32
bytes y un sello de caducidad. El teléfono la decodifica, guarda un registro de
emparejamiento en local y elimina el fragmento para que el secreto desaparezca
de la URL.
Hay dos formas de carga útil y no son intercambiables. El QR para teléfono
generado desde el panel de emparejamiento de la app es el PairingPayload v2
anterior, apuntado al host de la PWA de Remote. cc_server pair --client-url
emite un enlace v1 distinto y más antiguo ({s, i, k} — URL del servidor, id de
dispositivo, clave) pensado solo para el cliente web.
También difieren en su vida útil, algo que es fácil equivocar:
| Generado por | Caducidad de la credencial |
|---|---|
Panel de emparejamiento de la app (pairing.mint) |
30 días, siempre |
cc_server pair en la línea de comandos |
Ninguna — la credencial no caduca |
El modelo de acceso
Sección titulada «El modelo de acceso»Un dispositivo emparejado está autenticado pero no es de confianza. Varias barreras independientes impiden que un emparejamiento aprobado (o filtrado) se convierta en el control total del servidor.
1. La pertenencia, no el emparejamiento, es la frontera
Sección titulada «1. La pertenencia, no el emparejamiento, es la frontera»Una clave de emparejamiento válida demuestra qué dispositivo eres. Lo que puedes leer o cambiar lo decide tu rol en el espacio de trabajo, que se vuelve a resolver en cada llamada, y las concesiones por repositorio en todo lo que expone contenido de repositorios. Un dispositivo que tiene una clave perfectamente válida pero pertenece a un usuario que no es miembro del espacio de trabajo indicado recibe un «Not a member of this workspace».
El rol mínimo se deriva del tipo de operación, salvo que esta declare el suyo
propio: las lecturas necesitan guest, las mutaciones necesitan member y las
operaciones destructivas necesitan admin.
2. Un teléfono es un nivel de sesión inferior
Sección titulada «2. Un teléfono es un nivel de sesión inferior»Más allá de la comprobación de rol, una sesión de teléfono tiene menos capacidades que una sesión de escritorio o web. Las operaciones declaradas como exclusivas del cliente completo se rechazan para un teléfono antes de que se ejecute el manejador, sin importar cuán privilegiado sea el usuario que haya detrás: generar, listar, renombrar y revocar emparejamientos de dispositivos; leer y definir la conectividad del túnel; la copia de seguridad del servidor y la exportación/importación de espacios de trabajo; la detección y la finalización de procesos; las sondas de adaptadores; los ajustes del servidor; la administración de SSO; el control de la flota; y asumir el control de un agente en ejecución o devolvérselo.
3. Una lista de permitidos de herramientas que deniega por defecto
Sección titulada «3. Una lista de permitidos de herramientas que deniega por defecto»Para la superficie de herramientas de MCP en concreto (tools/call), una lista
de permitidos que deniega por defecto determina qué herramientas puede invocar
el teléfono. Todo lo que no figure en la lista se rechaza antes de ejecutarse. La
lista está cargada de operaciones de lectura y observación, más un puñado de
escrituras solo locales —un mensaje, una actualización de ticket, un marcado
de artículo— que no gastan presupuesto de LLM, no lanzan ningún proceso y no
tocan ningún sistema externo.
Denegadas, por ejemplo: consultar a un agente, iniciar una revisión con IA, finalizar un agente, publicar una revisión en GitHub, contratar o despedir agentes, crear un espacio de trabajo.
4. Ámbito de espacio de trabajo por llamada
Sección titulada «4. Ámbito de espacio de trabajo por llamada»El servidor no tiene un «espacio de trabajo actual». Es sin estado por
diseño: cada llamada con ámbito de espacio de trabajo debe indicar su
workspace_id de destino en sus argumentos, y el despachador rechaza la llamada
directamente cuando falta o cuando nombra un espacio de trabajo que el servidor
no tiene registrado, antes de que nada abra una base de datos. Por lo tanto, un
teléfono nunca puede heredar el ámbito de otro cliente ni derivar hacia él, y
nombrar un espacio de trabajo ajeno tampoco sirve de nada, porque la comprobación
de pertenencia de la barrera 1 sigue aplicándose. Es la misma invariante de
aislamiento de espacios de trabajo
que aplica el resto del producto.
5. Tramas selladas de extremo a extremo con la clave precompartida
Sección titulada «5. Tramas selladas de extremo a extremo con la clave precompartida»Cada trama entre el teléfono y el servidor se sella con la clave de emparejamiento; el token de admisión solo sirve para que un cliente entre en la sala, no descifra nada. El broker retransmite texto cifrado y nunca ve la clave. Un dispositivo revocado se encuentra con que su credencial ya no está, así que falla en cerrado al reconectarse.
Una credencial generada por la app tiene un límite de 30 días; pasado ese plazo, la barrera de conexión la rechaza y el teléfono debe volver a emparejarse. La revocación es inmediata: el servidor vigila la tabla de dispositivos y cierra las sesiones abiertas de un dispositivo revocado en cuestión de segundos, en lugar de esperar a su siguiente conexión.
6. Límite de tasa por principal
Sección titulada «6. Límite de tasa por principal»Un limitador de ventana deslizante limita el tráfico remoto de herramientas a 120 llamadas por minuto, con un sublímite más estricto de 30 por minuto para los verbos que mutan. El presupuesto pertenece al principal, no a la sesión: tres de tus dispositivos tiran de una misma asignación, así que un cliente secuestrado no puede ganar margen abriendo más sesiones y un miembro ruidoso no puede dejar sin cupo a los demás.
7. Un broker que no se entera de nada
Sección titulada «7. Un broker que no se entera de nada»El broker de relé es deliberadamente tonto: aloja salas, reenvía tramas selladas y no guarda ninguna cuenta, ningún dato de la app y ninguna clave. Las salas son transitorias y con acceso por invitación. Los datos de la app, el audio, la transcripción, el código fuente y las credenciales se quedan todos en el servidor.
Actualizaciones en vivo
Sección titulada «Actualizaciones en vivo»Una vez emparejado, el teléfono recibe actualizaciones en vivo como tramas de notificación —mensajes nuevos de agentes, tickets asignados a ti, cambios de estado— que reflejan las propias notificaciones del escritorio. El servidor difunde esas tramas a todas las sesiones conectadas y el filtro de espacio de trabajo se aplica en el cliente, así que lo que ves queda acotado al espacio de trabajo que estás mirando.
Dónde se encuentra
Sección titulada «Dónde se encuentra»| Superficie | Qué muestra |
|---|---|
Ajustes → Tú → Tus dispositivos (/workspaces/:workspaceId/settings/you/devices) |
Clientes emparejados con su estado en vivo, además de Vincular un nuevo cliente (navegador web, app de escritorio o teléfono) y revocar |
El mismo panel genera emparejamientos para un segundo navegador o una app de escritorio, no solo para teléfonos: el flujo es idéntico, solo cambia el enlace profundo.
Consulta también
Sección titulada «Consulta también»- Espacios de trabajo y aislamiento: el ámbito por llamada en el que se apoya esto
- Multijugador — identidad, pertenencia y presencia: roles, pertenencia y concesiones por repositorio
- Despliegue y clientes: dónde se sitúa el control remoto entre los niveles de cliente
- Arquitectura: dónde se sitúa el control remoto en la pila
- Emparejar un dispositivo