Acceso remoto y el cliente enriquecido

Una VM de espacio de trabajo reside en un Mac, pero la persona que quiere manejarla no siempre está sentada frente a ese Mac. Se puede acceder a Bromure Agentic Coding de forma remota, y cada ruta remota transita por una única puerta de entrada SSH, opcional y deshabilitada de forma predeterminada. Actívala y obtendrás tres formas de acceso: una persona puede conectarse con ssh desde cualquier terminal y aterrizar en un menú; puedes gestionar la propia puerta de entrada desde la línea de comandos; y un cliente enriquecido — otro Mac que ejecuta la app, o la app de iOS / iPadOS — puede conectarse y replicar toda la instancia (su cuadrícula, espacios de trabajo, terminales y paneles de control) en una ventana en vivo.

El cliente enriquecido llega a un servidor de dos maneras. En la misma red lo añades directamente por dirección. Desde cualquier otro lugar inicias sesión en una cuenta de bromure.io y eliges el servidor de un directorio: bromure.io presenta los dos dispositivos entre sí y luego hablan de par a par, sin reenvío de puertos, sin VPN y sin ninguna dirección que recordar — y una vez que has iniciado sesión, tus propios dispositivos se autorizan mutuamente, de modo que la conexión es sin contraseña y sin configuración manual de claves.

Este capítulo cubre la habilitación del acceso remoto en el anfitrión, cada uno de los puntos de entrada, cómo el cliente enriquecido replica un remoto 1:1 (por dirección y mediante bromure.io), el acceso a servicios dentro de VM remotas, la exposición de un servidor de desarrollo a internet y el modelo de seguridad que mantiene todo ello a salvo. La inscripción a escala de flota y la telemetría en la nube son un sistema completamente distinto — consulta Enterprise. La referencia completa de comandos se encuentra en Automatización y la CLI.

Las tres formas de acceso

Todo lo que sigue depende de que la puerta de entrada SSH esté habilitada (está desactivada de forma predeterminada). Una vez en ejecución, el mismo servidor atiende a los tres públicos:

Forma de accesoQuién la usaQué obtienes
SSH simpleUna persona en cualquier terminal (ssh -p 2222 you@mac)El menú remoto — una TUI de estilo curses. Nunca es accesible una shell sin restricciones.
La CLI bromure-cli remoteTú, en el propio anfitriónGestiona la puerta de entrada: habilitar/deshabilitar, claves, estado. Consulta Habilitar el acceso remoto en el anfitrión.
El cliente enriquecidoOtro Mac que ejecuta la app, o la app de iOS / iPadOSUna ventana de réplica en vivo 1:1 de la instancia remota, con ediciones bidireccionales — alcanzada por dirección en una LAN o a través de una cuenta de bromure.io desde cualquier lugar.

El servidor está integrado — es la biblioteca swift-nio-ssh de Apple incorporada en la app, no el propio sshd de macOS. Esa distinción importa: como la app ejecuta su propio servidor, puede verificar la contraseña de tu cuenta de macOS a través de OpenDirectory sin que nunca tengas que habilitar Inicio de sesión remoto en Configuración del Sistema y sin derechos de administrador. Escucha únicamente al usuario exacto de macOS que lanzó bromure-cli, y fuerza cada inicio de sesión interactivo hacia el menú remoto. Las únicas excepciones orientadas a máquina son cuatro comandos en lista blanca que usa el cliente enriquecido (bromure-fatclient/1 control, forward <ip> <port>, forward-udp <ip> y browser-mcp <vm>); cualquier otra cosa que escriba un humano se comporta como un inicio de sesión y cae en el menú.

Nota: La ventana de Acceso remoto describe el servidor como "una instancia del servidor SSH del sistema propiedad de la app". Con mayor precisión, es un servidor swift-nio-ssh integrado, deliberadamente no el sshd de macOS — eso es exactamente lo que le permite funcionar sin Inicio de sesión remoto ni derechos de administrador.

Habilitar el acceso remoto en el anfitrión

El acceso remoto está desactivado hasta que lo actives, y puede gestionarse de dos formas equivalentes: la ventana Acceso remoto o la CLI bromure-cli remote. Ambas escriben en el mismo sitio, así que un cambio realizado en una se refleja en la otra y se aplica en vivo.

La ventana Acceso remoto

Abre Bromure Agentic Coding (el menú con el nombre de la app) → Acceso remoto…. El título de la ventana es Acceso remoto. Un punto verde o gris indica sshd running o sshd stopped; cuando el servidor está activo, aparece bajo el encabezado una cadena de conexión copiable con la forma ssh -p <port> <user>@<host>.

SecciónCampoPropósitoPredeterminado
EncabezadoHabilitar acceso remoto por SSHInicia y detiene el servidor.Desactivado
EscuchaIP de vinculaciónEn qué interfaz escuchar. 0.0.0.0 = todas las interfaces; 127.0.0.1 = solo este Mac.0.0.0.0
EscuchaPuertoPuerto TCP de escucha; debe ser ≥ 1024 (un proceso sin privilegios de root no puede vincular puertos privilegiados).2222
AutenticaciónContraseña de la cuenta de macOSAcepta la contraseña de inicio de sesión de macOS del usuario que ejecuta la app (verificada mediante OpenDirectory).Activado
AutenticaciónClave públicaAcepta claves de la lista de claves autorizadas siguiente.Activado
Clave de anfitrión del servidorhuellaLa huella de la propia clave de anfitrión ed25519 del servidor, para verificación fuera de banda. Indica (generada al habilitar por primera vez) hasta el primer uso.
Claves públicas autorizadaslistaClaves públicas ssh-ed25519 / ecdsa inscritas. Añade pegando una línea de clave; elimina con el icono de papelera. Indica No hay claves inscritas. cuando está vacía.vacía

