Web interfaces

Interface de contrôle

L’interface de contrôle est une petite application monopage Vite + Lit servie par le Gateway :

  • par défaut : http://<host>:18789/
  • préfixe facultatif : définissez gateway.controlUi.basePath (par ex. /openclaw)

Elle communique directement avec le WebSocket du Gateway sur le même port.

Ouverture rapide (en local)

Si le Gateway s’exécute sur le même ordinateur, ouvrez http://127.0.0.1:18789/ (ou http://localhost:18789/).

Si la page ne se charge pas, démarrez d’abord le Gateway : openclaw gateway.

L’authentification est fournie lors de la négociation WebSocket via :

  • connect.params.auth.token
  • connect.params.auth.password
  • les en-têtes d’identité Tailscale Serve lorsque gateway.auth.allowTailscale: true
  • les en-têtes d’identité du proxy de confiance lorsque gateway.auth.mode: "trusted-proxy"

Le panneau des paramètres du tableau de bord conserve un jeton pour la session de l’onglet actuel du navigateur et l’URL de Gateway sélectionnée ; les mots de passe ne sont pas conservés. L’intégration initiale génère généralement un jeton de Gateway pour l’authentification par secret partagé lors de la première connexion, mais l’authentification par mot de passe fonctionne également lorsque gateway.auth.mode vaut "password".

Appairage de l’appareil (première connexion)

