274 274
275Les hooks des fichiers de paramètres, des paramètres de politique gérée et des plugins s'exécutent également à l'intérieur des [subagents](/docs/fr/sub-agents). Lorsqu'un subagent appelle un outil, les événements d'outil tels que `PreToolUse` et `PostToolUse` déclenchent les mêmes hooks configurés que dans la conversation principale, et l'entrée porte les champs d'entrée communs `agent_id` et `agent_type` [](#common-input-fields) qui identifient le subagent.275Les hooks des fichiers de paramètres, des paramètres de politique gérée et des plugins s'exécutent également à l'intérieur des [subagents](/docs/fr/sub-agents). Lorsqu'un subagent appelle un outil, les événements d'outil tels que `PreToolUse` et `PostToolUse` déclenchent les mêmes hooks configurés que dans la conversation principale, et l'entrée porte les champs d'entrée communs `agent_id` et `agent_type` [](#common-input-fields) qui identifient le subagent.
276 276
277Les administrateurs d'entreprise peuvent utiliser `allowManagedHooksOnly` pour restreindre les hooks qui s'exécutent :277Les administrateurs peuvent utiliser [`allowManagedHooksOnly`](/docs/fr/settings-reference#allowmanagedhooksonly) dans les [paramètres gérés](/docs/fr/managed-settings) pour restreindre les hooks qui s'exécutent :
278 278
279* Vos hooks utilisateur, projet, local et plugin sont bloqués. Les hooks des plugins forcément activés dans les paramètres gérés `enabledPlugins` sont exempts279* Vos hooks utilisateur, projet, local et plugin sont bloqués. Les hooks des plugins forcément activés dans les paramètres gérés `enabledPlugins` sont exempts
280* Claude Code restreint également votre [`statusLine`](/docs/fr/statusline), [`fileSuggestion`](/docs/fr/settings-reference#filesuggestion) et [`subagentStatusLine`](/docs/fr/statusline#subagent-status-lines) aux paramètres gérés280* Claude Code restreint également votre [`statusLine`](/docs/fr/statusline), [`fileSuggestion`](/docs/fr/settings-reference#filesuggestion) et [`subagentStatusLine`](/docs/fr/statusline#subagent-status-lines) aux paramètres gérés
304 304
305Un matcher sur le chemin de l'expression régulière est testé avec `RegExp.prototype.test` de JavaScript, qui réussit sur une correspondance n'importe où dans la valeur. `Edit.*` correspond à la fois à `Edit` et à `NotebookEdit` ; enveloppez le modèle dans `^` et `$`, comme dans `^Edit$`, lorsque vous avez besoin d'une correspondance de chaîne entière.305Un matcher sur le chemin de l'expression régulière est testé avec `RegExp.prototype.test` de JavaScript, qui réussit sur une correspondance n'importe où dans la valeur. `Edit.*` correspond à la fois à `Edit` et à `NotebookEdit` ; enveloppez le modèle dans `^` et `$`, comme dans `^Edit$`, lorsque vous avez besoin d'une correspondance de chaîne entière.
306 306
307Les traits d'union dans l'ensemble de correspondance exacte nécessitent Claude Code v2.1.195 ou ultérieur. Sur les versions antérieures, un nom avec trait d'union comme `code-reviewer` est évalué comme une expression régulière non ancrée, donc il se déclenche également pour `senior-code-reviewer` ; ancrez-le comme `^code-reviewer$` sur ces versions pour correspondre uniquement à ce nom.
308
309`FileChanged` et `StopFailure` utilisent un ensemble de correspondance exacte plus étroit contenant uniquement des lettres, des chiffres, `_` et `|`. Un trait d'union, un espace ou une virgule dans un matcher pour ces deux événements le maintient sur le chemin de l'expression régulière, et seul `|` sépare les alternatives. Tous les autres événements avec support de matcher dans le tableau qui suit acceptent `|` ou `,`.307`FileChanged` et `StopFailure` utilisent un ensemble de correspondance exacte plus étroit contenant uniquement des lettres, des chiffres, `_` et `|`. Un trait d'union, un espace ou une virgule dans un matcher pour ces deux événements le maintient sur le chemin de l'expression régulière, et seul `|` sépare les alternatives. Tous les autres événements avec support de matcher dans le tableau qui suit acceptent `|` ou `,`.
310 308
311L'événement `FileChanged` ne suit pas ces règles lors de la construction de sa liste de surveillance. Consultez [FileChanged](#filechanged).309L'événement `FileChanged` ne suit pas ces règles lors de la construction de sa liste de surveillance. Consultez [FileChanged](#filechanged).
380* `mcp__brave-search__.*` correspond à tous les outils d'un serveur dont le nom contient un trait d'union378* `mcp__brave-search__.*` correspond à tous les outils d'un serveur dont le nom contient un trait d'union
381* `mcp__.*__write.*` correspond à tout outil dont le nom commence par `write` de n'importe quel serveur379* `mcp__.*__write.*` correspond à tout outil dont le nom commence par `write` de n'importe quel serveur
382 380
383Les traits d'union dans l'ensemble de correspondance exacte nécessitent Claude Code v2.1.195 ou ultérieur. Sur les versions antérieures, un préfixe nu avec trait d'union comme `mcp__brave-search` est évalué comme une expression régulière non ancrée et correspond à chaque outil de ce serveur. La forme `mcp__brave-search__.*` fonctionne sur chaque version.
384
385Les outils d'un [serveur MCP fourni par un plugin](/docs/fr/mcp#plugin-provided-mcp-servers) utilisent un segment de serveur limité qui inclut le nom du plugin : `mcp__plugin_<plugin-name>_<server-name>__<tool>`. Un matcher écrit contre la clé de serveur nue ne se déclenche jamais pour ces outils. Pour un plugin nommé `my-plugin` qui regroupe un serveur sous la clé `db`, un outil `query` apparaît comme `mcp__plugin_my-plugin_db__query`, donc le matcher pour chaque outil de ce serveur est `mcp__plugin_my-plugin_db__.*`. Utilisez le même nom d'outil limité dans le champ [`if`](#common-fields) d'un gestionnaire. Consultez [Serveurs MCP fournis par un plugin](/docs/fr/mcp#plugin-provided-mcp-servers) pour savoir comment le nom limité est construit.381Les outils d'un [serveur MCP fourni par un plugin](/docs/fr/mcp#plugin-provided-mcp-servers) utilisent un segment de serveur limité qui inclut le nom du plugin : `mcp__plugin_<plugin-name>_<server-name>__<tool>`. Un matcher écrit contre la clé de serveur nue ne se déclenche jamais pour ces outils. Pour un plugin nommé `my-plugin` qui regroupe un serveur sous la clé `db`, un outil `query` apparaît comme `mcp__plugin_my-plugin_db__query`, donc le matcher pour chaque outil de ce serveur est `mcp__plugin_my-plugin_db__.*`. Utilisez le même nom d'outil limité dans le champ [`if`](#common-fields) d'un gestionnaire. Consultez [Serveurs MCP fournis par un plugin](/docs/fr/mcp#plugin-provided-mcp-servers) pour savoir comment le nom limité est construit.
386 382
387Cet exemple enregistre toutes les opérations du serveur memory et valide les opérations d'écriture de n'importe quel serveur MCP :383Cet exemple enregistre toutes les opérations du serveur memory et valide les opérations d'écriture de n'importe quel serveur MCP :
919| :- | :- | :- |915| :- | :- | :- |
920| `PreToolUse` | Oui | Bloque l'appel d'outil |916| `PreToolUse` | Oui | Bloque l'appel d'outil |
921| `PermissionRequest` | Non | Exit code 2 n'est pas honoré pour cet événement et le flux de permission procède inchangé. Refusez via l'objet [`decision`](#permissionrequest-decision-control) à la place |917| `PermissionRequest` | Non | Exit code 2 n'est pas honoré pour cet événement et le flux de permission procède inchangé. Refusez via l'objet [`decision`](#permissionrequest-decision-control) à la place |
922| `UserPromptSubmit` | Oui | Bloque le traitement du prompt et efface le prompt |918| `UserPromptSubmit` | Oui | Bloque le prompt, il ne parvient jamais à Claude. Consultez [Ce qu'un prompt bloqué laisse derrière](#what-a-blocked-prompt-leaves-behind) |
923| `UserPromptExpansion` | Oui | Bloque l'expansion |919| `UserPromptExpansion` | Oui | Bloque l'expansion |
924| `Stop` | Oui | Empêche Claude de s'arrêter, continue la conversation |920| `Stop` | Oui | Empêche Claude de s'arrêter, continue la conversation |
925| `SubagentStop` | Oui | Empêche le subagent de s'arrêter |921| `SubagentStop` | Oui | Empêche le subagent de s'arrêter |
1187| `resume` | `--resume`, `--continue`, ou `/resume` |1183| `resume` | `--resume`, `--continue`, ou `/resume` |
1188| `clear` | `/clear` |1184| `clear` | `/clear` |
1189| `compact` | Compaction automatique ou manuelle |1185| `compact` | Compaction automatique ou manuelle |
1190| `fork` | Une nouvelle session créée à partir d'une session existante : `--fork-session` avec `--resume` ou `--continue`, la copie de fond `/fork`, ou `/branch` |1186| `fork` | Une nouvelle session créée à partir d'une session existante : `--fork-session` avec `--resume` ou `--continue`, la copie de fond `/fork`, `/branch`, ou une conversation que vous [déplacez en arrière-plan](/docs/fr/agent-view#from-inside-a-session) |
1191 1187
1192Avant v2.1.214, les sessions créées rapportaient la source `"resume"`.1188Avant v2.1.214, les sessions créées rapportaient la source `"resume"`.
1193 1189
1194Quand vous démarrez une session interactive, reprenez une conversation au lancement avec `--continue` ou `--resume`, ou exécutez `/clear`, les hooks SessionStart s'exécutent en arrière-plan. Vous pouvez taper immédiatement, et une conversation que vous avez reprise apparaît sans attendre les hooks. La première réponse de Claude attend toujours que les hooks se terminent, donc leur contexte atteint Claude.1190Quand vous démarrez une session interactive, reprenez une conversation au lancement avec `--continue` ou `--resume`, ou exécutez `/clear`, les hooks SessionStart s'exécutent en arrière-plan. Vous pouvez taper immédiatement, et une conversation que vous avez reprise apparaît sans attendre les hooks. La première réponse de Claude attend toujours que les hooks se terminent, donc leur contexte atteint Claude.
1195 1191
1196Quand vous changez de conversation avec `/resume` dans une session, le changement attend que les hooks se terminent. Si vous exécutez `/clear` ou basculez vers une autre conversation pendant que les hooks en arrière-plan s'exécutent toujours, rien de ce qu'ils retournent ne s'applique à la session.1192Quand vous changez de conversation avec `/resume` dans une session, le changement attend que les hooks se terminent. Si vous exécutez `/clear` ou changez vers une autre conversation pendant que les hooks en arrière-plan s'exécutent toujours, rien de ce qu'ils retournent ne s'applique à la session.
1197 1193
1198La même attente s'applique au lancement, y compris une session reprise : une invite que vous envoyez pendant que les hooks SessionStart s'exécutent toujours n'atteint Claude que lorsqu'ils se terminent.1194La même attente s'applique au lancement, y compris une session reprise : une invite que vous envoyez pendant que les hooks SessionStart s'exécutent toujours n'atteint Claude que lorsqu'ils se terminent.
1199 1195
1212| `agent_type` | Le nom de l'agent, présent quand vous démarrez Claude Code avec `claude --agent <name>` |1208| `agent_type` | Le nom de l'agent, présent quand vous démarrez Claude Code avec `claude --agent <name>` |
1213| `session_title` | Le titre de la session actuelle s'il est déjà défini, par exemple via `--name` ou `/rename`. Un hook qui émet `sessionTitle` peut vérifier `session_title` d'abord pour éviter de remplacer un titre que l'utilisateur a défini explicitement |1209| `session_title` | Le titre de la session actuelle s'il est déjà défini, par exemple via `--name` ou `/rename`. Un hook qui émet `sessionTitle` peut vérifier `session_title` d'abord pour éviter de remplacer un titre que l'utilisateur a défini explicitement |
1214 1210
1215Quand `source` est `"resume"` ou `"fork"` et que la transcription contient au moins une réponse de Claude, les hooks SessionStart reçoivent également les quatre champs ci-dessous. Votre hook peut les utiliser pour signaler le coût de reprendre une conversation obsolète avant la première demande, par exemple dans un [`systemMessage`](#json-output). Ces champs nécessitent Claude Code v2.1.251 ou ultérieur.1211Quand `source` est `"resume"` ou `"fork"` et que la transcription contient au moins une réponse de Claude, les hooks SessionStart reçoivent également les quatre champs ci-dessous. Votre hook peut les utiliser pour signaler le coût de reprendre une conversation obsolète avant la première requête, par exemple dans un [`systemMessage`](#json-output). Ces champs nécessitent Claude Code v2.1.251 ou ultérieur.
1216 1212
1217| Champ | Description |1213| Champ | Description |
1218| :- | :- |1214| :- | :- |
1219| `seconds_since_last_response` | Secondes d'horloge murale depuis la dernière réponse dans la transcription reprise |1215| `seconds_since_last_response` | Secondes d'horloge murale depuis la dernière réponse dans la transcription reprise |
1220| `context_tokens` | Tokens que la première demande de la session reprise renvoie comme son invite |1216| `context_tokens` | Tokens que la première requête de la session reprise renvoie comme son invite |
1221| `prompt_cache_likely_expired` | `true` quand la dernière réponse est plus ancienne que la [durée de vie du cache d'invite](/docs/fr/prompt-caching#cache-lifetime) de la session ou qu'une compaction ultérieure a remplacé la conversation en cache |1217| `prompt_cache_likely_expired` | `true` quand la dernière réponse est plus ancienne que la [durée de vie du cache d'invite](/docs/fr/prompt-caching#cache-lifetime) de la session ou qu'une compaction ultérieure a remplacé la conversation en cache |
1222| `estimated_cache_write_usd` | Coût estimé en dollars US de l'écriture de `context_tokens` dans le cache d'invite sur le modèle de la session, excluant la réponse |1218| `estimated_cache_write_usd` | Coût estimé en dollars US de l'écriture de `context_tokens` dans le cache d'invite sur le modèle de la session, excluant la réponse |
1223 1219
1242 Contrôle de décision SessionStart1238 Contrôle de décision SessionStart
1243</h4>1239</h4>
1244 1240
1245Claude Code ajoute stdout qu'il [traite comme du texte brut](#exit-code-0) au contexte de Claude. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez retourner ces champs spécifiques à l'événement :1241Claude Code ajoute la sortie standard qu'il [traite comme du texte brut](#exit-code-0) au contexte de Claude. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez retourner ces champs spécifiques à l'événement :
1246 1242
1247| Champ | Description |1243| Champ | Description |
1248| :- | :- |1244| :- | :- |
1262}1258}
1263```1259```
1264 1260
1265Puisque stdout brut atteint déjà Claude pour cet événement, un hook qui charge uniquement du contexte peut imprimer sur stdout directement sans construire JSON. Utilisez la forme JSON quand vous devez combiner du contexte avec d'autres champs comme `sessionTitle`.1261Puisque la sortie standard brute atteint déjà Claude pour cet événement, un hook qui charge uniquement du contexte peut imprimer sur la sortie standard directement sans construire JSON. Utilisez la forme JSON quand vous devez combiner le contexte avec d'autres champs comme `sessionTitle`.
1266 1262
1267Utilisez `reloadSkills` quand un hook SessionStart installe ou met à jour des skills. La découverte de skills s'exécute normalement avant que les hooks SessionStart se terminent, donc les fichiers que le hook écrit dans `~/.claude/skills/` ou `.claude/skills/` n'apparaîtraient autrement que dans la session suivante. Cet exemple synchronise un référentiel de skills partagé et demande la réanalyse :1263Utilisez `reloadSkills` quand un hook SessionStart installe ou met à jour des skills. La découverte de skills s'exécute normalement avant que les hooks SessionStart se terminent, donc les fichiers que le hook écrit dans `~/.claude/skills/` ou `.claude/skills/` n'apparaîtraient autrement que dans la session suivante. Cet exemple synchronise un référentiel de skills partagé et demande la réanalyse :
1268 1264
1361 Contrôle de décision Setup1357 Contrôle de décision Setup
1362</h4>1358</h4>
1363 1359
1364Les hooks Setup ne peuvent pas bloquer ; l'exécution continue sur n'importe quel code de sortie. Sur chaque code de sortie, Claude Code rejette les [champs de sortie JSON](#json-output) d'un hook Setup, comme `systemMessage`, `continue`, et `hookSpecificOutput.additionalContext`. Avec `-p`, stdout, stderr, et le code de sortie d'un hook Setup n'apparaissent dans la sortie de la session que comme des événements [`hook_response`](/docs/fr/headless#read-session-metadata) quand vous lancez avec `--output-format stream-json --verbose`.1360Les hooks Setup ne peuvent pas bloquer ; l'exécution continue sur n'importe quel code de sortie. Sur chaque code de sortie, Claude Code rejette les [champs de sortie JSON](#json-output) d'un hook Setup, comme `systemMessage`, `continue`, et `hookSpecificOutput.additionalContext`. Avec `-p`, la sortie standard, stderr, et le code de sortie d'un hook Setup n'apparaissent dans la sortie de la session que comme des événements [`hook_response`](/docs/fr/headless#read-session-metadata) quand vous lancez avec `--output-format stream-json --verbose`.
1365 1361
1366Les hooks Setup ont accès à `CLAUDE_ENV_FILE`. Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes pour la session, tout comme dans les [hooks SessionStart](#persist-environment-variables). Seuls les hooks `type: "command"` s'exécutent sur `Setup`. Un hook `type: "mcp_tool"` sur `Setup` est toujours ignoré, comme décrit sous [Champs de hook MCP tool](#mcp-tool-hook-fields).1362Les hooks Setup ont accès à `CLAUDE_ENV_FILE`. Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes pour la session, tout comme dans les [hooks SessionStart](#persist-environment-variables). Seuls les hooks `type: "command"` s'exécutent sur `Setup`. Un hook `type: "mcp_tool"` sur `Setup` est toujours ignoré, comme décrit sous [Champs de hook MCP tool](#mcp-tool-hook-fields).
1367 1363
1445 1441
1446Il y a deux façons d'ajouter du contexte à la conversation en cas de code de sortie 0 :1442Il y a deux façons d'ajouter du contexte à la conversation en cas de code de sortie 0 :
1447 1443
1448* **Stdout en texte brut** : Claude Code ajoute stdout qu'il [traite comme du texte brut](#exit-code-0) au contexte de Claude1444* **Sortie standard en texte brut** : Claude Code ajoute la sortie standard qu'il [traite comme du texte brut](#exit-code-0) au contexte de Claude
1449* **JSON avec `additionalContext`** : utilisez le format JSON ci-dessous pour plus de contrôle. Le champ `additionalContext` est ajouté comme contexte1445* **JSON avec `additionalContext`** : utilisez le format JSON ci-dessous pour plus de contrôle. Le champ `additionalContext` est ajouté comme contexte
1450 1446
1451Aucun canal ne produit une entrée de transcription visible. Le stdout brut et la valeur `additionalContext` sont chacun injectés comme un rappel système qui commence par le nom du hook ; Claude lit les deux. Pour confirmer la livraison, vérifiez le [journal de débogage](#debug-hooks).1447Aucun canal ne produit une entrée de transcription visible. La sortie standard brute et la valeur `additionalContext` sont chacune injectées comme un rappel système qui commence par le nom du hook ; Claude lit les deux. Pour confirmer la livraison, vérifiez le [journal de débogage](#debug-hooks).
1452 1448
1453Pour bloquer une invite, retournez un objet JSON avec `decision` défini à `"block"` :1449Pour bloquer une invite, retournez un objet JSON avec `decision` défini à `"block"` :
1454 1450
1455| Champ | Description |1451| Champ | Description |
1456| :- | :- |1452| :- | :- |
1457| `decision` | `"block"` empêche l'invite d'être traitée et l'efface du contexte. Omettez pour permettre à l'invite de procéder |1453| `decision` | `"block"` empêche l'invite d'être traitée. Omettez pour permettre à l'invite de procéder |
1458| `reason` | Montré à l'utilisateur quand `decision` est `"block"`. Non ajouté au contexte |1454| `reason` | Montré à l'utilisateur quand `decision` est `"block"`. Non ajouté au contexte |
1459| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés de l'invite soumise. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |1455| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés de l'invite soumise. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
1460| `sessionTitle` | Définit le titre de la session. Utilisez pour nommer les sessions automatiquement en fonction du contenu de l'invite |1456| `sessionTitle` | Définit le titre de la session. Utilisez pour nommer les sessions automatiquement en fonction du contenu de l'invite |
1461| `suppressOriginalPrompt` | Si `true` quand `decision` est `"block"`, omet le texte d'invite original du message de blocage montré à l'utilisateur |1457| `suppressOriginalPrompt` | Si `true` quand `decision` est `"block"`, omet le texte d'invite original du message de blocage montré à l'utilisateur. Voir [Ce qu'une invite bloquée laisse derrière](#what-a-blocked-prompt-leaves-behind) |
1462 1458
1463Un hook qui bloque en quittant 2 s'achemine de la même façon que `reason` : le message de blocage montre le texte stderr à l'utilisateur, et il n'est pas ajouté au contexte.1459Un hook qui bloque en quittant 2 s'achemine de la même façon que `reason` : le message de blocage montre le texte stderr à l'utilisateur, et il n'est pas ajouté au contexte.
1464 1460
1469 "hookSpecificOutput": {1465 "hookSpecificOutput": {
1470 "hookEventName": "UserPromptSubmit",1466 "hookEventName": "UserPromptSubmit",
1471 "additionalContext": "My additional context here",1467 "additionalContext": "My additional context here",
1472 "sessionTitle": "My session title"1468 "sessionTitle": "My session title",
1469 "suppressOriginalPrompt": true
1473 }1470 }
1474}1471}
1475```1472```
1476 1473
1474<h4 id="what-a-blocked-prompt-leaves-behind">
1475 Ce qu'une invite bloquée laisse derrière
1476</h4>
1477
1478Une invite bloquée n'atteint jamais Claude, mais son texte n'est pas supprimé partout. Par défaut, le message de blocage montré à l'utilisateur se termine par `Original prompt:` suivi du texte soumis, et Claude Code écrit ce message dans le fichier de transcription de la session sur le disque. Pour laisser le texte hors du message, imprimez JSON avec `"suppressOriginalPrompt": true` à l'intérieur de `hookSpecificOutput`. Cela fonctionne que le hook bloque avec `decision: "block"` ou en quittant 2. Un hook de sortie 2 qui n'imprime pas JSON obtient toujours le texte d'invite dans son message de blocage.
1479
1480`suppressOriginalPrompt` change uniquement le message de blocage. Le texte soumis peut toujours apparaître dans les fichiers locaux comme la transcription de session et votre historique d'invite, donc un hook de blocage n'est pas un moyen de garder un secret hors du disque. Pour limiter ou supprimer ces fichiers, voir [Stockage en texte brut](/docs/fr/claude-directory#plaintext-storage) et [Effacer les données locales](/docs/fr/claude-directory#clear-local-data).
1481
1477<h3 id="userpromptexpansion">1482<h3 id="userpromptexpansion">
1478 UserPromptExpansion1483 UserPromptExpansion
1479</h3>1484</h3>
1488 Entrée UserPromptExpansion1493 Entrée UserPromptExpansion
1489</h4>1494</h4>
1490 1495
1491En plus des [champs d'entrée communs](#common-input-fields), les hooks UserPromptExpansion reçoivent `expansion_type`, `command_name`, `command_args`, `command_source`, et la chaîne `prompt` originale. Le champ `expansion_type` est `slash_command` pour les skills et commandes personnalisées, ou `mcp_prompt` pour les invites du serveur MCP.1496En plus des [champs d'entrée communs](#common-input-fields), les hooks UserPromptExpansion reçoivent `expansion_type`, `command_name`, `command_args`, `command_source`, et la chaîne `prompt` originale. Le champ `expansion_type` est `slash_command` pour les skills et commandes personnalisées, ou `mcp_prompt` pour les prompts du serveur MCP.
1492 1497
1493```json theme={null}1498```json theme={null}
1494{1499{
1544 1549
1545Claude Code retient chaque lot jusqu'à ce que votre hook retourne, donc gardez le hook rapide. Si le hook échoue ou expire, Claude Code affiche le texte original. Le délai d'expiration par défaut pour cet événement est 10 secondes ; si votre hook a besoin de plus de temps, définissez le champ `timeout` dans l'entrée du hook.1550Claude Code retient chaque lot jusqu'à ce que votre hook retourne, donc gardez le hook rapide. Si le hook échoue ou expire, Claude Code affiche le texte original. Le délai d'expiration par défaut pour cet événement est 10 secondes ; si votre hook a besoin de plus de temps, définissez le champ `timeout` dans l'entrée du hook.
1546 1551
1547MessageDisplay est affichage uniquement : le texte de remplacement change uniquement ce qui est rendu à l'écran. La transcription et ce que Claude voit conservent le texte original, donc Claude ne voit jamais le remplacement, et le mode verbeux montre l'original. Le hook reçoit uniquement le texte du message d'assistant, donc les résultats d'outils et le texte que vous tapez s'affichent inchangés.1552MessageDisplay est affichage uniquement : le texte de remplacement change uniquement ce qui est rendu à l'écran. La transcription et ce que Claude voit conservent le texte original, donc Claude ne voit jamais le remplacement, et le mode verbeux affiche l'original. Le hook reçoit uniquement le texte du message d'assistant, donc les résultats d'outils et le texte que vous tapez s'affichent inchangés.
1548 1553
1549MessageDisplay ne supporte pas les matchers et se déclenche pour chaque message d'assistant qui affiche du texte ; les messages sans texte, comme les réponses contenant uniquement des appels d'outils, ne le déclenchent pas.1554MessageDisplay ne supporte pas les matchers et se déclenche pour chaque message d'assistant qui affiche du texte ; les messages sans texte, comme les réponses contenant uniquement des appels d'outils, ne le déclenchent pas.
1550 1555
1554 Entrée MessageDisplay1559 Entrée MessageDisplay
1555</h4>1560</h4>
1556 1561
1557En plus des [champs d'entrée communs](#common-input-fields), les hooks MessageDisplay reçoivent des identifiants pour le tour et le message, la position de cet appel dans le message, et le nouveau texte dans `delta`. Les limites de lot dépendent de la façon dont le texte s'affiche, donc utilisez `index` et `final` pour suivre la progression dans un message plutôt que de vous attendre à ce que les lignes soient groupées d'une manière particulière.1562En plus des [champs d'entrée communs](#common-input-fields), les hooks MessageDisplay reçoivent des identifiants pour le tour et le message, la position de cet appel dans le message, et le nouveau texte dans `delta`. Les limites de lot dépendent de la façon dont le texte s'affiche, donc utilisez `index` et `final` pour suivre la progression à travers un message plutôt que de vous attendre à ce que les lignes soient groupées d'une manière particulière.
1558 1563
1559| Champ | Description |1564| Champ | Description |
1560| :- | :- |1565| :- | :- |
1674 1679
1675S'exécute après que Claude crée les paramètres d'outil et avant de traiter l'appel d'outil. Correspond à n'importe quel nom d'outil sauf `EndConversation` : les outils intégrés comme `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion`, et `ExitPlanMode`, et n'importe quels [noms d'outils MCP](#match-mcp-tools).1680S'exécute après que Claude crée les paramètres d'outil et avant de traiter l'appel d'outil. Correspond à n'importe quel nom d'outil sauf `EndConversation` : les outils intégrés comme `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion`, et `ExitPlanMode`, et n'importe quels [noms d'outils MCP](#match-mcp-tools).
1676 1681
1677Pour exécuter un hook quand un fichier spécifique change sur le disque, peu importe ce qui l'a écrit, utilisez [FileChanged](#filechanged) au lieu de correspondre aux outils d'édition de fichiers par nom. Contrairement à PreToolUse, Claude Code exécute les hooks FileChanged après le changement, et ils n'ont pas de contrôle de décision, donc ils ne peuvent pas bloquer l'écriture.1682Pour exécuter un hook quand un fichier spécifique change sur le disque, peu importe ce qui l'a écrit, utilisez [FileChanged](#filechanged) au lieu de faire correspondre les outils d'édition de fichiers par nom. Contrairement à PreToolUse, Claude Code exécute les hooks FileChanged après le changement, et ils n'ont pas de contrôle de décision, donc ils ne peuvent pas bloquer l'écriture.
1678 1683
1679<Warning>1684<Warning>
1680 PreToolUse s'exécute uniquement quand Claude appelle un outil. Les fichiers que vous [référencez avec `@` dans votre invite](/docs/fr/common-workflows#reference-files-and-directories) sont ajoutés sans aucun appel d'outil : Claude Code insère leur contenu lors de la construction de l'invite, donc aucun hook PreToolUse ne se déclenche pour eux, y compris les hooks correspondant à `Read`. Pour bloquer des chemins spécifiques des références `@`, utilisez plutôt une [règle de refus `Read`](/docs/fr/permissions#read-and-edit).1685 PreToolUse s'exécute uniquement quand Claude appelle un outil. Les fichiers que vous [référencez avec `@` dans votre invite](/docs/fr/common-workflows#reference-files-and-directories) sont ajoutés sans aucun appel d'outil : Claude Code insère leur contenu lors de la construction de l'invite, donc aucun hook PreToolUse ne se déclenche pour eux, y compris les hooks correspondant à `Read`. Pour bloquer des chemins spécifiques des références `@`, utilisez plutôt une [règle de refus `Read`](/docs/fr/permissions#read-and-edit).
1692 1697
1693En plus des [champs d'entrée communs](#common-input-fields), les hooks PreToolUse reçoivent `tool_name`, `tool_input`, et `tool_use_id`.1698En plus des [champs d'entrée communs](#common-input-fields), les hooks PreToolUse reçoivent `tool_name`, `tool_input`, et `tool_use_id`.
1694 1699
1695Pour un [outil MCP](#match-mcp-tools), l'entrée porte également `mcp_server`, un objet avec le `name` du serveur et une `source` qui dit d'où vient la définition du serveur. Les valeurs `source` incluent `plugin`, `sdk`, et les portées de configuration comme `user` et `project`. [`McpServerProvenance`](/docs/fr/agent-sdk/typescript#mcpserverprovenance) dans la référence Agent SDK les énumère toutes et dit comment traiter une que vous ne reconnaissez pas. Basez les décisions de confiance sur `source` plutôt que sur `name` ou le préfixe de nom d'outil `mcp__<server>__`. Le champ `mcp_server` nécessite Claude Code v2.1.274 ou ultérieur.1700Pour un [outil MCP](#match-mcp-tools), l'entrée porte également `mcp_server`, un objet avec le `name` du serveur et une `source` qui dit d'où vient la définition du serveur. Les valeurs `source` incluent `plugin`, `sdk`, et les portées de configuration comme `user` et `project`. [`McpServerProvenance`](/docs/fr/agent-sdk/typescript#mcpserverprovenance) dans la référence Agent SDK les énumère toutes et dit comment traiter une que vous ne reconnaissez pas. Basez les décisions de confiance sur `source` plutôt que sur `name` ou le préfixe du nom d'outil `mcp__<server>__`. Le champ `mcp_server` nécessite Claude Code v2.1.274 ou ultérieur.
1696 1701
1697Pour les outils de fichier `Write`, `Edit`, et `Read`, `tool_input.file_path` est toujours absolu :1702Pour les outils de fichier `Write`, `Edit`, et `Read`, `tool_input.file_path` est toujours absolu :
1698 1703
1732| `timeout` | number | `120000` | Délai d'expiration optionnel en millisecondes. Les valeurs au-dessus du [maximum](/docs/fr/tools-reference#bash-tool-behavior) sont réduites au maximum plutôt que rejetées |1737| `timeout` | number | `120000` | Délai d'expiration optionnel en millisecondes. Les valeurs au-dessus du [maximum](/docs/fr/tools-reference#bash-tool-behavior) sont réduites au maximum plutôt que rejetées |
1733| `run_in_background` | boolean | `false` | Si la commande doit s'exécuter en arrière-plan |1738| `run_in_background` | boolean | `false` | Si la commande doit s'exécuter en arrière-plan |
1734 1739
1735Quand une commande Bash change des fichiers dans un référentiel Git, Claude Code peut enregistrer ce qui a changé. Il enregistre les changements dans chaque mode de permission quand le paramètre [`bashEditDiffEnabled`](/docs/fr/settings-reference#basheditdiffenabled) active l'enregistrement ; l'entrée de ce paramètre dit quels fichiers peuvent le définir. Sinon, il les enregistre uniquement en mode auto et en mode `bypassPermissions`, et uniquement quand Claude Code dirige Claude à éditer des fichiers via Bash. Définissez `bashEditDiffEnabled` à `false` pour désactiver l'enregistrement. Les commandes en arrière-plan et les commandes en lecture seule ne portent pas de diff.1740Quand une commande Bash change des fichiers dans un référentiel Git, Claude Code peut enregistrer ce qui a changé. Il enregistre les changements dans chaque mode de permission quand le paramètre [`bashEditDiffEnabled`](/docs/fr/settings-reference#basheditdiffenabled) active l'enregistrement ; l'entrée de ce paramètre dit quels fichiers peuvent le définir. Sinon, il les enregistre uniquement en mode auto et mode `bypassPermissions`, et uniquement quand Claude Code dirige Claude à éditer des fichiers via Bash. Définissez `bashEditDiffEnabled` à `false` pour désactiver l'enregistrement. Les commandes en arrière-plan et les commandes en lecture seule ne portent pas de diff.
1736 1741
1737Votre hook [PostToolUse](#posttooluse) reçoit alors les fichiers modifiés dans `tool_response.bashEditDiff`. La liste couvre ce qui a changé sous le référentiel pendant que la commande s'exécutait. Les fichiers que Git ignore et les fichiers dans les sous-modules ne sont pas listés. Nécessite Claude Code v2.1.269 ou ultérieur.1742Votre hook [PostToolUse](#posttooluse) reçoit alors les fichiers modifiés dans `tool_response.bashEditDiff`. La liste couvre ce qui a changé sous le référentiel pendant que la commande s'exécutait. Les fichiers que Git ignore et les fichiers dans les sous-modules ne sont pas listés. Nécessite Claude Code v2.1.269 ou ultérieur.
1738 1743
1749| `moreFiles` | number | `2` | Nombre de fichiers modifiés sans diff dans `files` |1754| `moreFiles` | number | `2` | Nombre de fichiers modifiés sans diff dans `files` |
1750| `unavailable` | boolean | `true` | Défini quand le diff est incomplet ou n'a pas pu être pris |1755| `unavailable` | boolean | `true` | Défini quand le diff est incomplet ou n'a pas pu être pris |
1751| `skipped` | boolean | `true` | Défini pour une commande Git qui déplace l'arborescence de travail, comme `git checkout` ou `git stash`, donc Claude Code ne prend pas de diff |1756| `skipped` | boolean | `true` | Défini pour une commande Git qui déplace l'arborescence de travail, comme `git checkout` ou `git stash`, donc Claude Code ne prend pas de diff |
1752| `shared` | boolean | `true` | Défini quand un autre appel d'outil Bash, comme celui d'un sous-agent, s'est exécuté dans le même référentiel au même moment, donc certains changements listés peuvent être celui de cette commande |1757| `shared` | boolean | `true` | Défini quand un autre appel d'outil Bash, comme celui d'un sous-agent, s'exécutait dans le même référentiel au même moment, donc certains changements listés peuvent être celui de cette commande |
1753 1758
1754<a id="powershell" />1759<a id="powershell" />
1755 1760
1872| `subagent_type` | string | `"Explore"` | Type d'agent spécialisé à utiliser |1877| `subagent_type` | string | `"Explore"` | Type d'agent spécialisé à utiliser |
1873| `model` | string | `"sonnet"` | Alias de modèle optionnel pour remplacer le défaut |1878| `model` | string | `"sonnet"` | Alias de modèle optionnel pour remplacer le défaut |
1874 1879
1875Quand un appel Agent au premier plan se termine, votre hook [PostToolUse](#posttooluse) reçoit le résultat du sous-agent et la télémétrie d'exécution dans `tool_response`. Lisez ces champs pour inspecter l'exécution ; pour les cumuls de tokens et de coûts entre les sous-agents, utilisez les [compteurs de tokens et de coûts](/docs/fr/monitoring-usage#token-counter) filtrés à `query_source` `"subagent"`, puisque `totalTokens` et `usage` couvrent uniquement la demande finale :1880Quand un appel Agent au premier plan se termine, votre hook [PostToolUse](#posttooluse) reçoit le résultat du sous-agent et la télémétrie d'exécution dans `tool_response`. Lisez ces champs pour inspecter l'exécution ; pour les cumuls de tokens et de coûts entre les sous-agents, utilisez les [compteurs de tokens et de coûts](/docs/fr/monitoring-usage#token-counter) filtrés à `query_source` `"subagent"`, puisque `totalTokens` et `usage` couvrent uniquement la requête finale :
1876 1881
1877| Champ | Type | Exemple | Description |1882| Champ | Type | Exemple | Description |
1878| :- | :- | :- | :- |1883| :- | :- | :- | :- |
1881| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Les blocs de texte finaux du sous-agent, ou, pour un sous-agent dont le rapport passe par `SubagentHandback`, une brève note à ce sujet à leur place |1886| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Les blocs de texte finaux du sous-agent, ou, pour un sous-agent dont le rapport passe par `SubagentHandback`, une brève note à ce sujet à leur place |
1882| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modèle sur lequel le sous-agent a démarré, qui peut différer du modèle demandé |1887| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modèle sur lequel le sous-agent a démarré, qui peut différer du modèle demandé |
1883| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Modèles utilisés dans l'ordre, avec les répétitions consécutives effondrées ; défini uniquement quand le modèle a été échangé en cours d'exécution. Nécessite Claude Code v2.1.212 ou ultérieur |1888| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Modèles utilisés dans l'ordre, avec les répétitions consécutives effondrées ; défini uniquement quand le modèle a été échangé en cours d'exécution. Nécessite Claude Code v2.1.212 ou ultérieur |
1884| `totalTokens` | number | `12450` | Nombre de tokens de la demande API finale du sous-agent : tokens d'entrée, de sortie, et de cache combinés. Ce n'est pas un total sur toute l'exécution |1889| `totalTokens` | number | `12450` | Nombre de tokens de la requête API finale du sous-agent : tokens d'entrée, de sortie, et de cache combinés. Ce n'est pas un total sur toute l'exécution |
1885| `totalDurationMs` | number | `48211` | Durée d'horloge murale de l'exécution du sous-agent |1890| `totalDurationMs` | number | `48211` | Durée d'horloge murale de l'exécution du sous-agent |
1886| `totalToolUseCount` | number | `7` | Nombre d'appels d'outils que le sous-agent a effectués |1891| `totalToolUseCount` | number | `7` | Nombre d'appels d'outils que le sous-agent a effectués |
1887| `usage` | object | `{"input_tokens": 8320, ...}` | Ventilation des tokens par type de la demande API finale : `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1892| `usage` | object | `{"input_tokens": 8320, ...}` | Ventilation des tokens par type de la requête API finale : `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1888 1893
1889Sur Claude Code v2.1.271 ou ultérieur, un sous-agent qui s'exécute avec l'outil [`SubagentHandback`](/docs/fr/tools-reference), que Claude Code fournit en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode), livre son rapport via cet outil plutôt que de le retourner comme texte. Le champ `content` de son résultat `completed` porte alors une brève note à ce sujet plutôt que le rapport lui-même. Pour lire le rapport, correspondez à un hook `PreToolUse` ou `PostToolUse` sur `SubagentHandback` et lisez `tool_input.message`.1894Sur Claude Code v2.1.271 ou ultérieur, un sous-agent qui s'exécute avec l'outil [`SubagentHandback`](/docs/fr/tools-reference), que Claude Code fournit en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode), livre son rapport via cet outil plutôt que de le retourner comme texte. Le champ `content` de son résultat `completed` porte alors une brève note à ce sujet plutôt que le rapport lui-même. Pour lire le rapport, correspondez à un hook `PreToolUse` ou `PostToolUse` sur `SubagentHandback` et lisez `tool_input.message`.
1890 1895
1927 1932
1928| Champ | Description |1933| Champ | Description |
1929| :- | :- |1934| :- | :- |
1930| `permissionDecision` | `"allow"` ignore l'invite de permission, sauf pour les [actions que aucun mode n'auto-approuve](/docs/fr/permission-modes#actions-no-mode-auto-approves) et pour `AskUserQuestion` et `ExitPlanMode`, qui ont besoin de [`updatedInput` associé à lui](#allow-with-updatedinput). `"deny"` empêche l'appel d'outil. `"ask"` invite l'utilisateur à confirmer. `"defer"` quitte proprement pour que l'outil puisse être repris plus tard. Les [règles de refus et de demande](/docs/fr/permissions#manage-permissions) sont toujours évaluées indépendamment de ce que le hook retourne |1935| `permissionDecision` | `"allow"` ignore l'invite de permission, sauf pour les [actions qu'aucun mode n'approuve automatiquement](/docs/fr/permission-modes#actions-no-mode-auto-approves) et pour `AskUserQuestion` et `ExitPlanMode`, qui ont besoin de [`updatedInput` associé](#allow-with-updatedinput). `"deny"` empêche l'appel d'outil. `"ask"` demande à l'utilisateur de confirmer. `"defer"` quitte proprement pour que l'outil puisse être repris plus tard. Les [règles de refus et de demande](/docs/fr/permissions#manage-permissions) sont toujours évaluées indépendamment de ce que le hook retourne |
1931| `permissionDecisionReason` | Pour `"ask"`, montré à l'utilisateur mais pas Claude. Pour `"deny"`, montré à Claude. Pour `"allow"` et `"defer"`, écrit au [journal de débogage](#debug-hooks) uniquement |1936| `permissionDecisionReason` | Pour `"ask"`, montré à l'utilisateur mais pas Claude. Pour `"deny"`, montré à Claude. Pour `"allow"` et `"defer"`, écrit au [journal de débogage](#debug-hooks) uniquement |
1932| `updatedInput` | Modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'objet d'entrée entier, donc incluez les champs inchangés aux côtés des champs modifiés. Claude Code évalue les règles de permission et l'[éligibilité de mise en arrière-plan automatique](/docs/fr/tools-reference#background-commands) d'une commande Bash contre l'entrée que votre hook retourne, pas l'entrée que Claude a envoyée. Combinez avec `"allow"` pour auto-approuver, ou `"ask"` pour montrer l'entrée modifiée à l'utilisateur. Pour `"defer"`, ignoré |1937| `updatedInput` | Modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'objet d'entrée entier, donc incluez les champs inchangés aux côtés des champs modifiés. Claude Code évalue les règles de permission et l'[éligibilité de mise en arrière-plan automatique](/docs/fr/tools-reference#background-commands) d'une commande Bash contre l'entrée que votre hook retourne, pas l'entrée que Claude a envoyée. Combinez avec `"allow"` pour approuver automatiquement, ou `"ask"` pour montrer l'entrée modifiée à l'utilisateur. Pour `"defer"`, ignoré |
1933| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés du résultat d'outil. Ignoré quand `permissionDecision` est `"defer"`. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |1938| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés du résultat d'outil. Ignoré quand `permissionDecision` est `"defer"`. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
1934 1939
1935Quand plusieurs hooks PreToolUse retournent des décisions différentes, la priorité est `deny` > `defer` > `ask` > `allow`.1940Quand plusieurs hooks PreToolUse retournent des décisions différentes, la priorité est `deny` > `defer` > `ask` > `allow`.
1936 1941
1937Un hook qui bloque en quittant 2 s'achemine de la même façon que `"deny"` : Claude voit le message stderr comme la raison du refus.1942Un hook qui bloque en quittant 2 s'achemine de la même façon que `"deny"` : Claude voit le message stderr comme la raison du refus.
1938 1943
1939Quand un hook retourne `"ask"`, l'invite de permission affichée à l'utilisateur inclut une étiquette identifiant d'où vient le hook : `[settings]` pour un hook de n'importe quel fichier de paramètres ou du frontmatter d'agent, `[plugin:<name>]` pour le hook d'un plugin, ou `[skill]` pour un hook du frontmatter de skill. Cela aide les utilisateurs à comprendre quelle source de configuration demande une confirmation.1944Quand un hook retourne `"ask"`, l'invite de permission affichée à l'utilisateur inclut une étiquette identifiant d'où vient le hook : `[settings]` pour un hook de n'importe quel fichier de paramètres ou du frontmatter d'agent, `[plugin:<name>]` pour le hook d'un plugin, ou `[skill]` pour un hook du frontmatter de skill. Cela aide les utilisateurs à comprendre quelle source de configuration demande la confirmation.
1940 1945
1941Un `"ask"` d'un hook force également une invite de permission en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) : le classificateur peut toujours refuser l'appel d'outil, mais il ne peut pas approuver l'appel silencieusement. Avant v2.1.211, le classificateur pouvait approuver une commande Bash s'exécutant en dehors du [sandbox](/docs/fr/sandboxing) sans montrer l'invite que le hook a demandée ; le classificateur appliquait toujours ses propres règles de sécurité à cette commande, et un refus de hook `"deny"` était toujours honoré.1946Un `"ask"` d'un hook force également une invite de permission en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) : le classificateur peut toujours refuser l'appel d'outil, mais il ne peut pas approuver l'appel silencieusement. Avant v2.1.211, le classificateur pouvait approuver une commande Bash s'exécutant en dehors du [sandbox](/docs/fr/sandboxing) sans montrer l'invite que le hook a demandée ; le classificateur appliquait toujours ses propres règles de sécurité à cette commande, et un refus de hook `"deny"` était toujours honoré.
1942 1947
1956 1961
1957<span id="allow-with-updatedinput" />1962<span id="allow-with-updatedinput" />
1958 1963
1959En [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`, Claude Code offre `AskUserQuestion` et `ExitPlanMode` uniquement quand l'exécution a un [hôte de permission](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs) pour recevoir l'invite, comme un rappel `canUseTool` d'Agent SDK. Ces outils nécessitent l'interaction de l'utilisateur. Retourner `permissionDecision: "allow"` avec `updatedInput` satisfait cette exigence : le hook lit l'entrée de l'outil depuis stdin, collecte la réponse via votre propre UI, et la retourne dans `updatedInput` pour que l'outil s'exécute sans inviter. Retourner `"allow"` seul n'est pas suffisant pour ces outils. Pour `AskUserQuestion`, renvoyez le tableau `questions` original et ajoutez un objet [`answers`](#askuserquestion) mappant le texte de chaque question à la réponse choisie.1964En [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`, Claude Code offre `AskUserQuestion` et `ExitPlanMode` uniquement quand l'exécution a un [hôte de permission](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs) pour recevoir l'invite, comme un rappel `canUseTool` d'Agent SDK. Ces outils nécessitent l'interaction de l'utilisateur. Retourner `permissionDecision: "allow"` avec `updatedInput` satisfait cette exigence : le hook lit l'entrée de l'outil depuis stdin, collecte la réponse via votre propre interface utilisateur, et la retourne dans `updatedInput` pour que l'outil s'exécute sans demander. Retourner `"allow"` seul n'est pas suffisant pour ces outils. Pour `AskUserQuestion`, renvoyez le tableau `questions` original et ajoutez un objet [`answers`](#askuserquestion) mappant le texte de chaque question à la réponse choisie.
1960 1965
1961À partir de v2.1.199, un outil MCP dont le serveur le marque avec [`_meta["anthropic/requiresUserInteraction"]`](/docs/fr/mcp#require-approval-for-a-specific-tool) est plus strict : un hook ne peut pas ignorer son invite d'approbation avec `"allow"`, avec ou sans `updatedInput`, parce que Claude Code ne peut pas confirmer que le hook a collecté l'interaction que l'outil nécessite.1966À partir de v2.1.199, un outil MCP dont le serveur le marque avec [`_meta["anthropic/requiresUserInteraction"]`](/docs/fr/mcp#require-approval-for-a-specific-tool) est plus strict : un hook ne peut pas ignorer son invite d'approbation avec `"allow"`, avec ou sans `updatedInput`, parce que Claude Code ne peut pas confirmer que le hook a collecté l'interaction que l'outil nécessite.
1962 1967
1968 Différer un appel d'outil pour plus tard1973 Différer un appel d'outil pour plus tard
1969</h4>1974</h4>
1970 1975
1971`"defer"` est pour les intégrations qui exécutent `claude -p` comme un sous-processus et lisent sa sortie JSON, comme une application Agent SDK ou une UI personnalisée construite au-dessus de Claude Code. Cela permet à ce processus appelant de mettre en pause Claude à un appel d'outil, de collecter l'entrée via sa propre interface, et de reprendre où il s'était arrêté. Claude Code honore cette valeur uniquement en [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`. Dans les sessions interactives, il enregistre un avertissement et ignore le résultat du hook.1976`"defer"` est pour les intégrations qui exécutent `claude -p` comme un sous-processus et lisent sa sortie JSON, comme une application Agent SDK ou une interface utilisateur personnalisée construite au-dessus de Claude Code. Cela permet à ce processus appelant de mettre en pause Claude à un appel d'outil, de collecter l'entrée via sa propre interface, et de reprendre où il s'était arrêté. Claude Code honore cette valeur uniquement en [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`. Dans les sessions interactives, il enregistre un avertissement et ignore le résultat du hook.
1972 1977
1973L'outil `AskUserQuestion` est le cas typique : Claude veut poser quelque chose à l'utilisateur, mais il n'y a pas de terminal pour répondre. Une exécution `-p` offre `AskUserQuestion` uniquement quand elle a un [hôte de permission](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs), comme un outil MCP que vous passez avec `--permission-prompt-tool`, donc commencez l'exécution avec un. Le aller-retour fonctionne comme ceci :1978L'outil `AskUserQuestion` est le cas typique : Claude veut poser quelque chose à l'utilisateur, mais il n'y a pas de terminal pour répondre. Une exécution `-p` offre `AskUserQuestion` uniquement quand elle a un [hôte de permission](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs), comme un outil MCP que vous passez avec `--permission-prompt-tool`, donc commencez l'exécution avec un. Le aller-retour fonctionne comme ceci :
1974 1979
19751. Claude appelle `AskUserQuestion`. Le hook `PreToolUse` se déclenche.19801. Claude appelle `AskUserQuestion`. Le hook `PreToolUse` se déclenche.
19762. Le hook retourne `permissionDecision: "defer"`. L'outil ne s'exécute pas. Le processus quitte avec `stop_reason: "tool_deferred"` et l'appel d'outil en attente préservé dans la transcription.19812. Le hook retourne `permissionDecision: "defer"`. L'outil ne s'exécute pas. Le processus quitte avec `stop_reason: "tool_deferred"` et l'appel d'outil en attente préservé dans la transcription.
19773. Le processus appelant lit `deferred_tool_use` du résultat SDK, affiche la question dans sa propre UI, et attend une réponse.19823. Le processus appelant lit `deferred_tool_use` du résultat SDK, affiche la question dans sa propre interface utilisateur, et attend une réponse.
19784. Le processus appelant exécute `claude -p --resume <session-id>` avec le même hôte de permission. Le même appel d'outil déclenche `PreToolUse` à nouveau.19834. Le processus appelant exécute `claude -p --resume <session-id>` avec le même hôte de permission. Le même appel d'outil déclenche `PreToolUse` à nouveau.
19795. Le hook retourne `permissionDecision: "allow"` avec la réponse dans `updatedInput`. L'outil s'exécute et Claude continue.19845. Le hook retourne `permissionDecision: "allow"` avec la réponse dans `updatedInput`. L'outil s'exécute et Claude continue.
1980 1985
1981Le champ `deferred_tool_use` porte l'`id` de l'outil, le `name`, et l'`input`. L'`input` est les paramètres que Claude a générés pour l'appel d'outil, capturés avant l'exécution :1986Le champ `deferred_tool_use` porte l'`id`, le `name`, et l'`input` de l'outil. L'`input` est les paramètres que Claude a générés pour l'appel d'outil, capturés avant l'exécution :
1982 1987
1983```json theme={null}1988```json theme={null}
1984{1989{
1994}1999}
1995```2000```
1996 2001
1997Il n'y a pas de délai d'expiration ou de limite de tentatives. La session reste sur le disque jusqu'à ce que vous la repreniez, soumise aux [règles de balayage de rétention](/docs/fr/claude-directory#cleaned-up-automatically) de [`cleanupPeriodDays`](/docs/fr/settings-reference#cleanupperioddays), qui supprime les fichiers de session après 30 jours par défaut. Si la réponse n'est pas prête quand vous reprenez, le hook peut retourner `"defer"` à nouveau et le processus quitte de la même façon. Le processus appelant contrôle quand casser la boucle en retournant finalement `"allow"` ou `"deny"` du hook.2002Il n'y a pas de délai d'expiration ou de limite de tentatives. La session reste sur le disque jusqu'à ce que vous la repreniez, soumise aux règles de balayage de rétention [`cleanupPeriodDays`](/docs/fr/settings-reference#cleanupperioddays), qui supprime les fichiers de session après 30 jours par défaut, en suivant les [règles de balayage de rétention](/docs/fr/claude-directory#cleaned-up-automatically). Si la réponse n'est pas prête quand vous reprenez, le hook peut retourner `"defer"` à nouveau et le processus quitte de la même façon. Le processus appelant contrôle quand casser la boucle en retournant finalement `"allow"` ou `"deny"` du hook.
1998 2003
1999`"defer"` fonctionne uniquement quand Claude effectue un seul appel d'outil dans le tour. Si Claude effectue plusieurs appels d'outils à la fois, `"defer"` est ignoré avec un avertissement et l'outil procède via le flux de permission normal. La contrainte existe parce que la reprise ne peut réexécuter qu'un seul outil : il n'y a aucun moyen de différer un appel d'un lot sans laisser les autres non résolus.2004`"defer"` fonctionne uniquement quand Claude effectue un seul appel d'outil dans le tour. Si Claude effectue plusieurs appels d'outils à la fois, `"defer"` est ignoré avec un avertissement et l'outil procède par le flux de permission normal. La contrainte existe parce que la reprise ne peut relancer qu'un seul outil : il n'y a aucun moyen de différer un appel d'un lot sans laisser les autres non résolus.
2000 2005
2001Si l'outil différé n'est plus disponible quand vous reprenez, le processus quitte avec `stop_reason: "tool_deferred_unavailable"` et `is_error: true` avant que le hook se déclenche. Cela se produit quand un serveur MCP qui a fourni l'outil n'est pas connecté pour la session reprise. La charge utile `deferred_tool_use` est toujours incluse pour que vous puissiez identifier quel outil a disparu.2006Si l'outil différé n'est plus disponible quand vous reprenez, le processus quitte avec `stop_reason: "tool_deferred_unavailable"` et `is_error: true` avant que le hook se déclenche. Cela se produit quand un serveur MCP qui a fourni l'outil n'est pas connecté pour la session reprise. La charge utile `deferred_tool_use` est toujours incluse pour que vous puissiez identifier quel outil a disparu.
2002 2007
2015 2020
2016Utilisez cet événement quand vous avez besoin d'un signal au moment où Claude demande la permission d'utiliser un outil. Claude Code exécute un hook [Notification](#notification) avec le type `permission_prompt` uniquement après que l'invite ait attendu environ six secondes.2021Utilisez cet événement quand vous avez besoin d'un signal au moment où Claude demande la permission d'utiliser un outil. Claude Code exécute un hook [Notification](#notification) avec le type `permission_prompt` uniquement après que l'invite ait attendu environ six secondes.
2017 2022
2018Claude Code n'exécute pas les hooks PermissionRequest pour la [demande réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox. Pour obtenir un signal pour cette invite, utilisez le type de notification `permission_prompt`.2023Claude Code n'exécute pas les hooks PermissionRequest pour la [requête réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox. Pour obtenir un signal pour cette invite, utilisez le type de notification `permission_prompt`.
2019 2024
2020Correspond au nom de l'outil, mêmes valeurs que PreToolUse.2025Correspond au nom de l'outil, mêmes valeurs que PreToolUse.
2021 2026
2023 Entrée PermissionRequest2028 Entrée PermissionRequest
2024</h4>2029</h4>
2025 2030
2026Les hooks PermissionRequest reçoivent les champs `tool_name` et `tool_input` comme les hooks PreToolUse, mais sans `tool_use_id`. Pour un outil MCP, ils reçoivent également l'objet [`mcp_server`](#pretooluse-input). Un tableau optionnel `permission_suggestions` contient les [mises à jour de permission](#permission-update-entries) que Claude Code suggère pour cette demande, comme ajouter une règle d'autorisation ou changer le mode de permission.2031Les hooks PermissionRequest reçoivent les champs `tool_name` et `tool_input` comme les hooks PreToolUse, mais sans `tool_use_id`. Pour un outil MCP, ils reçoivent également l'objet [`mcp_server`](#pretooluse-input). Un tableau optionnel `permission_suggestions` contient les [mises à jour de permission](#permission-update-entries) que Claude Code suggère pour cette requête, comme ajouter une règle d'autorisation ou changer le mode de permission.
2027 2032
2028Le tableau `permission_suggestions` n'est pas une liste exacte des options que vous voyez, parce que chaque dialogue de permission construit ses propres options. Certains dialogues, comme celui pour les éditions de fichiers, ne lisent pas du tout le tableau et dérivent leurs options de la demande elle-même. Un dialogue qui le lit peut toujours retenir une option dont la suggestion reste dans le tableau, par exemple quand [`allowManagedPermissionRulesOnly`](/docs/fr/settings-reference#allowmanagedpermissionrulesonly) cache les options de sauvegarde de règles. Il peut également offrir des options qui n'ont pas d'entrée de suggestion, comme [**Oui, et basculer en mode auto**](/docs/fr/permission-modes#switch-permission-modes), qui change le mode de permission directement plutôt que via une mise à jour de permission.2033Le tableau `permission_suggestions` n'est pas une liste exacte des options que vous voyez, parce que chaque dialogue de permission construit ses propres options. Certains dialogues, comme celui pour les éditions de fichiers, ne lisent pas du tout le tableau et dérivent leurs options de la requête elle-même. Un dialogue qui le lit peut toujours retenir une option dont la suggestion reste dans le tableau, par exemple quand [`allowManagedPermissionRulesOnly`](/docs/fr/settings-reference#allowmanagedpermissionrulesonly) cache les options de sauvegarde de règles. Il peut également offrir des options qui n'ont pas d'entrée de suggestion, comme [**Oui, et passer en mode auto**](/docs/fr/permission-modes#switch-permission-modes), qui change le mode de permission directement plutôt que via une mise à jour de permission.
2029 2034
2030Les hooks PreToolUse s'exécutent avant chaque appel d'outil, qu'il ait besoin de permission ou non. Les hooks PermissionRequest s'exécutent uniquement quand Claude Code est sur le point de vous demander la permission, ou quand il refuserait autrement un appel qui ne peut pas inviter. Aucun événement ne se déclenche pour [`EndConversation`](/docs/fr/tools-reference#endconversation-tool-behavior).2035Les hooks PreToolUse s'exécutent avant chaque appel d'outil, qu'il ait besoin de permission ou non. Les hooks PermissionRequest s'exécutent uniquement quand Claude Code est sur le point de vous demander la permission, ou quand il refuserait autrement un appel qui ne peut pas demander. Aucun événement ne se déclenche pour [`EndConversation`](/docs/fr/tools-reference#endconversation-tool-behavior).
2031 2036
2032```json theme={null}2037```json theme={null}
2033{2038{
2066| `message` | Pour `"deny"` uniquement : dit à Claude pourquoi la permission a été refusée |2071| `message` | Pour `"deny"` uniquement : dit à Claude pourquoi la permission a été refusée |
2067| `interrupt` | Pour `"deny"` uniquement : si `true`, arrête Claude |2072| `interrupt` | Pour `"deny"` uniquement : si `true`, arrête Claude |
2068 2073
2069Un hook qui quitte 2 sans un objet `decision` laisse le flux de permission inchangé, et son stderr est rejeté. Seul l'objet `decision` peut accorder ou refuser la demande.2074Un hook qui quitte 2 sans un objet `decision` laisse le flux de permission inchangé, et son stderr est rejeté. Seul l'objet `decision` peut accorder ou refuser la requête.
2070 2075
2071```json theme={null}2076```json theme={null}
2072{2077{
2191```2196```
2192 2197
2193<Warning>2198<Warning>
2194 `updatedToolOutput` change uniquement ce que Claude voit. L'outil s'est déjà exécuté au moment où le hook se déclenche, donc tous les fichiers écrits, commandes exécutées, ou demandes réseau envoyées ont déjà pris effet. La télémétrie comme les spans d'outils OpenTelemetry et les événements d'analyse capturent également la sortie originale avant que le hook s'exécute. Pour empêcher ou modifier un appel d'outil avant qu'il s'exécute, utilisez plutôt un hook [PreToolUse](#pretooluse).2199 `updatedToolOutput` change uniquement ce que Claude voit. L'outil s'est déjà exécuté au moment où le hook se déclenche, donc tous les fichiers écrits, commandes exécutées, ou requêtes réseau envoyées ont déjà pris effet. La télémétrie comme les spans d'outils OpenTelemetry et les événements d'analyse capturent également la sortie originale avant que le hook s'exécute. Pour empêcher ou modifier un appel d'outil avant qu'il s'exécute, utilisez plutôt un hook [PreToolUse](#pretooluse).
2195 2200
2196 La valeur de remplacement doit correspondre à la forme de sortie de l'outil. Les outils intégrés retournent des objets structurés plutôt que des chaînes brutes. Par exemple, `Bash` retourne un objet avec les champs `stdout`, `stderr`, `interrupted`, et `isImage`. Pour les outils intégrés, une valeur qui ne correspond pas au schéma de sortie de l'outil est ignorée et la sortie originale est utilisée. La sortie d'outil MCP est transmise sans validation de schéma. Supprimer les détails d'erreur que Claude a besoin peut le faire procéder sur une fausse hypothèse.2201 La valeur de remplacement doit correspondre à la forme de sortie de l'outil. Les outils intégrés retournent des objets structurés plutôt que des chaînes brutes. Par exemple, `Bash` retourne un objet avec les champs `stdout`, `stderr`, `interrupted`, et `isImage`. Pour les outils intégrés, une valeur qui ne correspond pas au schéma de sortie de l'outil est ignorée et la sortie originale est utilisée. La sortie d'outil MCP est transmise sans validation de schéma. Supprimer les détails d'erreur dont Claude a besoin peut le faire procéder sur une fausse hypothèse.
2197</Warning>2202</Warning>
2198 2203
2199<h4 id="annotate-a-result-for-the-auto-mode-classifier">2204<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2238Correspond au nom de l'outil, mêmes valeurs que PreToolUse.2243Correspond au nom de l'outil, mêmes valeurs que PreToolUse.
2239 2244
2240<Note>2245<Note>
2241 Cet événement ne se déclenche pas pour les appels d'outils rejetés avant l'exécution : un nom d'outil inconnu, une entrée qui échoue la validation de schéma ou spécifique à l'outil, ou un refus de permission. Les rejets de validation sont retournés comme des résultats `tool_use_error` et se produisent avant que les hooks s'exécutent, donc ils ne déclenchent ni `PreToolUse` ni `PostToolUseFailure`. Les refus de permission déclenchent `PreToolUse` mais pas cet événement ; voir [PermissionDenied](#permissiondenied).2246 Cet événement ne se déclenche pas pour les appels d'outils rejetés avant l'exécution : un nom d'outil inconnu, une entrée qui échoue la validation de schéma ou spécifique à l'outil, ou un refus de permission. Les rejets de validation sont retournés comme résultats `tool_use_error` et se produisent avant que les hooks s'exécutent, donc ils ne déclenchent ni `PreToolUse` ni `PostToolUseFailure`. Les refus de permission déclenchent `PreToolUse` mais pas cet événement ; voir [PermissionDenied](#permissiondenied).
2242</Note>2247</Note>
2243 2248
2244<h4 id="posttoolusefailure-input">2249<h4 id="posttoolusefailure-input">
2276 2281
2277* Pour Bash et PowerShell, une commande qui s'est exécutée et a quitté produit une première ligne `Exit code N`, puis toute sortie que la commande a produite comme un bloc avec stdout et stderr entrelacés2282* Pour Bash et PowerShell, une commande qui s'est exécutée et a quitté produit une première ligne `Exit code N`, puis toute sortie que la commande a produite comme un bloc avec stdout et stderr entrelacés
2278* Une charge utile peut également porter un message d'échec nu sans ligne de code de sortie, quand Claude Code n'a pas pu démarrer le processus shell lui-même2283* Une charge utile peut également porter un message d'échec nu sans ligne de code de sortie, quand Claude Code n'a pas pu démarrer le processus shell lui-même
2279* Claude Code tronque au milieu les longues chaînes autour d'un marqueur `... [N characters truncated] ...`, et peut insérer des lignes de son propre, comme `Command timed out after 2m 0s`2284* Claude Code tronque au milieu les longues chaînes autour d'un marqueur `... [N characters truncated] ...`, et peut insérer ses propres lignes, comme `Command timed out after 2m 0s`
2280 2285
2281<h4 id="posttoolusefailure-decision-control">2286<h4 id="posttoolusefailure-decision-control">
2282 Contrôle de décision PostToolUseFailure2287 Contrôle de décision PostToolUseFailure
2301 PostToolBatch2306 PostToolBatch
2302</h3>2307</h3>
2303 2308
2304S'exécute une fois après que chaque appel d'outil dans un lot se soit résolu, avant que Claude Code envoie la demande suivante au modèle. `PostToolUse` se déclenche une fois par outil, ce qui signifie qu'il se déclenche simultanément quand Claude effectue des appels d'outils parallèles. `PostToolBatch` se déclenche exactement une fois avec le lot complet, donc c'est le bon endroit pour injecter du contexte qui dépend de l'ensemble des outils qui se sont exécutés plutôt que de n'importe quel outil unique. Il n'y a pas de matcher pour cet événement.2309S'exécute une fois après que chaque appel d'outil dans un lot se soit résolu, avant que Claude Code envoie la requête suivante au modèle. `PostToolUse` se déclenche une fois par outil, ce qui signifie qu'il se déclenche simultanément quand Claude effectue des appels d'outils parallèles. `PostToolBatch` se déclenche exactement une fois avec le lot complet, donc c'est le bon endroit pour injecter du contexte qui dépend de l'ensemble des outils qui se sont exécutés plutôt que de n'importe quel outil unique. Il n'y a pas de matcher pour cet événement.
2305 2310
2306<h4 id="posttoolbatch-input">2311<h4 id="posttoolbatch-input">
2307 Entrée PostToolBatch2312 Entrée PostToolBatch
2364 PermissionDenied2369 PermissionDenied
2365</h3>2370</h3>
2366 2371
2367S'exécute quand le [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) refuse un appel d'outil, y compris quand il refuse sans un verdict du classificateur parce qu'une [vérification de sécurité séparée du mode auto a refusé la demande du classificateur lui-même](/docs/fr/errors#auto-mode-cannot-determine-the-safety-of-an-action) ou sa réponse n'a pas analysé. Ce hook ne se déclenche que en mode auto : il ne s'exécute pas quand vous refusez manuellement un dialogue de permission, quand un hook `PreToolUse` bloque un appel, ou quand une règle `deny` correspond. Utilisez-le pour enregistrer les refus, ajuster la configuration, ou dire au modèle qu'il peut réessayer l'appel d'outil.2372S'exécute quand le [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) refuse un appel d'outil, y compris quand il refuse sans verdict du classificateur parce qu'une [vérification de sécurité séparée du mode auto a refusé la propre requête du classificateur](/docs/fr/errors#auto-mode-cannot-determine-the-safety-of-an-action) ou sa réponse n'a pas analysé. Ce hook ne se déclenche que en mode auto : il ne s'exécute pas quand vous refusez manuellement un dialogue de permission, quand un hook `PreToolUse` bloque un appel, ou quand une règle `deny` correspond. Utilisez-le pour enregistrer les refus, ajuster la configuration, ou dire au modèle qu'il peut réessayer l'appel d'outil.
2368 2373
2369Correspond au nom de l'outil, mêmes valeurs que PreToolUse.2374Correspond au nom de l'outil, mêmes valeurs que PreToolUse.
2370 2375
2412 2417
2413Quand `retry` est `true`, Claude Code ajoute un message à la conversation disant au modèle qu'il peut réessayer l'appel d'outil. Claude Code ne renverse pas le refus lui-même. Si votre hook ne retourne pas JSON, ou retourne `retry: false`, le refus tient et le modèle reçoit le message de rejet original.2418Quand `retry` est `true`, Claude Code ajoute un message à la conversation disant au modèle qu'il peut réessayer l'appel d'outil. Claude Code ne renverse pas le refus lui-même. Si votre hook ne retourne pas JSON, ou retourne `retry: false`, le refus tient et le modèle reçoit le message de rejet original.
2414 2419
2415Claude Code ignore `retry: true` quand le classificateur a produit [aucun verdict sur l'action](/docs/fr/errors#auto-mode-cannot-determine-the-safety-of-an-action) : sa réponse n'a pas analysé, ou une vérification de sécurité séparée du mode auto a refusé la demande du classificateur. Pour ces refus, Claude Code dit déjà au modèle dans le message de rejet s'il faut réessayer plus tard ou continuer.2420Claude Code ignore `retry: true` quand le classificateur a produit [aucun verdict sur l'action](/docs/fr/errors#auto-mode-cannot-determine-the-safety-of-an-action) : sa réponse n'a pas analysé, ou une vérification de sécurité séparée du mode auto a refusé la requête du classificateur. Pour ces refus, Claude Code dit déjà au modèle dans le message de rejet s'il faut réessayer plus tard ou continuer.
2416 2421
2417<h3 id="notification">2422<h3 id="notification">
2418 Notification2423 Notification
2424 2429
2425| Matcher | Quand il se déclenche |2430| Matcher | Quand il se déclenche |
2426| :- | :- |2431| :- | :- |
2427| `permission_prompt` | Claude a besoin de votre permission pour utiliser un outil ou la [demande réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox, et l'invite a attendu environ six secondes |2432| `permission_prompt` | Claude a besoin de votre permission pour utiliser un outil ou la [requête réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox, et l'invite a attendu environ six secondes |
2428| `idle_prompt` | Claude a fini de répondre il y a environ 60 secondes et vous n'avez pas tapé depuis |2433| `idle_prompt` | Claude a fini de répondre il y a environ 60 secondes et vous n'avez pas tapé depuis |
2429| `auth_success` | L'authentification se termine |2434| `auth_success` | L'authentification se termine |
2430| `elicitation_dialog` | Un serveur MCP ouvre un formulaire d'élicitation et vous n'avez pas tapé depuis environ six secondes |2435| `elicitation_dialog` | Un serveur MCP ouvre un formulaire d'élicitation et vous n'avez pas tapé pendant environ six secondes |
2431| `elicitation_url_dialog` | Un serveur MCP vous demande d'ouvrir une URL de navigateur et vous n'avez pas tapé depuis environ six secondes |2436| `elicitation_url_dialog` | Un serveur MCP vous demande d'ouvrir une URL de navigateur et vous n'avez pas tapé pendant environ six secondes |
2432| `elicitation_complete` | Un serveur MCP signale qu'une [élicitation en mode URL](#elicitation-input) est complète |2437| `elicitation_complete` | Un serveur MCP signale qu'une [élicitation en mode URL](#elicitation-input) est complète |
2433| `elicitation_response` | Une réponse d'élicitation MCP est renvoyée au serveur |2438| `elicitation_response` | Une réponse d'élicitation MCP est renvoyée au serveur |
2434| `agent_needs_input` | Une session en arrière-plan commence à attendre votre entrée pendant que la [vue agent](/docs/fr/agent-view) est ouverte dans un terminal, ou la session actuelle vous pose une [question de configuration de terminal d'un coéquipier d'équipe agent](/docs/fr/agent-teams#choose-a-display-mode) et vous n'avez pas tapé depuis environ six secondes |2439| `agent_needs_input` | Une session en arrière-plan commence à attendre votre entrée pendant que la [vue agent](/docs/fr/agent-view) est ouverte dans un terminal. Se déclenche également quand une session de terminal vous montre une [question de configuration de terminal du coéquipier d'une équipe d'agents](/docs/fr/agent-teams#choose-a-display-mode) ou l'avis du mode auto sur les [frais de requête du classificateur](/docs/fr/auto-mode-classifier-billing) et vous n'avez pas tapé pendant environ six secondes |
2435| `agent_completed` | Une session en arrière-plan se termine ou échoue. Se déclenche uniquement pendant que la [vue agent](/docs/fr/agent-view) est ouverte dans un terminal |2440| `agent_completed` | Une session en arrière-plan se termine ou échoue. Se déclenche uniquement pendant que la [vue agent](/docs/fr/agent-view) est ouverte dans un terminal |
2436| `quota_auto_resume_fired` | Claude Code continue votre tâche après qu'une limite d'utilisation claude.ai l'ait mise en pause : à la réinitialisation, ou plus tôt quand quelque chose que vous faites dans Claude Code pendant l'attente, comme ajouter des crédits d'utilisation, mettre à niveau votre plan, ou changer de modèles, rend l'utilisation disponible à nouveau, avec l'[exception de paramètre de modèle](/docs/fr/interactive-mode#wait-for-a-usage-limit-to-reset) |2441| `quota_auto_resume_fired` | Claude Code continue votre tâche après qu'une limite d'utilisation claude.ai l'ait mise en pause : à la réinitialisation, ou plus tôt quand quelque chose que vous faites dans Claude Code pendant l'attente, comme ajouter des crédits d'utilisation, mettre à niveau votre plan, ou changer de modèles, rend l'utilisation disponible à nouveau, avec l'[exception de paramètre de modèle](/docs/fr/interactive-mode#wait-for-a-usage-limit-to-reset) |
2437| `quota_auto_resume_stale` | Une limite d'utilisation claude.ai s'est réinitialisée pendant que votre ordinateur dormait pendant plus d'environ 30 minutes. Claude Code attend que vous appuyiez sur `Enter` au lieu de continuer. Après un sommeil plus court, il continue et se déclenche `quota_auto_resume_fired` à la place |2442| `quota_auto_resume_stale` | Une limite d'utilisation claude.ai s'est réinitialisée pendant que votre ordinateur dormait pendant plus d'environ 30 minutes. Claude Code attend que vous appuyiez sur `Enter` au lieu de continuer. Après un sommeil plus court, il continue et se déclenche `quota_auto_resume_fired` à la place |
2441 2446
2442Les types `quota_auto_resume_fired`, `quota_auto_resume_stale`, et `quota_auto_resume_disabled` nécessitent Claude Code v2.1.234 ou ultérieur.2447Les types `quota_auto_resume_fired`, `quota_auto_resume_stale`, et `quota_auto_resume_disabled` nécessitent Claude Code v2.1.234 ou ultérieur.
2443 2448
2444En sessions de terminal, `permission_prompt` pour la demande réseau d'une commande en sandbox nécessite Claude Code v2.1.246 ou ultérieur.2449En sessions de terminal, `permission_prompt` pour la requête réseau d'une commande en sandbox nécessite Claude Code v2.1.246 ou ultérieur.
2445 2450
2446`agent_needs_input` pour une question de configuration de terminal d'un coéquipier nécessite Claude Code v2.1.248 ou ultérieur.2451`agent_needs_input` pour la question de configuration de terminal d'un coéquipier nécessite Claude Code v2.1.248 ou ultérieur.
2447 2452
2448<Note>2453<Note>
2449 Les types `permission_prompt`, `idle_prompt`, `elicitation_dialog`, et `elicitation_url_dialog` partagent leur timing avec les notifications de bureau, donc en sessions de terminal vous ne les voyez que quand vous semblez être loin du terminal :2454 Les types `permission_prompt`, `idle_prompt`, `elicitation_dialog`, et `elicitation_url_dialog` partagent leur timing avec les notifications de bureau, donc en sessions de terminal vous ne les voyez que quand vous semblez être loin du terminal :
2450 2455
2451 * Attendez `permission_prompt` une fois que vous n'avez pas tapé pendant environ six secondes. Le minuteur démarre quand l'invite de permission apparaît, et chaque frappe le reporte. Pour exécuter un hook immédiatement quand Claude demande la permission d'utiliser un outil, utilisez plutôt [PermissionRequest](#permissionrequest).2456 * Attendez `permission_prompt` une fois que vous n'avez pas tapé pendant environ six secondes. Le minuteur démarre quand l'invite de permission apparaît, et chaque frappe le reporte. Pour exécuter un hook immédiatement quand Claude demande la permission d'utiliser un outil, utilisez plutôt [PermissionRequest](#permissionrequest).
2452 * Attendez `idle_prompt` environ 60 secondes après que Claude finisse de répondre, et uniquement si vous n'avez pas tapé depuis. Claude Code n'envoie pas `idle_prompt` pendant qu'il attend qu'une limite d'utilisation claude.ai se réinitialise. Quand l'attente se termine seule, l'un des types `quota_auto_resume_*` se déclenche à la place.2457 * Attendez `idle_prompt` environ 60 secondes après que Claude finisse de répondre, et uniquement si vous n'avez pas tapé depuis. Claude Code n'envoie pas `idle_prompt` pendant qu'il attend qu'une limite d'utilisation claude.ai se réinitialise. Quand l'attente se termine d'elle-même, l'un des types `quota_auto_resume_*` se déclenche à la place.
2453 * Attendez `elicitation_dialog` pour un formulaire d'élicitation, ou `elicitation_url_dialog` pour une demande d'URL de navigateur, une fois que vous n'avez pas tapé pendant environ six secondes. Les deux partagent la même porte de six secondes que `permission_prompt` : le minuteur démarre quand le dialogue apparaît, et chaque frappe le reporte.2458 * Attendez `elicitation_dialog` pour un formulaire d'élicitation, ou `elicitation_url_dialog` pour une requête d'URL de navigateur, une fois que vous n'avez pas tapé pendant environ six secondes. Les deux partagent la même porte de six secondes que `permission_prompt` : le minuteur démarre quand le dialogue apparaît, et chaque frappe le reporte.
2454 2459
2455 Une demande de permission ou d'élicitation qui arrive pendant qu'un autre dialogue est à l'écran garde la même porte de six secondes, chronométrée à partir de quand la demande arrive. Sa notification peut vous atteindre pendant que la demande attend toujours derrière le dialogue ouvert.2460 Une requête de permission ou d'élicitation qui arrive pendant qu'un autre dialogue est à l'écran garde la même porte de six secondes, chronométrée à partir de quand la requête arrive. Sa notification peut vous atteindre pendant que la requête attend toujours derrière le dialogue ouvert.
2456</Note>2461</Note>
2457 2462
2458Claude Code chronométre `permission_prompt` différemment dans les sessions où il envoie les demandes de permission au rappel [`canUseTool`](/docs/fr/agent-sdk/user-input) d'Agent SDK, ce qui est comment Claude Desktop et l'extension VS Code hébergent Claude Code :2463Claude Code chronomètre `permission_prompt` différemment dans les sessions où il envoie les requêtes de permission au rappel [`canUseTool`](/docs/fr/agent-sdk/user-input) d'Agent SDK, ce qui est comment Claude Desktop et l'extension VS Code hébergent Claude Code :
2459 2464
2460* Attendez `permission_prompt` environ six secondes après que Claude demande la permission. Claude Code ne le reporte pas pendant que vous tapez.2465* Attendez `permission_prompt` environ six secondes après que Claude demande la permission. Claude Code ne le reporte pas pendant que vous tapez.
2461* Si vous ou un hook [PermissionRequest](#permissionrequest) répondez plus tôt, Claude Code n'exécute pas `permission_prompt`.2466* Si vous ou un hook [PermissionRequest](#permissionrequest) répondez plus tôt, Claude Code n'exécute pas `permission_prompt`.
2516 SubagentStart2521 SubagentStart
2517</h3>2522</h3>
2518 2523
2519S'exécute quand Claude crée un sous-agent avec l'outil Agent, quand Claude [reprend un sous-agent](/docs/fr/sub-agents#resume-subagents), et chaque fois qu'un coéquipier d'[équipe agent](/docs/fr/agent-teams) en processus gère un nouveau message. Supporte les matchers pour filtrer par nom de type d'agent. Pour les agents intégrés, c'est le nom de l'agent comme `general-purpose`, `Explore`, ou `Plan`. Pour les [sous-agents personnalisés](/docs/fr/sub-agents), c'est le champ `name` du frontmatter de l'agent, pas le nom du fichier.2524S'exécute quand Claude crée un sous-agent avec l'outil Agent, quand Claude [reprend un sous-agent](/docs/fr/sub-agents#resume-subagents), et chaque fois qu'un coéquipier d'[équipe d'agents](/docs/fr/agent-teams) en processus gère un nouveau message. Supporte les matchers pour filtrer par nom de type d'agent. Pour les agents intégrés, c'est le nom de l'agent comme `general-purpose`, `Explore`, ou `Plan`. Pour les [sous-agents personnalisés](/docs/fr/sub-agents), c'est le champ `name` du frontmatter de l'agent, pas le nom du fichier.
2520 2525
2521Pour les sous-agents fournis par un [plugin](/docs/fr/plugins/overview), le type d'agent est l'identifiant scoped du plugin comme `my-plugin:reviewer`, pas le nom du frontmatter nu. Le deux-points place un nom scoped du plugin sur le chemin d'expression régulière, donc ancrez le matcher avec `^` et `$` pour une correspondance exacte : `^my-plugin:reviewer$`.2526Pour les sous-agents expédiés par un [plugin](/docs/fr/plugins/overview), le type d'agent est l'identifiant délimité par plugin comme `my-plugin:reviewer`, pas le nom du frontmatter nu. Le deux-points place un nom délimité par plugin sur le chemin d'expression régulière, donc ancrez le matcher avec `^` et `$` pour une correspondance exacte : `^my-plugin:reviewer$`.
2522 2527
2523<h4 id="subagentstart-input">2528<h4 id="subagentstart-input">
2524 Entrée SubagentStart2529 Entrée SubagentStart
2525</h4>2530</h4>
2526 2531
2527En plus des [champs d'entrée communs](#common-input-fields), les hooks SubagentStart reçoivent `agent_id` avec l'identifiant unique du sous-agent et `agent_type` avec le nom de l'agent que le matcher filtre.2532En plus des [champs d'entrée communs](#common-input-fields), les hooks SubagentStart reçoivent `agent_id` avec l'identifiant unique du sous-agent et `agent_type` avec le nom de l'agent sur lequel le matcher filtre.
2528 2533
2529```json theme={null}2534```json theme={null}
2530{2535{
2566 2571
2567En plus des [champs d'entrée communs](#common-input-fields), les hooks SubagentStop reçoivent `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path`, et `last_assistant_message`. Le champ `agent_type` est la valeur utilisée pour le filtrage du matcher. Le `transcript_path` est la transcription de la session principale, tandis que `agent_transcript_path` est la propre transcription du sous-agent stockée dans un dossier `subagents/` imbriqué. Le champ `last_assistant_message` contient le contenu textuel de la réponse finale du sous-agent, donc les hooks peuvent y accéder sans analyser le fichier de transcription.2572En plus des [champs d'entrée communs](#common-input-fields), les hooks SubagentStop reçoivent `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path`, et `last_assistant_message`. Le champ `agent_type` est la valeur utilisée pour le filtrage du matcher. Le `transcript_path` est la transcription de la session principale, tandis que `agent_transcript_path` est la propre transcription du sous-agent stockée dans un dossier `subagents/` imbriqué. Le champ `last_assistant_message` contient le contenu textuel de la réponse finale du sous-agent, donc les hooks peuvent y accéder sans analyser le fichier de transcription.
2568 2573
2569Pas chaque événement SubagentStop provient d'un sous-agent que Claude a créé. Claude Code exécute également des agents internes pour certaines de ses propres fonctionnalités, comme les [suggestions d'invite](/docs/fr/interactive-mode#prompt-suggestions) et les [questions latérales `/btw`](/docs/fr/interactive-mode#side-questions-with-%2Fbtw), et SubagentStop se déclenche quand l'un de ceux-ci se termine aussi. Pour ces événements, `agent_type` est le nom de l'agent que la session elle-même exécute, comme celui défini avec [`--agent`](/docs/fr/cli-reference#cli-flags) ou le paramètre [`agent`](/docs/fr/settings-reference#agent), et une chaîne vide quand la session s'exécute sans un.2574Pas chaque événement SubagentStop provient d'un sous-agent que Claude a créé. Claude Code exécute également des agents internes pour certaines de ses propres fonctionnalités, comme les [suggestions d'invite](/docs/fr/interactive-mode#prompt-suggestions) et les [questions latérales `/btw`](/docs/fr/interactive-mode#side-questions-with-%2Fbtw), et SubagentStop se déclenche quand l'un d'eux se termine aussi. Pour ces événements, `agent_type` est le nom de l'agent que la session elle-même exécute, comme celui défini avec [`--agent`](/docs/fr/cli-reference#cli-flags) ou le paramètre [`agent`](/docs/fr/settings-reference#agent), et une chaîne vide quand la session s'exécute sans un.
2570 2575
2571Un `matcher` qui nomme les types d'agent ne correspond pas à un `agent_type` vide. Un hook dont le matcher est omis, `""`, ou `"*"`, ou est une expression régulière qui correspond à une chaîne vide, s'exécute pour les événements avec un `agent_type` vide aussi.2576Un `matcher` qui nomme les types d'agent ne correspond pas à un `agent_type` vide. Un hook dont le matcher est omis, `""`, ou `"*"`, ou est une expression régulière qui correspond à une chaîne vide, s'exécute pour les événements avec un `agent_type` vide aussi.
2572 2577
2573Sur Claude Code v2.1.271 ou ultérieur, un sous-agent qui s'exécute avec l'outil [`SubagentHandback`](/docs/fr/tools-reference) livre son rapport via cet outil avant qu'il ne s'arrête. Le champ `last_assistant_message` contient alors le texte de fermeture du sous-agent, le cas échéant, qui n'est pas le rapport livré. Le rapport est l'entrée `message` de cet appel, qu'un hook `PreToolUse` ou `PostToolUse` correspondant à `SubagentHandback` reçoit comme `tool_input.message`.2578Sur Claude Code v2.1.271 ou ultérieur, un sous-agent qui s'exécute avec l'outil [`SubagentHandback`](/docs/fr/tools-reference) livre son rapport via cet outil avant qu'il ne s'arrête. Le champ `last_assistant_message` contient alors le texte de fermeture du sous-agent, le cas échéant, qui n'est pas le rapport livré. Le rapport est l'entrée `message` de cet appel, qu'un hook `PreToolUse` ou `PostToolUse` correspondant à `SubagentHandback` reçoit comme `tool_input.message`.
2574 2579
2575Les hooks SubagentStop reçoivent également les tableaux `background_tasks` et `session_crons` décrits sous [Entrée Stop](#stop-input). Les deux tableaux sont scoped à la session parent, pas au sous-agent.2580Les hooks SubagentStop reçoivent également les tableaux `background_tasks` et `session_crons` décrits sous [Entrée Stop](#stop-input). Les deux tableaux sont délimités à la session parent, pas au sous-agent.
2576 2581
2577```json theme={null}2582```json theme={null}
2578{2583{
2657 TaskCompleted2662 TaskCompleted
2658</h3>2663</h3>
2659 2664
2660S'exécute quand une tâche est en cours de marquage comme complétée. Cela se déclenche dans deux situations : quand n'importe quel agent mar explicitement une tâche comme complétée via l'outil TaskUpdate, ou quand un coéquipier d'[équipe agent](/docs/fr/agent-teams) termine son tour avec des tâches en cours. Utilisez ceci pour appliquer les critères de complétion comme passer les tests ou les vérifications lint avant qu'une tâche puisse se fermer.2665S'exécute quand une tâche est en cours de marquage comme complétée. Cela se déclenche dans deux situations : quand n'importe quel agent marque explicitement une tâche comme complétée via l'outil TaskUpdate, ou quand un coéquipier d'[équipe d'agents](/docs/fr/agent-teams) termine son tour avec des tâches en cours. Utilisez ceci pour appliquer les critères de complétion comme passer les tests ou les vérifications de lint avant qu'une tâche puisse se fermer.
2661 2666
2662Les hooks TaskCompleted ne supportent pas les matchers et se déclenchent à chaque occurrence.2667Les hooks TaskCompleted ne supportent pas les matchers et se déclenchent à chaque occurrence.
2663 2668
2722S'exécute quand l'agent Claude Code principal a fini de répondre. Ne s'exécute pas si l'arrêt s'est produit en raison d'une interruption utilisateur. Les erreurs API déclenchent plutôt [StopFailure](#stopfailure).2727S'exécute quand l'agent Claude Code principal a fini de répondre. Ne s'exécute pas si l'arrêt s'est produit en raison d'une interruption utilisateur. Les erreurs API déclenchent plutôt [StopFailure](#stopfailure).
2723 2728
2724<Tip>2729<Tip>
2725 La commande [`/goal`](/docs/fr/goal) est un raccourci intégré pour un hook Stop basé sur les invites scoped à la session. Utilisez-le quand vous voulez que Claude continue à travailler vers une condition sans écrire la configuration du hook.2730 La commande [`/goal`](/docs/fr/goal) est un raccourci intégré pour un hook Stop basé sur les invites délimité à la session. Utilisez-le quand vous voulez que Claude continue à travailler vers une condition sans écrire la configuration du hook.
2726</Tip>2731</Tip>
2727 2732
2728<h4 id="stop-input">2733<h4 id="stop-input">
2731 2736
2732En plus des [champs d'entrée communs](#common-input-fields), les hooks Stop reçoivent `stop_hook_active`, `last_assistant_message`, `background_tasks`, et `session_crons`. Le champ `stop_hook_active` est `true` quand Claude Code continue déjà en raison d'un hook stop. Vérifiez cette valeur ou traitez la transcription pour éviter de bloquer sur une condition qui ne se résoudra jamais. Claude Code applique un plafond de 8 continuations consécutives : après que les hooks stop aient continué le tour huit fois de suite, Claude Code remplace le bloc suivant et termine le tour. Pour augmenter le plafond, définissez [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/fr/env-vars).2737En plus des [champs d'entrée communs](#common-input-fields), les hooks Stop reçoivent `stop_hook_active`, `last_assistant_message`, `background_tasks`, et `session_crons`. Le champ `stop_hook_active` est `true` quand Claude Code continue déjà en raison d'un hook stop. Vérifiez cette valeur ou traitez la transcription pour éviter de bloquer sur une condition qui ne se résoudra jamais. Claude Code applique un plafond de 8 continuations consécutives : après que les hooks stop aient continué le tour huit fois de suite, Claude Code remplace le bloc suivant et termine le tour. Pour augmenter le plafond, définissez [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/fr/env-vars).
2733 2738
2734Le champ `last_assistant_message` contient le contenu textuel de la réponse finale de Claude, donc les hooks peuvent y accéder sans analyser le fichier de transcription. Pour les hooks qui agissent sur le tour qui vient de se terminer, comme les hooks de lecture à haute voix ou de notification, utilisez ce champ plutôt que de lire `transcript_path` : le fichier de transcription n'est pas garanti d'inclure le message final au moment de Stop sur toutes les versions.2739Le champ `last_assistant_message` contient le contenu textuel de la réponse finale de Claude, donc les hooks peuvent y accéder sans analyser le fichier de transcription. Pour les hooks qui agissent sur le tour qui vient de se terminer, comme les hooks de lecture à haute voix ou de notification, utilisez ce champ plutôt que de lire `transcript_path` : le fichier de transcription n'est pas garanti d'inclure le message final au moment du Stop sur toutes les versions.
2735 2740
2736Les tableaux `background_tasks` et `session_crons` permettent aux hooks de distinguer « la session est terminée » de « la session est mise en pause en attente que le travail en arrière-plan la réveille ». Les deux tableaux sont présents quand le registre de tâches est accessible et sont vides quand rien n'est en vol ou programmé.2741Les tableaux `background_tasks` et `session_crons` permettent aux hooks de distinguer « la session est terminée » de « la session est en pause en attente que le travail en arrière-plan la réveille ». Les deux tableaux sont présents quand le registre de tâches est accessible et sont vides quand rien n'est en vol ou programmé.
2737 2742
2738Chaque entrée dans `background_tasks` décrit une tâche en vol et utilise ces champs :2743Chaque entrée dans `background_tasks` décrit une tâche en vol et utilise ces champs :
2739 2744
2742| `id` | Identifiant de tâche |2747| `id` | Identifiant de tâche |
2743| `type` | Étiquette de type de tâche conviviale comme `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session`, ou `MCP task`. Chaque étiquette identifie quelle fonctionnalité Claude Code a créé la tâche. Revient au discriminant brut pour les types non reconnus |2748| `type` | Étiquette de type de tâche conviviale comme `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session`, ou `MCP task`. Chaque étiquette identifie quelle fonctionnalité Claude Code a créé la tâche. Revient au discriminant brut pour les types non reconnus |
2744| `status` | Statut de tâche actuel |2749| `status` | Statut de tâche actuel |
2745| `description` | Description en texte libre, plafonnée à 1 000 caractères avec un marqueur `… [+N chars]` en chaîne quand clippée |2750| `description` | Description en texte libre, plafonnée à 1000 caractères avec un marqueur `… [+N chars]` en chaîne quand coupée |
2746| `command` | Ligne de commande shell, plafonnée à 1 000 caractères. Présent uniquement pour les tâches `shell` |2751| `command` | Ligne de commande shell, plafonnée à 1000 caractères. Présente uniquement pour les tâches `shell` |
2747| `agent_type` | Nom de type de sous-agent. Présent uniquement pour les tâches `subagent` |2752| `agent_type` | Nom de type de sous-agent. Présent uniquement pour les tâches `subagent` |
2748| `server` | Nom du serveur MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |2753| `server` | Nom du serveur MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |
2749| `tool` | Nom de l'outil MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |2754| `tool` | Nom de l'outil MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |
2750| `name` | Nom du workflow. Présent uniquement pour les tâches `workflow` |2755| `name` | Nom du workflow. Présent uniquement pour les tâches `workflow` |
2751 2756
2752Chaque entrée dans `session_crons` décrit un réveil programmé scoped à la session, provenant de `CronCreate`, `ScheduleWakeup`, et `/loop` :2757Chaque entrée dans `session_crons` décrit un réveil programmé délimité à la session, provenant de `CronCreate`, `ScheduleWakeup`, et `/loop` :
2753 2758
2754| Champ | Description |2759| Champ | Description |
2755| :- | :- |2760| :- | :- |
2756| `id` | Identifiant de tâche cron |2761| `id` | Identifiant de tâche cron |
2757| `schedule` | Expression cron, par exemple `0 9 * * 1-5` |2762| `schedule` | Expression cron, par exemple `0 9 * * 1-5` |
2758| `recurring` | `false` pour les réveils ponctuels dont le calendrier encode un seul temps de déclenchement, `true` pour les tâches qui se redéclenchent à chaque correspondance |2763| `recurring` | `false` pour les réveils ponctuels dont l'horaire encode un seul moment de déclenchement, `true` pour les tâches qui se redéclenchent à chaque correspondance |
2759| `prompt` | Invite soumise quand le cron se déclenche, plafonnée à 1 000 caractères avec le même marqueur `… [+N chars]` |2764| `prompt` | Invite soumise quand le cron se déclenche, plafonnée à 1000 caractères avec le même marqueur `… [+N chars]` |
2760 2765
2761Cet exemple montre une entrée Stop avec une tâche shell en vol et un cron récurrent :2766Cet exemple montre une entrée Stop avec une tâche shell en vol et un cron récurrent :
2762 2767
2810}2815}
2811```2816```
2812 2817
2813Utilisez `additionalContext` quand le hook fonctionne comme prévu et donne des conseils à Claude, comme « exécutez la suite de tests avant de terminer ». Cela garde la conversation en cours via les mêmes protections de boucle que `decision: "block"`, à savoir l'entrée `stop_hook_active` et le plafond de 8 continuations consécutives, mais la transcription l'étiquette `Stop hook feedback` et aucune notification d'erreur de hook n'est montrée :2818Utilisez `additionalContext` quand le hook fonctionne comme prévu et donne des conseils à Claude, comme « exécutez la suite de tests avant de terminer ». Cela garde la conversation en cours à travers les mêmes protections de boucle que `decision: "block"`, à savoir l'entrée `stop_hook_active` et le plafond de 8 continuations consécutives, mais la transcription l'étiquette `Stop hook feedback` et aucune notification d'erreur de hook n'est montrée :
2814 2819
2815```json theme={null}2820```json theme={null}
2816{2821{
2825 StopFailure2830 StopFailure
2826</h3>2831</h3>
2827 2832
2828S'exécute à la place de [Stop](#stop) quand le tour se termine en raison d'une erreur API. Claude Code ignore la sortie et le code de sortie du hook, à part [`terminalSequence`](#emit-terminal-notifications). Utilisez ceci pour enregistrer les échecs, envoyer des alertes, ou prendre des actions de récupération quand Claude ne peut pas terminer une réponse en raison des limites de débit, des problèmes d'authentification, ou d'autres erreurs API.2833S'exécute à la place de [Stop](#stop) quand le tour se termine en raison d'une erreur API. Claude Code ignore la sortie du hook et le code de sortie, à part [`terminalSequence`](#emit-terminal-notifications). Utilisez ceci pour enregistrer les échecs, envoyer des alertes, ou prendre des actions de récupération quand Claude ne peut pas terminer une réponse en raison des limites de débit, des problèmes d'authentification, ou d'autres erreurs API.
2829 2834
2830<h4 id="stopfailure-input">2835<h4 id="stopfailure-input">
2831 Entrée StopFailure2836 Entrée StopFailure
2857 TeammateIdle2862 TeammateIdle
2858</h3>2863</h3>
2859 2864
2860S'exécute quand un coéquipier d'[équipe agent](/docs/fr/agent-teams) est sur le point de devenir inactif après avoir terminé son tour. Utilisez ceci pour appliquer les portes de qualité avant qu'un coéquipier arrête de travailler, comme exiger que les vérifications lint passent ou vérifier que les fichiers de sortie existent.2865S'exécute quand un coéquipier d'[équipe d'agents](/docs/fr/agent-teams) est sur le point de devenir inactif après avoir terminé son tour. Utilisez ceci pour appliquer les portes de qualité avant qu'un coéquipier arrête de travailler, comme exiger que les vérifications de lint passent ou vérifier que les fichiers de sortie existent.
2861 2866
2862Les hooks TeammateIdle ne supportent pas les matchers et se déclenchent à chaque occurrence.2867Les hooks TeammateIdle ne supportent pas les matchers et se déclenchent à chaque occurrence.
2863 2868
2979}2984}
2980```2985```
2981 2986
2982Les changements `policy_settings` ne peuvent pas être bloqués. Les hooks se déclenchent toujours pour les sources `policy_settings` quand un fichier de paramètres gérés sur la machine change, pour que vous puissiez enregistrer ces édits, mais toute décision de blocage est ignorée. Cela garantit que les paramètres gérés par l'entreprise prennent toujours effet. Claude Code n'exécute pas les hooks ConfigChange quand les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) arrivent ou se rafraîchissent.2987Les changements `policy_settings` ne peuvent pas être bloqués. Les hooks se déclenchent toujours pour les sources `policy_settings` quand un fichier de paramètres gérés sur la machine change, pour que vous puissiez enregistrer ces édits, mais toute décision de blocage est ignorée. Cela garantit que les paramètres gérés par l'entreprise prennent toujours effet. Claude Code n'exécute pas les hooks `ConfigChange` quand les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) arrivent ou se rafraîchissent.
2983 2988
2984Claude Code agit sur la décision de blocage de la sortie JSON d'un hook ConfigChange et rejette `systemMessage` et `continue`. Un changement bloqué ne surface aucun message pour vous ou Claude, que vous bloquez avec `reason` ou avec stderr en quittant 2. Claude Code écrit uniquement une ligne au journal de débogage.2989Claude Code agit sur la décision de blocage de la sortie JSON d'un hook ConfigChange et rejette `systemMessage` et `continue`. Un changement bloqué ne surface aucun message à vous ou à Claude, que vous bloquez avec `reason` ou avec stderr en quittant 2. Claude Code écrit uniquement une ligne au journal de débogage.
2985 2990
2986<h3 id="cwdchanged">2991<h3 id="cwdchanged">
2987 CwdChanged2992 CwdChanged
2989 2994
2990S'exécute quand une commande shell dans la conversation principale change le répertoire de travail, par exemple quand Claude exécute une commande `cd`. Utilisez ceci pour réagir aux changements de répertoire : recharger les variables d'environnement, activer les chaînes d'outils spécifiques au projet, ou exécuter les scripts de configuration automatiquement. S'apparie avec [FileChanged](#filechanged) pour les outils comme [direnv](https://direnv.net/) qui gèrent l'environnement par répertoire.2995S'exécute quand une commande shell dans la conversation principale change le répertoire de travail, par exemple quand Claude exécute une commande `cd`. Utilisez ceci pour réagir aux changements de répertoire : recharger les variables d'environnement, activer les chaînes d'outils spécifiques au projet, ou exécuter les scripts de configuration automatiquement. S'apparie avec [FileChanged](#filechanged) pour les outils comme [direnv](https://direnv.net/) qui gèrent l'environnement par répertoire.
2991 2996
2992Les hooks CwdChanged ont accès à [`CLAUDE_ENV_FILE`](#persist-environment-variables). Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes jusqu'au prochain événement [CwdChanged](#cwdchanged), quand Claude Code les efface.2997Les hooks CwdChanged ont accès à [`CLAUDE_ENV_FILE`](#persist-environment-variables). Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes jusqu'au prochain événement CwdChanged, quand Claude Code les efface.
2993 2998
2994CwdChanged ne supporte pas les matchers et se déclenche à chaque occurrence.2999CwdChanged ne supporte pas les matchers et se déclenche à chaque occurrence.
2995 3000
3018 3023
3019| Champ | Description |3024| Champ | Description |
3020| :- | :- |3025| :- | :- |
3021| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins de votre configuration `matcher` sont toujours surveillés. Retourner un tableau vide efface la liste dynamique, ce qui est typique quand vous entrez un nouveau répertoire |3026| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins de votre configuration `matcher` sont toujours surveillés. Retourner un tableau vide efface la liste dynamique, ce qui est typique quand vous entrez dans un nouveau répertoire |
3022 3027
3023Les hooks CwdChanged n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le changement de répertoire.3028Les hooks CwdChanged n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le changement de répertoire.
3024 3029
3028 DirectoryAdded3033 DirectoryAdded
3029</h3>3034</h3>
3030 3035
3031S'exécute après que vous ajoutiez un répertoire de travail en cours de session avec la commande `/add-dir`, ou après qu'un client SDK en ajoute un avec la demande de contrôle `register_repo_root`. Utilisez ceci pour préparer un référentiel nouvellement ajouté, par exemple en installant ses dépendances.3036S'exécute après que vous ajoutiez un répertoire de travail en cours de session avec la commande `/add-dir`, ou après qu'un client SDK en ajoute un avec la requête de contrôle `register_repo_root`. Utilisez ceci pour préparer un référentiel nouvellement ajouté, par exemple en installant ses dépendances.
3032 3037
3033Claude Code ne déclenche pas cet événement quand :3038Claude Code ne déclenche pas cet événement quand :
3034 3039
3036* Vous ajoutez un répertoire sur l'onglet Workspace `/permissions`3041* Vous ajoutez un répertoire sur l'onglet Workspace `/permissions`
3037* Vous ajoutez un répertoire qui est déjà un répertoire de travail ou à l'intérieur d'un3042* Vous ajoutez un répertoire qui est déjà un répertoire de travail ou à l'intérieur d'un
3038 3043
3039Claude Code se déclenche après avoir rafraîchi l'état du sandbox et de la permission, donc les outils en sandbox voient déjà le nouveau répertoire quand votre hook s'exécute. Les commandes du hook elles-mêmes s'exécutent sans sandbox.3044Claude Code se déclenche DirectoryAdded après avoir rafraîchi l'état du sandbox et de la permission, donc les outils en sandbox voient déjà le nouveau répertoire quand votre hook s'exécute. Les commandes du hook elles-mêmes s'exécutent sans sandbox.
3040 3045
3041Claude Code n'attend pas le hook : l'ajout se termine immédiatement, et le hook s'exécute en arrière-plan avec le délai d'expiration par défaut de 600 secondes.3046Claude Code n'attend pas le hook : l'ajout se termine immédiatement, et le hook s'exécute en arrière-plan avec le délai d'expiration par défaut de 600 secondes.
3042 3047
3045| Matcher | Quand il se déclenche |3050| Matcher | Quand il se déclenche |
3046| :- | :- |3051| :- | :- |
3047| `slash_command` | Vous ajoutez un répertoire avec `/add-dir` |3052| `slash_command` | Vous ajoutez un répertoire avec `/add-dir` |
3048| `register_repo_root` | Un client SDK ajoute un répertoire avec la demande de contrôle `register_repo_root` |3053| `register_repo_root` | Un client SDK ajoute un répertoire avec la requête de contrôle `register_repo_root` |
3049 3054
3050<h4 id="directoryadded-input">3055<h4 id="directoryadded-input">
3051 Entrée DirectoryAdded3056 Entrée DirectoryAdded
3056| Champ | Description |3061| Champ | Description |
3057| :- | :- |3062| :- | :- |
3058| `directory` | Chemin absolu du répertoire qui a été ajouté |3063| `directory` | Chemin absolu du répertoire qui a été ajouté |
3059| `source` | Comment le répertoire a été ajouté, `"slash_command"` pour `/add-dir` ou `"register_repo_root"` pour la demande de contrôle SDK |3064| `source` | Comment le répertoire a été ajouté, `"slash_command"` pour `/add-dir` ou `"register_repo_root"` pour la requête de contrôle SDK |
3060 3065
3061```json theme={null}3066```json theme={null}
3062{3067{
3085* **Construire la liste de surveillance** : la valeur est divisée sur `|` et chaque segment est enregistré comme un nom de fichier littéral dans le répertoire de travail, donc `".envrc|.env"` surveille exactement ces deux fichiers. Les modèles regex ne sont pas utiles ici : une valeur comme `^\.env` surveillerait un fichier littéralement nommé `^\.env`.3090* **Construire la liste de surveillance** : la valeur est divisée sur `|` et chaque segment est enregistré comme un nom de fichier littéral dans le répertoire de travail, donc `".envrc|.env"` surveille exactement ces deux fichiers. Les modèles regex ne sont pas utiles ici : une valeur comme `^\.env` surveillerait un fichier littéralement nommé `^\.env`.
3086* **Filtrer quels hooks s'exécutent** : quand un fichier surveillé change, la même valeur filtre quels groupes de hook s'exécutent en utilisant les [règles de matcher](#matcher-patterns) standard contre le nom de base du fichier modifié.3091* **Filtrer quels hooks s'exécutent** : quand un fichier surveillé change, la même valeur filtre quels groupes de hook s'exécutent en utilisant les [règles de matcher](#matcher-patterns) standard contre le nom de base du fichier modifié.
3087 3092
3088Cet exemple normalise les fins de ligne dans `data.csv` après n'importe quel changement, y compris une commande `Bash` ou un script externe réécrivant le fichier :3093Cet exemple normalise les fins de ligne dans `data.csv` après n'importe quel changement, y compris un appel d'outil `Bash` ou un script externe réécrivant le fichier :
3089 3094
3090```json theme={null}3095```json theme={null}
3091{3096{
3105}3110}
3106```3111```
3107 3112
3108Le hook lit le chemin absolu du fichier modifié depuis le champ `file_path` de l'[entrée JSON](#filechanged-input) sur stdin. Sa garde `grep` teste pour la même chose que `perl` supprime, un CR à la fin d'une ligne, donc l'exécution après une normalisation quitte sans toucher le fichier. Une garde plus lâche boucle pour toujours, parce que `perl -i` réécrit le fichier même quand il ne substitue rien et Claude Code exécute le hook à nouveau après chaque réécriture. Enregistrez ce script à `/path/to/normalize-line-endings.sh` et rendez-le exécutable :3113Le hook lit le chemin absolu du fichier modifié du champ `file_path` de l'[entrée JSON](#filechanged-input) sur stdin. Sa garde `grep` teste la même chose que `perl` supprime, un CR à la fin d'une ligne, donc l'exécution après une normalisation quitte sans toucher le fichier. Une garde plus lâche boucle pour toujours, parce que `perl -i` réécrit le fichier même quand il ne substitue rien et Claude Code exécute le hook à nouveau après chaque réécriture. Enregistrez ce script à `/path/to/normalize-line-endings.sh` et rendez-le exécutable :
3109 3114
3110```bash theme={null}3115```bash theme={null}
3111#!/bin/bash3116#!/bin/bash
3117 3122
3118Pour confirmer que le hook fonctionne, demandez à Claude d'ajouter une ligne CRLF à `data.csv` avec une commande `Bash`. Claude Code exécute le hook et le fichier se termine avec les fins de ligne LF.3123Pour confirmer que le hook fonctionne, demandez à Claude d'ajouter une ligne CRLF à `data.csv` avec une commande `Bash`. Claude Code exécute le hook et le fichier se termine avec les fins de ligne LF.
3119 3124
3120Pour surveiller les fichiers que vous ne pouvez pas nommer à l'avance, retournez [`watchPaths`](#filechanged-output) d'un hook pour mettre à jour la liste de surveillance dynamiquement. Claude Code démarre l'observateur uniquement quand quelque chose nomme un fichier à surveiller, donc semez la liste avec un groupe FileChanged dont le matcher nomme au moins un fichier, ou avec un hook [SessionStart](#sessionstart-decision-control) ou [CwdChanged](#cwdchanged) qui retourne `watchPaths`. Le matcher filtre toujours quels groupes de hook s'exécutent quand un fichier surveillé change, donc donnez au groupe qui gère les chemins dynamiques un matcher omis, qui correspond à chaque fichier surveillé et n'ajoute rien à la liste de surveillance. Un matcher `"*"` correspond également à chaque fichier, mais Claude Code l'enregistre dans la liste de surveillance comme n'importe quelle autre valeur, comme un fichier littéralement nommé `*`.3125Pour surveiller les fichiers que vous ne pouvez pas nommer à l'avance, retournez [`watchPaths`](#filechanged-output) d'un hook pour mettre à jour la liste de surveillance dynamiquement. Claude Code démarre l'observateur uniquement quand quelque chose nomme un fichier à surveiller, donc semez la liste avec un groupe FileChanged dont le matcher nomme au moins un fichier, ou avec un hook [SessionStart](#sessionstart-decision-control) ou [CwdChanged](#cwdchanged) qui retourne `watchPaths`. Le matcher filtre toujours quels groupes de hook s'exécutent quand un fichier surveillé change, donc donnez au groupe qui gère les chemins dynamiques un matcher omis, qui correspond à chaque fichier surveillé et n'ajoute rien à la liste de surveillance. Un matcher `"*"` correspond également à chaque fichier, mais Claude Code l'enregistre dans la liste de surveillance comme un fichier littéral nommé `*`.
3121 3126
3122Les hooks FileChanged ont accès à [`CLAUDE_ENV_FILE`](#persist-environment-variables). Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes jusqu'au prochain événement [CwdChanged](#cwdchanged), quand Claude Code les efface.3127Les hooks FileChanged ont accès à [`CLAUDE_ENV_FILE`](#persist-environment-variables). Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes jusqu'au prochain événement [CwdChanged](#cwdchanged), quand Claude Code les efface.
3123 3128
3229 3234
3230* vous quittez une session `--worktree` et choisissez de la supprimer3235* vous quittez une session `--worktree` et choisissez de la supprimer
3231* un sous-agent avec `isolation: "worktree"` se termine3236* un sous-agent avec `isolation: "worktree"` se termine
3232* vous supprimez une [session en arrière-plan](/docs/fr/agent-view#what-deleting-a-session-removes) dont le worktree a été créé par le hook3237* vous supprimez une [session en arrière-plan](/docs/fr/agent-view#what-deleting-a-session-removes) dont le worktree le hook a créé
3233 3238
3234Pour les worktrees basés sur git, Claude Code gère le nettoyage automatiquement avec `git worktree remove`. Si vous avez configuré un hook WorktreeCreate, associez-le à un hook WorktreeRemove pour contrôler le nettoyage des worktrees qu'il crée :3239Pour les worktrees basés sur git, Claude Code gère le nettoyage automatiquement avec `git worktree remove`. Si vous avez configuré un hook WorktreeCreate, associez-le à un hook WorktreeRemove pour contrôler le nettoyage des worktrees qu'il crée :
3235 3240
3298 3303
3299Quittez avec le code 2 pour bloquer la compaction. Pour un `/compact` manuel, le message stderr est montré à l'utilisateur. Vous pouvez également bloquer en retournant JSON avec `"decision": "block"`.3304Quittez avec le code 2 pour bloquer la compaction. Pour un `/compact` manuel, le message stderr est montré à l'utilisateur. Vous pouvez également bloquer en retournant JSON avec `"decision": "block"`.
3300 3305
3301Bloquer la compaction automatique a des effets différents selon quand elle se déclenche. Si la compaction a été déclenchée de manière proactive avant la limite de contexte, Claude Code la saute et la conversation continue sans compaction. Si la compaction a été déclenchée pour récupérer d'une erreur de limite de contexte déjà retourné par l'API, l'erreur sous-jacente surface et la demande actuelle échoue.3306Bloquer la compaction automatique a des effets différents selon quand elle se déclenche. Si la compaction a été déclenchée de manière proactive avant la limite de contexte, Claude Code la saute et la conversation continue sans compaction. Si la compaction a été déclenchée pour récupérer d'une erreur de limite de contexte déjà retourné par l'API, l'erreur sous-jacente surface et la requête actuelle échoue.
3302 3307
3303Claude Code rejette les champs `systemMessage` et `continue` d'un hook PreCompact.3308Claude Code rejette les champs `systemMessage` et `continue` d'un hook PreCompact.
3304 3309
3349}3354}
3350```3355```
3351 3356
3352Les hooks PostCompact n'ont pas de contrôle de décision. Ils ne peuvent pas affecter le résultat de compaction mais peuvent effectuer les tâches de suivi.3357Les hooks PostCompact n'ont pas de contrôle de décision. Ils ne peuvent pas affecter le résultat de la compaction mais peuvent effectuer les tâches de suivi.
3353 3358
3354<h3 id="premodelswitch">3359<h3 id="premodelswitch">
3355 PreModelSwitch3360 PreModelSwitch
3356</h3>3361</h3>
3357 3362
3358S'exécute avant que Claude Code applique un changement de modèle que vous ou un client avez demandé. Utilisez-le pour bloquer un changement, exiger une confirmation, ou montrer quel coût le changement aura avant qu'il se produise.3363S'exécute avant que Claude Code applique un changement de modèle que vous ou un client avez demandé. Utilisez-le pour bloquer un changement, exiger une confirmation, ou montrer quel changement coûtera avant qu'il se produise.
3359 3364
3360PreModelSwitch nécessite Claude Code v2.1.251 ou ultérieur. Claude Code l'exécute pour ces demandes :3365PreModelSwitch nécessite Claude Code v2.1.251 ou ultérieur. Claude Code l'exécute pour ces requêtes :
3361 3366
3362* `/model <name>` et le sélecteur `/model`3367* `/model <name>` et le sélecteur `/model`
3363* Le sélecteur de modèle `Option+P` ou `Alt+P`3368* Le sélecteur de modèle `Option+P` ou `Alt+P`
3364* Le paramètre Model dans `/config`3369* Le paramètre Model dans `/config`
3365* Activer le [mode rapide](/docs/fr/fast-mode) quand cela change le modèle de la session3370* Activer le [mode rapide](/docs/fr/fast-mode) quand cela change le modèle de la session
3366* Une demande `set_model`, ou un changement de modèle dans une demande `apply_flag_settings`, d'un hôte [Agent SDK](/docs/fr/agent-sdk/typescript#query-object) ou [Remote Control](/docs/fr/remote-control)3371* Une requête `set_model`, ou un changement de modèle dans une requête `apply_flag_settings`, d'un hôte [Agent SDK](/docs/fr/agent-sdk/typescript#query-object) ou [Remote Control](/docs/fr/remote-control)
3367 3372
3368Claude Code n'exécute pas les hooks PreModelSwitch pour les changements qu'il fait seul, comme un [fallback de modèle automatique](/docs/fr/model-config#automatic-model-fallback) ou la restauration du modèle quand vous reprenez une session. Ces changements atteignent [PostModelSwitch](#postmodelswitch) uniquement.3373Claude Code n'exécute pas les hooks PreModelSwitch pour les changements qu'il fait seul, comme un [fallback de modèle automatique](/docs/fr/model-config#automatic-model-fallback) ou la restauration du modèle quand vous reprenez une session. Ces changements atteignent [PostModelSwitch](#postmodelswitch) uniquement.
3369 3374
3370Claude Code compare le matcher contre le nom canonique du modèle vers lequel la session bascule, en ignorant tout suffixe `[1m]`. Un alias comme `opus`, un ID de modèle daté, et un ID spécifique au fournisseur comme un ID de modèle Amazon Bedrock correspondent tous au nom canonique unique auquel ils se résolvent, donc `claude-opus-5` couvre chaque orthographe d'Opus 5.3375Claude Code compare le matcher contre le nom canonique du modèle vers lequel la session change, en ignorant tout suffixe `[1m]`. Un alias comme `opus`, un ID de modèle daté, et un ID spécifique au fournisseur comme un ID de modèle Amazon Bedrock correspondent tous au nom canonique unique auquel ils se résolvent, donc `claude-opus-5` couvre chaque orthographe d'Opus 5.
3371 3376
3372Quand Claude Code ne peut pas déterminer un nom canonique pour la cible, par exemple un ID de modèle personnalisé que seule votre [passerelle LLM](/docs/fr/llm-gateway) connaît, il exécute chaque hook PreModelSwitch indépendamment du matcher. Un hook qui bloque devrait donc vérifier `to_model` de son entrée plutôt que de compter uniquement sur le matcher.3377Quand Claude Code ne peut pas déterminer un nom canonique pour la cible, par exemple un ID de modèle personnalisé que seule votre [passerelle LLM](/docs/fr/llm-gateway) connaît, il exécute chaque hook PreModelSwitch indépendamment du matcher. Un hook qui bloque devrait donc vérifier `to_model` de son entrée plutôt que de compter uniquement sur le matcher.
3373 3378
3443 Entrée PreModelSwitch3448 Entrée PreModelSwitch
3444</h4>3449</h4>
3445 3450
3446En plus des [champs d'entrée communs](#common-input-fields), les hooks PreModelSwitch reçoivent les champs de ce tableau. Les cinq derniers décrivent quel coût a la renvoi de la conversation au nouveau modèle, donc un hook peut montrer ce chiffre avant que le changement se produise.3451En plus des [champs d'entrée communs](#common-input-fields), les hooks PreModelSwitch reçoivent les champs du tableau ci-dessous. Les cinq derniers décrivent quel changement de modèle coûte de renvoyer la conversation au nouveau modèle, donc un hook peut montrer ce chiffre avant que le changement se produise.
3447 3452
3448| Champ | Type | Description |3453| Champ | Type | Description |
3449| :- | :- | :- |3454| :- | :- | :- |
3450| `from_model` | string | ID de modèle que le changement change de |3455| `from_model` | string | ID de modèle du changement |
3451| `to_model` | string | ID de modèle que le changement change vers. Le matcher compare contre le nom canonique de ce modèle |3456| `to_model` | string | ID de modèle du changement vers. Le matcher compare contre le nom canonique de ce modèle |
3452| `requested_model` | string ou `null` | Le modèle que la demande a nommé : un alias comme `opus`, un ID de modèle complet, ou `null` quand la demande était pour le modèle par défaut |3457| `requested_model` | string ou `null` | Le modèle que la requête a nommé : un alias comme `opus`, un ID de modèle complet, ou `null` quand la requête était pour le modèle par défaut |
3453| `source` | string | D'où provient la demande : `"command"` pour `/model <name>`, le paramètre Model dans `/config`, ou l'activation du mode rapide ; `"picker"` pour un sélecteur de modèle ; `"sdk"` pour une demande `set_model`, ou un changement de modèle dans une demande `apply_flag_settings`, d'un hôte Agent SDK ou Remote Control |3458| `source` | string | D'où provient la requête : `"command"` pour `/model <name>`, le paramètre Model dans `/config`, ou l'activation du mode rapide ; `"picker"` pour un sélecteur de modèle ; `"sdk"` pour une requête `set_model`, ou un changement de modèle dans une requête `apply_flag_settings`, d'un hôte Agent SDK ou Remote Control |
3454| `context_tokens` | number | Tokens que la demande suivante renvoie comme son invite : les tokens d'entrée, de lecture de cache, de création de cache, et de sortie de la dernière réponse dans la conversation principale, combinés. `0` avant la première réponse |3459| `context_tokens` | number | Tokens que la requête suivante renvoie comme son invite : les tokens d'entrée, de lecture de cache, de création de cache, et de sortie de la dernière réponse dans la conversation principale, combinés. `0` avant la première réponse |
3455| `prompt_cache_warm` | boolean | Si le cache d'invite du modèle actuel est probablement toujours chaud, ce qui signifie que le changement le perd |3460| `prompt_cache_warm` | boolean | Si le cache d'invite du modèle actuel est probablement toujours chaud, ce qui signifie que le changement le perd |
3456| `cache_ttl` | string | [Durée de vie du cache d'invite](/docs/fr/prompt-caching#cache-lifetime) que Claude Code demande pour cette session : `"5m"` ou `"1h"` |3461| `cache_ttl` | string | [Durée de vie du cache d'invite](/docs/fr/prompt-caching#cache-lifetime) que Claude Code demande pour cette session : `"5m"` ou `"1h"` |
3457| `estimated_cache_write_usd` | number | Coût estimé en dollars US de l'écriture de `context_tokens` dans le cache d'invite sur `to_model` au taux `cache_ttl`, excluant la réponse suivante. Le serveur n'a peut-être pas besoin de re-cacher le contexte entier, donc traitez-le comme une estimation |3462| `estimated_cache_write_usd` | number | Coût estimé en dollars US de l'écriture de `context_tokens` dans le cache d'invite sur `to_model` au taux `cache_ttl`, excluant la réponse suivante. Le serveur n'a peut-être pas besoin de re-cacher le contexte entier, donc traitez-le comme une estimation |
3487 3492
3488| Champ | Description |3493| Champ | Description |
3489| :- | :- |3494| :- | :- |
3490| `permissionDecision` | `"allow"` procède et ignore la [confirmation que Claude Code montre pendant que le cache d'invite est chaud](/docs/fr/prompt-caching#switching-models). `"deny"` annule le changement. `"ask"` invite l'utilisateur à le confirmer |3495| `permissionDecision` | `"allow"` procède et ignore la [confirmation que Claude Code montre pendant que le cache d'invite est chaud](/docs/fr/prompt-caching#switching-models). `"deny"` annule le changement. `"ask"` demande à l'utilisateur de le confirmer |
3491| `permissionDecisionReason` | Pour `"deny"`, montré à l'utilisateur comme la raison du blocage du changement, ou retourné comme l'erreur pour une demande `set_model`. Pour `"ask"`, montré dans l'invite de confirmation. Ignoré pour `"allow"` |3496| `permissionDecisionReason` | Pour `"deny"`, montré à l'utilisateur comme la raison du blocage du changement, ou retourné comme l'erreur pour une requête `set_model`. Pour `"ask"`, montré dans l'invite de confirmation. Ignoré pour `"allow"` |
3492 3497
3493Seul `/model` dans une session interactive peut montrer l'invite `"ask"`. Sur chaque autre surface, y compris le mode non-interactif avec le drapeau `-p`, `/config`, et les demandes `set_model`, Claude Code traite `"ask"` comme un refus.3498Seul `/model` dans une session interactive peut montrer l'invite `"ask"`. Sur chaque autre surface, y compris le mode non-interactif avec le drapeau `-p`, `/config`, et les requêtes `set_model`, Claude Code traite `"ask"` comme un refus.
3494 3499
3495Cet exemple demande à l'utilisateur de confirmer et cite le nombre de tokens de `context_tokens` :3500Cet exemple demande à l'utilisateur de confirmer et cite le nombre de tokens de `context_tokens` :
3496 3501
3506 3511
3507Quand plusieurs hooks PreModelSwitch retournent des décisions différentes, la priorité est `deny` > `ask` > `allow`.3512Quand plusieurs hooks PreModelSwitch retournent des décisions différentes, la priorité est `deny` > `ask` > `allow`.
3508 3513
3509Claude Code montre à l'utilisateur n'importe quel `systemMessage` que votre hook retourne indépendamment de la décision, donc un hook de rapport de coût peut retourner `{"systemMessage": "..."}` et quitter 0.3514Claude Code montre à l'utilisateur n'importe quel `systemMessage` que votre hook retourne indépendamment de la décision, donc un hook de rapport de coûts peut retourner `{"systemMessage": "..."}` et quitter 0.
3510 3515
3511Un hook PreModelSwitch qui ne répond pas avant son délai d'expiration bloque le changement. Sur [PreToolUse](#timeouts), par contraste, un hook de commande qui expire laisse l'appel d'outil continuer. Le délai d'expiration par défaut pour cet événement est 30 secondes. `PreModelSwitch` exécute uniquement les hooks `command`, `http`, et `mcp_tool`, donc les défauts `prompt` et `agent` ne s'appliquent pas.3516Un hook PreModelSwitch qui ne répond pas avant son délai d'expiration bloque le changement. Sur [PreToolUse](#timeouts), par contraste, un hook de commande qui expire laisse l'appel d'outil continuer. Le délai d'expiration par défaut pour cet événement est 30 secondes. `PreModelSwitch` exécute uniquement les hooks `command`, `http`, et `mcp_tool`, donc les défauts `prompt` et `agent` ne s'appliquent pas.
3512 3517
3527 3532
3528Claude Code n'exécute pas les hooks PostModelSwitch quand un modèle d'une [chaîne de modèles de fallback](/docs/fr/model-config#fallback-model-chains) sert un tour, parce que cette substitution dure un tour et laisse le modèle de la session inchangé.3533Claude Code n'exécute pas les hooks PostModelSwitch quand un modèle d'une [chaîne de modèles de fallback](/docs/fr/model-config#fallback-model-chains) sert un tour, parce que cette substitution dure un tour et laisse le modèle de la session inchangé.
3529 3534
3530Le matcher suit les mêmes règles que [PreModelSwitch](#premodelswitch) : Claude Code le compare contre le nom canonique du modèle vers lequel la session a basculé.3535Le matcher suit les mêmes règles que [PreModelSwitch](#premodelswitch) : Claude Code le compare contre le nom canonique du modèle vers lequel la session a changé.
3531 3536
3532Cet exemple ajoute des conseils chaque fois que le modèle de la session change vers n'importe quel modèle Opus :3537Cet exemple ajoute des conseils chaque fois que le modèle de la session change vers n'importe quel modèle Opus :
3533 3538
3549}3554}
3550```3555```
3551 3556
3552Pour confirmer que le hook fonctionne, basculez vers un modèle Opus à partir d'une session exécutant un modèle différent, par exemple exécutez `/model opus` à partir d'une session Sonnet, puis demandez à Claude quels conseils il a sur le modèle actuel.3557Pour confirmer que le hook fonctionne, changez vers un modèle Opus à partir d'une session exécutant un modèle différent, par exemple exécutez `/model opus` à partir d'une session Sonnet, puis demandez à Claude quels conseils il a sur le modèle actuel.
3553 3558
3554<h4 id="postmodelswitch-input">3559<h4 id="postmodelswitch-input">
3555 Entrée PostModelSwitch3560 Entrée PostModelSwitch
3563 Contrôle de décision PostModelSwitch3568 Contrôle de décision PostModelSwitch
3564</h4>3569</h4>
3565 3570
3566Claude Code prend votre stdout brut du hook sur la sortie 0, ou `additionalContext` de la sortie JSON, et le livre à Claude avec la demande suivante après le changement. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez retourner :3571Claude Code prend votre [sortie standard brute](#exit-code-0) du hook sur la sortie 0, ou `additionalContext` de la sortie JSON, et la livre à Claude avec la requête suivante après le changement. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez retourner :
3567 3572
3568| Champ | Description |3573| Champ | Description |
3569| :- | :- |3574| :- | :- |
3570| `additionalContext` | Chaîne ajoutée au contexte de Claude avec la demande suivante. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |3575| `additionalContext` | Chaîne ajoutée au contexte de Claude avec la requête suivante. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
3571 3576
3572Si le hook n'a pas terminé dans les cinq secondes après que vous envoyiez la demande suivante, Claude Code envoie cette demande sans la sortie et l'attache à la demande suivante à la place. Si le modèle change plusieurs fois avant la demande suivante, Claude Code livre uniquement la sortie pour le changement vers le modèle cible final.3577Si le hook n'a pas terminé dans les cinq secondes après que vous envoyiez la requête suivante, Claude Code envoie cette requête sans la sortie et l'attache à la requête suivante à la place. Si le modèle change plusieurs fois avant la requête suivante, Claude Code livre uniquement la sortie pour le modèle cible du dernier changement.
3573 3578
3574<h3 id="sessionend">3579<h3 id="sessionend">
3575 SessionEnd3580 SessionEnd
3582| Raison | Description |3587| Raison | Description |
3583| :- | :- |3588| :- | :- |
3584| `clear` | Session effacée avec la commande `/clear` |3589| `clear` | Session effacée avec la commande `/clear` |
3585| `resume` | Session basculée via `/resume` interactif |3590| `resume` | Session changée via `/resume` interactif |
3586| `logout` | L'utilisateur s'est déconnecté |3591| `logout` | L'utilisateur s'est déconnecté |
3587| `prompt_input_exit` | L'utilisateur a quitté pendant que l'entrée d'invite était visible |3592| `prompt_input_exit` | L'utilisateur a quitté pendant que l'entrée d'invite était visible |
3588| `other` | Autres raisons de sortie |3593| `other` | Autres raisons de sortie |
3606 3611
3607Les hooks SessionEnd n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer la terminaison de la session mais peuvent effectuer les tâches de nettoyage. Claude Code rejette leurs [champs de sortie JSON](#json-output), comme `systemMessage`.3612Les hooks SessionEnd n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer la terminaison de la session mais peuvent effectuer les tâches de nettoyage. Claude Code rejette leurs [champs de sortie JSON](#json-output), comme `systemMessage`.
3608 3613
3609Les hooks SessionEnd ont un délai d'expiration par défaut de 1,5 secondes. Il s'applique quand vous quittez, exécutez `/clear`, ou basculez les sessions avec `/resume` interactif. Vous pouvez donner à un hook plus de temps de deux façons :3614Les hooks SessionEnd ont un délai d'expiration par défaut de 1,5 secondes. Il s'applique quand vous quittez, exécutez `/clear`, ou changez de sessions avec `/resume` interactif. Vous pouvez donner à un hook plus de temps de deux façons :
3610 3615
3611* **`timeout` par hook** : définissez `timeout` dans la configuration de ce hook. Le budget global augmente automatiquement pour correspondre au `timeout` par hook le plus élevé dans vos fichiers de paramètres, jusqu'à 60 secondes. Si vous augmentez le budget de cette façon, un hook sans son propre `timeout` garde toujours le défaut. Les délais d'expiration définis sur les hooks fournis par plugin ne lèvent pas le budget.3616* **`timeout` par hook** : définissez `timeout` dans la configuration de ce hook. Le budget global augmente automatiquement pour correspondre au `timeout` par hook le plus élevé dans vos fichiers de paramètres, jusqu'à 60 secondes. Si vous augmentez le budget de cette façon, un hook sans son propre `timeout` garde toujours le défaut. Les délais d'expiration définis sur les hooks fournis par plugin ne lèvent pas le budget.
3612* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`** : définissez cette variable d'environnement en millisecondes pour remplacer le budget explicitement. La valeur que vous définissez devient également le délai d'expiration pour chaque hook sans son propre `timeout`.3617* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`** : définissez cette variable d'environnement en millisecondes pour remplacer le budget explicitement. La valeur que vous définissez devient également le délai d'expiration pour chaque hook sans son propre `timeout`.
3623 Elicitation3628 Elicitation
3624</h3>3629</h3>
3625 3630
3626S'exécute quand un serveur MCP demande l'entrée utilisateur en cours de tâche. Par défaut, Claude Code montre un dialogue interactif pour que l'utilisateur réponde. Les hooks peuvent intercepter cette demande et répondre par programmation, ignorant entièrement le dialogue.3631S'exécute quand un serveur MCP demande l'entrée de l'utilisateur en cours de tâche. Par défaut, Claude Code montre un dialogue interactif pour que l'utilisateur réponde. Les hooks peuvent intercepter cette requête et répondre par programmation, ignorant entièrement le dialogue.
3627 3632
3628Le champ matcher correspond au nom du serveur MCP.3633Le champ matcher correspond au nom du serveur MCP.
3629 3634
3688 3693
3689| Champ | Valeurs | Description |3694| Champ | Valeurs | Description |
3690| :- | :- | :- |3695| :- | :- | :- |
3691| `action` | `accept`, `decline`, `cancel` | Si vous acceptez, refusez, ou annulez la demande |3696| `action` | `accept`, `decline`, `cancel` | Si vous acceptez, refusez, ou annulez la requête |
3692| `content` | object | Valeurs des champs de formulaire à soumettre. Utilisé uniquement quand `action` est `accept` |3697| `content` | object | Valeurs des champs de formulaire à soumettre. Utilisé uniquement quand `action` est `accept` |
3693 3698
3694Le code de sortie 2 refuse l'élicitation. Claude Code ne montre votre message stderr nulle part.3699Le code de sortie 2 refuse l'élicitation. Claude Code ne montre votre message stderr nulle part.