Edita la IP de vinculación o el Puerto y pulsa Return para aplicar el cambio en vivo. La sección Autenticación indica Verificada contra <user> — el usuario que ejecuta bromure-cli. para que quede claro cuya contraseña abre la puerta.

Advertencia: Al menos un método de autenticación debe permanecer habilitado — no puedes desactivar a la vez la autenticación por contraseña y por clave pública. Pegar una clave no válida se rechaza con No es una clave pública válida. Añadir o eliminar una clave autorizada reinicia el proceso de escucha, lo que corta cualquier conexión en vivo.

La CLI bromure-cli remote

La CLI se comunica con la app en ejecución a través de su socket de control exclusivo del propietario, de modo que la app sigue siendo la única fuente de verdad. Es la forma más rápida de habilitar el acceso en un Mac sin pantalla al que has llegado a través de una shell existente.

ComandoQué hace
bromure-cli remote (o remote status)Imprime el estado habilitado/en ejecución, la vinculación y el puerto, los métodos de autenticación, la huella de la clave de anfitrión, el usuario de inicio de sesión, una cadena de conexión lista para usar y la lista numerada de claves autorizadas.
bromure-cli remote enable [--port N] [--bind IP] [--password|--no-password] [--pubkey|--no-pubkey]Inicia el servidor (lanzando automáticamente el agente de la app si es necesario). Predeterminados: puerto 2222, vinculación 0.0.0.0, ambos métodos de autenticación activados.
bromure-cli remote disableDetiene el servidor y persiste el estado de desactivado.
bromure-cli remote key add <path-or-key-text>Inscribe una clave pública desde una ruta de archivo o una línea de clave pegada; imprime su huella.
bromure-cli remote key lsLista las claves autorizadas con un índice de base 1, huella y comentario.
bromure-cli remote key rm <index|fingerprint>Elimina una clave por índice o por una subcadena de huella.

remote enable rechaza la operación si pasas a la vez --no-password y --no-pubkey, y da error mientras falta una imagen base o se está instalando. Cuando la app no está en ejecución, status, disable y key ls imprimen No hay ningún agente bromure-cli en ejecución.

Nota: El servidor no se iniciará mientras la imagen base esté ausente o todavía instalándose — al habilitarlo se devuelve entonces un error accionable en lugar de un no-op silencioso. Esto es cierto tanto en el lanzamiento como al accionar el interruptor. Instala o termina de instalar primero la imagen base.

Claves de anfitrión, huellas y confianza

En la primera habilitación, el servidor genera una clave de anfitrión ed25519. Su huella — mostrada en la fila Clave de anfitrión del servidor y por bromure-cli remote status, con la forma 256 SHA256:… bromure-ac-remote (ED25519) — es lo que un cliente que se conecta verifica para asegurarse de que ha llegado al Mac correcto. Entrega esta huella a quien se conecte (o compruébala tú mismo en la hoja de primer contacto del cliente enriquecido) para que un intermediario no pueda suplantar al anfitrión. Consulta confianza en el primer uso para saber cómo la fija el cliente enriquecido.

Limitación de frecuencia

Los intentos de contraseña se limitan por IP de origen mediante un cubo de tokens: cinco intentos a velocidad plena, luego una recarga de aproximadamente un intento cada dos segundos, con el retraso impuesto limitado a ocho segundos. Los intentos se retrasan, nunca se rechazan, y nadie queda bloqueado nunca; una IP ruidosa no puede ralentizar a otra. La autenticación por clave pública nunca se limita.

Iniciar sesión mediante SSH simple

Cualquier terminal puede llegar al anfitrión con ssh -p 2222 <user>@<mac>. En lugar de una shell, la conexión aterriza en el menú remoto — una TUI de estilo curses (internamente bromure-cli __remote-menu) forzada sobre cada inicio de sesión humano. A través de él nunca es accesible una shell sin restricciones.

El menú replica la app: una lista unificada de Espacios de trabajo con glifos de estado en vivo (● en ejecución, ◌ arrancando, ⏸ suspendido, ○ apagado), además de las secciones Modelos y Traza. Desde ahí puedes:

  • Crear un espacio de trabajo con un formulario de una sola pantalla, con una puerta Configuración completa… hacia los catorce paneles de configuración (General, Agentes, Modelos locales, Fusion, Carpetas, Credenciales, Entorno, MCP, Trazado, Salvaguardas, Cadena de suministro, Inyección de prompts, Apariencia, Recursos).
  • Iniciar, suspender, terminar, reiniciar o eliminar cualquier espacio de trabajo.
  • Editar cada ajuste. Los secretos se muestran como •••• (set); dejar un secreto en blanco conserva el valor almacenado.
  • Gestionar worktrees — crear, fusionar, adjuntar un terminal o descartar — con el mismo anidamiento que la GUI.
  • Generar claves SSH, alternar Fusion y el enrutamiento de modelos, y explorar resúmenes de trazas.
  • Adjuntar a cualquier pestaña de tmux o a un contenedor Docker en ejecución.

Navega con las teclas de flecha, Enter para seleccionar, y q o Esc para retroceder; Salir (desconectar) termina la sesión. Seleccionar Adjuntar entrega el terminal al tmux del invitado; Ctrl-b d se desacopla de vuelta al menú. Mientras estás adjuntado, un atajo de teclado superpuesto (predeterminado Ctrl-]) abre un controlador del lado del anfitrión — cambiar de pestaña, abrir una nueva pestaña, gestionar worktrees, alternar Fusion o el enrutamiento, editar ajustes, reiniciar, suspender o desconectar — sin que la pulsación llegue nunca al invitado. Adjuntarse a un contenedor solicita la shell (Enter = sh).

