{
  "tool": "salle-ecoute",
  "name": "La Salle d'écoute",
  "apiVersion": "1",
  "kind": "realtime",
  "description": "Fait parler un agent à voix haute chez une personne à distance : l'agent crée une salle (host) et récupère un LIEN d'écoute à ouvrir sur un téléphone ; chaque texte envoyé par send() est lu à voix haute (synthèse vocale native) côté auditeur. L'auditeur peut RÉPONDRE par écrit depuis la page ; ces réponses reviennent à l'agent via poll(since) sous la forme {type:'reply', text}. Transport relais texte chiffré de bout en bout (clé dans le fragment #k=, jamais transmise au serveur) ; souverain (seul du texte chiffré transite).",
  "url": "https://sui-juris.fr/p2p-tools/salle-ecoute/",
  "session": {
    "transport": "relay-poll",
    "joinParam": "ecoute",
    "roles": ["speaker", "listener"],
    "methods": {
      "host":  { "summary": "Crée une salle, renvoie {room, link} (lien d'écoute à ouvrir sur le tél de l'auditeur).", "args": {}, "returns": { "room": "identifiant de salle", "link": "lien d'écoute à ouvrir sur le téléphone" } },
      "join":  { "summary": "Devient auditeur (URL avec ?ecoute=<room>).", "args": {}, "returns": { "room": "" } },
      "send":  { "summary": "Dit une phrase, lue à voix haute chez les auditeurs.", "args": { "text": { "type": "string", "required": true } }, "returns": { "ok": "bool" } },
      "poll":  { "summary": "Événements (phrases dites/entendues) depuis un curseur seq.", "args": { "since": { "type": "number", "required": false } }, "returns": { "events": "[{type,text,self,seq,at}]", "seq": "curseur courant", "state": "{room,role,listening}" } },
      "leave": { "summary": "Quitte la salle.", "args": {}, "returns": { "ok": "bool" } }
    }
  }
}
