approval: dangerous_header: "⚠️ COMMANDE DANGEREUSE : {description}" choose_long: " [o]ne fois | [s]ession | [t]oujours | [r]efuser" choose_short: " [o]ne fois | [s]ession | [r]efuser" prompt_long: " Choix [o/s/t/R] : " prompt_short: " Choix [o/s/R] : " choose_smart_deny: " [o]ne fois | [r]efuser" prompt_smart_deny: " Choix [o/R] : " smart_deny_once_inputs: "o,once,fois" smart_deny_deny_inputs: "d,deny,r,refuser" timeout: " ⏱ Aucune réponse en {waited} — la commande n'a pas été exécutée. Redemandez pour réessayer, ou augmentez la limite : hermes config set approvals.timeout {suggested}" allowed_once: " ✓ Autorisé une fois" allowed_session: " ✓ Autorisé pour cette session" allowed_always: " ✓ Ajouté à la liste d'autorisation permanente" denied: " ✗ Refusé" cancelled: " ✗ Annulé" blocklist_message: "Cette commande est sur la liste de blocage inconditionnel et ne peut pas être approuvée." inputs: approve: "approve,yes,ok,okay,confirm,y,approuver,oui,confirmer,o" deny: "deny,no,reject,cancel,n,refuser,non,rejeter,annuler" always: "always,approve always,always approve,toujours,approuver toujours,toujours approuver" session: "session,approve session,session approve,approuver session,session approuver" confirm_once: "approve,approve once,once,yes,ok,confirm,approuver,approuver une fois,une fois,oui,confirmer" confirm_always: "always,always approve,remember,toujours,toujours approuver,retenir,mémoriser" confirm_cancel: "cancel,nevermind,no,deny,annuler,laisser tomber,non,refuser" summary: denied: "Vous avez refusé cette {noun} — elle n'a pas été exécutée." timeout: "Aucune réponse dans un délai de {window} — la {noun} n'a pas été exécutée." notify_failed: "La demande d'approbation n'a pas pu être transmise — la {noun} n'a pas été exécutée." cancelled: "La demande d'approbation a été retirée ou ne vous est jamais parvenue — la {noun} n'a pas été exécutée." blocked: "Cette {noun} n'est pas autorisée dans une session sans supervision — elle n'a pas été exécutée." default: "Cette {noun} n'a pas été exécutée." noun: command: "commande" code: "portion de code" action: "action" window: hour_one: "{count} heure" hour_other: "{count} heures" minute_one: "{count} minute" minute_other: "{count} minutes" second_one: "{count} seconde" second_other: "{count} secondes" gateway: approval_expired: "⚠️ Approbation expirée (l'agent n'attend plus). Demandez à l'agent de réessayer." draining: "⏳ Vidage de {count} agent(s) actif(s) avant redémarrage..." goal_cleared: "✓ Objectif effacé." no_active_goal: "Aucun objectif actif." config_read_failed: "⚠️ Impossible de lire config.yaml : {error}" config_save_failed: "⚠️ Impossible de sauvegarder la configuration : {error}" model: error_prefix: "Erreur : {error}" switched: "Modèle changé pour `{model}`" provider_label: "Fournisseur : {provider}" context_label: "Contexte : {tokens} tokens" max_output_label: "Sortie max. : {tokens} tokens" cost_label: "Coût : {cost}" capabilities_label: "Capacités : {capabilities}" prompt_caching_enabled: "Cache de prompts : activé" warning_prefix: "Avertissement : {warning}" saved_global: "Enregistré dans config.yaml (`--global`)" session_only_hint: "_(session uniquement — ajoutez `--global` pour conserver)_" current_label: "Actuel : `{model}` chez {provider}" current_tag: " (actuel)" more_models_suffix: " (+{count} autres)" usage_switch_model: "`/model ` — changer de modèle" usage_switch_provider: "`/model --provider ` — changer de fournisseur" usage_persist: "`/model --global` — conserver" err_skew: "Ce gateway exécute le code de {boot_rev}, mais le checkout sur disque est maintenant à {disk_rev}. Changer de modèle risquerait un plantage dû à des modules obsolètes — redémarrez le gateway pour charger le nouveau code : hermes gateway restart" err_switch_failed: "Le passage au modèle {model} a échoué ({error}) ; le modèle {current} est conservé." err_config_not_updated: "config.yaml non mis à jour ({error})" err_stale_override: "enregistré dans config.yaml, mais l'ancienne surcharge de session n'a pas été effacée ({error})" next_turn_only: " (prochain tour uniquement — rétabli après une réponse)" switch_cancelled: "🟡 Changement de modèle annulé. Le modèle actuel est inchangé ({model})." guard_confirm: |- ⚠️ **{title}** {message} _Alternative texte : répondez `{prefix}approve` pour changer de modèle ou `{prefix}cancel` pour conserver le modèle actuel._ agents: header: "🤖 **Agents et tâches actifs**" active_agents: "**Agents actifs :** {count}" this_chat: " · ce chat" more: "... et {count} de plus" running_processes: "**Processus d'arrière-plan en cours :** {count}" async_jobs: "**Tâches asynchrones du gateway :** {count}" background_delegations: "**Délégations en arrière-plan :** {count}" none: "Aucun agent actif ni tâche en cours." state_starting: "démarrage" state_running: "en cours" no_progress: " · aucun progrès depuis {seconds}s" quiet_for: " · silencieux depuis {seconds}s" between_turns: "entre deux tours" child_row: " - enfant {index} : {calls} appels API · {doing}" active_ago: " · actif il y a {seconds}s" approve: no_pending: "Aucune commande en attente d'approbation." once_singular: "✅ Commande approuvée. L'agent reprend..." once_plural: "✅ Commandes approuvées ({count} commandes). L'agent reprend..." session_singular: "✅ Commande approuvée (modèle approuvé pour cette session). L'agent reprend..." session_plural: "✅ Commandes approuvées (modèle approuvé pour cette session) ({count} commandes). L'agent reprend..." always_singular: "✅ Commande approuvée (modèle approuvé de manière permanente). L'agent reprend..." always_plural: "✅ Commandes approuvées (modèle approuvé de manière permanente) ({count} commandes). L'agent reprend..." background: usage: "Usage : /bg \nExemple : /bg Résume les meilleures histoires HN d'aujourd'hui\n\nExécute le prompt dans une session séparée. Vous pouvez continuer à discuter — le résultat apparaîtra ici une fois terminé." started: "🔄 Tâche d'arrière-plan démarrée : « {preview} »\nID de tâche : {task_id}\nVous pouvez continuer à discuter — les résultats apparaîtront ici une fois terminés." task_finished: "✅ Tâche d'arrière-plan terminée" task_failed: "❌ Échec de la tâche d'arrière-plan" exit_code: "code de sortie {code}" last_output: |- . Dernière sortie : ``` {tail} ``` rerun_hint: |2- Demandez-moi de la relancer ou d'afficher le journal complet. no_credentials: "❌ La tâche d'arrière-plan n'a pas pu démarrer car aucune connexion à un modèle d'IA n'est configurée. Utilisez /login, ou lancez `hermes setup` sur l'hôte." complete_header: |+ ✅ Tâche d'arrière-plan terminée Prompt : "{preview}" no_response: "(Aucune réponse générée)" failed: "❌ Votre tâche d'arrière-plan \"{preview}\" a échoué avant de se terminer. Renvoyez /bg pour réessayer, ou /agents pour voir ce qui tourne encore." final_output: |- {header} Sortie finale : ``` {output} ``` still_running: "⏳ Tâche d'arrière-plan toujours en cours" recent_output: |- {header} Sortie récente : ``` {output} ``` btw: usage: "Usage : /btw \nExemple : /btw dans quel fichier était cette erreur ?\n\nRépond à une question rapide sur cette conversation sans l'interrompre. Pour une tâche d'arrière-plan indépendante, utilisez /bg ." no_history: "Pas encore de conversation — envoyez plutôt votre question comme un message normal." no_provider: "❌ Impossible de répondre : aucun identifiant de fournisseur configuré." started: "💬 Question annexe : « {preview} »\nRéponse à partir d'un instantané de cette conversation — le travail en cours continue." answer: "💬 /btw : « {preview} »\n\n{answer}" failed: "❌ /btw a échoué : « {preview} »\n{error}" branch: db_unavailable: "Base de données des sessions indisponible." no_conversation: "Aucune conversation à brancher — envoyez d'abord un message." create_failed: "Échec de la création de la branche : {error}" switch_failed: "Branche créée mais impossible de basculer dessus." branched_one: "⑂ Branche **{title}** créée ({count} message copié)\nOriginal : `{parent}`\nBranche : `{new}`\nUtilisez `/resume` pour revenir à l'original." branched_many: "⑂ Branche **{title}** créée ({count} messages copiés)\nOriginal : `{parent}`\nBranche : `{new}`\nUtilisez `/resume` pour revenir à l'original." branched_thread_one: "⑂ Branché vers **{title}** dans un nouveau fil ({count} message copié)\nFil : {thread}\nOriginal : `{parent}` — cette discussion y reste\nBranche : `{new}`\nUtilisez `/branch --here` pour brancher dans cette discussion." branched_thread_many: "⑂ Branché vers **{title}** dans un nouveau fil ({count} messages copiés)\nFil : {thread}\nOriginal : `{parent}` — cette discussion y reste\nBranche : `{new}`\nUtilisez `/branch --here` pour brancher dans cette discussion." thread_fallback: "Aucun fil n'a pu être créé ici, la branche a donc remplacé la session de cette discussion." commands: usage: "Utilisation : `/commands [page]`" skill_header: "⚡ **Commandes de skill** :" default_desc: "Commande de skill" none: "Aucune commande disponible." header: "📚 **Commandes** ({total} au total, page {page}/{total_pages})" nav_prev: "`/commands {page}` ← précédent" nav_next: "suivant → `/commands {page}`" out_of_range: "_(La page demandée {requested} était hors limites, affichage de la page {page}.)_" compress: not_enough: "Conversation insuffisante pour la compression (au moins 4 messages nécessaires)." no_provider: "Aucun fournisseur configuré — compression impossible." nothing_to_do: "Rien à compresser pour l'instant (la transcription est encore entièrement du contexte protégé)." aggressive_unsupported: "--aggressive n'est pas pris en charge ; utilisez '/compress here [N]' pour ne conserver que les échanges récents, ou /undo pour supprimer des tours." focus_line: "Focus : \"{topic}\"" summary_failed: "⚠️ Échec de la génération du résumé ({error}). {count} message(s) historique(s) ont été supprimés et remplacés par un espace réservé ; le contexte antérieur n'est plus récupérable. Vérifiez la configuration du modèle auxiliary.compression." aborted: "⚠️ Compression interrompue ({error}). Aucun message n'a été supprimé — la conversation est inchangée. Lancez /compress pour réessayer, /reset pour une nouvelle session, ou vérifiez la configuration de votre modèle auxiliary.compression." aux_failed: "ℹ️ Le modèle de compression configuré `{model}` a échoué ({error}). Récupéré avec votre modèle principal — le contexte est intact — mais vous pouvez vérifier `auxiliary.compression.model` dans config.yaml." turnhold_deferred: "ℹ️ Compression du contexte différée — le résumé est encore en cours de diffusion. Poursuite sans compression pour ce tour." failed: "Échec de la compression : {error}" hygiene_timeout: "⚠️ Le raccourcissement de l'historique de la conversation a pris trop de temps ; je l'ai donc ignoré et tout conservé tel quel. Lancez /compress pour réessayer ou /new pour repartir de zéro." hygiene_timeout_doctor_hint: " Si cela se reproduit, lancez `hermes doctor` sur l'hôte." hygiene_failed: "⚠️ Le raccourcissement de l'historique de la conversation a échoué ; j'ai donc tout conservé tel quel. Lancez /compress pour réessayer ou /new pour repartir de zéro. Si cela se reproduit, lancez `hermes doctor` sur l'hôte." codex_nothing: "🗜️ Rien à compacter : cette session tourne sur le runtime app-server de Codex, dont le contexte réside dans un fil géré par Codex qui n'existe que tant que l'agent est actif. Envoyez d'abord un message, puis /compress — ou /reset pour repartir de zéro." codex_compacted: "🗜️ Fil app-server Codex compacté (thread/compact). Le miroir de la transcription est volontairement inchangé — c'est désormais l'app-server qui porte le contexte compacté." codex_incomplete: "⚠️ La compaction app-server Codex ne s'est pas terminée — le fil est inchangé. Consultez les journaux de l'app-server, relancez /compress, ou /reset pour une session propre." debug: upload_failed: "✗ Échec de l'envoi du rapport de débogage : {error}" header: "**Rapport de débogage envoyé :**" auto_delete: "⏱ Les pastes s'effaceront automatiquement dans 6 heures." full_logs_hint: "Pour envoyer les journaux complets, utilisez `hermes debug share` depuis la CLI." share_hint: "Partagez ces liens avec l'équipe Hermes pour obtenir de l'aide." report_label: "Rapport" deny: stale: "❌ Commande refusée (l'approbation était périmée)." no_pending: "Aucune commande en attente de refus." denied_singular: "❌ Commande refusée." denied_plural: "❌ Commandes refusées ({count} commandes)." denied_reason_singular: "❌ Commande refusée. Raison transmise à l'agent: \"{reason}\"" denied_reason_plural: "❌ Commandes refusées ({count} commandes). Raison transmise à l'agent: \"{reason}\"" fast: not_supported: "⚡ /fast n'est disponible que pour les modèles OpenAI qui prennent en charge Priority Processing." status: "⚡ Priority Processing\n\nMode actuel : `{mode}`\n\n_Usage :_ `/fast `" unknown_arg: "⚠️ Argument inconnu : `{arg}`\n\n**Options valides :** normal, fast, status" saved: "⚡ ✓ Priority Processing : **{label}** (enregistré dans la configuration)\n_(prend effet au prochain message)_" session_only: "⚡ ✓ Priority Processing : **{label}** (cette session uniquement)" label_fast: "RAPIDE" label_normal: "NORMAL" status_fast: "rapide" status_normal: "normal" picker_title: "⚡ **Priority Processing**\n\nMode actuel : `{mode}`\n\nChoisissez une option :" choice_fast: "fast — Priority Processing activé" choice_normal: "normal — traitement standard" choice_auto: "auto — rapide pendant les premières secondes de chaque tour" choice_cold: "cold — rapide uniquement au premier tour d'une session" choice_ultrafast: "ultrafast — OpenAI Ultrafast (GPT-6 Astra, prix x6)" ultrafast_not_supported: "⚡ Ultrafast n'est disponible que pour GPT-6 Astra (modèle actuel : `{model}`)." footer: status: "📎 Pied de page d'exécution : **{state}**\nChamps : `{fields}`\nPlateforme : `{platform}`" usage: "Usage : `/footer [on|off|status]`" saved: "📎 Pied de page d'exécution : **{state}**{example}\n_(enregistré globalement — prend effet au prochain message)_" example_line: "\nExemple : `{preview}`" state_on: "ACTIVÉ" state_off: "DÉSACTIVÉ" goal: unavailable: "Les objectifs ne sont pas disponibles dans cette session." no_goal_set: "Aucun objectif défini." paused: "⏸ Objectif en pause : {goal}" no_resume: "Aucun objectif à reprendre." resumed: "▶ Objectif repris : {goal}\nReprise immédiate — je passe tout de suite à l'étape suivante." invalid: "Objectif invalide : {error}" set: "⊙ Objectif défini (budget de {budget} tours) : {goal}\nJe continuerai jusqu'à ce que l'objectif soit terminé, que vous le mettiez en pause/effaciez, ou que le budget soit épuisé.\nContrôles : /goal status · /goal pause · /goal resume · /goal clear" gate_add_admin_only: "⛔ /goal gate add nécessite un admin du gateway explicitement configuré (allow_admin_from pour les messages privés, group_allow_admin_from pour les groupes)." help: header: "📖 **Commandes Hermes**\n" skill_header: "\n⚡ **Commandes de skill** ({count} actives) :" more_use_commands: "\n... et {count} de plus. Utilisez `/commands` pour la liste paginée complète." insights: invalid_days: "Valeur --days invalide : {value}" error: "Erreur lors de la génération des analyses : {error}" kanban: error_prefix: "⚠ erreur kanban : {error}" subscribed_suffix: "(abonné — vous serez notifié lorsque {task_id} se terminera ou sera bloqué)" truncated_suffix: "… (tronqué ; utilisez `hermes kanban …` dans votre terminal pour la sortie complète)" no_output: "(aucune sortie)" wake: completed: "completed" gave_up: "gave up (retries exhausted)" crashed: "crashed (worker exited); dispatcher will retry" timed_out: "timed out; dispatcher will retry" blocked: "blocked; needs attention" review_requested: "handed off for review; the implementation is done" changes_requested: "review requested changes (BLOCK); implementation is not approved" block_loop_detected: "routed to triage after repeated blocks; orchestration attention needed" status_default: "status changed" status_joiner: ", " message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step." handoff: "Result: {summary}" review_detail: "Review feedback: {reason}\nInspect the existing card and its current review run; return work to the same implementation task. Do not treat this BLOCK as approval and do not create a duplicate task." guidance: "This is an automatic task-status notification, not a request to decompose the task again. Inspect the current board before creating follow-up tasks; do not recreate tasks or graphs that already exist." ping: completed: "✔ {head} terminée — {title}{handoff}" review_requested: "👀 {head} prête pour revue — {title}{handoff}" changes_default_reason: "le retour du relecteur exige des modifications" reviewer_suffix: " — relecteur @{reviewer}" implementer_suffix: " → implémenteur @{implementer}" changes_requested: "🛑 {board_tag}Kanban {task_id} : la revue a demandé des modifications/BLOCK : {reason}{provenance}" triage: "🛑 {head} envoyée en TRIAGE — {why}{recurrences}{reason}" triage_decision: "nécessite une décision humaine" triage_attention: "à l'attention de l'orchestration" triage_recurrences: " (bloquée {value} fois pour la même cause)" reason_suffix: " : {value}" failed_n_times: "elle a échoué {count} fois d'affilée" kept_failing: "elle n'a cessé d'échouer" last_error: " (dernière : {value})" gave_up: "⛔ {head} est maintenant bloquée : {count}{last}. Corrigez la cause, puis `hermes kanban unblock {task_id}` (ou `hermes kanban reassign {task_id}`). Journaux : `hermes kanban log {task_id}`." limit_minutes: "sa limite de {minutes} minutes" limit_generic: "sa limite de temps" timed_out: "⏱ {head} a dépassé {span} et a été arrêtée ; elle sera réessayée automatiquement." blocked: "⏸ {head} bloquée{reason}" crashed: "✖ {head} — son worker s'est arrêté de façon inattendue ; elle sera réessayée automatiquement." status: "🔄 {head} → {status}" board_tag: "[{board}] " assignee_tag: "@{assignee} " head: "{board_tag}{assignee_tag}Kanban {task_id}" personality: none_configured: "Aucune personnalité configurée dans `{path}/config.yaml`" header: "🎭 **Personnalités disponibles**\n" none_option: "• `none` — (aucune superposition de personnalité)" item: "• `{name}` — {preview}" usage: "\nUtilisation : `/personality `" save_failed: "⚠️ Échec de l'enregistrement du changement de personnalité : {error}" cleared: "🎭 Personnalité effacée — comportement de base de l'agent utilisé.\n_(prend effet au prochain message)_" set_to: "🎭 Personnalité définie sur **{name}**\n_(prend effet au prochain message)_" unknown: "Personnalité inconnue : `{name}`\n\nDisponibles : {available}" err_config_write: "échec d'écriture de la config" profile: header: "👤 **Profil :** `{profile}`" home: "📂 **Dossier personnel :** `{home}`" plain: |- Profil : {profile} Répertoire : {home} reasoning: level_default: "medium (par défaut)" level_disabled: "none (désactivé)" scope_session: "remplacement de session" scope_global: "configuration globale" status: "🧠 **Paramètres de raisonnement**\n\n**Effort :** `{level}`\n**Portée :** {scope}\n**Affichage :** {display}\n\n_Usage :_ `/reasoning [--global]`" display_on: "activé ✓" display_off: "désactivé" display_set_on: "🧠 ✓ Affichage du raisonnement : **ACTIVÉ**\nLa réflexion du modèle sera affichée avant chaque réponse sur **{platform}**." display_set_off: "🧠 ✓ Affichage du raisonnement : **DÉSACTIVÉ** pour **{platform}**" reset_global_unsupported: "⚠️ `/reasoning reset --global` n'est pas pris en charge. Utilisez `/reasoning --global` pour modifier la valeur globale par défaut." reset_done: "🧠 ✓ Remplacement de raisonnement de la session effacé ; retour à la configuration globale." unknown_arg: "⚠️ Argument inconnu : `{arg}`\n\n**Niveaux valides :** none, minimal, low, medium, high, xhigh, max, ultra\n**Affichage :** show, hide\n**Persister :** ajoutez `--global` pour enregistrer au-delà de cette session" picker_title: "🧠 **Paramètres de raisonnement**\n\n**Effort :** `{level}`\n**Portée :** {scope}\n**Affichage :** {display}\n\nChoisissez une option :" choice_none: "none — désactiver le raisonnement" choice_reset: "reset — effacer le réglage de session" choice_show: "afficher le raisonnement dans les réponses" choice_hide: "masquer le raisonnement dans les réponses" set_global: "🧠 ✓ Effort de raisonnement défini sur `{effort}` (enregistré dans la configuration)\n_(prend effet au prochain message)_" set_global_save_failed: "🧠 ✓ Effort de raisonnement défini sur `{effort}` (session uniquement — échec de l'enregistrement de la configuration)\n_(prend effet au prochain message)_" set_session: "🧠 ✓ Effort de raisonnement défini sur `{effort}` (session uniquement — ajoutez `--global` pour persister)\n_(prend effet au prochain message)_" quote_label_discord: "-# 💭 Raisonnement" quote_label_md: "> 💭 **Raisonnement :**" more_lines: |2- _... ({count} lignes de plus)_ block: |- 💭 **Raisonnement :** ``` {reasoning} ``` {response} reload_mcp: cancelled: "🟡 /reload-mcp annulé. Outils MCP inchangés." always_followup: "ℹ️ Les prochains appels `/reload-mcp` s'exécuteront sans confirmation. Réactivez via `approvals.mcp_reload_confirm: true` dans `config.yaml`." confirm_prompt: "⚠️ **Confirmer /reload-mcp**\n\nRecharger les serveurs MCP reconstruit l'ensemble d'outils de cette session et **invalide le cache de prompt du fournisseur** — le prochain message renverra l'intégralité des jetons d'entrée. Sur les modèles à long contexte ou à raisonnement élevé, cela peut être coûteux.\n\nChoisissez :\n• **Approuver une fois** — recharger maintenant\n• **Toujours approuver** — recharger maintenant et masquer cette confirmation définitivement\n• **Annuler** — laisser les outils MCP inchangés\n\n_Alternative texte : répondez `/approve`, `/always` ou `/cancel`._" header: "🔄 **Serveurs MCP rechargés**\n" reconnected: "♻️ Reconnectés : {names}" added: "➕ Ajoutés : {names}" removed: "➖ Supprimés : {names}" none_connected: "Aucun serveur MCP connecté." tools_available: "\n🔧 {tools} outil(s) disponible(s) sur {servers} serveur(s)" failed: "❌ Échec du rechargement MCP : {error}" reload_skills: header: "🔄 **Skills rechargées**\n" no_new: "Aucune nouvelle skill détectée." total: "\n📚 {count} skill(s) disponible(s)" added_header: "➕ **Skills ajoutées :**" removed_header: "➖ **Skills supprimées :**" item_with_desc: " - {name} : {desc}" item_no_desc: " - {name}" failed: "❌ Échec du rechargement des skills : {error}" reset: header_default: "✨ Session réinitialisée ! Nouveau départ." header_new: "✨ Nouvelle session démarrée !" header_titled: "✨ Nouvelle session démarrée : {title}" title_rejected: "\n⚠️ Titre refusé : {error}" title_error_untitled: "\n⚠️ {error} — session démarrée sans titre." title_empty_untitled: "\n⚠️ Le titre est vide après nettoyage — session démarrée sans titre." tip: "\n✦ Astuce : {tip}" restart: in_progress: "⏳ Redémarrage du gateway déjà en cours..." restarting: "♻ Redémarrage du gateway. Si vous n'êtes pas notifié dans les 60 secondes, redémarrez depuis la console avec `hermes gateway restart`." resume: db_unavailable: "Base de données des sessions indisponible." parse_error: "⚠️ Could not parse `/resume` arguments: {error}. Use quotes around titles with spaces, for example: `/resume \"Project A Plan\"`." matrix_no_named_sessions: "No named sessions found for this Matrix room. Use `/title My Session` to name the current room session, `/resume --all` to list all Matrix sessions, or `/resume --cross-room ` to explicitly cross room boundaries." matrix_blocked_no_origin: "⚠️ /resume Matrix bloqué : cette session nommée n'a aucun salon d'origine enregistré, Hermes ne la reprendra donc pas par défaut dans le salon actuel. Utilisez `/resume --cross-room {name}` si vous souhaitez volontairement franchir les limites du salon." matrix_blocked_other_room: "⚠️ /resume Matrix bloqué : cette session appartient à un autre salon Matrix ({room}). Utilisez `/resume --cross-room {name}` si vous souhaitez volontairement la reprendre ici." matrix_cross_room_success: "⚠️ Cross-room resume: resumed **{title}** inside Matrix room **{room}**. Future messages in this room will use that transcript until `/reset` or another `/resume`.{msg_part}" blocked_not_owner: "⚠️ /resume bloqué : '**{name}**' appartient à un autre utilisateur ou à une autre discussion. Vous ne pouvez reprendre que les sessions de cette discussion." no_named_sessions: "Aucune session nommée trouvée.\nUtilisez `/title Ma session` pour nommer la session actuelle, puis `/resume Ma session` pour y revenir plus tard." all_requires_admin: "_Remarque : `--all` (liste inter-discussions) nécessite un administrateur configuré ; seules les sessions de cette discussion sont affichées._" list_header: "📋 **Sessions nommées**\n" list_item: "• **{title}**{preview_part}" list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nUsage : `/resume `" list_footer_numbered: "\nUtilisation : `/resume ` ou `/resume ` (par exemple `/resume 1` pour la plus récente)" list_failed: "Impossible de lister les sessions : {error}" out_of_range: "L'index de reprise {index} est hors limites.\nUtilisez `/resume` sans arguments pour voir les sessions disponibles." not_found: "Aucune session correspondant à '**{name}**' trouvée.\nUtilisez `/resume` sans argument pour voir les sessions disponibles." already_on: "📌 Déjà sur la session **{name}**." switch_failed: "Échec du changement de session." resumed_one: "↻ Session **{title}** reprise ({count} message). Conversation restaurée." resumed_many: "↻ Session **{title}** reprise ({count} messages). Conversation restaurée." resumed_no_count: "↻ Session **{title}** reprise. Conversation restaurée." msg_count_one: " ({count} message)" msg_count_other: " ({count} messages)" retry: no_previous: "Aucun message précédent à réessayer." unsafe: "Impossible de réessayer ce message en toute sécurité : {error}" failed_unchanged: "Nouvelle tentative échouée ; transcription inchangée." rollback: not_enabled: "Les points de contrôle ne sont pas activés.\nActivez-les dans config.yaml :\n```\ncheckpoints:\n enabled: true\n```" none_found: "Aucun point de contrôle trouvé pour {cwd}" invalid_number: "Numéro de point de contrôle invalide. Utilisez 1-{max}." restored: "✅ Restauré au point de contrôle {hash} : {reason}\nUn instantané pré-rollback a été enregistré automatiquement." kept_user_edits: "↷ Vos modifications manuelles ont été conservées : {files}\nUtilisez /rollback --all pour les restaurer aussi." kept_oversize: "↷ Conservé (trop volumineux pour les checkpoints, aucune copie enregistrée vers laquelle revenir) : {files}" failed_deletes: "⚠️ Suppression impossible (laissé en place) : {files}" restore_failed: "❌ {error}" diff: not_enabled: "Les points de contrôle ne sont pas activés, il n'y a donc pas de référence de session.\nActivez-les dans config.yaml :\n```\ncheckpoints:\n enabled: true\n```\nLe /diff simple fonctionne toujours — il utilise git directement." no_changes: "Aucun changement." failed: "{error}" err_default: "Impossible de générer le diff" more_untracked: |2- ... et {count} de plus untracked_label: "**Non suivis :**" truncated_note: |2- ... (tronqué — {lines} lignes au total ; utilisez /diff --stat pour un résumé) set_home: save_failed: "Impossible d'enregistrer le canal principal : {error}" success: "✅ Canal principal défini sur **{name}** (ID : {chat_id}).\nLes tâches cron et les messages multi-plateformes seront livrés ici." err_missing_platform: "Plateforme logique manquante" err_relay_unauthenticated: "Le relais n'authentifie pas cette cible de foyer logique" context: header: "🧠 **Fenêtre de contexte**" model: "Modèle : `{model}`" window: "Fenêtre : {total} jetons" in_use: "Utilisé : {used} / {total} ({pct}%)" bar: "{bar}" headroom: "Marge avant la limite : {headroom} jetons" threshold: "Compression automatique à : {threshold} ({threshold_pct}%) — {to_go} restants" over_threshold: "⚠️ **Seuil de compression automatique dépassé ({threshold}, {threshold_pct}%)**" compressions: "Compressions dans cette session : {count}" last_savings: "Libéré par la dernière compression : {savings}% du contexte" totals_header: "Totaux de la session (cumulés sur {calls} appels API)" totals_line: "Entrée {input} · Sortie {output} · Raisonnement {reasoning}" total_billed: "Total facturé : {total}" throughput_note: "_Il s'agit du débit, non de la taille du contexte — chaque appel renvoie l'intégralité de la fenêtre ci-dessus._" estimated: "Contexte estimé : ~{count} jetons sur {messages} messages" detail_after_first: "_(Statistiques complètes de compression et de débit disponibles après la première réponse de l'agent)_" no_data: "Aucune donnée de contexte disponible pour l'instant. Envoyez un message pour démarrer une session." category: system_prompt: "Prompt système" tool_definitions: "Définitions d'outils" rules: "Règles" skills: "Skills" mcp: "MCP" subagent_definitions: "Définitions de sous-agents" memory: "Mémoire" conversation: "Conversation" category_header: "Utilisation estimée par catégorie" no_data_yet: " (aucune donnée pour l'instant — envoyez d'abord un message)" free_space: "Espace libre" category_row: "{glyph} {label} ~{tokens} tokens ~{pct}%" toolset_row: " {toolset} {count} outils ~{tokens} tokens" not_available: "n/d" skill_row: " {name} index ~{index_tokens} SKILL.md {md_tokens} tokens" and_more: " … et {count} de plus" toolsets_title: "Ensembles d'outils par coût de schéma (plus gros d'abord)" skills_title: "Skills par coût (index = toujours chargé ; SKILL.md = coût une fois chargée)" window_line: "Fenêtre de contexte : {mark}{used} / {max} tokens ({mark}{pct}%)" source: local_estimate: "estimation locale" provider_usage: "consommation fournisseur" provider_usage_plus_estimate: "consommation fournisseur + estimation des nouveaux messages" source_line: "Source : {source} ; les comptes par catégorie sont des estimations locales." hint_all: "Utilisez /context all pour les coûts par skill et par ensemble d'outils." status: header: "📊 **État de Hermes Gateway**" matrix_scope_header: "**Portée Matrix :**" matrix_scope_room: " room: {room}" matrix_scope_room_id: " room_id: {room_id}" matrix_scope_thread: " thread_id: {thread_id}" matrix_scope_mode: " session_scope: {scope}" matrix_scope_key: " session_key: {session_key}" session_id: "**ID de session :** `{session_id}`" title: "**Titre :** {title}" created: "**Créé :** {timestamp}" last_activity: "**Dernière activité :** {timestamp}" model: "**Modèle :** `{model}`" model_provider: "**Modèle :** `{model}` ({provider})" free_tier: "Nous · offre gratuite · nous/welcome · /login pour se connecter" context: "**Contexte :** {used} / {total} ({pct}%)" context_used: "**Contexte :** ~{used} jetons" tokens: "**Jetons facturés au total :** {tokens} _(pas la taille actuelle de votre contexte ; utilisez `/context`)_" agent_running: "**Agent en cours :** {state}" state_yes: "Oui ⚡" state_no: "Non" queued: "**Suivis en file :** {count}" platforms: "**Plateformes connectées :** {platforms}" stop: stopped_pending: "⚡ Arrêté. L'agent n'avait pas encore commencé — vous pouvez continuer cette session." stopped: "⚡ Arrêté. Vous pouvez continuer cette session." no_active: "Aucune tâche active à arrêter." force_stopped_pending: "⚡ Arrêt forcé. L'agent était encore en cours de démarrage — session déverrouillée." title: db_unavailable: "Base de données des sessions indisponible." warn_prefix: "⚠️ {error}" empty_after_clean: "⚠️ Le titre est vide après nettoyage. Utilisez des caractères imprimables." set_to: "✏️ Titre de session défini : **{title}**" not_found: "Session introuvable dans la base de données." current_with_title: "📌 Session : `{session_id}`\nTitre : **{title}**" current_no_title: "📌 Session : `{session_id}`\nAucun titre défini. Usage : `/title Mon nom de session`" topic: not_telegram_dm: "La commande /topic n'est disponible que dans les chats privés Telegram." no_session_db: "Base de données de sessions non disponible." unauthorized: "Vous n'êtes pas autorisé à utiliser /topic sur ce bot." restore_needs_topic: "Pour restaurer une session, créez ou ouvrez d'abord un topic Telegram, puis envoyez /topic dans ce topic. Pour créer un nouveau topic, ouvrez All Messages et envoyez-y n'importe quel message." topics_disabled: "Les topics Telegram ne sont pas encore activés pour ce bot.\n\nComment les activer :\n1. Ouvrez @BotFather.\n2. Choisissez votre bot.\n3. Ouvrez Bot Settings → Threads Settings.\n4. Activez Threaded Mode et assurez-vous que les utilisateurs sont autorisés à créer de nouveaux threads.\n\nPuis envoyez /topic à nouveau." topics_user_disallowed: "Les topics Telegram sont activés, mais les utilisateurs ne peuvent pas en créer.\n\nOuvrez @BotFather → choisissez votre bot → Bot Settings → Threads Settings, puis désactivez 'Disallow users to create new threads'.\n\nPuis envoyez /topic à nouveau." enable_failed: "Échec de l'activation du mode topic Telegram : {error}" bound_status: "Ce topic est lié à :\nSession : {label}\nID : {session_id}\n\nUtilisez /new pour remplacer ce topic par une nouvelle session.\nPour un travail parallèle, ouvrez All Messages et envoyez-y un message pour créer un autre topic." thread_ready: "Les topics multi-sessions Telegram sont activés.\n\nCe topic sera utilisé comme session Hermes indépendante. Utilisez /new pour remplacer la session actuelle de ce topic. Pour un travail parallèle, ouvrez All Messages et envoyez-y un message pour créer un autre topic." untitled_session: "Session sans titre" restore_step_1: "1. Créez ou ouvrez un topic. Pour en créer un nouveau, ouvrez All Messages et envoyez-y n'importe quel message." restore_step_2: "2. Envoyez /topic dans ce topic." default_title: "Hermes Chat" root_lobby: |- Ce chat principal est réservé aux commandes système. Pour démarrer un nouveau chat Hermes, ouvrez le topic All Messages en haut de l'interface du bot et envoyez-y n'importe quel message. Telegram créera un nouveau topic pour ce message ; chaque topic fonctionne comme une session Hermes indépendante. root_new: |- Pour démarrer un nouveau chat Hermes en parallèle, ouvrez le topic All Messages en haut de l'interface du bot et envoyez-y n'importe quel message. Telegram créera un nouveau topic pour celui-ci. Chaque topic est une session Hermes indépendante. N'utilisez /new dans un topic existant que si vous voulez remplacer la session actuelle de ce topic. new_header: |- Nouvelle session Hermes démarrée dans ce topic. Astuce : pour travailler en parallèle, ouvrez All Messages et envoyez-y un message pour créer un topic séparé plutôt que d'utiliser /new ici. /new remplace la session liée au topic actuel. help: |- /topic — activer le mode multi-session en DM (un bot, plusieurs chats parallèles) Usage : /topic Activer le mode topic, ou afficher l'état s'il est déjà actif /topic help Afficher ce message /topic off Désactiver le mode topic et effacer les liaisons de topics /topic Dans un topic : restaurer une session précédente par son ID Fonctionnement : 1. Lancez /topic une fois dans ce DM — Hermes vérifie que les Threads Settings de BotFather sont activés et bascule en mode multi-session. 2. Touchez All Messages en haut du bot et envoyez n'importe quel message. Telegram crée un nouveau topic pour ce message ; chaque topic est une session Hermes indépendante (historique et contexte vierges). 3. Le DM racine devient un salon système — envoyez-y /topic, /status, /help, /usage. Les prompts normaux vont dans un topic. 4. /new dans un topic réinitialise uniquement la session de ce topic. 5. /topic dans un topic y restaure une ancienne session. system_topic_name: "Système" system_topic_intro: "Topic système pour les commandes et l'état d'Hermes." setup_image_caption: "BotFather → Bot Settings → Threads Settings" no_chat_id: "Impossible de déterminer l'ID du chat." mode_not_enabled: "Le mode topic multi-session n'est pas activé pour ce chat." disable_failed: "Échec de la désactivation du mode topic : {error}" mode_disabled: |- Le mode topic multi-session est maintenant OFF pour ce chat. Les topics existants dans Telegram ne sont pas supprimés — ils cessent simplement d'être traités comme des sessions indépendantes. Le DM racine redevient un chat Hermes normal. Lancez /topic pour le réactiver plus tard. status_enabled: "Les topics multi-sessions Telegram sont activés." status_how_to: "Pour créer un nouveau chat Hermes, ouvrez All Messages en haut de l'interface du bot et envoyez-y n'importe quel message. Telegram créera un nouveau topic pour celui-ci." previous_unlinked: "Sessions précédentes non liées :" restore_one: "Pour en restaurer une :" restore_example: "Exemple : envoyez /topic {session_id} dans un topic." no_unlinked: "Aucune session Telegram précédente non liée trouvée." restore_later: "Pour restaurer une session précédente plus tard :" session_not_found: "Session introuvable : {session_id}" not_telegram_session: "Cette session n'est pas une session Telegram et ne peut pas être restaurée dans ce topic." not_your_session: "Cette session n'appartient pas à cet utilisateur Telegram." already_linked: "Cette session est déjà liée à un autre topic Telegram." restored: "Session restaurée : {title}" restored_last_message: |2- Dernier message d'Hermes : {text} undo: nothing: "Rien à annuler." removed: "↩️ {turns} tour(s) annulé(s) ({count} message(s)).\nSauvegardé dans : « {preview} »\nCopiez/modifiez le texte ci-dessus et envoyez-le pour relancer à partir d'ici." invalid_count: "Nombre invalide « {arg} » — utilisez /undo ou /undo N." update: platform_not_messaging: "✗ /update n'est disponible que depuis les plateformes de messagerie. Exécutez `hermes update` depuis le terminal." not_git_repo: "✗ Pas un dépôt git — impossible de mettre à jour." hermes_cmd_not_found: "✗ Impossible de localiser la commande `hermes`. Hermes est en cours d'exécution, mais la commande de mise à jour n'a pas pu trouver l'exécutable dans le PATH ni via l'interpréteur Python actuel. Essayez d'exécuter `hermes update` manuellement dans votre terminal." start_failed: "✗ Échec du démarrage de la mise à jour : {error}" starting: "☤ Démarrage de la mise à jour Hermes… Je diffuserai la progression ici." reply_failed: "✗ Échec de l'envoi de la réponse au processus de mise à jour : {error}" reply_sent: "✓ `{label}` envoyé au processus de mise à jour." failed_notice: "❌ La mise à jour d'Hermes a échoué ; la version précédente tourne toujours. Lancez `hermes update` sur l'hôte pour voir l'erreur complète, ou réessayez /update plus tard." prompt_default: " (par défaut : {default})" prompt: |- ☤ **La mise à jour a besoin de votre réponse :** {prompt}{default_hint} Répondez `{prefix}approve` (oui) ou `{prefix}deny` (non), ou saisissez directement votre réponse. finished: "✅ Mise à jour d'Hermes terminée." timed_out: "❌ La mise à jour d'Hermes a expiré après 30 minutes." finished_success: "✅ Mise à jour d'Hermes terminée avec succès." last_lines: |- {msg} Dernières lignes : ``` {tail} ``` managed_action: "mettre à jour Hermes Agent" not_applicable: |- ✗ `hermes update` ne s'applique pas à cette installation ({method}). Mettez à jour avec : {command} usage: rate_limits: "⏱️ **Limites de débit :** {state}" header_session: "📊 **Utilisation des jetons de session**" label_model: "Modèle : `{model}`" label_input_tokens: "Jetons d'entrée : {count}" label_cache_read: "Jetons de lecture du cache : {count}" label_cache_write: "Jetons d'écriture du cache : {count}" label_output_tokens: "Jetons de sortie : {count}" label_total: "Total : {count}" label_api_calls: "Appels API : {count}" label_cost: "Coût : {prefix}${amount}" label_cost_included: "Coût : inclus" label_context: "Contexte : {used} / {total} ({pct}%)" label_compressions: "Compressions : {count}" breakdown_header: "🧩 **Répartition du contexte** _(estimée)_" breakdown_line: "• {label} : ~{count} ({pct} %)" breakdown_cat_system_prompt: "Invite système" breakdown_cat_tool_definitions: "Définitions des outils" breakdown_cat_rules: "Règles" breakdown_cat_skills: "Compétences" breakdown_cat_mcp: "MCP" breakdown_cat_subagent_definitions: "Définitions des sous-agents" breakdown_cat_memory: "Mémoire" breakdown_cat_conversation: "Conversation" header_session_info: "📊 **Infos de session**" label_messages: "Messages : {count}" label_estimated_context: "Contexte estimé : ~{count} jetons" detailed_after_first: "_(Utilisation détaillée disponible après la première réponse de l'agent)_" no_data: "Aucune donnée d'utilisation disponible pour cette session." unknown_subcommand: "Sous-commande /usage inconnue : `{args}`. Essayez `/usage` ou `/usage reset [--force]`." reset_wrong_provider: "Les réinitialisations de limite en réserve ne sont disponibles qu'avec le fournisseur openai-codex. Changez d'abord avec `/model`." credits: not_logged_in: "Non connecté à Nous Portal. Connecte-toi pour voir ton solde de crédits et recharger." verbose: not_enabled: "La commande `/verbose` n'est pas activée pour les plateformes de messagerie.\n\nActivez-la dans `config.yaml` :\n```yaml\ndisplay:\n tool_progress_command: true\n```" mode_off: "⚙️ Progression des outils : **OFF** — aucune activité d'outil affichée." mode_new: "⚙️ Progression des outils : **NEW** — affichée lors d'un changement d'outil (longueur d'aperçu : `display.tool_preview_length`, par défaut 40)." mode_all: "⚙️ Progression des outils : **ALL** — chaque appel d'outil est affiché (longueur d'aperçu : `display.tool_preview_length`, par défaut 40)." mode_verbose: "⚙️ Progression des outils : **VERBOSE** — chaque appel d'outil avec ses arguments complets." mode_log: "⚙️ Progression des outils : **LOG** — silencieux dans le chat ; les appels d'outils sont écrits dans ~/.hermes/logs/tool_calls.log." saved_suffix: "_(enregistré pour **{platform}** — prend effet au prochain message)_" save_failed: "_(impossible d'enregistrer dans la configuration : {error})_" voice: enabled_voice_only: "Mode vocal activé.\nJe répondrai en vocal quand vous envoyez des messages vocaux.\nUtilisez /voice tts pour obtenir des réponses vocales à tous les messages." disabled_text: "Mode vocal désactivé. Réponses uniquement textuelles." tts_enabled: "TTS automatique activé.\nToutes les réponses incluront un message vocal." status_mode: "Mode vocal : {label}" status_channel: "Canal vocal : #{channel}" status_participants: "Participants : {count}" status_member: " - {name}{status}" speaking: " (parle)" enabled_short: "Mode vocal activé." disabled_short: "Mode vocal désactivé." label_off: "Désactivé (texte seulement)" label_voice_only: "Activé (réponse vocale aux messages vocaux)" label_all: "TTS (réponse vocale à tous les messages)" help: "{toggle}\n\n**Comment fonctionne /voice**\n• `/voice on` — réponse vocale quand vous envoyez un message vocal\n• `/voice tts` — réponse vocale à *chaque* message\n• `/voice off` — retour aux réponses texte uniquement\n• `/voice status` — afficher le mode actuel\n• `/voice` (sans argument) — bascule rapide entre activé et désactivé{channels}" help_channels: "\n\n**Salons vocaux en direct (Discord)**\n• Rejoignez d'abord un salon vocal, puis `/voice channel` — je rejoins, j'écoute et je parle mes réponses\n• `/voice leave` — se déconnecter du salon vocal" transcript_echo_short: "🎙️ \"{text}\"" channel_unsupported: "Les canaux vocaux ne sont pas pris en charge sur cette plateforme." channel_guild_only: "Cette commande ne fonctionne que dans un serveur Discord." channel_not_in_voice: "Vous devez d'abord rejoindre un canal vocal." channel_join_failed: "Échec de la connexion au canal vocal : {error}" channel_deps_missing: "Les dépendances vocales sont manquantes (PyNaCl / davey). Lancez : `{hint}`" channel_join_permissions: "Échec de la connexion au canal vocal. Vérifiez les permissions du bot (Connect + Speak)." channel_joined: |- Canal vocal **{name}** rejoint. Je lirai mes réponses à voix haute et je vous écouterai. Utilisez /voice leave pour me déconnecter. channel_not_joined: "Pas dans un canal vocal." channel_left: "Canal vocal quitté." transcript_echo: "**[Voix]** <@{user}> : {text}" yolo: disabled: "⚠️ Mode YOLO **DÉSACTIVÉ** pour cette session — les commandes dangereuses nécessiteront une approbation." enabled: "⚡ Mode YOLO **ACTIVÉ** pour cette session — toutes les commandes sont auto-approuvées. À utiliser avec prudence." shared: session_db_unavailable: "Base de données de sessions indisponible." session_db_unavailable_prefix: "Base de données de sessions indisponible" session_not_found: "Session introuvable dans la base de données." warn_passthrough: "⚠️ {error}" unknown_error: "erreur inconnue" error_prefix: "Erreur : {error}" history_unreadable: "⚠️ Je ne peux pas lire l'historique de cette conversation pour le moment (vos messages précédents existent mais ne peuvent pas être chargés). Lancez `hermes doctor --fix` sur l'hôte, ou utilisez /new pour repartir de zéro." agent_running_retry_later: "L'agent est en cours d'exécution — attendez la fin du tour, puis /{command}." none_marker: "(aucun)" none_value: "aucun" unknown_value: "inconnu" exec_approval: header: "Hermes veut exécuter une commande qui nécessite votre accord" reason_label: "Motif du signalement" default_reason: "commande dangereuse" smart_deny_line: "Smart DENY : la dérogation du propriétaire ne s'applique qu'à cette seule opération." smart_deny_heading: "⚠️ **Smart DENY — dérogation du propriétaire pour une seule opération :**" timed_out_notice: "⌛ Approbation expirée après {window} — la commande n'a PAS été exécutée. Demandez-moi de réessayer si vous la voulez toujours, ou augmentez approvals.timeout dans config.yaml." timed_out_card_body: |- {notice} ``` {command} ``` action_once: "Autoriser une fois" action_session: "Autoriser (session)" action_always: "Toujours autoriser" action_deny: "Refuser" deadline: "Sans réponse de votre part dans {window}, elle ne sera PAS exécutée." text_choice_once: "Répondez `{prefix}approve` pour l'exécuter une fois" text_choice_session: "`{prefix}approve session` pour autoriser ce motif jusqu'à la fin de cette session" text_choice_always: "`{prefix}approve always` pour l'autoriser définitivement" text_choice_deny: "`{prefix}deny` pour annuler" text_choice_joiner: ", " text_choice_last: | , ou {choice}. text_body: |+ {heading} ``` {command} ``` {reason_label} : {reason} notify: media_kind: audio: "audio" video: "vidéo" file: "fichier" image: "image" media_delivery_failed: "⚠️ Impossible de livrer la pièce jointe ({kind})." media_delivery_failed_with_name: "⚠️ Impossible de livrer la pièce jointe ({kind}) ({file_name})." delivery_failed_retry: "⚠️ La livraison du message a échoué après plusieurs tentatives. Veuillez réessayer — votre demande a été traitée mais la réponse n'a pas pu être envoyée." plain_fallback_prefix: |- (Échec du formatage de la réponse, texte brut :) {content} turn_error_no_details: "aucun détail disponible" turn_error_detailed: |- Désolé, j'ai rencontré une erreur ({error_type}). {error_detail} Réessayez ou utilisez /reset pour démarrer une nouvelle session. turn_error: "Désolé, j'ai rencontré une erreur." context_injection_refused: "Injection de contexte refusée." no_home_channel: |- 📬 Aucun canal d'accueil n'est défini pour {platform}. Le canal d'accueil est l'endroit où Hermes livre les résultats des tâches cron et les messages inter-plateformes. Tapez {sethome_cmd} pour faire de ce chat votre canal d'accueil, ou ignorez ce message pour passer. unauthorized: action_notice: "Ce bot est privé et vous ne figurez pas sur sa liste d'autorisation. Si vous en êtes le propriétaire, lancez `hermes pairing approve {platform} ` sur l'hôte (`hermes pairing list` affiche l'id)." admin_only_can_run: "Vous pouvez lancer : " admin_only_whoami_hint: ". Utilisez /whoami pour la liste complète." admin_only_none: "Aucune commande slash n'est activée pour les non-administrateurs sur cette plateforme. Demandez à un administrateur de vous ajouter à allow_admin_from ou de définir user_allowed_commands." admin_only: "⛔ /{command} est réservée aux administrateurs ici. {suffix}" owner_hint_env: "ajoutez l'ID à {env_var} dans {home}/.env et redémarrez le gateway" owner_hint_generic: "ajoutez l'ID à la liste des utilisateurs autorisés de cette plateforme et redémarrez le gateway" owner_notice: "Message ignoré d'un utilisateur {platform} non reconnu : {who}. Si c'est vous ou une personne de confiance, {allowlist} ; ou définissez `unauthorized_dm_behavior: pair` pour {platform} dans {home}/config.yaml afin que les expéditeurs inconnus reçoivent un code d'appairage que vous pourrez approuver avec `hermes pairing approve {platform} `." picker: page_info: " ({start}–{end} sur {total})" clarify: hint_single: "Répondez avec le numéro, le texte de l'option ou votre propre réponse." hint_multi: "Plusieurs choix possibles — répondez avec les numéros séparés par des virgules ou des espaces (ex. \"1, 3\"), le texte de l'option ou votre propre réponse." option_line: " {index}. {choice}" question: "❓ {question}" answered: "✅ réponse : {response}" cancelled: "↩️ Clarification annulée — votre message sera traité comme une suite de la conversation." expired: "⏳ Cette demande a expiré — veuillez envoyer une nouvelle requête." native_stream_placeholder: "💬 En attente de votre choix..." skip_hint: 'Répondez « skip » pour passer cette question.' errors: rate_limited: "⏱️ Le service de modèle IA limite le débit des requêtes. Patientez un instant, puis utilisez /retry." auth_failed: "⚠️ La connexion au service de modèle IA a échoué. Utilisez /login pour vous reconnecter, ou demandez à la personne qui gère ce bot de lancer `hermes doctor` sur l'hôte." bad_request: "⚠️ Le service de modèle IA a rejeté cette requête. Essayez de reformuler votre message, ou utilisez /model pour changer de modèle." connection_interrupted: "⚠️ La connexion au service de modèle IA a été interrompue en cours de requête — c'est généralement passager. Utilisez /retry pour réessayer ; si cela se reproduit, lancez `hermes doctor` sur l'hôte." unreachable: "⚠️ Le service de modèle IA est injoignable pour le moment — le point de terminaison configuré ne tourne pas ou n'est pas accessible. Patientez un instant puis utilisez /retry ; si le problème persiste, lancez `hermes doctor` sur l'hôte." connection_unknown: "⚠️ Hermes n'a pas pu joindre le service de modèle IA (aucun détail supplémentaire fourni par le SDK). Utilisez /retry pour réessayer ; si le problème persiste, lancez `hermes doctor` sur l'hôte." context_overflow: "⚠️ Cette conversation est devenue trop longue pour que je puisse la lire d'un coup. Utilisez /compress pour raccourcir l'historique, ou /new pour démarrer une nouvelle conversation." usage_limit_resets: "⏱️ La limite de consommation du service de modèle IA est atteinte ; elle se réinitialise dans {window}. Utilisez /retry ensuite, ou /model pour changer de modèle." provider_kept_failing: "⚠️ Le service de modèle IA a échoué à répétition. Utilisez /retry pour réessayer, ou /model pour changer de modèle. Les détails sont dans le journal du gateway (`hermes logs`)." session_storage_unavailable_disk: "⚠️ Le stockage des sessions était temporairement indisponible ; ce tour a donc été arrêté pour protéger l'historique de votre conversation. Vérifiez l'espace disque disponible, puis renvoyez votre message." session_storage_unavailable: "⚠️ Le stockage des sessions était temporairement indisponible ; ce tour a donc été arrêté pour protéger l'historique de votre conversation. Votre message devrait déjà être enregistré — renvoyez-le dans un instant." generic_failed: "⚠️ Une erreur s'est produite et je n'ai pas pu terminer cette réponse. Utilisez /retry pour réessayer, ou /new pour démarrer une nouvelle conversation. Les détails techniques sont dans le journal du gateway (`hermes logs`)." interrupted_before_start: "⚠️ Votre message a été interrompu avant le début du traitement (probablement par un /stop récent). Veuillez le renvoyer." processing_incomplete: "traitement incomplet" stopped_before_finishing: "⚠️ J'ai dû m'arrêter avant de terminer{reason}. Utilisez /retry pour réessayer, ou /compress si cette conversation est devenue très longue." no_response: "⚠️ Le traitement s'est terminé mais aucune réponse n'a été générée. Il s'agit peut-être d'une erreur passagère — essayez de renvoyer votre message." previous_turn_cleanup: "⚠️ Votre message n'a pas été traité (le tour précédent était encore en cours de nettoyage). Veuillez le renvoyer." unexpected_silence: "⚠️ Le modèle n'a renvoyé qu'un marqueur de silence pour un message qui attendait une réponse. Réessayez ou reformulez." empty_response_model_label: "Le modèle" hint_auth: " Votre connexion au service de modèle IA a expiré ou la clé API est incorrecte. Utilisez /login ici, ou lancez `{relogin}` sur l'hôte." hint_quota: " Le solde ou le quota de votre service de modèle IA est épuisé. Rechargez-le sur le site du service, ou utilisez /model pour changer de modèle." hint_overloaded: " Le service de modèle IA est temporairement surchargé. Patientez un instant, puis utilisez /retry." hint_rate_limited: " Votre débit de requêtes est limité. Patientez un instant et réessayez." hint_usage_limit_resets: " La limite de consommation de votre forfait est atteinte. Elle se réinitialise dans ~{hours} h." hint_usage_limit: " La limite de consommation de votre forfait est atteinte. Veuillez attendre sa réinitialisation." hint_rejected: " Le service de modèle IA a rejeté la requête." generic_failed_with_hint: |- ⚠️ Une erreur s'est produite et je n'ai pas pu terminer cette réponse.{hint} Utilisez /retry pour réessayer, ou /new pour démarrer une nouvelle conversation. Les détails techniques sont dans le journal du gateway (`hermes logs`). history_unavailable: "⚠️ L'historique de cette session est temporairement indisponible ; ce message n'a donc pas été traité. Demandez à l'opérateur d'inspecter state.db, puis renvoyez-le une fois le problème réglé. N'utilisez /reset que si vous voulez vraiment démarrer une nouvelle conversation." no_credentials: "⚠️ Je n'ai pas pu me connecter au service de modèle IA ; ce message n'a donc pas été traité. Utilisez /login pour vous reconnecter, ou /model pour choisir un autre modèle. Si l'échec persiste, lancez `hermes doctor` sur l'hôte." skills: disabled: |- La skill **{name}** est installée mais désactivée. Activez-la avec : `hermes skills config` not_installed: |- La skill **{name}** est disponible mais pas installée. Installez-la avec : `hermes skills install {install_name}` disabled_for_platform: |- La skill **{name}** est désactivée pour {platform}. Activez-la avec : `hermes skills config` stacked_disabled: |- La ou les skills **{names}** de cet appel empilé sont désactivées pour {platform}. Activez-les avec : `hermes skills config` stacked_load_failed: "Échec du chargement des skills empilées pour /{command}." gate_off: "L'approbation des écritures de skills est désactivée (skills.write_approval). Activez-la avec /skills approval on, puis examinez ici les écritures en attente avec /skills pending." unknown_subcommand: "Sous-commande /skills inconnue sur cette plateforme. Utilisez : pending, approve , reject , diff , approval . (Recherche et installation : CLI uniquement.)" diff_truncated: |2- … (tronqué — diff complet dans ~/.hermes/pending/skills/{pending_id}.json) busy: action_restarting: "en cours de redémarrage" action_shutting_down: "en cours d'arrêt" reject_model: "L'agent est en cours d'exécution — attendez ou faites /stop d'abord, puis changez de modèle." reject_codex_runtime: "L'agent est en cours d'exécution — attendez ou faites /stop d'abord, puis changez de runtime." reject_moa: "L'agent est en cours d'exécution — attendez ou faites /stop d'abord, puis lancez /moa." drain_queued: "⏳ Gateway {action} — mis en file pour le prochain tour, une fois qu'il sera de retour." drain_rejected: "⏳ Le gateway est {action} et n'accepte pas d'autre tour pour le moment." drain_rejected_new_work: "⏳ Le gateway est {action} et n'accepte pas de nouveau travail pour le moment." demoted_tail: " — votre message est mis en file jusqu'à ce qu'il termine (utilisez /stop pour tout annuler)." elapsed_min: "{minutes} min écoulées" running_tool: "en cours : {tool}" ack_detail_wrap: " ({detail})" ack_detail_joiner: ", " ack: "{head}{detail}{tail}" steered_subagents_head: "⏩ Orienté vers l'exécution en cours et ses sous-agents actifs" steered_subagents_tail: ". Votre message leur parviendra après leur prochain appel d'outil." steered_head: "⏩ Orienté vers l'exécution en cours" steered_tail: ". Votre message parviendra après le prochain appel d'outil." redirected_head: "↪ Exécution en cours redirigée" redirected_tail: ". Je m'ajusterai en tenant compte de votre correction." subagent_working_head: "⏳ Sous-agent au travail" compressing_head: "⏳ Compression du contexte" queued_head: "⏳ Mis en file pour le prochain tour" queued_tail: ". Je répondrai dès que la tâche en cours sera terminée." interrupting_head: "⚡ Interruption de la tâche en cours" interrupting_tail: ". Je réponds à votre message dans un instant." slash_rejected: "⏳ L'agent est en cours d'exécution — `/{command}` ne peut pas s'exécuter au milieu d'un tour. Attendez la fin de la réponse en cours ou faites `/stop` d'abord." reject_goal: "L'agent est en cours d'exécution — utilisez /goal status / pause / clear / wait pendant l'exécution, ou /stop avant de définir un nouvel objectif." reject_loop: "L'agent est en cours d'exécution — utilisez /loop status / pause / stop pendant l'exécution, ou /stop avant de définir une nouvelle boucle." draining_maintenance: "⏳ Cet agent se vide pour une opération de maintenance et n'accepte pas de nouveaux tours pour le moment. Il sera de retour dans un instant — merci de renvoyer votre message d'ici peu." another_turn_running: "⏳ Un autre tour est encore en cours sur cette session. Pour protéger la transcription, ce message n'a pas été traité. Attendez la fin du tour actif, puis renvoyez-le." behavior_queue_short: "mise en file pour le prochain tour" behavior_queue_long: "Les messages seront mis en file pour le prochain tour pendant que Hermes est occupé." behavior_steer_short: "orientation de l'exécution en cours (après le prochain appel d'outil)" behavior_steer_long: "Les messages seront orientés vers l'exécution en cours (après le prochain appel d'outil)." behavior_interrupt_short: "interruption de l'exécution en cours" behavior_interrupt_long: "Les messages interrompront l'exécution en cours pendant que Hermes est occupé." status: |- **Mode de saisie quand occupé : `{mode}` Messages pendant l'occupation : _{behavior}_ Modifiez-le avec `/busy queue`, `/busy steer` ou `/busy interrupt`. unknown_mode: "Mode inconnu `{arg}`. Utilisez `/busy queue`, `/busy steer` ou `/busy interrupt`." save_failed: "Le mode de saisie quand occupé n'a pas pu être enregistré dans la configuration. Mode inchangé." set: |- Mode de saisie quand occupé défini sur **`{mode}`** (enregistré). _{behavior}_ pause: resumed: "▶️ Reprise — le nouveau travail est de nouveau accepté." not_paused: "Hermes n'était pas en pause." reason_suffix: " (raison : {reason})" already_paused: "⏸️ Hermes est déjà en pause{suffix}. Utilisez `/pause off` pour reprendre." paused: "⏸️ En pause{suffix}. Le nouveau travail cron/kanban/gateway est suspendu ; le travail en cours se termine normalement. Utilisez `/pause off` pour reprendre." queue: usage: "Usage : /queue " queued: "Mis en file pour le prochain tour." queued_depth: " ({depth} en file)" steer: usage: "Usage : /steer " usage_idle: "Usage : /steer (aucun agent en cours ; envoi comme message normal)" queued_starting: "L'agent démarre encore — /steer mis en file pour le prochain tour." queued_no_agent: "Aucun agent actif — /steer mis en file pour le prochain tour." failed: "⚠️ Échec de l'orientation : {error}" rejected_empty: "Orientation rejetée (contenu vide)." target_subagents: "l'exécution et ses sous-agents actifs" target_run: "l'exécution" queued: "⏩ Orientation mise en file vers {target} en cours — parviendra après le prochain appel d'outil : '{preview}'" suggestions: failed: "Échec de la commande de suggestions : {error}" blueprint: failed: "Échec de la commande de blueprint cron : {error}" confirm: destructive_prompt: |- ⚠️ **Confirmer /{command}** {detail} Choisissez : • **Approuver une fois** — continuer cette fois seulement • **Toujours approuver** — continuer et ne plus jamais afficher cette demande • **Annuler** — conserver la conversation actuelle _Alternative texte : répondez `{prefix}approve`, `{prefix}always` ou `{prefix}cancel`._ destructive_optout: |2- ℹ️ Les prochains /clear, /new, /reset et /undo s'exécuteront sans confirmation. Réactivez-la via `approvals.destructive_slash_confirm: true` dans config.yaml. destructive_optout_save_failed: |2- ⚠️ Impossible d'enregistrer cette préférence (config.yaml n'est pas accessible en écriture) ; /clear, /new, /reset et /undo redemanderont confirmation la prochaine fois. Pour la désactiver définitivement, définissez `approvals.destructive_slash_confirm: false` dans config.yaml. cancelled: "🟡 /{command} annulé. Conversation inchangée." detail_new: "Ceci démarre une nouvelle session et supprime l'historique de la conversation actuelle." detail_undo_one: "Ceci retire le dernier échange utilisateur/assistant de l'historique." detail_undo_many: "Ceci retire les {count} derniers tours utilisateur de l'historique." hooks: command_blocked: "La commande `/{command}` a été bloquée par un hook." prompt_command: start_failed: "Impossible de démarrer /{command} — veuillez réessayer." learn: ack_described: "Apprentissage d'une skill à partir de votre description…" ack_conversation: "Apprentissage d'une skill à partir de cette conversation…" plan: ack_task: "Planification : {task}" ack_conversation: "Planification à partir du contexte de cette conversation…" init: start_failed: "Impossible de démarrer /init — veuillez réessayer." ack_update: "Mise à jour d'AGENTS.md à partir d'une analyse du projet…" ack_generate: "Génération d'AGENTS.md à partir d'une analyse du projet…" moa: prepare_failed: "Échec de la préparation du tour MoA." quick_command: no_output: "La commande n'a renvoyé aucune sortie." timed_out: "Délai de la commande rapide dépassé (30 s)." error: "Erreur de commande rapide : {error}" no_command: "La commande rapide '/{command}' n'a aucune commande définie." unsupported_type: "La commande rapide '/{command}' a un type non pris en charge (pris en charge : 'exec', 'alias')." no_target: "La commande rapide '/{command}' n'a aucune cible définie." unknown_command: "Commande inconnue `/{command}`. Tapez /commands pour voir ce qui est disponible, ou renvoyez le texte sans la barre oblique initiale pour l'envoyer comme message normal." session: auto_reset_notice: | ◐ Session réinitialisée après un arrêt. Historique de conversation effacé. Utilisez /resume pour parcourir et restaurer une session précédente. auto_reset_context_exhausted: |2- 🔄 Session réinitialisée automatiquement — la conversation a dépassé la taille maximale du contexte et n'a pas pu être compressée davantage. Votre prochain message démarrera une nouvelle session. info_model: "◆ Modèle : `{model}`" info_provider: "◆ Fournisseur : {provider}" info_context: "◆ Contexte : {tokens} tokens ({source})" info_acting_model: "◆ Modèle actif (facturé pour l'exécution) : {provider}:{model}" info_endpoint: "◆ Endpoint : {url}" proxy: requires_aiohttp: "⚠️ Le mode proxy nécessite aiohttp. Exécutez : {hint}" url_missing: "⚠️ URL du proxy non configurée (GATEWAY_PROXY_URL ou gateway.proxy_url)" http_error: "⚠️ Erreur du proxy ({status}) : {error}" closed_early: "⚠️ La connexion au proxy s'est fermée avant la fin de la réponse" connection_error: "⚠️ Erreur de connexion au proxy : {error}" no_response: "(Aucune réponse de l'agent distant)" progress: status_fallback_long: "toujours dessus" status_fallback_short: "un instant" stuck_warning: "⚠️ Je semble bloqué (aucune activité depuis {minutes} min). S'il ne se passe rien dans les {remaining} prochaines minutes, j'abandonnerai cette tâche. Vous pouvez continuer d'attendre, envoyer /stop pour l'annuler, ou /new pour démarrer une nouvelle conversation." timeout_header: "⏱️ Agent inactif depuis {minutes} min — aucun appel d'outil ni réponse d'API." timeout_stuck_tool: "L'agent semble bloqué sur l'outil `{tool}` ({seconds} s depuis la dernière activité, {progress})." timeout_last_activity: "Dernière activité : {activity} (il y a {seconds} s, {progress}). L'agent attendait peut-être une réponse d'API." timeout_hint: |- Pour augmenter la limite, définissez agent.gateway_timeout dans config.yaml (valeur en secondes, 0 = aucune limite) et redémarrez le gateway. Réessayez, ou utilisez /reset pour repartir de zéro. working_heartbeat: "⏳ En cours — {minutes} min{detail}" thinking_prefix: "💬 {text}" tool_head: "{emoji} {tool}" tool_verbose: |- {emoji} {tool}({keys}) {args} tool_preview: "{emoji} {tool} : \"{preview}\"" tool_pending: "{emoji} {tool}..." task_status_running: "en cours" task_status_complete: "terminé" task_status_error: "erreur" task_line: "- {title} - {status}" task_card_title: "Hermes travaille" pairing: validity_hour: "{hours} heure" validity_hours: "{hours} heures" code_reply: |- Bonjour ! Je ne vous reconnais pas encore, je ne peux donc pas vous répondre tant que la personne qui gère ce bot ne vous a pas approuvé. Votre code d'appairage : `{code}` (valable {validity}) Si vous gérez ce bot, ouvrez un terminal et exécutez : `{approve_cmd}`. Sinon, transmettez cette commande au propriétaire du bot. Une fois approuvé, renvoyez votre message. rate_limited: "Trop de demandes d'appairage pour le moment. Patientez quelques minutes, puis renvoyez votre message." shutdown: action_shutting_down: "en cours d'arrêt" action_restarting: "en cours de redémarrage" cron_interrupted: "⚠️ La tâche planifiée '{job}' a été interrompue car Hermes est {action} ; aucun résultat pour cette exécution. Elle se relancera selon son planning, ou lancez-la maintenant avec `hermes cron run {job}` une fois Hermes de retour." notice_shutdown: "⚠️ Hermes s'arrête — votre tâche en cours va être interrompue. Une fois de retour en ligne, envoyez n'importe quel message et j'essaierai de reprendre là où nous en étions." notice_restart: "⚠️ Hermes redémarre — votre tâche en cours va être interrompue. Envoyez n'importe quel message après le redémarrage et j'essaierai de reprendre là où vous en étiez." startup: handoff_thread_title: "Hermes — {title}" restarted: "♻ Gateway redémarré avec succès. Votre session continue." free_tier_line: "Inférence : offre gratuite Nous (nous/welcome). Connectez-vous pour en obtenir plus : /login" online: "♻️ Gateway en ligne — Hermes est de retour et prêt." db_corrupt: |- ⚠️ Corruption détectée dans la base de données des sessions. Les messages risquent de ne pas être persistés. Options de récupération : 1. Exécutez `hermes {profile_arg}doctor --fix` 2. Arrêtez le gateway, puis récupérez avec : hermes {profile_arg}sessions recover --source {db_path} --inspect-only (si le résultat indique que c'est récupérable) hermes {profile_arg}sessions recover --source {db_path} --output recovered-state.db — la récupération prend d'abord un instantané du fichier endommagé ; n'exécutez PAS `sqlite3 ... ".recover"` sur le state.db actif, une CLI sqlite3 vulnérable peut l'endommager davantage 3. Restaurez une sauvegarde depuis {backups_dir}/ Exécutez `hermes {profile_arg}doctor` pour des diagnostics anonymisés. db_fts_corrupt: "⚠️ La base de données des sessions a signalé une erreur de corruption limitée à l'index de recherche (FTS5) ; les tables de messages ne sont pas endommagées. Les messages risquent de ne pas être persistés tant qu'elle n'est pas réparée : exécutez `hermes {profile_arg}doctor --fix`, puis redémarrez le gateway. N'exécutez pas d'outils de récupération et ne restaurez pas de sauvegarde à moins que `hermes {profile_arg}doctor` ne confirme des dégâts." db_then_restart: "{action} Puis `hermes {profile_arg}gateway restart`." db_unavailable: "⚠️ Base de données des sessions indisponible — les messages risquent de ne pas être enregistrés et /resume sera vide. Cause : {cause}. {action}" whoami: scope_dm: "MP" scope_group: "groupe/canal" header: | **Vous** — {platform} ({scope}) ID utilisateur : `{user_id}` tier_unrestricted: |- Niveau : sans restriction (aucune liste d'administrateurs configurée pour cette portée) Commandes slash : toutes disponibles tier_admin: |- Niveau : **admin** Commandes slash : toutes disponibles tier_user: |- Niveau : utilisateur Commandes slash que vous pouvez exécuter : {commands} platform: usage: |- Usage : /platform [name] /platform list — afficher l'état des plateformes /platform pause — arrêter de réessayer une plateforme en échec /platform resume — remettre en file une plateforme en pause header: "**Plateformes du gateway**" connected: "Connectées : {platforms}" reason_default: "en pause" reason_manual: "mise en pause via /platform pause" item_paused: " · {name} — EN PAUSE ({reason}). Reprenez avec `/platform resume {name}`." item_retrying: " · {name} — nouvelle tentative (essai {attempts})" none_failed: "En échec/en pause : (aucune)" usage_action: "Usage : /platform {action} " unknown: "Plateforme inconnue : {name}" not_queued_pause: "{name} n'est pas dans la file de nouvelles tentatives (soit connectée, soit non activée)." already_paused: "{name} est déjà en pause." paused: "✓ {name} mise en pause. Reprenez avec `/platform resume {name}` ou `hermes gateway restart` pour réinitialiser." not_queued_resume: "{name} n'est pas dans la file de nouvelles tentatives — rien à reprendre." already_retrying: "{name} réessaie déjà — aucune reprise nécessaire." resumed: "✓ {name} reprise — nouvelle tentative au prochain cycle du watcher." bundles: unavailable: "Sous-système des bundles indisponible : {error}" default_desc: "Charger {count} skills" none_plain: |- Aucun bundle de skills installé. Créez-en un avec : hermes bundles create --skill --skill Répertoire : {dir} header_plain: "Bundles de skills ({count} installés) :" item_plain: "/{slug} — {desc} ({count} skills)" invoke_hint_plain: "Invoquez un bundle avec / pour charger toutes ses skills." none: |- Aucun bundle de skills installé. Créez-en un sur l'hôte avec : `hermes bundles create --skill --skill ` Répertoire : `{dir}` header: "**Bundles de skills** ({count} installés) :" item: "• `/{slug}` — {desc} _({count} skills)_" invoke_hint: "Invoquez un bundle avec `/` pour charger toutes ses skills." memory: unknown_subcommand: "Sous-commande /memory inconnue. Utilisez : pending, approve , reject , approval ." approvals: admin_only: "Seuls les administrateurs du gateway peuvent modifier le mode d'approbation persistant." heartbeat: unavailable: "Heartbeats indisponibles (aucune session)." paused: "⏸ Heartbeat en pause : {prompt}" none_set: "Aucun heartbeat défini." no_resume: "Aucun heartbeat à reprendre." resumed: "▶ Heartbeat repris (toutes les {interval}) : {prompt}" cleared: "✓ Heartbeat supprimé." usage: |- Usage : /heartbeat every (ex. /heartbeat every 10m Vérifier la CI) Aussi : /heartbeat status | pause | resume | clear interval_too_small: "Intervalle trop court — le minimum est de {min_seconds} s." prompt_required: "Usage : /heartbeat every — le prompt est obligatoire." invalid_prefix: "Heartbeat invalide" set: |- ♥ Heartbeat défini (toutes les {interval}) : {prompt} Se déclenche comme un tour normal dès que cette session est inactive et que l'intervalle est écoulé. Il ne vit que tant que le gateway tourne — utilisez `hermes cron` pour des planifications durables. refine: unavailable: "Refine indisponible (aucune session)." nothing_yet: "Rien à affiner pour l'instant — envoyez d'abord un message." empty: "Rien à affiner pour l'instant — la conversation est vide." start_failed: "Échec du démarrage de /refine : {error}" focus_suffix: " (focus : {focus})" started: "⚗ Revue de cette conversation en arrière-plan{focus_suffix} — toute mise à jour de mémoire/skill sera signalée une fois terminée." review: unavailable: "Revue indisponible (aucune session)." nothing_yet: "Rien à passer en revue pour l'instant — envoyez d'abord un message." start_failed: "Échec du démarrage de /review : {error}" subgoal: no_goal: "Aucun objectif actif. Définissez-en un avec /goal ." usage_remove: "Usage : /subgoal remove " remove_not_int: "/subgoal remove : doit être un entier (index commençant à 1)." removed: "✓ Sous-objectif {index} supprimé : {text}" cleared_one: "✓ {count} sous-objectif effacé." cleared_other: "✓ {count} sous-objectifs effacés." none_to_clear: "Aucun sous-objectif à effacer." added: "✓ Sous-objectif {index} ajouté : {text}" loop: unavailable: "Boucles indisponibles." no_session: "Boucles indisponibles (aucune session active)." goal_defers_note: |2- Remarque : un /goal actif pilote cette session — les réveils de la boucle sont différés jusqu'à ce que l'objectif se termine, soit mis en pause ou soit parqué. save: no_messages: "Aucun message enregistré pour cette session ({session_id})." no_adapter: "Adaptateur de plateforme introuvable pour envoyer le document." caption: "Export de la session : {filename}" complete: "Export terminé." failed: "Erreur lors de l'export de la session : {error}" sessions: usage_search: "Usage : `/sessions search `" all_requires_admin: "_Remarque : `all` (liste de toutes les discussions) nécessite un admin configuré ; seules les sessions de cette discussion sont affichées._" title_matching: "Sessions correspondant à « {query} »" title_all: "Sessions" title_named: "Sessions nommées" codex_runtime: config_load_failed: "❌ Impossible de charger la configuration : {error}" topup: header: "💳 **Solde Nous**" portal_link: "Gérez votre facturation sur le portail : {url}" hint: "Rechargez et gérez votre facturation dans le navigateur — votre solde sera mis à jour ici ensuite." login: free_tier_remaining: |2- Certaines discussions sont encore sur l'offre gratuite ; utilisez /model dans ces discussions pour changer de modèle. platform: whatsapp: clarify_other_title: "✏️ Autre" clarify_other_description: "Saisissez votre propre réponse" clarify_list_button: "Choisir" clarify_list_section: "Options" approve_button: "✅ Approuver" deny_button: "❌ Refuser" slash_confirm_once: "✅ Approuver une fois" slash_confirm_always: "🔒 Toujours" slash_confirm_cancel: "❌ Annuler" clarify_type_answer: "✏️ Saisissez votre réponse :" approved: "✅ Approuvé." denied: "❌ Refusé." approval_expired: "⌛ Approbation expirée — la commande n'a pas été exécutée (délai dépassé ou déjà résolue ailleurs)." yuanbao: slow_response_notice: "Cette tâche est un peu complexe — je m'en occupe encore, merci de patienter..." owner_command_denied: "⚠️ {command} n'est disponible que pour le créateur en mode discussion privée" shared: truncated_suffix: |2- ...(tronqué) unknown: "inconnu" approval_expired: "⌛ Approbation expirée — la commande n'a pas été exécutée (délai dépassé ou déjà résolue ailleurs)." model_picker_expired: "⏳ Ce sélecteur de modèle a expiré — relancez /model." not_authorized: "⛔ Non autorisé." handoff: default_name: "session" media: image_failed: "⚠️ Impossible d'envoyer l'image jointe." video_failed: "⚠️ Impossible d'envoyer la vidéo jointe." file_failed: "⚠️ Impossible d'envoyer le fichier joint ({name})." attachment_failed: "⚠️ Impossible d'envoyer la pièce jointe." weixin: voice_as_attachment: "[message vocal en pièce jointe]" signal: batch_pacing_notice: "(D'autres images arrivent — pause d'environ {wait} pour respecter la limite de débit de Signal, lot {batch}/{total}.)" wait_seconds: "{count}s" wait_minutes: "{count} min" api_server: provider_auth_failed: "Échec de l'authentification auprès du fournisseur" provider_rate_limited: "Fournisseur limité en débit" provider_error_line: "⚠️ {label} : {error}" transformed_notice: |2 [Réponse transformée après la diffusion en continu] discord: approval: question: "Voulez-vous que Hermes exécute cette commande ?" requested_command_label: "Commande demandée :" confirm_title: "Confirmer" already_resolved: "Cette approbation a déjà été traitée~" expired: "⌛ Approbation expirée — la commande n'a pas été exécutée (délai dépassé ou déjà traitée ailleurs)" by_user: "{label} par {user}" resolved_once: "Approuvé une fois" resolved_session: "Approuvé pour la session" resolved_always: "Approuvé définitivement" resolved_deny: "Refusé" slash_confirm: already_resolved: "Cette demande a déjà été traitée~" approve_once: "Approuver une fois" always_approve: "Toujours approuver" cancel: "Annuler" resolved_once: "Approuvé une fois" resolved_always: "Toujours approuvé" resolved_cancel: "Annulé" prompt: truncated_marker: "... [tronqué]" clarify_title: "Hermes a besoin de votre réponse" clarify_hint_buttons: "Choisissez une option ci-dessous, ou cliquez sur ✏️ Autre pour saisir une réponse personnalisée." clarify_hint_text: "Répondez dans ce canal avec votre réponse." default_hint: " (par défaut : {default})" update_title: "Mise à jour : réponse requise" expired_footer: "⏱ Demande expirée — aucune action effectuée" already_answered: "Déjà répondu~" affirm: "Oui" negate: "Non" other: "✏️ Autre (saisir une réponse)" clarify_already_answered: "Cette demande a déjà reçu une réponse~" answered_by: "Réponse de {user} : {choice}" awaiting_typed: "En attente de la réponse saisie par {user}…" picker: title: "⚙ Configuration du modèle" select_provider: |- Modèle actuel : `{model}` Fournisseur : {provider} Sélectionnez un fournisseur : unknown_model: "inconnu" choice_default_title: "Choisissez une option" provider_option: "{provider} ({count} modèles)" current: "actuel" provider_placeholder: "Choisissez un fournisseur..." cancel: "Annuler" model_placeholder: "Choisissez un modèle de {provider}" back: "◀ Retour" switch_anyway: "Changer quand même" more_available: "{count} autres disponibles — tapez directement `/model `" select_model: |- Fournisseur : **{provider}** Sélectionnez un modèle :{extra} already_resolved: "Déjà traité~" switching: "Passage à `{model}`..." switching_title: "⚙ Changement de modèle" switch_error: "Erreur lors du changement de modèle : {error}" switched_title: "⚙ Modèle changé" expired_toast: "La sélection du modèle a expiré." cancelled: "Sélection du modèle annulée." expired: "⏱ Sélection expirée — modèle inchangé." choice_placeholder: "Choisissez une option..." choice_error: "Erreur lors de l'application de la sélection : {error}" choice_expired: "⏱ Sélection expirée — aucune modification effectuée." command: new: description: "Démarrer une nouvelle conversation" followup: "Nouvelle conversation démarrée~" reset: description: "Réinitialiser votre session Hermes" followup: "Session réinitialisée~" model: description: "Afficher ou changer le modèle" arg_name: "Nom du modèle (ex. anthropic/claude-sonnet-4). Laissez vide pour voir le modèle actuel." reasoning: description: "Afficher/changer l'effort de raisonnement, ou basculer son affichage" arg_effort: "Choisissez un niveau, réinitialisez le remplacement, ou affichez/masquez le raisonnement. Laissez vide pour voir l'état actuel." choice_none: "none — désactiver le raisonnement" choice_ultra: "ultra — raisonnement maximal" choice_reset: "reset — effacer le remplacement de cette session" choice_show: "show — afficher le raisonnement dans les réponses" choice_hide: "hide — masquer le raisonnement dans les réponses" personality: description: "Définir une personnalité" arg_name: "Nom de la personnalité. Laissez vide pour lister celles disponibles." retry: description: "Réessayer votre dernier message" followup: "Nouvelle tentative~" undo: description: "Supprimer le dernier échange" status: description: "Afficher l'état de la session Hermes" followup: "État envoyé~" stop: description: "Arrêter l'agent Hermes en cours" followup: "Arrêt demandé~" steer: description: "Injecter un message après le prochain appel d'outil (sans interrompre)" arg_prompt: "Texte à injecter dans le prochain résultat d'outil de l'agent" plan: description: "Rédiger un plan d'implémentation en markdown (sans exécution)" arg_task: "Ce qu'il faut planifier. Laissez vide pour le déduire de la conversation." compress: description: "Compresser le contexte de la conversation" title: description: "Définir ou afficher le titre de la session" arg_name: "Titre de la session. Laissez vide pour afficher le titre actuel." resume: arg_name: "Nom de la session à reprendre. Laissez vide pour lister les sessions." usage: description: "Afficher la consommation de tokens de cette session" help: description: "Afficher les commandes disponibles" insights: arg_days: "Nombre de jours à analyser (par défaut : 7)" reload_skills: description: "Réanalyser ~/.hermes/skills/ pour détecter les skills ajoutées ou supprimées" voice: description: "Basculer le mode de réponse vocale" arg_mode: "Mode vocal : join, channel, leave, on, tts, off ou status" choice_join: "join — rejoindre votre canal vocal" choice_channel: "channel — rejoindre votre canal vocal (alias)" choice_leave: "leave — quitter le canal vocal" choice_mode_on: "on — réponse vocale aux messages vocaux" choice_tts: "tts — réponse vocale à tous les messages" choice_mode_off: "off — texte uniquement" choice_status: "status — afficher le mode actuel" update: followup: "Mise à jour lancée~" restart: description: "Redémarrer proprement le gateway Hermes" followup: "Redémarrage demandé~" approve: arg_scope: "Facultatif : 'all', 'session', 'always', 'all session', 'all always'" deny: description: "Refuser une commande dangereuse en attente" arg_scope: "Facultatif : 'all' pour refuser toutes les commandes en attente" thread: description: "Créer un nouveau fil et y démarrer une session Hermes" arg_name: "Nom du fil" arg_message: "Premier message facultatif à envoyer à Hermes dans le fil" arg_auto_archive: "Archivage automatique en minutes (60, 1440, 4320, 10080)" error_unknown: "erreur inconnue" failed: "Échec de la création du fil : {error}" created: "Fil créé : {link}" error_name_required: "Le nom du fil est requis." error_invalid_archive: "auto_archive_duration doit être l'une des valeurs suivantes : {allowed}." error_no_channel: "Impossible de déterminer le canal Discord actuel." error_dm_not_supported: "Les fils Discord ne peuvent être créés que dans les canaux textuels d'un serveur, pas en messages privés." error_no_parent: "Impossible de déterminer un canal textuel parent pour le nouveau fil." error_both_failed: "Discord a rejeté la création directe du fil et la solution de repli a également échoué. Erreur directe : {direct_error}. Erreur de repli : {fallback_error}" queue: description: "Mettre un prompt en file pour le prochain tour (sans interrompre)" arg_prompt: "Le prompt à mettre en file" followup: "Mis en file pour le prochain tour." bg: arg_prompt: "Le prompt à exécuter en arrière-plan" followup: "Tâche en arrière-plan démarrée~" btw: description: "Poser une question annexe sur la conversation en cours" arg_question: "La question annexe à traiter sans interrompre" followup: "Question annexe envoyée~" skill: description: "Exécuter une skill Hermes" arg_name: "Quelle skill exécuter" arg_args: "Arguments facultatifs pour la skill" unknown: "Skill inconnue : `{name}`. Commencez à taper pour obtenir des suggestions." auto_args_description: "Arguments : {args_hint}" auto_description_fallback: "Exécuter /{name}" limits: response_truncated: "⚠️ **Réponse tronquée** — cette réponse a dépassé la limite d'envoi ({max_messages} messages). {dropped_chars} caractères n'ont pas été transmis ; la réponse complète se trouve dans les journaux de la session." forum: default_title: "Nouvelle publication" voice: ack_1: "Je regarde ça." ack_2: "Un instant." ack_3: "Je vérifie tout de suite." ack_4: "Une seconde." ack_5: "Je m'en occupe." left_inactivity: "Canal vocal quitté (délai d'inactivité dépassé)." security: unauthorized_slash_alert: |- ⚠️ Tentative de commande slash Discord non autorisée Utilisateur : {user_name} ({user_id}) Canal : {chan_id} (serveur {guild_id}) Commande : {command_text} Raison : {reason} thread: seed_message: "🧵 Fil créé par Hermes : **{name}**" default_name: "Hermes" handoff_seed: "🧵 Passation Hermes : **{name}**" auto_create_failed: "⚠️ Hermes n'a pas pu créer de fil Discord pour ce message, la demande n'a donc pas été traitée. Veuillez réessayer." auto_create_failed_generic: "La demande n'a pas été traitée. Veuillez réessayer." media: upload_too_large: "⚠️ Impossible de joindre `{filename}` — {size_mb} Mo dépasse la limite d'envoi Discord de {limit_mb} Mo pour ce canal. Compressez le fichier ou partagez plutôt un lien." image_skipped_too_large: "⚠️ `{filename}` ignoré — {size_mb} Mo dépasse la limite d'envoi Discord de {limit_mb} Mo." telegram: approval: action_once: "✅ Une fois" action_session: "✅ Session" action_always: "✅ Toujours" action_deny: "❌ Refuser" toast_invalid_data: "Données d'approbation invalides." toast_already_resolved: "Cette approbation a déjà été traitée." resolved_once: "✅ Approuvé une fois" resolved_session: "✅ Approuvé pour la session" resolved_always: "✅ Approuvé définitivement" resolved_deny: "❌ Refusé" resolved_generic: "Traité" resolved_by_user: "{label} par {user}" expired: "⌛ Approbation expirée" expired_detail: "{label} — aucune commande n'était en attente. Elle a déjà expiré (et a été refusée) ou a été traitée ailleurs." slash_confirm: approve_once: "✅ Approuver une fois" always_approve: "🔒 Toujours approuver" cancel: "❌ Annuler" already_resolved: "Ce prompt a déjà été traité." resolved_once: "✅ Approuvé une fois" resolved_always: "🔒 Toujours approuver" resolved_cancel: "❌ Annulé" picker: expired_rerun: "Sélecteur expiré — relancez la commande." invalid_selection: "Sélection invalide." expired: "Sélecteur expiré." apply_error: "Erreur lors de l'application de la sélection : {error}" prev: "◀ Préc." next: "Suiv. ▶" back: "◀ Retour" cancel: "✗ Annuler" more_available: "{count} de plus disponibles — tapez directement `/model `" title: "Configuration du modèle" provider_label: "Fournisseur : {provider}" select_model: "Sélectionnez un modèle :" current_model: "Modèle actuel : {model}" select_provider: "Sélectionnez un fournisseur :" unknown_model: "inconnu" provider_family: "Famille de fournisseurs : {family}" invalid_model_index: "Index de modèle invalide." switch_error: "Erreur lors du changement de modèle : {error}" switch_failed: "Échec du changement." switched: "Modèle changé !" invalid_page: "Page invalide." expired_model: "Sélecteur expiré — utilisez /model à nouveau." provider_not_found: "Fournisseur introuvable." switch_anyway: "Changer quand même" confirm_selection: "Confirmer le choix du modèle" group_not_found: "Groupe introuvable." cancelled: "Sélection du modèle annulée." prompt: default_hint: " (par défaut : {default})" update_header: "Mise à jour : réponse requise" affirm: "✓ Oui" negate: "✗ Non" other: "✏️ Autre (saisir)" expired_toast: "⚠️ Ce prompt a expiré — veuillez utiliser /retry." expired_body: "⚠️ Cette question a expiré ou la session a été réinitialisée — veuillez utiliser /retry." type_answer: "✏️ Saisissez votre réponse dans le chat." awaiting_typed: "En attente de la réponse saisie par {user}…" invalid_choice: "Choix invalide." update_sent: "'{answer}' envoyé au processus de mise à jour." update_answered: "Réponse au prompt de mise à jour : {answer}" affirm_word: "Oui" negate_word: "Non" media: download_failed: "⚠️ Impossible de télécharger votre {kind}{name} ({error}). Veuillez réessayer de l'envoyer." named_suffix: " ({name})" kind_attachment: "pièce jointe" kind_photo: "photo" kind_voice: "message vocal" kind_audio: "fichier audio" kind_video: "fichier vidéo" gmail_triage: done_send: "✓ brouillon envoyé" done_archive: "✓ archivé" done_draft: "✓ réponse rédigée" done_spam: "✓ marqué comme spam" done_mute: "✓ mis en sourdine" done_mute_domain: "✓ domaine en sourdine" done_trust: "✓ approuvé" done_trust_domain: "✓ domaine approuvé" done_vip: "✓ marqué VIP" done_vip_domain: "✓ domaine marqué VIP" invalid_data: "Données gmail-triage invalides." unknown_verb: "Verbe inconnu : {verb}" script_missing: "❌ {script} manquant" exit_code: "code de sortie {code}" failed: "❌ échec de {verb} : {detail}" timed_out: "❌ {verb} : délai dépassé" error: "❌ erreur {verb} : {error}" appended_by: "— {label} par {user}" user_fallback: "Utilisateur" install_hint: "Exécutez `hermes setup` pour installer la prise en charge de Telegram." slack: approval: fallback_text: "⚠️ Approbation de commande requise : {command}" resolved_once: "✅ Approuvé une fois par {user}" resolved_session: "✅ Approuvé pour la session par {user}" resolved_always: "✅ Approuvé définitivement par {user}" resolved_deny: "❌ Refusé par {user}" confirm: default_title: "Confirmer" approve_once: "Approuver une fois" always_approve: "Toujours approuver" cancel: "Annuler" resolved_always: "🔒 Toujours approuvé par {user}" resolved_cancel: "❌ Annulé par {user}" picker: more_available: |2- *{count} autres disponibles — tapez directement `/model `* provider_header: |- *⚙ Configuration du modèle* Modèle actuel : `{model}` Fournisseur : {provider} Sélectionnez un fournisseur :{extra} model_header: |- *⚙ Configuration du modèle* Fournisseur : *{provider}* Sélectionnez un modèle :{extra} choose_provider: "Choisir un fournisseur…" choose_model: "Choisir un modèle de {provider}…" cancel: "Annuler" back: "◀ Retour" fallback_provider: "⚙ Configuration du modèle — sélectionnez un fournisseur" fallback_model: "⚙ Configuration du modèle — {provider}" cancelled: "❌ Sélection du modèle annulée." no_models_for_provider: "Aucun modèle disponible pour `{provider}`." switching: "⚙ Passage à `{model}`…" switch_failed: "❌ Échec du changement de modèle : {error}" switch_failed_header: "⚙ Échec du changement de modèle" switched_header: "⚙ Modèle changé" clarify: option_n: "Option {n}" choice_n: "choix {n}" other: "✏️ Autre…" expired: "⏳ Cette question a expiré — envoyez une nouvelle demande. (par {user})" awaiting: "✏️ En attente de la réponse saisie par {user}…" resolved: "✅ {user} : {choice}" feedback: good: "Bonne réponse" good_a11y: "Envoyer un avis positif sur cette réponse" bad: "Mauvaise réponse" bad_a11y: "Envoyer un avis négatif sur cette réponse" status: thinking: "réfléchit..." still_working: "toujours en cours… ({elapsed})" task_card: title: "Hermes travaille" slash: reply_truncated: |2- _[Réponse tronquée : {count} partie(s) supplémentaire(s) dépassaient la limite des réponses éphémères de Slack.]_ running: "Exécution de `/{command}`…" handoff: seed: ":thread: Passation Hermes — *{name}*" matrix: handoff: default_name: "Session Hermes" media: image_download_failed: "Je n'ai pas pu télécharger l'image et l'envoyer sur Matrix. L'URL source n'est pas affichée car elle peut contenir des tokens privés." approval: typed_hint_once: "Répondez `!approve` pour exécuter une fois, ou `!deny` pour annuler." typed_hint_session: "Répondez `!approve session` pour approuver ce motif pour la session, `!approve` pour exécuter une fois, ou `!deny` pour annuler." typed_hint_always: "Répondez `!approve session` pour approuver ce motif pour la session, `!approve always` pour l'approuver définitivement, `!approve` pour exécuter une fois, ou `!deny` pour annuler." legend_intro: "Vous pouvez aussi cliquer sur une réaction pour approuver :" legend_once: "✅ = approuver une fois" legend_session: "🌀 = approuver pour cette session" legend_always: "♾️ = toujours approuver" legend_deny: "❎ = refuser" invalid_reaction: "Cette réaction n'est pas valide pour cette demande d'approbation." expired: "Cette demande d'approbation a expiré. Relancez la commande si vous souhaitez toujours l'approuver." picker: no_models: "Aucun modèle authentifié n'est disponible pour cette session." title: "⚙ **Configuration du modèle**" current_model: "Modèle actuel : `{model}`" provider: "Fournisseur : {provider}" react_model: "Réagissez pour choisir un modèle :" react_choice: "Réagissez pour choisir." current_suffix: "{label} ← actuel" invalid_model_reaction: "Cette réaction ne correspond à aucun des modèles proposés." invalid_choice_reaction: "Cette réaction ne correspond à aucun des choix proposés." verb_switch_model: "changer de modèle" verb_apply_selection: "appliquer la sélection" failed: "Impossible de {action} : {error}" reaction: unauthorized: "Seul un utilisateur Matrix autorisé peut utiliser ces contrôles." not_requester: "Seul l'utilisateur à l'origine de cette action peut utiliser ces contrôles." feishu: approval: action_session: "Session" action_always: "Toujours" resolved_once: "Approuvé une fois" resolved_session: "Approuvé pour la session" resolved_always: "Approuvé définitivement" resolved_deny: "Refusé" resolved_fallback: "Résolu" resolved_by_user: "{icon} **{label}** par {user}" update_prompt: title: "☤ La mise à jour attend votre réponse" default_hint: |2- Par défaut : `{default}` answer_yes: "✓ Oui" answer_no: "✗ Non" word_yes: "Oui" word_no: "Non" answered_title: "{icon} Réponse à la question de mise à jour : {answer}" answered_by: "Réponse de **{user}**" media: gif_downgraded: "[GIF converti en fichier]" gif_downgraded_caption: |- [GIF converti en fichier] {caption} google_chat: clarify: other_button: "Autre / saisir une réponse" header: "Question" question: "❓ {question}" typing: thinking: "Hermes réfléchit…" interrupted: "(interrompu)" no_reply: "(aucune réponse)" attachment_fallback: header: "⚠️ Je n'ai pas pu joindre **{filename}**." explain: "Google Chat n'autorise les pièces jointes que si le bot dispose de votre autorisation explicite (OAuth utilisateur). Il s'agit d'un consentement unique, donné depuis ce chat." activate: "**Pour l'activer :** envoyez `/setup-files` et suivez les instructions." host_path: "En attendant, le fichier se trouve sur l'hôte : `{path}`" setup_files: not_configured: |- 🔧 L'envoi natif des pièces jointes n'est **pas configuré**. **Étape 1 (une seule fois, sur l'hôte) :** créez des identifiants de client OAuth sur https://console.cloud.google.com/apis/credentials → *Créer des identifiants* → *ID client OAuth* → *Application de bureau*. Téléchargez le JSON. Puis, sur l'hôte, exécutez : ``` python -m plugins.platforms.google_chat.oauth --client-secret /path/to/client_secret.json ``` **Étape 2 :** revenez ici et envoyez `/setup-files start`. start_instructions: |- 1. Ouvrez cette URL dans votre navigateur et autorisez l'accès : {auth_url} 2. Après avoir cliqué sur *Autoriser*, votre navigateur n'arrivera pas à charger `http://localhost:1/?...&code=...`. C'est normal. 3. Copiez l'URL complète en échec depuis la barre d'adresse du navigateur et collez-la ici sous la forme : `/setup-files ` (ou seulement la valeur `code=...`). Astuce : cette URL contient votre autorisation d'accès — gardez-la confidentielle. start_failed: "❌ Impossible de générer l'URL OAuth. Consultez les journaux du gateway et vérifiez que le fichier client_secret.json est valide." exchange_failed: "❌ Échec de l'échange du token. Le code a peut-être expiré ou l'URL est malformée. Envoyez `/setup-files start` pour obtenir une nouvelle URL OAuth." revoke_completed: "Révocation terminée (certaines étapes ont peut-être été ignorées)." revoked: "Révoqué." helper_error: "❌ Erreur : {error}" revoke_error: "❌ Erreur lors de la révocation : {error}" who_shared: "partagé (ancien mode)" active: |- ✅ L'envoi natif des pièces jointes est **actif** pour `{who}`. Token : `{token_path}` Envoyez `/setup-files revoke` pour le désactiver. not_authorized_yet: "🔧 Les identifiants client sont enregistrés, mais vous n'avez pas encore autorisé l'accès. Envoyez `/setup-files start` pour commencer." no_client_credentials: "⚠️ Aucun identifiant client enregistré pour ce profil. Envoyez `/setup-files` (sans argument) pour obtenir les instructions de configuration." done_output: |- ✅ Terminé. ``` {output} ``` authorized: "✅ Autorisé ! L'envoi natif des pièces jointes est désormais actif. Essayez de me demander de vous envoyer un PDF." exchanged_not_loaded: |- ⚠️ Token échangé, mais le gateway n'a pas pu charger les nouveaux identifiants en mémoire. Redémarrez le gateway et le token situé dans `{token_path}` sera pris en compte. Sortie de l'assistant : ``` {output} ``` teams: approval: resolved_once: "✅ Autorisé (une fois)" resolved_session: "✅ Autorisé (session)" resolved_always: "✅ Toujours autorisé" resolved_deny: "❌ Refusé" unknown_action: "Action inconnue." requires_allowlist: "⛔ Les boutons d'approbation nécessitent que TEAMS_ALLOWED_USERS soit configuré." summary: title: "Réunion {meeting_id}" title_fallback: "résumé" heading: "Résumé" summary_line: "Résumé : {summary}" empty: "Aucun résumé disponible." none_item: "Aucun" key_decisions: "Décisions clés" action_items: "Actions à mener" risks: "Risques" line: pending: still_thinking: "🤔 Toujours en cours de réflexion. Appuyez ci-dessous pour récupérer la réponse quand elle sera prête." button_label: "Voir la réponse" delivered: "Déjà répondu ✅" interrupted: "L'exécution a été interrompue avant la fin." expired: "Cette demande a expiré — renvoyez votre message." standalone: attachments_not_deliverable: "[{count} pièce(s) jointe(s) générée(s) ; non transmissible(s) depuis cron]" wecom: media: kind_image: "Image" kind_video: "Vidéo" kind_voice: "Message vocal" file_too_large: "La taille du fichier ({size_mb} Mo) dépasse la limite de 20 Mo de WeCom et il ne peut pas être envoyé. Essayez de compresser le fichier ou de réduire sa taille." voice_format_downgraded: "Le format vocal {content_type} n'est pas pris en charge (WeCom n'accepte que l'AMR) ; envoyé sous forme de fichier à la place." size_downgraded: "La taille de {label} ({size_mb} Mo) dépasse la limite de {cap} ; envoyé sous forme de fichier à la place." email: image_line: "Image : {url}" standalone_subject: "Hermes Agent" dingtalk: emotion: thinking: "🤔Réflexion" done: "🥳Terminé" irc: quit_message: "Hermes Agent s'arrête" standalone_quit: "livré" homeassistant: notification_title: "Hermes Agent" relay: confirm_approve_once: "Approuver une fois" confirm_always_approve: "Toujours approuver" confirm_cancel: "Annuler" prompt_other: "✏️ Autre (saisir)" prompt_expired: ⌛ Cette invite n'attend plus de réponse. Envoyez votre réponse comme un message normal. slash: approve: description: "Approuver une commande dangereuse en attente" bg: description: "Exécuter un prompt dans une session distincte en arrière-plan" insights: description: "Afficher des statistiques et analyses d'utilisation" reload_mcp: description: "Recharger les serveurs MCP depuis la configuration" resume: description: "Reprendre une session précédemment nommée" sethome: description: "Définir cette conversation comme canal principal" update: description: "Mettre à jour Hermes Agent vers la dernière version" category: session: "Session" configuration: "Configuration" info: "Infos" tools_skills: "Outils et skills" plugins: "Plugins" exit: "Quitter" context: "Contexte" background_automation: "Arrière-plan et automatisation" shared: usage_suffix: "{description} (usage : /{name} {args_hint})" alias_for: "{description} (alias de /{name})" alias_note: " (alias : {aliases})" slack_alias_for: "Alias de /{name} — {description}" plugin_default_desc: "Exécuter /{name}" plugin_command_desc: "Commande de plugin" hermes: description: "Parler à Hermes ou exécuter une sous-commande" start: description: "Accuser réception des pings de démarrage de la plateforme sans répondre" new: description: "Démarrer une nouvelle session (nouvel ID de session + historique)" topic: description: "Activer ou inspecter les sessions par topic dans les DM Telegram" clear: description: "Effacer l'écran et démarrer une nouvelle session" redraw: description: "Forcer un rafraîchissement complet de l'interface (corrige les décalages du terminal)" history: description: "Afficher l'historique de la conversation" save: description: "Exporter la conversation en cours (/save seul affiche l'usage)" retry: description: "Réessayer le dernier message (le renvoyer à l'agent)" prompt: description: "Rédiger votre prochain prompt dans $EDITOR (markdown), puis l'envoyer" undo: description: "Revenir N tours utilisateur en arrière et reformuler (1 par défaut)" title: description: "Définir un titre pour la session en cours" handoff: description: "Transférer cette session vers une plateforme de messagerie (Telegram, Discord, etc.)" branch: description: "Créer une branche de la session en cours (nouveau fil sur Discord/Telegram/Slack/Matrix ; --here reste ici)" worktree: description: "Afficher, lister, créer ou nettoyer des worktrees git isolés" compress: description: "Compresser le contexte de la conversation (ajoutez 'here [N]' pour garder les N derniers tours ; --preview montre le résultat attendu)" rollback: description: "Lister ou restaurer les points de contrôle du système de fichiers (vos modifications manuelles sont conservées ; --all les écrase)" snapshot: description: "Créer ou restaurer des instantanés de la configuration et de l'état de Hermes" export: description: "Exporter un profil (configuration, skills, thème) vers une archive partageable" import: description: "Importer une archive de profil partagée comme nouveau profil" stop: description: "Tuer tous les processus en arrière-plan en cours" pause: description: "Suspendre tout nouveau travail globalement (arrêt d'urgence) ; '/pause off' reprend" deny: description: "Refuser une commande dangereuse en attente (avec un motif, facultatif)" btw: description: "Poser une question annexe sur la conversation en cours sans l'interrompre" agents: description: "Afficher les agents actifs et les tâches en cours" journey: description: "Ouvrir la chronologie du parcours d'apprentissage" queue: description: "Mettre un prompt en file pour le prochain tour, ou list/edit/rm/move/clear pour gérer la file" steer: description: "Injecter un message après le prochain appel d'outil sans interrompre" goal: description: "Définir un objectif permanent sur lequel Hermes travaille au fil des tours jusqu'à l'atteindre" heartbeat: description: "Définir un prompt récurrent qui relance cette session quand elle est inactive" refine: description: "Passer en revue cette conversation maintenant et enregistrer les leçons en mémoire/skills" review: description: "Lancer un sous-agent indépendant pour faire la revue du travail discuté (PR, code, docs)" loop: description: "Relancer un prompt à intervalle régulier dans cette session" plan: description: "Rédiger un plan d'implémentation markdown dans .hermes/plans/ sans rien exécuter" moa: description: "Exécuter un prompt via le preset Mixture of Agents par défaut, puis restaurer votre modèle" subgoal: description: "Ajouter ou gérer des critères supplémentaires sur l'objectif actif" status: description: "Afficher les infos de session, modèle, tokens et contexte" egress: description: "Afficher l'état du proxy de sortie Docker" context: description: "Afficher une vue détaillée de la fenêtre de contexte : jauge d'utilisation, répartition par catégorie, statistiques de compression et débit" whoami: description: "Afficher votre niveau d'accès aux commandes slash (admin / utilisateur)" profile: description: "Afficher le nom du profil actif et son répertoire principal" sessions: description: "Parcourir et reprendre les sessions précédentes" config: description: "Afficher la configuration actuelle" model: description: "Changer de modèle (pour la session ; --global pour le conserver)" codex-runtime: description: "Activer/désactiver le runtime codex app-server pour les modèles OpenAI/Codex" personality: description: "Définir une personnalité prédéfinie" statusbar: description: "Afficher/masquer la barre d'état contexte/modèle" battery: description: "Afficher/masquer un indicateur de batterie coloré dans la barre d'état" timestamps: description: "Afficher/masquer les horodatages [HH:MM] sur les messages et /history" diff: description: "Afficher les modifications git du répertoire de travail" verbose: description: "Faire défiler l'affichage de progression des outils : off -> new -> all -> verbose" focus: description: "Activer/désactiver la vue focus — n'afficher que votre prompt et la réponse finale" footer: description: "Afficher/masquer le pied de page de métadonnées du gateway sur les réponses finales" yolo: description: "Activer/désactiver le mode YOLO (ignorer toutes les approbations de commandes dangereuses)" approvals: description: "Afficher ou définir le mode d'approbation persistant des commandes dangereuses" reasoning: description: "Gérer l'effort de raisonnement et son affichage" fast: description: "Mode rapide — OpenAI Priority Processing / Anthropic Fast Mode (normal/fast/auto/cold/ultrafast)" skin: description: "Afficher ou changer le skin/thème d'affichage" indicator: description: "Choisir le style de l'indicateur d'activité du TUI" voice: description: "Basculer le mode vocal" wake: description: "Activer/désactiver l'écoute du mot d'activation 'Hey Hermes'" busy: description: "Contrôler le comportement des messages pendant que Hermes travaille" tools: description: "Gérer les outils : /tools [list|disable|enable] [nom...]" toolsets: description: "Lister les toolsets disponibles" skills: description: "Rechercher, installer, inspecter ou gérer des skills" memory: description: "Passer en revue les écritures mémoire en attente / activer ou désactiver la validation" bundles: description: "Lister les bundles de skills (alias / pour plusieurs skills)" pet: description: "Activer/désactiver ou adopter une mascotte petdex (/pet, /pet list, /pet )" hatch: description: "Générer un nouvel animal petdex à partir d'une description" learn: description: "Apprendre une skill réutilisable à partir de ce que vous décrivez (dossiers, URL, cette conversation, notes)" init: description: "Générer ou mettre à jour les instructions projet AGENTS.md à partir d'un scan du dépôt" cron: description: "Gérer les tâches planifiées" suggestions: description: "Passer en revue les automatisations suggérées (accepter/ignorer)" blueprint: description: "Configurer une automatisation à partir d'un modèle blueprint" curator: description: "Maintenance des skills en arrière-plan (status, run, pin, archive, list-archived)" kanban: description: "Tableau de collaboration multi-profils (tâches, liens, commentaires)" reload: description: "Recharger les variables .env dans la session en cours" reload-mcp: description: "Recharger les serveurs MCP depuis la configuration" reload-skills: description: "Réanalyser ~/.hermes/skills/ pour détecter les skills installées ou supprimées" browser: description: "Connecter les outils navigateur à votre navigateur Chromium via CDP, ou passer en mode Browser Use" plugins: description: "Lister les plugins installés et leur état" commands: description: "Parcourir toutes les commandes et skills (paginé)" help: description: "Afficher les commandes disponibles (/help skills liste les commandes de skills, /help filtre)" palette: description: "Ouvrir la palette de commandes à recherche floue (aussi Ctrl+P)" restart: description: "Redémarrer proprement le gateway après avoir laissé finir les exécutions actives" usage: description: "Afficher la consommation de tokens et les limites de débit ; `reset` utilise une réinitialisation de limite Codex mise en réserve" subscription: description: "Voir votre forfait Nous et le modifier dans le navigateur" login: description: "Se connecter avec un compte Nous (conserve vos connecteurs)" topup: description: "Afficher votre solde Nous et gérer la facturation sur le portail" platforms: description: "Afficher l'état du gateway et des plateformes de messagerie" platform: description: "Suspendre, reprendre ou lister une plateforme gateway en échec" copy: description: "Copier la dernière réponse de l'assistant dans le presse-papiers" paste: description: "Joindre l'image présente dans votre presse-papiers" image: description: "Joindre un fichier image local à votre prochain prompt" version: description: "Afficher la version de Hermes Agent" debug: description: "Envoyer un rapport de débogage (infos système + journaux) et obtenir des liens partageables" quit: description: "Quitter la CLI (--delete supprime aussi l'historique de session)" cli: billing: load_failed: "{label} : {error}" load_failed_label: "Facturation indisponible" not_logged_in: "Non connecté à Nous Portal." run_portal_then: "Lancez `hermes portal` pour vous connecter, puis {cmd}." org_line: "Org : {org}" org_line_role: "Org : {org} · {role}" bar_plan_label: "abonnement" bar_topup_label: "recharge" bar_pct_used: " · {pct} % consommés" bar_plan: "{label}[{bar}] ${remaining} restants sur ${total}{pct}" bar_topup: "{label}[{bar}] ${remaining} · sans expiration" total_spendable: "Total disponible : ${amount}" one_time_setup: "! Configuration unique" allow_remote_spending_title: "Autoriser les Dépenses à distance" allow_remote_spending_detail: "Ouvre votre navigateur pour autoriser ce terminal." choice_allow_remote_spending: "Autoriser les Dépenses à distance" desc_allow_remote_spending: "ouvrir votre navigateur pour autoriser" choice_not_now: "Pas maintenant" desc_not_now: "annuler" opening_browser_remote_spending: "Ouverture du navigateur pour autoriser les Dépenses à distance…" couldnt_allow_remote_spending: "Impossible d'autoriser les Dépenses à distance : {error}" remote_spending_allowed: "Dépenses à distance autorisées." portal_line: "Portail : {url}" open_this_url: "Ouvrez cette URL : {url}" manage_on_portal_url: "Gérer sur le portail : {url}" no_manage_url: "Aucune URL de gestion disponible — votre portail est-il configuré ?" stepup_stale: "Les Dépenses à distance ne sont toujours pas actives pour ce terminal — l'autorisation n'a pas été prise en compte. Réessayez, ou effectuez cette modification sur le portail." something_went_wrong: "Une erreur s'est produite." under_five: "moins de 5 $" plan_free: "Gratuit" renews_suffix: " · renouvellement le {date}" plan_line: "Abonnement : {plan}{renews}" free_models_only_hint: "> Gratuit · modèles gratuits uniquement. Lancez /subscription pour accéder aux modèles payants." low_balance_usage: "! Solde faible · {amount} restants. Lancez /topup ou /subscription." usage_cta: "Lancez /subscription pour changer d'abonnement · /topup pour recharger votre solde" choice_cancel: "Annuler" choice_back: "Retour" choice_go_back: "Revenir en arrière" choice_close: "Fermer" desc_do_nothing: "ne rien faire" desc_do_not_charge: "ne pas débiter" choice_manage_on_portal: "Gérer sur le portail" desc_open_billing_page: "ouvrir la page de facturation dans votre navigateur" topup_header: "Recharger · solde {balance}" topup_title: "Recharger votre solde" auto_reload_on_line: "Recharge automatique : activée — sous {threshold} → recharger jusqu'à {reload_to}" auto_reload_off_line: "Recharge automatique : désactivée" card_line: "Carte : {card}" no_saved_card_add_funds_hint: "Aucune carte enregistrée — « Ajouter des fonds » vous guide pour en ajouter une." actions_require_admin: "Les actions de facturation nécessitent un admin ou propriétaire de l'org." remote_spending_off_for_org: "Les dépenses à distance sont désactivées pour cette org." killswitch_reason_overview: "Un admin de facturation peut les activer depuis la page Hermes Agent du portail pour ajouter des fonds ici." killswitch_reason_buy: "Un admin de facturation peut les activer depuis la page Hermes Agent du portail avant d'ajouter des fonds." add_funds_now_hint: "Ajouter des fonds maintenant — un débit unique, crédité sur votre solde aujourd'hui." refill_when_low_amounts: "Recharger quand le solde est bas — débite {reload_to} automatiquement lorsque votre solde passe sous {threshold}." refill_when_low_generic: "Recharger quand le solde est bas — débite votre carte automatiquement lorsque votre solde passe sous le montant que vous définissez." choice_add_funds: "Ajouter des fonds" desc_add_funds: "un débit unique, crédité sur votre solde aujourd'hui" choice_auto_reload: "Recharge automatique" desc_auto_reload: "recharger automatiquement quand votre solde est bas" choice_monthly_limit: "Limite mensuelle" desc_monthly_limit: "afficher le plafond de dépenses mensuel (lecture seule)" cancelled: "Annulé." cancelled_yellow: "🟡 Annulé." cancelled_no_funds: "Annulé. Aucun fonds ajouté." no_portal_url: "Aucune URL de portail disponible." complete_in_browser: "Terminez les modifications de facturation dans le navigateur." add_card_first: "Ajoutez d'abord une carte" add_card_title: "Ajouter une carte" no_saved_card: "Aucune carte enregistrée." no_saved_card_short: "Aucune carte enregistrée" no_saved_card_lower: "aucune carte enregistrée" add_card_once_hint: "Ajoutez une carte une seule fois sur la page de facturation du portail — ensuite, vous pourrez recharger directement depuis le terminal." add_card_then_recheck: "Ajoutez la carte sur la page de facturation, puis choisissez « vérifier à nouveau » ici." card_found_continuing: "Carte trouvée : {card} — on continue." still_no_card: "Toujours aucune carte enregistrée — terminez son ajout sur le portail, puis vérifiez à nouveau." choice_add_card_on_portal: "Ajouter une carte sur le portail" desc_add_card_on_portal: "ouvre la page de facturation dans votre navigateur" choice_recheck_card: "Je l'ai ajoutée — vérifier à nouveau" desc_recheck_card: "revérifier la carte et continuer" add_funds: "Ajouter des fonds" presets: "Prédéfinis : {presets}" run_interactive_to_purchase: "Lancez ceci dans la CLI interactive pour finaliser un achat." desc_one_time_purchase: "achat unique de crédits" choice_custom_amount: "Montant personnalisé…" desc_custom_amount: "saisir votre propre montant" payment_line: "Paiement : {card}" amount_prompt: "Montant (USD) :" invalid_selection: "🔴 Sélection invalide." confirm_purchase: "Confirmer l'achat" total_line: "Total : {amount}" portal_card_will_be_charged: "Votre carte enregistrée sur le portail sera débitée." consent_charge: "En confirmant, vous autorisez Nous Research à débiter votre carte." choice_pay_now: "Payer {amount} maintenant" desc_submit_charge: "soumettre le débit" desc_manage_card_billing: "gérer votre carte / facturation dans le navigateur" run_interactive_to_confirm: "Lancez la CLI interactive pour confirmer un achat." pay_question: "Payer {amount} ?" no_charge_id: "Aucun identifiant de débit renvoyé ; veuillez vérifier sur le portail." charge_submitted: "Débit soumis — confirmation du règlement…" could_not_check_charge: "🔴 Impossible de vérifier le débit : {error}" added_to_balance: "✓ {amount} ajoutés à votre solde." still_processing: "🟡 Toujours en cours après 5 minutes — il s'agit d'un délai dépassé, pas d'un échec. Vérifiez /billing ou le portail d'ici peu." charge_failed_authentication_required: "🔴 Votre banque exige une vérification (3DS). Effectuez-la sur le portail pour finaliser cet achat." charge_failed_payment_method_expired: "🔴 Votre carte a expiré. Mettez-la à jour sur le portail." charge_failed_card_declined: "🔴 Votre carte a été refusée. Essayez une autre carte sur le portail." charge_failed_generic: "🔴 Le débit n'a pas abouti ({reason})." charge_error_no_payment_method: "💳 Aucune carte enregistrée — rechargez et gérez la facturation sur le portail." charge_error_remote_spending_disabled: "Les dépenses à distance sont désactivées pour ce compte — un admin de facturation peut les activer depuis la page Hermes Agent du portail." charge_error_role_required: "L'ajout de fonds nécessite un admin ou propriétaire de l'org. Demandez à un admin, ou gérez sur le portail." charge_error_idempotency_conflict: "🔴 Cette clé de débit a déjà été utilisée pour un montant différent. Démarrez une nouvelle recharge." revoked_by_admin: "Un admin a stoppé les dépenses de ce terminal." revoked_by_you: "Vous avez stoppé les dépenses de ce terminal." revoked_reconnect: "🔴 {who} Reconnectez-vous pour les rétablir — lancez `hermes portal` pour réautoriser." session_logged_out: "🔴 Votre session a été déconnectée. Lancez `hermes portal` pour vous reconnecter." monthly_cap_reached_headroom: "🔴 Plafond de dépenses mensuel atteint — ${remaining} de marge restante." monthly_cap_reached: "🔴 Plafond de dépenses mensuel atteint." try_again_in_min: " (réessayez dans ~{minutes} min)" too_many_charges: "🟡 Trop de débits en ce moment{mins}. Il ne s'agit pas d'un échec de paiement." remote_spending_needs_approval: "🔴 Les Dépenses à distance nécessitent une approbation — lancez /topup pour les autoriser, puis réessayez." your_topup: "votre recharge" charge_stepup_explain: "Pour débiter depuis ce terminal, autorisez une seule fois les Dépenses à distance. Votre navigateur s'ouvre pour autoriser, puis {amount} reprend directement ici." charge_stepup_noninteractive: "Lancez `hermes portal` et autorisez les Dépenses à distance, puis réessayez." charge_stepup_declined: "Aucun débit effectué. Lancez /topup quand vous voudrez autoriser les Dépenses à distance." charge_stepup_not_granted: "Impossible d'autoriser les Dépenses à distance — un admin ou propriétaire de l'org doit les approuver. Votre carte n'a pas été débitée." allowed_but_org_off: "Les Dépenses à distance sont autorisées pour ce terminal, mais toujours désactivées pour cette org. Un admin de facturation peut les activer depuis la page Hermes Agent du portail, puis relancez /topup." allowed_no_card: "Dépenses à distance autorisées — mais aucune carte n'est encore enregistrée." topup_on_portal_to_continue: "Rechargez et gérez la facturation sur le portail pour continuer." allowed_run_topup: "Dépenses à distance autorisées. Lancez /topup pour continuer." choice_resume_topup: "Reprendre la recharge de {amount}" desc_resume_topup: "finaliser l'achat en attente" resume_topup_title: "Reprendre votre recharge" resume_topup_detail: "{amount} est prêt à être finalisé — appuyez sur Entrée pour reprendre." resuming_topup: "Reprise de votre recharge — confirmation du règlement…" auto_reload: "Recharge automatique" auto_reload_hint: "Ajoute automatiquement des fonds quand votre solde est bas." card_on_file: "Carte enregistrée : {card}" no_saved_card_manage_portal: "Aucune carte enregistrée — gérez la facturation sur le portail." auto_reload_rule: "sous {threshold} → recharger jusqu'à {reload_to}" auto_reload_rule_cap: "Sous {threshold} → recharger jusqu'à {reload_to}" currently: "Actuellement : {rule}" auto_reload_on_detail: "Activée — {rule}" run_interactive_to_configure: "Lancez la CLI interactive pour configurer la recharge automatique." choice_edit_thresholds: "Modifier les seuils" desc_edit_thresholds: "changer quand / de combien recharger" choice_turn_off: "Désactiver" desc_turn_off: "désactiver la recharge automatique" choice_agree_turn_on: "Accepter et activer" desc_agree_turn_on: "activer la recharge automatique" amount_prompt_labeled: "{label} (USD)" threshold_label: "Quand le solde passe sous" reload_to_label: "Recharger le solde jusqu'à" reload_must_exceed_threshold: "🔴 Le montant de recharge doit être supérieur au seuil." auto_reload_consent: "En confirmant, vous autorisez Nous Research à débiter {card} chaque fois que votre solde atteint {threshold}. Désactivable à tout moment ici ou sur le portail." turn_on_auto_reload_question: "Activer la recharge automatique ?" auto_reload_enabled: "✅ Recharge automatique activée : sous {threshold} → recharger jusqu'à {reload_to}." auto_reload_disabled: "✅ Recharge automatique désactivée." monthly_spend_limit: "Limite de dépenses mensuelle" no_monthly_cap: "Aucun plafond mensuel visible (géré sur le portail)." default_ceiling_suffix: " (plafond par défaut)" used_this_month: "{spent} sur {limit} consommés ce mois-ci{ceiling}" monthly_limit_read_only: "La limite mensuelle se règle sur le portail — le terminal l'affiche en lecture seule." subscription: load_failed_label: "Impossible de charger l'abonnement" team_header: "Abonnement d'équipe" a_team_org: "une organisation d'équipe" team_connected: "Ce terminal est connecté à {org}. Les équipes fonctionnent sur un solde partagé · utilisez /topup pour ajouter des fonds." personal_note: "Les abonnements personnels sont rattachés à votre compte personnel." your_plan: "votre forfait" cancels: "se résilie" end_of_billing_period: "la fin de la période de facturation" end_of_cycle: "la fin du cycle" status_flip_cancels: " → résiliation" status_flip_to: " → {tier}" status_left: " · ${amount} restants" status_view_only: " · lecture seule" status_renews: " · renouvellement le {date}" status_line: "Forfait : {plan}{flip}{left}{tail}" status_free: "Forfait : Gratuit · modèles gratuits uniquement" scheduled_change: "Changement planifié" scheduled_change_line: "{from_plan} ──▶ {to_plan} {when}" scheduled_when: "· {when}" keep_until_then: "Vous conservez {plan} (et ses crédits) jusque-là." paid_models_need_subscription: "> Les modèles payants nécessitent un abonnement. Souscrivez-en un pour y accéder." low_balance: "! Solde faible · {amount} restants. Rechargez ou passez à un forfait supérieur pour éviter une coupure en cours d'exécution." plan_changes_need_admin: "Changer de forfait requiert un admin/propriétaire de l'org." manage_url_line: "Gérez votre abonnement : {url}" open_then_rerun: "Ouvrez-la dans votre navigateur, puis relancez /subscription." start_subscription: "Souscrire un abonnement" choose_plan: "Choisir un forfait" start_opens_portal: "Souscrire un abonnement ouvre le portail pour ajouter votre carte." desc_start_on_portal: "souscrire {name} sur le portail" pick_plan_detail: "Choisissez un forfait pour l'ouvrir sur le portail." cancelled_no_plan_started: "🟡 Annulé. Aucun forfait souscrit." opening_portal_to_start: "Ouverture du portail pour souscrire {plan}…" open_url_to_start: "Ouvrez cette URL pour souscrire {plan} : {url}" finish_in_browser: "Terminez dans votre navigateur, puis relancez /subscription." manage_your_subscription: "Gérer votre abonnement" desc_open_subscription_page: "ouvrir la page d'abonnement dans votre navigateur" choice_copy_link: "Copier le lien" desc_copy_link: "copier l'URL de gestion de l'abonnement dans le presse-papiers" copied: "📋 Copié : {url}" manage_url: "URL de gestion : {url}" choice_keep_plan: "Conserver {plan} (annuler le changement planifié)" desc_keep_plan: "annuler le changement en attente" choice_change_plan: "Changer de forfait" desc_change_plan: "passer à un forfait supérieur ou inférieur depuis le terminal" choice_cancel_subscription: "Résilier l'abonnement" desc_cancel_subscription: "planifier la résiliation à la fin de la période" closed_no_change: "🟡 Fermé. Aucun changement de forfait." no_other_plans: "Aucun autre forfait n'est disponible pour le moment." direction_upgrade: "supérieur" direction_downgrade: "inférieur" tier_row: "{row} · {direction}" desc_switch_to: "passer à {name}" change_plan_title: "Changer de forfait" current_pick_detail: "Actuel : {plan}. Choisissez un forfait pour prévisualiser l'effet." cancelled_no_plan_change: "🟡 Annulé. Aucun changement de forfait." checking_change: "Vérification du changement…" the_selected_plan: "le forfait sélectionné" already_on_nothing_to_change: "Vous êtes déjà sur {plan} — rien à changer." cannot_confirm_here: "Ce changement ne peut pas être confirmé ici — gérez-le sur le portail." confirm_plan_change: "Confirmer le changement" tag_charged_now: "· facturé maintenant" tag_scheduled_not_today: "· planifié · pas aujourd'hui" charged_amount_now: "{amount} maintenant (au prorata)" charged_prorated_now: "le montant au prorata maintenant" upgrade_will_be_charged: "Passage à {plan}. Vous serez facturé {charged}." card_on_subscription_charged: "La carte associée à votre abonnement sera débitée." named_card_on_subscription_charged: "{card} — la carte associée à votre abonnement — sera débitée." choice_pay_and_upgrade: "Payer {amount} et monter maintenant" choice_upgrade_now_prorated: "Monter maintenant (au prorata)" desc_charge_and_upgrade: "débiter + monter maintenant" change_takes_effect: "Passage à {plan} — prend effet {when}. Rien à payer maintenant ; vous conservez votre forfait actuel jusque-là." choice_schedule_change: "Planifier le passage à {plan}" desc_apply_change: "appliquer ce changement" desc_do_not_change: "ne rien changer" monthly_credits_change: "Évolution des crédits mensuels : {delta}." confirm_cancellation: "Confirmer la résiliation" cancel_stays_active_until: "Résilier {plan} — il reste actif jusqu'au {end}, puis ne sera pas renouvelé." keep_remaining_credits: "Vous conservez vos crédits restants pour cette période. Vous pouvez reprendre avant qu'elle ne se termine." cancel_subscription_question: "Résilier l'abonnement ?" desc_keep_your_plan: "conserver votre forfait" cancelled_plan_unchanged: "🟡 Annulé. Votre forfait est inchangé." your_new_plan: "votre nouveau forfait" upgrade_already_on_tier: "Vous êtes déjà sur {name}." upgrade_upgraded: "Passage à {name} effectué. Vos nouveaux crédits mensuels arrivent dans un instant." upgrade_requires_action: "🟡 Cette mise à niveau nécessite une vérification supplémentaire (3DS). Terminez-la sur le portail." upgrade_payment_failed: "🔴 Votre carte a été refusée. Mettez à jour votre moyen de paiement sur le portail et réessayez." pending_scheduled: "Planifié — votre forfait ne change pas aujourd'hui. Vous le conservez jusqu'à la fin de la période de facturation, puis il bascule." pending_cancel_scheduled: "Planifié — votre forfait reste actif jusqu'à la fin de la période de facturation, puis il est résilié. Rien ne change aujourd'hui." pending_resumed: "Annulé — vous restez sur votre forfait actuel." rerun_to_review: "Relancez /subscription à tout moment pour le consulter." stepup_explain: "Pour changer de forfait depuis le terminal, autorisez une fois Remote Spending. Votre navigateur s'ouvre pour l'autorisation, puis votre changement reprend directement ici." stepup_noninteractive: "Exécutez `hermes portal` et autorisez Remote Spending, puis relancez /subscription." stepup_declined: "Aucun changement effectué. Autorisez Remote Spending quand vous serez prêt." stepup_not_granted: "Impossible d'autoriser Remote Spending — un administrateur ou propriétaire doit l'approuver pour cette organisation." remote_spending_not_allowed_yet: "🟡 Remote Spending n'est pas encore autorisé. Autorisez-le, puis réessayez." upgrade_ambiguous: "🟡 Impossible de confirmer la mise à niveau — votre carte a peut-être été débitée." rerun_to_check_plan: "Relancez /subscription pour vérifier votre forfait avant de réessayer." model: switched: "✓ Modèle changé : {model}" acting_model: "Modèle actif (facturé pour l'exécution) : {model}" reasoning_effort: "Effort de raisonnement : {effort}" reasoning_effort_saved: "Effort de raisonnement : {effort} (enregistré dans la configuration)" saved: "Enregistré dans config.yaml" saved_global: "Enregistré dans config.yaml (--global)" next_turn_only: "(prochain tour uniquement — rétabli après une réponse)" session_only: "(cette session uniquement — ajoutez --global pour conserver)" effort_none: "none (désactiver le raisonnement)" effort_keep_current: "Conserver l'effort actuel" no_authenticated_providers: "Aucun fournisseur authentifié trouvé." usage_switch: "changer de modèle (cette session)" usage_switch_global: "changer de modèle et l'enregistrer par défaut" usage_switch_once: "changer pour le prochain tour uniquement" usage_switch_session: "changer pour cette session uniquement" usage_switch_provider_model: "changer de fournisseur + modèle" usage_switch_reasoning: "changer et définir l'effort de raisonnement" usage_switch_provider: "changer de fournisseur" usage_refresh: "recharger les listes de modèles en direct" choice_switch_anyway: "Changer quand même" desc_switch_anyway: "Utiliser ce modèle pour la session Hermes en cours." choice_cancel: "Annuler" desc_keep_current_model: "Conserver le modèle actuel." switch_cancelled: "Changement de modèle annulé." selection_failed: "✗ Échec de la sélection du modèle : {error}" switch_failed: "⚠ Échec du passage au modèle {model} ({error}) ; {old_model} est conservé." cleared_picker_cache: "Cache du sélecteur de modèles vidé. Actualisation..." moa_one_shot_queued: "MoA en une passe mis en file avec le preset {preset} ; le modèle précédent sera rétabli après ce tour." normalized_model: "Modèle '{old}' normalisé en '{new}' pour {provider}." normalized_copilot_model: "Modèle Copilot '{old}' normalisé en '{new}'." stripped_provider_prefix: "Préfixe de fournisseur retiré de '{old}' ; utilisation de '{new}' pour {provider}." restored_from_session: "Modèle rétabli depuis la session : {model}" could_not_load_config: "❌ impossible de charger la configuration : {error}" tip_reset_new_session: "Astuce : `/reset` démarre immédiatement une nouvelle session." single_query: query_label: "Requête :" kanban_run_reclaimed: "kanban : l'exécution de ce worker a été reprise avant son démarrage ; sortie" shared: cancel: "Annuler" back: "← Retour" unknown: "inconnu" unknown_error: "Erreur inconnue" noun_model: "modèle" label_enabled: "activé" label_disabled: "désactivé" label_yes: "oui" label_no: "non" label_on: "on" label_off: "off" label_on_upper: "ON" label_off_upper: "OFF" label_value: "{label} : {value}" just_now: "à l'instant" ago_seconds: "il y a {seconds} s" ago_minutes: "il y a {minutes} min" ago_hours: "il y a {hours} h" duration_s: "{seconds}s" duration_m: "{minutes}m" duration_ms: "{minutes}m {seconds}s" duration_ms_compact: "{minutes}m{seconds}s" duration_hm: "{hours}h {minutes}m" duration_hms: "{hours}h {minutes}m {seconds}s" duration_dhm: "{days}j {hours}h {minutes}m" duration_m_rest: "{minutes}m {rest}" duration_hm_rest: "{hours}h {minutes}m {rest}" no_active_agent: "(._.) Aucun agent actif -- envoyez d'abord un message." n_more: "{count} de plus" more_not_shown: "autres non affichés" yes_no_default_yes: "O/n" yes_no_default_no: "o/N" yes_initial: "o" tui: approval_once: "Autoriser une fois" approval_session: "Autoriser pour cette session" approval_always: "Ajouter à la liste d'autorisation permanente" approval_deny: "Refuser" approval_view: "Commande complète" approval_title: "⚠️ Commande dangereuse" approval_choose_full: "… (choisir {label})" approval_command_truncated: "… (commande tronquée — utilisez /logs ou /debug pour le texte complet)" approval_description_truncated: "… (description tronquée)" confirm_title: "Confirmer l'action" confirm_footer: "Tapez 1/2/3 ou utilisez ↑/↓ puis Entrée. Échap/Ctrl+C annule." detail_truncated: "… (détail tronqué)" clarify_title: "{agent_name} a besoin de votre réponse" clarify_question_count_one: "{count} question" clarify_question_count_other: "{count} questions" clarify_other_answer: "Autre : {text}" clarify_other_type_below: "Autre (saisir ci-dessous)" clarify_other_type_answer: "Autre (saisissez votre réponse)" clarify_guidance: "Tapez votre réponse dans le prompt ci-dessous, puis appuyez sur Entrée." picker_title_provider: "⚙ Sélecteur de modèle — Choisir un fournisseur" picker_provider_row_one: "{name} ({count} modèle)" picker_provider_row_other: "{name} ({count} modèles)" picker_current_marker: " ← actuel" picker_current_hint: "Actuel : {model} sur {provider}" picker_title_effort: "⚙ Sélecteur de modèle — Effort de raisonnement pour {model}" picker_current_labeled: "{label} ← actuel" picker_effort_hint: "S'applique avec le changement de modèle (même portée) — Entrée pour choisir" picker_title_models: "⚙ Sélecteur de modèle — {provider}" picker_provider_fallback: "Fournisseur" picker_filter_hint: "Filtre : {query}▏ ({shown}/{total} résultats — tapez pour affiner, Retour arrière pour effacer)" picker_select_hint: "Sélectionnez un modèle ({count} disponibles) — tapez pour filtrer" picker_empty: "Aucun modèle listé pour ce fournisseur. Utilisez Retour ou Annuler." palette_title: "⚙ Palette de commandes" palette_filter_hint: "Filtre : {query}▏ ({shown}/{total} résultats — Entrée insère, Échap annule)" palette_hint: "Tapez pour filtrer {total} commandes — ↑/↓ puis Entrée insère, Échap annule" palette_empty: "(aucune commande correspondante)" vault_code_title: "🔐 Code de vérification pour {site}" vault_code_body: |- {site} demande un code à usage unique (SMS, e-mail ou application d'authentification). Tapez le code et appuyez sur Entrée ; {agent_name} le saisit dans la page pour vous. Entrée sur une ligne vide passe cette étape. Le modèle ne voit jamais le code. vault_save_title: "🔐 Enregistrer l'identifiant pour {site}" vault_save_body: |- L'agent a atteint une page de connexion sans identifiant enregistré pour ce site. Tapez l'e-mail / nom d'utilisateur avec lequel vous vous connectez (affiché), puis Entrée. Entrée sur une ligne vide passe cette étape. Rien ici n'est montré au modèle. vault_save_pw_body: |- Maintenant le mot de passe (masqué). Il est chiffré sur cette machine, lié à {origin}, et rempli dans la page sans que le modèle ne le voie jamais. Entrée sur une ligne vide passe cette étape. vault_unlock_title: "🔐 Déverrouiller {backend}" vault_unlock_body: |- L'agent veut se connecter à un site avec un identifiant enregistré dans {backend}. Tapez votre mot de passe principal (masqué) pour le déverrouiller pour cette session. Entrée sur une ligne vide le laisse verrouillé. Le modèle ne voit jamais le mot de passe. sudo_title: "🔐 Mot de passe sudo requis" sudo_body: "Saisissez le mot de passe ci-dessous (masqué), ou appuyez sur Entrée pour passer" secret_title: "🔑 Configuration de skill requise" secret_prompt: "Saisissez la valeur de {var_name}" secret_fallback_name: "secret" secret_body: "Saisissez le secret ci-dessous (masqué), Échap ou Ctrl+C pour passer" connection_connect: "Connecter" connection_continue: "Continuer" hint_sudo: "mot de passe masqué · Entrée pour passer" hint_secret: "secret masqué · Entrée pour passer" hint_approval: "↑/↓ pour sélectionner, Entrée pour confirmer" hint_slash_confirm: "tapez 1/2/3, ou ↑/↓ pour sélectionner, Entrée pour confirmer" hint_connection_form: "tapez la valeur, Entrée pour le champ suivant · ↑/↓ déplacer · Échap annuler" hint_connection_url: "Entrée pour ouvrir dans le navigateur · Échap annuler" hint_connection_authorized: "↑/↓ sélectionner, Entrée pour confirmer" hint_connection_waiting: "en attente du backend… · Ctrl+C pour interrompre" hint_connection_default: "config. connexion" hint_vault_username: "affiché pendant la saisie · Entrée pour continuer" hint_clarify_freetext: "tapez votre réponse et appuyez sur Entrée" hint_clarify_batch: "↑/↓ pour sélectionner, Entrée pour valider, Tab question suivante" hint_input_disabled: "saisie temporairement désactivée" hint_input_queues: "la saisie reste active ; Entrée met en file" hint_command_running: "{frame} commande en cours · {detail}" placeholder_recording: "enregistrement... {shortcut} pour arrêter, Ctrl+C pour annuler" placeholder_transcribing: "transcription en cours..." placeholder_vault_username: "tapez votre e-mail / nom d'utilisateur, Entrée pour continuer · Échap pour passer" placeholder_vault_code: "tapez le code, Entrée pour valider · Échap pour passer" placeholder_password: "tapez le mot de passe (masqué), Entrée pour valider · Échap pour passer" placeholder_secret: "tapez le secret (masqué), Entrée pour valider · Échap pour passer" placeholder_choice: "tapez 1/2/3, ou utilisez ↑/↓ puis Entrée" placeholder_answer: "tapez votre réponse ici et appuyez sur Entrée" placeholder_processing_command: "Traitement de la commande..." placeholder_busy: "msg=interrompre · /queue · /bg · /steer · Ctrl+C annuler" placeholder_voice_idle: "tapez ou {shortcut} pour enregistrer" voice_recording_failed: "Échec de l'enregistrement vocal : {error}" recording_cancelled: "Enregistrement annulé." force_exiting: "⚡ Sortie forcée..." interrupting_again_hint: "⚡ Interruption de l'agent... (appuyez de nouveau sur Ctrl+C pour forcer la sortie)" interrupting: "⚡ Interruption de l'agent..." suspend_unsupported: "La suspension (Ctrl+Z) n'est pas prise en charge sous Windows." suspended: "{agent_name} a été suspendu. Exécutez `fg` pour ramener {agent_name} au premier plan." steer_failed_queued: "Échec de l'orientation ({error}) — mise en file pour le prochain tour." steered: "⏩ Orienté : '{preview}'" images_attached_preview_one: "[{count} image jointe]" images_attached_preview_other: "[{count} images jointes]" queued_next_turn: "Mis en file pour le prochain tour : {preview}" redirected_turn: "↪ Tour en cours redirigé : '{preview}'" model_selection_failed: "✗ Échec de la sélection du modèle : {error}" auto_attached_image: "📎 Image jointe automatiquement : {name}" detected_file: "📄 Fichier détecté : {name}" images_attached_one: "📎 {count} image jointe" images_attached_other: "📎 {count} images jointes" command_interrupted: "Commande interrompue." welcome: "Bienvenue dans Hermes Agent ! Tapez votre message ou /help pour les commandes." activated_skills_label: "Skills activées :" redaction_disabled_title: "⚠ La censure des secrets est DÉSACTIVÉE" redaction_disabled_body: "(HERMES_REDACT_SECRETS={value}). Les clés API et les tokens peuvent apparaître en clair dans la sortie du chat, les JSON de session et les logs. Définissez {setting} dans config.yaml pour la réactiver." stdin_unavailable: |- Erreur : stdin (fd 0) n'est pas disponible. Cela peut arriver avec certaines installations de Python (p. ex. cPython géré par uv sur macOS). Essayez de réinstaller Python via pyenv ou Homebrew, puis relancez : hermes setup shutting_down: "Arrêt en cours… (finalisation de la session)" session_deleted: "✓ Session {session_id} supprimée" session_delete_missing: "✗ Session {session_id} introuvable pour la suppression" voice: err_termux_app_missing: |- Paquet de commandes Termux:API détecté, mais l'application Android est absente. Installez ou mettez à jour l'application Android Termux:API, puis relancez /voice on. err_mic_access: |- Le mode vocal a besoin d'accéder au microphone. Exécutez pkg install termux-api et installez l'application Android Termux:API, puis relancez /voice on. err_audio_capture: "Le mode vocal nécessite la capture audio." err_stt_provider: |- Le mode vocal nécessite un fournisseur STT pour la transcription. Exécutez hermes tools et configurez Speech-to-Text, puis redémarrez Hermes. silence_autostop: "Silence détecté, arrêt automatique..." hint_continuous: "arrêt auto sur silence | {shortcut} pour arrêter et quitter le mode continu" hint_termux: "Capture Termux:API | {shortcut} pour arrêter" hint_stop: "{shortcut} pour arrêter" recording: "● Enregistrement..." autorestart_failed: "Échec du redémarrage automatique de la voix : {error}" no_speech: "Aucune parole détectée." preparing_stt: "Préparation du modèle STT local '{model}' (la première utilisation peut le télécharger depuis Hugging Face)..." transcribing: "Transcription..." stop_phrase: "Phrase d'arrêt détectée — fin de la conversation vocale." transcription_failed: "Échec de la transcription : {error}" processing_error: "Erreur de traitement vocal : {error}" recording_preserved: "Enregistrement conservé dans : {path}" no_speech_stop: "Aucune parole détectée 3 fois, mode continu arrêté." tts_failed: "Échec de la lecture TTS : {error}" interjection: "🎤 Interjection vocale — interruption…" echo_ignored: "Écho TTS probable ignoré (non mis en file)." already_enabled: "Le mode vocal est déjà activé." unavailable_header: "Mode vocal indisponible dans cet environnement :" requirements_header: "Prérequis du mode vocal non satisfaits :" termux_install_cmd: "Exécutez : pkg install termux-api" termux_install_hint: "Puis installez ou mettez à jour l'application Android Termux:API pour la capture du microphone" tts_enabled_suffix: " (TTS activé)" enabled: "Mode vocal activé{tts_status}" record_key_hint: "{shortcut} pour démarrer/arrêter l'enregistrement" tts_toggle_hint: "/voice tts pour activer/désactiver la sortie vocale" disable_hint: "/voice off pour désactiver le mode vocal" stop_phrase_typed: "Phrase d'arrêt saisie — fin de la conversation vocale." disabled: "Mode vocal désactivé." wake_unavailable: "Mot d'activation indisponible : {error}" wake_already: "Le mot d'activation est déjà en écoute." wake_requirements_header: "Prérequis du mot d'activation non satisfaits :" wake_installing: "Installation du moteur de mot d'activation (première utilisation — cela peut prendre une minute)..." wake_start_failed: "Échec du démarrage du mot d'activation : {error}" wake_listening: "Mot d'activation en écoute" wake_listening_hint: "(dites \"{phrase}\" — /wake off pour arrêter)" wake_stopped: "Mot d'activation arrêté." wake_not_running: "Mot d'activation inactif." wake_profile_hint: "Phrase d'activation pour le profil '{profile}' — exécutez : hermes -p {profile}" wake_detected: "✦ Mot d'activation détecté — écoute en cours..." wake_capture_failed: "Échec de la capture après activation : {error}" state_listening: "EN ÉCOUTE" state_paused: "EN PAUSE" state_off: "OFF" state_on: "ON" state_yes: "OUI" wake_status_title: "État du mot d'activation" label_state: " État : {state}" label_phrase: " Phrase : \"{phrase}\"" label_provider: " Fournisseur : {provider}" label_surface: " Surface : {surface}" label_new_session: " Nouvelle session : {value}" mic_silent_warning: "⚠ Le microphone ne transmet que du silence — l'écouteur n'entend rien." mic_silent_macos_hint: "Sur macOS : Réglages Système > Confidentialité et sécurité > Microphone — autorisez votre terminal/Hermes, puis /wake off + /wake on." wake_enable_hint: "Activez avec /wake on" enable_first_hint: "Activez d'abord le mode vocal : /voice on" tts_no_provider: "Avertissement : aucun fournisseur TTS disponible. Installez edge-tts ou définissez des clés API." tts_status: "TTS vocal {status}." status_title: "État du mode vocal" label_mode: " Mode : {value}" label_tts: " TTS : {value}" label_recording: " Enregistrement : {value}" label_record_key: " Touche d'enregistrement : {shortcut}" label_requirements: "Prérequis :" render: response_transformed: "[Réponse transformée après la diffusion en continu]" banner_tagline: "{name} - Framework d'agent IA" banner_version: "Hermes Agent v{version} ({date})" subagents: cannot_steer_process: "Les processus en arrière-plan ne peuvent pas être orientés ; arrêtez-les ou lisez le journal." count_live: "{count} en cours" count_done: "{count} terminé(s)" count_running: "{count} en exécution" count_procs_one: "{count} proc" count_procs_other: "{count} procs" count_queued: "{count} en file" goal_parked: "objectif mis de côté" goal_paused: "objectif en pause" goal_active: "objectif actif" title_live_work: "Travail en cours" title_subagents: "Sous-agents" title_processes: "Processus" last_tool: "dernier : {tool}" starting: "démarrage" next_queued: "suivant : {text}" heading_full: "{title} · {count} · Ctrl+T développer · Ctrl+R restaurer" heading_medium: "{count} · Ctrl+T développer · Ctrl+R restaurer" heading_compact: "{count} · Ctrl+T · Ctrl+R" heading_session_restore: "{count} · Ctrl+R restaurer" heading_session_compact: "{count} · Ctrl+R" subagents_heading: "Sous-agents · {count} en cours · Ctrl+T développer · Ctrl+R replier" more_subagents: "+{count} de plus · Ctrl+T tous les sous-agents" controls_expand_collapse: " · Ctrl+T développer · Ctrl+R replier" processes_heading: "Processus · {summary}{controls}" more_processes: "+{count} de plus · Ctrl+T tous les processus" controls_collapse: " · Ctrl+R replier" queue_heading: "File d'attente · {count} en file · /queue list{controls}" more_queued: "+{count} de plus" transcript_unavailable: "Transcription en direct pas encore disponible." steer_prompt: "Orienter : " roster_empty: "Aucun sous-agent ni processus en arrière-plan en cours. Les résultats arrivent dans la conversation." entry_gone: "Cette entrée n'est plus active." noun_process: "processus" noun_subagent: "sous-agent" footer_confirm_stop: "Arrêter le {noun} sélectionné ? y confirmer · Esc annuler" footer_confirm_stop_compact: "Arrêter ? y oui · Esc annuler" footer_steering: "Entrée met la consigne en file · Esc annule (n'interrompt pas)" footer_steering_compact: "Entrée envoyer · Esc annuler" footer_steer_key: " s orienter" footer_steer_key_long: " · s orienter" footer_detail_compact: "PgUp/Dn ·{steer} x arrêter · Esc" footer_roster_compact: "↑↓ · Entrée suivre · Ctrl+T fermer" footer_detail: "Esc liste · PgUp/PgDn suivre{steer} · x arrêter" footer_roster: "↑/↓ sélectionner · Entrée suivre{steer} · x arrêter · q/Ctrl+T fermer" dock: process_goal_label: "processus en arrière-plan" last_output: "dernier : {detail}" starting: "démarrage" exit_code: "sortie {code}" verdict_killed: "tué" verdict_lost: "perdu" verdict_ago: "{verdict} · il y a {seconds} s" process_gone: "Ce processus n'est plus suivi." no_output: "Pas encore de sortie." approval: bell_context: "approbation" label: "Approbation" timeout_denying: "⏱ Délai dépassé — commande refusée" timed_out_no_response: "délai dépassé (aucune réponse)" outcome_once: "autorisé une fois" outcome_session: "autorisé pour la session" outcome_always: "ajouté à la liste d'autorisation" outcome_deny: "refusé" clarify: bell_context: "clarification" label: "Clarification" timed_out_locked_answers: "(clarification expirée après {timeout} s — réponses verrouillées renvoyées)" connect: bell_context: "configuration de connexion" cannot_restart: "Cette connexion ne peut pas être relancée. Annulez et redemandez à l'agent." secret_set: "Défini" set_up: "Configurer {name}" button_connect: "Connecter" button_cancel: "Annuler" button_continue: "Continuer" press_enter_open: "Appuyez sur Entrée pour ouvrir dans le navigateur" failed: "Échec de la connexion" authorized_no_tools: "Autorisé. Outils indisponibles." connected: "Connecté" waiting: "En attente…" editor: only_interactive: "L'éditeur externe n'est disponible que dans la CLI interactive." wait_for_command: "Attendez la fin de la commande en cours avant d'ouvrir l'éditeur." finish_active_prompt: "Terminez le prompt en cours avant d'ouvrir l'éditeur." no_input_buffer: "Aucun tampon de saisie actif n'est disponible pour l'éditeur externe." open_failed: "Échec de l'ouverture de l'éditeur externe : {error}" shell_command_failed: "Échec de la commande shell : {error}" command_failed: "Échec de la commande : {error}" queued_next_turn: "Mis en file pour le prochain tour : {preview}" modal: cancelled_no_input: "🟡 /{command} annulé (aucune saisie)." unrecognized_choice: "🟡 Choix non reconnu '{raw}'. /{command} annulé." cancelled: "🟡 /{command} annulé. {unchanged}" re_enable_hint: " Réactivez via `approvals.{setting}: true` dans config.yaml." persist_opt_out_failed: "⚠️ Impossible d'enregistrer la désactivation — {once_verb} une seule fois." persist_failed_proceeding: "⚠️ Impossible d'enregistrer la désactivation — on continue une seule fois." choice_prompt: "Choix [1/2/3] : " destructive_title: "⚠️ /{command} — détruit l'état de la conversation" approve_once: "Approuver une fois" approve_once_detail: "continuer cette fois seulement" always_approve: "Toujours approuver" always_approve_detail: "continuer et ne plus jamais afficher cette demande" cancel: "Annuler" cancel_detail: "conserver la conversation actuelle" conversation_unchanged: "Conversation inchangée." destructive_always_msg: "🔒 Les prochains /clear, /new, /reset et /undo s'exécuteront sans confirmation." bell_input_needed: "saisie requise" bell_turn_complete: "tour terminé" palette: category_skill: "Skill" secret: bell_sudo: "mot de passe sudo" sudo_timeout: "⏱ Délai dépassé — poursuite sans sudo" sudo_received: "✓ Mot de passe reçu (mis en cache pour la session)" sudo_skipped: "⏭ Ignoré" bell_unlock: "déverrouiller {name}" stays_locked: "⏭ {name} reste verrouillé" unlocking_for_session: "✓ Déverrouillage de {name} pour cette session" bell_save_login: "enregistrer l'identifiant {site}" login_not_saved: "⏭ Identifiant non enregistré pour {site}" login_saved: "✓ Identifiant pour {site} enregistré dans votre coffre" bell_verification_code: "code de vérification pour {site}" code_not_entered: "⏭ Aucun code saisi pour {site}" code_entered: "✓ Code saisi sur {site}" display: ui_redrawn: "✓ Interface redessinée" status_bar_visible: "Barre d'état affichée" status_bar_hidden: "Barre d'état masquée" exit: unknown_argument: "✗ Argument inconnu : {argument}. Utilisez /exit --delete pour supprimer aussi l'historique de la session." goal: barrier_lifted: "▶ Barrière d'objectif levée — reprise." paused_interrupted: "⏸ Objectif en pause — le tour a été interrompu. Utilisez /goal resume pour continuer, ou /goal clear pour arrêter." loop: wakeup_firing: "↻ Réveil /loop n°{tick} en cours…" paused_interrupted: "⏸ Boucle en pause — le tour de réveil a été interrompu. Utilisez /loop resume pour continuer, ou /loop stop pour y mettre fin." remaining: "↻ Boucle : {label}." plugins: none_installed: "Aucun plugin utilisateur installé." install_hint: "Pour en installer un : hermes plugins install owner/repo" drop_dir_hint: "Ou déposez un répertoire de plugin dans {path}" bundled_available: "({count} plugins intégrés disponibles — voir : hermes plugins list)" user_plugins_header: "Plugins utilisateur ({count}) :" count_noun_tools: "outils" count_noun_hooks: "hooks" count_noun_commands: "commandes" bundled_more: "(+{count} intégrés — voir : hermes plugins list)" enable_disable_hint: "Activer/désactiver : hermes plugins enable/disable " system_error: "Erreur du système de plugins : {error}" queue: usage: "Usage : /queue | /queue list | /queue edit N | /queue rm N | /queue move FROM TO | /queue clear" queued: "Mis en file : {preview}" queued_next_turn: "Mis en file pour le prochain tour : {preview}" empty: "File d'attente vide." pending_header: "File d'attente ({count} en attente) :" cleared_one: "{count} prompt en file supprimé." cleared_other: "{count} prompts en file supprimés." removed: "Élément {index} retiré de la file : {preview}" item_not_found: "Élément {index} introuvable dans la file. Taille actuelle : {size}" usage_edit: "Usage : /queue edit " updated: "Élément {index} de la file mis à jour : {preview}" usage_move: "Usage : /queue move " move_out_of_range: "Déplacement hors limites de la file. Taille actuelle : {size}" moved: "Élément {source} de la file déplacé vers {destination}." usage_add: "Usage : /queue add " reload: env_reloaded: ".env rechargé ({count} variable(s) mise(s) à jour)" steer: usage: "Usage : /steer " failed: "Échec de l'orientation : {error}" queued: "⏩ Consigne mise en file — transmise après le prochain appel d'outil : {preview}" rejected_empty: "Consigne refusée (contenu vide)." no_agent_queued: "Aucun agent en cours ; mis en file pour le prochain tour : {preview}" title: session_id: "ID de session : {session_id}" current: "Titre : {title}" pending: "Titre (en attente) : {title}" none_set_usage: "Aucun titre défini. Usage : /title " usage: "Usage : /title " empty_after_cleanup: "Le titre est vide après nettoyage. Utilisez des caractères imprimables." set: "Titre de session défini : {title}" already_in_use: "Le titre '{title}' est déjà utilisé par la session {session_id}" queued: "Titre de session en attente : {title} (sera enregistré au premier message)" undo: invalid_count: "(._.) Nombre invalide {value} — utilisez /undo ou /undo N." removes_last_exchange: "Ceci supprime le dernier échange utilisateur/assistant de l'historique." removes_last_turns: "Ceci supprime les {count} derniers tours utilisateur de l'historique." resume: tool_calls_one: "[{count} appel d'outil : {names}]" tool_calls_other: "[{count} appels d'outil : {names}]" event_model_changed: "modèle changé" event_delegation_completed: "délégation en arrière-plan terminée" event_process_finished: "processus en arrière-plan terminé" event_resumed_interrupted: "tour interrompu repris" session_id_hint: "Utilisez un ID de session d'une exécution CLI précédente (hermes sessions list)." session_not_found: "Session introuvable : {session_id}" compressed_into: "La session {session_id} a été compressée dans {descendant} ; reprise de la session descendante avec votre transcription." cannot_resume: "Impossible de reprendre la session : {error}" cannot_resume_prefix: "Impossible de reprendre la session :" resumed_session: "↻ Session reprise" counts_one: "({count} message utilisateur, {total} messages au total)" counts_other: "({count} messages utilisateur, {total} messages au total)" session_no_messages: "Session {session_id} trouvée mais sans messages. Nouveau départ." title_applied: "Titre de session appliqué : {title}" title_apply_failed: "Impossible d'appliquer le titre en attente : {error}" label_you: "● Vous :" label_assistant: "◆ {agent_name} :" earlier_messages: "... {count} messages précédents ..." panel_title: "Conversation précédente" startup: cooldown_cause_rate_limit: "après une réponse de limitation de débit ou de quota" cooldown_cause_token_refresh: "après un échec du rafraîchissement du token" cooldown_cause_http: "après une réponse HTTP {code}" cooldown_cause_failed_request: "après une requête en échec" credential_cooling_down: "L'identifiant {provider} est en période de refroidissement {cause} ; il réintégrera la rotation dans environ {minutes} min." sign_in_lost: "connexion perdue" sign_in_was_lost: "La connexion {provider} a été perdue ({reason}) ; exécutez `hermes auth add {provider}` pour vous reconnecter." provider_resolution_failed: "La résolution du fournisseur a échoué." no_api_key_for_provider: "⚠️ Aucune clé API trouvée pour le fournisseur '{provider}'." no_provider_configured: "⚠️ Aucun fournisseur d'inférence n'est configuré." run_model_or_setup: "Exécutez 'hermes model' pour choisir un fournisseur, ou 'hermes setup' pour la configuration initiale." empty_base_url: "⚠️ Le résolveur de fournisseur a renvoyé une URL de base vide. Vérifiez la configuration de votre fournisseur ou exécutez : hermes setup" switching_to_fallback: "⚠️ {reason} — bascule vers le fournisseur de secours : {provider} / {model}" first_run_no_provider: "☤ Aucun fournisseur d'inférence n'est encore configuré — réglons cela." first_run_pick_provider: "Vous allez choisir un fournisseur (Nous Portal OAuth est le plus rapide ; aucune clé API requise) puis un modèle." first_run_prompt: "Configurer un fournisseur maintenant ? [Y/n] :" first_run_skipped: "Ignoré. Exécutez 'hermes model' ou 'hermes setup' à tout moment." first_run_cancelled: "Configuration annulée. Exécutez 'hermes model' à tout moment." provider_setup_failed: "⚠️ La configuration du fournisseur a échoué : {error}" run_model_to_retry: "Exécutez 'hermes model' pour réessayer." provider_configured: "✓ Fournisseur configuré — vous pouvez commencer à discuter." provider_setup_incomplete: "La configuration du fournisseur n'a pas abouti. Exécutez 'hermes model' pour réessayer." tirith_unavailable: "⚠ Le scanner de sécurité tirith est activé mais indisponible — l'analyse des commandes se limitera à la détection par motifs" unknown_toolsets: "Avertissement : ensembles d'outils inconnus : {names}" stdin_unusable: |2- Erreur : stdin est inutilisable ({error}). Cela peut arriver avec certaines installations de Python (p. ex. cPython géré par uv sur macOS) où kqueue ne parvient pas à enregistrer le fd 0. Essayez de réinstaller Python via pyenv ou Homebrew, puis relancez : hermes setup warning: "Avertissement : {warning}" chat: initializing_agent: "Initialisation de l'agent..." context_refs: "[@ contexte : {count} réf., {tokens} tokens]" context_injection_refused: "Injection de contexte refusée." skipped_unreadable_images: "⚠ {count} chemin(s) d'image illisible(s) ignoré(s)" attaching_images_natively: "📎 {count} image(s) jointe(s) nativement (le modèle prend en charge la vision) : {names}" new_message_interrupting: "⚡ Nouveau message détecté, interruption..." unknown_error: "Erreur inconnue" continuous_voice_stopped: "Mode vocal continu arrêté à cause d'une erreur." interrupted_marker: "── [Interrompu — traitement du nouveau message] ──" iteration_budget_reached: "⚠ Budget d'itérations atteint ({used}/{max}) — la réponse peut être incomplète" sending_after_interrupt_multi: "⚡ Envoi de {count} messages après interruption : '{preview}'" sending_after_interrupt: "⚡ Envoi après interruption : '{preview}'" delivering_leftover_steer: "⏩ /steer restant transmis comme prochain tour : '{preview}'" reasoning_label: "Raisonnement" reasoning_more_lines: "... ({count} lignes de plus — /reasoning full pour les afficher)" billing_cta_nous: "Exécutez [bold]/topup[/] pour ajouter des crédits, ou [bold]/subscription[/] pour changer de formule." billing_cta_provider: "Ajoutez des crédits chez {provider}" your_provider: "votre fournisseur" billing_cta_switch: "Ou changez de fournisseur avec [bold]/model --provider [/]." out_of_credits_title: "⚡ Crédits épuisés" session: fresh_start: "✨ (◕‿◕)✨ Nouveau départ ! Écran effacé et conversation réinitialisée." model_reset_default: "(modèle réinitialisé par défaut : {model})" title_rejected: "Titre rejeté : {error}" title_empty_untitled: "Le titre est vide après nettoyage — session démarrée sans titre." title_error_untitled: "{error} — session démarrée sans titre." cwd_gone: "⚠ Le répertoire de travail de la session n'existe plus : {recorded} — on reste dans {current}" cwd_restored: "↻ Répertoire de travail : {path}" cwd_enter_failed: "⚠ Impossible d'entrer dans le répertoire de travail de la session {path} : {error}" yolo_restored: "⚡ Mode YOLO restauré depuis la session — toutes les commandes sont auto-approuvées. /yolo pour le désactiver." invalid_checkpoint: "Numéro de point de contrôle invalide. Utilisez 1-{count}." status_tools_deferred: "outils différés" status_tools_count: "{count} outils" status_toolsets: "ensembles d'outils : {toolsets}" status_provider: "fournisseur : {provider}" status_auth: "auth : {source}" reasoning_display_suffix: " (affichage : {state})" yolo_bypass_suffix: " (contournement YOLO actif)" ctx_left_prefix: "{percent}% restants · " ctx_tokens_used: "{left}{used} / {max} tokens utilisés" status_title: "État de Hermes CLI" label_reasoning: "Raisonnement" label_approvals: "Approbations" label_context: "Contexte" recent_intro: "(._.) Aucun message dans la conversation actuelle — voici les sessions récentes que vous pouvez reprendre :" recent_header: "Sessions récentes :" column_title: "Titre" column_preview: "Aperçu" column_last_active: "Dernière activité" column_id: "ID" resume_usage: "Utilisez /resume , /resume ou /resume pour continuer." resume_example: "Exemple : /resume 2" history_empty: "(._.) Aucun historique de conversation pour l'instant." history_tools_header: "[Outils]" history_tools_hidden_one: "({count} message d'outil masqué)" history_tools_hidden_other: "({count} messages d'outil masqués)" history_title: "(^_^) Historique de la conversation" history_you_header: "[Vous #{index}]" history_assistant_header: "[{agent_name} #{index}]" history_no_text: "(aucune réponse textuelle)" history_tool_calls_one: "({count} appel d'outil demandé)" history_tool_calls_other: "({count} appels d'outil demandés)" new_session_titled: "(^_^)v Nouvelle session démarrée : {title}" new_session: "(^_^)v Nouvelle session démarrée !" resume_index_out_of_range: "L'index de reprise {index} est hors limites." resume_no_args_hint: "Utilisez /resume sans argument pour voir les sessions disponibles." save_nothing: "(;_;) Aucune conversation à enregistrer." save_dir_failed: "(x_x) Impossible de créer le répertoire d'enregistrement {path} : {error}" format_markdown: "Markdown" save_ok: "(^_^)v Conversation enregistrée dans : {path} ({label})" save_resume_hint: "Reprenez la session en cours avec : hermes --resume {session_id}" save_failed: "(x_x) Échec de l'enregistrement : {error}" retry_no_messages: "(._.) Aucun message à réessayer." retry_no_user_message: "(._.) Aucun message utilisateur à réessayer." retry_unsafe: "(._.) Impossible de réessayer ce message en toute sécurité : {error}" retry_rewind_failed: "(x_x) Échec du retour en arrière pour réessayer ; l'historique n'a pas été modifié : {error}" retrying: "(^_^)b Nouvelle tentative : \"{preview}\"" undo_no_messages: "(._.) Aucun message à annuler." undo_no_user_message: "(._.) Aucun message utilisateur à annuler." undo_failed: "(x_x) Échec de l'annulation ; l'historique n'a pas été modifié : {error}" undo_ok_one: "(^_^)b {count} tour annulé ({messages} message(s)). Sauvegardé dans : \"{backup}\"" undo_ok_other: "(^_^)b {count} tours annulés ({messages} message(s)). Sauvegardé dans : \"{backup}\"" undo_remaining: "{count} message(s) restant(s) dans l'historique." yolo_state_locked_on: "verrouillé ON" yolo_locked: "⚡ YOLO est {state} pour ce processus (démarré avec --yolo / HERMES_YOLO_MODE). /yolo ne peut pas le désactiver — redémarrez sans le drapeau pour réactiver les approbations." yolo_off: "⚠ Mode YOLO {state} — les commandes dangereuses nécessiteront une approbation." yolo_on: "⚡ Mode YOLO {state} — toutes les commandes sont auto-approuvées. À utiliser avec prudence." compress_too_short: "(._.) Conversation trop courte pour être compressée (au moins {min} messages requis)." compress_no_agent: "(._.) Aucun agent actif -- envoyez d'abord un message." compress_busy: "Compression du contexte..." compress_summarizing: "🗜️ Résumé jusqu'ici : {count} messages, en conservant les {keep_last} dernier(s) échange(s) tels quels..." compress_focus: "🗜️ Compression de {count} messages, focus : \"{focus}\"..." compress_plain: "🗜️ Compression de {count} messages..." compress_failed: "❌ Échec de la compression : {error}" persist_prompt_summary: "{icon} {label} : {detail} → {outcome}" goodbye: "Au revoir ! ☤" exit_resume_hint: "Reprenez cette session avec :" exit_label_session: "Session : {session_id}" exit_label_title: "Titre : {title}" exit_label_duration: "Durée : {duration}" exit_label_messages: "Messages : {count} ({user} utilisateur, {tool_calls} appels d'outil)" status_bar: vim_insert: "INSERTION" vim_replace: "REMPLACEMENT" vim_normal: "NORMAL" battery_none: "aucune batterie détectée sur cette machine" battery_none_nothing_shown: "aucune batterie détectée, rien ne s'affichera ici" battery_currently: " — actuellement {reading}" battery_state: "Indicateur de batterie {state}{detail}" battery_usage: "Usage : /battery [on|off|status]" battery_on: "Indicateur de batterie activé{detail}" battery_off: "Indicateur de batterie désactivé" latency_label: "{value}s" velocity_label: "{value} t/s" voice_rec: "● REC" voice_rec_stop_hint: "● REC {shortcut} pour arrêter" voice_stt: "◉ STT" voice_transcribing: "◉ Transcription..." voice_tts_on: " | TTS activé" voice_continuous: " | Continu" voice_mode_hint: "🎤 Mode vocal{tts}{cont} — {shortcut} pour enregistrer" goal_turns: "⊙ objectif {used}/{max}" goal: "⊙ objectif" ctx_pinned: " épinglé" ctx_unknown: "ctx --" yolo_badge: "⚠ YOLO" stash_header_one: "📌 Réserve ({count} élément)" stash_header_other: "📌 Réserve ({count} éléments)" stash_footer: "↑↓ Entrée=restaurer D=supprimer Esc" stash_footer_compact: "↑↓ ⏎ D Esc" stream: busy_skills_search: "Recherche de skills..." busy_skills_browse: "Chargement des skills..." busy_skills_inspect: "Inspection de la skill..." busy_skills_install: "Installation de la skill..." busy_skills: "Traitement de la commande skills..." busy_browser: "Configuration du navigateur..." busy_reload_mcp: "Rechargement des serveurs MCP..." busy_reload_skills: "Rechargement des skills..." processing_command: "Traitement de la commande..." thinking_label: "[réflexion]" thinking_more_lines: "... ({count} lignes de plus)" preview_more_lines_one: "... (+{count} ligne de plus)" preview_more_lines_other: "... (+{count} lignes de plus)" vision_analyzing: "👁️ analyse de {name} ({size_kb} Ko)..." vision_analyzed: "✓ image analysée" vision_failed: "⚠ échec de l'analyse visuelle — chemin inclus pour réessayer" vision_error: "⚠ erreur d'analyse visuelle — chemin inclus pour réessayer" tool_preparing: "{emoji} préparation de {what}…" reference_noun: "référence" reference_header_indexed: "Référence {index}/{count} — {label}" reference_header: "Référence — {label}" aggregating_detail: "◆ agrégation ({detail})" aggregating: "◆ agrégation" background_running_one: "↩ Tâche en arrière-plan en cours — je reprendrai quand elle sera terminée. Vous pouvez continuer à discuter." background_running_other: "↩ {count} tâches en arrière-plan en cours — je reprendrai quand elles seront terminées. Vous pouvez continuer à discuter." terminal: recovered_mouse_modes: "Modes de saisie du terminal rétablis après une fuite de rapports souris. Si cela se reproduit, exécutez /new ou redémarrez cet onglet." recovered_cooked_mode: "Terminal rétabli après une dérive en mode « cooked » (la saisie devrait de nouveau répondre normalement)." image_badge_count: "[📎 {count} images jointes]" image_badge_numbered: "[📎 Image nº{index}]" commands: shared: more_suffix: " (+{count} autres)" set_saved: "✓ {label} défini sur '{value}' (enregistré dans la configuration)" set_session_only: "✓ {label} défini sur '{value}' (session uniquement)" scope_saved: "(enregistré dans la config)" scope_save_failed: "(session uniquement ; échec d'enregistrement)" scope_session: "(cette session — utilisez --global pour conserver)" unknown_argument: "(._.) Argument inconnu : {arg}" usage: "Usage : {usage}" needs_active_session: "{command} nécessite une session de chat active." unavailable_no_session: "{label} indisponible (aucune session active)." state_on: "ON" state_off: "OFF" error: "Erreur : {error}" agent_busy: "L'agent est occupé. Attendez la fin du tour en cours, puis réessayez {command}." no_active_agent_session: "Aucune session d'agent active." could_not_generate_diff: "Impossible de générer le diff" busy: short_queue: "met en file pour le prochain tour" short_steer: "oriente l'exécution en cours (après le prochain appel d'outil)" short_interrupt: "redirige immédiatement l'exécution en cours" long_queue: "Entrée mettra votre message en file d'attente pendant que Hermes est occupé." long_steer: "Entrée orientera votre message dans l'exécution en cours (après le prochain appel d'outil)." long_interrupt: "Entrée redirigera l'exécution en cours pendant que Hermes est occupé ; /stop l'annule toujours." usage: "Usage : /busy [queue|steer|interrupt|status]" status: "Mode de saisie quand occupé : {mode}" enter_while_busy: "Entrée quand occupé : {behavior}" label: "Saisie quand occupé" reasoning: headline_on: "ON" headline_off: "OFF" headline_full: "COMPLET" headline_clamped: "LIMITÉ à 10 lignes" note_show: "La réflexion du modèle sera affichée pendant et après chaque réponse." note_full: "L'encadré récapitulatif après la réponse affichera la réflexion complète." display_on: "activé ✓" display_off: "désactivé" full_state_full: "complet" full_state_clamped: "limité à 10 lignes" effort_line: "Effort de raisonnement : {level}" display_line: "Affichage du raisonnement : {display} ({full})" usage: "Usage : /reasoning [--global]" display_saved: "✓ Affichage du raisonnement : {headline} (enregistré)" display_off_note: "Note : l'affichage du raisonnement est OFF — lancez /reasoning show pour le voir." valid_levels: "Niveaux valides : none, minimal, low, medium, high, xhigh, max, ultra" valid_display: "Affichage : show, hide" valid_scope: "Portée : session par défaut, --global pour conserver" effort_set: "✓ Effort de raisonnement défini sur '{effort}' {scope}" indicator: usage: "Usage : /indicator [{styles}]" status: "Style de l'indicateur d'activité : {style}" unknown_style: "(._.) Style d'indicateur inconnu : {arg}" label: "Style de l'indicateur d'activité" note: "La TUI appliquera le nouveau style à son prochain rendu." fast: not_supported: "(._.) /fast n'est disponible que pour les modèles prenant en charge le mode rapide (OpenAI Priority Processing ou Anthropic Fast Mode)." feature_generic: "Mode rapide" feature_anthropic: "Anthropic Fast Mode" feature_openai: "Priority Processing" feature_ultrafast: "OpenAI Ultrafast" ultrafast_not_supported: "(._.) Ultrafast n'est disponible que pour GPT-6 Astra (modèle actuel : {model})." usage: "Usage : /fast [normal|fast|auto|cold|ultrafast|status] [--global]" status: "{feature} : {status}" set_to: "✓ {feature} défini sur {value} {scope}" hatch: progress_compose: "┊ composition de la spritesheet…" progress_save: "┊ enregistrement…" progress_drawing: "┊ dessin de {state}…" describe_prompt: "(o_o) Décrivez votre animal : " usage: "(o_o) Usage : /hatch (ex. /hatch un petit renard cyber)" default_name: "Animal" designing: "(o_o) Conception de '{concept}'… (une minute d'appels au modèle d'image)" base_failed: "(x_x) Impossible de générer l'apparence de base : {error}" no_base_draft: "(x_x) Aucune ébauche de base n'est revenue — réessayez." failed: "(x_x) Échec de l'éclosion : {error}" hatched: "(^_^)b {name} a éclos et a été adopté — il arrive dans un instant !" pet: is_out: "(^_^)b {name} est de sortie — il arrive dans un instant." put_away_named: "(-_-)zzZ {name} est rangé." put_away: "(-_-)zzZ Animal rangé." usage_scale: "(o_o) Usage : /pet scale (ex. /pet scale 0.5)" scale_set: "(^_^) Échelle de l'animal → {scale}." fetching: "(o_o) Récupération de '{name}' depuis le petdex…" adopt_failed: "(x_x) Impossible d'adopter '{name}' : {error}" error: "(x_x) {error}" diff: label_working: "Non indexé" label_staged: "Indexé" label_all: "Tout (vs HEAD)" untracked: "Non suivis :" and_more: "... et {count} autres" more_lines: "... ({count} lignes de plus — {hint})" stat_hint: "lancez /diff --stat pour un résumé" stat_hint_session: "lancez /diff session --stat pour un résumé" not_enabled: |- Les points de contrôle ne sont pas activés, il n'y a donc pas de base de référence pour la session. Activez-les avec : hermes --checkpoints Ou dans config.yaml : checkpoints: { enabled: true } (Un simple /diff fonctionne toujours — il utilise git directement.) no_session_changes: "Aucune modification — Hermes n'a encore modifié aucun fichier ici." rollback: not_enabled: |- Les points de contrôle ne sont pas activés. Activez-les avec : hermes --checkpoints Ou dans config.yaml : checkpoints: { enabled: true } none_here_showing_all: "Aucun point de contrôle pour {cwd} — affichage de tous les répertoires." all_directories: "tous les répertoires" usage_diff: "Usage : /rollback diff " no_changes_since: "Aucune modification depuis ce point de contrôle." more_lines: "... ({count} lignes de plus, affichage des 80 premières)" restored_all: "✅ Restauré au point de contrôle {hash} : {reason}" restored_file: "✅ {file} restauré depuis le point de contrôle {hash} : {reason}" snapshot_saved: "Un instantané pré-rollback a été enregistré automatiquement." chat_turn_undone: "Tour de chat annulé pour correspondre à l'état des fichiers restaurés." snapshot: unknown_subcommand: "Sous-commande inconnue : {subcommand}" usage: "Usage : /snapshot [list|create [label]|restore |prune [N]]" none_yet: "Aucun instantané d'état pour le moment." create_hint: "Créez-en un : /snapshot create [label]" list_header: "Instantanés d'état ({dir}/state-snapshots/) :" col_num: "#" col_id: "ID" col_files: "Fichiers" col_size: "Taille" col_label: "Libellé" created: "Instantané créé : {snapshot_id}" nothing_to_snapshot: "Aucun fichier d'état trouvé à capturer." usage_restore: "Usage : /snapshot restore " most_recent: "Le plus récent : {snapshot_id}" invalid_number: "Numéro d'instantané invalide. Utilisez 1-{max}." restored: "État restauré depuis : {snapshot_id}" restart_recommended: "Redémarrage recommandé pour que les processus gateway/dashboard prennent en compte les changements de state.db." not_found: "Instantané introuvable : {snapshot_id}" usage_prune: "Usage : /snapshot prune [nombre-à-conserver]" pruned: "{deleted} ancien(s) instantané(s) supprimé(s) ({keep} conservé(s))." export: usage: "Usage : /export [profil] [-o sortie.tar.gz]" exported: "✓ '{name}' exporté vers {path}" share_hint: "Partagez-le : l'autre utilisateur lance /import ou `hermes profile import `." import: usage: "Usage : /import [--name ]" imported: "✓ Profil '{name}' importé dans {path}" wrapper_created: "Wrapper créé : {path}" use_it: "Utilisez-le : hermes -p {name}" stop: none_running: "Aucun processus d'arrière-plan en cours." stopping: "Arrêt de {count} processus d'arrière-plan..." stopped: "✅ {count} processus arrêté(s)." interrupted_delegations: "✅ {count} délégation(s) d'arrière-plan interrompue(s)." agents: running_processes: "Processus en cours : {count}" recently_finished: "Terminés récemment : {count}" background_delegations: "Délégations d'arrière-plan : {count} en cours" no_progress: " · aucun progrès depuis {seconds}s — interruption" quiet: " · silencieux depuis {seconds}s" in_tool: "dans {tool}" between_turns: "entre deux tours" child_line: "└ enfant {index} : {api_calls} appels API · {doing}" last_activity: " · dernière activité il y a {seconds}s" agent_running: "Agent : en cours" agent_idle: "Agent : inactif" journey: failed: "Échec de /journey : {error}" paste: no_image: "(._.) Aucune image trouvée dans le presse-papiers" attached: "📎 Image #{index} jointe depuis le presse-papiers" extract_failed: "(>_<) Le presse-papiers contient une image mais l'extraction a échoué" copy: nothing_yet: "Rien à copier pour le moment." usage: "Usage : /copy [numéro]" invalid_number: "Numéro de réponse invalide. Utilisez 1-{max}." nothing_in_responses: "Rien à copier dans les réponses de l'assistant pour le moment." nothing_in_response: "Rien à copier dans cette réponse de l'assistant." copied_osc52: "Réponse de l'assistant #{index} copiée via OSC 52 (prise en charge du terminal requise)" copied: "Réponse de l'assistant #{index} copiée dans le presse-papiers" failed: "Échec de la copie dans le presse-papiers : {error}" image: usage: "Usage : /image ex. /image {example}" not_found: "(>_<) Fichier introuvable : {path}" unsupported: "(._.) Fichier image non pris en charge : {name}" attached: "📎 Image jointe : {name}" now_type_prompt: "Saisissez maintenant votre prompt (ou utilisez --image en mode requête unique) : {text}" tools: usage: "(._.) Usage : /tools {subcommand} [nom ...]" example_toolset: "Jeu d'outils intégré : /tools {subcommand} web" example_mcp: "Outil MCP : /tools {subcommand} github:create_issue" disabling: "Désactivation de {names}..." enabling: "Activation de {names}..." session_reset: "Session réinitialisée. La nouvelle configuration des outils est active." profile: profile: "Profil : {profile}" home: "Home : {home}" handoff: usage: "Usage : /handoff " usage_detail_1: "Transmet la session en cours au canal d'accueil de cette plateforme." usage_detail_2: "La session CLI se termine ici ; reprenez-la plus tard avec /resume." already_in_flight: "Une passation de cette session est déjà en cours. Attendez qu'elle se stabilise, puis réessayez." queued: "Passation de '{title}' → {platform} mise en file (accueil : {home})." waiting: "En attente de prise en charge par le gateway..." config_load_failed: "Impossible de charger la configuration du gateway : {error}" unknown_platform: "Plateforme inconnue '{platform}'." platform_not_enabled: "La plateforme '{platform}' n'est pas configurée/activée dans le gateway." no_home_channel: "Aucun canal d'accueil configuré pour {platform}." set_home_hint: "Définissez-en un d'abord avec /sethome dans le chat de destination." session_row_failed: "Impossible de garantir la ligne de session dans state.db : {error}" picked_up: "Le gateway l'a prise en charge ; transfert en cours..." complete: "↻ Passation terminée. La session est maintenant active sur {platform}." resume_hint: "Reprenez-la plus tard sur cette CLI avec : /resume {title}" unknown_error: "erreur inconnue" failed: "Échec de la passation : {error}" session_intact_retry: "Votre session CLI est intacte. Réessayez /handoff, ou lancez /resume manuellement sur la plateforme." still_transferring: "Transfert toujours en cours (l'agent rejoue votre session sur la destination)..." taking_long: "Le gateway met anormalement longtemps à terminer le transfert." check_platform: "Vérifiez {platform} — la session peut encore y arriver." no_longer_waiting: "Cette CLI n'attend plus. Évitez de poursuivre cette session ici ;" retry_when_settled: "si rien n'arrive, réessayez /handoff une fois l'état stabilisé." timed_out: "Délai dépassé en attendant le gateway. `hermes gateway` est-il lancé ?" session_intact: "Votre session CLI est intacte." resume: usage: "Usage : /resume " tip_find_sessions: "Astuce : utilisez /history ou `hermes sessions list` pour trouver des sessions." already_on: "Vous êtes déjà sur cette session." resumed_one: "↻ Session {session_id}{title} reprise ({count} message utilisateur, {total} au total)" resumed_other: "↻ Session {session_id}{title} reprise ({count} messages utilisateur, {total} au total)" resumed_empty: "↻ Session {session_id}{title} reprise — aucun message, nouveau départ." not_found: "Session introuvable : {target}" not_found_hint: "Utilisez /sessions ou `hermes sessions list` pour voir les sessions disponibles." compressed_redirect: "La session {session_id} a été compressée dans {resolved_id} ; reprise de la session descendante avec votre transcription." sessions: none_yet: "(._.) Aucune session précédente pour le moment." branch: branched_one: "⑂ Session « {title} » dupliquée en branche ({count} message utilisateur)" branched_other: "⑂ Session « {title} » dupliquée en branche ({count} messages utilisateur)" original_session: "Session d'origine : {session_id}" branch_session: "Session branche : {session_id}" worktree: active: "Worktree actif : {path}" branch: "Branche : {branch}" none_active: "Aucun worktree actif pour cette session." hint_new: "/worktree new [name] — en créer un et y déplacer cette session" hint_prune: "/worktree prune — récupérer les arbres obsolètes et les branches fusionnées" not_in_repo_note: "(hors d'un dépôt git)" unknown_subcommand: "Sous-commande /worktree inconnue : {subcommand}" usage: "Usage : /worktree [new [name] | list]" new_requires_repo: "❌ /worktree new doit être lancé depuis un dépôt git." not_in_repo: "Vous n'êtes pas dans un dépôt git." actions_planned: "{count} action(s) prévue(s)." actions_done: "{count} action(s) effectuée(s)." nothing_to_reclaim: "Rien à récupérer — les arbres/branches restants contiennent du vrai travail." preserved: "{count} arbre(s) contenant du vrai travail conservé(s) :" list_failed: "Impossible de lister les worktrees." enter_failed: "⚠ Worktree créé mais impossible d'y entrer : {error}" ready: "✅ Worktree prêt : {path}" tools_in_worktree: "Les outils terminal et fichiers opèrent maintenant dans le worktree." personality: title: "(^o^)/ Personnalités" none_option: "(aucune surcouche de personnalité)" usage: "Usage : /personality (* = active)" unknown: "(._.) Personnalité inconnue : {name}" available: "Disponibles : none, {available}" scope_saved: "(enregistré dans la config)" scope_session: "(session uniquement)" cleared: "{face} Personnalité effacée {scope}" cleared_note: "Aucune surcouche de personnalité — comportement de base de l'agent." set_to: "{face} Personnalité définie sur '{name}' {scope}" cron: repeat_must_be_integer: "(._.) --repeat doit être un entier" unknown_command: "(._.) Commande cron inconnue : {subcommand}" available: "Disponibles : list, add, edit, pause, resume, run, remove" overview_title: "(^_^) Tâches planifiées" overview_commands: "Commandes :" overview_usage: |- /cron list /cron add "every 2h" "Vérifier l'état du serveur" [--skill blogwatcher] /cron edit --schedule "every 4h" --prompt "Nouvelle tâche" /cron edit --skill blogwatcher --skill maps /cron edit --remove-skill blogwatcher /cron edit --clear-skills /cron pause /cron resume /cron run /cron remove current_jobs: "Tâches actuelles :" skills: "Skills : {skills}" skills_none: "Skills : aucune" next_short: "Prochaine" no_jobs_hint: "Aucune tâche planifiée. Utilisez '/cron add' pour en créer une." no_jobs: "(._.) Aucune tâche planifiée." list_header: "Tâches planifiées :" id: "ID : {job_id}" name: "Nom : {name}" state: "État : {state}" schedule: "Planification : {schedule}" schedule_repeat: "Planification : {schedule} ({repeat})" next_run: "Prochaine : {value}" next_run_na: "Prochaine : N/A" prompt: "Prompt : {prompt}" status_delivery_failed: "delivery_failed : {error}" status_error: "erreur : {error}" last_run: "Dernière exécution : {when} ({status})" usage_add: "(._.) Usage : /cron add " need_prompt_or_skill: "(._.) Veuillez fournir un prompt ou au moins une skill" create_failed: "(x_x) Échec de la création de la tâche : {error}" created: "(^_^)b Tâche créée : {job_id}" usage_edit: "(._.) Usage : /cron edit [--schedule ...] [--prompt ...] [--skill ...]" job_not_found: "(._.) Tâche introuvable : {job_id}" update_failed: "(x_x) Échec de la mise à jour de la tâche : {error}" updated: "(^_^)b Tâche mise à jour : {job_id}" usage_action: "(._.) Usage : /cron {subcommand} " pause_failed: "(x_x) Échec de la mise en pause de la tâche : {error}" resume_failed: "(x_x) Échec de la reprise de la tâche : {error}" run_failed: "(x_x) Échec de l'exécution de la tâche : {error}" remove_failed: "(x_x) Échec de la suppression de la tâche : {error}" removed: "(^_^)b Tâche supprimée : {name} ({job_id})" did_not_run: |- (x_x) Tâche non exécutée : {name} ({job_id}) {reason} paused: "(^_^)b Tâche mise en pause : {name} ({job_id})" resumed: "(^_^)b Tâche reprise : {name} ({job_id})" triggered: "(^_^)b Tâche déclenchée : {name} ({job_id})" suggestions: failed: "La commande suggestions a échoué : {error}" blueprint: failed: "La commande cron blueprint a échoué : {error}" curator: failed: "(._.) curator : {error}" kanban: failed: "(._.) erreur kanban : {error}" memory: unknown_subcommand: "Sous-commande /memory inconnue. Utilisez : pending, approve , reject , approval ." learn: from_description: "⚡ Apprentissage d'une skill à partir de votre description..." from_conversation: "⚡ Apprentissage d'une skill à partir de cette conversation..." plan: planning: "📋 Planification : {task}" from_conversation: "📋 Planification à partir du contexte de cette conversation..." init: updating: "⚡ Mise à jour d'AGENTS.md à partir d'une analyse du projet..." generating: "⚡ Génération d'AGENTS.md à partir d'une analyse du projet..." background: usage: |- Usage : /bg Exemple : /bg Résume les meilleurs articles HN du jour (Pour une question annexe sur cette conversation, utilisez /btw .) La tâche s'exécute dans une session séparée et le résultat s'affiche ici une fois terminée. no_credentials: "(>_<) Impossible de lancer la tâche d'arrière-plan : aucun identifiant valide." started: "🔄 Tâche d'arrière-plan #{number} démarrée : « {preview} »" task_id: "ID de tâche : {task_id}" keep_chatting: "Vous pouvez continuer à discuter — les résultats apparaîtront une fois terminés." label: "Tâche d'arrière-plan #{number}" complete: "✅ Tâche d'arrière-plan #{number} terminée" prompt: "Prompt : « {preview} »" title_suffix: "(arrière-plan #{number})" no_response: "(Aucune réponse générée)" side_result: complete: "{label} terminée" failed: "❌ {label} a échoué : {error}" login: label: "Connexion" title_suffix: "(connexion)" no_result: "(Aucun résultat)" btw: usage: |- Usage : /btw Exemple : /btw dans quel fichier était cette erreur ? Répond à une question rapide sur cette conversation sans l'interrompre. (Pour une tâche d'arrière-plan indépendante, utilisez /bg .) no_credentials: "(>_<) Impossible de répondre à la question annexe : aucun identifiant valide." header: "💬 /btw : « {preview} »" title_suffix: "(btw)" no_answer: "(Aucune réponse générée)" bundles: unavailable: "Sous-système de bundles indisponible : {error}" none_installed: "Aucun bundle de skills installé." create_hint: "Créez-en un avec : hermes bundles create --skill --skill " directory: "Répertoire : {dir}" title: "Bundles de skills" installed_count: "({count} installés) :" default_desc: "Charger {count} skills" skills_count: "({count} skills)" invoke_hint: "Invoquez un bundle avec /. Gérez-les avec `hermes bundles`." browser: engine_not_in_use: "⚠ browser.engine vaut 'lightpanda' mais il n'est PAS utilisé : {reason}" engine_lightpanda: "Moteur : Lightpanda — {reason} (pas de captures d'écran)" binary: "Binaire : {path}" binary_not_found: "⚠ binaire lightpanda introuvable — {hint}" use_usage: "Usage : /browser use [off]" use_on_hint: "/browser use — passer en mode Browser Use (browser_exec via la CLI 3.0)" use_off_hint: "/browser use off — revenir aux outils de navigateur intégrés" use_enabled: "🌐 Mode Browser Use activé — browser_exec via la CLI Browser Use 3.0" use_disabled: "🌐 Mode Browser Use désactivé — outils de navigateur intégrés restaurés" session_reset: "Session réinitialisée. La nouvelle configuration d'outils est active." scheme_missing: "(absent)" unsupported_scheme: "⚠ Schéma d'URL de navigateur non pris en charge : {scheme} (attendu : http, https, ws ou wss)" invalid_port: "⚠ Port invalide dans l'URL du navigateur : {url}" missing_host: "⚠ Hôte manquant dans l'URL du navigateur : {url}" port_occupied: "⚠ Le port {port} est occupé par une autre application qui n'est pas un navigateur CDP" port_occupied_detail: "(un débogueur d'IDE ou un serveur de développement l'utilise peut-être) — lancement sur le port {launch_port} à la place..." launching: "Aucun navigateur de la famille Chromium ne tourne avec le débogage distant — tentative de lancement..." launch_failed: "⚠ Impossible de lancer automatiquement un navigateur de la famille Chromium" launch_manually: "Lancez manuellement un navigateur de la famille Chromium :" no_executable: "Aucun exécutable de navigateur de la famille Chromium pris en charge trouvé dans cet environnement" launched: "✓ Navigateur de la famille Chromium lancé et à l'écoute sur le port {port}" not_responding: "⚠ Navigateur lancé mais le port {port} ne répond pas encore" try_again: "Réessayez dans quelques secondes — l'instance de débogage est peut-être encore en cours de démarrage" already_listening: "✓ Un navigateur de la famille Chromium est déjà à l'écoute sur {url}" port_unreachable: "⚠ Le port {port} n'est pas joignable sur {url}" not_connected: "Navigateur non connecté — lancez un navigateur de la famille Chromium avec le débogage distant, puis relancez /browser connect" connected: "🌐 Navigateur connecté à un navigateur Chromium actif via CDP" endpoint: "Endpoint : {url}" already_default: "Le navigateur n'est pas connecté à un navigateur Chromium actif (mode par défaut déjà utilisé)" disconnected: "🌐 Navigateur déconnecté du navigateur Chromium actif" reverted: "Outils de navigateur revenus au mode par défaut (headless local ou fournisseur cloud)" status_lightpanda: "🌐 Navigateur : Lightpanda local (agent-browser --engine lightpanda)" status_lightpanda_note: "⚡ Lightpanda : navigation plus rapide, pas de captures d'écran" status_lightpanda_fallback: "Repli automatique sur Chromium pour les captures d'écran et les commandes en échec" status_chrome: "🌐 Navigateur : Chromium headless local (agent-browser --engine chrome)" status_auto: "🌐 Navigateur : Chromium headless local (agent-browser)" status_browser_use: "🌐 Navigateur : mode Browser Use (browser_exec via la CLI Browser Use 3.0)" status_browser_use_note: "Chrome local via CDP, ou navigateurs cloud Browser Use" status_use_off_hint: "/browser use off — revenir aux outils de navigateur intégrés" status_connected: "🌐 Navigateur : connecté à un navigateur Chromium actif via CDP" status_reachable: "État : ✓ joignable" status_unreachable: "État : ⚠ injoignable (le navigateur n'est peut-être pas lancé)" status_cloud: "🌐 Navigateur : {provider} (cloud)" status_connect_hint: "/browser connect — se connecter à votre navigateur Chromium actif" status_disconnect_hint: "/browser disconnect — revenir au mode par défaut" usage: "Usage : /browser connect|disconnect|status|use" usage_connect: "connect Connecter les outils de navigateur à votre session Chromium active" usage_disconnect: "disconnect Revenir au backend de navigateur par défaut" usage_status: "status Afficher le mode de navigateur actuel" usage_use: "use [off] Passer en mode Browser Use (CLI 3.0) / revenir aux outils intégrés" heartbeat: label: "Heartbeats" paused: "⏸ Heartbeat en pause : {prompt}" none_set: "Aucun heartbeat défini." none_to_resume: "Aucun heartbeat à reprendre." resumed: "▶ Heartbeat repris (toutes les {interval}) : {prompt}" cleared: "✓ Heartbeat supprimé." usage: "Usage : /heartbeat every (ex. /heartbeat every 10m Vérifie la CI)" usage_also: "Aussi : /heartbeat status | pause | resume | clear" interval_too_small: "Intervalle trop court — le minimum est de {min_seconds}s." prompt_required: "Usage : /heartbeat every — le prompt est obligatoire." invalid_label: "Heartbeat invalide" set: "♥ Heartbeat défini (toutes les {interval}) : {prompt}" set_note: "Se déclenche comme un tour normal dès que la session est inactive et que l'intervalle est écoulé. /heartbeat pause | resume | clear pour le gérer ; il ne vit que tant que ce processus Hermes tourne — utilisez `hermes cron` pour des planifications durables." refine: nothing_yet: "Rien à affiner pour l'instant — envoyez d'abord un message." empty: "Rien à affiner pour l'instant — la conversation est vide." failed: "/refine n'a pas pu démarrer : {error}" focus_suffix: " (focus : {focus})" started: "⚗ Revue de cette conversation en arrière-plan{focus} — toute mise à jour de mémoire/skill sera signalée une fois terminée." review: nothing_yet: "Rien à passer en revue pour l'instant — envoyez d'abord un message." failed: "/review n'a pas pu démarrer : {error}" goal: label: "Objectifs" continuing: "Reprise immédiate — passage à l'étape suivante." send_to_kick: "Envoyez n'importe quel message pour lancer l'étape suivante." loop: label: "Boucles" goal_defers_note: "Remarque : un /goal actif pilote cette session — les réveils de boucle sont différés jusqu'à ce que l'objectif se termine, se mette en pause ou soit mis de côté." subgoal: no_goal: "Aucun objectif actif. Définissez-en un avec /goal ." usage_remove: "Usage : /subgoal remove " remove_needs_int: "/subgoal remove : doit être un entier (index à partir de 1)." removed: "✓ Sous-objectif {index} supprimé : {text}" cleared_one: "✓ {count} sous-objectif effacé." cleared_other: "✓ {count} sous-objectifs effacés." none_to_clear: "Aucun sous-objectif à effacer." added: "✓ Sous-objectif {index} ajouté : {text}" skin: unavailable: "Moteur de skins indisponible." current: "Skin actuel : {name}" available_header: "Skins disponibles :" usage: "Usage : /skin " custom_hint: "Skins personnalisés : déposez un fichier YAML dans {dir}/skins/" unknown: "Skin inconnu : {name}" available: "Disponibles : {names}" saved_suffix: " (enregistré)" set_to: "Skin défini sur : {name}{saved}" banner_note: "Remarque : les couleurs de la bannière changeront à la prochaine session." colors_updated: "Couleurs du prompt et de la TUI mises à jour." prompt_compose: editor_header: |- #! Rédigez votre prompt ci-dessous. Les lignes commençant par '#!' sont ignorées. #! Enregistrez et quittez pour envoyer ; laissez vide pour annuler. editor_failed: "(>_<) Impossible d'ouvrir l'éditeur : {error}" empty: "(._.) Prompt vide — rien n'a été envoyé." focus: usage: "Usage : /focus [on|off|status]" toggle: save_failed: "Échec de l'enregistrement du réglage {setting} dans config.yaml" footer: usage: "/footer [on|off|status]" label: "Pied de page d'exécution" fields: "Champs : {fields}" timestamps: usage: "/timestamps [on|off|status]" label: "Horodatage des messages" update: managed_action: "mettre à jour Hermes Agent" choice_update: "Mettre à jour maintenant" choice_update_desc: "quitter la session actuelle et mettre à jour Hermes Agent" choice_cancel: "Annuler" choice_cancel_desc: "conserver la session actuelle" title: "☤ Mettre à jour Hermes Agent" detail: "Cela quittera la session actuelle et exécutera `hermes update`." cancelled: "🟡 /update annulé." launching: "☤ Lancement de la mise à jour..." voice: unknown_subcommand: "Sous-commande voice inconnue : {subcommand}" usage: "Usage : /voice [on|off|tts|status]" wake: unknown_subcommand: "Sous-commande wake inconnue : {subcommand}" usage: "Usage : /wake [on|off|status]" enabled_in_config: "Mot d'activation activé dans la configuration (wake_word.enabled: true)." disabled_in_config: "Mot d'activation désactivé dans la configuration (wake_word.enabled: false)." tip_line: "✦ Astuce : {tip}" banner: context_too_low: "⚠️ La longueur de contexte n'est que de {tokens} tokens — c'est probablement trop peu pour un usage agentique avec des outils." context_minimum: "Hermes a besoin d'au moins {tokens} tokens. Les schémas d'outils et le prompt système occupent un préfixe fixe volumineux." fix_ollama: "Correctif Ollama : OLLAMA_CONTEXT_LENGTH={tokens} ollama serve" fix_lm_studio: "Correctif LM Studio : réglez la longueur de contexte dans les paramètres du modèle → rechargez le modèle" fix_local_server: "Correctif : démarrez votre serveur avec au moins {tokens_k}K de contexte (llama.cpp : -c {tokens}), ou réglez model.ollama_num_ctx dans config.yaml sur la fenêtre réellement servie" fix_config: "Correctif : réglez model.context_length dans config.yaml, ou augmentez le paramètre de contexte de votre serveur" hermes_models_not_agentic: "⚠ Les modèles Nous Research Hermes 3 et 4 ne sont PAS agentiques et ne sont pas conçus pour Hermes Agent." hermes_models_lack_tools: "Ils ne disposent pas des capacités d'appel d'outils requises pour les workflows agentiques. Préférez un modèle agentique (Claude, GPT, Gemini, DeepSeek, etc.)." hermes_models_switch_hint: "Changez avec : /model sonnet ou /model gpt5" project_skills_loaded: "◆ {count} skill(s) de projet chargée(s) depuis ce dépôt" project_skills_untrusted: "◆ {count} skill(s) de projet trouvée(s) dans {root} mais non chargée(s) — exécutez `hermes skills trust` pour les activer." command: unknown_nothing_sent: "Commande inconnue {command} — rien n'a été envoyé.{hint}" did_you_mean_one: "Vouliez-vous dire {suggestion} ?" type_help: "Tapez /help pour la liste complète." ambiguous: "Commande ambiguë : {command}" did_you_mean_many: "Vouliez-vous dire : {candidates} ?" config: title: "(^_^) Configuration" loaded: "(chargé)" not_found: "(introuvable)" microsoft_entra_id: "Microsoft Entra ID" api_key_not_set: "Non définie !" value_not_set: "non défini" section_model: "Modèle" section_terminal: "Terminal" section_agent: "Agent" section_session: "Session" label_model: "Modèle :" label_base_url: "URL de base :" label_api_key: "Clé API :" label_environment: "Environnement :" label_ssh_target: "Cible SSH :" label_working_dir: "Répertoire de travail :" label_timeout: "Délai d'expiration :" label_max_turns: "Tours max :" label_toolsets: "Ensembles d'outils :" label_verbose: "Verbeux :" label_started: "Démarré :" label_config_file: "Fichier de config :" context: header: "🧠 Utilisation du contexte — {model}" compute_failed: "(._.) Impossible de calculer la répartition du contexte : {error}" error: auth: "Votre clé {provider} a été rejetée. Exécutez `hermes model` pour la saisir de nouveau." billing: "Votre compte {provider} n'a plus de crédit. Rechargez chez le fournisseur, ou exécutez /model pour en changer." model_not_found: "'{model}' n'est pas disponible chez {provider}. Exécutez /model pour choisir un modèle valide." rate_limit: "Débit limité par {provider} ; patientez une minute ou utilisez /model pour changer." upstream_blocked: "Un pare-feu/CDN devant {provider} a bloqué la requête (pas votre clé). Définissez un User-Agent via extra_headers, ou utilisez /model pour changer." overloaded: "{provider} est surchargé pour le moment. Envoyez /retry dans un instant, ou /model pour changer." server_error: "{provider} a rencontré une erreur interne. Envoyez /retry dans un instant, ou /model pour changer." timeout: "{provider} n'a pas répondu à temps. Envoyez /retry, ou /model pour changer." unknown: "La requête au modèle a échoué. Exécutez /model pour changer ou `hermes doctor` pour vérifier l'installation." the_provider: "le fournisseur" the_current_model: "le modèle actuel" with_details: |- {lead} Détails : {details} agent_init_failed: "Hermes n'a pas pu établir la connexion au modèle : {error}. Votre message n'a pas été envoyé. Exécutez `hermes doctor` pour vérifier l'installation, ou /model pour choisir un autre fournisseur." gateway: starting: "Démarrage du Hermes Gateway (plateformes de messagerie)..." gateway_status: header: "(✿◠‿◠) État du gateway" platform_config_header: "Configuration des plateformes de messagerie :" enabled: "Activé" not_configured: "Non configuré ({env_var})" conversations_persist: "Les conversations persistent jusqu'à /new ou /reset." to_start: "Pour démarrer le gateway :" config_file: "Fichier de configuration : {path}" load_error: "Erreur au chargement de la configuration du gateway : {error}" to_configure: "Pour configurer le gateway :" step_env_vars: "1. Définissez les variables d'environnement :" step_config: "2. Ou configurez les paramètres dans {path}" help: header: "(^_^)? Commandes disponibles" section_session: "Session" section_configuration: "Configuration" section_tools_skills: "Outils et skills" section_info: "Infos" section_exit: "Quitter" section_context: "Contexte" section_background_automation: "Arrière-plan et automatisation" usage_suffix: "{description} (usage : /{command} {args})" alias_suffix: "{description} (alias de /{command})" skill_commands: "Commandes de skills" skill_bundles: "Bundles de skills" quick_commands: "Commandes rapides" n_installed: "{count} installée(s)" n_configured: "{count} configurée(s)" n_skills: "{count} skills" load_n_skills: "Charger {count} skills" no_skill_commands: "Aucune commande de skill installée." matching_query: "correspondant à '{query}'" to_list_them: "pour les lister" filtered_by: "Filtré par '{query}' — exécutez /help pour la liste complète." tip_line: "Astuce : /help skills liste les commandes de skills · /help filtre · Ctrl+P ouvre la palette de commandes" multiline_hint: "Multiligne : Ctrl+J, Alt+Entrée, ou \\\\+Entrée pour un saut de ligne" draft_editor_hint: "Éditeur de brouillon : Ctrl+G (Alt+G dans VSCode/Cursor)" attach_image_hint: "Joindre une image : /image {path} ou commencez votre prompt par le chemin d'une image locale" paste_image_hint: "Coller une image : Alt+V (ou /paste)" insights: no_session_data: "Aucune donnée de session." mcp_watch: changed_reload_skipped: "🔄 Configuration des serveurs MCP modifiée — rechargement ignoré (rechargement automatique désactivé)." not_applied_run: "Les nouveaux paramètres ne sont PAS encore appliqués. Pour les appliquer maintenant, exécutez :" cache_note: "⚠️ Remarque : /reload-mcp reconstruit l'ensemble d'outils et invalide le cache de prompt du fournisseur (le prochain message renvoie l'intégralité des tokens d'entrée)." changed_reloading: "🔄 Configuration des serveurs MCP modifiée — rechargement des connexions..." plugin: command_error: "Erreur de commande de plugin : {error}" quick: no_target: "La commande rapide '{command}' n'a pas de cible définie" unsupported_type: "La commande rapide '{command}' a un type non pris en charge (types acceptés : 'exec', 'alias')" no_command: "La commande rapide '{command}' n'a pas de commande définie" no_output: "La commande n'a rien renvoyé" timed_out: "Délai de la commande rapide dépassé (30 s)" error: "Erreur de commande rapide : {error}" reload_mcp: title: "⚠️ /reload-mcp — Avertissement d'invalidation du cache de prompt" detail: |- Recharger les serveurs MCP reconstruit l'ensemble d'outils de cette session et invalide le cache de prompt du fournisseur. Le prochain message renverra l'intégralité des tokens d'entrée (ce qui peut coûter cher avec des modèles à contexte long ou à raisonnement intensif). choice_once: "Approuver une fois" choice_once_hint: "recharger maintenant" choice_always: "Toujours approuver" choice_always_hint: "recharger maintenant et ne plus jamais afficher cette demande" choice_cancel: "Annuler" choice_cancel_hint: "laisser les outils MCP inchangés" unchanged: "Outils MCP inchangés." always_msg: "🔒 Les prochains appels /reload-mcp s'exécuteront sans confirmation." once_verb: "rechargement" reloading: "🔄 Rechargement des serveurs MCP..." reconnected: "♻️ Reconnectés : {names}" added: "➕ Ajoutés : {names}" removed: "➖ Supprimés : {names}" tools_available: "🔧 {tools} outil(s) disponible(s) depuis {servers} serveur(s)" agent_updated: "✅ Agent mis à jour — {count} outil(s) disponible(s)" reload_skills: reloading: "🔄 Rechargement des skills..." total: "📚 {count} skill(s) disponible(s)" added_header: "➕ Skills ajoutées :" removed_header: "➖ Skills supprimées :" session_store: unavailable_rich: |- [bold yellow]⚠ Stockage des sessions indisponible[/bold yellow] — cette conversation ne sera [bold]PAS enregistrée[/bold] et ne pourra pas être reprise plus tard. La recherche dans les sessions passées est aussi désactivée. Raison : {reason}. {action} [dim]Détails : {details}[/dim] unavailable_plain: "AVERTISSEMENT : stockage des sessions indisponible — cette conversation ne sera PAS enregistrée et ne pourra pas être reprise plus tard. Raison : {reason}. {action}" shell: command_denied: "Commande refusée : {reason}" flagged_as_dangerous: "signalée comme dangereuse" exited: "! code de sortie {code}" skills: bundle_load_failed: "Échec du chargement du bundle pour {command}" loading_bundle: "Chargement du bundle : {name} ({count} skills)" skipped_missing: "Skills manquantes ignorées : {names}" stacked_load_failed: "Échec du chargement des skills empilées pour {command}" loading_stacked: "Chargement de {count} skills empilées : {names}" loading_skill: "Chargement de la skill : {name}" skill_load_failed: "Échec du chargement de la skill pour {command}" tools: none_available: "(;_;) Aucun outil disponible" header: "(^_^)/ Outils disponibles" total: "Total : {count} outils ヽ(^o^)ノ" toolsets: header: "(^_^)b Ensembles d'outils disponibles" currently_enabled_legend: "(*) = actuellement activé" tip_enable_all: "Astuce : utilisez 'all' ou '*' pour activer tous les ensembles d'outils" example: "Exemple : python cli.py --toolsets web,terminal" usage: unknown_subcommand: "Sous-commande /usage inconnue : {args}. Essayez /usage ou /usage reset [--force]." reset_wrong_provider: "Les réinitialisations de consommation en réserve ne sont disponibles qu'avec le fournisseur openai-codex." reset_switch_hint: "Changez d'abord avec `/model` ou `hermes auth`." checking_reset_credits: "⏳ Vérification des crédits de réinitialisation..." codex_timeout: "❌ Délai dépassé en contactant le backend Codex — réessayez dans un instant." no_api_calls: "(._.) Aucun appel API effectué dans cette session pour le moment." header_session: "📊 Tokens de la session" label_model: "Modèle :" label_input_tokens: "Tokens d'entrée :" label_output_tokens: "Tokens de sortie :" label_reasoning_subset: "↳ Raisonnement (sous-ensemble) :" label_prompt_tokens_total: "Tokens de prompt (total) :" label_completion_tokens: "Tokens de complétion :" label_total_tokens: "Total de tokens :" label_api_calls: "Appels API :" label_session_duration: "Durée de la session :" label_current_context: "Contexte actuel :" label_messages: "Messages :" label_compressions: "Compressions :" verbose: label_off: "Progression des outils : OFF" detail_off: "mode silencieux, seulement la réponse finale." label_new: "Progression des outils : NEW" detail_new: "afficher chaque nouvel outil (sans les répétitions)." label_all: "Progression des outils : ALL" detail_all: "afficher chaque appel d'outil." label_verbose: "Progression des outils : VERBOSE" detail_verbose: "arguments complets, résultats et blocs de réflexion." whoami: you_label: "Vous :" you_value: "cli (terminal local)" user_label: "Utilisateur :" tier_label: "Niveau :" tier_value: "sans restriction" slash_commands_label: "Commandes slash :" slash_commands_value: "toutes disponibles" worktree: shallow_clone_keeping: "⚠ Clone superficiel — impossible de vérifier l'état du push, conservé : {path}" next_session_deepens: "La prochaine session `hermes -w` approfondira le clone et supprimera automatiquement les worktrees fusionnés." unpushed_keeping: "⚠ Le worktree a des commits non poussés, conservé : {path}" uncommitted_keeping: "⚠ Le worktree a des modifications non commitées, conservé : {path}" clean_up_manually: "Pour nettoyer manuellement : git worktree remove --force {path}" cleaned_up: "✓ Worktree nettoyé : {path}" display: verb: web_search: "Recherche sur le web" web_extract: "Lecture" browser_navigate: "Navigation" browser_click: "Clic" browser_type: "Saisie" read_file: "Lecture" write_file: "Écriture" patch: "Modification" search_files: "Recherche de fichiers" terminal: "Exécution" execute_code: "Exécution de code" image_generate: "Génération d'image" video_generate: "Génération de vidéo" text_to_speech: "Synthèse vocale" vision_analyze: "Analyse de l'image" session_search: "Recherche dans les sessions passées" skill_view: "Lecture de la skill" skills_list: "Liste des skills" skill_manage: "Mise à jour de la skill" delegate_task: "Délégation" cronjob_manage: "Planification" clarify: "Question" memory: "Mise à jour de la mémoire" todo_list: "Mise à jour des tâches" verb_connector: search: " : " default: " " bridge_generating: tool_call: "un appel d'outil" tool_search: "une recherche d'outil" tool_describe: "les détails de l'outil" status_phrase: verb: "{verb} en cours" using_tool: "utilise {tool}" preview: shell_plus_one: "{first} + {count} commande" shell_plus_many: "{first} + {count} commandes" delegate_tasks: "{count} tâches : {goals}" delegate_parallel_tasks: "{count} tâches en parallèle" todo_verb_updating: "mise à jour de" todo_verb_planning: "planification de" todo_reading: "lecture des tâches" todo_tasks: "{verb} {count} tâche(s)" missing_old_text: "" send_message_to: "à {target} : \"{message}\"" session_search_recall: "rappel : \"{query}\"" diff: review_header: " ┊ diff de revue" omitted_lines: "… {count} ligne(s) de diff omise(s)" omitted_files: " dans {count} fichier(s)/section(s) supplémentaire(s)" thinking_verbs: "réflexion,contemplation,méditation,cogitation,rumination,délibération,mûrissement,introspection,traitement,raisonnement,analyse,calcul,synthèse,formulation,brainstorming" spinner: tool_line: " [outil] {message}" done_line: " [terminé] {message}{elapsed}" failure: file_not_found: "Fichier introuvable : {name}" terminal_backend_unavailable: "backend terminal indisponible" exit_code: " [code {code}]" memory_full: " [pleine]" generic: " [erreur]" generic_word: "erreur" cute: verb: search: "recherche" fetch: "récup" terminal: "$" read: "lecture" write: "écriture" patch: "patch" find: "find" grep: "grep" navigate: "navigation" snapshot: "capture" click: "clic" type: "saisie" scroll: "défilement" back: "retour" press: "touche" images: "images" vision: "vision" plan: "plan" recall: "rappel" memory: "mémoire" skills: "skills" skill: "skill" create: "création" speak: "voix" send: "envoi" cron: "cron" exec: "exec" browser: "navigateur" delegate: "délégation" proc: "proc" fetch_pages: "pages" todo_progress: "{done}/{total} tâche(s)" todo_reading: "lecture des tâches" todo_update_progress: "màj {done}/{total} ✓" todo_update_count: "màj {count} tâche(s)" todo_count: "{count} tâche(s)" cron_task_fallback: "tâche" cron_create: "créer {label}" cron_listing: "liste" delegate_parallel: "parallèle" process_list: "ls processus" snapshot_full: "complet" snapshot_compact: "compact" images_extracting: "extraction" vision_analyzing_page: "analyse de la page" skills_list: "liste {category}" skills_all: "toutes" scroll: up: "haut" down: "bas" left: "gauche" right: "droite" fallback_tool_name: "outil" fallback_done: "terminé" completed: "┊ ⚡ {tool} terminé {duration}" iteration_progress: unbounded: "itération {n}" bounded: "itération {n}/{max}" review: routing_fallback_warning: "⚠ auxiliary.background_review.provider='{task_provider}' (modèle '{task_model}') n'a pas pu être routé ({error}) ; repli sur {provider}/{model}" reasoning_effort_warning: "⚠ auxiliary.background_review.reasoning_effort='{effort}' n'a aucun effet tant que le modèle de revue n'est pas le modèle principal" memory_op_line: "{label} {glyph} {preview}" skill_patched_verbose: "📝 Skill '{name}' corrigée : \"{old}\" → \"{new}\"" skill_changed_verbose: "📝 Skill '{name}' {verb} : {description}" skill_message_verbose: "📝 {message}" skill_action: "Skill {action}" label_updated: "{label} à jour" skill_result: "Skill '{name}' {verb}{path}" skill_verb: created: "créée" rewritten: "réécrite" patched: "corrigée" written: "écrite" removed: "retirée" deleted: "supprimée" label: skill: "Skill" memory: "Mémoire" user: "Profil utilisateur" summary_cli: " 💾 Revue d'auto-amélioration : {summary}" summary_callback: "💾 Revue d'auto-amélioration : {summary}" aux_failure_label: "revue en arrière-plan" notice: uncompressed_context_overflow: "⚠️ Le contexte de session (~{tokens} tokens) dépasse la fenêtre de contexte du modèle (~{context_length} tokens) alors que la compression est désactivée (compression.enabled: false). Utilisez /compact pour compresser l'historique ou activez la compression dans config.yaml." explainer: no_reply_prefix: "⚠️ Pas de réponse : " empty_response: "{model} n'a produit aucune réponse cette fois, même après plusieurs tentatives. Envoyez `continue` pour réessayer, ou changez de modèle avec /model." exit: all_retries_exhausted_no_response: "le fournisseur de modèle n'a pas répondu malgré toutes les tentatives. Envoyez /retry, ou changez de modèle avec /model." partial_stream_recovery: "la diffusion en continu s'est arrêtée prématurément et seule une réponse partielle a pu être récupérée. Envoyez `continue` pour reprendre là où elle s'est arrêtée." fallback_prior_turn_content: "aucun nouveau contenu n'a été produit ce tour ; affichage du contexte précédent récupéré. Envoyez `continue` pour réessayer." redirect_restart_limit_exceeded: "la requête a été annulée par une nouvelle correction à chaque tentative, le tour s'est donc arrêté au lieu de réessayer indéfiniment. Votre dernière correction est mise en file comme prochain message." rebuilt_restart_limit_exceeded: "chaque fournisseur de la chaîne de repli a basculé en échec à son tour, le tour s'est donc arrêté au lieu de réessayer indéfiniment. Envoyez `continue` ou changez de fournisseur." budget_exhausted: "le budget d'itérations/de coût par tour a été épuisé avant d'obtenir une réponse finale. Envoyez `continue` pour poursuivre." ollama_runtime_context_too_small: "la fenêtre de contexte du modèle local était trop petite pour terminer. Augmentez la taille du contexte ou utilisez un modèle plus grand." pending_tool_result: "le tour s'est arrêté alors qu'un résultat d'outil était encore en attente et le modèle n'a produit aucun texte de suite. Envoyez `continue` pour le laisser résumer." interrupted_during_api_call: "la requête a été interrompue en cours d'appel avant de recevoir une réponse. Envoyez `continue` pour réessayer." max_iterations_reached: "la limite maximale d'itérations d'outils a été atteinte avant d'obtenir une réponse finale. Envoyez `continue` pour poursuivre, ou augmentez `max_iterations`." error_near_max_iterations: "une erreur s'est produite près de la limite d'itérations avant d'obtenir une réponse finale. Vérifiez la sortie de l'outil ci-dessus, puis envoyez `continue`." repeated_outer_errors: "le tour échouait sans cesse avec des erreurs répétées et a été arrêté prématurément au lieu de réessayer indéfiniment. Vérifiez les erreurs ci-dessus, puis envoyez `continue` pour réessayer." persistence: compression: "le tour a été arrêté car un autre processus compressait cette session. Votre message devrait déjà être enregistré — renvoyez-le une fois la compression terminée." compression_closed: "le tour a été arrêté car cette session a été renouvelée par la compression du contexte et sa continuation en cours n'a pas pu être reprise. Le stockage lui-même est sain — actualisez le client (ou démarrez un nouveau tour) pour qu'il récupère le nouvel identifiant de session, puis renvoyez votre message." turn_lease: "le tour a été arrêté car un autre processus Hermes a pris le contrôle de cette session. Votre réponse n'a pas été enregistrée — attendez que l'autre processus termine, puis renvoyez votre message." session_row_missing: "cette session a été supprimée du stockage alors que la discussion était encore ouverte, et Hermes n'a pas pu la recréer ; ce message n'a donc pas été enregistré. Renvoyez votre message ; si l'échec persiste, lancez `hermes {profile_arg}doctor`." locked: "le tour a été arrêté car le stockage de session était occupé (un autre processus Hermes écrivait dans la base d'état). Votre message devrait déjà être enregistré — renvoyez-le dans un instant." replaced: "le fichier de base de données des sessions a été remplacé pendant que Hermes tournait, ce message n'a donc pas été enregistré (une copie est conservée dans {home}/sessions/). Arrêtez Hermes (`hermes {profile_arg}gateway stop`), lancez `hermes {profile_arg}doctor` — et non `hermes {profile_arg}doctor --fix`, qui réparerait le mauvais fichier sur place — puis redémarrez-le et renvoyez votre message. Les étapes de récupération avancées figurent dans le journal." deleted_wal: "un autre processus Hermes détient encore une ancienne copie du journal d'écriture anticipée (WAL) de la base de données des sessions ; Hermes a donc cessé d'écrire pour préserver le fichier et ce message n'a pas été enregistré (une copie est conservée dans {home}/sessions/). Rien n'est perdu. Quittez tous les processus Hermes de ce profil (application Desktop, `hermes {profile_arg}gateway stop`, tableau de bord, cron), lancez `hermes {profile_arg}doctor` — il indique tout processus qui détient encore le journal — puis redémarrez Hermes et renvoyez votre message. Ne lancez pas `doctor --fix` et ne supprimez aucun fichier state.db tant qu'ils tournent. Guide : {recovery_docs}" corrupt: |- le tour a été arrêté car la base d'état a signalé une corruption structurelle (la transcription aurait été perdue au redémarrage). Libérer de l'espace disque ne servira à rien. Options de récupération : 1. Lancez `hermes {profile_arg}doctor --fix` 2. Arrêtez le gateway, puis récupérez avec : hermes {profile_arg}sessions recover --source {db_path} --inspect-only (s'il indique que la récupération est possible) hermes {profile_arg}sessions recover --source {db_path} --output recovered-state.db — la récupération prend d'abord un instantané du fichier endommagé ; ne lancez PAS `sqlite3 ... \".recover\"` sur le state.db actif, une CLI sqlite3 vulnérable peut l'endommager davantage 3. Restaurez une sauvegarde depuis {backups_dir}/ Puis renvoyez votre message. fts_index: "le tour a été arrêté car l'index de recherche des sessions (FTS5) est corrompu et n'a pas pu être détaché ; ce message n'a donc pas été enregistré. Le stockage des messages lui-même n'est pas endommagé : ne lancez pas d'outils de récupération et ne restaurez pas de sauvegarde. Lancez `hermes {profile_arg}doctor --fix` (ou redémarrez Hermes, qui répare l'index à l'ouverture), puis renvoyez votre message." disk: "Hermes n'a pas pu enregistrer cette conversation sur le disque et s'est donc arrêté plutôt que de perdre vos messages. Le disque est probablement plein : libérez de l'espace (ou corrigez les permissions de {home}/state.db), puis renvoyez votre message." default: "Hermes n'a pas pu enregistrer cette conversation et s'est donc arrêté plutôt que de perdre vos messages. Causes possibles : le disque est plein, ou un autre processus Hermes détient la base de données. Fermez les autres fenêtres Hermes, lancez `hermes {profile_arg}doctor` pour vérifier le stockage, puis renvoyez votre message." file_mutation: header: "⚠️ Vérificateur de modifications de fichiers : {count} modification(s) de fichier ont ÉCHOUÉ ce tour, quoi qu'en dise le texte ci-dessus. Lancez `git status` ou `read_file` pour vérifier ce qui a réellement été appliqué." entry: " • `{path}` — [{tool}] {preview}" failed: "échec" shared: and_more: " • … et {count} de plus" the_model: "Le modèle" tips: t001: "/bg exécute une tâche dans une session séparée pendant que la vôtre reste disponible ; /btw répond à une question annexe sur cette conversation sans l'interrompre." t002: "/branch duplique la session actuelle pour explorer une autre piste sans perdre votre progression." t003: "/compress compresse manuellement le contexte de la conversation quand elle devient longue." t004: "/rollback liste les points de contrôle du système de fichiers — restaurez les fichiers modifiés par l'agent à n'importe quel état antérieur." t005: "/rollback diff 2 affiche ce qui a changé depuis le point de contrôle 2 sans rien restaurer." t006: "/rollback 2 src/file.py restaure un seul fichier depuis un point de contrôle précis." t007: "/title \"mon projet\" nomme votre session — reprenez-la plus tard avec /resume ou hermes -c." t008: "/resume reprend là où vous vous étiez arrêté dans une session nommée précédemment." t009: "/queue met un message en file pour le tour suivant sans interrompre le tour en cours." t010: "/undo supprime le dernier échange utilisateur/assistant de la conversation." t011: "/retry renvoie votre dernier message — pratique quand la réponse de l'agent n'était pas tout à fait celle attendue." t012: "/verbose fait défiler l'affichage de la progression des outils : off → new → all → verbose." t013: "/reasoning high augmente la profondeur de réflexion du modèle. /reasoning show affiche le raisonnement." t014: "/fast active ou désactive le traitement prioritaire pour des réponses API plus rapides (selon le fournisseur)." t015: "/yolo ignore toutes les demandes d'approbation de commandes dangereuses pour le reste de la session." t016: "/model permet de changer de modèle en cours de session — essayez /model sonnet ou /model gpt-5." t017: "/model --global change votre modèle par défaut de façon permanente." t018: "/personality pirate donne une personnalité amusante — 14 options intégrées, de kawaii à shakespeare." t019: "/skin change le thème de la CLI — essayez ares, mono, slate, poseidon ou charizard." t020: "/statusbar affiche ou masque une barre persistante indiquant le modèle, les tokens, le % de contexte utilisé, le coût et la durée." t021: "/tools disable browser retire temporairement les outils navigateur pour la session en cours." t022: "/browser connect rattache les outils navigateur à votre navigateur de la famille Chromium déjà ouvert via CDP." t023: "/plugins liste les plugins installés et leur état." t024: "/cron gère les tâches planifiées — configurez des prompts récurrents livrés sur n'importe quelle plateforme." t025: "/reload-mcp recharge à chaud la configuration des serveurs MCP sans redémarrer." t026: "/usage affiche la consommation de tokens, la répartition des coûts et la durée de la session." t027: "/insights affiche les statistiques d'utilisation des 30 derniers jours." t028: "/paste vérifie si votre presse-papiers contient une image et la joint à votre prochain message." t029: "/profile indique quel profil est actif et son répertoire personnel." t030: "/config affiche votre configuration actuelle en un coup d'œil." t031: "/stop tue tous les processus d'arrière-plan lancés par l'agent." t032: "@file:path/to/file.py injecte le contenu d'un fichier directement dans votre message." t033: "@file:main.py:10-50 injecte uniquement les lignes 10 à 50 d'un fichier." t034: "@folder:src/ injecte l'arborescence d'un répertoire." t035: "@diff injecte vos modifications git non indexées dans le message." t036: "@staged injecte vos modifications git indexées (git diff --staged)." t037: "@git:5 injecte les 5 derniers commits avec leurs patches complets." t038: "@url:https://example.com récupère le contenu d'une page web et l'injecte." t039: "Taper @ déclenche la complétion des chemins du système de fichiers — naviguez vers n'importe quel fichier de façon interactive." t040: "Combinez plusieurs références : \"Relis @file:main.py et @file:test.py pour vérifier la cohérence.\"" t041: "Alt+Enter insère un saut de ligne pour une saisie multiligne. (Windows Terminal intercepte Alt+Enter — utilisez Ctrl+Enter à la place.)" t042: "Ctrl+C interrompt l'agent. Appuyez deux fois en moins de 2 secondes pour forcer la sortie." t043: "Ctrl+Z suspend Hermes en arrière-plan — lancez fg dans votre shell pour reprendre." t044: "Tab accepte le texte fantôme de l'auto-suggestion ou complète les commandes slash." t045: "Tapez un nouveau message pendant que l'agent travaille pour l'interrompre et le réorienter." t046: "Alt+V colle une image depuis votre presse-papiers dans la conversation." t047: "Coller 5 lignes ou plus enregistre automatiquement le texte dans un fichier et insère une référence compacte à la place." t048: "hermes -c reprend votre session CLI la plus récente. hermes -c \"nom du projet\" reprend par titre." t049: "hermes -w crée un worktree git isolé — idéal pour les workflows d'agents en parallèle." t050: "hermes -w -q \"Corrige l'issue #42\" combine l'isolation par worktree et une requête ponctuelle." t051: "hermes chat -t web,terminal n'active que certains jeux d'outils pour une session ciblée." t052: "hermes chat -s github-pr-workflow précharge une skill au lancement." t053: "hermes chat -q \"requête\" exécute une seule requête non interactive puis quitte." t054: "hermes chat --max-turns 1000 remplace la limite par défaut de 500 itérations par tour." t055: "hermes chat --checkpoints active des instantanés du système de fichiers avant chaque modification destructive." t056: "hermes --yolo contourne toutes les demandes d'approbation de commandes dangereuses pour toute la session." t057: "hermes chat --source telegram étiquette la session pour la filtrer dans hermes sessions list." t058: "hermes -p work chat s'exécute sous un profil précis sans changer votre profil par défaut." t059: "hermes doctor --fix diagnostique et répare automatiquement les problèmes de configuration et de dépendances." t060: "hermes dump produit un résumé compact de votre installation — parfait pour les rapports de bug." t061: "hermes config set KEY VALUE dirige automatiquement les secrets vers .env et tout le reste vers config.yaml." t062: "hermes config edit ouvre config.yaml dans votre éditeur par défaut." t063: "hermes config check recherche les options de configuration manquantes ou obsolètes." t064: "hermes sessions browse ouvre un sélecteur de sessions interactif avec recherche." t065: "hermes sessions stats affiche le nombre de sessions par plateforme et la taille de la base de données." t066: "hermes sessions prune --older-than 30 nettoie les anciennes sessions." t067: "hermes skills search react --source skills-sh cherche dans l'annuaire public skills.sh." t068: "hermes skills check vérifie si des mises à jour sont disponibles pour les skills installées depuis le hub." t069: "hermes skills tap add myorg/skills-repo ajoute une source de skills GitHub personnalisée." t070: "hermes skills snapshot export setup.json exporte votre configuration de skills pour sauvegarde ou partage." t071: "hermes mcp add github --command npx ajoute des serveurs MCP depuis la ligne de commande." t072: "hermes mcp serve fait tourner Hermes lui-même comme serveur MCP pour d'autres agents." t073: "hermes auth add permet d'ajouter plusieurs clés API pour la rotation d'un pool d'identifiants." t074: "hermes completion bash >> ~/.bashrc active la complétion par Tab pour toutes les commandes et tous les profils." t075: "hermes logs -f suit agent.log en temps réel. --level WARNING --since 1h filtre la sortie." t076: "hermes backup crée une sauvegarde zip de tout votre répertoire personnel Hermes." t077: "hermes profile create coder crée un profil isolé qui devient sa propre commande." t078: "hermes profile create work --clone copie votre configuration et vos clés actuelles dans un nouveau profil." t079: "hermes update synchronise automatiquement les nouvelles skills intégrées vers TOUS les profils." t080: "hermes gateway install installe Hermes comme service système (systemd/launchd)." t081: "hermes memory setup permet de configurer un fournisseur de mémoire externe (Honcho, Mem0, etc.)." t082: "hermes webhook subscribe crée des routes webhook événementielles avec validation HMAC." t083: "Économisez : hermes tools désactive les outils inutilisés, hermes skills config allège les skills." t084: "/reasoning low ou /reasoning minimal réduit la profondeur de réflexion sous la valeur par défaut (medium) — réponses plus rapides et moins chères." t085: "hermes models route la vision, la compression et les tâches auxiliaires vers des modèles moins chers — réduit le coût des tokens d'arrière-plan de plus de 85 % sans dégrader votre modèle de chat principal." t086: "Définissez display.bell_on_complete: true dans config.yaml pour entendre une sonnerie à la fin des tâches longues." t087: "Définissez display.streaming: true pour voir les tokens apparaître en temps réel pendant que le modèle génère." t088: "Définissez display.show_reasoning: true pour suivre la chaîne de raisonnement du modèle." t089: "Définissez display.compact: true pour réduire les espaces dans la sortie et afficher l'information plus densément." t090: "Définissez display.busy_input_mode: queue pour mettre les messages en file au lieu d'interrompre l'agent, ou steer pour les injecter en cours d'exécution via /steer." t091: "Définissez display.resume_display: minimal pour sauter le récapitulatif complet de la conversation à la reprise d'une session." t092: "Définissez compression.threshold: 0.50 pour contrôler le déclenchement de la compression automatique (par défaut : 50 % du contexte)." t093: "Définissez agent.max_turns: 1000 pour laisser l'agent effectuer davantage d'appels d'outils par tour." t094: "Définissez file_read_max_chars: 200000 pour augmenter le contenu maximal par appel read_file." t095: "Définissez approvals.mode: smart pour laisser un LLM approuver automatiquement les commandes sûres et refuser les dangereuses." t096: "Définissez fallback_model dans config.yaml pour basculer automatiquement vers un fournisseur de secours." t097: "Définissez privacy.redact_pii: true pour hacher les identifiants utilisateur et numéros de téléphone avant l'envoi au LLM." t098: "Définissez browser.record_sessions: true pour enregistrer automatiquement les sessions navigateur en vidéos WebM." t099: "Définissez worktree: true dans config.yaml pour toujours créer un worktree git (équivalent de hermes -w)." t100: "Définissez security.website_blocklist.enabled: true pour bloquer certains domaines dans les outils web." t101: "Définissez cron.wrap_response: false pour livrer la sortie brute de l'agent sans l'en-tête ni le pied de page cron." t102: "HERMES_TIMEZONE remplace le fuseau horaire du serveur par n'importe quel identifiant de fuseau IANA." t103: "La substitution de variables d'environnement fonctionne dans config.yaml : utilisez la syntaxe ${VAR_NAME}." t104: "Les commandes rapides dans config.yaml exécutent instantanément des commandes shell sans consommer aucun token." t105: "Des personnalités personnalisées peuvent être définies dans config.yaml sous agent.personalities." t106: "provider_routing contrôle le tri, la liste blanche et la liste noire des fournisseurs OpenRouter." t107: "execute_code exécute des scripts Python qui appellent les outils Hermes par programmation — les résultats restent hors du contexte." t108: "delegate_task lance jusqu'à 10 sous-agents simultanés par défaut (delegation.max_concurrent_children) avec des contextes isolés pour le travail en parallèle." t109: "web_extract fonctionne sur les URL de PDF — passez n'importe quel lien PDF et il le convertit en markdown." t110: "search_files s'appuie sur ripgrep et est plus rapide que grep — utilisez-le à la place du grep du terminal." t111: "patch utilise 9 stratégies de correspondance floue pour que de petites différences d'espacement ne cassent pas les modifications." t112: "patch prend en charge le format V4A pour modifier plusieurs fichiers en un seul appel." t113: "read_file suggère des noms de fichiers similaires quand un fichier est introuvable." t114: "read_file déduplique automatiquement — relire un fichier inchangé renvoie un stub léger." t115: "browser_vision prend une capture d'écran et l'analyse avec l'IA — fonctionne pour les CAPTCHA et les contenus visuels." t116: "browser_console peut évaluer des expressions JavaScript dans le contexte de la page." t117: "image_generate crée des images avec FLUX 2 Pro et une mise à l'échelle 2x automatique." t118: "text_to_speech convertit du texte en audio — lu sous forme de bulles vocales sur Telegram." t119: "send_message peut joindre n'importe quelle plateforme de messagerie connectée depuis une session." t120: "L'outil todo aide l'agent à suivre les tâches complexes en plusieurs étapes au cours d'une session." t121: "session_search effectue une recherche plein texte dans TOUTES les conversations passées." t122: "L'agent enregistre automatiquement en mémoire vos préférences, vos corrections et des faits sur l'environnement." t123: "/moa fait passer un prompt difficile par votre ensemble de modèles Mixture of Agents configuré." t124: "Les commandes du terminal prennent en charge le mode arrière-plan avec notify_on_complete pour les tâches longues." t125: "Les processus d'arrière-plan du terminal prennent en charge watch_patterns pour alerter sur des lignes de sortie précises." t126: "L'outil terminal prend en charge 6 backends : local, Docker, SSH, Modal, Daytona et Singularity." t127: "Chaque profil dispose de sa propre configuration, de ses clés API, de sa mémoire, de ses sessions, de ses skills et de ses tâches cron." t128: "Les noms de profil deviennent des commandes shell — 'hermes profile create coder' crée la commande 'coder'." t129: "hermes profile export coder -o backup.tar.gz crée une archive de profil portable." t130: "Si deux profils partagent par erreur le même token de bot, le second gateway est bloqué avec une erreur explicite." t131: "Les sessions génèrent automatiquement un titre descriptif après le premier échange — aucun nommage manuel nécessaire." t132: "Les titres de session gèrent la filiation : \"mon projet\" → \"mon projet #2\" → \"mon projet #3\"." t133: "À la sortie, Hermes affiche une commande de reprise avec l'ID de session et des statistiques." t134: "hermes sessions export backup.jsonl exporte toutes les sessions pour sauvegarde ou analyse." t135: "hermes -r SESSION_ID reprend n'importe quelle session passée par son ID." t136: "La mémoire est un instantané figé — les changements n'apparaissent dans le prompt système qu'au démarrage de la session suivante." t137: "Les entrées de mémoire sont automatiquement analysées pour détecter les injections de prompt et les tentatives d'exfiltration." t138: "L'agent a deux espaces de mémoire : les notes personnelles (~2200 caractères) et le profil utilisateur (~1375 caractères)." t139: "Les corrections que vous donnez à l'agent (\"non, fais-le comme ça\") sont souvent enregistrées automatiquement en mémoire." t140: "Plus de 80 skills intégrées couvrant github, creative, mlops, productivity, research et bien d'autres." t141: "Chaque skill installée devient automatiquement une commande slash — tapez / pour toutes les voir." t142: "hermes skills install official/security/1password installe des skills optionnelles depuis le dépôt." t143: "Les skills peuvent être limitées à certains systèmes — certaines ne se chargent que sous macOS ou Linux." t144: "skills.external_dirs dans config.yaml permet de charger des skills depuis des répertoires personnalisés." t145: "L'agent peut créer ses propres skills comme mémoire procédurale grâce à skill_manage." t146: "/plan écrit un plan d'implémentation en markdown dans .hermes/plans/ sans rien exécuter." t147: "Les tâches cron peuvent embarquer une skill : hermes cron add --skill blogwatcher \"Vérifie les nouveaux articles\"." t148: "Les cibles de livraison cron incluent telegram, discord, slack, email, sms et plus de 12 autres plateformes." t149: "Si une réponse cron commence par [SILENT], la livraison est supprimée — pratique pour les tâches de simple surveillance." t150: "Cron accepte les délais relatifs (30m), les intervalles (every 2h), les expressions cron et les horodatages ISO." t151: "Les tâches cron s'exécutent dans des sessions d'agent entièrement neuves — les prompts doivent être autonomes." t152: "Le mode vocal fonctionne sans aucune clé API si faster-whisper est installé (reconnaissance vocale locale gratuite)." t153: "Cinq fournisseurs TTS disponibles : Edge TTS (gratuit), ElevenLabs, OpenAI, NeuTTS (local gratuit), MiniMax." t154: "/voice on active le mode vocal dans la CLI. Ctrl+B active ou désactive l'enregistrement en appuyer-pour-parler." t155: "Le TTS en streaming lit les phrases au fil de leur génération — pas besoin d'attendre la réponse complète." t156: "Les messages vocaux sur Telegram, Discord, WhatsApp et Slack sont transcrits automatiquement." t157: "Hermes fonctionne sur 21 plateformes de messagerie : Telegram, Discord, Slack, WhatsApp, Signal, Matrix, IRC, Microsoft Teams, e-mail et plus." t158: "hermes gateway install l'installe comme service système démarré au boot." t159: "DingTalk utilise le Stream Mode — aucun webhook ni URL publique nécessaire." t160: "BlueBubbles apporte iMessage à Hermes via un serveur macOS local." t161: "Les routes webhook prennent en charge la validation HMAC, la limitation de débit et le filtrage d'événements." t162: "Le serveur API expose un endpoint compatible OpenAI, utilisable avec Open WebUI et LibreChat." t163: "Mode salon vocal Discord : le bot rejoint le salon, transcrit la parole et répond à la voix." t164: "group_sessions_per_user: true donne à chaque personne sa propre session dans les discussions de groupe." t165: "/sethome désigne une conversation comme canal principal pour la livraison des tâches cron." t166: "Le gateway gère des délais d'expiration basés sur l'inactivité — les agents actifs peuvent tourner indéfiniment." t167: "L'approbation des commandes dangereuses a 4 niveaux : once, session, always (liste d'autorisation permanente), deny." t168: "Le mode d'approbation intelligent utilise un LLM pour approuver automatiquement les commandes sûres et signaler les dangereuses." t169: "La protection SSRF bloque les réseaux privés, le loopback, les adresses link-local et les adresses de métadonnées cloud." t170: "L'analyse pré-exécution Tirith détecte l'usurpation d'URL par homoglyphes et les schémas de type « pipe vers interpréteur »." t171: "Les sous-processus MCP reçoivent un environnement filtré — seules les variables système sûres sont transmises." t172: "Les fichiers de contexte (.hermes.md, AGENTS.md) sont analysés contre les injections de prompt avant chargement." t173: "command_allowlist dans config.yaml approuve de façon permanente certains motifs de commandes shell." t174: "Le contexte se compresse automatiquement quand il atteint le seuil — les souvenirs sont sauvegardés et l'historique résumé." t175: "La barre d'état passe au jaune, puis à l'orange, puis au rouge à mesure que le contexte se remplit." t176: "SOUL.md est le fichier d'identité principal de l'agent — personnalisez-le pour façonner son comportement." t177: "Hermes charge le contexte du projet depuis .hermes.md, AGENTS.md, CLAUDE.md ou .cursorrules (première correspondance)." t178: "Les fichiers AGENTS.md des sous-répertoires sont découverts progressivement à mesure que l'agent explore les dossiers." t179: "Les fichiers de contexte sont plafonnés à 20 000 caractères avec une troncature intelligente début/fin." t180: "Cinq fournisseurs de navigateur : Chromium local, Browserbase, Browser Use, Camofox et Firecrawl." t181: "Camofox est un navigateur anti-détection — un fork de Firefox avec falsification d'empreinte en C++." t182: "browser_navigate renvoie automatiquement un instantané de la page — inutile d'appeler browser_snapshot ensuite." t183: "browser_vision avec annotate=true superpose des étiquettes numérotées sur les éléments interactifs." t184: "hermes mcp ouvre un sélecteur interactif de MCP approuvés par Nous, installables en une touche." t185: "hermes mcp catalog liste les serveurs MCP approuvés par Nous fournis avec le dépôt." t186: "hermes mcp install installe une entrée du catalogue, demande les identifiants et vous laisse choisir les outils à activer." t187: "Les serveurs MCP se configurent dans config.yaml — transports stdio et HTTP pris en charge." t188: "Filtrage d'outils par serveur : tools.include met des outils en liste blanche, tools.exclude en liste noire." t189: "Les serveurs MCP génèrent automatiquement des jeux d'outils à l'exécution — hermes tools peut les activer ou désactiver par plateforme." t190: "Prise en charge OAuth pour MCP : auth: oauth active l'autorisation via le navigateur avec PKCE." t191: "Les points de contrôle n'ont aucun surcoût quand aucun fichier n'est modifié — activés par défaut." t192: "Un instantané pré-rollback est enregistré automatiquement pour pouvoir annuler l'annulation." t193: "/rollback annule aussi le tour de conversation, si bien que l'agent ne se souvient pas des changements annulés." t194: "Les points de contrôle utilisent des dépôts fantômes dans ~/.hermes/checkpoints/ — le .git de votre projet n'est jamais touché." t195: "batch_runner.py traite des centaines de prompts en parallèle pour générer des données d'entraînement." t196: "hermes chat -Q active le mode silencieux pour un usage programmatique — masque la bannière et le spinner." t197: "L'enregistrement des trajectoires (--save-trajectories) capture les traces complètes d'utilisation des outils pour l'entraînement de modèles." t198: "Trois types de plugins : généraux (outils/hooks), fournisseurs de mémoire et moteurs de contexte." t199: "hermes plugins install owner/repo installe des plugins directement depuis GitHub." t200: "Fournisseurs de mémoire externes : Honcho, OpenViking et Mem0 intégrés ; Hindsight et d'autres via hermes plugins install." t201: "Les hooks de plugin incluent pre/post_tool_call, pre/post_llm_call et transform_terminal_output pour normaliser la sortie." t202: "Le cache de prompt (Anthropic) réduit les coûts en réutilisant les préfixes de prompt système déjà mis en cache." t203: "L'agent génère les titres de session dans un thread d'arrière-plan — aucun impact sur la latence." t204: "Le routage intelligent des modèles peut diriger automatiquement les requêtes simples vers un modèle moins cher." t205: "Les commandes slash acceptent la correspondance par préfixe : /h renvoie à /help, /mod à /model." t206: "Glisser un chemin de fichier dans le terminal joint automatiquement les images ou l'envoie comme contexte." t207: ".worktreeinclude à la racine de votre dépôt liste les fichiers ignorés par git à copier dans les worktrees." t208: "hermes acp exécute Hermes comme serveur ACP pour l'intégration à VS Code, Zed et JetBrains." t209: "Fournisseurs personnalisés : enregistrez des endpoints nommés dans config.yaml sous custom_providers." t210: "HERMES_EPHEMERAL_SYSTEM_PROMPT injecte un prompt système qui n'est jamais conservé dans l'historique." t211: "credential_pool_strategies prend en charge les rotations fill_first, round_robin, least_used et random." t212: "hermes auth add nous ou hermes auth add openai-codex configure des fournisseurs basés sur OAuth." t213: "Le serveur API prend en charge à la fois Chat Completions et l'API Responses avec état côté serveur." t214: "tool_preview_length: 0 dans la configuration affiche les chemins de fichiers complets dans le flux d'activité du spinner." t215: "hermes status --deep effectue des vérifications de diagnostic approfondies sur tous les composants." t216: "Les tâches cron peuvent embarquer un script Python (--script) dont la sortie standard est injectée dans le prompt comme contexte." t217: "Les scripts cron vivent dans ~/.hermes/scripts/ et s'exécutent avant l'agent — parfait pour les pipelines de collecte de données." t218: "prefill_messages_file dans config.yaml injecte des exemples few-shot dans chaque appel API, sans jamais les enregistrer dans l'historique." t219: "SOUL.md remplace entièrement l'identité par défaut de l'agent — réécrivez-le pour faire d'Hermes le vôtre." t220: "SOUL.md est initialisé avec une personnalité par défaut au premier lancement. Modifiez-le pour le personnaliser." t221: "/compress consacre 60 à 70 % du budget du résumé à votre sujet et élague agressivement le reste." t222: "À partir de la deuxième compression, le compresseur met à jour le résumé précédent au lieu de repartir de zéro." t223: "Avant la réinitialisation d'une session gateway, Hermes sauvegarde automatiquement les faits importants en mémoire, en arrière-plan." t224: "network.force_ipv4: true dans config.yaml corrige les blocages sur les serveurs dont l'IPv6 est défaillant — patche socket à la volée." t225: "L'outil terminal annote les codes de sortie courants : grep renvoyant 1 = 'Aucune correspondance (pas une erreur)'." t226: "Les commandes terminal de premier plan en échec sont relancées jusqu'à 3 fois avec un délai exponentiel (2 s, 4 s, 8 s)." t227: "Les commandes sudo simples sont réécrites automatiquement pour recevoir SUDO_PASSWORD depuis .env — aucune saisie interactive nécessaire." t228: "Les helpers d'execute_code exigent des imports explicites : from hermes_tools import json_parse, shell_quote, retry." t229: "Les 7 outils sandbox d'execute_code (web_search, terminal, read/write/search/patch) passent par RPC — ils n'entrent jamais dans le contexte." t230: "Lire 3 fois ou plus la même région d'un fichier déclenche un avertissement. À partir de 4, c'est bloqué pour éviter les boucles." t231: "write_file et patch détectent si un fichier a été modifié de l'extérieur depuis la dernière lecture et signalent qu'il est périmé." t232: "Le format de patch V4A prend en charge les directives Add File, Delete File et Move File — pas seulement Update." t233: "Les serveurs MCP peuvent demander des complétions LLM en retour via le sampling — l'agent devient un outil pour le serveur." t234: "Les serveurs MCP envoient notifications/tools/list_changed pour déclencher le réenregistrement automatique des outils sans redémarrage." t235: "delegate_task avec acp_command: 'claude' lance Claude Code comme agent enfant depuis n'importe quelle plateforme." t236: "La délégation dispose d'un thread heartbeat — l'activité de l'enfant remonte au parent, ce qui évite les expirations du gateway." t237: "Quand un fournisseur renvoie HTTP 402 (paiement requis), le client auxiliaire bascule automatiquement vers le suivant." t238: "agent.tool_use_enforcement recadre les modèles qui décrivent des actions au lieu d'appeler les outils — auto pour GPT/Codex." t239: "agent.restart_after_turn_timeout laisse les tours en cours se terminer avant que /restart n'entre dans stop() ; restart_drain_timeout n'est que le budget d'interruption forcée une fois stop() lancé." t240: "agent.api_max_retries (3 par défaut) contrôle combien de fois l'agent réessaie un appel API échoué avant de remonter l'erreur — baissez-le pour un basculement rapide." t241: "Le gateway met en cache les instances AIAgent par session — détruire ce cache casse le cache de prompt Anthropic." t242: "N'importe quel site web peut exposer des skills via /.well-known/skills/index.json — le hub de skills les découvre automatiquement." t243: "Le journal d'audit des skills dans ~/.hermes/skills/.hub/audit.log trace chaque installation et suppression." t244: "Les worktrees git obsolètes sont nettoyés automatiquement au démarrage : les arbres propres et entièrement fusionnés sont supprimés ; le travail modifié ou non poussé est toujours préservé." t245: "Les profils délimitent l'état d'Hermes via HERMES_HOME ; les sous-processus d'outils sur l'hôte conservent votre vrai HOME sauf si terminal.home_mode vaut profile." t246: "La variable d'environnement HERMES_HOME_MODE (octal, ex. 0701) définit des permissions de répertoire personnalisées pour la traversée par le serveur web." t247: "Mode conteneur : placez .container-mode dans HERMES_HOME et la CLI hôte s'exécute automatiquement dans le conteneur." t248: "Ctrl+C a 5 niveaux de priorité : annuler l'enregistrement → annuler les invites → annuler le sélecteur → interrompre l'agent → quitter." t249: "Chaque interruption pendant une exécution de l'agent est consignée dans ~/.hermes/interrupt_debug.log avec horodatage." t250: "BROWSER_CDP_URL connecte les outils navigateur à n'importe quel navigateur de la famille Chromium en cours d'exécution — accepte WebSocket, HTTP ou host:port." t251: "BROWSERBASE_ADVANCED_STEALTH=true active l'anti-détection avancée avec un Chromium personnalisé (Scale Plan)." t252: "La CLI passe automatiquement en mode compact dans les terminaux de moins de 80 colonnes." t253: "Les commandes rapides existent en deux types : exec (exécute directement une commande shell) et alias (redirige vers une autre commande)." t254: "Modèle de délégation par tâche : delegation.model et delegation.provider dans la configuration routent les sous-agents vers des modèles moins chers." t255: "delegation.reasoning_effort contrôle indépendamment la profondeur de réflexion des sous-agents." t256: "display.platforms dans config.yaml permet des surcharges d'affichage par plateforme : {telegram: {tool_progress: all}}." t257: "human_delay.mode dans la configuration simule une vitesse de frappe humaine — plage min_ms/max_ms configurable." t258: "Les migrations de version de configuration s'exécutent automatiquement au chargement — les nouvelles clés apparaissent sans intervention manuelle." t259: "Les modèles GPT et Codex reçoivent des consignes spéciales dans le prompt système pour la discipline et l'usage obligatoire des outils." t260: "Les modèles Gemini reçoivent des directives adaptées : chemins absolus, appels d'outils en parallèle et commandes non interactives." t261: "context.engine dans config.yaml peut désigner un nom de plugin pour d'autres stratégies de gestion du contexte." t262: "Les instantanés de page navigateur de plus de 15 000 caractères sont tronqués ou résumés automatiquement ; l'instantané complet est enregistré dans cache/web pour être parcouru avec read_file." t263: "Le compresseur effectue une pré-passe peu coûteuse : les sorties d'outils de plus de 200 caractères sont remplacées par des marqueurs avant l'appel au LLM." t264: "Quand une compression échoue, les tentatives suivantes sont suspendues pendant 10 minutes pour éviter de marteler l'API." t265: "Les commandes dangereuses longues (>70 caractères) offrent une option 'view' dans l'invite d'approbation pour voir d'abord le texte complet." t266: "La visualisation du niveau audio affiche des barres ▁▂▃▄▅▆▇ pendant l'enregistrement vocal, selon le niveau RMS du micro." t267: "Les noms de profil ne peuvent pas entrer en conflit avec des binaires existants du PATH — 'hermes profile create ls' serait refusé." t268: "hermes profile create backup --clone-all copie tout (configuration, clés, SOUL.md, mémoires, skills, sessions)." t269: "La touche d'enregistrement vocal est configurable via voice.record_key dans config.yaml — pas seulement Ctrl+B." t270: "Les fichiers .cursorrules et .cursor/rules/*.mdc sont détectés et chargés automatiquement comme contexte de projet." t271: "Les fichiers de contexte sont contrôlés contre plus de 10 schémas d'injection de prompt — Unicode invisible, « ignore les instructions », tentatives d'exfiltration." t272: "GPT-5 et Codex utilisent le rôle 'developer' au lieu de 'system' dans le format des messages." t273: "Surcharges auxiliaires par tâche : auxiliary.vision.provider, auxiliary.compression.model, etc. dans config.yaml." t274: "Le client auxiliaire traite 'main' comme un alias de fournisseur — il correspond à votre fournisseur et modèle principaux réels." t275: "hermes claw migrate --dry-run prévisualise la migration OpenClaw sans rien écrire." t276: "Les chemins de fichiers collés avec des guillemets ou des espaces échappés sont gérés automatiquement — aucun nettoyage manuel nécessaire." t277: "Les commandes slash ne déclenchent jamais le repli des gros collages — /command avec de gros arguments fonctionne correctement." t278: "En mode interruption, les commandes slash saisies pendant l'exécution de l'agent contournent la logique d'interruption et s'exécutent immédiatement." t279: "HERMES_DEV=1 contourne la détection du mode conteneur pour le développement local." t280: "Chaque serveur MCP obtient son propre jeu d'outils (mcp-servername) activable indépendamment via hermes tools." t281: "Les marqueurs ${ENV_VAR} des MCP dans la configuration sont résolus au lancement du serveur — y compris les variables de ~/.hermes/.env." t282: "Les skills provenant de dépôts de confiance (NousResearch) reçoivent le niveau de sécurité 'trusted' ; les skills communautaires subissent une analyse supplémentaire." t283: "La quarantaine des skills dans ~/.hermes/skills/.hub/quarantine/ conserve les skills en attente de revue de sécurité." t284: "/steer injecte une note après le prochain appel d'outil — réorientez la tâche en cours sans l'interrompre." t285: "/goal fixe un objectif permanent en boucle Ralph — Hermes enchaîne les tours automatiquement jusqu'à ce qu'un juge déclare la tâche terminée." t286: "/snapshot create [label] enregistre un instantané complet de la configuration d'Hermes ; /snapshot restore permet d'y revenir plus tard." t287: "/copy [N] copie la dernière réponse de l'assistant dans votre presse-papiers, ou la N-ième en partant de la fin avec un nombre." t288: "/redraw force un rafraîchissement complet de l'interface, corrigeant les décalages du terminal après un redimensionnement tmux ou des artefacts de sélection à la souris." t289: "/agents (alias /tasks) affiche les agents actifs et les tâches d'arrière-plan en cours dans la session actuelle." t290: "/footer active ou désactive le pied de page du gateway sur les réponses finales, indiquant le modèle, le % de contexte et le cwd." t291: "/busy queue|steer|interrupt contrôle ce que fait la touche Enter pendant qu'Hermes travaille." t292: "/topic dans les messages privés Telegram active le mode topics multi-sessions géré par l'utilisateur — /topic restaure des sessions passées en ligne." t293: "/approve session|always exécute une commande dangereuse en attente avec la portée de confiance choisie ; /deny la rejette." t294: "/restart redémarre proprement le gateway après avoir laissé finir les exécutions actives, puis prévient le demandeur une fois revenu en ligne." t295: "/kanban boards switch change le tableau Kanban multi-projets actif depuis le chat." t296: "/reload recharge ~/.hermes/.env dans la session en cours — prenez en compte de nouvelles clés API sans redémarrer." t297: "cronjob avec no_agent=True exécute un script selon un planning et envoie directement sa sortie standard — zéro token, zéro LLM." t298: "Une sortie standard vide d'un script cron signifie un tick silencieux — rien n'est livré, parfait pour les chiens de garde à seuil." t299: "HERMES_CRON_MAX_PARALLEL (4 par défaut) limite le nombre de tâches cron exécutées par tick pour que les rafales ne saturent pas vos clés." t300: "Les hooks du gateway vivent sous ~/.hermes/hooks// avec HOOK.yaml + handler.py — le handler doit s'appeler `handle`." t301: "Les événements de hook incluent gateway:startup, session:start, agent:step et les abonnements génériques command:*." t302: "Déposez une checklist ~/.hermes/BOOT.md et un hook gateway:startup l'exécutera comme agent ponctuel à chaque démarrage." t303: "hermes curator run --dry-run prévisualise ce que le curateur archiverait ou consoliderait sans rien modifier." t304: "hermes curator pin verrouille une skill contre l'archivage automatique comme contre l'outil skill_manage de l'agent." t305: "hermes curator rollback restaure les skills depuis un instantané pré-exécution — les sauvegardes vivent sous skills/.curator_backups/." t306: "hermes auth reset [target] efface les temps de repos et les indicateurs d'épuisement d'un pool d'identifiants entier, ou d'un seul identifiant par index, id ou libellé." t307: "credential_pool_strategies.: round_robin fait tourner les clés de façon équitable au lieu du fill_first par défaut." t308: "use_gateway: true par outil route web, image, tts ou browser via votre abonnement Nous — aucune clé supplémentaire." t309: "provider_routing.data_collection: deny exclut les fournisseurs qui conservent les données sur OpenRouter." t310: "provider_routing.require_parameters: true ne route que vers les fournisseurs prenant en charge chaque paramètre de votre requête." t311: "HERMES_TUI_RESUME=1 se rattache automatiquement à la session TUI la plus récente au lancement — pratique après une coupure SSH." t312: "HERMES_TUI_THEME=light|dark| force le thème de la TUI sur les terminaux qui ne définissent pas COLORFGBG." t313: "Ctrl+G ou Ctrl+X Ctrl+E dans la TUI ouvre le tampon de saisie dans $EDITOR pour les longs prompts multilignes." t314: "La TUI affiche le LaTeX en ligne — $E=mc^2$ devient des maths Unicode au lieu de TeX brut." t315: "hermes dashboard lance une interface web locale sur 127.0.0.1:9119 — aucune donnée ne quitte localhost." t316: "hermes dashboard intègre la TUI Hermes complète dans votre navigateur via xterm.js et un PTY WebSocket." t317: "Déposez un YAML dans ~/.hermes/dashboard-themes/ avec deux couleurs de palette pour rhabiller tout le tableau de bord." t318: "Les plugins du tableau de bord se déposent tels quels : manifest.json + bundle JS dans ~/.hermes/dashboard-plugins/ — aucun build npm requis." t319: "layoutVariant: cockpit dans un thème du tableau de bord ajoute une barre latérale gauche de 260px que les plugins peuvent remplir via l'emplacement sidebar." t320: "display.tool_progress_command: true expose /verbose sur les plateformes de messagerie ; par défaut, il est réservé à la CLI." t321: "HERMES_BACKGROUND_NOTIFICATIONS=result ne vous notifie qu'à la fin des tâches d'arrière-plan (au lieu de concise/all/error/off)." t322: "HERMES_WRITE_SAFE_ROOT restreint write_file/patch à des préfixes de répertoires ; plusieurs chemins via os.pathsep (: ou ;)." t323: "HERMES_IGNORE_RULES désactive l'injection automatique d'AGENTS.md, SOUL.md, .cursorrules, de la mémoire et des skills préchargées." t324: "HERMES_ACCEPT_HOOKS approuve automatiquement les hooks shell inédits déclarés dans config.yaml, sans invite dans le terminal." t325: "auxiliary.goal_judge.model envoie le juge de /goal vers un modèle rapide et peu coûteux pour garder le coût des boucles proche de zéro." t326: "Les points de contrôle ignorent les répertoires de plus de 50 000 fichiers pour éviter des opérations git lentes sur les monorepos géants." t327: "tts.provider: piper exécute une TTS locale en 44 langues sur CPU — les voix se téléchargent automatiquement dans ~/.hermes/cache/piper-voices/." t328: "tts.providers..type: command branche n'importe quel moteur TTS en ligne de commande grâce aux placeholders {input_path} et {output_path}." t329: "API_SERVER_ENABLED=true lance un point de terminaison compatible OpenAI à côté du gateway, pour Open WebUI et LibreChat." t330: "GATEWAY_PROXY_URL met en place une configuration scindée : les E/S des plateformes en local, le travail de l'agent délégué à un serveur API distant." t331: "MATRIX_DEVICE_ID fixe un ID d'appareil stable pour l'E2EE — sans lui, les clés changent à chaque démarrage et le déchiffrement de l'historique casse." t332: "TELEGRAM_WEBHOOK_SECRET est obligatoire dès que TELEGRAM_WEBHOOK_URL est défini — générez-le avec openssl rand -hex 32." t333: "batch_runner.py --resume reconnaît les prompts déjà traités par leur texte, donc réordonner le jeu de données ne relance pas le travail terminé." t334: "/new démarre une nouvelle session sur place (alias /reset) — nouvel ID de session, historique vierge, la CLI reste ouverte." t335: "/clear efface l'écran du terminal ET démarre une nouvelle session — un seul raccourci pour repartir à zéro visuellement." t336: "/history affiche la conversation en cours directement dans la CLI sans la quitter — pratique pour une relecture rapide." t337: "/save écrit la conversation en cours sur le disque sans terminer la session." t338: "/status affiche les infos de session en un coup d'œil : ID, titre, modèle, consommation de tokens et temps écoulé." t339: "/image joint un fichier image local à votre prochain prompt, sans coller ni glisser-déposer." t340: "/platforms affiche l'état de connexion du gateway et des plateformes de messagerie, directement depuis le chat." t341: "/commands pagine la liste complète des commandes slash et des skills installées — pratique sur les plateformes sans complétion par tabulation." t342: "/toolsets liste tous les toolsets disponibles pour savoir ce qu'accepte -t/--toolsets." t343: "/voice tts bascule en mode TTS seul — l'agent répond à voix haute mais vous continuez à taper vos prompts." t344: "/reload-skills rescanne ~/.hermes/skills/ pour que les skills déposées apparaissent sans redémarrer la session." t345: "/indicator kaomoji|emoji|unicode|ascii choisit le style de l'indicateur d'activité de la TUI affiché pendant les exécutions de l'agent." t346: "/debug téléverse un bundle de support (infos système + journaux) et renvoie des liens partageables — fonctionne aussi dans le chat." t347: "hermes -z \"\" est le one-shot le plus pur : la réponse finale sur stdout, rien d'autre — idéal pour les pipes dans des scripts." t348: "hermes chat --pass-session-id injecte l'ID de session dans le prompt système pour que l'agent puisse y faire référence lui-même." t349: "hermes chat --image path/to/pic.png joint une image locale à une requête -q unique, sans étape de téléversement séparée." t350: "hermes chat --ignore-user-config ignore la configuration utilisateur active — pour des rapports de bug reproductibles et des exécutions en CI." t351: "hermes chat --source tool étiquette les chats programmatiques pour qu'ils n'encombrent pas hermes sessions list." t352: "hermes dump --show-keys inclut des empreintes masquées des clés API pour un débogage plus poussé avec le support." t353: "hermes sessions rename \"nouveau titre\" renomme n'importe quelle session passée ; hermes sessions delete en supprime une." t354: "hermes import restaure un zip de sauvegarde Hermes complet ; les exports JSON/JSONL de sessions s'importent depuis la page Sessions du tableau de bord." t355: "hermes fallback gère la chaîne fallback_model de manière interactive — sans modifier config.yaml à la main." t356: "hermes pairing renouvelle le token d'appairage des DM — la première personne qui écrit après le renouvellement obtient l'accès au bot." t357: "hermes setup guide les nouveaux utilisateurs à travers le fournisseur, les clés et le branchement des plateformes en un seul parcours interactif." t358: "hermes status --deep lance le bilan de santé complet de chaque composant ; hermes status seul donne la vue rapide." t359: "HERMES_AGENT_TIMEOUT=0 désactive l'arrêt pour inactivité du gateway sur un agent en cours — utile pour les longues sessions de recherche." t360: "HERMES_ENABLE_PROJECT_PLUGINS=1 charge automatiquement les plugins locaux au dépôt depuis ./.hermes/plugins/ — soumis à une validation de confiance par conception." t361: "HERMES_DISABLE_FILE_STATE_GUARD=1 désactive la protection « fichier modifié depuis votre lecture » sur patch et write_file." t362: "HERMES_ALLOW_PRIVATE_URLS=true autorise les outils web à atteindre localhost et les réseaux privés — désactivé par défaut en mode gateway." t363: "HERMES_OPTIONAL_SKILLS=name1,name2 installe automatiquement des skills supplémentaires du catalogue optionnel au premier lancement de chaque profil." t364: "HERMES_BUNDLED_SKILLS pointe vers une arborescence personnalisée de skills embarquées — utilisé par les paquets Homebrew et Nix." t365: "HERMES_DUMP_REQUEST_STDOUT=1 écrit la charge utile de chaque requête API sur stdout plutôt que dans les fichiers journaux." t366: "HERMES_OAUTH_TRACE=1 journalise (avec masquage) les échanges et renouvellements de tokens OAuth pour déboguer l'authentification des fournisseurs." t367: "HERMES_STREAM_RETRIES (3 par défaut) contrôle le nombre de tentatives de reconnexion en cours de flux lors d'erreurs réseau passagères." t368: "HERMES_GATEWAY_BUSY_ACK_ENABLED=false supprime les accusés de réception ⚡/⏳/⏩ quand un utilisateur écrit à un agent occupé." t369: "HERMES_AGENT_NOTIFY_INTERVAL (180s par défaut) définit la fréquence à laquelle le gateway envoie un point d'avancement sur les tours longs." t370: "HERMES_RESTART_DRAIN_TIMEOUT (900s par défaut) plafonne le temps pendant lequel /restart attend les exécutions en cours avant de forcer." t371: "HERMES_CHECKPOINT_TIMEOUT (30s par défaut) plafonne la création des points de contrôle du système de fichiers — augmentez-le sur les monorepos géants." t372: "image_gen.model dans config.yaml choisit le modèle FAL : flux-2/klein, gpt-image-2, nano-banana-pro, et d'autres." t373: "image_gen.provider fait passer la génération d'images par un plugin (OpenAI Images, Codex, FAL) au lieu du fournisseur par défaut." t374: "AUXILIARY_VISION_BASE_URL + AUXILIARY_VISION_API_KEY dirigent l'analyse d'images vers n'importe quel point de terminaison compatible OpenAI." t375: "security.tirith_fail_open: false fait bloquer les commandes par Hermes quand le scanner tirith lui-même tombe en erreur." t376: "La variable d'environnement TIRITH_FAIL_OPEN remplace la configuration tirith_fail_open — une bascule rapide sans modifier config.yaml." t377: "Les chats --source tool sont exclus de hermes sessions list par défaut — passez --source explicitement pour les voir." t378: "Les ID de session sont préfixés par un horodatage (20250305_091523_abcd), donc le tri fonctionne naturellement avec ls et jq." t379: "API_SERVER_MODEL_NAME personnalise le nom du modèle sur /v1/models — indispensable pour les configurations Open WebUI multi-profils." t380: "Les plugins du tableau de bord sont servis depuis /dashboard-plugins// — déposez les fichiers dans ~/.hermes/dashboard-plugins/." placeholder: p01: "Posez une question, ou tapez / pour les commandes…" p02: "Résume le contenu de ce dossier" p03: "Rédige une réponse au dernier e-mail de ma boîte de réception" p04: "Planifie une fonctionnalité, puis construis-la étape par étape" p05: "Trouve et corrige un test qui échoue" p06: "Fais des recherches sur ce sujet et rédige-moi une synthèse" p07: "Qu'est-ce qui a changé récemment dans ce dépôt ?" p08: "Transforme ces notes en liste de tâches" p09: "Explique cette erreur et comment la corriger" p10: "Définis un rappel ou planifie une tâche récurrente" p11: "Tapez / pour parcourir les commandes, ou Ctrl+P pour la palette"