Nota: El menú necesita un terminal real. Conectarse sin un TTY imprime una sugerencia para reconectar con ssh -t. Iniciar un espacio de trabajo en frío espera hasta unos 20 segundos a la sesión de tmux del invitado antes de adjuntarse. Si un espacio de trabajo usa autenticación de Suscripción, el menú te recuerda que ejecutes el inicio de sesión de la herramienta (por ejemplo claude login) dentro de la VM tras arrancar.

El atajo superpuesto es configurable en el Mac anfitrión (la máquina a la que se conecta) mediante el archivo ~/Library/Application Support/BromureAC/remote/overlay-key — las formas aceptadas son C-], ^], 0x1d o 29 — o la variable de entorno BROMURE_OVERLAY_KEY.

Replicar un remoto con el cliente enriquecido

El cliente enriquecido convierte la copia de Bromure Agentic Coding de este Mac en una réplica en vivo de una remota. Obtienes una ventana completa que renderiza el remoto usando exactamente las mismas vistas de barra lateral, cuadrícula y terminal que ya conoces — el mismo diseño mostrado a continuación para una instancia local — pero titulada Remoto — <name>, y cada edición que hagas se ejecuta en el remoto y se refleja de vuelta.

El explorador de espacios de trabajo de Bromure Agentic Coding: una barra lateral WORKSPACES con secciones Grid y AUTOMATIONS, y un panel de detalle que muestra tarjetas de CPU, Memoria, vCPU, Disco y Tiempo activo sobre un resumen de CONFIGURATION. Una ventana de réplica del cliente enriquecido renderiza una instancia remota usando este mismo diseño.

Conexión

Abre Espacios de trabajo → Conectar a un Bromure remoto… (⇧⌘K). La ventana resume la elección: «Replica otro Mac que ejecuta Bromure — su cuadrícula, espacios de trabajo, pestañas y automatizaciones. Inicia sesión para alcanzar tus servidores desde cualquier lugar, o añade uno directamente por dirección en tu LAN.» Ambas rutas llegan a la misma ventana de réplica; solo difieren en cómo los dos Mac se encuentran y se autorizan.

Por dirección (misma red)

Usa esto en una LAN donde conoces la dirección del Mac y no necesitas una cuenta de bromure.io.

  1. En el Mac remoto, habilita el acceso remoto (la ventana Acceso remoto o bromure-cli remote enable).
  2. En este Mac, haz clic en +, introduce un Nombre (por ejemplo, rack mini), una Dirección, un Puerto (predeterminado 2222) y un Usuario remoto, luego haz clic en Conectar. Las filas guardadas muestran user@address:port y la hora de la última conexión.
  3. En el primer contacto, una hoja muestra la huella de la clave de anfitrión SSH del remoto. Verifícala contra la ventana Acceso remoto del remoto, luego haz clic en Confiar y continuar. La fijación se recuerda para este extremo; las conexiones posteriores son silenciosas a menos que la clave cambie, en cuyo caso el botón se pone rojo e indica Confiar en la nueva clave y continuar — un posible intermediario.
  4. El cliente intenta la autenticación por clave pública con la clave dedicada de este Mac. Si este Mac aún no está autorizado, recurre a la contraseña de inicio de sesión de macOS del usuario remoto (botón: Iniciar sesión); un inicio de sesión con contraseña exitoso inscribe la clave de este Mac en el remoto a través del túnel, de modo que cada conexión posterior es sin contraseña. Para preautorizar sin escribir nunca una contraseña, haz clic en Mostrar la clave de este Mac y ejecuta bromure-cli remote key add '<this Mac's key>' en el remoto.

Tras la primera conexión, haz doble clic en un servidor guardado para reconexiones con un solo clic; el menú contextual de cada fila ofrece Conectar, Editar… y Eliminar.

A través de una cuenta de bromure.io (desde cualquier lugar)

Iniciar sesión en bromure.io permite a un cliente alcanzar tus servidores a través de redes — de un wifi de cafetería a un Mac en casa — sin reenvío de puertos, sin VPN y sin ninguna dirección que recordar. bromure.io solo presenta los dos Mac y retransmite bytes cuando una ruta directa es imposible; la propia sesión SSH permanece cifrada de extremo a extremo entre los dos Mac.

  1. Inicia sesión. Elige Ventana → Inscribirse en bromure.io… e introduce el código de inscripción que te da tu cuenta de bromure.io (una frase de seis palabras acuñada por tu administrador, o por la consola web para una cuenta personal) más un Nombre de dispositivo. Cada dispositivo que inscribes comparte la misma cuenta.
  2. En el Mac remoto, habilita el Acceso remoto. Un servidor aparece en el directorio solo mientras su puerta de entrada está activa y está enviando latidos a bromure.io.
  3. En este Mac, abre Conectar a un Bromure remoto…. Tus servidores se listan bajo Mis servidores · bromure.io con un punto de en línea en vivo y la hora de última aparición. Haz doble clic en uno (o selecciónalo y haz clic en Conectar). El estado indica «Conectando a <name> mediante bromure.io…» mientras se establece una ruta de par a par — directa, mapeada por puerto del router o retransmitida — y luego se abre la ventana de réplica.

En esta ruta no hay ninguna dirección que escribir, ninguna hoja de clave de anfitrión ni ninguna contraseña: tus propios dispositivos confían entre sí a través de tu cuenta (abajo), y la clave de anfitrión se fija automáticamente.

Sin contraseña entre tus propios dispositivos

