SecuFocus
BrèveAnnonces

Hermes Agent 0.22.6 : le bureau dans le navigateur, sans ouvrir tous les accès

La stable du 2 novembre livre la Webapp, le coffre lié au trousseau système, des skills verrouillables et de nouveaux contrôles de tâches. Le canal du bureau reste à distinguer.

Image générée : ordinateur portable à écran neutre, clé USB de sécurité et carnet bleu sur un bureau éclairé par une fenêtre.

Image générée · SecuFocus

En bref

L’essentiel

Hermes Agent 0.22.6 est publié comme version stable le 2 novembre. Le changement le plus visible est l’espace de travail Desktop dans un navigateur, servi par votre passerelle. Avant de l’ouvrir à distance, vérifiez qui peut s’y connecter : ce navigateur agit sur la machine de la passerelle. La version ajoute aussi des contrôles utiles pour le coffre, les skills, les sessions et les tâches planifiées, sans les activer tous automatiquement.

Une stable, mais pas le même paquet de bureau partout

GitHub date v0.22.6 du 2 novembre à 17:18 UTC, sans statut de préversion. La note regroupe le travail depuis 0.22.5 et réserve toujours les notes détaillées du cycle à 0.23.0. Cette dernière n’est pas une version disponible déduite de l’annonce.

La CLI passe par hermes update ; le Microsoft Store par le Store ; Docker et Hermes Cloud par l’image stable ou latest. La note précise que les applications issues des installateurs .exe et .dmg ne changent pas dans cette publication et attendent la prochaine version groupée. Un tag stable ne prouve donc pas que chaque application de bureau reçoit toutes ces fonctions le même jour.

Un navigateur qui commande la machine de la passerelle

hermes webapp ouvre l’espace Desktop depuis le navigateur et partage la conversation et sa file d’exécution avec les autres surfaces de la même passerelle. Le lien local de connexion fonctionne une seule fois pendant 60 secondes. Tant qu’il n’a pas été utilisé, il donne accès en votre nom : ne le collez ni dans un ticket public ni dans un chat partagé.

L’accès réseau se prépare dans Desktop Web Access avec une authentification adaptée. La documentation distingue la simple connexion locale et la connexion par compte pour l’accès à distance. Ce n’est pas un espace multi-utilisateur isolé : les personnes admises sur une installation auto-hébergée agissent avec l’autorité du propriétaire de cette machine.

Les plugins Desktop peuvent aussi se charger dans cet onglet, sur l’hôte qui sert la Webapp. Leur installation reste un ajout de code, pas une permission anodine de navigateur. Le contrôle du commit examiné et les refus des liens symboliques ou dossiers de plus de 64 Mo ne constituent pas un audit du plugin.

Le trousseau système change aussi la sauvegarde du coffre

La conservation de la clé dans le trousseau du système est facultative. hermes vault key indique son emplacement ; la migration vers le trousseau vérifie que sa copie ouvre le coffre avant de retirer le fichier de clé. Le mode fichier reste la valeur par défaut.

Une sauvegarde du profil ne contient alors plus nécessairement tout ce qui permet d’ouvrir le coffre sur une autre machine. La documentation demande de remettre la clé en mode fichier avant un déplacement entre machines. Un clone reçoit sa propre entrée de trousseau ; s’il ne peut pas joindre ce trousseau, il est refusé plutôt que de partager l’entrée d’origine.

Sur un serveur sans trousseau disponible, la création d’un nouveau coffre demandé en mode trousseau retombe sur un fichier avec un avertissement. Vérifiez le résultat réel et gardez la clé hors du chat. Ce mécanisme ne remplace pas les restrictions d’accès du navigateur et ne vaut pas garantie de protection contre tout processus de votre compte.

Verrouiller un skill n’est pas l’épingler

Le verrou par profil empêche les écritures autonomes dans un skill tout en le laissant lisible et chargeable. Il se règle depuis Desktop Capabilities ou hermes curator lock. L’épinglage sert à la curation et n’offre pas le même refus d’écriture.

La documentation décrit des contrôles sur les outils de modification et certaines commandes, avec des limites pour du code ou des scripts capables d’écrire indirectement. Ce verrou n’est pas une sandbox du système de fichiers. Il aide à conserver une procédure validée ; il ne transforme pas un agent disposant du terminal en processus sans accès aux fichiers.

