Memories / Documentación

En esta página

Daemon remoto (HTTP/WebSocket y RPC por relé)

Memories puede servir el mismo protocolo en tramas service::Request mediante:

  1. IPC local (predeterminado; autenticación del usuario del SO; tramas con prefijo de longitud)
  2. HTTP + WebSocket (escucha opcional; autenticación por token; las mismas tramas JSON binarias que el RPC por relé)
  3. RPC por relé WSS (/v1/rpc/{room}/{slot})

La conexión remota directa y por relé comparten un esquema de transporte: tramas binarias WebSocket que contienen AuthFrame y después Wire de versión 1 (service::Request). La sincronización de bóvedas sigue utilizando /v1/channel. La WebUI sigue mostrando únicamente el estado.

Reglas de seguridad

  • Token de escucha: --listen-token / MEMORIES_LISTEN_TOKEN, o generado y mostrado una sola vez al habilitar el host HTTP/relé. Nunca guarde el token en TOML.
  • El token se borra cuando se bloquea el almacenamiento.
  • Los invocantes remotos utilizan los espacios de nombres estables de elevación ws:remote / relay:remote (separados de cli:{pid}). Desbloquear y usar sudo mediante un transporte remoto eleva ese espacio de nombres, de modo que las conexiones posteriores de una sola operación conservan la elevación durante el periodo de inactividad (las mismas reglas que localmente: 5 minutos de inactividad / 15 minutos como máximo).
  • Los hosts HTTP/relé de escritorio exponen la superficie completa de handle_client tras desbloqueo/sudo (bóvedas, tarjetas, recuerdos, archivos, credenciales, sincronización, autorizaciones MCP, copias de seguridad, enlace de proxies en el host, sesiones remotas, Run, CryptoJob, etc.), sujetos a las mismas comprobaciones de elevación que el IPC local.
  • La escucha HTTP utiliza por defecto el bucle local; fuera de él requiere --allow-non-loopback.
  • HTTP/WS sin TLS no necesita certificados (predeterminado para LAN directa).
  • TLS opcional: --tls-cert / --tls-key (PEM) habilitan HTTPS/WSS en la misma escucha. Una URL de escucha https:// requiere esas opciones.
  • Un relé fuera del ámbito de confianza debe usar wss:// con un ID de sala de 43 caracteres y un token.
  • Quien posea el token de escucha tiene la misma confianza que un cliente local elevado para ese espacio de nombres de transporte. Trate el token como una contraseña; prefiera el bucle local o una ruta de red autenticada.

Riesgos residuales

  • Robo del token ⇒ control remoto completo de un daemon de escritorio desbloqueado/elevado.
  • HTTP fuera del bucle local expone la API en tramas a la red; utilice --tls-cert / --tls-key, un proxy inverso, VPN o cortafuegos al escuchar fuera del bucle local.
  • El RPC por relé (/v1/rpc/{room}/{slot}) está autenticado, pero no cifrado de extremo a extremo: sus tramas JSON de aplicación contienen el token compartido de escucha seguido de solicitudes y respuestas. El operador del relé o el terminador TLS pueden leer el token y el contenido RPC. WSS protege cada conexión al relé, pero no frente al propio relé; utilice uno de confianza para acceder al daemon remoto.
  • La sincronización de bóvedas entre pares (/v1/channel) es independiente y transporta contenido cifrado de extremo a extremo. En ese canal, el operador del relé ve longitudes y tiempos del texto cifrado, no el texto sin cifrar de los activos.
  • Los listeners de proxy del host siguen vinculados al bucle local de la máquina del daemon; los clientes remotos pueden iniciarlos con elevación y después acceder a ellos solo si también pueden acceder al bucle local de ese host (normalmente mediante un túnel independiente).

Host y cliente HTTP/WebSocket

# Host (prints a token once if --listen-token is omitted)
memories daemon --listen http://127.0.0.1:7900
# or HTTPS URL when TLS is configured:
memories daemon --listen https://127.0.0.1:8443 \
  --tls-cert certs/daemon-tls.crt --tls-key certs/daemon-tls.key --listen-token "$TOKEN"

# Client (another shell / machine that can reach the listener)
export MEMORIES_DAEMON=http://127.0.0.1:7900
export MEMORIES_DAEMON_TOKEN="$TOKEN"
memories status
memories unlock
memories sudo
memories vault list

La ruta RPC directa es /v1/rpc (actualización a WebSocket). Opciones: --daemon, --daemon-token (con el mismo significado que las variables de entorno).

Confianza TLS del cliente

La verificación del certificado y del nombre de host está activada por defecto. La opción global --ca-file PATH añade todos los certificados de un paquete de CA PEM al almacén de confianza normal. Para un daemon con certificado autofirmado, confíe explícitamente en su certificado (sus nombres alternativos de sujeto DNS/IP deben seguir coincidiendo con la URL):

memories --daemon https://localhost:8443 --daemon-token "$TOKEN" \
  --ca-file certs/daemon-tls.crt status

# Equivalent CA setting, also usable with relay and HTTPS clients:
export MEMORIES_CA_FILE=certs/daemon-tls.crt
memories --daemon https://localhost:8443 --daemon-token "$TOKEN" status

