{
  "tool": "agora",
  "name": "L'Agora",
  "apiVersion": "1",
  "kind": "realtime",
  "description": "Chat de groupe P2P persistant (WebRTC mesh, sans compte). Chaque message est signé ECDSA P-256 et vérifié ; l'historique est répliqué chez les membres et survit tant qu'un membre le conserve. Le fondateur peut modérer (bannir/dé-bannir une clé). Un agent peut fonder une agora, la rejoindre par lien, poster des messages signés et lire le flux en direct.",
  "url": "https://sui-juris.fr/p2p-tools/agora/",
  "session": {
    "transport": "webrtc-mesh",
    "joinParam": "a",
    "roles": ["founder", "guest"],
    "methods": {
      "host":  { "summary": "Fonde une agora (rôle fondateur). La page ne doit PAS avoir de paramètre ?a=.", "args": { "pseudo": { "type": "string", "required": false }, "name": { "type": "string", "required": false } }, "returns": { "room": "identifiant de salle", "link": "lien d'invitation à partager (?a=<room>)" } },
      "join":  { "summary": "Rejoint une agora existante (naviguer d'abord vers l'URL avec ?a=<room>).", "args": { "pseudo": { "type": "string", "required": false } }, "returns": { "room": "", "link": "" } },
      "send":  { "summary": "Poste un message signé dans l'agora.", "args": { "text": { "type": "string", "required": true } }, "returns": { "ok": "bool" } },
      "poll":  { "summary": "Récupère les événements reçus depuis un curseur seq (messages, modérations).", "args": { "since": { "type": "number", "required": false } }, "returns": { "events": "[{type:'message'|'moderation', author, text, ts, seq}]", "seq": "curseur courant", "state": "{room,name,role,participants,messages}" } },
      "leave": { "summary": "Quitte l'agora (ferme les connexions aux pairs). L'historique local est conservé.", "args": {}, "returns": { "ok": "bool" } }
    }
  }
}
