quest'n'click 4.5.0 · r1

Construite pour quest'n'click 4.5.0, révision r1. Si elle est publiée, et laquelle est la courante, est dit par publication.json.

Vue d’ensemble des connecteurs

English · Type : explication · Public : auteur, administrateur · Contexte : Reality Bridge · Statut : prête · S'applique depuis : 4.2.5

Les connecteurs (email, Telnet, SSH, Open Badges) · contrat : expérimental · vérifié par la CI (matrice de support de la 4.4.0, 2026-10-23) : Node 22 sous Ubuntu (Telnet et SSH pas sous Windows) · vérifications automatiques : jobs connectors, connector-archive-e2e ; plan de CI reality ; 3 fichiers de tests · passes humaines : connectors-real-security pas faite (#79) · limites connues : aucune listée sur cette page

Un connecteur transforme quelque chose qui se passe hors du jeu (un e-mail arrive, une commande est tapée dans un terminal, un badge est présenté) en l’un des signaux que le jeu déclare, et le propose au Reality Bridge. Quatre sont livrés depuis la 4.1.9, dans le paquet quest-n-click-connectors : e-mail, Telnet, SSH et Open Badges. Cette page dit comment ils sont construits et lancés ; chacun a sa propre page.

Ce qu’est un connecteur

ConnecteurLitRattache le joueur parSa page
emailun message posté par le webhook signé d’un fournisseur, ou relevé en IMAPune étiquette de destinataire +p-…, ou l’expéditeur qui a envoyé un code d’appairageE-mail
telnetdes lignes tapées sur un terminal TCPle code d’appairage tapé, ou un mot de repriseTelnet
sshdes lignes tapées dans un terminal SSHun code d’appairage ou un mot de reprise comme mot de passe, ou une clé publique déclaréeSSH
open-badgeun badge posté sur son formulairele code d’appairage posté avec luiOpen Badges

En lancer un

Chaque connecteur a besoin de son propre jeton venu du Bridge, puis de son fichier de configuration :

# dans le dépôt du moteur (le dossier du Bridge est .cache/bridge)
npm run bridge -- grant --connector=shed-telnet --source=terminal --signals=terminal.lamp --pair > telnet.token
npm run connector -- telnet --config telnet.json
# sur un serveur, avec le paquet quest-n-click-connectors installé
npx quest-n-click-connector telnet --config telnet.json

La commande est quest-n-click-connector <email|telnet|ssh|open-badge> --config <fichier.json>. Installez le paquet sans code natif : npm install --omit=optional --ignore-scripts quest-n-click-connectors. La configuration nomme le Bridge et le fichier du jeton du connecteur (jamais le jeton sur la ligne de commande), le jeu, ses limites, un port de santé facultatif, et une section au nom du connecteur :

{
  "bridge": { "url": "http://127.0.0.1:8787/", "tokenFile": "telnet.token" },
  "gameId": "signals",
  "limits": { "maxBytes": 4096, "maxPerMinute": 60, "timeoutMs": 5000 },
  "health": { "port": 9301 },
  "telnet": { "port": 2323 }
}

Un jeton créé avec --pair peut confirmer les codes d’appairage que donnent les joueurs ; ne donnez à chaque connecteur que les signaux qu’il propose. Un connecteur vérifie ce qu’il affirme (la preuve d’un badge, l’expéditeur d’un e-mail) : Biscuit dit seulement qui peut proposer. Côté Bridge, un connecteur utilise trois routes :

Déclarer ce que les connecteurs peuvent faire

Le jeu dit, sous forme de données, ce que chaque connecteur peut transformer en signal : reality.connectors, vérifié par npm run validate. Chaque signal nommé là est l’un des reality.signals ; aucun motif, script ou chemin de l’auteur n’atteint un connecteur.

reality: {
  signals: [
    { id: 'letter.door', source: 'email', availability: 'optional', replay: 'record' },
    { id: 'terminal.lamp', source: 'terminal', availability: 'optional', replay: 'record' },
  ],
  connectors: {
    email: { answers: [{ words: ['open', 'door'], signal: 'letter.door' }], otherwise: 'letter.unclear' },
    telnet: { prompt: 'shed> ', commands: [{ says: 'lamp on', reply: 'Clic.', signal: 'terminal.lamp' }] },
    ssh: { commands: [/* les mêmes */], files: { '/notes/lamp.txt': 'La lampe obéit à deux mots.' } },
    'open-badge': { issuers: ['https://badges.example.org/issuer'], valid: 'badge.valid', revoked: 'badge.refused' },
  },
}

Chaque champ et ses contraintes : Signaux et manifeste. Deux autorisations s’empilent : la déclaration du jeu (quels signaux l’entrée d’un connecteur peut devenir) et le jeton du connecteur (quels signaux, sources et joueurs le Bridge accepte de lui) : Sécurité.

Un joueur lie un connecteur à son jeu comme il lie n’importe quel connecteur : la ligne World link du menu pause affiche un code, et le joueur le tape à l’invite du terminal, l’envoie en sujet d’un e-mail (PAIR ABCD2345), ou le poste avec un badge. Le connecteur le confirme auprès du Bridge ; le jeu est alors lié.

Ce qui sort d’un connecteur

Pourquoi

Un connecteur lit des entrées écrites par des inconnus et détient un secret (un mot de passe de boîte mail, une clé d’hôte). Ni l’un ni l’autre ne doit atteindre le jeu, une PWA sans socket, sans secret et sans contenu exécutable, ni son DSL. Un processus par connecteur garde une panne ou une compromission à un seul endroit, et un petit SDK fait se comporter chaque connecteur de la même façon envers le Bridge : les mêmes limites, la même nouvelle tentative avec la même clé, le même journal qui masque, la même santé et le même arrêt.

Les options écartées

Les compromis

Décisions et ADR


Modifier la source de cette page · Signaler une erreur