Arrêter un passage sans supprimer sa programmation

hermes cron cancel vise l’exécution en cours, tandis que pause empêche les départs suivants. L’annulation est une demande traitée à un point de contrôle ; elle n’annule aucune écriture déjà faite. Le bouton Stop du bureau indique l’attente puis l’état annulé.

Les tâches peuvent aussi avoir leur fuseau et leur politique de rattrapage. Un intervalle reste une durée ; un cron est une heure locale. Le journal distingue les passages manqués et ceux regroupés en une reprise. Un lancement manuel avant l’échéance ajoute un passage sans consommer le passage prévu ni son compteur de répétition. Vérifiez donc l’historique avant de relancer une opération avec effets externes.

Garder la conversation en changeant le choix du modèle

/model reset retire le choix propre à une session pour retrouver le modèle prévu par la configuration, sans jeter l’historique. Le rafraîchissement des prompts stockés conserve aussi l’identité et la conversation, mais reconstruit le prompt au tour suivant avec une rupture de cache. Ce sont deux opérations différentes.

La compression préparée à l’avance, compression.prepare_ahead, est facultative et désactivée par défaut. Elle prépare un résumé en arrière-plan ; nous n’en avons mesuré ni le gain ni le coût. Pour /compress, un moteur de contexte choisi par plugin reste responsable de sa compression, plutôt qu’un chemin implicite différent selon l’interface. Cet appel auxiliaire peut être payé sans que le résumé soit finalement utilisé ; l’option ne couvre ni /compress manuel ni les moteurs de contexte de plugins.

Stopper la réponse ne stoppe pas forcément les sous-agents

Le bouton d’arrêt du tour et la commande /stop ont des portées différentes : le premier ne supprime pas une délégation de fond de premier niveau ; /stop ou la fermeture de sa session propriétaire met fin à ses enfants. Un travail qui doit survivre au processus propriétaire demande toujours un mécanisme durable.

En messagerie, delegation.gateway_mode peut attendre les enfants dans le même tour lorsque les messages intermédiaires sont désactivés. Le choix du backend enregistré par /delegation s’applique normalement à la prochaine session ; l’application immédiate reconstruit les outils et perd une fois le cache du prompt. Aucun de ces choix ne réduit les droits du profil délégué.

Choisir une voix ElevenLabs peut engager un autre tarif

L’agent peut rechercher des voix ElevenLabs et choisir voice_id pour un appel sans réécrire la voix configurée. Il choisit depuis les descriptions et ne les écoute pas lui-même ; les aperçus restent à écouter par vous.

La recherche demande Voices: Read et la synthèse Text to Speech. Les voix de la bibliothèque publique nécessitent une offre payante pour l’API ; certaines ont un taux de crédits supérieur, signalé par credit_rate. La présence d’une voix dans le résultat ne promet donc ni gratuité ni validation de sa qualité.

Un refus avant l’inférence et un filtre de sortie n’ont pas la même limite

pre_llm_call peut bloquer un tour avant l’appel d’inférence. Mais une erreur ou un délai dépassé dans ce callback est ignoré : ce n’est pas un filtre de confidentialité qui bloque automatiquement en cas de panne.

Un autre parcours, transform_llm_output avec hold_stream=True, retient la réponse jusqu’à sa réécriture et ne publie pas le texte initial si la réécriture échoue. Ce traitement arrive après l’inférence : il ne retire pas au fournisseur ce qu’il a déjà reçu. Le raisonnement et les progrès d’outils ont leurs propres contrôles.

Migrer un bot sans doubler ses routines

hermes migrate et l’assistant de configuration ajoutent les parcours Grok Bot et OpenBot. Le plugin importateur reste distinct du cœur. Les routines arrivent en pause et l’installation d’origine ne disparaît pas : vérifiez les tâches, la destination et les accès avant de désactiver l’ancien côté puis d’activer le nouveau.

Les mises à jour tentent aussi de reprendre certains plugins désactivés après un échec de téléchargement ou de construction, selon le motif et les dépendances. Le choix d’un fournisseur de mémoire est conservé. Lisez le reçu plutôt que d’assimiler un code de sortie nul à tous les profils et plugins fonctionnels.

Vérifier l’hôte du terminal et les préférences partagées

