Cette page est traduite de la documentation anglaise. Les commandes, identifiants et exemples sont inchangés. Runtime 7.24.4 · SDK 2.6.7. Source anglaise
Exploiter AX Code pour un travail de longue durée
Statut : actif Portée : état actuel Dernière revue : 2026-09-13 Responsable : mainteneurs d’AX Code
AX Code borne une exécution interactive Super-Long à 72 heures. Pour une exploitation sur
des jours ou des semaines, lancez un processus ax-code serve supervisé et divisez le travail
en occurrences planifiées durables. Le superviseur redémarre le serveur ; la
base du projet conserve les planifications et l’état de la file.
Espace de travail interactif persistant
Pour un travail local qui doit continuer après la fermeture du terminal, activez un runtime de projet :
ax-code runtime start --dir /absolute/path/project
ax-code runtime attach --dir /absolute/path/project --continue
ax-code runtime status --dir /absolute/path/project
ax-code runtime list # every managed runtime on this machine
ax-code runtime stop --dir /absolute/path/project
runtime attach démarre aussi le runtime lorsqu’il n’en existe pas. Le runtime est indexé
par le répertoire canonique du projet ; des démarrages simultanés réutilisent un seul processus.
Le TUI montre son hôte d’exécution et une action Déconnecter. Déconnecter
ferme le client et laisse le travail accepté continuer. runtime stop arrête
le runtime de ce projet et interrompt son travail actif. Un ax-code ordinaire
conserve son cycle de vie au premier plan existant.
Les suites acceptées, soumises pendant qu’une session est occupée, sont enregistrées sur le serveur.
Par défaut, elles démarrent après la fin du tour en cours, afin qu’une requête sans lien
ne détourne pas le travail en cours. Pour corriger le tour en cours à la place, appuyez sur
ctrl+s (input_submit_steer dans keybinds) avec un brouillon seulement texte : le texte
est admis dans la génération active et écrit comme message utilisateur à la
prochaine frontière d’étape de la boucle, après que les appels d’outils en cours se stabilisent et avant la
requête de modèle suivante. Une correction admise pendant que le tour se termine prolonge
l’exécution d’une itération au lieu d’être abandonnée. Le pilotage est au mieux : si
plus aucune génération n’est active, le brouillon est envoyé par le chemin ordinaire ;
si un crochet le refuse, le brouillon reste dans le compositeur avec la raison. Les brouillons
avec pièces jointes et commandes slash utilisent toujours la file des suites. La même
livraison est offerte aux autres clients par l’API de pilotage décrite dans les
contrôles du harnais.
Les suites enregistrées peuvent aussi être pilotées après coup : appuyer sur ctrl+s avec un
compositeur vide promeut, dans l’ordre, le préfixe pilotable de la file et s’arrête
à la première ligne non pilotable. La section Suites de la barre latérale et la
boîte /queue offrent la même action de pilotage immédiat par ligne. Les lignes en pause sont
pilotables sur place : interrompre un tour met en pause les suites en attente, et
en piloter une livre son texte sans reprendre le reste de la file. Seules
les lignes qui ne sont pas des suites (commandes slash en file, commandes shell), les lignes avec
pièces jointes, le texte vide ou trop long, et les lignes déjà en cours ou terminées sont
des barrières. Les lignes pilotées sont annulées avec une piste d’audit steeredInto et restent
visibles dans l’historique /queue. Lorsqu’aucune génération n’est active, le pilotage immédiat
revient à placer la ligne en tête de file : elle ne démarre encore
qu’après la fin du tour.
Le compositeur ne se vide qu’après l’accusé de réception. Rattachez-vous à la même session
et utilisez /queue pour inspecter, mettre en pause, modifier, reprendre ou annuler ces éléments. Modifier met d’abord
l’élément en pause et conserve les pièces jointes et la sélection de modèle ; enregistrer ne
le reprend pas. Les modifications périmées simultanées sont rejetées. Dans /queue, Ctrl+R inclut
l’historique terminé et annulé. Les terminaux étroits montrent aussi un titre
Follow-ups cliquable. Une vue déconnectée est mise en cache et ne peut pas changer les éléments.
Interrompre le tour actif met en pause les suites en attente, afin qu’elles ne démarrent pas
immédiatement un autre tour. Reprenez-les explicitement lorsque vous êtes prêt.
Après un redémarrage du backend, les suites en attente déjà acceptées peuvent reprendre. Une invite ordinaire en cours, interrompue par ce redémarrage, est marquée en échec et exige une inspection avant un nouvel essai ; restaurer les enregistrements de file ne restaure pas un processus shell en cours d’exécution. Un accusé perdu peut être réessayé depuis le compositeur inchangé, avec la même identité de requête, pendant cette session client. Les brouillons non enregistrés ne sont pas des travaux acceptés, et cela ne garantit pas des effets externes exactement une fois.
Ce mode n’installe pas de service lancé à la connexion, ne redémarre pas automatiquement un serveur planté et n’exécute rien pendant que l’hôte dort ou est éteint. Démarrez ou rattachez de nouveau après un plantage ; utilisez les exemples de service supervisé plus bas pour des redémarrages de serveur sans surveillance. Les utilisateurs SSH doivent exécuter le runtime sur un hôte distant éveillé et s’y attacher. N’exposez pas le port HTTP publiquement.
La découverte du runtime stocke une capacité privée et un journal dans le dossier runtime/ du répertoire
d’état d’AX Code. La sortie de statut omet la capacité. L’arrêt
exige une identité de runtime authentifiée et correspondante, pas seulement un PID enregistré.
Un processus en direct indisponible, un enregistrement corrompu ou un écart de version exige
une inspection ; la CLI refuse de tuer un processus non vérifié. Arrêtez un runtime
sain avant une mise à niveau, puis redémarrez-le avec le nouvel exécutable.
Modèle de fiabilité
| Événement | Comportement |
|---|---|
| Le backend sort avant qu’une occurrence échue soit validée | L’occurrence reste échue |
| Le backend sort après la validation planification vers file | Le même élément en file est repris à l’amorçage |
| Le backend sort après le démarrage d’une invite | L’élément interrompu est marqué en échec, sans rejeu automatique |
| L’hôte manque plusieurs occurrences | run_once les fusionne en une exécution ; skip avance sans exécuter |
| Une exécution de file dépasse son échéance | L’exécuteur annule la session et enregistre un élément de file en échec |
| Le superviseur voit la sortie du serveur | Les exemples plus bas le redémarrent après un court délai |
C’est une reprise sûre face aux doublons, pas une livraison exactement une fois pour des effets externes arbitraires. Les intégrations qui écrivent vers des systèmes externes doivent encore utiliser leurs propres clés d’idempotence.
Avant d'installer un service
- Installez et testez l’exécutable
ax-codesous le même utilisateur qui exécutera le service. - Choisissez un chemin de projet absolu. Définissez-le comme
AX_CODE_PROJECTafin que le démarrage du serveur préchauffe ce projet et démarre son planificateur. - Gardez le serveur sur
127.0.0.1; le serveur d’AX Code est seulement local. - Placez les authentifiants des fournisseurs dans l’environnement protégé du superviseur, plutôt que dans un fichier de service validé dans le dépôt.
- Remplacez chaque marque de substitution
/absolute/path/...de l’exemple choisi.
Les exemples utilisent un port fixe, afin que les clients Desktop ou SDK puissent se reconnecter :
ax-code serve --hostname=127.0.0.1 --port=4096
Service utilisateur systemd
Copiez l’exemple systemd vers
~/.config/systemd/user/ax-code.service, remplacez ses chemins absolus et
placez au choix les authentifiants dans ~/.config/ax-code/server.env.
chmod 600 ~/.config/ax-code/server.env
systemctl --user daemon-reload
systemctl --user enable --now ax-code.service
systemctl --user status ax-code.service
journalctl --user -u ax-code.service -f
N’utilisez loginctl enable-linger "$USER" que si votre politique d’exploitation permet au
service utilisateur de tourner lorsque l’utilisateur est déconnecté.
Agent launchd
Copiez l’exemple launchd vers
~/Library/LaunchAgents/com.axcode.server.plist, remplacez ses chemins absolus,
puis validez-le et chargez-le :
plutil -lint ~/Library/LaunchAgents/com.axcode.server.plist
launchctl bootstrap "gui/$(id -u)" ~/Library/LaunchAgents/com.axcode.server.plist
launchctl kickstart -k "gui/$(id -u)/com.axcode.server"
launchd ne développe pas les variables de shell dans ProgramArguments. Utilisez des chemins
absolus et fournissez les authentifiants nécessaires par un mécanisme géré par l’opérateur.
Processus PM2
Copiez l’exemple PM2, remplacez ses chemins et démarrez-le :
pm2 start docs/examples/ax-code-ecosystem.config.cjs
pm2 save
pm2 logs ax-code-server
Suivez les instructions de démarrage propres à la plateforme de PM2 si le processus doit revenir après un redémarrage de l’hôte.
Échéances, rattrapage et reprise
Les tâches planifiées ont catchUpPolicy: "run_once" par défaut. Après un arrêt, AX Code
exécute une occurrence fusionnée, au lieu de créer un arriéré non borné.
Choisissez "skip" lorsqu’un travail en retard serait trompeur ou dangereux.
Chaque tâche planifiée peut définir maxRunDurationMs, de 1 seconde à 72 heures.
Sinon, l’exécution de la file de tâches utilise le plafond de 72 heures. Les éléments actifs mettent à jour un
horodatage de battement toutes les 30 secondes, et le statut final ainsi que les détails d’erreur
restent dans la base du projet.
Les points de terminaison asynchrones d’invite, de commande et de shell renvoient l’élément de file durable dans
leur réponse HTTP 202. Les clients doivent conserver son id et interroger
GET /task-queue/:id jusqu’à completed, failed ou cancelled ; l’acceptation
seule n’est pas l’achèvement.
Au démarrage, un backend AX Code persistant reprend les éléments de file planifiés et les éléments asynchrones explicitement marqués qui ont été validés mais n’avaient pas démarré. Les commandes CLI ponctuelles ne prennent pas possession de ces éléments. Le travail d’invite déjà démarré est marqué en échec, avec une explication de redémarrage, afin qu’un opérateur puisse inspecter les effets de bord avant de réessayer.
Voir ce que font les tâches planifiées
Chaque occurrence de tâche planifiée est visible pendant qu’elle se produit, et auditable ensuite :
- Le démarrage, l’achèvement, l’échec, le saut et les pauses automatiques après échec persistant soulèvent chacun une notification dans l’application, qui nomme la tâche.
- La commande TUI
/scheduleliste chaque tâche avec son statut, sa planification, l’heure de la prochaine exécution et la dernière erreur, et ouvre son historique d’exécutions récentes. De là, vous pouvez mettre en pause, reprendre, exécuter maintenant, supprimer (appuyez deux fois surctrl+dpour confirmer) et aller à la session qu’une exécution a produite. Les outils d’agentlist_scheduled_tasksetlist_scheduled_task_runsrépondent aux mêmes questions en conversation. - Chaque exécution se fait dans une nouvelle session titrée du titre de la tâche, donc les résultats sont à une entrée de la liste des sessions, même si une notification a été manquée.
- Si une exécution demande une permission ou une réponse pendant que vous regardez une
autre conversation, un avertissement nomme la session qui a besoin de vous ;
/attentionliste les demandes en attente connues et ouvre la session demandeuse. On peut répondre dans cette session ou dans la vue d’un ancêtre chargé, y compris les sessions enfants et petites-enfants. Ouvrir une demande ne l’approuve jamais automatiquement. - Une tâche ponctuelle n’est désactivée qu’après une exécution réussie. Une occurrence en échec réessaie avec une attente bornée, et les échecs répétés mettent la tâche en pause avec une notification : un rappel ne peut plus disparaître en silence.
Contrôles opérationnels
- Surveillez le compte de redémarrages du superviseur et les journaux du serveur.
- Inspectez les éléments de file en échec et les erreurs des tâches planifiées avant de réessayer.
- Confirmez qu’il y a assez d’espace disque pour la base SQLite du projet et les journaux.
- Lancez un exécuter maintenant manuel après un changement d’authentifiants, de modèles ou de chemins de service.
- Arrêtez par le superviseur, afin qu’AX Code reçoive
SIGTERM; les exemples accordent jusqu’à 90 secondes pour un arrêt gracieux.
/loop est volontairement local au processus et ne survit pas à un redémarrage. Utilisez
les tâches planifiées pour un travail durable sans surveillance.
Naviguer entre des sessions parallèles
À partir de 146 colonnes de terminal, une barre de navigation à gauche montre les sessions de
l’espace de travail courant et leurs agents enfants chargés. Dépliez une ligne avec son
contrôle + et cliquez sur un titre pour l’ouvrir. Les sessions épinglées gardent leur ordre et
leurs numéros de raccourci. Les libellés d’activité complets distinguent le travail, le nouvel essai, les approbations
et les questions ; les parents reflètent aussi les demandes des descendants. Ces libellés ne
signifient pas qu’une tâche a passé la vérification. La barre latérale droite existante conserve le
contexte et les contrôles de la session courante.
Le titre Projet identifie le répertoire courant. Cliquez dessus ou utilisez
/navigation-info pour voir le chemin complet du projet et le titre de la session courante.
Récent montre les sessions chargées ; Actif conserve les arbres de sessions au travail ou en attente,
ainsi que l’arbre de la session courante. Le filtre est partagé avec le sélecteur de navigation
et mémorisé. Utilisez /navigation-filter pour le basculer au clavier. Pendant
une déconnexion, il montre les sessions en cache, plutôt que d’inférer quelles sessions
sont actives. Effacer (ou /navigation-clear) demande une confirmation, puis masque
les lignes historiques du rail gauche et du sélecteur de navigation seulement. Cela ne
supprime pas les sessions ; /sessions les liste encore. L’arbre de la session courante, les sessions épinglées et les arbres
observés au travail ou en attente restent sur le rail. Ouvrir une session depuis /sessions
la ramène dans la liste.
Utilisez /navigation-width ou l’action Largeur de la navigation pour choisir 20, 24, 28, 30, 32, 36 ou 40
colonnes (28 par défaut). La barre latérale de session de droite a la même action Largeur et
/sidebar-width (32 par défaut). Les deux préférences sont mémorisées et se réduisent automatiquement au besoin,
afin de préserver le contenu principal. Utilisez /navigation pour masquer ou restaurer le rail de
navigation gauche sur les terminaux larges. /sidebar masque ou restaure la barre latérale de
session droite de la même façon. Sur les terminaux plus étroits, /navigation ouvre à la place un sélecteur
de sessions et d’agents. Une barre Sessions visible fournit la même action chaque fois que le
rail de navigation est absent. Son action En attente apparaît lorsque des demandes connues ont besoin d’une saisie ;
un astérisque marque un compte en cache pendant la déconnexion. /sessions
continue d’ouvrir le sélecteur de sessions normal. /attention est disponible à chaque
largeur. Pendant la déconnexion, sa liste est libellée comme mise en cache ; ouvrir les entrées
en cache reste possible, mais les demandes peuvent déjà avoir reçu une réponse ailleurs.
L’action Demandes connues de la barre latérale ouvre les demandes en attente des espaces
de travail connus, tandis que son arbre de sessions reste limité au projet courant.
Toutes ces vues sont bornées par l’instance connectée et les données de session chargées ;
ce compte n’est pas un inventaire complet des autres serveurs ni des espaces de travail non chargés.
Les brouillons non envoyés sont isolés par projet et par session dans le TUI en cours. Changer de session conserve le texte, les pièces jointes, la position du curseur et le mode shell ; revenir restaure le brouillon correspondant. Ces brouillons ne sont qu’en mémoire et ne survivent pas à la fermeture du TUI.
La notification d’achèvement facultative dit désormais Session idle. Elle suit
le travail observé dans le sous-arbre de la session regardée et attend que les descendants
actifs observés deviennent explicitement inactifs, sans demande en attente. Les déconnexions,
les resynchronisations, un état manquant, les erreurs et l’annulation peuvent supprimer l’avis. C’est
une notification de cycle de vie, pas une preuve que les tests ont réussi ou qu’un objectif est atteint.
Nouvelles tâches et configuration
Le démarrage normal ouvre la surface de travail Nouvelle tâche, avec un compositeur en bas et
la navigation des sessions. L’ouvrir ou saisir un brouillon ne crée pas de session
enregistrée ; une session est créée à l’envoi. Utilisez /sessions ou la
navigation gauche pour reprendre un travail existant. Le comportement explicite de --session, --continue et
--prompt reste disponible ; le démarrage n’active pas la reprise automatique.
La configuration des fournisseurs ne s’ouvre pas automatiquement. Utilisez l’action visible /connect
dans la zone de travail lorsqu’aucun fournisseur n’est configuré. Lorsqu’un fournisseur est configuré
mais qu’aucun modèle valide n’est choisi,
l’action devient /models. Une découverte de fournisseur en échec pointe vers /status ;
/connect et /providers restent disponibles pour réparer la configuration. Un modèle
choisi est un choix de configuration, pas un contrôle d’authentifiant ni de préparation du runtime.
Les indications apparaissent aussi pour les utilisateurs de retour dont la configuration demande attention.