Una vez que has iniciado sesión, cada dispositivo que inscribes comparte su identidad SSH a través de tu cuenta, de modo que cualquiera de tus dispositivos alcanza cualquiera de tus servidores sin contraseña y sin bromure-cli remote key add manual:

  • Cada dispositivo publica su clave pública SSH en bromure.io al arrancar. Cada uno de tus servidores (Acceso remoto activo) obtiene las claves de tus dispositivos y las instala en su authorized_keys en segundos — a través del mismo canal de dispositivo, de modo que un dispositivo que acabas de inscribir queda autorizado casi de inmediato, sin ninguna clave copiada a mano.
  • Un servidor también publica el inicio de sesión de macOS con el que se ejecuta, de modo que el cliente lo marca automáticamente como el usuario correcto (el mismo campo que la ruta por dirección te pide rellenar).
  • Las claves están limitadas a tus propios dispositivos — nunca a los de otro usuario, ni siquiera dentro de la misma organización.
  • Cerrar sesión en un dispositivo lo retira: su clave se elimina de tus servidores y desaparece del directorio, de modo que volver a iniciar sesión nunca deja un duplicado obsoleto. Un dispositivo sin usar durante 90 días también deja de estar autorizado hasta que vuelve a dar señales. Y desde la consola web de bromure.io puedes cerrar la sesión de cualquiera de tus dispositivos a demanda.

Nota: El cliente enriquecido genera su propio par de claves ed25519 dedicado (comentario bromure-ac-fatclient) la primera vez que lo usas, almacenado en el directorio del cliente remoto — esta es la clave publicada en tu cuenta. Para una conexión por dirección, la fijación de la clave de anfitrión pertenece al extremo (address:port), no al usuario, así que editar la dirección o el puerto de un servidor guardado descarta la fijación y vuelve a activar la hoja de huella; una conexión bromure.io fija en cambio la clave del par a través de la cuenta. Tanto la app de macOS como la app de iOS / iPadOS («Bromure Client») usan este modelo de cuenta — la app móvil es una réplica solo de cliente, alcanzada exactamente de la misma manera (iniciar sesión, elegir un servidor, conectar). La ruta por dirección es exclusiva de macOS.

La ventana de réplica

La ventana de réplica se abre automáticamente tras una conexión exitosa. Haz clic en una fila de espacio de trabajo para montar su terminal en vivo (si está en ejecución) o su panel de control de la VM con Iniciar / Reanudar (si está apagado o suspendido); el escenario sigue en vivo las transiciones de estado. Los clics en las pestañas cambian de forma optimista y se confirman con el siguiente sondeo de estado.

Su barra de herramientas en la barra de título replica la píldora local por VM, de izquierda a derecha: el interruptor de túnel de red (solo ventanas remotas), la píldora de IP, el rayo de Fusion, Explorar archivos (carpeta), Reiniciar la VM, Editar espacio de trabajo (rueda dentada), Extraer a su propia ventana, Mostrar u ocultar el navegador agéntico (⌃⌘B) (globo) y Mostrar u ocultar los archivos del repositorio (⌃⌘E). El panel de control de Docker se abre desde la barra lateral, exactamente como lo hace localmente.

Algunas funciones se comportan de forma especial sobre la réplica:

  • Editar espacio de trabajo abre el mismo editor de perfiles que en local, pero respaldado por una lectura con los secretos en blanco y un guardado que preserva los secretos (consulta Los secretos permanecen en el anfitrión). Generar nueva clave SSH funciona y te muestra la nueva clave pública.
  • Explorar archivos abre una ventana por VM al estilo del Finder titulada Archivos — <workspace> (<host>) sobre el sistema de archivos del invitado — Inicio más hasta ocho carpetas compartidas — con transferencia de arrastrar hacia dentro y hacia fuera a través del túnel.
  • Reiniciar la VM pregunta Suave frente a Forzado localmente, luego envía el verbo.
  • Extraer abre una ventana de terminal en vivo adicional que se cierra automáticamente si el espacio de trabajo se detiene.

Bajo el capó, la réplica sondea la instantánea /state del remoto cada 0.75 segundos a través de un puente de socket de control tunelizado por SSH, y la renderiza mediante las mismas vistas que una ventana local. Las llamadas de control cortas se multiplexan sobre una conexión SSH ControlMaster por anfitrión; los adjuntos de terminal interactivos usan deliberadamente sus propias conexiones SSH dedicadas, porque un canal multiplexado almacena en búfer la salida espontánea (repintados de tmux) que un terminal necesita de inmediato. A través de una conexión bromure.io, el mismo puente y los mismos flujos de terminal viajan por la ruta SSH de par a par (alcanzada a través de un shim de bucle local), y la réplica se comporta de forma idéntica.

Qué se replica y qué funciona de forma remota

La réplica es exhaustiva. Renderiza cada espacio de trabajo con su estado de ejecución en vivo, todas las pestañas y worktrees (totalmente anidados), el diseño de la cuadrícula, las automatizaciones, los paneles de control de la VM para espacios de trabajo apagados y suspendidos, el panel de control de Docker, las constantes vitales (CPU, memoria, carga, disco, tiempo activo, IP, puertos) y los terminales interactivos en vivo. Las ediciones son bidireccionales y convergen en cada cliente conectado en el siguiente sondeo: iniciar/detener/suspender/reiniciar, operaciones de pestañas, ediciones de la cuadrícula (diseño completo, gana el último en escribir), ediciones de automatización, el interruptor de Fusion, acciones de Docker, guardados de configuración y transferencias de archivos.

Algunas operaciones no están disponibles desde el cliente enriquecido en esta versión:

  • Las operaciones de worktree impulsadas por prompts — crear un nuevo worktree, fusionar, resolver un conflicto o sembrar una automatización — no están remotizadas en la v1. Hazlas en la propia GUI del anfitrión o a través del menú remoto (que admite crear, fusionar y resolver). La réplica sigue mostrando cada worktree, y eliminar y adjuntar terminal funcionan de forma remota.
  • Las ediciones del diseño de la cuadrícula necesitan una ventana de GUI abierta en el remoto. Un remoto totalmente sin pantalla (app en ejecución, sin ventana unificada) replica todo lo demás pero no puede aceptar un cambio de diseño.
  • Las funciones exclusivas del lado del anfitrión — importar una clave SSH desde un archivo y el registro de suscripción — están ocultas en el editor de configuración remota.

