Retour au journal de dev Notes de version · iPhone et iPad

SharkTTY 1.8.1 : elle écoute maintenant

· Safafish

La note App Store de la 1.8.1 tient en quatre lignes consacrées à la souris virtuelle. La build qui se trouve derrière représente neuf jours de travail et le plus grand bond que l’app iPhone et iPad ait connu cette année : la saisie vocale avec une couche d’IA facultative, un clavier reconstruit autour de vraies données de disposition, un client pour un troisième protocole de terminal, des liens de partage pour un Mac, et un format de synchronisation conçu pour survivre à ses propres versions futures. Voici la version longue.

Elle écoute maintenant

Taper une commande shell sur un téléphone est la pire partie de l’usage d’un terminal sur un téléphone. La 1.8.1 a donc ajouté la saisie vocale, construite par étapes sur environ une semaine.

La première étape est celle qui compte le plus et ne coûte rien : maintenez le micro, parlez, et la reconnaissance tourne sur l’appareil. Gratuite, hors ligne, et rien ne quitte le téléphone. Ce qu’elle a entendu arrive dans un panneau vocal sous forme de texte modifiable, et vous l’insérez dans le terminal quand il vous paraît juste — pas avant.

La deuxième étape concerne les fois où il ne l’est pas. Les enregistrements sont conservés par segments : vous pouvez en rogner un et reconnaître à nouveau cette seule partie plutôt que répéter toute la phrase, et un historique garde les enregistrements passés pour les réécouter et retenter. Sur iPad, le panneau vocal flotte et se redimensionne comme le clavier transparent, parce que sur un grand écran un panneau fixe au mauvais endroit est un problème en soi.

Et, si vous le voulez, elle réfléchit

La reconnaissance vous donne des mots. Une commande demande plus que des mots — il lui faut des options dans le bon ordre et pas d’espaces là où il ne doit pas y en avoir. La couche d’IA de la 1.8.1 est entièrement facultative et entièrement distincte de la reconnaissance.

Apportez votre propre fournisseur : les formats d’API OpenAI, Claude, Gemini, Kimi et GLM sont pris en charge, et vous définissez un modèle de dialogue plus, si ce fournisseur en propose un, un modèle de transcription. Claude ne fait que du dialogue et n’a pas d’API audio : les enregistrements y basculent vers la reconnaissance sur l’appareil plutôt que d’échouer. Les clés de fournisseur vivent dans le Keychain de cet appareil et sont délibérément exclues de la synchronisation.

Avec un fournisseur connecté, les modes d’invite transforment ce que vous avez dit en texte propre ou en commande exécutable, et une option pour joindre le contexte du terminal permet au modèle de voir ce qui est réellement à l’écran avant de répondre. Il y a aussi un panneau de dialogue : la question que vous auriez autrement posée dans un onglet de navigateur se pose à côté de la session.

Pour qui préfère ne pas gérer de clé d’API, des modèles cloud officiels sont disponibles après connexion, payés en Points achetés par achat intégré et partagés entre vos appareils. La reconnaissance sur l’appareil reste gratuite dans les deux cas, et c’est le réglage par défaut.

Un clavier avec de vraies dispositions

Le clavier flottant, jusqu’à la 1.8, était une unique disposition américaine écrite en dur. La 1.8.1 l’a rendu piloté par les données et en a livré six : anglais américain, anglais britannique, japonais (JIS), français (AZERTY), allemand (QWERTZ) et espagnol, commutables dans les réglages en même temps que le choix du clavier.

Les dispositions pilotées par les données réclament un test dont les dispositions écrites en dur se passent, parce qu’une disposition est désormais un tableau saisi par quelqu’un. Nous avons ajouté un test d’accessibilité des caractères — pour chaque disposition, chaque caractère attendu est-il réellement atteignable par une combinaison de touches ? Il a immédiatement trouvé deux vrais bugs : AZERTY n’avait aucun *, et la disposition JIS ancrait fn à la mauvaise touche, ce qui décalait la rangée F. Aucun des deux n’aurait été repéré par quelqu’un qui teste en anglais.

Au-dessus des touches, il y a maintenant une bande de suggestions alimentée par un moteur de suggestion de mots réglé pour le contexte du terminal et les commandes courantes, et le micro a rejoint la barre supérieure avec deux comportements : le toucher pour passer au panneau vocal, le maintenir pour parler directement dans la bande de suggestions. Ce geste de maintien s’est révélé plus difficile qu’il n’y paraît — l’API d’appui long évidente de SwiftUI ne sait pas dire quand le doigt se lève, ce que nous avons raconté à part dans un article sur les boutons maintenir-pour-enregistrer.

Une troisième voie d’accès : Eternal Terminal

Mosh est ce qui garde une session vivante à travers un tunnel de train, et il fonctionne en UDP. Beaucoup de réseaux d’entreprise et d’hôtel laissent passer le TCP et rien d’autre, ce qui laisse ces utilisateurs avec du SSH simple et aucune persistance de session. Eternal Terminal résout le même problème en TCP, et beaucoup de gens font déjà tourner etserver. Nous avions parlé du client la semaine précédente ; la 1.8.1 est la build dans laquelle il a atterri.

Il est arrivé comme doit arriver un transport expérimental : d’abord une crate Rust isolée, dont rien d’autre ne pouvait dépendre ; puis câblée à travers le FFI dans l’app Swift derrière un drapeau ; puis, une fois que cela fonctionnait, une vraie interface dans l’éditeur d’hôte, un interrupteur dans les réglages, des messages d’erreur qui nomment la cause réelle, et des traductions. Deux tours de relecture ont suivi sur les chemins d’échec, là où un client réseau a le plus de chances de se tromper en silence.