Chaque onglet de terminal conserve sa passerelle, même si vous en choisissez une autre dans Sessions. Pour une connexion URL ou cloud sans shell distant, le terminal ouvert tourne sur cet appareil et l’indique. Vérifiez ce repère avant une commande destructive : sélectionner un chat distant ne transporte pas automatiquement un terminal déjà ouvert.

Les préférences visuelles sont partagées par les fenêtres et onglets Webapp servis par une même machine ; identifiants, permissions et brouillons ne vont pas dans ce fichier commun. Les groupes Desktop gagnent renommage, dissolution, mentions et collage de pièces jointes, et les profils apparaissent chacun comme section de la barre latérale.

Les changements d’exploitation à regarder après le passage

Avec le backend Docker persistant et sans montage du dossier de travail, les sessions d’un profil partagent son sandbox. Les anciens dossiers par espace de travail sont conservés mais ne servent plus automatiquement : récupérez les fichiers utiles avant tout nettoyage. Avec le montage activé, le découpage par espace reste distinct.

La configuration distante vise les parcs : elle remplace config.yaml, échoue au démarrage si le plan de configuration ne peut pas être lu et autorise des clés verrouillées par l’administrateur. Ce n’est pas une migration nécessaire pour une machine personnelle.

Le gestionnaire de paquets ajoute les téléchargements reprenables et documente la réparation des caches de dépendances endommagés. Sur Linux glibc, les serveurs limitent aussi leurs arènes mémoire ; cette limite ne s’étend pas aux commandes et serveurs MCP qu’ils lancent. Nous n’en déduisons aucune mesure de RAM gagnée.

Les messages changent aussi selon la plateforme

La note inclut les messages vidéo ronds Telegram et les réactions emoji Slack dans le contexte d’un fil. La documentation précise aussi les reçus WhatsApp de livraison, lecture, lecture audio ou erreur dans les journaux : une ligne de statut n’est pas une nouvelle réponse de l’utilisateur.

Ces fonctions restent soumises aux accès de la plateforme. Une question adressée à un groupe Telegram peut aussi rester sans réponse lorsqu’elle ne vise pas l’agent ; ne traduisez pas le silence en panne certaine. Nous n’avons envoyé aucun message ni testé ces plateformes pour cette lecture.

Un navigateur local reste capable de joindre le réseau local

La documentation du tag précise que security.allow_private_urls désactivé ne coupe pas tous les chemins vers un hôte privé. Avec un terminal local, Chromium local peut encore ouvrir localhost ou le réseau local. Le routage hybride par défaut peut aussi envoyer une URL privée vers un navigateur auxiliaire sur l’hôte Hermes. Un réglage de l’outil n’est donc pas une isolation réseau de la machine.

Pour les métadonnées cloud, le refus décrit vise les URL littérales reconnues dans le code ou dans les requêtes CDP qui les chargent. Il ne couvre ni une URL assemblée à l’exécution, ni les redirections ou requêtes ultérieures de la page, ni le terminal. Des paramètres CDP qui ne chargent rien, comme un texte saisi ou la portée d’un cookie, ne passent pas par ce contrôle. Sur un serveur cloud, la documentation demande aussi une restriction au niveau réseau : le seul réglage ne constitue pas une barrière complète.

Sur Ubuntu 23.10 et versions ultérieures soumis à la restriction AppArmor des espaces de noms utilisateur, le lanceur privilégie le helper chrome-sandbox détenu par root. Si sa préparation échoue aussi, il peut démarrer sans sandbox Chromium et l’annonce. L’option d’installation d’un profil AppArmor sur un chemin de code modifiable par votre compte élargit les droits de ce chemin ; elle n’est pas une réparation neutre à appliquer aveuglément. Ces indications concernent le parcours documenté de construction et lancement, pas la disponibilité de chaque installateur .exe ou .dmg.

Le jeton partagé du dashboard donne toute son autorité

Le fournisseur intégré de jeton de session peut authentifier les accès REST et WebSocket du dashboard lorsqu’un jeton de déploiement est fourni. Il n’ajoute pas une connexion interactive de navigateur. Toute personne qui possède ce jeton reçoit l’accès complet du dashboard, sans identité individuelle derrière ce secret partagé.

Conservez-le dans un gestionnaire de secrets et renouvelez-le avec son déploiement : les copies enregistrées dans les clients deviennent invalides et doivent être remplacées. Pour un service partagé ou exposé sur Internet, la documentation recommande plutôt une authentification par compte Nous ou OIDC. Nous avons rapproché le document et le module du tag ; nous n’avons ni provisionné un jeton ni testé l’authentification.