# DANGEROUS: development only; prefer --ca-file instead.
memories --daemon https://localhost:8443 --daemon-token "$TOKEN" --insecure status

--insecure desactiva la verificación de la cadena de certificados y del nombre de host. El cifrado TLS sigue activado, pero un atacante puede suplantar el servidor y leer tokens del daemon, credenciales o datos de solicitudes/respuestas. Nunca lo use en producción ni en una red no confiable. Es exclusivo de la CLI (no existe una variable de entorno MEMORIES_INSECURE). Un archivo de CA proporcionado explícitamente debe ser legible y contener certificados PEM válidos incluso con --insecure; los archivos inválidos provocan un fallo antes de conectar. Los archivos se cargan una vez al inicio; reinicie el proceso después de cambiar el paquete.

Ambas opciones se aplican a conexiones salientes del proceso actual: conexión directa HTTPS/WSS al daemon, host/cliente RPC por relé, clientes de relé de sincronización de bóvedas, OAuth en la nube y HTTP de Drive, HTTP de API RAG/descarga de modelos, HTTPS autenticado con credenciales, webhooks de automatización y sesiones/proxies TLS de bases de datos. Para operaciones ejecutadas por un daemon, proporcione las opciones al iniciarlo; las opciones del cliente no se envían por RPC ni pueden cambiar la política TLS de las conexiones salientes del daemon:

memories --ca-file /path/internal-ca.pem daemon
# Development only: affects every outbound TLS connection in this daemon.
memories --insecure daemon

Las opciones del servidor --tls-cert / --tls-key y la autenticación con token compartido no cambian. La opción de base de datos --tls-ca CA_ID sigue resolviendo una credencial PEM de la bóveda; su confianza se combina con el paquete --ca-file del daemon. Ninguna opción desactiva TLS ni la fijación de claves de host SSH. Estas opciones no son ajustes TOML, no se guardan como secretos de la bóveda y no configuran invocantes móviles/FFI ni clientes TLS de programas/navegadores externos o descargas gestionadas por dependencias fuera de estos constructores HTTP.

Host y cliente RPC por relé

# Generate a room id (43 URL-safe characters)
memories sync room

# Host joins slot a
memories daemon \
  --relay-host wss://relay.example.com \
  --room "$ROOM" \
  --listen-token "$TOKEN"

# Client joins slot b
export MEMORIES_DAEMON_RELAY=wss://relay.example.com
export MEMORIES_DAEMON_ROOM="$ROOM"
export MEMORIES_DAEMON_TOKEN="$TOKEN"
memories status

El desarrollo local puede utilizar ws://127.0.0.1:8787 con memories-relay.

Para un relé con CA privada, tanto el host como el cliente pueden usar las opciones globales:

memories --ca-file /path/relay-ca.pem daemon \
  --relay-host wss://relay.example.com --room "$ROOM" --listen-token "$TOKEN"
memories --ca-file /path/relay-ca.pem --daemon-relay wss://relay.example.com \
  --daemon-room "$ROOM" --daemon-token "$TOKEN" status

Share móvil (host en primer plano)

La aplicación Flutter puede iniciar una sesión Share que participa en el RPC por relé como host (slot a) mientras está desbloqueada y en primer plano. Pasar a segundo plano o bloquearla cierra la sesión. El móvil mantiene la lista de denegación FFI (sin Run/CryptoJob/autorizaciones MCP/ sesiones remotas/proxies, y Share también rechaza la copia de credenciales en texto sin cifrar y los volcados de copias de seguridad). Los teléfonos no abren un listener HTTP. Consulte mobile/README.md.

Excepciones locales / de plataforma

Superficie Escritorio remoto (HTTP/WS / relé) FFI móvil / Share
Bóveda / recuerdo / tarjeta / archivo / sincronización / estado / desbloqueo / sudo Completa (elevación cuando corresponda) Completa donde lo permita FFI
Conceder/revocar MCP, Backup, CredentialCopy Completa con elevación Denegada en Share; FFI permite copiar/copias de seguridad localmente
Run, CryptoJob, Remote, Proxy Completa con elevación (se ejecuta en el host) Denegada (sin entorno de ejecución de escritorio)
Escucha HTTP/WS Opcional (--listen) No disponible

Webhook de automatización de persona

Cuando se habilita la escucha HTTP, se aceptan activadores de automatización entrantes en:

POST /v1/persona/{vault}/{persona}/automation/trigger
Authorization: Bearer <persona world.automation.webhook_token>
Content-Type: application/json

{"hook":"HOOK_ID"}

El daemon debe estar desbloqueado (igual que otros RPC de escritura). El token de escucha habilita la superficie HTTP; el webhook_token de automatización (configurado con persona automation put --webhook-token) autoriza el hook. Un host de relé recibe la misma llamada en POST /v1/persona/{room}/{vault}/{persona}/automation/trigger en el relé (mismo cuerpo y Bearer del webhook); el segmento de sala es la única diferencia de ruta, y el relé reenvía una trama de transporte persona_automation_trigger existente al host conectado en vez de servirla localmente o realizar una solicitud saliente. Equivalente en CLI:

memories persona automation trigger VAULT PERSONA --id HOOK_ID \
  --source webhook --token "$WEBHOOK_TOKEN"