- Accueil
- Documentation
- Outils d'exécution
- Découverte et sélection des agents de tâches
Découverte et sélection des agents de tâches
Ce document décrit comment le sous-système de tâches découvre les définitions d’agents, fusionne plusieurs sources et résout un agent demandé au moment de l’exécution.
Il couvre le comportement à l’exécution tel qu’implémenté aujourd’hui, y compris la priorité, la gestion des définitions invalides et les contraintes de création/profondeur qui peuvent rendre un agent effectivement indisponible.
Fichiers d’implémentation
Section intitulée « Fichiers d’implémentation »src/task/discovery.tssrc/task/agents.tssrc/task/types.tssrc/task/index.tssrc/task/commands.tssrc/prompts/agents/task.mdsrc/prompts/tools/task.mdsrc/discovery/helpers.tssrc/config.tssrc/task/executor.ts
Forme de la définition d’agent
Section intitulée « Forme de la définition d’agent »Les agents de tâches se normalisent en AgentDefinition (src/task/types.ts) :
name,description,systemPrompt(requis pour un agent chargé valide)- optionnels :
tools,spawns,model,thinkingLevel,output source:"bundled" | "user" | "project"- optionnel :
filePath
L’analyse provient du frontmatter via parseAgentFields() (src/discovery/helpers.ts) :
nameoudescriptionmanquant => invalide (null), l’appelant traite comme un échec d’analysetoolsaccepte CSV ou tableau ; si fourni,submit_resultest automatiquement ajoutéspawnsaccepte*, CSV ou tableau- comportement de rétrocompatibilité : si
spawnsest manquant mais quetoolsincluttask,spawnsdevient* outputest transmis tel quel comme données de schéma opaques
Agents intégrés
Section intitulée « Agents intégrés »Les agents intégrés sont embarqués au moment de la compilation (src/task/agents.ts) en utilisant des imports texte.
EMBEDDED_AGENT_DEFS définit :
explore,plan,designer,reviewerà partir de fichiers de promptstasketquick_taskà partir du corps partagétask.mdplus le frontmatter injecté
Chemin de chargement :
loadBundledAgents()analyse le markdown embarqué avecparseAgent(..., "bundled", "fatal")- les résultats sont mis en cache en mémoire (
bundledAgentsCache) clearBundledAgentsCache()est une réinitialisation du cache réservée aux tests
Parce que l’analyse des agents intégrés utilise level: "fatal", un frontmatter mal formé dans les agents intégrés lève une exception et peut faire échouer entièrement la découverte.
Découverte par système de fichiers et plugins
Section intitulée « Découverte par système de fichiers et plugins »discoverAgents(cwd, home) (src/task/discovery.ts) fusionne les agents provenant de plusieurs emplacements avant d’ajouter les définitions intégrées.
Entrées de découverte
Section intitulée « Entrées de découverte »- Répertoires d’agents de la configuration utilisateur via
getConfigDirs("agents", { project: false }) - Répertoires d’agents du projet le plus proche via
findAllNearestProjectConfigDirs("agents", cwd) - Racines de plugins Claude (
listClaudePluginRoots(home)) avec les sous-répertoiresagents/ - Agents intégrés (
loadBundledAgents())
Ordre réel des sources
Section intitulée « Ordre réel des sources »L’ordre des familles de sources provient de getConfigDirs("", { project: false }), qui est dérivé de priorityList dans src/config.ts :
.xcsh.claude.codex.gemini
Pour chaque famille de sources, l’ordre de découverte est :
- répertoire du projet le plus proche pour cette source (si trouvé)
- répertoire utilisateur pour cette source
Après tous les répertoires de familles de sources, les répertoires agents/ des plugins sont ajoutés (les plugins de portée projet d’abord, puis ceux de portée utilisateur).
Les agents intégrés sont ajoutés en dernier.
Avertissement important : commentaires obsolètes vs code actuel
Section intitulée « Avertissement important : commentaires obsolètes vs code actuel »Les commentaires d’en-tête de discovery.ts mentionnent encore .pi et ne mentionnent pas .codex/.gemini. L’ordre réel à l’exécution est piloté par src/config.ts et utilise actuellement .xcsh, .claude, .codex, .gemini.
Règles de fusion et de collision
Section intitulée « Règles de fusion et de collision »La découverte utilise une déduplication premier-arrivé-premier-servi par agent.name exact :
- Un
Set<string>suit les noms déjà vus. - Les agents chargés sont aplatis dans l’ordre des répertoires et conservés uniquement si le nom n’a pas été vu.
- Les agents intégrés sont filtrés par rapport au même ensemble et ajoutés uniquement s’ils n’ont pas encore été vus.
Implications :
- Le projet prend le pas sur l’utilisateur pour la même famille de sources.
- Une famille de sources de priorité supérieure prend le pas sur une inférieure (
.xcshavant.claude, etc.). - Les agents non intégrés prennent le pas sur les agents intégrés ayant le même nom.
- La correspondance de nom est sensible à la casse (
Taskettasksont distincts). - Au sein d’un même répertoire, les fichiers markdown sont lus dans l’ordre lexicographique des noms de fichiers avant la déduplication.
Comportement en cas de fichier d’agent invalide ou manquant
Section intitulée « Comportement en cas de fichier d’agent invalide ou manquant »Par répertoire (loadAgentsFromDir) :
- répertoire illisible/manquant : traité comme vide (
readdir(...).catch(() => [])) - échec de lecture ou d’analyse du fichier : avertissement journalisé, fichier ignoré
- le chemin d’analyse utilise
parseAgent(..., level: "warn")
Le comportement en cas d’échec du frontmatter provient de parseFrontmatter :
- une erreur d’analyse au niveau
warnjournalise un avertissement - l’analyseur se rabat sur un analyseur simple ligne par ligne
key: value - si les champs requis sont toujours manquants,
parseAgentFieldséchoue, puisAgentParsingErrorest levée et interceptée par l’appelant (fichier ignoré)
Effet net : un seul fichier d’agent personnalisé défectueux n’interrompt pas la découverte des autres fichiers.
Recherche et sélection d’agent
Section intitulée « Recherche et sélection d’agent »La recherche est une recherche linéaire par nom exact :
getAgent(agents, name)=>agents.find(a => a.name === name)
Lors de l’exécution des tâches (TaskTool.execute) :
- les agents sont redécouverts au moment de l’appel (
discoverAgents(this.session.cwd)) - le
params.agentdemandé est résolu viagetAgent - un agent manquant retourne une réponse d’outil immédiate :
Unknown agent "...". Available: ...- aucun sous-processus n’est lancé
Description vs découverte au moment de l’exécution
Section intitulée « Description vs découverte au moment de l’exécution »TaskTool.create() construit la description de l’outil à partir des résultats de découverte au moment de l’initialisation (buildDescription).
execute() redécouvre les agents à nouveau. Ainsi l’ensemble à l’exécution peut différer de ce qui était listé dans la description d’outil précédente si les fichiers d’agents ont changé en cours de session.
Garde-fous de sortie structurée et priorité des schémas
Section intitulée « Garde-fous de sortie structurée et priorité des schémas »Priorité du schéma de sortie à l’exécution dans TaskTool.execute :
- frontmatter de l’agent
output params.schemade l’appel de tâcheoutputSchemade la session parente
(effectiveOutputSchema = effectiveAgent.output ?? outputSchema ?? this.session.outputSchema)
Le texte de garde-fou au moment du prompt dans src/prompts/tools/task.md met en garde contre le comportement de discordance pour les agents à sortie structurée (explore, reviewer) : les instructions de format de sortie en prose peuvent entrer en conflit avec le schéma intégré et produire des sorties null.
Il s’agit de recommandations, pas de logique de validation stricte à l’exécution dans discoverAgents.
Interaction avec la découverte de commandes
Section intitulée « Interaction avec la découverte de commandes »src/task/commands.ts est une infrastructure parallèle pour les commandes de workflow (pas les définitions d’agents), mais elle suit le même schéma global :
- découverte d’abord à partir des fournisseurs de capacités
- déduplication par nom avec premier-arrivé-premier-servi
- ajout des commandes intégrées si pas encore vues
- recherche par nom exact via
getCommand
Dans src/task/index.ts, les helpers de commandes sont réexportés avec les helpers de découverte d’agents. La découverte d’agents elle-même ne dépend pas de la découverte de commandes à l’exécution.
Contraintes de disponibilité au-delà de la découverte
Section intitulée « Contraintes de disponibilité au-delà de la découverte »Un agent peut être découvrable mais néanmoins indisponible à l’exécution en raison de garde-fous d’exécution.
Politique de création du parent
Section intitulée « Politique de création du parent »TaskTool.execute vérifie session.getSessionSpawns() :
"*"=> autoriser tout""=> refuser tout- liste CSV => autoriser uniquement les noms listés
Si refusé : réponse immédiate Cannot spawn '...'. Allowed: ....
Garde de protection contre l’auto-récursion par variable d’environnement
Section intitulée « Garde de protection contre l’auto-récursion par variable d’environnement »PI_BLOCKED_AGENT est lu lors de la construction de l’outil. Si la demande correspond, l’exécution est rejetée avec un message de prévention de récursion.
Contrôle de la profondeur de récursion (disponibilité de l’outil task dans les sessions enfants)
Section intitulée « Contrôle de la profondeur de récursion (disponibilité de l’outil task dans les sessions enfants) »Dans runSubprocess (src/task/executor.ts) :
- la profondeur est calculée à partir de
taskDepth task.maxRecursionDepthcontrôle le seuil- à la profondeur maximale :
- l’outil
taskest retiré de la liste d’outils de l’enfant - l’env
spawnsde l’enfant est défini comme vide
- l’outil
Ainsi les niveaux plus profonds ne peuvent pas créer d’autres tâches même si la définition de l’agent inclut spawns.
Avertissement concernant le mode plan (implémentation actuelle)
Section intitulée « Avertissement concernant le mode plan (implémentation actuelle) »TaskTool.execute calcule un effectiveAgent pour le mode plan (préfixe le prompt du mode plan, force un sous-ensemble d’outils en lecture seule, vide les spawns), mais runSubprocess est appelé avec agent plutôt qu’effectiveAgent.
Effet actuel :
- le remplacement de modèle / niveau de réflexion / schéma de sortie sont dérivés de
effectiveAgent - le prompt système et les restrictions d’outils/spawns de
effectiveAgentne sont pas transmis dans ce chemin d’appel
Il s’agit d’un avertissement d’implémentation qu’il est important de connaître lors de la lecture des attentes de comportement en mode plan.