Une session fermée automatiquement reste récupérable

Une session locale CLI, TUI ou Desktop dont le dernier client a disparu peut être marquée terminée après un délai de grâce de 300 secondes par défaut. Après un redémarrage, le parcours décrit n’agit pas avant six heures depuis la dernière activité. Un tour actif continue ; un tour interrompu encore en attente garde sa session ouverte. La fermeture ne supprime pas la conversation : le message suivant peut la reprendre avec le même identifiant.

L’optimisation du stockage continue aussi de surveiller les autres processus qui tiennent la base et laisse passer leurs écritures entre les blocs, au prix d’un traitement plus lent. Cela ne rend pas --force anodin. Suivez le diagnostic des détenteurs de la base et conservez les fichiers de récupération ; ne supprimez pas state.db-wal pour accélérer une maintenance.

Boutons Discord et autorisations macOS : regarder le bon processus

Sur Discord, le délai des boutons interactifs est distinct de celui de l’attente d’approbation. Le premier vaut 300 secondes par défaut, avec un minimum de 30 secondes. Une carte cesse de répondre quand sa propre demande est résolue, annulée ou expirée ; prolonger la vue ne prolonge pas cette demande. Un bouton disparu ne prouve donc pas, à lui seul, la fin du travail en attente.

Sur macOS, une passerelle démarrée sans service installé peut passer par un job launchd ponctuel pour conserver son accès au réseau local après la fermeture de l’application qui l’a lancée. Ce job n’est ni installé pour le prochain démarrage de session ni relancé automatiquement. Les demandes d’accès aux fichiers peuvent alors nommer osascript plutôt que Hermes. Rapprochez la demande du processus que vous avez lancé, sans autoriser un dialogue inattendu sur le seul nom affiché.

Une reprise peut rejouer un effet déjà produit

Pour Kanban, une admission incertaine conserve sa protection tant que l’interpréteur lié peut encore tourner. Mais une tentative dont l’exécution est reconnue terminée peut revenir dans la file et produire une nouvelle tentative. La documentation du tag demande d’examiner les effets, puis de terminer ou bloquer la carte avant de résoudre une admission inconnue si l’on veut éviter cette répétition. Ne débloquez la carte que si une nouvelle tentative est voulue : l’absence de compte rendu ne prouve pas l’absence d’écriture.

Bot Screen a un autre arrêt : un écran inutilisé se ferme après 30 minutes par défaut, même si la passerelle qui l’avait lancé ne revient pas. Une reprise en main humaine reste conservée tant que le visualiseur manifeste une activité. Sans utilisation pendant quatre fenêtres d’inactivité, avec un minimum de dix minutes, l’écran peut être arrêté et le contrôle rendu à l’agent. Un visualiseur déconnecté ne réserve donc pas cet écran indéfiniment. Ce délai est configurable ; il ne décrit pas l’arrêt de toutes les tâches du bot.

Un cache de secrets ne devient pas un fichier de diagnostic

Les documents du tag placent les caches Bitwarden et 1Password et l’état Photon à la racine du répertoire Hermes concerné, et non dans ses sous-dossiers cache ou runtime. Les noms à protéger sont bws_cache.json, bws_cache.enc.json, op_cache.json et photon-sidecar.json. Le cache 1Password contient les valeurs résolues des secrets ; le fichier Photon contient le port et le jeton du composant auxiliaire. Ne joignez pas ces fichiers à un ticket pour dépanner un démarrage.

Le cache Bitwarden chiffré reste une option désactivée par défaut. Son éventuel secours périmé est réservé aux échecs réseau ou délais dépassés, dans l’âge autorisé ; une erreur d’authentification ne l’utilise pas. Chez 1Password, cache_ttl_seconds à 0 coupe les lectures et écritures du cache. Ces réglages ne constituent ni un audit des fichiers de votre installation ni une permission de supprimer leurs anciennes copies sans vérifier leur rôle.

Un fichier .env illisible peut être ignoré sous une condition précise