La connexion depuis un nouveau navigateur ou appareil nécessite généralement une approbation d’appairage unique, affichée sous la forme disconnected (1008): pairing required.

  • Répertorier les demandes en attente

    bash
    openclaw devices list
  • Approuver avec l’ID de la demande

    bash
    openclaw devices approve <requestId>
  • Si le navigateur retente l’appairage avec des informations d’authentification modifiées (rôle/portées/clé publique), la demande précédente en attente est remplacée et un nouveau requestId est créé ; réexécutez openclaw devices list avant d’approuver.

    Le passage d’un navigateur déjà appairé d’un accès en lecture à un accès en écriture/administration est traité comme une élévation d’approbation, et non comme une reconnexion silencieuse : OpenClaw maintient l’ancienne approbation active, bloque la reconnexion avec des droits plus étendus et vous demande d’approuver explicitement le nouvel ensemble de portées.

    Une fois approuvé, l’appareil est mémorisé et ne nécessite plus de nouvelle approbation, sauf si vous la révoquez avec openclaw devices revoke --device <id> --role <role>. Consultez la CLI des appareils pour la rotation des jetons, la révocation et le flux d’approbation à la première exécution de Paperclip / openclaw_gateway.

    Appairer un appareil mobile

    Un administrateur déjà appairé peut créer le code QR de connexion iOS/Android sans ouvrir de terminal :

  • Ouvrir l’appairage mobile

    Sélectionnez Appareils, puis cliquez sur Appairer un appareil mobile dans la carte Appareils.

  • Connecter le téléphone

    Dans l’application mobile OpenClaw, ouvrez ParamètresGateway et scannez le code QR. Vous pouvez également copier et coller le code de configuration.

  • Confirmer la connexion

    L’application officielle iOS/Android se connecte automatiquement. Si Approbation en attente affiche une demande, vérifiez son rôle et ses portées avant de l’approuver.

  • La création d’un code de configuration nécessite operator.admin ; le bouton est désactivé pour les sessions qui ne disposent pas de cette portée. Un code de configuration contient un identifiant d’amorçage à courte durée de vie ; traitez donc le code QR et le code copié comme un mot de passe tant qu’ils sont valides. Pour un appairage à distance, le Gateway doit être accessible via wss:// (par exemple, par Tailscale Serve/Funnel) ; ws:// en clair est limité à l’interface de bouclage et aux adresses LAN privées. Consultez Appairage pour tous les détails concernant la sécurité et les solutions de repli.

    Identité personnelle (locale au navigateur)

    L’interface de contrôle prend en charge une identité personnelle propre à chaque navigateur (nom d’affichage et avatar), jointe aux messages sortants afin d’en attribuer la provenance dans les sessions partagées. Elle réside dans le stockage du navigateur, limitée au profil de navigateur actuel, et n’est ni synchronisée avec les autres appareils ni conservée côté serveur au-delà des métadonnées habituelles d’auteur de la transcription pour les messages que vous envoyez. L’effacement des données du site ou le changement de navigateur la réinitialise à une valeur vide.

    Le remplacement de l’avatar de l’assistant suit le même modèle local au navigateur : les remplacements téléversés se superposent localement à l’identité résolue par le Gateway et ne transitent jamais par config.patch. Le champ de configuration partagé ui.assistant.avatar reste disponible pour les clients autres que l’interface utilisateur qui écrivent directement dans ce champ.

    Point de terminaison de configuration d’exécution

    L’interface de contrôle récupère ses paramètres d’exécution depuis /control-ui-config.json, résolu relativement au chemin de base de l’interface de contrôle du Gateway (par exemple /__openclaw__/control-ui-config.json avec le chemin de base /__openclaw__/). Ce point de terminaison est protégé par la même authentification du Gateway que le reste de la surface HTTP : les navigateurs non authentifiés ne peuvent pas y accéder, et une récupération réussie nécessite un jeton ou mot de passe de Gateway valide, une identité Tailscale Serve ou une identité de proxy de confiance.

    État de l’hôte du Gateway

    Ouvrez Paramètres dans la vue simple pour afficher la carte Hôte du Gateway, qui indique la machine du Gateway, l’adresse LAN, le système d’exploitation, l’environnement d’exécution, la durée de fonctionnement, la charge du processeur, la mémoire et l’espace disque du volume d’état. Tant qu’elle est visible, la carte s’actualise toutes les 10 secondes via le RPC system.info du Gateway, qui nécessite la portée operator.read. Les anciens Gateway et les connexions dépourvues de cette portée n’affichent pas la carte.

    Prise en charge des langues

    Lors du premier chargement, l’interface de contrôle se localise selon les paramètres régionaux de votre navigateur. Pour les remplacer ultérieurement, ouvrez Settings -> General -> Language (le sélecteur se trouve dans la carte des réglages rapides General, et non sous Appearance).

    • Paramètres régionaux pris en charge : en, ar, de, es, fa, fr, hi, id, it, ja-JP, ko, nl, pl, pt-BR, ru, th, tr, uk, vi, zh-CN, zh-TW
    • Les traductions autres qu’en anglais sont chargées à la demande dans le navigateur.
    • Les paramètres régionaux sélectionnés sont enregistrés dans le stockage du navigateur et réutilisés lors des visites ultérieures.
    • Les clés de traduction manquantes utilisent l’anglais comme solution de repli.

    Les traductions de la documentation sont générées pour le même ensemble de paramètres régionaux autres que l’anglais, mais le sélecteur de langue Mintlify intégré au site de documentation ne répertorie que les codes de paramètres régionaux acceptés par Mintlify. Les documentations en thaï (th) et en persan (fa) sont tout de même générées dans le dépôt de publication ; elles peuvent ne pas apparaître dans ce sélecteur tant que Mintlify ne prend pas en charge ces codes.

    Thèmes d’apparence

    Le panneau Appearance comprend les thèmes Claw, Knot et Dash intégrés (Claw est le thème par défaut), ainsi qu’un emplacement d’importation tweakcn local au navigateur. Pour importer un thème, ouvrez l’éditeur tweakcn, choisissez ou créez un thème, cliquez sur Share, puis collez le lien copié dans Appearance. L’outil d’importation accepte également les URL de registre https://tweakcn.com/r/themes/<id>, les URL d’éditeur comme https://tweakcn.com/editor/theme?theme=amethyst-haze, les chemins relatifs /themes/<id>, les ID de thème bruts et les noms de thèmes par défaut tels que amethyst-haze.

    Les thèmes importés sont uniquement stockés dans le profil de navigateur actuel ; ils ne sont pas écrits dans la configuration du Gateway et ne sont pas synchronisés entre les appareils. Le remplacement du thème importé met à jour l’unique emplacement local ; sa suppression réactive Claw si le thème importé était actif.

    Appearance comprend également un paramètre Text size local au navigateur, stocké avec les autres préférences de l’interface de contrôle. Il s’applique au texte des discussions, au texte du champ de rédaction, aux cartes d’outils et aux barres latérales des discussions, et maintient les champs de saisie à au moins 16px afin que Safari mobile n’effectue pas de zoom automatique lors de la sélection.

    Gérer les Plugins

    Ouvrez Plugins dans la barre latérale, ou utilisez /settings/plugins relativement au chemin de base configuré de l’interface de contrôle, pour parcourir et gérer les Plugins sans quitter l’interface de contrôle. Par exemple, avec un chemin de base /openclaw, utilisez /openclaw/settings/plugins. La page est toujours disponible, même lorsque tous les Plugins facultatifs sont désactivés.

    Plugins est un centre comportant quatre onglets : Installed et Discover gèrent le code des Plugins dans /settings/plugins, Skills héberge le gestionnaire de Skills par agent dans /skills, et Workshop héberge l’examen des propositions de Skill Workshop dans /skills/workshop. Chaque onglet conserve sa propre URL, et la barre latérale affiche une seule entrée Plugins pour chacun d’eux.

    L’onglet Installed affiche l’inventaire local complet regroupé par catégorie, avec des totaux récapitulatifs. Chaque ligne ouvre une vue détaillée ; son menu supplémentaire () permet d’activer ou de désactiver le Plugin et propose Remove pour les Plugins installés depuis l’extérieur. Il répertorie également les serveurs MCP configurés et permet de les ajouter, de les désactiver et de les supprimer directement. L’onglet Discover constitue la boutique : Plugins en vedette inclus avec OpenClaw, Plugins externes officiels et connecteurs MCP en un clic pour les services populaires. La saisie dans le champ de recherche interroge ClawHub directement et ajoute une section From ClawHub avec le nombre de téléchargements et des badges de vérification de la source. Les liens profonds peuvent cibler directement la boutique avec /settings/plugins?tab=discover.

    L’onglet Skills conserve le rapport d’état des Skills, les commutateurs d’activation/désactivation, la saisie de clé d’API et la recherche de Skills ClawHub intégrée, le tout limité à l’agent sélectionné. L’onglet Workshop conserve le tableau Skill Workshop et le flux d’examen Today pour les propositions de Skills.

    Les Plugins inclus sont déjà présents sur le Gateway et affichent Enable ou Disable au lieu de Install. Par exemple, Workboard est inclus avec OpenClaw mais désactivé par défaut ; son action est donc Enable. Les Plugins groupés ne peuvent pas être supprimés, seulement désactivés.

    La lecture du catalogue et la recherche sur ClawHub nécessitent operator.read. Installer, activer, désactiver ou supprimer un Plugin, ainsi que modifier les serveurs MCP, nécessite operator.admin ; ces actions restent désactivées pour les opérateurs en lecture seule.

    Les installations depuis ClawHub passent par le Gateway et conservent les mêmes contrôles de confiance, d’intégrité et de stratégie d’installation des Plugins que les autres installations gérées par le Gateway. L’installation ou la suppression du code d’un Plugin nécessite un redémarrage du Gateway. L’activation ou la désactivation d’un Plugin installé peut s’appliquer sans redémarrage lorsque le Plugin et l’environnement d’exécution actuel du Gateway le permettent ; sinon, l’interface utilisateur indique qu’un redémarrage est nécessaire. Les connecteurs MCP reposant sur OAuth nécessitent une exécution unique de openclaw mcp login <name> depuis la CLI après leur ajout.

    La page se concentre volontairement sur l’inventaire, la découverte, l’installation, l’activation et la suppression. Utilisez openclaw plugins pour les sources npm, git ou par chemin local arbitraires, les mises à jour et la configuration avancée des Plugins.

    La barre latérale épingle la navigation au-dessus d’une liste de sessions défilante. Dans les configurations multi-agents, chaque agent apparaît comme une section principale repliable ; développer un agent permet de parcourir ses sessions sans quitter le chat ouvert, et les agents repliés affichent un indicateur de messages non lus. Au sein d’un agent, la liste est divisée en Épinglées, une section intégrée pour chaque canal connecté (Telegram, Slack, WhatsApp, ...), une section intégrée Travail pour les sessions liées à un worktree géré ou à un nœud d’exécution (les lignes affichent une ligne repo ⎇ branch ainsi que l’hôte du nœud), des groupes personnalisés (la category de la session) et Chats pour le reste. Les sections de canaux et Travail classent automatiquement les lignes ; l’affectation d’une session à un groupe personnalisé prévaut toujours. L’ouverture d’une session déplace la surbrillance de sélection sans réordonner les lignes. Les sessions ayant enregistré une nouvelle activité depuis leur dernière lecture affichent un point de non-lecture, et leur ouverture les marque comme lues. Chaque ligne de session possède un menu contextuel (bouton à trois points verticaux ou clic droit) comprenant Épingler/Désépingler, Marquer comme non lue/lue, Renommer, Dupliquer, Déplacer vers un groupe (y compris Nouveau groupe et Retirer du groupe), Archiver et Supprimer ; sur les interfaces tactiles, les commandes directes d’épinglage et de menu restent visibles. Un Cmd/Ctrl-clic ajoute ou retire des lignes d’une sélection multiple, tandis qu’un Maj-clic étend celle-ci selon l’ordre visible ; ouvrir ensuite le menu sur une ligne sélectionnée propose des actions groupées (Marquer N comme non lues/lues, Déplacer N vers un groupe, Archiver N, Supprimer N) qui s’appliquent à toutes les sessions sélectionnées, avec une seule confirmation pour la suppression groupée. Faites glisser une session sur un groupe personnalisé ou Chats pour la déplacer. Les en-têtes des groupes personnalisés peuvent être repliés, développés ou déplacés pour les réordonner ; les noms et l’ordre des groupes sont stockés dans le Gateway (sessions.groups.*) et vous suivent donc d’un navigateur à l’autre, tandis que leur état replié reste dans le profil du navigateur. Les en-têtes de groupe possèdent également un menu (bouton à trois points verticaux ou clic droit) comprenant Renommer le groupe, Nouveau groupe et Supprimer le groupe ; renommer ou supprimer un groupe met à jour côté serveur toutes les sessions qui en sont membres, y compris celles archivées, et la suppression d’un groupe conserve ses sessions en les replaçant dans Chats. L’unique bouton + de l’en-tête de la liste des sessions ouvre la page Nouvelle session (voir ci-dessous). La commande de tri comprend également une option Regrouper par : Groupé (par défaut) ou Aucun pour obtenir une seule liste à plat (les sessions Épinglées restent séparées) ; ce choix est stocké dans le profil de navigateur actuel. Utilisation, Automatisations et Plugins sont épinglés par défaut ; développez Plus pour accéder à toutes les autres destinations. Sélectionnez Modifier les éléments épinglés sous Plus, ou cliquez avec le bouton droit sur la zone de navigation, pour épingler ou désépingler des destinations et restaurer les valeurs par défaut. L’ensemble des éléments épinglés et l’état de développement de Plus sont stockés dans le profil de navigateur actuel et persistent après les rechargements.

    Page Nouvelle session

    Le bouton + dans l’en-tête de la liste des sessions de la barre latérale ouvre un brouillon en pleine page à l’adresse /new : rien n’est créé avant l’envoi du premier message. Une ligne de destination au-dessus de la zone de message permet de choisir où la session travaille : l’agent (dans les configurations multi-agents), l’emplacement d’exécution (Gateway · local ou un nœud appairé exposant system.run ; nécessite operator.admin), le dossier (par défaut, l’espace de travail de l’agent ; les autres chemins absolus du Gateway nécessitent operator.admin et un worktree), ainsi qu’une option facultative Worktree avec un sélecteur de branche de base (alimenté par worktrees.branches, de sorte qu’aucune récupération n’a lieu) et un nom de worktree facultatif (la branche devient openclaw/<name>). Le bouton de navigation de la puce du dossier ouvre un sélecteur de répertoire intégré, alimenté par la méthode fs.listDir réservée aux administrateurs. Son niveau supérieur affiche le Gateway et chaque nœud connu ; les nœuds hors ligne et ceux qui ne prennent pas en charge la navigation dans les répertoires restent visibles, mais désactivés. La sélection du Gateway démarre depuis le dossier actuel ou le répertoire personnel du Gateway. La sélection d’un nœud compatible permet de parcourir le système de fichiers de son hôte, y lie l’exécution et utilise directement le chemin absolu sélectionné sur ce nœud (les worktrees gérés restent réservés au Gateway). L’envoi appelle sessions.create avec le premier message, de sorte que l’exécution démarre dans le même aller-retour et que l’interface bascule vers le chat de la nouvelle session. Si le Gateway crée la session mais refuse ce premier envoi, le chat conserve l’invite et l’erreur après les rechargements ; Réessayer l’envoie via la session déjà créée au lieu d’en créer une autre.

    Dans Paramètres, la barre latérale dédiée commence par un champ Rechercher dans les paramètres permettant de trouver rapidement les sections de paramètres.

    Un champ Rechercher en haut de la barre latérale ouvre la palette de commandes (⌘K). Cliquer sur la marque OpenClaw dans l’en-tête de la barre latérale ouvre l’écran initial épuré Nouvelle session. Lorsqu’un élément nécessite une intervention — tâches Cron échouées ou en retard, authentification du modèle arrivant à expiration ou expirée — des pastilles d’attention compactes apparaissent au-dessus du pied de la barre latérale et permettent d’accéder à la page concernée. Le pied compact regroupe l’état de la connexion, Paramètres, Documentation, l’appairage mobile et le sélecteur de mode de couleur clair/sombre/système ; lorsque le Gateway s’exécute depuis une copie de travail des sources sur une branche autre que main, le pied affiche également le nom de cette branche en rouge afin qu’un Gateway hors version publiée soit immédiatement identifiable (les installations de versions publiées ne l’affichent jamais). Maj-Commande-Virgule ouvre les Paramètres sans remplacer le raccourci Commande-Virgule du navigateur. L’en-tête de la barre latérale contient également la commande de réduction (⌘B) ; la réduction masque entièrement la barre latérale pour offrir un espace de travail en pleine largeur, et une commande de développement flottante (ou ⌘B) la rétablit ; l’application macOS héberge plutôt cette commande nativement dans la barre de titre. La barre latérale est le seul élément de navigation sur ordinateur, sans barre supérieure. Sur les fenêtres étroites, la barre latérale est remplacée par un tiroir superposé derrière une ligne d’en-tête compacte contenant la commande du tiroir, la marque et la recherche dans la palette de commandes ; dans l’application macOS, cette ligne d’en-tête intègre le dégagement de la barre de titre dans une unique bande compacte à côté des commandes de la fenêtre. La navigation utilise l’historique standard du navigateur, de sorte que ses boutons précédent/suivant permettent de la parcourir ; l’application macOS ajoute une commande native de barre latérale à côté des commandes de la fenêtre ainsi que des gestes de balayage sur le pavé tactile, avec des boutons précédent/suivant sur le bord droit de la barre latérale lorsqu’elle est développée, et des boutons natifs de recherche (palette de commandes) et de nouvelle session lorsqu’elle est repliée.

    Fonctionnalités actuelles

    Chat et conversation
    • Discutez avec le modèle via le WebSocket du Gateway (chat.history, chat.send, chat.abort, chat.inject).
    • Les actualisations de l’historique du chat demandent une fenêtre récente limitée avec des plafonds de texte par message, afin que les longues sessions n’obligent pas le navigateur à afficher la totalité de la transcription avant que le chat soit utilisable.
    • Le survol ou la sélection au clavier d’un lien public vers une demande d’extraction ou un ticket GitHub affiche son état, son titre, son auteur, son activité récente, ses commentaires et ses statistiques de modifications. Le Gateway connecté récupère et met en cache les métadonnées publiques sans modifier la destination du lien, y compris lorsque l’interface utilise un Gateway distant. Le Gateway utilise GH_TOKEN ou GITHUB_TOKEN lorsqu’ils sont disponibles, après avoir confirmé que le dépôt est public ; sinon, il utilise l’API anonyme de GitHub avec une durée de cache plus longue.
    • Conversez au moyen de sessions en temps réel dans le navigateur. OpenAI utilise directement WebRTC, Google Live utilise sur WebSocket un jeton de navigateur à usage unique et à portée limitée, et les plugins vocaux en temps réel réservés au back-end utilisent le transport relais du Gateway. Les sessions dont le fournisseur est géré par le client démarrent avec talk.client.create ; les sessions relayées par le Gateway démarrent avec talk.session.create. Le relais conserve les identifiants du fournisseur sur le Gateway tandis que le navigateur diffuse le flux PCM du microphone via talk.session.appendAudio, transmet les appels d’outils du fournisseur openclaw_agent_consult via talk.client.toolCall afin d’appliquer la politique du Gateway et d’utiliser le modèle OpenClaw configuré de plus grande capacité, et achemine le pilotage vocal d’une exécution active via talk.client.steer ou talk.session.steer.
    • Diffusez les appels d’outils et les cartes de sortie en direct des outils dans le Chat (événements de l’agent). L’activité des outils s’affiche sous forme de lignes adaptées à leur type : les commandes shell affichent la commande avec coloration syntaxique et une sortie de style terminal ; les appels de modification et d’écriture pris en charge affichent des différences intégrées et limitées, les numéros de ligne lorsqu’ils sont disponibles et des statistiques +added -removed ; les appels consécutifs sont regroupés dans un résumé tel que « 13 commandes exécutées, 6 fichiers lus, 9 fichiers modifiés ». Pendant une exécution en direct, l’appel en cours le plus récent donne son nom à l’en-tête du groupe. Développez une ligne pour examiner ses arguments restants et sa sortie brute.
    • Titres facultatifs générés par l’IA pour préciser l’objectif des appels d’outils complexes (longues commandes shell, outils de plugins comportant de nombreux arguments), activés avec gateway.controlUi.toolTitles: true (désactivés par défaut). Les titres proviennent de la méthode groupée chat.toolTitles au moyen du routage standard des modèles utilitaires — un utilityModel explicite (fournisseur choisi par l’opérateur, comme pour les autres tâches utilitaires), ou à défaut le petit modèle déclaré par défaut par le fournisseur de la session — et sont mis en cache côté Gateway pour chaque agent. Lorsque cette option facultative est désactivée ou qu’aucun modèle économique n’est utilisable, les lignes conservent leurs libellés déterministes et aucun appel de modèle n’est effectué.
    • Lancez ou ignorez les tâches de suivi éphémères suggérées par le modèle ; les suggestions acceptées ouvrent une nouvelle session de worktree géré avec l’invite proposée.
    • Onglet Activité proposant des résumés de l’activité en direct des outils, stockés localement dans le navigateur et privilégiant la suppression des données sensibles, à partir de la diffusion existante des événements session.tool et des outils.
    Canaux, sessions et mémoire
    • Canaux : état des canaux intégrés et des canaux de plugins groupés/externes, connexion par code QR et configuration par canal (channels.status, web.login.*, config.patch).
    • Les actualisations des sondes de canaux conservent l’instantané précédent visible pendant l’exécution des vérifications lentes des fournisseurs, et signalent les instantanés partiels lorsqu’une sonde ou un audit dépasse le temps imparti par l’interface.
    • Sessions : répertorier par défaut les sessions des agents configurés, épingler les sessions fréquentes, les renommer, archiver ou restaurer les sessions inactives, se rabattre depuis les clés de session obsolètes d’agents non configurés et appliquer des réglages prioritaires par session pour le modèle/la réflexion/le mode rapide/le mode détaillé/la trace/le raisonnement (sessions.list, sessions.patch). Les sessions épinglées sont triées au-dessus des sessions récentes non épinglées ; les sessions archivées figurent dans la vue des archives de la page Sessions et conservent leurs transcriptions. Les lignes affichent un point de non-lecture pour les sessions ayant enregistré une activité depuis leur dernière lecture, avec des actions permettant de les marquer comme non lues ou lues (sessions.patch { unread }), ainsi qu’une action Dupliquer qui crée une nouvelle branche de la transcription dans une nouvelle session (sessions.create { parentSessionKey, fork: true }). Les vignettes d’aperçu au-dessus du tableau résument l’ensemble chargé (nombre de sessions, exécutions en direct, sessions non lues, nombre total de jetons) ; chaque ligne comporte un pictogramme de type accompagné d’un point d’exécution en direct, l’état s’affiche sous forme d’un simple point avec un libellé, et la colonne Jetons affiche une jauge d’utilisation de la fenêtre de contexte lorsque la session indique le nombre de jetons et la taille du contexte. Les actions de gestion des lignes se trouvent dans un menu propre à chacune d’elles (bouton à trois points verticaux ou clic droit), qui reprend le menu de session de la barre latérale, et le volet de la ligne affiche l’environnement d’exécution de l’agent et la durée de l’exécution avec les autres détails de la session.
    • Regroupement des sessions : une commande Regrouper par organise le tableau des sessions en sections selon les groupes personnalisés, le canal, le type, l’agent ou la date. Les groupes personnalisés sont conservés pour chaque session via sessions.patch (category), de sorte que les sessions démarrées depuis les canaux de messagerie (Discord, Telegram, WhatsApp, ...) puissent également être classées ; affectez des groupes en faisant glisser des lignes sur une section ou à l’aide du sélecteur de groupe propre à chaque ligne, et créez des groupes avec l’action Nouveau groupe.
    • Mémoire (un onglet de la page Agents, limité à l’agent sélectionné) : état de Dreaming, option d’activation/désactivation et lecteur du Journal des rêves (doctor.memory.status, doctor.memory.dreamDiary, config.patch).
    Cron, tâches, plugins, skills, appareils, approbations d’exécution
    • Automatisations (tâches cron) : cartes de statistiques (nombre d’automatisations, nombre d’échecs, état du planificateur, prochain réveil) au-dessus d’un sélecteur d’onglets Automatisations/Historique des exécutions ; l’onglet Automatisations répertorie les tâches dans un tableau filtrable (Toutes/Actives/En pause, recherche, filtres de planification et de dernière exécution, menu d’actions par ligne) avec des suggestions de démarrage en dessous, tandis que l’onglet Historique des exécutions affiche les exécutions récentes de toutes les automatisations (cron.*).
    • Tâches : registre en direct des tâches d’arrière-plan actives et récentes, avec sessions liées et possibilité d’annulation (tasks.*).
    • Plugins : parcourez l’inventaire installé et la boutique sélectionnée, recherchez dans ClawHub, installez et supprimez du code de plugin, et activez ou désactivez les plugins installés (plugins.*) ; les lignes des serveurs MCP modifient mcp.servers au moyen des méthodes de configuration.
    • Skills : état, activation/désactivation, installation, mises à jour des clés d’API (skills.*).
    • Appareils : un inventaire unique réunit les enregistrements d’appareils appairés, le catalogue de nœuds et la présence en direct (device.pair.list, node.list, system-presence). L’hôte du Gateway est épinglé en premier ; les clients appairés affichent l’état de la connexion, les rôles, les jetons, les capacités et les commandes. Les appairages en double sont regroupés dans un groupe extensible, et Nettoyer N éléments obsolètes supprime en masse, après confirmation de l’administrateur, les doublons hors ligne qui ont été approuvés automatiquement (local silencieux, CIDR de confiance ou vérification SSH) ou qui sont antérieurs à la provenance des approbations. Les entrées peuvent être supprimées (node.pair.remove, device.pair.remove), l’appairage des appareils et les nouvelles approbations des nœuds sont gérés directement (device.pair.*, node.pair.approve/reject), et les codes de configuration mobile sont créés depuis la même carte.
    • Approbations d’exécution : modifiez les listes d’autorisation du Gateway ou des nœuds, ainsi que la politique de demande pour exec host=gateway/node (exec.approvals.*).
    Configuration
    • Consultez/modifiez ~/.openclaw/openclaw.json (config.get, config.set).
    • Profil : page de paramètres affichant l’identité de l’agent par défaut ainsi que les statistiques d’utilisation cumulées — jetons sur toute la durée de vie, journée de pointe, session la plus longue, séries d’activité, carte thermique des jetons sur un an, principaux outils et points forts des canaux (usage.cost, sessions.usage).
    • MCP dispose d’une page de paramètres dédiée comprenant des lignes de serveurs en lecture seule (transport, activation, résumés OAuth/filtres/parallélisme), des commandes courantes pour les opérateurs et l’éditeur de configuration mcp limité à cette section ; l’ajout, l’activation/désactivation et la suppression des serveurs s’effectuent sur la page Plugins.
    • Fournisseurs de modèles : page de paramètres répertoriant chaque fournisseur de modèles configuré avec son icône de marque, son état d’authentification (models.authStatus), la disponibilité des modèles (models.list), les données en direct sur le forfait, les quotas et la facturation lorsque le fournisseur les communique (usage.status), ainsi que les dépenses des sessions locales au cours des 30 derniers jours (sessions.usage). Une action Actualiser relit l’état des identifiants et l’utilisation du fournisseur.
    • Connexion : page de paramètres (sous Connexions) qui gère la propre liaison du tableau de bord au Gateway — URL WebSocket, jeton du Gateway, mot de passe et clé de session par défaut — ainsi que le dernier instantané de la poignée de main (état, durée de fonctionnement, intervalle des battements, dernière actualisation des canaux). L’écran de connexion hors ligne gère le cas de déconnexion ; cette page modifie la connexion lorsqu’elle est établie.
    • Appliquez et redémarrez avec validation (config.apply), puis réveillez la dernière session active.
    • Les écritures incluent une protection par hachage de base afin d’éviter d’écraser des modifications simultanées.
    • Les écritures (config.set/config.apply/config.patch) vérifient au préalable la résolution des SecretRef actives pour les références présentes dans la charge utile de configuration envoyée ; les références actives envoyées qui ne peuvent pas être résolues sont rejetées avant l’écriture.
    • Les enregistrements de formulaires ignorent les espaces réservés masqués devenus obsolètes qui ne peuvent pas être restaurés depuis la configuration enregistrée, tout en conservant les valeurs masquées qui correspondent encore à des secrets enregistrés.
    • Le schéma et le rendu du formulaire proviennent de config.schema / config.schema.lookup, notamment les champs title/description, les indications d’interface correspondantes, les résumés des enfants immédiats, les métadonnées de documentation sur les nœuds imbriqués de type objet/joker/tableau/composition, ainsi que les schémas des plugins et des canaux lorsqu’ils sont disponibles. L’éditeur JSON brut est disponible uniquement lorsque l’instantané permet un aller-retour brut sûr ; sinon, l’interface de contrôle impose le mode Formulaire.
    • Dans l’éditeur JSON brut, « Réinitialiser à la version enregistrée » préserve la structure créée en mode brut (mise en forme, commentaires, disposition de $include) au lieu de restituer un instantané aplati, afin que les modifications externes survivent à une réinitialisation lorsque l’instantané permet un aller-retour sûr.
    • Les valeurs d’objet SecretRef structurées sont affichées en lecture seule dans les champs de texte du formulaire afin d’éviter toute corruption accidentelle lors de la conversion d’un objet en chaîne.
    Utilisation
    • L’analyse des jetons et des coûts estimés dérivée des sessions reste distincte de la facturation des fournisseurs.
    • Les cartes des fournisseurs appellent usage.status et affichent en direct les noms des forfaits, les fenêtres de quota, les soldes, les dépenses et les budgets communiqués par les plugins de fournisseurs configurés.
    • Une erreur d’utilisation d’un fournisseur ne bloque pas le tableau de bord des sessions et des coûts ; les cartes des fournisseurs indisponibles affichent leur propre état d’erreur.
    Débogage, journaux, mise à jour
    • Débogage : instantanés de l’état, de l’intégrité et des modèles, journal des événements et appels RPC manuels (status, health, models.list).
    • Le journal des événements comprend les durées d’actualisation et des appels RPC de l’interface de contrôle, les durées de rendu lentes du chat et de la configuration, ainsi que des entrées sur la réactivité du navigateur pour les longues trames d’animation ou les tâches longues lorsque le navigateur expose ces types d’entrées PerformanceObserver.
    • Journaux : suivi en direct des journaux de fichiers du Gateway avec filtrage/exportation (logs.tail).
    • Mise à jour : exécutez une mise à jour du paquet ou de Git suivie d’un redémarrage (update.run) avec un rapport de redémarrage, puis interrogez update.status après la reconnexion afin de vérifier la version du Gateway en cours d’exécution.
    Remarques sur le panneau des automatisations
    • La sélection d’une ligne ouvre une vue détaillée en pleine page avec un commutateur Actif/En pause et Exécuter maintenant dans l’en-tête (exécuter si l’échéance est atteinte, cloner et supprimer dans son menu) ; l’onglet Paramètres permet de modifier l’automatisation directement (invite, détails, fréquence, remplacements avancés), tandis que l’onglet Historique des exécutions affiche les exécutions de cette automatisation.
    • Les automatisations de démarrage situées sous le tableau préremplissent le formulaire de création avec une invite et une planification modifiables.
    • Pour les tâches isolées, la livraison utilise par défaut l’annonce d’un résumé ; choisissez aucune pour les exécutions strictement internes.
    • Les champs de canal et de cible apparaissent lorsque l’annonce est sélectionnée.
    • Le mode Webhook utilise delivery.mode = "webhook" avec delivery.to défini sur une URL de Webhook HTTP(S) valide.
    • Pour les tâches de la session principale, les modes de livraison Webhook et aucune sont disponibles.
    • Les contrôles de modification avancés comprennent la suppression après l’exécution, l’effacement du remplacement de l’agent, les options cron exactes/décalées, les remplacements du modèle et du niveau de réflexion de l’agent, ainsi que les commutateurs de livraison au mieux.
    • La validation du formulaire s’effectue directement avec des erreurs au niveau des champs ; les valeurs non valides désactivent le bouton d’enregistrement jusqu’à leur correction.
    • Définissez cron.webhookToken pour envoyer un jeton Bearer dédié ; s’il est omis, le Webhook est envoyé sans en-tête d’authentification.
    • cron.webhook est une solution de repli héritée et obsolète : exécutez openclaw doctor --fix pour migrer les tâches enregistrées qui utilisent encore notify: true vers une livraison Webhook explicite par tâche ou une livraison à l’achèvement.

    Page MCP

    La page MCP dédiée est une vue destinée aux opérateurs pour les serveurs MCP gérés par OpenClaw sous mcp.servers. Elle ne démarre pas elle-même les transports MCP ; utilisez-la pour examiner et modifier la configuration enregistrée, puis utilisez openclaw mcp doctor --probe lorsque vous avez besoin d’une preuve du fonctionnement du serveur en direct.

    Flux de travail type :

    1. Ouvrez MCP dans la barre latérale.
    2. Consultez les cartes récapitulatives indiquant le nombre total de serveurs, ainsi que le nombre de serveurs activés, OAuth et filtrés.
    3. Examinez chaque ligne de serveur pour connaître le transport, l’activation, l’authentification, les filtres, les délais d’expiration et les indications de commande.
    4. Gérez les serveurs (ajout, activation/désactivation, suppression) sur la page Plugins, qui est l’unique interface interactive écrivant dans mcp.servers ; la liste des lignes ici contient un lien vers cette page.
    5. Modifiez la section de configuration mcp limitée aux définitions des serveurs, aux en-têtes, aux chemins TLS/mTLS, aux métadonnées OAuth, aux filtres d’outils et aux métadonnées de projection Codex.
    6. Utilisez Enregistrer pour écrire la configuration, ou Enregistrer et publier lorsque le Gateway en cours d’exécution doit appliquer la configuration modifiée.
    7. Exécutez openclaw mcp status --verbose, openclaw mcp doctor --probe ou openclaw mcp reload depuis un terminal pour obtenir respectivement des diagnostics statiques, une preuve en direct ou la suppression du cache d’exécution.

    La page masque les valeurs de type URL contenant des identifiants avant leur affichage et place les noms de serveurs entre guillemets dans les extraits de commandes, afin que les commandes copiées continuent de fonctionner avec des espaces ou des métacaractères d’interpréteur de commandes. Référence complète de la CLI et de la configuration : MCP.

    Onglet Activité

    L’onglet Activité se trouve dans Paramètres › Système, à côté de Journaux et Débogage. Il s’agit d’un observateur éphémère et local au navigateur pour l’activité en direct des outils, dérivé du même flux d’événements Gateway session.tool / d’outils qui alimente les cartes d’outils du chat. Il n’ajoute aucune autre famille d’événements du Gateway, aucun point de terminaison, aucun stockage durable de l’activité, aucun flux de métriques ni aucun flux d’observation externe.

    Les entrées d’activité ne conservent que des résumés nettoyés et des aperçus de sortie masqués et tronqués. Les valeurs des arguments des outils ne sont pas stockées dans l’état de l’activité ; l’interface indique que les arguments sont masqués et enregistre uniquement le nombre de champs d’arguments. La liste en mémoire est liée à l’onglet actuel du navigateur, survit à la navigation dans l’interface de contrôle et est réinitialisée lors du rechargement de la page, du changement de session ou de l’utilisation de Effacer.

    Terminal de l’opérateur

    Le terminal ancrable de l’opérateur est désactivé par défaut. Pour l’activer, définissez gateway.terminal.enabled: true et redémarrez le Gateway. Le terminal nécessite une connexion operator.admin et ouvre un PTY de l’hôte dans l’espace de travail de l’agent actif. Les nouveaux onglets suivent l’agent de chat actuellement sélectionné.

    Utilisez Ctrl + accent grave pour afficher ou masquer le panneau. La disposition prend en charge l’ancrage en bas et à droite, s’adapte à la fenêtre d’affichage du navigateur et conserve plusieurs onglets d’interpréteur de commandes. Consultez la configuration du Gateway pour gateway.terminal.enabled et le remplacement facultatif gateway.terminal.shell.

    Les sessions survivent aux déconnexions : un rechargement de page, la mise en veille de l’ordinateur portable ou une brève interruption réseau détache la session sur le Gateway au lieu de l’arrêter, et le même onglet du navigateur s’y rattache lors de la reconnexion avec la sortie récente relue. Les sessions détachées sont arrêtées après gateway.terminal.detachedSessionTimeoutSeconds (300 secondes par défaut ; 0 rétablit l’arrêt lors de la déconnexion). terminal.list affiche les sessions auxquelles il est possible de se rattacher, terminal.attach en adopte une (prise de contrôle à la manière de tmux) et terminal.text lit la sortie récente d’une session sous forme de texte brut sans s’y rattacher — une fonctionnalité destinée aux agents et aux outils.

    Le terminal est également disponible sous la forme d’un document plein écran consacré exclusivement au terminal à l’adresse /?view=terminal. Les applications iOS et Android intègrent cette page dans leurs écrans Terminal en réutilisant les identifiants enregistrés du Gateway ; la disponibilité dépend des mêmes conditions gateway.terminal.enabled et operator.admin, et la page affiche un avis lorsque le Gateway connecté ne propose pas le terminal.

    Panneau du navigateur

    L’interface de contrôle fournit un panneau de navigateur ancrable qui affiche le navigateur contrôlé par le Gateway (le même que celui piloté par les agents au moyen de l’outil de navigateur) dans n’importe quel navigateur Web standard — aucune vue Web native n’est nécessaire. Il apparaît lorsque le Gateway connecté annonce browser.request à une connexion operator.admin ; le bouton en forme de globe dans la barre latérale de l’espace de travail de la session permet de l’afficher ou de le masquer. Le panneau affiche un instantané en direct de la page avec des onglets, une barre d’URL modifiable, les commandes précédent/suivant/recharger et l’ouverture dans votre navigateur ; il peut être ancré à droite ou en bas et transmet les clics, le défilement à la molette et la saisie de texte simple à la page distante.

    Deux modes de capture regroupent le contexte de la page pour l’agent :

    • Annoter (crayon) : dessinez des annotations à main levée sur la page. Envoyer au chat intègre les traits à la capture d’écran, joint l’image à la zone de rédaction du chat actif et préremplit une invite décrivant l’URL et le titre de la page, ainsi que chaque zone marquée, afin que l’agent sache exactement ce que vous avez entouré.
    • Inspecter (pointeur) : survolez un élément pour afficher ses informations (sélecteur, nom accessible, rôle, taille) ; cliquez pour envoyer les détails de cet élément ainsi qu’une capture d’écran où il est mis en évidence, via le même flux de rédaction. L’inspection, le défilement à la molette et la navigation arrière/avant nécessitent browser.evaluateEnabled (activé par défaut).

    L’application macOS conserve sa barre latérale native de navigation des liens pour les liens ouverts depuis le tableau de bord ; le panneau du navigateur y fonctionne également et permet d’annoter des pages sur toutes les autres plateformes.

    Comportement du chat

    Send and history semantics
    • chat.send est non bloquant : il envoie immédiatement un accusé de réception avec { runId, status: "started" }, puis la réponse est diffusée via les événements chat. Les clients Control UI de confiance peuvent également recevoir des métadonnées facultatives sur le délai d'accusé de réception à des fins de diagnostic local.
    • Les téléversements dans le chat acceptent les images ainsi que les fichiers non vidéo. Les images conservent leur chemin d'image natif ; les autres fichiers sont stockés comme médias gérés et affichés dans l'historique sous forme de liens vers des pièces jointes.
    • Un nouvel envoi avec le même idempotencyKey renvoie { status: "in_flight" } pendant l'exécution, puis { status: "ok" } une fois celle-ci terminée.
    • La taille des réponses chat.history est limitée pour garantir la sécurité de l'interface utilisateur. Lorsque les entrées de transcription sont trop volumineuses, le Gateway peut tronquer les longs champs de texte, omettre les blocs de métadonnées lourds et remplacer les messages surdimensionnés par un espace réservé ([chat.history omitted: message too large]).
    • Lorsqu'un message visible de l'assistant a été tronqué dans chat.history, le lecteur latéral peut récupérer à la demande l'entrée complète de la transcription normalisée pour l'affichage via chat.message.get, à partir de sessionKey, de la agentId active si nécessaire et de la messageId de transcription. Si le Gateway ne peut toujours pas en renvoyer davantage, le lecteur affiche explicitement un état d'indisponibilité au lieu de répéter silencieusement l'aperçu tronqué.
    • Les images générées ou produites par l'assistant sont conservées sous forme de références à des médias gérés et resservies via des URL de médias authentifiées du Gateway ; les rechargements ne dépendent donc pas de la présence persistante des charges utiles d'image base64 brutes dans la réponse de l'historique du chat.
    • Lors du rendu de chat.history, la Control UI supprime du texte visible de l'assistant les balises de directive intégrées destinées uniquement à l'affichage (par exemple [[reply_to_*]] et [[audio_as_voice]]), les charges utiles XML d'appel d'outil en texte brut (notamment <tool_call>...</tool_call>, <function_call>...</function_call>, <tool_calls>...</tool_calls>, <function_calls>...</function_calls> et les blocs d'appel d'outil tronqués), ainsi que les jetons de contrôle du modèle ASCII ou pleine chasse qui ont fuité. Elle omet les entrées de l'assistant dont l'intégralité du texte visible se réduit au jeton silencieux exact NO_REPLY / no_reply ou au jeton d'accusé de réception du Heartbeat HEARTBEAT_OK.
    • Pendant un envoi actif et l'actualisation finale de l'historique, la vue du chat maintient visibles les messages utilisateur et assistant optimistes locaux si chat.history renvoie brièvement un instantané plus ancien ; la transcription canonique remplace ces messages locaux dès que l'historique du Gateway est à jour.
    • Les événements chat en direct représentent l'état de livraison, tandis que chat.history est reconstruit à partir de la transcription durable de la session. Après les événements finaux d'outil, la Control UI recharge l'historique et ne fusionne qu'une petite fin optimiste ; la limite de la transcription est documentée dans WebChat.
    • chat.inject ajoute une note de l'assistant à la transcription de la session et diffuse un événement chat pour les mises à jour de l'interface utilisateur uniquement (aucune exécution d'agent, aucune livraison sur un canal).
    • La barre latérale répertorie chaque session active chargée, par section d'agent et dans les catégories épinglées/canal/travail/personnalisées/Chats, avec une seule action Nouvelle session qui ouvre la boîte de dialogue de brouillon. L'ouverture d'une ligne visible déplace uniquement la surbrillance. Les groupes personnalisés sont repliables et réorganisables par glisser-déposer, et les sessions peuvent être déposées dans un groupe ou dans Chats ; les noms et l'ordre des groupes sont synchronisés via le Gateway, tandis que leur état replié reste enregistré dans le navigateur. Une nouvelle session du tableau de bord reçoit de façon asynchrone un titre généré concis à partir de son premier message qui n'est pas une commande ; les noms explicites ne sont jamais remplacés. Définissez agents.defaults.utilityModel (ou agents.list[].utilityModel) pour acheminer cet appel de modèle distinct vers un modèle moins coûteux. Le développement de la section d'un autre agent permet de parcourir les sessions de cet agent sans quitter le chat ouvert.
    • La recherche de sessions se trouve dans la palette de commandes (⌘K ou le champ Recherche en haut de la barre latérale) : la saisie d'une requête parcourt un nombre limité de pages correspondantes parmi les agents, filtre les lignes internes enfants/Cron et répertorie les correspondances visibles à côté des commandes de navigation. La page Sessions conserve la liste exhaustive consultable avec des filtres.
    • Chaque ligne de la barre latérale conserve un accès direct à l'épinglage ainsi qu'un menu contextuel complet pour l'état non lu, le renommage, la duplication, le regroupement, l'archivage et la suppression. Les lignes sélectionnées simultanément (Cmd/Ctrl-clic, Maj-clic pour les plages) disposent d'un menu d'actions groupées couvrant l'état non lu, le regroupement, l'archivage et la suppression ; l'archivage et la suppression groupés restent désactivés sauf si toutes les sessions sélectionnées peuvent être archivées. Une exécution active et la session principale d'un agent ne peuvent pas être archivées. L'archivage ou la suppression de la session actuellement sélectionnée fait revenir le chat à la session principale de cet agent.
    • Dans l'application macOS, la marque OpenClaw utilise la bande autrement vide de la barre de titre native, à côté des commandes de la fenêtre, au lieu d'occuper une ligne de la barre latérale.
    • Sur les largeurs d'écran de bureau, les commandes du chat restent sur une seule ligne compacte et se replient lors du défilement vers le bas dans la transcription ; le défilement vers le haut, le retour au début ou l'arrivée à la fin rétablit les commandes.
    • Les messages consécutifs identiques composés uniquement de texte s'affichent dans une seule bulle avec un badge indiquant leur nombre. Les messages contenant des images, des pièces jointes, une sortie d'outil ou des aperçus Canvas ne sont pas regroupés.
    • Lorsque l'extraction d'une session se trouve sur une branche non définie par défaut d'un dépôt GitHub, la vue du chat épingle des pastilles de demandes de tirage au-dessus de la zone de rédaction : numéro de PR, dépôt, branche, nombre de différences, pastille de CI et état brouillon/fusionné/fermé, chaque élément comportant un lien vers la PR. La ligne affiche au maximum deux pastilles — les PR actives (ouvertes/brouillons) en premier — et un bouton « Afficher plus » révèle l'historique fusionné/fermé replié. La pastille de CI ouvre une petite fenêtre contextuelle de suivi de la CI avec le nombre de vérifications réussies/échouées/en cours/ignorées et un lien vers la page des vérifications de la PR. La détection s'exécute côté serveur via controlUi.sessionPullRequests, qui réutilise les valeurs GH_TOKEN/GITHUB_TOKEN du Gateway lorsqu'elles sont définies. Lorsque la limite de débit de l'API GitHub est atteinte, les pastilles conservent le dernier état connu et affichent un avertissement indiquant que cet état peut être obsolète ; fermer une pastille la masque pour cette session dans le profil de navigateur actuel. Avant qu'une PR n'existe, la ligne affiche la branche elle-même — dépôt, nom de la branche et taille +/− des différences par rapport à la base de fusion de la branche par défaut (travail validé et non validé) — avec un bouton Créer une PR qui ouvre la page de création d'une demande de tirage de GitHub. La ligne apparaît dès que la branche poussée contient des commits à comparer et se masque lorsqu'une PR ouverte ou en brouillon existe. La ligne de branche provient uniquement du dépôt Git local ; elle reste donc disponible pendant la limitation du débit de GitHub et présente le même avertissement d'état obsolète, car l'indication « aucune PR trouvée » ne peut être considérée comme fiable avant la réinitialisation de la limite.
    • Le panneau des différences de session montre ce que l'extraction d'une session a réellement modifié : le bouton de branche (dans l'en-tête du volet de l'espace de travail, dans l'en-tête du volet fractionné ou sur le bouton flottant du chat à volet unique) ouvre le panneau détaillé avec les différences fichier par fichier des travaux de branche, non validés et non suivis par rapport à la base de fusion de la branche par défaut de l'extraction — point d'état, flèche de renommage, nombres +/− par fichier, fichiers repliables et marqueurs « N lignes non modifiées » entre les blocs de différences. Les différences sont calculées côté serveur via la méthode Gateway sessions.diff (portée operator.read) ; les fichiers binaires et surdimensionnés sont réduits à des entrées contenant uniquement des statistiques, et le bouton n'apparaît que lorsque le Gateway connecté annonce sessions.diff.
    • Le volet de l'espace de travail de la session dans chaque panneau de Chat répertorie les fichiers de session, les fichiers du projet et les artefacts. Il est ancré par défaut sur le bord droit du panneau ; faites glisser son en-tête (ou utilisez le bouton d'ancrage) pour le déplacer vers le bas, et ce choix est enregistré dans le profil de navigateur actuel. Un volet replié n'occupe absolument aucun espace : rouvrez-le avec ⇧⌘B, le bouton des fichiers dans l'en-tête du volet fractionné ou le bouton flottant des fichiers dans le chat à volet unique (les deux affichent un badge indiquant le nombre de fichiers modifiés). Le panneau détaillé distinct consacré aux fichiers, aux outils et à Canvas n'est pas affecté.
    • Un clic sur une référence de fichier dans le chat, sur un chemin de fichier dans une carte d'outil de lecture/modification/écriture développée ou sur une ligne de fichier dans le volet de l'espace de travail ouvre le panneau détaillé du fichier : une vue du code basée sur CodeMirror avec coloration syntaxique, numéros de ligne, accès direct à une ligne, recherche dans le fichier, actions de copie et menu d'ouverture dans un éditeur externe. Lorsque le Gateway annonce sessions.files.set à une connexion operator.admin, le panneau ajoute un mode Modification avec suivi des modifications non enregistrées et enregistrement par Cmd/Ctrl-S ; les brouillons non enregistrés persistent pendant la navigation entre les fichiers, les panneaux et les sessions dans l'onglet actuel du navigateur, jusqu'à leur enregistrement ou leur abandon explicite. Les enregistrements utilisent une opération de comparaison et permutation fondée sur une empreinte du contenu renvoyée par sessions.files.get : si le fichier a été modifié sur le disque depuis son chargement (par exemple parce que l'agent a continué à travailler), le panneau affiche un avis de conflit avec les actions Reload (utiliser le contenu le plus récent) et Overwrite (conserver la modification locale). Les écritures passent par les mêmes protections sécurisées du système de fichiers de l'espace de travail que les lectures — confinement du chemin, rejet des liens symboliques/liens physiques et limite UTF-8 de 256 KB — et ne remplacent que des fichiers existants ; l'éditeur n'en crée ni n'en supprime jamais.
    • Le volet des tâches en arrière-plan de chaque panneau de Chat répertorie les tâches en arrière-plan et les sous-agents de l'agent actuel (tasks.list limité à l'agent et tenu à jour par les événements task) : les travaux en cours affichent en direct le temps écoulé, le nombre d'utilisations d'outils, l'outil actuellement utilisé et une commande d'arrêt ; la section repliable des travaux terminés ajoute la durée des exécutions ; et un lien Afficher la transcription ouvre la session enfant de la tâche dans le panneau. Ouvrez-le avec le bouton d'activité dans l'en-tête du volet fractionné ou le bouton flottant d'activité dans le chat à volet unique — l'instantané des tâches est chargé de manière anticipée, de sorte que les deux affichent un badge du nombre de tâches en cours sans qu'il soit nécessaire d'ouvrir d'abord le volet. La page Tâches reste le registre complet couvrant tous les agents.
    • Le volet de l'espace de travail, le volet des tâches en arrière-plan et le panneau détaillé s'adaptent à la largeur propre de chaque panneau plutôt qu'à celle de la fenêtre : dans un panneau étroit ou une fenêtre compacte, les deux volets se présentent sous forme de bandes inférieures (les commandes d'ancrage latéral restent masquées jusqu'à ce que le panneau s'élargisse ; le volet de l'espace de travail est prioritaire pour l'emplacement latéral lorsqu'une seule colonne tient), et le panneau détaillé s'empile sous le fil avec une poignée de redimensionnement horizontale au lieu de partager la même ligne. Sur les écrans de la taille d'un téléphone, le panneau détaillé s'ouvre toujours en plein écran.
    • Les sélecteurs de modèle et de réflexion dans l'en-tête du chat mettent immédiatement à jour la session active via sessions.patch ; il s'agit de remplacements persistants pour la session, et non d'options d'envoi valables pour un seul tour.
    • Vue fractionnée : ouvrez-la depuis la rangée de boutons flottants en haut à droite (à côté des boutons des différences de session, des tâches en arrière-plan et des fichiers de session), puis fractionnez le panneau actif vers la droite ou vers le bas, autant de fois que l'espace le permet. Chaque panneau dispose de sa propre session, transcription, zone de rédaction et flux d'outils.
    • Faites glisser une session de la barre latérale vers le chat pour l'ouvrir dans un panneau. Un aperçu animé du dépôt glisse entre les zones et indique le résultat — « Fractionner » sur la moitié exacte qu'occupera un nouveau panneau, « Ouvrir ici » sur un panneau entier — et les dépôts fonctionnent également depuis le mode à panneau unique.
    • Le panneau fractionné actif détermine la sélection dans la barre latérale et l'URL. Chaque panneau possède sa propre ligne d'en-tête avec le titre de la session ainsi que les commandes du volet de l'espace de travail, de fractionnement et de fermeture ; les séparateurs redimensionnent les colonnes et les panneaux empilés, et le navigateur enregistre localement la disposition entre les rechargements.
    • Sur les écrans étroits, la vue fractionnée conserve la disposition, mais n'affiche que le panneau actif, y compris son en-tête avec la commande de fermeture.
    • Si vous envoyez un message alors qu'une modification du sélecteur de modèle pour la même session est encore en cours d'enregistrement, la zone de rédaction attend la fin de la mise à jour de cette session avant d'appeler chat.send, afin que l'envoi utilise le modèle sélectionné.
    • La saisie de /new crée la même nouvelle session de tableau de bord que Nouveau chat et y bascule, sauf si session.dmScope: "main" est configuré et que le parent actuel est la session principale de l'agent ; dans ce cas, cette session principale est réinitialisée sur place. La saisie de /reset conserve la réinitialisation explicite sur place du Gateway pour la session actuelle.
    • Le sélecteur de modèle du chat demande la vue des modèles configurés du Gateway. Si agents.defaults.models est présent, cette liste d'autorisation pilote le sélecteur, y compris les entrées provider/* qui maintiennent dynamiques les catalogues propres aux fournisseurs. Sinon, le sélecteur affiche les entrées models.providers.*.models explicites ainsi que les fournisseurs disposant d'une authentification utilisable. Le catalogue complet reste disponible via l'appel RPC de débogage models.list avec view: "all".
    • Lorsque les rapports récents d’utilisation de la session du Gateway incluent le nombre actuel de jetons du contexte, la barre d’outils de la zone de rédaction du chat affiche un petit anneau d’utilisation du contexte indiquant le pourcentage utilisé. Ouvrez l’anneau pour afficher la fenêtre de contexte actuelle, le nombre de jetons de la dernière exécution et le coût total estimé, l’identité du fournisseur et du modèle, ainsi que la répartition des coûts d’entrée, de sortie et de cache de la dernière réponse du fournisseur, lorsqu’elle est communiquée. L’anneau adopte un style d’avertissement lorsque la pression sur le contexte est élevée et, aux niveaux de Compaction recommandés, affiche un bouton compact qui exécute le processus normal de Compaction de la session. Les instantanés obsolètes du nombre de jetons sont masqués jusqu’à ce que le Gateway communique de nouveau des données d’utilisation récentes.
    Mode Conversation (temps réel dans le navigateur)

    Le mode Conversation utilise un fournisseur vocal en temps réel enregistré. Configurez OpenAI avec talk.realtime.provider: "openai" ainsi qu’un profil de clé API openai, talk.realtime.providers.openai.apiKey ou OPENAI_API_KEY. OpenAI Realtime utilise l’API publique de la plateforme et nécessite une clé API de la plateforme ; une connexion OAuth Codex ne satisfait pas cette interface. Configurez Google avec talk.realtime.provider: "google" ainsi que talk.realtime.providers.google.apiKey. Le navigateur ne reçoit jamais de clé API standard du fournisseur : OpenAI reçoit un secret client Realtime éphémère pour WebRTC, tandis que Google Live reçoit un jeton d’authentification à usage unique et à portée limitée pour l’API Live destiné à une session WebSocket du navigateur, les instructions et les déclarations d’outils étant verrouillées dans le jeton par le Gateway. Les fournisseurs qui n’exposent qu’un pont dorsal en temps réel utilisent le transport relais du Gateway, de sorte que les identifiants et les sockets du fournisseur restent côté serveur tandis que l’audio du navigateur transite par des RPC Gateway authentifiés. L’invite de session Realtime est assemblée par le Gateway ; talk.client.create n’accepte pas les remplacements d’instructions fournis par l’appelant.

    Les valeurs par défaut persistantes du fournisseur, du modèle, de la voix, du transport, de l’effort de raisonnement, du seuil VAD exact, de la durée de silence et du remplissage de préfixe se trouvent dans Settings → Communications → Talk ; leur modification nécessite l’accès operator.admin. La configuration du relais Gateway impose le chemin de relais dorsal ; la configuration de WebRTC laisse la session sous le contrôle du client et échoue, au lieu de revenir silencieusement au relais, si le fournisseur ne peut pas créer de session de navigateur.

    Le contrôle Conversation lui-même est le bouton du microphone dans la barre d’outils de rédaction. Son chevron répertorie System default et tous les microphones exposés par le navigateur, y compris les entrées USB, Bluetooth et virtuelles. L’identifiant de l’appareil sélectionné reste local au navigateur et n’est jamais envoyé au Gateway ; si cet appareil précis disparaît, Conversation vous demande de choisir une autre entrée au lieu d’enregistrer silencieusement avec un autre microphone. Lorsque Conversation est active, le bouton du microphone devient une pastille affichant l’indicateur de niveau d’entrée en direct ; cliquer dessus arrête l’entrée vocale et le survol révèle le glyphe d’arrêt. Les lecteurs d’écran annoncent Connecting voice input..., Listening... ou Asking OpenClaw... lorsqu’un appel d’outil en temps réel consulte le modèle plus volumineux configuré au moyen de talk.client.toolCall. L’arrêt d’une réponse d’agent en cours reste un contrôle carré Stop distinct à côté de la pastille.

    Test de fonctionnement en direct pour les mainteneurs : OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts vérifie le pont WebSocket dorsal d’OpenAI, l’échange SDP WebRTC d’OpenAI dans le navigateur, la configuration WebSocket de Google Live dans le navigateur avec un jeton à portée limitée et l’adaptateur de navigateur du relais Gateway avec un média de microphone simulé. La commande affiche uniquement l’état du fournisseur et ne journalise aucun secret.

    Arrêt et abandon
    • Cliquez sur Stop (appelle chat.abort).
    • Tant qu’une exécution est active, les suivis normaux sont mis en file d’attente. Cliquez sur Steer sur un message en attente pour injecter ce suivi dans le tour en cours.
    • Saisissez /stop (ou des phrases d’abandon autonomes comme stop, stop action, stop run, stop openclaw, please stop) pour effectuer un abandon hors bande.
    • chat.abort prend en charge { sessionKey } (sans runId) afin d’abandonner toutes les exécutions actives de cette session.
    Conservation partielle après abandon
    • Lorsqu’une exécution est abandonnée, le texte partiel de l’assistant peut toujours être affiché dans l’interface utilisateur.
    • Le Gateway conserve le texte partiel abandonné de l’assistant dans l’historique de la transcription lorsqu’une sortie mise en mémoire tampon existe.
    • Les entrées conservées incluent des métadonnées d’abandon afin que les consommateurs de la transcription puissent distinguer les sorties partielles abandonnées des sorties issues d’un achèvement normal.

    Perte de connexion et reconnexion

    Une fois la session établie, une interruption de la connexion au Gateway ne vous déconnecte pas. Le tableau de bord reste visible avec une pastille flottante orange « Gateway connection lost — Reconnecting… » sous la barre supérieure pendant que le client réessaie automatiquement avec un délai progressif (de 800 ms à 15 s). Les mises à jour en direct et les actions en temps réel ou de session sont suspendues jusqu’au rétablissement de la connexion ; Retry now dans la pastille force une tentative immédiate. La discussion reste modifiable : les envois de texte ordinaire et de pièces jointes sont conservés dans le stockage du navigateur de l’onglet actuel, limité au Gateway et à la session, affichés comme étant en attente de reconnexion, puis envoyés automatiquement au retour du Gateway. Les contrôles en direct et les commandes avec barre oblique restent indisponibles hors ligne.

    Lorsque ce navigateur détient déjà des identifiants (un jeton ou mot de passe configuré, ou un jeton d’appareil approuvé), les premières ouvertures et les rechargements affichent un petit symbole OpenClaw animé pendant l’établissement de la connexion, plutôt que de faire apparaître brièvement l’écran de connexion. Celui-ci n’apparaît que lorsqu’aucun identifiant n’est encore stocké ou lorsque le Gateway les rejette activement (jeton ou mot de passe incorrect, association révoquée) — des états qui nécessitent votre intervention plutôt qu’une attente.

    Installation de la PWA et notifications Web Push

    L’interface de contrôle fournit un fichier manifest.webmanifest et un service worker, ce qui permet aux navigateurs modernes de l’installer comme PWA autonome. Web Push permet au Gateway de réveiller la PWA installée avec des notifications, même lorsque l’onglet ou la fenêtre du navigateur n’est pas ouvert.

    Si la page affiche Protocol mismatch juste après une mise à jour d’OpenClaw, rouvrez d’abord le tableau de bord avec openclaw dashboard et effectuez une actualisation forcée. Si l’échec persiste, effacez les données du site pour l’origine du tableau de bord ou effectuez un test dans une fenêtre de navigation privée ; un ancien onglet ou le cache du service worker du navigateur peut continuer à exécuter une version antérieure à la mise à jour de l’interface de contrôle avec le Gateway plus récent.

    Surface Fonction
    ui/public/manifest.webmanifest Manifeste PWA. Les navigateurs proposent « Install app » dès qu’il est accessible.
    ui/public/sw.js Service worker qui gère les événements push et les clics sur les notifications.
    push/vapid-keys.json (dans le répertoire d’état d’OpenClaw) Paire de clés VAPID générée automatiquement pour signer les charges utiles Web Push.
    push/web-push-subscriptions.json Points de terminaison persistants des abonnements du navigateur.

    Remplacez la paire de clés VAPID au moyen de variables d’environnement dans le processus du Gateway lorsque vous souhaitez fixer les clés (déploiements sur plusieurs hôtes, rotation des secrets ou tests) :

    • OPENCLAW_VAPID_PUBLIC_KEY
    • OPENCLAW_VAPID_PRIVATE_KEY
    • OPENCLAW_VAPID_SUBJECT (valeur par défaut : https://openclaw.ai)

    L’interface de contrôle utilise ces méthodes du Gateway à portée limitée pour enregistrer et tester les abonnements du navigateur :

    • push.web.vapidPublicKey récupère la clé publique VAPID active.
    • push.web.subscribe enregistre un endpoint ainsi que keys.p256dh/keys.auth.
    • push.web.unsubscribe supprime un point de terminaison enregistré.
    • push.web.test envoie une notification de test à l’abonnement de l’appelant.

    Intégrations hébergées

    Les messages de l’assistant peuvent afficher du contenu Web hébergé en ligne à l’aide du code court [embed ...]. La politique de bac à sable de l’iframe est contrôlée par gateway.controlUi.embedSandbox :

    Le Plugin Canvas intégré fournit également show_widget pour afficher du SVG ou du HTML autonome directement depuis un appel d’outil. Le navigateur annonce la capacité Gateway inline-widgets, et le document Canvas obtenu reste disponible lorsque l’historique de discussion est rechargé. Les exécutions provenant de canaux ne reçoivent pas cet outil.

    strict

    Désactive l’exécution de scripts dans les intégrations hébergées.

    scripts (default)

    Autorise les intégrations interactives tout en conservant l’isolation de l’origine ; généralement suffisant pour les jeux et widgets autonomes dans le navigateur.

    trusted

    Ajoute allow-same-origin en plus de allow-scripts pour les documents du même site qui nécessitent intentionnellement des privilèges plus élevés.

    json5
    {  gateway: {    controlUi: {      embedSandbox: "scripts",    },  },}

    Les URL d’intégration externes absolues en http(s) restent bloquées par défaut. Pour permettre à [embed url="https://..."] de charger des pages tierces, définissez gateway.controlUi.allowExternalEmbedUrls: true.

    Largeur des messages de discussion

    La transcription de la discussion utilise un cadre lisible centré et aligné sur la zone de composition. Les sorties de l’assistant et des outils restent alignées à gauche, tandis que les bulles de l’utilisateur restent alignées à droite dans ce cadre. Les déploiements sur écrans larges peuvent remplacer la largeur de la transcription sans modifier le CSS intégré en définissant gateway.controlUi.chatMessageMaxWidth :

    json5
    {  gateway: {    controlUi: {      chatMessageMaxWidth: "min(1280px, 82%)",    },  },}

    La valeur est validée avant d’atteindre le navigateur. Les formes prises en charge comprennent les longueurs simples et les pourcentages tels que 960px ou 82%, ainsi que les expressions de largeur contraintes min(...), max(...), clamp(...), calc(...) et fit-content(...).

    Accès au tailnet (recommandé)

    Tailscale Serve intégré (à privilégier)

    Conservez le Gateway sur l’interface de bouclage et laissez Tailscale Serve agir comme proxy HTTPS :

    bash
    openclaw gateway --tailscale serve

    Ouvrez https://<magicdns>/ (ou votre gateway.controlUi.basePath configuré).

    Par défaut, les requêtes Serve de l’interface de contrôle/WebSocket peuvent s’authentifier au moyen des en-têtes d’identité Tailscale (tailscale-user-login) lorsque gateway.auth.allowTailscale vaut true. OpenClaw vérifie l’identité en résolvant l’adresse x-forwarded-for avec tailscale whois et en la faisant correspondre à l’en-tête ; ces requêtes ne sont acceptées que lorsqu’elles atteignent l’interface de bouclage avec les en-têtes x-forwarded-* de Tailscale. Pour les sessions d’opérateur de l’interface de contrôle disposant d’une identité d’appareil dans le navigateur, ce chemin Serve vérifié évite également l’aller-retour d’appairage de l’appareil ; les navigateurs sans appareil et les connexions avec un rôle de Node suivent toujours les vérifications d’appareil normales. Définissez gateway.auth.allowTailscale: false si vous souhaitez exiger des identifiants explicites par secret partagé, même pour le trafic Serve, puis utilisez gateway.auth.mode: "token" ou "password".

    Pour ce chemin asynchrone d’identité Serve, les tentatives d’authentification échouées provenant de la même adresse IP cliente et relevant de la même portée d’authentification sont sérialisées avant les écritures de limitation de débit. Des nouvelles tentatives incorrectes simultanées provenant du même navigateur peuvent donc afficher retry later lors de la deuxième requête, au lieu de produire deux simples non-correspondances qui s’exécutent en parallèle.

    Liaison au tailnet + jeton

    bash
    openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"

    Ouvrez http://<tailscale-ip>:18789/ (ou votre gateway.controlUi.basePath configuré).

    Collez le secret partagé correspondant dans les paramètres de l’interface utilisateur (envoyé sous la forme connect.params.auth.token ou connect.params.auth.password).

    HTTP non sécurisé

    Si vous ouvrez le tableau de bord via HTTP en clair (http://<lan-ip> ou http://<tailscale-ip>), le navigateur s’exécute dans un contexte non sécurisé et bloque WebCrypto. Par défaut, OpenClaw bloque les connexions à l’interface de contrôle dépourvues d’identité d’appareil.

    Exceptions documentées :

    • compatibilité HTTP non sécurisée limitée à localhost avec gateway.controlUi.allowInsecureAuth=true
    • authentification réussie de l’opérateur dans l’interface de contrôle au moyen de gateway.auth.mode: "trusted-proxy"
    • option de dernier recours gateway.controlUi.dangerouslyDisableDeviceAuth=true

    Correctif recommandé : utilisez HTTPS (Tailscale Serve) ou ouvrez localement l’interface utilisateur à l’adresse https://<magicdns>/ (Serve) ou http://127.0.0.1:18789/ (sur l’hôte du Gateway).

    Comportement de l’option d’authentification non sécurisée
    json5
    {  gateway: {    controlUi: { allowInsecureAuth: true },    bind: "tailnet",    auth: { mode: "token", token: "replace-me" },  },}

    allowInsecureAuth est uniquement une option de compatibilité locale :

    • Elle permet aux sessions de la Control UI sur localhost de fonctionner sans identité d’appareil dans des contextes HTTP non sécurisés.
    • Elle ne contourne pas les vérifications d’appairage.
    • Elle n’assouplit pas les exigences d’identité d’appareil pour les connexions distantes (hors localhost).
    Usage d’urgence uniquement
    json5
    {  gateway: {    controlUi: { dangerouslyDisableDeviceAuth: true },    bind: "tailnet",    auth: { mode: "token", token: "replace-me" },  },}
    Remarque sur le proxy de confiance
    • Une authentification réussie par proxy de confiance peut autoriser des sessions opérateur de la Control UI sans identité d’appareil.
    • Cela ne s’étend pas aux sessions de la Control UI ayant le rôle de Node.
    • Les proxys inverses en boucle locale sur le même hôte ne satisfont toujours pas l’authentification par proxy de confiance ; consultez Authentification par proxy de confiance.

    Consultez Tailscale pour obtenir des instructions sur la configuration HTTPS.

    Politique de sécurité du contenu

    La Control UI applique une politique img-src stricte : seuls les éléments provenant de la même origine, les URL data: et les URL blob: générées localement sont autorisés. Les URL d’images distantes en http(s) et relatives au protocole sont rejetées par le navigateur et ne déclenchent jamais de requête réseau.

    En pratique :

    • Les avatars et images servis sous des chemins relatifs (par exemple /avatars/<id>) continuent de s’afficher, y compris ceux provenant de routes d’avatar authentifiées que l’interface récupère et convertit en URL blob: locales.
    • Les URL data:image/... intégrées continuent de s’afficher.
    • Les URL blob: locales créées par la Control UI continuent de s’afficher.
    • Les avatars des aperçus de liens GitHub sont récupérés par le Gateway depuis l’hôte d’avatars fixe de GitHub et renvoyés sous forme d’URL data: de taille limitée ; le navigateur de l’opérateur ne contacte jamais l’hôte d’avatars distant.
    • Les URL d’avatar distantes émises par les métadonnées des canaux sont supprimées par les utilitaires d’avatar de la Control UI et remplacées par le logo ou le badge intégré, afin qu’un canal compromis ou malveillant ne puisse pas forcer le navigateur d’un opérateur à récupérer arbitrairement des images distantes.

    Cette protection est toujours active et n’est pas configurable.

    Authentification de la route des avatars

    Lorsque l’authentification du Gateway est configurée, le point de terminaison des avatars de la Control UI exige le même jeton du Gateway que le reste de l’API :

    • GET /avatar/<agentId> renvoie l’image de l’avatar uniquement aux appelants authentifiés. GET /avatar/<agentId>?meta=1 renvoie les métadonnées de l’avatar selon la même règle.
    • Les requêtes non authentifiées vers l’une ou l’autre route sont rejetées, comme pour la route apparentée des médias de l’assistant, afin que la route des avatars ne puisse pas révéler l’identité de l’agent sur des hôtes par ailleurs protégés.
    • La Control UI transmet le jeton du Gateway dans un en-tête bearer lors de la récupération des avatars et utilise des URL blob authentifiées afin que l’image continue de s’afficher dans les tableaux de bord.

    Si vous désactivez l’authentification du Gateway, ce qui est déconseillé sur les hôtes partagés, la route des avatars devient également non authentifiée, comme le reste du Gateway.

    Authentification de la route des médias de l’assistant

    Lorsque l’authentification du Gateway est configurée, les aperçus des médias locaux de l’assistant utilisent une route en deux étapes :

    • GET /__openclaw__/assistant-media?meta=1&source=<path> exige l’authentification normale d’opérateur de la Control UI ; le navigateur envoie le jeton du Gateway dans un en-tête bearer lors de la vérification de la disponibilité.
    • Les réponses de métadonnées réussies incluent un mediaTicket de courte durée limité à ce chemin source précis.
    • Les URL d’images, de contenus audio, de vidéos et de documents affichées par le navigateur utilisent mediaTicket=<ticket> au lieu du jeton ou du mot de passe actif du Gateway. Le ticket expire rapidement et ne peut pas autoriser une autre source.

    Cela préserve la compatibilité de l’affichage des médias avec les éléments multimédias natifs du navigateur sans placer d’identifiants réutilisables du Gateway dans des URL de médias visibles.

    Liens d’approbation

    Les notifications d’approbation destinées aux opérateurs peuvent contenir un lien profond vers un document d’approbation autonome servi sous l’espace de noms réservé ${controlUiBasePath}/approve/{approvalId} (par exemple /approve/<approvalId>, ou /openclaw/approve/<approvalId> lorsqu’un chemin de base est configuré). L’URL reste stable pendant toute la durée de vie de l’approbation et peut être transmise en toute sécurité entre vos propres appareils : elle identifie l’approbation, mais ne l’autorise jamais.

    • L’espace de noms à un segment /approve/<approvalId> est réservé par le Gateway avant les routes HTTP des Plugins pour toutes les méthodes HTTP ; une route de Plugin ne peut donc jamais masquer ni intercepter un document d’approbation.
    • L’ouverture d’un document d’approbation exige la même authentification du Gateway que le reste de la Control UI (jeton/mot de passe, identité Tailscale Serve ou identité de proxy de confiance) ; les identifiants ne font jamais partie de l’URL d’approbation.
    • Lorsque le service de la Control UI est désactivé, les requêtes vers cet espace de noms renvoient 404 au lieu d’être transmises aux gestionnaires de Plugins.
    • La connexion depuis un document d’approbation est temporaire pour cette page : elle ne remplace ni la sélection du Gateway ni les paramètres enregistrés par la Control UI complète dans le même navigateur.

    Le Gateway sert les fichiers statiques depuis dist/control-ui :

    bash
    pnpm ui:build

    Base absolue facultative (URL d’éléments fixes) :

    bash
    OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build

    Développement local (serveur de développement distinct) :

    bash
    pnpm ui:dev

    Configurez ensuite l’interface pour utiliser l’URL WS de votre Gateway (par exemple ws://127.0.0.1:18789).

    Page vide de la Control UI

    Si le navigateur charge un tableau de bord vide et que les outils de développement n’affichent aucune erreur utile, une extension ou un script de contenu exécuté précocement a peut-être empêché l’évaluation du module JavaScript de l’application. La page statique comprend un panneau de récupération en HTML simple qui apparaît lorsque <openclaw-app> n’est pas enregistré après le démarrage.

    Utilisez l’action Réessayer du panneau après avoir modifié l’environnement du navigateur, ou rechargez manuellement la page après les vérifications suivantes :

    • Désactivez les extensions qui injectent du contenu dans toutes les pages, en particulier celles qui utilisent des scripts de contenu <all_urls>.
    • Essayez une fenêtre privée, un profil de navigateur vierge ou un autre navigateur.
    • Laissez le Gateway s’exécuter et vérifiez la même URL de tableau de bord après avoir changé de navigateur.

    Débogage et tests : serveur de développement + Gateway distant

    La Control UI est constituée de fichiers statiques ; la cible WebSocket est configurable et peut différer de l’origine HTTP. Cela est utile lorsque vous souhaitez exécuter le serveur de développement Vite localement tandis que le Gateway s’exécute ailleurs.

  • Démarrer le serveur de développement de l’interface

    bash
    pnpm ui:dev
  • Ouvrir avec gatewayUrl

    text
    http://localhost:5173/?gatewayUrl=ws%3A%2F%2F<gateway-host>%3A18789

    Authentification ponctuelle facultative (si nécessaire) :

    text
    http://localhost:5173/?gatewayUrl=wss%3A%2F%2F<gateway-host>%3A18789#token=<gateway-token>
  • Remarques
    • gatewayUrl est enregistré dans localStorage après le chargement, puis supprimé de l’URL.
    • Si vous transmettez un point de terminaison ws:// ou wss:// complet via gatewayUrl, encodez la valeur dans l’URL afin que le navigateur analyse correctement la chaîne de requête.
    • Dans la mesure du possible, token doit être transmis dans le fragment d’URL (#token=...). Les fragments ne sont pas envoyés au serveur, ce qui évite les fuites dans les journaux de requêtes et via Referer. Les anciens paramètres de requête ?token= sont encore importés une fois à des fins de compatibilité, mais uniquement comme solution de repli, puis sont supprimés immédiatement après l’amorçage.
    • password est conservé uniquement en mémoire.
    • Lorsque gatewayUrl est défini, l’interface ne se rabat pas sur les identifiants provenant de la configuration ou de l’environnement. Fournissez explicitement token (ou password) ; l’absence d’identifiants explicites constitue une erreur.
    • Utilisez wss:// lorsque le Gateway se trouve derrière TLS (Tailscale Serve, proxy HTTPS, etc.).
    • gatewayUrl est uniquement accepté dans une fenêtre de premier niveau, et non dans un contenu intégré, afin d’empêcher le détournement de clic.
    • Les déploiements publics de la Control UI hors boucle locale doivent définir explicitement gateway.controlUi.allowedOrigins avec des origines complètes. Les chargements privés depuis le LAN/Tailnet et de même origine provenant de la boucle locale, d’hôtes RFC1918/à liaison locale, .local, .ts.net ou Tailscale CGNAT sont acceptés sans activer la solution de repli fondée sur l’en-tête Host.
    • Le démarrage du Gateway peut initialiser des origines locales telles que http://localhost:<port> et http://127.0.0.1:<port> à partir de l’adresse d’écoute et du port effectifs à l’exécution, mais les origines des navigateurs distants nécessitent toujours des entrées explicites.
    • N’utilisez pas gateway.controlUi.allowedOrigins: ["*"], sauf pour des tests locaux strictement contrôlés ; cela signifie autoriser n’importe quelle origine de navigateur, et non « faire correspondre l’hôte que j’utilise ».
    • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true active le mode de repli de l’origine fondé sur l’en-tête Host, mais il s’agit d’un mode de sécurité dangereux.
    json5
    {  gateway: {    controlUi: {      allowedOrigins: ["http://localhost:5173"],    },  },}

    Détails de la configuration de l’accès distant : Accès distant.

    Pages connexes

    Was this useful?
    On this page

    On this page