Repository navigation
FR Bridge Connecteurs
English · Explication · Publiée, relue par une personne · S'applique depuis : 4.2.5
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.
Public, contexte, et statuts de ce sur quoi repose la page
Public : auteur, administrateur · Contexte : Reality Bridge
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 CIreality; 3 fichiers de tests · passes humaines :connectors-real-securitypas faite (#79) · limites connues : aucune listée sur cette page
-
Un processus à part, jamais dans le jeu : le build du jeu ne contient rien de
connectors/(vérifié partools/dist.ts), le jeu ne déclare que des données, et un jeu tourne sans aucun connecteur. -
Une entrée hostile d’un côté, un signal déclaré de l’autre. Ce que lit un connecteur est traité comme hostile ;
chacun a son modèle de menace dans
docs/dev/threat-models/. - Expérimental (D19) : chaque test de contrat et d’abus tourne en CI, mais personne n’en a encore fait tourner un contre un vrai fournisseur d’e-mail, un vrai badge ou un terminal exposé sur un réseau (Stabilité et support).
| Connecteur | Lit | Rattache le joueur par | Sa page |
|---|---|---|---|
email |
un message posté par le webhook signé d’un fournisseur, ou relevé en IMAP | une étiquette de destinataire +p-…, ou l’expéditeur qui a envoyé un code d’appairage |
|
telnet |
des lignes tapées sur un terminal TCP | le code d’appairage tapé, ou un mot de reprise | Telnet |
ssh |
des lignes tapées dans un terminal SSH | un code d’appairage ou un mot de reprise comme mot de passe, ou une clé publique déclarée | SSH |
open-badge |
un badge posté sur son formulaire | le code d’appairage posté avec lui | Open Badges |
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.jsonLa 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 }
}-
tokenFileet les autres chemins sont relatifs au dossier de la configuration. Le manifeste Reality du jeu vient du Bridge (GET /v1/manifest), ou de"manifestFile"; un manifeste d’un autre jeu quegameIdl’arrête. -
limits(toutes facultatives) :maxBytes(une charge en JSON canonique, et la plus grande entrée lue d’un coup ; 4 096),maxPerMinute(propositions par minute, tous joueurs confondus ; 60),timeoutMs(un appel au Bridge ; 5 000). - Avec
health,GET /health(200 en bonne santé, 503 sinon, avec undetail) etGET /metrics(les comptes de propositions, d’acceptations, de doublons, de refus par code, d’entrées rejetées, de nouvelles tentatives) répondent sur127.0.0.1(ouhealth.host). - SIGTERM ou Ctrl-C l’arrête : plus aucune entrée, le travail en cours vidé en cinq secondes au plus, code 0. Sans argument, il affiche son usage et sort avec le code 2 ; un connecteur inconnu, code 2.
- Les secrets viennent de fichiers (
secretFile,passwordFile,tokenFile,hostKeyFile). Unsecret, unpasswordou untokenen ligne est un raccourci de développement et doit être une chaîne, sinon le connecteur refuse de démarrer.
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 :
-
POST /v1/signals(jeton en Bearer){ playerId, signal, source, dedupeKey, occurredAt?, evidenceHash? }: 202 accepté, 200 déjà accepté (la mêmededupeKey), 401 un jeton mauvais ou révoqué, 403 non autorisé, 404 un joueur inconnu ou révoqué, 422 absent du manifeste (ou d’une autre source), 429 au-delà d’un quota. -
POST /v1/pairings/<code>/confirm(jeton avec--pairen Bearer) : lie le joueur qui montre ce code ; 409 s’il a déjà été confirmé. -
POST /v1/hooks/<source>avecX-Web-Scumm-Signature: sha256=<HMAC du corps>et{ playerId, event, id }: le webhook de démonstration du Bridge ;eventdoit être l’un de ceux qu’il connaît,idnomme la livraison (déduplication).
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é.
- Le Bridge reçoit le nom du signal, le joueur, la source, la clé de déduplication, l’heure, et le SHA-256 de la charge
du connecteur (
evidenceHash) : jamais la charge, le message, la ligne ni le badge. - La livraison est au moins une fois et appliquée une fois : une proposition dont la réponse s’est perdue est renvoyée
avec la même clé (deux nouvelles tentatives par défaut) et le Bridge répond
duplicate. Un refus n’est jamais réessayé. - Le journal d’exécution contient des événements, des identifiants et des comptes. Une chaîne qui ressemble à du
contenu (une espace, un
@, une barre oblique) est écrite[redacted]; les tests vérifient qu’aucune adresse, aucun texte ni aucun secret des jeux d’essai n’atteint un journal. - Ce que garde chaque connecteur, et combien de temps : sa propre page, et Vie privée.
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.
-
Le client IMAP habituel (
imapflow), avec huit paquets à l’exécution : le connecteur a besoin de sept commandes, doncconnectors/src/email/imap.tsest un client borné à lui, testé contre un serveur scripté. -
Un analyseur MIME généraliste : le message est lu par
connectors/src/email/mime.tsdans un thread de travail avec un petit tas et un budget de temps. -
Du code SSH natif :
ssh2(MIT, pur JavaScript) est gardé, ses parties natives facultatives (cpu-features,nan) renvoyées vers un bouchon qui les refuse. - Des motifs ou des scripts de l’auteur : jamais ; le jeu déclare des mots, des commandes, des chemins et des émetteurs sous forme de données.
- Un processus de plus par connecteur à lancer, superviser et sécuriser, chacun avec son jeton à renouveler (30 jours par défaut).
- Ce qu’un connecteur a vu reste chez lui : un opérateur qui a besoin de l’original (un e-mail, un badge) le garde côté source (la boîte mail), pas sur le Bridge.
- Un connecteur ajouté au projet est du code dans
connectors/src/: Le SDK des connecteurs.
- ADR 0008 : un connecteur est un processus à part, derrière un petit SDK (D19).
- ADR 0007 : Biscuit autorise un connecteur.
- Les modèles de menace : e-mail, Telnet, SSH, Open Badges.
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.5.3 r1, documentation revision · révision de la documentation b061c4ae6fbeb0be47a11ba8a442ba7e23ecb0a1.
Latest documentation · dernière documentation: https://quest-n-click.cleverapps.io/docs · https://quest-n-click.cleverapps.io/fr/docs; earlier versions · versions précédentes: each release's quest-n-click-docs-<version>.tar.gz · l'archive quest-n-click-docs-<version>.tar.gz de chaque release, https://github.com/Quest-n-Click/quest-n-click/releases
An edit made in this wiki is overwritten at the next publication · une modification faite dans ce wiki est écrasée à la publication suivante.
Edit the source · Modifier la source · Report an error · Signaler une erreur
Index (6)
Démarrer (6)
Jouer (9)
Installer (18)
- Prérequis
- Installer depuis l'archive de la release
- Installer depuis npm
- Installer depuis le dépôt pour travailler sur le moteur
- doctor : vérifier sa machine
- Outils pour les images
- Outils audio : ffmpeg, fluidsynth, Furnace, uv
- Mettre à jour
- Notes de mise à jour : 4.5
- Notes de mise à jour : 4.4
- Notes de mise à jour : 4.3
- Notes de mise à jour : 4.2
- Notes de mise à jour : 4.1
- Notes de mise à jour : v3
- Notes de mise à jour : v2 vers v3
- Venir de web-scumm
- Référence du paquet
- Dépannage de l'installation
Créer un jeu (55)
- Votre premier jeu
- Organisation d'un projet créé et du dépôt du moteur
- La boucle de travail
- Principes du contenu et contrat d'identité
- Salles
- Géométrie : placement, zones de marche, masques, calques, caméra
- Un objet est visible mais inaccessible
- Réactions
- Commandes du jeu
- Conditions
- Drapeaux, variables et événements : lequel choisir
- Code sur mesure
- Personnages
- Objets et inventaire
- Carte du monde
- Dialogues
- Scripts et événements
- Faire bouger les personnages : patrouilles et marches
- Sorties
- Chapitres et objectifs
- État et sauvegardes : persistant ou temporaire, renommer un id, migrations
- Mise en scène : salles larges et animations
- La scène : lumières, particules, sols
- Habillage et polices
- Titre et générique
- Héros : plusieurs personnages et choix du héros
- Mini-jeux intégrés
- Un mini-jeu sur mesure
- Traductions
- Musique en stems
- Bruitages
- Voix : par langue et par héros
- Images : prompts, découpe des planches, transparence, échelle
- Provenance des assets
- Le storyboard, source de vérité
- Concevoir des énigmes
- Mécaniques classiques
- Pages de relecture
- Référence du DSL
- Vérifier son jeu
- Ce que prouve le solveur
- Options du solveur
- Playtests
- Remix
- Speedrun pour les auteurs
- La fin scellée
- Modèle de production
- Jeux d'exemple
- Travailler avec une IA
- Construire et publier un jeu
- Publier sur GitHub Pages
- Le jeu statique sur Clever Cloud
- Autres hébergeurs statiques
- Sous-chemin, cache et service worker, déploiement incomplet, retour arrière
- Tester sur un téléphone en réseau local
Studio local (24)
- Le Studio local : présentation et lancement
- Modifier une salle
- Placement et scène
- Aperçu, application, annulation
- Storyboard
- Assets et découpe
- Vérifier : validateur, solveur, chemin critique, chaleur, santé, couverture
- Captures avant et après
- Diff sémantique
- Jouer et rejouer une session
- Explication des règles
- Langue et objectifs
- Voix et matrice héros × langues
- Carte
- Notes
- Remix dans le Studio
- Musique
- L'Assistant : votre propre clé
- Mode démo et studio-apply
- Sécurité en local et en réseau local
- API du Studio
- MCP local : configurer chaque client
- Outils MCP
- Dépannage du Studio
Studio d'équipe (21)
- Ce qui tourne où
- Concepts : révision, transaction, pan, bail, aperçu, build
- Débuter comme dev invité
- Travailler ensemble au quotidien
- Rôles et actions : la matrice complète
- Invitations
- Gérer les membres
- Écriture refusée sur le Studio hébergé : révision de base périmée (409)
- Écriture refusée sur le Studio hébergé : pan verrouillé (423)
- Reprendre après un bail perdu, une déconnexion ou un aperçu périmé
- Commentaires
- Carte et diff sémantique
- Publier des builds
- MCP distant
- Le jeu dans Git
- Mettre à jour le moteur d'un jeu hébergé
- Assets hébergés
- La ligne de commande du serveur
- Routes de santé et de métriques
- L'essayer en local avec compose.yml
- Limites connues
Clever Cloud (23)
- Clever Cloud : vue d'ensemble, coût et prérequis
- Applications et add-ons
- Domaines et TLS
- Keycloak
- OIDC générique et GitLab
- Configuration
- Premier déploiement
- Sauvegardes
- RPO et RTO
- Exercice de restauration sur une installation vierge
- Redéploiements
- Mettre à jour le serveur et vérifier l'état après une migration
- Limites du retour arrière
- Supervision
- Sécurité
- Renouveler les clés
- Récupérer l'accès administrateur
- Changer de domaine ou de fournisseur OIDC
- Worker, PostgreSQL ou Cellar en panne
- Exporter le jeu et quitter l'installation
- Rétention
- Dépannage sur Clever Cloud
- Coûts et démontage
Reality Bridge et connecteurs (16)
- Le Reality Bridge : ce que c'est
- Démarrage rapide
- Garanties
- Installer et lancer le Bridge
- Sauvegarde et restauration
- Plusieurs tenants
- Signaux et manifeste
- La ligne de commande du Bridge
- Vue d'ensemble des connecteurs
- Connecteur email
- Connecteur Telnet
- Connecteur SSH
- Connecteur Open Badges
- Le SDK des connecteurs
- Sécurité : Biscuit et signatures
- Dépannage du Bridge et des connecteurs
Contribuer (25)
- Bienvenue
- Préparer son poste de développement
- La boucle de développement
- Avant une pull request
- Conventions
- Écrire la documentation
- Architecture
- Visite du code
- Frontières d'import
- Quels tests tournent quand
- Tests de mutation
- Le cliquet de couverture
- La référence de qualité
- La CI expliquée
- Passes de terrain
- Mesures de performance
- Publier une release
- Paquets npm
- Décisions et ADR
- Gouvernance
- Pull requests des bots
- Contribuer avec des agents IA
- Politique de sécurité
- Code de conduite
- Licences et crédits