Trois choses ce mois-ci : une build corrective de SharkTTY Desk téléchargeable dès aujourd'hui, un point honnête sur ce qui avance côté iPhone et iPad (qui avance — rien de tout cela n'est encore sorti), et un rapport d'étape sur un transport de terminal expérimental. Voici la version ingénierie ; les notes utilisateur, plus courtes, vivent dans Nouveautés.
SharkTTY Desk 0.8.0 — build du 10 juillet (disponible)
C'est une build de suivi du 0.8.0 de la semaine dernière, toujours en version 0.8.0. À télécharger ici.
Le bogue « Arrêter le partage »
Celui-là, nous l'avons rencontré nous-mêmes, à l'usage quotidien. Quand votre écran est visionné, macOS affiche son propre indicateur dans la barre des menus, avec sa propre commande « Arrêter le partage ». Terminer la session depuis là — plutôt que depuis SharkTTY — pouvait coincer Desk : le code QR disparaissait, le service se disait en démarrage, et chaque reconnexion échouait, jusqu'à quitter et relancer l'app. Couper puis remettre le contrôle à distance n'y changeait rien. C'est la pire famille de pannes : pas un crash à signaler, juste un service qui cesse silencieusement d'en être un.
Ce qui se passait vraiment : à la fin d'une session, l'agent reconstruit son écouteur réseau pour la connexion suivante, et cette reconstruction doit récupérer le même port local. Or la libération du port de l'ancien écouteur n'était qu'un effet de bord d'un nettoyage interne dont le moment dépendait de la façon dont la session s'était terminée — et sur ce chemin précis, le nettoyage pouvait traîner loin derrière la reconstruction, voire ne jamais aboutir. La reconstruction tentait le bind, trouvait le port encore occupé, abandonnait après une fenêtre de reprises qui s'est révélée plus courte que le nettoyage, et laissait l'agent sans le moindre écouteur. Vu de l'extérieur : « démarrage », pour toujours.
Le correctif transforme cette passation de coïncidence en contrat : l'arrêt libère désormais le port explicitement et confirme la libération avant d'autoriser la reconstruction ; le rebind lui-même est plus patient et journalise chaque tentative, pour qu'un rapport futur se diagnostique depuis la Console. La leçon que nous en tirons : le démontage mérite le même déterminisme que le démarrage. « Le port finira bien par se libérer » n'est pas un contrat.
Affichage de la clé de connexion
Trois petits correctifs d'affichage de la clé de connexion sur le Mac — rien ne change dans la façon dont la clé est générée ou protégée. La clé masquée affiche désormais un espace réservé de longueur fixe plutôt qu'un point par caractère : le masque ne trahit plus la longueur. Les clés personnalisées très longues se réduisent pour tenir sur une ligne au lieu de déborder de la carte (le coupable : un interlettrage qui ne rétrécissait pas avec la police). Et Desk retient d'un lancement à l'autre que vous l'avez masquée — la masquer ne devrait pas être une corvée à répéter chaque matin. La révéler demande toujours Touch ID ou votre mot de passe, comme avant.
Compatibilité inchangée : cette build fonctionne avec SharkTTY 1.6 ou ultérieur sur iPhone et iPad. Si votre app est plus ancienne, la build SharkTTY Desk 0.5.0 reste disponible.
SharkTTY pour iPhone et iPad — en développement
Soyons clairs d'emblée : rien de cette section n'est sorti. C'est ce qui fonctionne déjà dans nos builds de développement, en route vers la prochaine mise à jour de l'App Store — nous préférons vous dire où en sont les choses plutôt que de nous taire jusqu'au lancement.
Le clavier flottant, deuxième acte
Le clavier flottant entame son deuxième acte. Il passe d'une disposition à six —
US, UK ISO, JIS japonais, AZERTY français, QWERTZ allemand, espagnole ISO — et ce
sont de vraies dispositions, pas des touches réétiquetées : les européennes portent
un vrai troisième niveau AltGr (un terminal privé de
| { } [ ] \ n'est
pas un terminal), les claviers ISO gagnent leur touche supplémentaire près du Maj
gauche, et la rangée fn→F1–F12 est mappée par position physique pour chaque
disposition. Nous avons écrit un test qui parcourt chaque disposition et prouve que
chaque caractère critique du terminal est atteignable — il a attrapé deux touches
manquantes pendant le développement, exactement le genre de honte qu'un test doit
savoir infliger. Le passage entre clavier flottant, panneau vocal et clavier système
loge désormais dans le popover de réglages du clavier lui-même, là où il aurait
toujours dû être.
Au-dessus des touches, une nouvelle bande de candidats : des complétions tirées de ce que votre terminal vient d'afficher, des mots tapés dans la session et d'une courte liste de commandes shell usuelles. Tout est calculé sur l'appareil, à partir de texte que votre écran montre déjà — rien ne part nulle part pour produire une suggestion. Le bouton micro du clavier gagne la dictée en maintien (appuyez pour parler) avec aperçu en direct dans cette même bande, et le résultat n'est inséré que lorsque vous le touchez. Ce dernier point est délibéré : un terminal ne pardonne pas les mots mal entendus, la voix ne va donc jamais directement au shell.
Panneau de saisie vocale
Le panneau vocal adopte les manières de fenêtre que le clavier flottant possède déjà : on le déplace, on le redimensionne, on baisse son opacité jusqu'à lire le shell au travers. Un seul jeu de commandes, deux panneaux, aucune surprise.
Des onglets de bureau à distance qui survivent à la coupure
Un correctif de cohérence qui se faisait attendre : déconnecter une session de bureau à distance fermait son onglet, alors que déconnecter une session SSH le gardait avec un bouton de reconnexion. Une même app, deux philosophies. Les onglets Desk se comportent désormais comme les onglets SSH — la déconnexion garde l'onglet, la reconnexion tient en un geste, et fermer un onglet ne se fait que sur l'onglet lui-même.
Robustesse de la synchronisation
Le travail le moins visible du mois, et peut-être le plus important. Vos hôtes, scripts et réglages se synchronisent entre appareils, et pendant tout déploiement vos appareils font tourner un mélange de versions — ce n'est pas un cas limite, c'est l'état normal du monde pendant des semaines autour de chaque sortie. Nous avons refondu la gestion du format de synchronisation pour que les données écrites par une version plus récente traversent une version plus ancienne sans une égratignure : la vieille app conserve ce qu'elle ne comprend pas et le réécrit tel quel, au lieu de s'étrangler ou de l'aplatir en douce dans la forme qu'elle connaît. La règle que nous nous imposons désormais est simple : une vieille app ne doit jamais pouvoir détruire ce qu'une plus récente a écrit. Vous ne verrez jamais cette fonctionnalité — c'est exactement le but.
Expérimental : le transport Eternal Terminal
SharkTTY parle SSH et Mosh. Mosh, c'est ce qui fait qu'un terminal survit à un
tunnel ferroviaire — mais il roule sur UDP, et certains réseaux ne laissent tout
simplement pas passer l'UDP.
Eternal Terminal
résout le même problème en TCP pur, et beaucoup de gens font déjà tourner
etserver sur leurs
machines. Notre position est simple : si vous opérez déjà un serveur qui résout ce
problème, vous ne devriez pas avoir besoin de notre infrastructure pour en profiter
— c'est à l'app de parler la langue de votre serveur.
Nous avons donc écrit, de zéro et en Rust, un client du protocole ouvert ET ; il
boucle désormais le trajet complet face à un vrai
etserver : se
connecter, taper, couper le lien en pleine session, se reconnecter, ne rien perdre.
Il patiente derrière un drapeau expérimental le temps d'accumuler du kilométrage
réel ; ensuite, il apparaîtra comme troisième transport au choix par hôte, aux côtés
de SSH et Mosh. Si vous faites tourner
etserver aujourd'hui
et voulez donner des coups de pied dans les pneus à l'ouverture du drapeau, gardez
un œil sur ce blog.
Des questions ou des bogues sur tout ça ? Le tableau de retours est le chemin le plus court.