Prompts de decisión pendientes

Algunas acciones que inicias de forma remota plantean una decisión en el remoto — una actualización del almacenamiento de inicio, un restablecimiento por desvío de la imagen base o un borrado de una VM comprometida. Estas emergen en la instantánea /state como prompts pendientes y aparecen como alertas locales en tu ventana de réplica; tu respuesta viaja de vuelta a través del túnel. Si un prompt queda sin respuesta, expira hacia la opción segura y no destructiva. Los prompts de consentimiento MITM que puede activar un agente en ejecución (uso de credenciales, paso a través de la cadena de suministro, escrituras de salvaguardas, inyección de prompts) se gestionan mediante una ruta separada e infalsificable por el invitado, documentada en Gestión del consentimiento remoto.

Los secretos permanecen en el anfitrión

Los secretos nunca cruzan el enlace. Cuando el cliente enriquecido lee un perfil remoto para poblar el editor, cada campo secreto llega en blanco. Al guardar, un campo en blanco significa "conservar el valor almacenado" y uno escrito lo reemplaza. Las claves de API, los tokens y los secretos de entorno de MCP permanecen en el Mac remoto. El cliente enriquecido se autentica únicamente por clave SSH una vez emparejado — no hay solicitudes de contraseña durante la réplica.

Acceso a servicios en las VM del remoto

El servidor de desarrollo de un espacio de trabajo remoto reside en una dirección privada como http://192.168.64.5:3000 en la red del remoto. Bromure te ofrece dos niveles de acceso a él — uno automático y con alcance de navegador, y otro opcional y de todo el sistema.

El panel del navegador (automático, con alcance PAC)

El panel del navegador colapsable del lado derecho de la ventana de réplica (el botón de globo de la barra de herramientas, o ⌃⌘B) es una VM local de Chromium cuyo tráfico de página hacia la subred del espacio de trabajo remoto se tuneliza sobre SSH. Un script PAC (autoconfiguración de proxy) generado enruta únicamente la subred remota a través de un reenviador SOCKS por anfitrión y todo lo demás DIRECT, y los destinos se resuelven en el lado remoto — de modo que navegar al literal http://192.168.64.x:port de un servidor de desarrollo remoto simplemente funciona. El propio flujo MCP de control del navegador del agente remoto se retransmite a este panel, de modo que el agente de codificación remoto maneja el navegador que estás viendo.

Selecciona un espacio de trabajo remoto en ejecución y pulsa ⌃⌘B. El panel no hace nada hasta que la primera instantánea /state haya entregado la subred del remoto y el reenviador SOCKS esté activo (una línea de registro indica "tunnel not ready" hasta entonces). Su VM de navegador local está fijada a la subred 192.168.127.0/24 (puerta de enlace 192.168.127.1) para que nunca pueda colisionar con una subred de espacio de trabajo. Los perfiles de navegador persistentes residen en este Mac, indexados por el ID del espacio de trabajo remoto.

Nota: El panel del navegador requiere que este Mac sea Apple Silicon con la imagen base del navegador instalada localmente. El reenviador SOCKS se vincula a 0.0.0.0 (para que la VM del navegador pueda alcanzarlo en la puerta de enlace vmnet) pero solo acepta conexiones desde loopback y la subred de navegador fijada 192.168.127.x — nunca es un relé abierto.

Reenvío SOCKS y reenvíos de puerto fijos

Cada anfitrión remoto conectado obtiene automáticamente un reenviador SOCKS5 local en un puerto efímero vinculado a 0.0.0.0 (filtrado por par a loopback y la subred de navegador 192.168.127.x). Cada CONNECT abre un canal SSH forward <ip> <port> que el remoto puentea — a través del relé de loopback siempre activo del invitado en vsock 5010 — hacia el propio 127.0.0.1:<port> de ese invitado. Así que desde este Mac, curl --socks5 127.0.0.1:<port> http://192.168.64.5:3000 alcanza al invitado remoto byte por byte.

Para los reenvíos fijos hay fontanería de CLI oculta: bromure-cli __forward <hostID> <localPort> <remoteIP> <remotePort> para un reenvío al estilo ssh -L, y bromure-cli __forward-socks <hostID> <localPort> para un proxy SOCKS independiente. Ambos se vinculan a loopback de forma predeterminada y aceptan --bind-all.

Advertencia: El remoto rechaza cualquier reenvío cuyo destino no sea un invitado en su propia subred vmnet. No puedes usar un reenvío para alcanzar el propio Mac remoto, su puerta de enlace o internet — solo las VM del espacio de trabajo.

El túnel de red de todo el sistema

Cuando quieras que cualquier app local — no solo el panel del navegador — alcance las VM remotas en sus direcciones literales, habilita el túnel por anfitrión con el interruptor de red de la barra de herramientas de la réplica (el icono de camino triangular, el primero de la barra de herramientas). Su información sobre herramientas indica Habilitar acceso directo a la red de las VM del remoto (192.168.x.x desde cualquier app local).

Un ayudante privilegiado de un solo uso — un demonio launchd instalado mediante SMAppService, sin sudo — crea una interfaz utun y enruta la subred remota hacia ella, luego devuelve el descriptor de archivo de la interfaz a la app. Una pila TCP/UDP de espacio de usuario en la app termina cada flujo y lo empalma sobre los mismos canales de reenvío SSH, usando tu identidad SSH. No hay reglas pf ni reenvío del kernel.

