veilletech.fr
7 oct. Feed du jour
#07 OUTILS Article

OSC 7501 : le programme dit au terminal où il en est

Le programme sait où il en est. Il peut enfin le dire.

Mitchell Hashimoto propose OSC 7501, une séquence d'échappement par laquelle un programme indique à son terminal s'il travaille, a fini, a échoué ou attend l'utilisateur, et pourquoi. Pensé avec les agents de code en tête mais générique, le protocole passe par le pty, donc à travers SSH et les conteneurs, et s'émet en une ligne de shell. Il est implémenté dans libghostty et Rex.

3 min de lectureintermédiairevidéo 1:20
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Le problème
  3. Le protocole
  4. Comment s'y prendre
  5. Les limites
  6. À retenir

Ce qui se passe

Mitchell Hashimoto, créateur de Ghostty, publie la spécification d'une nouvelle séquence d'échappement : OSC 7501, le Program Status Protocol. Elle permet à n'importe quel programme de dire à son terminal ce qu'il fait — au repos, en cours, terminé, en échec ou bloqué — et pourquoi.

Le problème

Builds, déploiements, mises à jour de paquets et, de plus en plus, agents de code alternent travail autonome, attente de l'utilisateur et fin de tâche, pendant que l'utilisateur fait autre chose. Une nouvelle famille d'outils, que l'auteur appelle « boîtes de réception d'agents » (Herdr, cmux, Agent Deck…), affiche l'état de tous les agents en cours. Sans protocole, ces outils n'ont que deux options :

Le protocole

Le programme écrit la séquence sur son pty, comme du texte. Un terminal correct ignore les OSC qu'il ne connaît pas : l'émettre ne casse rien. Le corps est une liste de paires clé=valeur séparées par :, dont une seule obligatoire, state :

state Sens
idle au repos, attend la prochaine instruction
working en cours, avec éventuellement un progress en pourcentage
done terminé, résultat pas encore consulté
blocked attend l'utilisateur ; kind vaut permission, question ou auth
error échec, arrêt

Parmi les clés facultatives : app, un nom stable comme cargo ou claude-code, et msg, une ligne lisible encodée en base64. Des identifiants hiérarchiques permettent plusieurs états simultanés : un outil de déploiement working à la racine, avec us-east à 40 % et eu-west bloqué en attente d'approbation. L'état clear efface un enregistrement.

Comment s'y prendre

L'auteur donne une fonction shell POSIX qui enveloppe rsync :

Terminal
status() {
  printf '\e]7501;state=%s:msg=%s\e\\' "$1" "$(printf '%s' "$2" | base64 | tr -d '\n')"
}
status working "Syncing photos"
rsync -a ~/Photos backup:/photos && status done "Photos synced" || status error "rsync failed"

Ni SDK, ni socket, ni variable d'environnement, ni JSON. La spécification, courte, couvre aussi la durée de vie des enregistrements, la détection de prise en charge, terminfo, les limites de taille et la sécurité.

Les limites

C'est une proposition, pas un standard. Deux implémentations existent, dans libghostty et dans Rex, l'outil de Superlogical. Les intégrations à Terraform, Claude Code, Codex et Homebrew sont des preuves de concept, par plugin ou par fork, d'une douzaine de lignes chacune selon l'auteur. Des mainteneurs de terminaux ont relu le texte ; leur adoption reste à venir.

Source : A Terminal Protocol for Program Status (OSC 7501), Mitchell Hashimoto, 6 octobre 2026, repéré via Lobste.rs.