Memories / Documentation

Sur cette page

Démon distant (HTTP/WebSocket et RPC par relais)

Memories peut héberger le même protocole à trames service::Request sur :

  1. IPC local (par défaut ; authentifié par l'utilisateur du système ; trames préfixées par leur longueur)
  2. HTTP + WebSocket (écoute facultative ; authentification par jeton ; mêmes trames JSON binaires que le RPC par relais)
  3. RPC par relais WSS (/v1/rpc/{room}/{slot})

La connexion distante directe et celle par relais partagent un même schéma sur le réseau : des trames WebSocket binaires contenant AuthFrame, puis Wire version-1 (service::Request). La synchronisation des coffres utilise toujours /v1/channel. La WebUI reste limitée à l'état.

Règles de sécurité

  • Jeton d'écoute : --listen-token / MEMORIES_LISTEN_TOKEN, ou généré et affiché une seule fois lorsque l'hôte HTTP/relais est activé. Ne mettez jamais le jeton dans TOML.
  • Le jeton est effacé lorsque le stockage est verrouillé.
  • Les appelants distants utilisent les espaces de noms d'élévation stables ws:remote / relay:remote (distincts de cli:{pid}). Le déverrouillage et sudo via un transport distant élèvent cet espace de noms afin que les connexions ponctuelles suivantes conservent l'élévation pendant la fenêtre d'inactivité (mêmes règles qu'en local : 5 minutes d'inactivité / 15 minutes au maximum).
  • Les hôtes HTTP/relais de bureau exposent la surface complète de handle_client après déverrouillage/sudo (coffre, carte, mémoire, fichier, identifiant, synchronisation, autorisation MCP, sauvegarde, liaison de proxy sur l'hôte, sessions distantes, Run, CryptoJob, etc.), avec les mêmes contrôles d'élévation que l'IPC local.
  • L'écoute HTTP est limitée à la boucle locale par défaut ; toute autre adresse exige --allow-non-loopback.
  • HTTP/WS en clair ne nécessite aucun certificat (par défaut pour le LAN direct).
  • TLS facultatif : --tls-cert / --tls-key (PEM) activent HTTPS/WSS sur la même écoute. Une URL d'écoute https:// exige ces options.
  • Un relais hors du périmètre de confiance doit utiliser wss:// avec un ID de salon de 43 caractères et un jeton.
  • Tout détenteur du jeton d'écoute bénéficie de la même confiance qu'un client local élevé pour cet espace de noms de transport. Traitez le jeton comme un mot de passe ; privilégiez la boucle locale ou un chemin réseau authentifié.

Risques résiduels

  • Vol du jeton ⇒ contrôle distant complet d'un démon de bureau déverrouillé/élevé.
  • HTTP hors boucle locale expose l'API à trames au réseau ; utilisez --tls-cert / --tls-key, un proxy inverse, un VPN ou un pare-feu pour une liaison hors boucle locale.
  • Le RPC par relais (/v1/rpc/{room}/{slot}) est authentifié, mais pas chiffré de bout en bout : ses trames JSON applicatives transportent le jeton d'écoute partagé, puis les requêtes et réponses. L'opérateur du relais ou le terminateur TLS peut lire le jeton et les charges utiles RPC. WSS protège chaque connexion au relais, mais pas contre le relais lui-même ; utilisez un relais de confiance pour accéder au démon distant.
  • La synchronisation entre coffres pairs (/v1/channel) est distincte et transporte des charges utiles chiffrées de bout en bout. Sur ce canal, les opérateurs du relais voient les longueurs et les horaires des textes chiffrés, pas les ressources en clair.
  • Les écouteurs de proxy côté hôte restent liés à la boucle locale sur la machine du démon ; les clients distants élevés peuvent les démarrer, puis les atteindre uniquement s'ils peuvent aussi atteindre cette boucle locale (généralement par un tunnel distinct).

Hôte et client 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

Le chemin RPC direct est /v1/rpc (mise à niveau WebSocket). Options : --daemon, --daemon-token (même sens que les variables d'environnement).

Confiance TLS du client

La vérification des certificats et des noms d'hôte est activée par défaut. L'option globale --ca-file PATH ajoute tous les certificats d'un ensemble d'autorités PEM au magasin de confiance normal. Pour un démon autosigné, faites explicitement confiance à son certificat (ses noms alternatifs DNS/IP doivent toujours correspondre à l'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 désactive la vérification de la chaîne de certificats et du nom d'hôte. Le chiffrement TLS reste activé, mais un attaquant peut usurper le serveur et lire les jetons du démon, les identifiants ou les données des requêtes/réponses. Ne l'utilisez jamais en production ni sur un réseau non fiable. Cette option est réservée à la CLI (aucune variable d'environnement MEMORIES_INSECURE). Un fichier CA fourni explicitement doit être lisible et contenir des certificats PEM valides même avec --insecure ; les fichiers invalides provoquent un échec avant la connexion. Les fichiers sont chargés une seule fois au démarrage ; redémarrez le processus après modification de l'ensemble.

Les deux options s'appliquent aux connexions sortantes du processus actuel : connexion directe HTTPS/WSS au démon, hôte/client RPC par relais, clients relais de synchronisation des coffres, OAuth cloud et HTTP Drive, API RAG/téléchargement HTTP des modèles, HTTPS authentifié par identifiants, webhooks d'automatisation et sessions/ proxys TLS de bases de données. Pour les opérations exécutées par un démon, passez les options à son démarrage ; les options du client ne sont pas envoyées via RPC et ne peuvent pas modifier la politique TLS sortante du démon :

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

Les options serveur --tls-cert / --tls-key et l'authentification par jeton partagé restent inchangées. L'option de base de données --tls-ca CA_ID résout toujours un identifiant PEM dans le coffre ; sa confiance est combinée avec l'ensemble --ca-file du démon. Aucune de ces options ne désactive TLS ni l'épinglage des clés d'hôte SSH. Elles ne sont pas des paramètres TOML, ne sont pas conservées comme secrets du coffre et ne configurent ni les appelants mobile/FFI, ni les clients TLS de programmes ou navigateurs externes, ni les téléchargements gérés par les dépendances en dehors de ces constructeurs HTTP.

Hôte et client RPC par relais

# 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

Le développement local peut utiliser ws://127.0.0.1:8787 avec memories-relay.

Pour un relais utilisant une autorité de certification privée, l'hôte et le client peuvent tous deux utiliser les options 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

Partage mobile (hôte au premier plan)

L'application Flutter peut démarrer une session de partage qui rejoint le RPC par relais en tant qu'hôte (emplacement a), déverrouillée et au premier plan. Le passage en arrière-plan ou le verrouillage ferme la session. Le mobile conserve la liste d'interdiction FFI (aucun Run/CryptoJob/autorisation MCP/session distante/proxy, et le partage refuse aussi la copie d'identifiants en clair et les exports de sauvegarde). Les téléphones n'ouvrent pas d'écouteur HTTP. Voir mobile/README.md.

Restrictions locales et exceptions de plateforme

Surface Bureau distant (HTTP/WS / relais) FFI mobile / partage
Coffre / mémoire / carte / fichier / synchronisation / état / déverrouillage / sudo Complète (élévation si nécessaire) Complète lorsque FFI le permet
Autorisation/révocation MCP, Backup, CredentialCopy Complète avec élévation Refusée en partage ; FFI autorise la copie/sauvegarde locale
Run, CryptoJob, Remote, Proxy Complète avec élévation (exécution sur l'hôte) Refusée (aucun environnement d'exécution de bureau)
Écoute HTTP/WS Facultative (--listen) Indisponible

Webhook d'automatisation de persona

Lorsque l'écoute HTTP est activée, les déclenchements d'automatisation entrants sont acceptés à l'adresse suivante :

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

{"hook":"HOOK_ID"}

Le démon doit être déverrouillé (comme pour les autres RPC d'écriture). Le jeton d'écoute active la surface HTTP ; le webhook_token d'automatisation (défini via persona automation put --webhook-token) autorise le hook. Un hôte relais reçoit le même appel à POST /v1/persona/{room}/{vault}/{persona}/automation/trigger sur le relais (même corps et même jeton bearer de webhook) ; le segment du salon est la seule différence de chemin, et le relais transmet une trame existante persona_automation_trigger à l'hôte connecté au lieu de la traiter localement ou d'effectuer un envoi sortant. Équivalent CLI :

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