Il reste désactivé par défaut. Activez le transport ET dans les Réglages et il apparaît comme troisième méthode de connexion à côté de SSH et Mosh. Un point à anticiper : comme l’UDP de Mosh, la connexion de données ET va directement de l’appareil au port etserver et n’est pas relayée par un hôte relais.

Une configuration qui survit à son propre avenir

L’agent Mac s’est doté durant cette période de sa propre liste d’hôtes et de son propre terminal, ce qui obligeait le téléphone et le Mac à s’accorder sur ce qu’est un hôte. La 1.8.1 a introduit un paquet partagé qui contient le schéma canonique des hôtes et des scripts, utilisé par les deux, plus un client de synchronisation de configuration et le coordinateur qui le pilote.

Partager un schéma entre deux apps qui se mettent à jour indépendamment crée un danger précis, et nous l’avons rencontré : un client plus ancien décode une valeur dont il n’a jamais entendu parler, puis réécrit l’enregistrement entier et le détruit. Le correctif — des enums qui préservent leur valeur brute, un sac pour les champs inconnus, et des tests qui verrouillent le contrat — est raconté dans Codable rétro-tolérant. Dans cette build, ce motif a été appliqué aux hôtes d’abord, puis à tous les autres modèles synchronisés, y compris les champs inconnus par entrée sur les bureaux enregistrés.

Ce qui se synchronise et ce qui ne se synchronise pas est resté inchangé et explicite : hôtes, scripts, lecteurs, modèles et réglages sont synchronisés vers le serveur sous votre compte. Les mots de passe, les clés privées SSH et leurs phrases secrètes ne quittent jamais l’appareil — ils vivent dans le Keychain iOS, en voyageant éventuellement de bout en bout par le Trousseau iCloud, sans rien à compromettre côté serveur.

Partager un Mac avec quelqu’un d’autre

La 1.8.1 a ajouté le côté visionneuse des liens de partage : une liste Partagés avec moi, la prise en charge du transport pour se connecter par un partage plutôt que par une chaîne d’appairage, et la gestion des sessions soumises à l’approbation du propriétaire. Les erreurs sont précises à dessein — un lien expiré, un lien révoqué, toutes les places simultanées prises, un compte absent de la liste autorisée et une connexion en dehors d’une plage réservée disent chacun ce qui s’est passé, parce que « impossible de se connecter » ne sert à rien quand la solution dépend de la raison.

Également dans cette version : déconnecter un bureau à distance conserve son onglet, comme l’a toujours fait une connexion SSH, si bien que vous vous reconnectez depuis l’incrustation au lieu de tout reconfigurer.

La souris virtuelle trouve où se poser

C’est la partie que décrit la note App Store. Les boutons de la souris pouvaient être séparés et placés, ce qui était souple et faisait qu’ils n’étaient jamais tout à fait là où se trouvait votre main. Ils s’ancrent désormais : un seul panneau le long du bas de l’écran, qui coulisse à gauche ou à droite selon la façon dont vous tenez l’appareil, et qui remonte au-dessus du clavier à l’écran dès que l’un est ouvert.

L’ancrage a aussi corrigé la pire habitude de la loupe. En flottement libre, elle devait esquiver les bords de l’écran, ce qui la faisait bouger quand vous ne vous y attendiez pas et désalignait la vue agrandie par rapport au curseur. Ancrée, elle se place juste au-dessus du curseur et y reste. Deux corrections liées : faire glisser un doigt hors du bord de l’écran ne fait plus sauter le curseur ni ne laisse un bouton enfoncé — un toucher annulé est maintenant traité comme un toucher annulé — et ⌘, ⌥ et ⌃ ne restent plus enfoncés de temps à autre pour transformer votre frappe suivante en raccourci surprise.

Une cloche que l’on entend depuis une autre app

Quand un terminal sonne sa cloche et que cette session n’est pas celle que vous regardez, iOS envoie désormais une notification. Ajoutez printf '\a' à la fin d’une compilation longue et votre téléphone vous prévient quand elle est terminée. Les cloches de la session que vous regardez vraiment restent silencieuses, et c’est toute l’astuce.

L’intendance qui mérite d’être citée

  • Un audit complet de la localisation à la fin du travail sur le clavier : 639 clés vérifiées, plus aucun doublon.
  • Deux corrections d’exactitude issues de la relecture : une situation de concurrence dans l’état du décodeur, et des mots de passe du Keychain qui pouvaient rester orphelins à la disparition d’un hôte.
  • Le chemin audio Opus de la 1.8 s’est achevé ici — un encodeur tamponné produisant des trames de 20 ms à partir de PCM quelconque, la lecture côté visionneuse, et une correction pour lire du PCM entrelacé dans la liste de tampons audio.
  • Les cibles de test sont descendues à iOS 17.0 pour correspondre à l’app elle-même : les tests s’exécutent donc partout où l’app s’exécute.

Tout cela est gratuit. Y compris la reconnaissance vocale sur l’appareil.

Lire cet article en : English · 中文 · 日本語 · Español · Français · 한국어 · Українська

Pour en savoir plus sur l’app, consultez le guide SharkTTY ; les notes courtes destinées aux utilisateurs se trouvent dans Nouveautés, et le moyen le plus rapide de nous joindre reste le tableau de retours. Retour au journal de dev.