Le parcours administré accepte un fichier .env de profil existant mais illisible comme absent, avec avertissement, seulement si la configuration administrée fixe un terminal.backend non vide. Sans cette condition, l’erreur de lecture arrête encore Hermes. Ce cas vise notamment un lanceur cloisonné qui fournit les clés par l’environnement ; il n’autorise pas à rendre le fichier lisible par tout le monde pour faire disparaître l’erreur.

Ne confondez pas cette règle avec un coffre : le .env administré décrit dans /etc/hermes est lisible par les utilisateurs locaux. La documentation le réserve donc aux valeurs partagées non sensibles. Les permissions et le chemin administré restent à vérifier ; ce mécanisme de gestion n’est pas une isolation que l’agent ne pourrait jamais contourner.

Configuration : reconnaître un changement et le plugin qui lit une clé

Le code et la documentation du tag 0.22.6 ajoutent une empreinte de contenu aux signatures des caches de configuration pour les écritures récentes. Deux fichiers de même taille réécrits rapidement ne doivent plus être départagés par le seul horodatage. Le contrôle prend aussi en compte ctime lorsque la copie a conservé un ancien mtime. Cela concerne la relecture de configuration, pas la preuve qu’une clé tournée a été acceptée par son fournisseur ; vérifiez séparément la connexion et ne joignez jamais les fichiers de secrets au diagnostic.

Un plugin actif peut déclarer avec config_keys les chemins précis qu’il lit dans les sections de configuration d’Hermes. Ces chemins deviennent reconnus par hermes config get/set, y compris pour le fournisseur de mémoire sélectionné. La déclaration exige au moins deux segments et ne remplace pas les clés déjà définies par le cœur. Elle ne rend pas toute la section libre ni un plugin désactivé actif. Ce sont des règles lues dans le tag et son code, sans installation ou rotation de clé testée par SecuFocus.

Nix, nettoyage des dépendances et délais Bedrock

Avec Nix, extraDependencyGroups ajoute des groupes de dépendances à ceux du paquet choisi ; il ne les remplace pas. Pour alléger l’installation, il faut partir d’un paquet plus petit ou modifier explicitement defaultDependencyGroups. Les dépendances sont résolues à la construction, pas installées après coup dans le magasin Nix en lecture seule. Le shell de développement fournit aussi son environnement Python éditable autonome, sans dépendre du PYTHONPATH du terminal appelant.

Le nettoyage peut récupérer l’état de dépendances d’une copie de travail devenue introuvable hors du répertoire de données et des worktrees, après 14 jours sans utilisation par défaut. worktrees.install_state_retention_days se lit dans le profil racine, car les profils partagent ces installations ; la valeur 0 désactive cette expiration. Un verrou d’installation ou un bail de génération encore tenu protège cet état. Cela ne remplace pas une sauvegarde du travail, et SecuFocus n’a exécuté aucun nettoyage.

Sur AWS Bedrock, le délai résolu pour le modèle actif s’applique à la lecture de socket de Converse ou du client AnthropicBedrock. Un changement de modèle ou un repli reprend son délai propre ; le délai de connexion reste distinct. Ce réglage ne borne donc pas la durée totale de l’appel. Nous avons rapproché ces documents et le code du tag stable, sans construction Nix ni appel facturé à Bedrock.

Ce qui a été vérifié pour cette lecture

Nous avons rapproché les notes de version et les documents présents dans le commit du tag, plutôt que d’attribuer à 0.22.6 tout ce que la documentation de main décrit déjà. La documentation courante reste la référence pour le fonctionnement le plus récent ; elle peut avancer après la publication.

SecuFocus n’a installé ni la version ni ses plugins et n’a testé ni migration de coffre, connexion distante, facturation ou compatibilité réelle d’un appareil. Avant de rétablir les écritures importantes, vérifiez votre canal, le reçu de mise à jour, la passerelle active et une tâche sur des données non sensibles.

Vérifier, approfondir

Les sources de cet article

Les numéros relient chaque référence aux passages qui l’utilisent. La date indique quand la documentation a été consultée.

  1. Nous Research : Hermes Agent v0.22.6, notes et canaux de mise à jour ↗github.com ·

Cet article s’appuie sur les sources ci-dessus. Les exercices proposés sont à réaliser sur vos appareils ; SecuFocus ne les présente pas comme des essais menés par la rédaction. Les interfaces et les fonctions peuvent changer. Méthode et corrections.

Citer cet article

Pour retrouver cette lecture ou la partager avec sa référence.