Todas las páginas
En esta página

Qué expone OAR y qué no

Esta página reúne en un solo sitio lo que OAR expone y lo que no. Cada dato tiene su sitio en otra página; cada sección termina con un enlace a ella. La versión corta: un relay actúa como tú, el token de acceso da el control total sobre él, y algunos enlaces que creas son públicos a propósito.

El modelo de confianza #

Un relay se ejecuta con un usuario del sistema operativo, y sus agentes se ejecutan con ese usuario y con sus permisos. Cualquier cosa que puedas hacer en la máquina se le puede pedir a un agente. Nada confina la shell de un agente. Un agente puede leer el archivo de configuración (y con él el token de acceso), la base de datos (con las claves de los proveedores y los tokens de los relays emparejados) y los archivos de inicio de sesión de los proveedores. El token de acceso da el control total del relay y, por tanto, de lo que pueden hacer sus agentes: quien lo tenga puede hacer que un agente ejecute comandos en el host. OAR les da alcance a esos agentes. No añade ningún sandbox.

La única excepción es Claude Cloud, cuyo agente trabaja sobre un clon de un repositorio de GitHub en un sandbox de Anthropic, no en tu máquina (consulta Qué sale de tu máquina).

Qué puede tocar un agente #

La carpeta de trabajo es donde trabaja un agente. No es un muro. Esto es lo que OAR impone y lo que no:

OAR impone OAR no impone
workspaceRootAllowList limita en qué carpetas se puede iniciar una conversación y a cuáles se puede mover con Change CWD (Cambiar la carpeta de trabajo). Sin fijar, se permite cualquier carpeta existente. Nada confina la shell de un agente a la carpeta de trabajo. Puede leer y escribir donde pueda el usuario del relay.
Los modos del relay le dicen al agente con cuánta libertad actuar. Algunos proveedores imponen parte de ello: el motor SDK de GitHub Copilot y OpenAI rechaza todo lo que no sea de solo lectura en plan y te pregunta antes en ask. Claude y Nuevo en 0.9.17 DeepSeek ejecutan todas las herramientas sin preguntarte, en todos los modos. Todas las solicitudes de permiso de Grok se aprueban. En el motor de extensión, OAR no comprueba ningún permiso. Allí un modo es una instrucción que el agente sigue.
Una vista previa estática solo puede servir una carpeta dentro de la carpeta de trabajo. La lista de permitidas no comprueba la carpeta Default (Predeterminado), y no limita lo que puedes explorar.

Detalles: Limitar dónde pueden empezar los chats, Modos del relay y Los agentes y el token.

Accesible sin iniciar sesión #

Todo lo que lee o cambia tus conversaciones, archivos, ajustes o agentes necesita el token de acceso. Estas son las excepciones:

Qué Qué expone Cómo desactivarlo
La página de inicio de sesión y la app estática La app web y su cuadro de inicio de sesión. No contiene ninguno de tus datos. No se puede desactivar. Mantén el relay fuera de internet (localhostOnly) o pon reglas de acceso delante.
Un enlace compartido (/shared/…) La transcripción de la conversación, de solo lectura, con el modelo de cada mensaje. Las rutas del host del relay se filtran (solo nombres de archivo, de forma predeterminada), y los mensajes que ocultaste no se envían. Cada apertura se registra. Stop sharing (Dejar de compartir) o Renew link (Renovar el enlace) en Settings → Sharing (Ajustes → Compartir), o elimina la conversación. La dirección antigua responde entonces con un simple 404. Un enlace nunca caduca.
Un enlace de vista previa El servidor de desarrollo o la carpeta de la vista previa. El token aleatorio del enlace es su única protección. Pulsa Close (Cerrar) en la vista previa, o /preview close. La lane está desactivada hasta que la configuras. Una vista previa sobrevive a un reinicio del relay y termina cuando la cierras o eliminas su conversación.