La primera vez que lo habilitas, una alerta titulada Permitir el ayudante de red de Bromure explica la aprobación única de macOS:

  1. Haz clic en el interruptor de la barra de herramientas.
  2. En la alerta, abre Configuración del Sistema → General → Elementos de inicio de sesión y permite Bromure Agentic Coding (macOS solicita credenciales de administrador una vez).
  3. La app sondea la aprobación (cada 2 segundos, hasta 5 minutos) y se conecta automáticamente en cuanto llega. Mientras espera, la información sobre herramientas del interruptor indica Esperando aprobación en Configuración del Sistema › Elementos de inicio de sesión….

Cuando el túnel está activo la información sobre herramientas indica El acceso directo a la red de las VM del remoto está ACTIVADO — haz clic para desactivar; si falla, Falló el túnel de red — haz clic para reintentar. Desactivarlo detiene el túnel, y cuando el último anfitrión lo deshabilita el demonio se da de baja. El ajuste se recuerda por anfitrión.

Nota: El túnel necesita una cuenta de administrador para la aprobación única. Sin ella, Bromure sigue funcionando a través de la ruta SOCKS integrada — el ayudante solo es necesario para alcanzar las VM remotas desde otras apps. Si macOS rechaza el registro de plano, una alerta titulada No se pudo instalar el ayudante de red lo explica, y el interruptor reintenta en el siguiente clic. Un ping a un invitado remoto lo responde localmente el túnel: confirma que el enrutamiento está activo, no que el invitado esté vivo.

Varios remotos (subredes por instalación + enrutamiento de flota)

Puedes replicar varios remotos a la vez; cada uno abre su propia ventana, reenviador SOCKS y (opcionalmente) túnel. La trampa en la que esto solía caer: cada instalación usaba históricamente la misma red 192.168.64.0/24 para sus VM de espacio de trabajo, así que dos remotos replicados anunciaban subredes idénticas y la VPN de todo el sistema no podía distinguirlos.

Las subredes por instalación solucionan esto de raíz. Cada Mac elige ahora una /24 aleatoria dentro de 172.16.0.0/12 — omitiendo el rango 172.17172.20 de Docker y cualquier /24 en la que el anfitrión ya esté — y la usa para todas sus VM de espacio de trabajo, de modo que dos instalaciones independientes casi nunca colisionan (172.16/12 es también el rango privado con menos probabilidad de chocar con una LAN o VPN corporativa). En el primer lanzamiento tras la actualización, Bromure ofrece migrar este Mac a una subred privada — Migrar ahora, Más tarde o No volver a preguntar — y puedes cambiarla o volver a aleatorizarla en cualquier momento en Configuración → Recursos → Subred del espacio de trabajo. El direccionamiento del invitado es DHCP puro desde el propio conmutador de Bromure, así que esto es enteramente del lado del anfitrión (sin reconstrucción de imagen), y el remoto anuncia su subred elegida en /state para que el cliente enriquecido y el túnel la sigan automáticamente.

Para el caso raro en el que dos remotos aún comparten una subred, el primero se enruta literalmente y al segundo se le asigna un alias 100.64.<n>.0/24 del espacio CGNAT, con un remapeo 1:1 que preserva el octeto del anfitrión para que ambos puedan alcanzarse a la vez.

Advertencia: El enrutamiento de alias multi-anfitrión está implementado y probado con pruebas unitarias, pero el cableado en tiempo de ejecución que cose un PAC compatible con alias y un remapeo de browser-MCP entre anfitriones aún está pendiente. Un único anfitrión remoto es la configuración totalmente compatible hoy. Una limitación conocida del uso de alias, una vez cableado, es que una página de desarrollo que emita un enlace literal absoluto http://192.168.64.x dentro de un remoto con alias puede enrutarse mal; los remotos literales (sin alias) no se ven afectados.

Exponer un servidor de desarrollo a internet

Al margen de todo lo anterior, un servicio HTTP individual que se ejecute dentro de un espacio de trabajo puede exponerse a internet público con un túnel rápido de Cloudflare por puerto. Abre el panel de control de un espacio de trabajo en ejecución, encuentra el servicio bajo la tarjeta de puertos y haz clic en el globo (información sobre herramientas: Exponer a internet (túnel rápido de Cloudflare)). Bromure ejecuta un proceso cloudflared para ese origen y te da una URL aleatoria https://<name>.trycloudflare.com — sin necesidad de una cuenta de Cloudflare. Un túnel y una URL por servicio; exponer o dejar de exponer uno nunca perturba a los demás.

El color del globo sigue el estado: gris = apagado, naranja = instalando o iniciando, verde = en ejecución, rojo = fallido. Una línea de estado bajo el puerto muestra el progreso (Descargando y verificando cloudflared (~18 MB, una sola vez)…, luego Iniciando túnel…) o el nombre de anfitrión público en el que se puede hacer clic con un botón de copia.

La primera vez que expones algo, un diálogo de consentimiento único titulado ¿Exponer servicios a internet mediante Cloudflare Tunnel? cubre la descarga, la verificación, los Términos de Servicio de Cloudflare y el hecho de que cualquiera con la URL aleatoria puede alcanzar el servicio. Haz clic en el globo de nuevo para detener.

El binario cloudflared es una versión fijada, verificada dos veces antes de ejecutarse: el SHA-256 del archivo descargado se comprueba contra un hash incorporado en la app, y una comprobación de firma de código con Developer ID confirma el ID de equipo de Cloudflare. Cada paso se registra en el Registro de la cadena de suministro (consulta Protección de la cadena de suministro). Se ejecuta con --no-autoupdate.

