Démon distant (HTTP/WebSocket et RPC par relais)
Memories peut héberger le même protocole à trames service::Request sur :
- IPC local (par défaut ; authentifié par l'utilisateur du système ; trames préfixées par leur longueur)
- HTTP + WebSocket (écoute facultative ; authentification par jeton ; mêmes trames JSON binaires que le RPC par relais)
- 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 decli:{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_clientaprè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'écoutehttps://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"