Una aplicación de Cloudflare Access delante del relay también bloquea a los espectadores de un enlace compartido salvo que se dejen pasar /shared/* y /api/shared/*, lo que hace públicas esas dos rutas a propósito (Cloudflare Access).

Detalles: Tus enlaces compartidos, lo que ve un espectador, Vistas previas y Qué necesita el token.

A qué llega un navegador con sesión iniciada #

Un navegador que tiene el token puede abrir todas las conversaciones del relay, y tiene el explorador de archivos. En Linux y macOS, la raíz de las unidades sirve cualquier archivo que pueda leer el usuario del relay, esté o no dentro de la carpeta de trabajo. Renombrar y eliminar actúan donde ese usuario pueda escribir, y una eliminación no va a una papelera. En Windows el explorador se limita a las unidades que lista el relay. La ruta multimedia que muestra las imágenes de un agente funciona igual: sirve cualquier ruta absoluta que pueda leer el usuario del relay, pero solo a una solicitud que lleve el token.

Detalles: El explorador de archivos, Imágenes y multimedia.

Secretos #

Secreto Dónde se guarda
El token de acceso config.json, en texto plano. El relay mantiene el archivo accesible solo para el propietario. Un navegador también lo tiene, como cookie de inicio de sesión.
Un token de túnel de Cloudflare config.json (cloudflaredTunnel.token) o el entorno.
Las claves de API de OpenAI, Cursor, Nuevo en 0.9.17 DeepSeek y Nuevo en 0.9.18 Claude API La base de datos. Nunca se envían a los navegadores. Cada una llega solo a los workers de su propio proveedor; la clave de DeepSeek sale de la máquina solo hacia la URL base de DeepSeek, la clave de Claude API solo hacia https://api.anthropic.com.
El token de un relay emparejado La base de datos. Nunca se envía a los navegadores ni a los agentes.
Tokens de enlaces compartidos, claves push La base de datos.
Los inicios de sesión de Claude, Grok y GitHub Copilot Las carpetas propias de los proveedores en la máquina (~/.claude, ~/.grok, el inicio de sesión de la Copilot CLI). OAR no guarda ninguno. Los chats de DeepSeek no usan ninguno. Nuevo en 0.9.18 Los chats de Claude API comparten la carpeta de Claude, pero se ejecutan con la clave guardada, no con el inicio de sesión.
Un token de inicio de sesión de Claude en el entorno del relay (CLAUDE_CODE_OAUTH_TOKEN) Nuevo en 0.9.17 Se entrega solo a los workers de Claude y Claude Cloud, en todas las plataformas. Antes, otros workers también podían recibirlo.
Una clave o un token de Anthropic en el entorno del relay (ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN) Nuevo en 0.9.17 No se entrega a ningún worker. Antes, todos los workers lo recibían, y un chat de Claude se ejecutaba con él en lugar de con el inicio de sesión de Claude. Nuevo en 0.9.18 También se detiene un chat de Claude con la suscripción que arranca con una clave de API sacada de los propios ajustes de Claude Code; consulta Claude.

Los agentes se ejecutan con el mismo usuario que el relay. Los modos de archivo que dicen «solo el propietario» no dejan fuera a un agente: puede leer config.json, la base de datos y las carpetas de los proveedores. Nada en OAR se los oculta. Los propios workers del relay y las herramientas que usan los agentes para llegar al relay leen el token de acceso de config.json. relay_tool nunca le da a un agente el token de otro relay: la llamada pasa por tu relay, que añade el token. Aun así, un agente podría leer ese token de la base de datos. Una copia de seguridad de la base de datos contiene las claves y los tokens de arriba, así que guárdala con la misma privacidad que la carpeta de estado.

Nuevo en 0.9.17 El agente de un chat de DeepSeek puede leer la clave de DeepSeek de su entorno. El relay sustituye la clave por [redacted] en todo lo que publica un worker de sesión antes de guardarlo o mostrarlo, lo que la mantiene fuera de la transcripción, pero eso no detiene a un agente que quiera la clave. Consulta Dónde se guarda la clave.

Nuevo en 0.9.18 Lo mismo vale para la clave de Claude API en un chat de Claude API. Ese chat comparte la carpeta de Claude donde vive tu inicio de sesión de Claude, así que el relay impone la clave guardada sobre cualquier credencial de sus ajustes y detiene un turn cuyo Claude Code informe de otra fuente para su clave. Claude Code envía su primera solicitud al modelo un momento después de ese informe, así que puede que una solicitud al modelo ya haya salido con la otra credencial antes de la detención: la comprobación limita una credencial incorrecta a esa única solicitud al modelo, no la impide. Consulta Claude API → Seguridad.

Nuevo en 0.9.18 En los chats de DeepSeek y Claude API, que se ejecutan con una clave que tiene el relay, Claude Code arranca con todos los hooks y la línea de estado desactivados, los tuyos y los de la carpeta del chat, para que no puedan ejecutarse con la clave en su entorno. Los hooks de los ajustes gestionados se siguen ejecutando. Los chats con tu inicio de sesión de Claude conservan los suyos.

Nuevo en 0.9.17 Un relay arrancado desde dentro de una sesión de Claude Code (la shell de un agente, por ejemplo) ya no pasa a sus workers las variables de esa sesión, entre ellas su id de sesión y su socket y token de mensajería. Consulta Un relay arrancado desde dentro de Claude Code.

Detalles: Dónde se guardan los secretos, Qué variables llegan a los workers de los agentes.

Entre relays #

El emparejamiento puede entregar un token: si el otro relay necesita un token distinto para devolverle la llamada al tuyo, la presentación lleva el tuyo, y quitar el emparejamiento no lo revoca. El nivel Agents may (Los agentes pueden) y Accept prompts from other relays' agents (Aceptar prompts de agentes de otros relays) limitan lo que hacen los agentes a través de la herramienta, no lo que hace directamente quien tenga un token. Los niveles son Read only (Solo lectura), Read and prompt (Leer y enviar prompts) y Full (Acceso total); los emparejamientos nuevos empiezan en Full. Un relay emparejado está bloqueado en una conversación hasta que lo mencionas. Un prompt que ha cruzado dos relays no se pasa a un tercero, y tras 30 prompts sin un mensaje tuyo, el siguiente te pregunta en una tarjeta.

Detalles: Relays remotos y emparejamiento.

Entre agentes en un mismo relay #

Las sesiones de agente están desactivadas de forma predeterminada. Cuando las activas, un agente debe preguntarte antes de iniciar su primera sesión en una conversación, como máximo 4 de sus sesiones pueden estar trabajando a la vez, y una sesión que inició un agente no puede iniciar sesiones por sí misma. En los modos ask y plan cada acción de escritura pregunta antes.

Responde a las tarjetas de aprobación con sus botones. En las propias tarjetas de aprobación de OAR solo la palabra Allow aprueba, con cualquier combinación de mayúsculas. Cualquier otro texto que escribas deniega, y el agente no recibe ningún motivo a partir de él.

Detalles: Sesiones de agente y Tarjetas de aprobación.

Red #

  • Quién puede conectarse. localhostOnly es true de forma predeterminada y enlaza el relay a 127.0.0.1. Cualquier otro valor enlaza todas las interfaces, y el relay no comprueba de dónde viene una solicitud. El acceso LAN es http sin cifrar, así que el token cruza tu red sin cifrar (Quién puede conectarse).
  • Túneles. Más allá de tu red, usa HTTPS a través de un túnel o un proxy: Túnel SSH, Cloudflare Tunnel, Proxy inverso.
  • Inicio de sesión. Nuevo en 0.9.11 Diez tokens incorrectos desde una misma dirección en un minuto bloquean esa dirección durante el resto del minuto (429), y el rechazo se registra. Las solicitudes de la propia máquina del relay que nada ha reenviado nunca se bloquean. El bloqueo frena los intentos de adivinar; la protección sigue siendo un token largo y aleatorio. La cookie es HttpOnly y dura 30 días (Protecciones).
  • Un token en una dirección. ?token= solo funciona en la dirección de la página; la página inicia sesión con una cabecera y lo quita. Esa primera dirección todavía puede acabar en el historial del navegador y en los registros de un proxy o un túnel (Formas de presentarlo).
  • La conexión en vivo. Nuevo en 0.9.11 Solo acepta un navegador desde el propio origen del relay, así que una página de otro sitio no puede colarse en ella con tu cookie de inicio de sesión. Detrás de un proxy que reescribe la cabecera Host, lista el origen público en allowedOrigins.
  • Cabeceras reenviadas. Nuevo en 0.9.11 X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Proto y X-Real-IP solo cuentan si vienen de un proxy en el que el relay confía mediante trustProxy, de forma predeterminada uno en loopback. La dirección del cliente (bloqueo, límites de frecuencia, el registro de accesos de los enlaces compartidos) y el host y el esquema de los enlaces compartidos nuevos se leen a través de él, así que un cliente directo no puede elegirlos.
  • Reinicio y vaciado de la queue. El reinicio, la cancelación de un reinicio y Empty queue (Vaciar la cola) solo necesitan el token, desde cualquier dispositivo. Si los usuarios remotos no deben usarlos, recházalos en el proxy (Endpoints que solo puede usar la máquina del relay).
  • La protección de rutas del worker de sesión. La ruta que usan los workers de tus agentes, y la ejecución de operaciones de imagen, solo responden a un interlocutor loopback cuya solicitud no lleve ninguna marca de túnel (cf-ray, o una de tunnelMarkerHeaders) ni X-Forwarded-For, Forwarded o X-Real-IP. Un reenviador que no añade ninguna de ellas, como un túnel SSH inverso, parece local; entonces solo el token protege la ruta (protección de rutas).
  • El token del túnel de Cloudflare. Se le pasa a cloudflared en la línea de comandos, así que otros usuarios de la máquina pueden verlo en la lista de procesos (Cloudflare Tunnel).
  • Limpieza del túnel SSH. autoReclaimPort (activado de forma predeterminada) termina el proceso de tu inicio de sesión SSH que ocupa el puerto remoto; reclaimStaleSshSessions termina además tus sesiones SSH inactivas allí (puerto remoto ocupado).

Qué sale de tu máquina #

OAR no tiene telemetría. El relay no envía datos de uso a OAR ni a nadie más. Se pone en contacto con estos hosts, y solo por estos motivos:

  • oar.sh, solo si lo activas. Check for updates automatically (Buscar actualizaciones automáticamente) en Settings → General (Ajustes → General) está desactivado de forma predeterminada. Cuando lo activas, el relay consulta https://oar.sh/latest.json de inmediato, en cada arranque y luego aproximadamente cada 12 horas. La solicitud es un simple GET con Accept: application/json y, una vez que hay respuesta, If-None-Match. No lleva versión, token, cuenta ni información de la máquina. El botón Check for updates (Buscar actualizaciones) y oar update sin --to leen el mismo archivo. OAR_NO_UPDATE_CHECK=1 en el entorno del relay lo detiene todo. Consulta La comprobación de actualizaciones.
  • npm, cuando actualizas. npm install -g habla con el registro de npm.
  • Cada proveedor, en cada turn. Tus mensajes y todo lo que el agente lee para la tarea van al proveedor que hay detrás de la conversación: GitHub Copilot, OpenAI (o la URL base que fijes), Claude, Claude API, Cursor, Grok o DeepSeek (o la URL base que fijes). Se aplican sus condiciones, no las de OAR.
  • DeepSeek. Nuevo en 0.9.17 El relay envía la clave de DeepSeek a https://api.deepseek.com, o a la URL base fijada en Advanced (Avanzado) en Settings → Providers → DeepSeek (Ajustes → Proveedores → DeepSeek) (https, o http solo en la misma máquina), y a ningún otro host: para listar los modelos cuando guardas la clave o la URL base o actualizas la lista en 🤗 Select Models (Seleccionar modelos), y para leer el saldo (ver más abajo). El Claude Code de un chat de DeepSeek envía sus turns a /anthropic bajo esa dirección, con el mismo contexto de sesión que cualquier chat de Claude Code. OAR desactiva el tráfico propio de Claude Code hacia Anthropic (actualizaciones, telemetría). Consulta DeepSeek.
  • Claude API. Nuevo en 0.9.18 El relay envía la clave de Claude API a https://api.anthropic.com y a ningún otro host: para listar los modelos de la clave cuando la guardas, activas Claude API o actualizas la lista. El Claude Code de un chat de Claude API envía allí sus turns con la clave. Consulta Claude API.
  • Claude Cloud. El agente se ejecuta en Anthropic, sobre un clon de tu repositorio. El relay envía el token de inicio de sesión de Claude a https://api.anthropic.com y a ningún otro host. Consulta Claude Cloud.
  • Consumo del plan, cuando abres Check Usage. El relay lee tus cuentas con los inicios de sesión que encuentra en la máquina: GitHub (api.github.com, con GH_TOKEN, GITHUB_TOKEN o el inicio de sesión de gh), Grok (cli-chat-proxy.grok.com, con el inicio de sesión de la Grok CLI), Anthropic (con Claude Cloud activado), Nuevo en 0.9.17 DeepSeek (el saldo, en la URL base de DeepSeek con la clave guardada, mientras DeepSeek está activado) y, solo si introdujiste un token de sesión del panel, cursor.com. Consulta Check Usage (Ver consumo).
  • GitHub Actions. Para la comprobación de suspensión, el relay ejecuta gh run list en los repositorios de tus carpetas de trabajo (Suspensión del host).
  • Relays emparejados. Lo que un agente envía a través de relay_tool va a la dirección de ese relay con su token (Relays remotos).
  • Instaladores de proveedores, cuando confirmas. Install (Instalar) para Claude o Grok ejecuta el script de instalación propio del proveedor (claude.ai, x.ai) como el usuario del relay (Claude, Grok).
  • Notificaciones push. Pasan por el servicio push del fabricante de tu navegador, y el texto es genérico salvo que elijas otra cosa (Qué muestra una notificación).

Tu navegador, no el relay, carga las bibliotecas de Markdown, matemáticas y resaltado desde cdn.jsdelivr.net (Markdown, matemáticas, terminal) y cdnjs.cloudflare.com (resaltado), cada vez que abre la app. La vista de terminal de una sesión de tmux carga su biblioteca de terminal desde unpkg.com cuando falla cdn.jsdelivr.net. Esos hosts ven la solicitud de cada navegador que abre la app. Consulta Imágenes, multimedia y fórmulas.

Registros #

El relay copia su consola en logs/relay-console.log en la carpeta de estado, con una marca de tiempo por línea. Rota a los 5 MB y conserva tres archivos anteriores. Antes de escribir una línea, el relay sustituye tu token de acceso, y cualquier valor tras ?token= o &token=, por [token]. OAR_NO_CONSOLE_LOG=1 desactiva el archivo. Un solo token incorrecto no se registra; una dirección bloqueada sí, con una línea que empieza por [auth]. Una vista previa se identifica con un hash corto, nunca con su token. Una lectura compartida se registra con la dirección del espectador, o con not stored cuando Store viewer IP addresses (Guardar las direcciones IP de los espectadores) está desactivado.

Los registros de los workers (worker-<session>.log) contienen la salida de cada worker de sesión y los escriben los workers, sin pasar por ese enmascaramiento. Los archivos de las conversaciones eliminadas se quedan. Un proxy inverso o un túnel delante del relay guarda sus propios registros, que pueden contener direcciones con ?token=, y el túnel de Cloudflare gestionado muestra su token como <redacted>. Trata todos los registros como privados, y léelos antes de publicarlos en cualquier sitio.

Detalles: Registros.

Antes de exponer un relay #

  1. Mantén el token aleatorio y fuera de las direcciones que compartes. Si se filtró, ejecuta oar setup --new-token, que cierra la sesión en todos los dispositivos y deja fuera a los relays emparejados.
  2. Llega al relay por HTTPS: un túnel o un proxy inverso. Deja localhostOnly activado cuando el proxy o el túnel se ejecute en la misma máquina.
  3. Detrás de un proxy en otra máquina, fija trustProxy a ese proxy, y allowedOrigins si reescribe Host (Un proxy en otra máquina). Un reenviador que no añade ninguna cabecera necesita una cabecera marcadora en tunnelMarkerHeaders. Si los usuarios remotos no deben reiniciar el relay, haz que el proxy rechace esos endpoints.
  4. Ejecuta el relay con un usuario cuyos permisos, archivos e inicios de sesión le darías a los agentes. Fija workspaceRootAllowList si las conversaciones solo deben empezar en ciertas carpetas, y recuerda que no confina una shell.
  5. Comparte una conversación solo después de leerla con Preview as shared (Vista como compartida), y oculta lo que no deba estar ahí. El filtrado de rutas en texto libre se hace lo mejor posible, sin garantías. Detén los enlaces que ya no necesites en Settings → Sharing.
  6. Publica una vista previa solo de algo que puedas enseñar a cualquiera que tenga el enlace, y ciérrala cuando termines. Sobrevive a un reinicio del relay.
  7. Deja las sesiones de agente desactivadas salvo que las necesites. Para los relays emparejados, elige el nivel de Agents may a conciencia y desactiva Accept prompts from other relays' agents donde no lo necesites.
  8. Haz clic en los botones de las tarjetas de aprobación.
  9. Si no quieres ningún contacto con oar.sh, fija OAR_NO_UPDATE_CHECK=1.