Advertencia: Las URL de túnel rápido son públicas para cualquiera que las tenga, y el nombre de anfitrión rota cada vez que el túnel se reinicia (un reinicio, un dejar de exponer/volver a exponer o un fallo). Solo los orígenes HTTP(S) obtienen un globo — SSH y los puertos conocidos de TCP en bruto o de base de datos (22, 1433, 3306, 3389, 5432, 5672, 5900, 6379, 9092, 11211, 27017) y UDP nunca lo obtienen, porque un navegador no podría alcanzarlos a través del borde de Cloudflare. Todos los túneles de un espacio de trabajo se desmontan cuando su VM se suspende o se apaga. Un desajuste de hash en la descarga rechaza la instalación hasta que la fijación se actualice en una versión de la app.

Reenvío de callbacks de OAuth

Una CLI que se ejecuta dentro de una VM de espacio de trabajo — gh, gcloud, un inicio de sesión de suscripción — a menudo completa un flujo de OAuth abriendo un navegador en tu Mac anfitrión y esperando una redirección a http://127.0.0.1:<port>/callback. Bromure puentea eso automáticamente: el anfitrión vincula el puerto de loopback tanto en IPv4 como en IPv6, y en la primera solicitud real lo empalma sobre vsock 5010 hacia el propio 127.0.0.1:<port> del invitado. El redirect_uri nunca se reescribe, así que PKCE y la validación de redirección siguen pasando. No hay nada que configurar — inicia el login dentro del espacio de trabajo y la redirección se entrega en el invitado.

El reenviador se desmonta a sí mismo tras 300 segundos para que el puerto de loopback nunca se retenga indefinidamente. Si el puerto del anfitrión ya está en uso, el flujo continúa de forma nativa sin el puente, y las preconexiones especulativas del navegador (sockets que se abren pero nunca envían) se ignoran para que no puedan atascar un servidor de callback de un solo disparo.

Modelo de seguridad

El acceso remoto es potente, así que vale la pena ser preciso sobre sus límites.

  • Desactivado de forma predeterminada, una sola puerta. No existe ninguna ruta remota hasta que habilitas el servidor SSH. Cada ruta — menú humano, CLI, cliente enriquecido, reenvíos de puerto, browser MCP — transita por ese único servidor y ningún otro.
  • Cifrado y transporte. Todo el tráfico es SSH. El sondeo de control del cliente enriquecido, los adjuntos de terminal, las transferencias de archivos, los reenvíos de puerto y el relé de browser-MCP viajan todos dentro de la conexión SSH. Como swift-nio-ssh no tiene intercambio de claves poscuántico, un cliente OpenSSH moderno imprimirá una advertencia "not using a post-quantum key exchange"; esto es esperado y no indica un ataque de degradación.
  • bromure.io es un intermediario, no un hombre en el medio. En la ruta de cuenta, bromure.io solo presenta tus dos dispositivos y — cuando no se puede construir ninguna ruta de par a par directa — retransmite bytes opacos a través de un relé TURN (sobre TLS). Nunca termina la sesión SSH: el túnel cifrado se ejecuta de extremo a extremo entre tus dos Mac. Las claves SSH se comparten únicamente entre los dispositivos de tu propia cuenta (nunca los de otro usuario), cada servidor obtiene por sí mismo las claves de dispositivo de su propietario, e inscribirse / cerrar sesión es como se concede y se retira la confianza de un dispositivo. Un dispositivo con la sesión cerrada o inactivo durante 90 días deja de estar autorizado.
  • Quién puede iniciar sesión. Solo el usuario exacto de macOS que lanzó la app. La autenticación por contraseña se verifica contra OpenDirectory (sin Inicio de sesión remoto, sin cambios en PAM, sin derechos de administrador), y la autenticación por clave pública solo acepta claves que hayas inscrito. Los intentos de contraseña se limitan por IP de origen; las claves no.
  • Qué puede hacer una sesión. Un inicio de sesión humano solo puede alcanzar el menú remoto — nunca una shell — así que puede crear, configurar y manejar espacios de trabajo, pero no puede ejecutar comandos arbitrarios del anfitrión. Los cuatro verbos de máquina del cliente enriquecido son igualmente limitados: un puente de socket de control, un reenvío a un invitado en la subred vmnet y un relé de browser-MCP. Los reenvíos al propio anfitrión, a la puerta de enlace o a internet se rechazan.
  • Los secretos nunca abandonan el anfitrión. Las lecturas de perfiles remotos tienen los secretos en blanco y los guardados preservan los secretos; las claves de API, los tokens y los secretos de entorno de MCP permanecen en el Mac remoto.
  • Confianza en el primer uso. El cliente enriquecido fija la clave de anfitrión del remoto por extremo en el primer contacto y advierte de forma ruidosa ante cualquier cambio posterior.
  • Consentimiento infalsificable por el invitado. Los prompts de consentimiento MITM planteados por un agente en ejecución se renderizan en el lado del anfitrión de la bomba del terminal, donde un invitado comprometido no puede ni verlos ni falsificarlos; cualquier tiempo de espera o desacople se resuelve como denegación. Consulta Gestión del consentimiento remoto.

Solución de problemas

