{
  "tool": "telecommande",
  "name": "La Télécommande",
  "apiVersion": "1",
  "kind": "realtime",
  "description": "Pilotez vos diapositives à distance en pair-à-pair (WebRTC DataChannel, sans cloud). L'écran/PC (hôte) projette les diapos ; la télécommande (invité, rejoint par lien ?r=<room>) envoie les commandes next/prev/goto/present/exit/black. Un agent peut héberger l'écran, rejoindre comme télécommande, envoyer des commandes et lire le flux d'événements en direct.",
  "url": "https://sui-juris.fr/p2p-tools/telecommande/",
  "session": {
    "transport": "webrtc-duo",
    "joinParam": "r",
    "roles": ["host", "guest"],
    "methods": {
      "host":  { "summary": "Devient l'ECRAN/PC présentateur (pcInit). Ouvrir /telecommande/ sans paramètre d'URL. Reçoit les commandes de la télécommande.", "args": {}, "returns": { "room": "identifiant de salle", "link": "lien d'invitation (?r=<room>) à ouvrir sur le téléphone-télécommande" } },
      "join":  { "summary": "Devient la TELECOMMANDE (rcInit). Naviguer d'abord vers l'URL avec ?r=<room>, puis appeler join.", "args": {}, "returns": { "room": "", "link": "" } },
      "send":  { "summary": "Envoie une commande de télécommande à l'écran via le DataChannel (interprétée par l'hôte/PC). Le plus utile depuis le rôle télécommande.", "args": { "action": { "type": "string", "required": false, "enum": ["next", "prev", "goto", "present", "exit", "black"] }, "i": { "type": "number", "required": false, "summary": "index de diapo pour action=goto" }, "key": { "type": "string", "required": false, "summary": "alternative : ArrowRight/ArrowLeft/PageDown/PageUp/b -> next/prev/black" } }, "returns": { "ok": "bool", "sent": "commande envoyée", "error": "raison si échec (liaison non connectée / action manquante)" } },
      "poll":  { "summary": "Récupère les événements reçus depuis un curseur seq. Côté écran : type:'cmd' (commandes reçues). Côté télécommande : type:'state' (i,n,presenting,note).", "args": { "since": { "type": "number", "required": false } }, "returns": { "events": "[{type,c?,i?,n?,presenting?,note?,self?,seq}]", "seq": "curseur courant", "state": "{room,role,connected,slides,index,presenting,black}" } },
      "leave": { "summary": "Ferme la liaison P2P (DataChannel + RTCPeerConnection + signaling).", "args": {}, "returns": { "ok": "bool" } }
    }
  }
}