SíntomaCausa probableQué hacer
Habilitar devuelve un errorLa imagen base falta o todavía se está instalandoEl servidor no puede iniciarse hasta que la imagen base esté presente. Termina la instalación, luego vuelve a habilitar.
ssh conecta pero dice que reconectes con ssh -tNo se solicitó ningún TTYEl menú remoto necesita un terminal; añade -t (o usa ssh -t -p 2222 <user>@<mac>).
OpenSSH imprime "not using a post-quantum key exchange"swift-nio-ssh no tiene intercambio de claves PQEsperado e inofensivo — la conexión sigue cifrada.
Una conexión por dirección sigue pidiendo una contraseñaLa clave de este Mac no está inscrita en el remotoDeja que un inicio de sesión con contraseña la inscriba automáticamente, o ejecuta bromure-cli remote key add '<this Mac's key>' en el remoto (Mostrar la clave de este Mac la copia).
Una conexión bromure.io sigue pidiendo una contraseñaEl registro de claves aún no ha autorizado este dispositivo en ese servidorAquí lo sin contraseña es automático — comprueba que tienes sesión iniciada en bromure.io en ambos Mac, que el servidor tiene el Acceso remoto activo y que ambos ejecutan una compilación actual (el servidor publica su inicio de sesión y obtiene tus claves). Da unos segundos tras habilitar el Acceso remoto.
Mis servidores · bromure.io está vacíoSin sesión iniciada, o el servidor no se anunciaInicia sesión (Ventana → Inscribirse en bromure.io…); en el remoto, habilita el Acceso remoto para que envíe latidos y aparezca. Una fila atenuada significa que dejó de enviar latidos.
«No se pudo establecer una conexión … mediante bromure.io»No hay ninguna ruta de red directa ni retransmitida entre los dos MacConfirma que ambos pueden alcanzar bromure.io; el relé necesita que turns:5349 sea alcanzable. Vuelve a intentarlo — se reintenta una ruta en el siguiente intento.
«Se alcanzó … por bromure.io, pero su puerta de entrada SSH no respondió»El Acceso remoto se desactivó en el remotoVuelve a habilitar el Acceso remoto en el Mac remoto.
«El dispositivo bromure.io de este Mac fue revocado. Inicia sesión de nuevo.»Este dispositivo fue cerrado / revocado (por ti, la consola web o inactividad de 90 días)Vuelve a inscribirte: Ventana → Inscribirse en bromure.io….
Hoja roja Confiar en la nueva clave y continuarLa clave de anfitrión del remoto cambió desde que se fijóVerifica fuera de banda; continúa solo si sabes por qué cambió la clave (reinstalación, nuevo Mac) — de lo contrario podría ser un intermediario.
Las conexiones en vivo se cortan tras editar clavesAñadir o eliminar una clave autorizada reinicia el proceso de escuchaEsperado; reconecta.
El panel del navegador queda en blancoEl reenviador SOCKS o la subred aún no están listosEspera al primer sondeo /state; asegúrate de que el espacio de trabajo esté en ejecución y que este Mac tenga la imagen del navegador instalada.
Un reenvío se rechazaEl destino no es un invitado en la subred vmnet del remotoLos reenvíos solo pueden alcanzar VM de espacio de trabajo, nunca el anfitrión, la puerta de enlace o internet.
El interruptor del túnel se queda atascado en Esperando aprobación…El ayudante privilegiado aún no está aprobadoAprueba Bromure Agentic Coding en Configuración del Sistema → General → Elementos de inicio de sesión (necesita administrador). Sin ello, SOCKS sigue funcionando.
Las ediciones del diseño de la cuadrícula no se aplican en el remotoEl remoto está sin pantallaLas ediciones de la cuadrícula necesitan una ventana de GUI abierta en el remoto; todo lo demás se sigue replicando.

Archivos, puertos y variables de entorno

El estado del lado del servidor reside en ~/Library/Application Support/BromureAC/remote/: hostkey_ed25519 (0600) y su .pub, authorized_keys (0600) y la anulación opcional overlay-key. La identidad y el estado del cliente enriquecido residen en ~/Library/Application Support/BromureAC/remote-client/: id_ed25519(.pub) (comentario bromure-ac-fatclient), known_hosts (fijaciones TOFU), hosts.json (servidores guardados) y la persistencia de réplica por anfitrión en hosts/<host-UUID>/. Todo el directorio de soporte se reubica bajo CFFIXED_USER_HOME.

Puerto / interfazFunción
TCP 2222 (configurable, ≥ 1024)El servidor SSH integrado, vinculación 0.0.0.0 de forma predeterminada.
TCP 443 saliente + turns:5349Solo ruta de cuenta de bromure.io. Alcanzar tu cuenta (directorio de dispositivos, rendezvous) y, cuando no se puede construir ninguna ruta de par a par directa, el relé TURN sobre TLS. Ambos deben ser alcanzables desde cada dispositivo para la ruta de cuenta; sin relación con la ruta por dirección.
vsock 5010 del invitadoRelé de loopback siempre activo en cada VM — la ruta para los reenvíos de puerto y la entrega de callbacks de OAuth.
vsock 5830 del invitadoEl flujo browser-MCP del agente del espacio de trabajo, retransmitido al panel del navegador del cliente enriquecido.
Puerto efímero, vinculado a 0.0.0.0Reenviador SOCKS5 por anfitrión (filtrado por par a loopback y la subred de navegador 192.168.127.x).
192.168.127.0/24La subred de VM de navegador local fijada del cliente enriquecido.
100.64.<n>.0/24Subredes de alias CGNAT asignadas en una colisión de subred de flota.

Las claves relevantes de UserDefaults (dominio io.bromure.agentic-coding) son remoteAccess.enabled, remoteAccess.port, remoteAccess.bindAddress, remoteAccess.passwordAuth, remoteAccess.pubkeyAuth, fatclient.tunnel.<host-UUID> y cloudflareTunnel.consented. Las variables de entorno de diagnóstico incluyen BROMURE_OVERLAY_KEY (atajo del menú remoto), BROMURE_FATCLIENT_LOG (registro detallado del cliente enriquecido) y BROMURE_FATCLIENT_UTUN (forzar la habilitación del túnel de todo el sistema — el interruptor de la barra de herramientas es la ruta del producto). La referencia completa de la CLI, incluida la fontanería oculta __forward, __forward-socks, __dial y __attach-window, está en Automatización y la CLI.