@loicngr/kobo 2.1.21 → 2.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +22 -4
- package/CHANGELOG.md +5 -0
- package/CONFIGURATION.md +23 -2
- package/dist/server/services/agent/engines/claude-code/engine.js +5 -2
- package/dist/server/services/agent/engines/codex/engine.js +3 -0
- package/dist/server/services/agent/orchestrator.js +1 -0
- package/dist/server/services/agent/turn-liveness.js +1 -1
- package/dist/server/services/settings-service.js +30 -0
- package/docs/deployment-vps.md +25 -10
- package/docs/getting-started.md +11 -0
- package/package.json +1 -1
- package/scripts/kobo-update +19 -11
- package/src/client/dist/pwa/assets/{ActivityFeed-DiUxnmGJ.js → ActivityFeed-2wu6qXx1.js} +1 -1
- package/src/client/dist/pwa/assets/{AutoLoopFinalReviewSettings-f4VDR5dd.js → AutoLoopFinalReviewSettings-CwnNUWCh.js} +1 -1
- package/src/client/dist/pwa/assets/{ChangelogPage-dEWpjTlp.js → ChangelogPage-D9ke0TYz.js} +1 -1
- package/src/client/dist/pwa/assets/{ComparisonPanel-Bwbqgvr4.js → ComparisonPanel-ytDu1L7a.js} +1 -1
- package/src/client/dist/pwa/assets/{CreatePage-CCCCAhrx.js → CreatePage-YQ_jGilf.js} +1 -1
- package/src/client/dist/pwa/assets/{DashboardPage-3byhBITf.js → DashboardPage-C-PyArla.js} +1 -1
- package/src/client/dist/pwa/assets/{DiffViewer-Bj_NTfCF.js → DiffViewer-CPobwSwm.js} +3 -3
- package/src/client/dist/pwa/assets/{DocumentsPanel-xyLDV3T1.js → DocumentsPanel-BjZGNI-p.js} +1 -1
- package/src/client/dist/pwa/assets/{DrawerToggleButton-pwBSstQP.js → DrawerToggleButton-Dtd6fhYu.js} +1 -1
- package/src/client/dist/pwa/assets/{GitPanel-DvIdrkVw.js → GitPanel-BHJ3lpJZ.js} +3 -3
- package/src/client/dist/pwa/assets/{HealthPage-BSwhZQRo.js → HealthPage-Lv_IdF1l.js} +1 -1
- package/src/client/dist/pwa/assets/{MainLayout-DZJ9BvZw.js → MainLayout-DYumlWcP.js} +2 -2
- package/src/client/dist/pwa/assets/{MemoryPanel-ChR032zP.js → MemoryPanel-DS2F3x-S.js} +1 -1
- package/src/client/dist/pwa/assets/{MemoryProposalList-BRKSoS4K.js → MemoryProposalList-D_KDS3uX.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnDropdown-o3QH0Bb8.js → QBtnDropdown-XkBxmJO9.js} +1 -1
- package/src/client/dist/pwa/assets/{QExpansionItem-BhFHiyq9.js → QExpansionItem-B5vbHxJ2.js} +1 -1
- package/src/client/dist/pwa/assets/{QScrollArea-BsNY6slB.js → QScrollArea-BE_fAg20.js} +1 -1
- package/src/client/dist/pwa/assets/{QSelect-bEq3g_io.js → QSelect-BjZk4-r8.js} +1 -1
- package/src/client/dist/pwa/assets/{QTooltip-xYZ6KNu2.js → QTooltip-Dhn6VXWR.js} +1 -1
- package/src/client/dist/pwa/assets/{SchedulePanel-DIFv_FTY.js → SchedulePanel-BDhIt9pX.js} +1 -1
- package/src/client/dist/pwa/assets/{SearchPage-BqTBIt5E.js → SearchPage-CJrtIenZ.js} +1 -1
- package/src/client/dist/pwa/assets/SettingsPage-BSwN45zt.js +9 -0
- package/src/client/dist/pwa/assets/{SettingsPage-BRvUAZ5r.css → SettingsPage-CNIpxG-U.css} +1 -1
- package/src/client/dist/pwa/assets/{SplitWorkspacePage-D6r2pl5g.js → SplitWorkspacePage-BV62otQw.js} +1 -1
- package/src/client/dist/pwa/assets/{TerminalPanel-CladK9Vv.js → TerminalPanel-TQUHtZ-q.js} +1 -1
- package/src/client/dist/pwa/assets/{ToolCallItem-CdzEME4w.js → ToolCallItem-DxdYefuz.js} +1 -1
- package/src/client/dist/pwa/assets/{TouchPan-B4gQPwGN.js → TouchPan-CtwfZgkX.js} +1 -1
- package/src/client/dist/pwa/assets/{TourReplayButton-B0j6AZwU.js → TourReplayButton-DEC_Yt6E.js} +1 -1
- package/src/client/dist/pwa/assets/{WorkspaceAttentionLabels-CeVhoidC.js → WorkspaceAttentionLabels-BehGsWhI.js} +1 -1
- package/src/client/dist/pwa/assets/{WorkspacePage-w2bF8wTd.css → WorkspacePage-Bk-WWOYM.css} +1 -1
- package/src/client/dist/pwa/assets/{WorkspacePage-CK5XCuG_.js → WorkspacePage-CQz6QL5L.js} +3 -3
- package/src/client/dist/pwa/assets/{browser-B8tNScg1.js → browser-B3bGJv7H.js} +1 -1
- package/src/client/dist/pwa/assets/{build-path-tree-kmVAcvs_.js → build-path-tree-Bwwe_8vU.js} +1 -1
- package/src/client/dist/pwa/assets/{custom-sounds-CJwd-8TL.js → custom-sounds-1Rb1a5LA.js} +1 -1
- package/src/client/dist/pwa/assets/{de-BaO6kbdO.js → de-bfOiFUu1.js} +1 -1
- package/src/client/dist/pwa/assets/{editor.api-CgbPVW9s.js → editor.api-D2PTZoSF.js} +1 -1
- package/src/client/dist/pwa/assets/{efforts-y7Wf_Rgd.js → efforts-JkWc_mU5.js} +1 -1
- package/src/client/dist/pwa/assets/{es-DTvSsbD0.js → es-C5Sk8pec.js} +1 -1
- package/src/client/dist/pwa/assets/{expand-template-BFbbjj7X.js → expand-template-C-aGZz7k.js} +1 -1
- package/src/client/dist/pwa/assets/{format-BETfc4z9.js → format-BbXB3nKS.js} +1 -1
- package/src/client/dist/pwa/assets/{formatters-C22K9vlC.js → formatters-Bu3lC0Jk.js} +1 -1
- package/src/client/dist/pwa/assets/{fr-BH7V66Yz.js → fr-BNVJp67K.js} +1 -1
- package/src/client/dist/pwa/assets/{freemarker2-DiRVvp9O.js → freemarker2-qq6O820q.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-BLYRroSQ.js → handlebars-nXATCa7t.js} +1 -1
- package/src/client/dist/pwa/assets/{html-DAW2vteY.js → html-ZSNyTQeY.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-B_b02gtS.js +1 -0
- package/src/client/dist/pwa/assets/{index-CbyHfF8I.js → index-BZKHE14f.js} +3 -3
- package/src/client/dist/pwa/assets/{it-DZGbkkoy.js → it-B9g24VRZ.js} +1 -1
- package/src/client/dist/pwa/assets/{javascript-Bb5J8n0k.js → javascript-B3Elzrc0.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-Dqx3adnJ.js → liquid-CrMGh9mA.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-D_7igLV3.js → mdx-C6nxSGQ5.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco-contributions-C-0CbrAy.js → monaco-contributions-WtuTHJJ8.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco.contribution-c6JPBEZI.js → monaco.contribution--KeSH1BU.js} +2 -2
- package/src/client/dist/pwa/assets/{network-auth-BE4qbvWm.js → network-auth-DknPaiQS.js} +1 -1
- package/src/client/dist/pwa/assets/{notify-theme-BVFBBGrJ.js → notify-theme-DTaB0RsK.js} +1 -1
- package/src/client/dist/pwa/assets/{project-color-CHOR2jB5.js → project-color-bm_jpHka.js} +1 -1
- package/src/client/dist/pwa/assets/{python-Dqubw1F5.js → python-CQI_FwfK.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-BQphc9Kt.js → razor-BT2wh4_7.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-Dep00l0X.js → typescript-D3ibItMf.js} +1 -1
- package/src/client/dist/pwa/assets/{use-search-index-status-CQHHvHwM.js → use-search-index-status-BnFR-_2l.js} +1 -1
- package/src/client/dist/pwa/assets/{use-tours-IVbXTmz2.js → use-tours-CsPhvrxf.js} +2 -2
- package/src/client/dist/pwa/assets/{use-worktree-restore-B3s5xDGR.js → use-worktree-restore-B5s0BuHk.js} +1 -1
- package/src/client/dist/pwa/assets/{workspace-templates-CyuTpztP.js → workspace-templates-GLO1mBlj.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-BMS2dvaF.js → xml-EIEQlO3Y.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-CYw92aic.js → yaml-CJdHLr6G.js} +1 -1
- package/src/client/dist/pwa/index.html +1 -1
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/client/dist/pwa/assets/SettingsPage-BLD0xWFB.js +0 -9
- package/src/client/dist/pwa/assets/i18n-DnuTmw3O.js +0 -1
|
@@ -8,7 +8,7 @@ KOBO_WORKSPACE_ID — id Kōbō du workspace (stable après renommage)
|
|
|
8
8
|
KOBO_WORKSPACE_NAME — nom affiché du workspace
|
|
9
9
|
KOBO_FORGE — forge résolue : github / gitlab / none
|
|
10
10
|
KOBO_PR_NUMBER — numéro de PR/MR sur la forge résolue (vide si aucune ouverte)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
|
|
11
|
-
# ton script — utilise $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Réinitialiser au défaut Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Réinitialiser le script ?`,"settings.changeSourceBranchScript.replaceConfirm":`Tes modifications seront remplacées par le script Kōbō par défaut. Continuer ?`,"settings.cleanupScriptHint":`Script shell exécuté dans le worktree après chaque fin de session de l'agent. En mode auto-loop, il ne s'exécute qu'une fois toutes les tâches terminées. Laisser vide pour désactiver.`,"settings.cleanupScriptPlaceholder":`ex. supprimer des fichiers temporaires, arrêter des conteneurs…`,"settings.cleanupScriptMode":`Quand l'exécuter`,"settings.cleanupScriptMode.idle":`À chaque fin de session — même s'il reste des tâches`,"settings.cleanupScriptMode.noTasks":`Uniquement quand plus aucune tâche Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Lancer uniquement si des fichiers ont été modifiés, ajoutés ou supprimés`,"settings.cleanupScriptMode.inherit":`Hériter du réglage global`,"settings.taskPromptTemplate":`Prompt de tâche`,"settings.taskPromptTemplatePlaceholder":`Prompt inséré automatiquement dans la description de tâche…`,"settings.taskPromptTemplateHint":`Injecté automatiquement dans la description de tâche sur la page de création quand ce projet est sélectionné. S'il n'est pas modifié, il est remplacé en changeant de projet ; dès que vous l'éditez, votre texte est conservé.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Exécuté avec bash dans le worktree après sa création, avant le démarrage de l'agent. Pas besoin de shebang. En cas d'échec, le workspace passe en erreur. Timeout : 5 minutes.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Aucun`,"settings.e2e.frameworkOther":`Autre`,"settings.e2e.skill":`Skill (optionnel)`,"settings.e2e.skillPlaceholder":`ex : cypress-tester`,"settings.e2e.prompt":`Guidance personnalisée (optionnel)`,"settings.e2e.promptPlaceholder":`ex : utiliser le page-object, cibler les data-testid`,"settings.e2e.helpText":`Quand configuré, l'agent de grooming auto-loop insère des sous-tâches E2E pour les fonctionnalités UI.`,"settings.finalization.title":`Finalisation de l'auto-loop`,"settings.finalization.helpText":`Optionnel : un prompt que l'agent exécute lors de la toute dernière itération de l'auto-loop. Typiquement utilisé pour les contrôles qualité finaux (lint, typecheck, tests). L'étape de grooming créera une tâche préfixée [FINAL] qui utilisera ce prompt.`,"settings.finalization.prompt":`Prompt de finalisation`,"settings.finalization.promptPlaceholder":`ex. Lance npm run lint et npm test, puis marque cette tâche comme terminée.`,"settings.editorCommand":`Commande éditeur`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Commande utilisée pour ouvrir le worktree dans votre éditeur. Le chemin du worktree est passé en argument.`,"settings.fileManagerCommand":`Commande explorateur de fichiers`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Commande utilisée pour ouvrir le worktree dans votre explorateur de fichiers. Le chemin du worktree est passé en argument. Laissez vide pour masquer le bouton.`,"settings.terminalCommand":`Commande du terminal`,"settings.terminalCommandHint":`Commande pour lancer le terminal dans le worktree. Placeholder {path} optionnel pour le répertoire.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Sélection MCP Claude`,"settings.mcpAutoSelect":`Auto (premier MCP actif correspondant)`,"settings.notionMcp":`Clé MCP Notion`,"settings.sentryMcp":`Clé MCP Sentry`,"settings.mcpSelectionHint":`Les entrées actives sont lues depuis ~/.claude.json. Laisser Auto pour utiliser le comportement par défaut.`,"settings.configuredProjects":`Projets configurés`,"settings.noProjects":`Aucun projet configuré`,"settings.addProject":`Ajouter un projet`,"settings.copyFrom":`Copier les settings depuis`,"settings.copyFromPlaceholder":`(aucun — partir des valeurs par défaut)`,"settings.copyFromHint":`Copie tous les settings sauf le path, le nom affiché et la branche source.`,"settings.copyFromConfirmTitle":`Écraser les valeurs actuelles ?`,"settings.copyFromConfirm":`Cela écrasera les valeurs du formulaire avec les settings de « {project} ». Continuer ?`,"settings.newProject":`Nouveau projet`,"settings.editProject":`Modifier le projet`,"help.title":`Aide`,"help.tours":`Visites guidées`,"help.steps":`{n} étape | {n} étapes`,"help.markAllSeen":`Marquer toutes comme vues`,"help.markAllSeenHint":`Valide les visites actuelles sans les lancer.`,"help.resetAll":`Réinitialiser toutes les visites`,"help.resetAllHint":`Relance l'accueil ; chaque écran rejouera sa visite à la prochaine ouverture.`,"help.status.unseen":`non vue`,"help.status.partial":`en partie`,"help.status.seen":`vue`,"help.replayThis":`Rejouer la visite de cet écran`,"tours.next":`Suivant`,"tours.prev":`Précédent`,"tours.done":`Terminé`,"tours.exitConfirm":`Quitter la visite guidée ? Elle ne se relancera plus automatiquement ; vous pourrez la rejouer à tout moment depuis le menu Aide.`,"tours.home.title":`S'orienter`,"tours.home.list.title":`Workspaces`,"tours.home.list.description":`Chaque mission vit ici avec son statut. Les badges signalent une CI en échec, une review demandant des changements ou une PR prête à merger. Faites glisser le bord intérieur d’un panneau avec la souris ou le doigt pour le redimensionner. Les boutons du haut passent sur plusieurs lignes si nécessaire.`,"tours.home.create.title":`Créer un workspace`,"tours.home.create.description":`Un workspace, c'est un worktree Git, une branche et une session d'agent pour une tâche.`,"tours.home.search.title":`Recherche`,"tours.home.search.description":`Filtrez la liste par nom. L'icône de recherche en haut ouvre la recherche plein texte dans les conversations des agents.`,"tours.home.dashboard.title":`Tableau de bord`,"tours.home.dashboard.description":`Un tableau pour tous les workspaces actifs : statut, attention, PR, diff, activité, plus la fiabilité des moteurs.`,"tours.home.health.title":`Santé et changelog`,"tours.home.health.description":`Vérifiez la base de données, les runtimes et les agents actifs. Le bouton voisin liste ce qui a changé à chaque version.`,"tours.home.settings.title":`Paramètres`,"tours.home.settings.description":`Moteurs, intégrations, automatisation, worktrees et projets. Créez maintenant votre premier workspace.`,"tours.create.title":`Créer un workspace`,"tours.create.project.title":`Projet et branche`,"tours.create.project.description":`Choisissez le projet et la branche de départ du worktree.`,"tours.create.mission.title":`Mission`,"tours.create.mission.description":`Décrivez la tâche, ou importez-la depuis une page Notion ou une issue Sentry.`,"tours.create.template.title":`Templates`,"tours.create.template.description":`Appliquez un preset enregistré, ou enregistrez ce formulaire comme preset. « Dupliquer » sur une carte de workspace ouvre ce formulaire prérempli.`,"tours.create.engine.title":`Moteur et modèle`,"tours.create.engine.description":`Claude Code ou Codex, le modèle, l'effort de raisonnement et ce que l'agent peut faire sans demander.`,"tours.create.brainstorm.title":`Brainstorm sur un autre modèle`,"tours.create.brainstorm.description":`Lancez la première session de brainstorming sur un autre modèle, puis revenez au modèle principal pour les itérations.`,"tours.create.autoloop.title":`Auto-loop`,"tours.create.autoloop.description":`Laissez l’agent terminer les tâches et les vérifications finales. Une review finale indépendante peut ensuite se répéter après correction jusqu’à zéro finding ; un blocage suspend la boucle.`,"tours.create.finalReview.title":`Configurer la review finale`,"tours.create.finalReview.description":`Choisissez à l’avance le moteur, le modèle, l’effort et les instructions du reviewer. La review tourne dans une session séparée en lecture seule ; l’agent d’origine corrige les findings, puis la review recommence jusqu’à ce qu’il n’en reste aucun.`,"tours.workspace.finalReview.title":`Review finale et corrections`,"tours.workspace.finalReview.description":`Configurez ici le reviewer final optionnel avant son lancement. Après les tâches et les vérifications finales, une session séparée examine le travail. Les findings reviennent dans la session d’origine pour correction automatique et nouvelle review. Fermer Kōbō préserve ce cycle.`,"tours.workspace.reviewReturn.title":`Retour de review`,"tours.workspace.reviewReturn.description":`Le résumé revient dans la session d’origine, même après redémarrage de Kōbō. Si la livraison est incertaine, consultez cette conversation avant Réessayer ; Annuler abandonne le retour. Une review manuelle attend vos instructions avant de corriger ; l’auto-loop corrige automatiquement.`,"tours.create.comparison.title":`Comparer deux moteurs`,"tours.create.comparison.description":`Créez deux workspaces jumeaux sur la même tâche et comparez leurs commits, tâches et activité.`,"tours.workspace.sessions.title":`Sessions du workspace`,"tours.workspace.sessions.description":`Clique sur le titre pour choisir une session, en créer une, la renommer ou retrouver son identifiant.`,"tours.workspace.actions.title":`Actions du workspace`,"tours.workspace.actions.description":`Le menu ⋯ regroupe la vue côte à côte, la palette de commandes, le panneau latéral et la visite guidée.`,"tours.workspace.title":`Dans un workspace`,"tours.workspace.chat.title":`Conversation`,"tours.workspace.chat.description":`La sortie de l'agent, en direct : messages, appels d'outils, questions et erreurs.`,"tours.workspace.input.title":`Parler à l'agent`,"tours.workspace.input.description":`Envoyez un message, utilisez les slash commands, dictez à la voix ou joignez des fichiers.`,"tours.workspace.selectors.title":`Réglages de session`,"tours.workspace.selectors.description":`Ouvre Configurer pour régler le modèle, l’effort, les permissions et l’auto-loop. Le moteur actuel y est indiqué.`,"tours.workspace.status.title":`Statut`,"tours.workspace.status.description":`L'état de la session en cours ; arrêtez-la ici si besoin.`,"tours.workspace.git.title":`Git`,"tours.workspace.git.description":`Commits, diff, push, rebase et la PR de cette branche.`,"tours.workspace.tasks.title":`Tâches`,"tours.workspace.tasks.description":`Ce que l'agent prévoit de faire, et les critères d'acceptation à respecter.`,"tours.workspace.timeline.title":`Chronologie`,"tours.workspace.timeline.description":`Toutes les sessions de ce workspace ; ouvrez-en une plus ancienne pour la relire.`,"tours.workspace.subagents.title":`Sous-agents`,"tours.workspace.subagents.description":`Suivez les sous-agents lancés par l'agent, avec leur progression en direct.`,"tours.workspace.documents.title":`Documents`,"tours.workspace.documents.description":`Plans et fichiers écrits par l'agent, consultables sans quitter le chat.`,"tours.workspace.schedule.title":`Programmation`,"tours.workspace.schedule.description":`Réveils et crons qui relancent l'agent plus tard.`,"tours.workspace.memory.title":`Mémoire du workspace`,"tours.workspace.memory.description":`Consultez la mémoire transmise à la conversation sélectionnée, les propositions en attente et les opérations du workspace. Son effacement ne modifie pas l’historique du fournisseur.`,"tours.workspace.handoff.title":`Repartir avec un contexte frais`,"tours.workspace.handoff.description":`Une longue conversation ? Démarre une session fraîche ici, ou utilise « Changer de LLM ». Le travail courant est interrompu immédiatement et la nouvelle session reprend automatiquement dans le même workspace. La synthèse de passation est facultative : désactive-la si le quota du LLM actuel est épuisé. Le suivi, le rapport et le lien vers la session précédente apparaissent sous ce bouton.`,"tours.workspace.terminal.title":`Terminal`,"tours.workspace.terminal.description":`Un shell dans le worktree, sans quitter Kōbō.`,"tours.gitPr.title":`Pull request`,"tours.gitPr.panel.title":`Statut de la PR`,"tours.gitPr.panel.description":`Résultat de la CI, décision de review et reviewers, rafraîchis toutes les 30 secondes.`,"tours.gitPr.actions.title":`Actions Git`,"tours.gitPr.actions.description":`Push, pull, rebase ou changement de branche de base. Pendant un conflit, un bouton laisse l'agent le résoudre.`,"tours.gitPr.attention.title":`Badges d'attention`,"tours.gitPr.attention.description":`La carte affiche une CI en échec, des changements demandés ou une PR prête à merger.`,"tours.settings.title":`Paramètres`,"tours.settings.engines.title":`Moteurs et modèles`,"tours.settings.engines.description":`Modèles, permissions par défaut et limites de relance automatique.`,"tours.settings.integrations.title":`Intégrations`,"tours.settings.integrations.description":`Connexions Notion et Sentry, et identifiants Bitbucket. GitHub et GitLab utilisent votre connexion CLI locale.`,"tours.settings.automation.title":`Automatisation`,"tours.settings.automation.description":`Scripts de setup et de cleanup, hooks de cycle de vie, templates de prompts, templates de workspace et skills.`,"tours.settings.worktrees.title":`Worktrees`,"tours.settings.memory.title":`Mémoire`,"tours.settings.memory.description":`Choisissez le mode manuel, automatique ou hybride, puis parcourez les portées et vérifiez ou effacez leurs données mémoire exactes. Les opérations mémoire sont immédiates ; le changement de mode passe par Enregistrer.`,"tours.settings.worktrees.description":`Où vivent les worktrees, combien de temps garder ceux qui sont mergés, et la purge automatique.`,"tours.settings.projects.title":`Projets`,"tours.settings.projects.description":`Les projets enregistrés et leurs surcharges par projet.`,"tours.settings.misc.title":`Général, voix, notifications, export`,"tours.settings.misc.description":`Langue, accès réseau, dictée, sons et notifications navigateur, et un export complet de vos réglages.`,"tours.dashboard.title":`Tableau de bord`,"tours.dashboard.overview.title":`Vue d'ensemble`,"tours.dashboard.overview.description":`Tous les workspaces actifs dans un tableau ; cliquez sur une ligne pour l'ouvrir.`,"tours.dashboard.reliability.title":`Fiabilité des moteurs`,"tours.dashboard.reliability.description":`Sessions, erreurs et durées par moteur et par modèle.`,"tours.health.title":`Santé`,"tours.health.checks.title":`Vérifications`,"tours.health.checks.description":`Environnement, base de données, runtimes, workspaces et sessions.`,"tours.health.active.title":`État actif`,"tours.health.active.description":`Les back-offs de quota, les réveils en attente et les auto-loops en cours en ce moment.`,"tours.search.title":`Recherche`,"tours.search.input.title":`Requête`,"tours.search.input.description":`Recherche dans les noms de workspaces et les conversations des agents.`,"tours.search.archived.title":`Archivés`,"tours.search.archived.description":`Inclure les workspaces archivés dans les résultats.`,"tours.changelog.title":`Nouveautés`,"tours.changelog.list.title":`Versions`,"tours.changelog.list.description":`Ce qui a changé à chaque version, la plus récente en premier.`,"settings.projectGroup.identity":`Identité`,"settings.projectGroup.defaults":`Valeurs par défaut`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Chemin du projet`,"settings.projectPathPlaceholder":`/chemin/vers/le/projet`,"settings.displayName":`Nom affiché`,"settings.displayNamePlaceholder":`Mon projet`,"settings.defaultSourceBranch":`Branche source par défaut`,"settings.defaultModel.project":`Modèle par défaut`,"settings.skipPermissions.project":`Ignorer les invites de permission`,"settings.prPromptTemplate.project":`Modèle de prompt PR`,"settings.prPromptPlaceholder.project":`Instructions spécifiques au projet pour la création de PR...`,"settings.reviewPromptTemplate.project":`Modèle de prompt de review`,"settings.ciFixPromptTemplate.project":`Modèle de prompt « Fix CI »`,"settings.gitConventions.project":`Conventions Git (projet)`,"settings.gitConventionsEmpty":`Laisser vide pour utiliser les conventions globales.`,"settings.notionStatus":`Statut ticket Notion`,"settings.notionStatusProperty":`Nom de la propriété`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valeur à définir`,"settings.notionInProgressStatusPlaceholder":`En cours, In progress...`,"settings.notionStatusHint":`Quand un workspace est créé avec un ticket Notion, la propriété spécifiée est mise à cette valeur. Les deux champs sont requis. Laisser vide pour désactiver.`,"settings.notionAssignee":`Assignation Notion`,"settings.notionAssigneeHint":`Quand un workspace est créé avec un ticket Notion, l'utilisateur authentifié sur le MCP Notion est ajouté à cette propriété People — uniquement si elle n'a pas déjà d'assigné. Laisser vide pour désactiver.`,"settings.notionAssigneeProperty":`Nom de la propriété`,"settings.notionAssigneePropertyPlaceholder":`Développeurs, Assignees...`,"settings.notionUserId":`Ton UUID Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Sélectionne ton compte dans la liste. Notion refuse l'assignation d'un bot — ce champ est obligatoire pour activer l'auto-assignation.`,"settings.notionUsersRefresh":`Rafraîchir`,"settings.notionUsersLoading":`Chargement des utilisateurs Notion…`,"settings.notionUsersLoadFailed":`Impossible de récupérer la liste : {error}`,"settings.notionUsersManualFallback":`Liste indisponible — colle ton UUID Notion manuellement.`,"settings.devServer":`Serveur de dev`,"settings.devServerStart":`Script de démarrage`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script d'arrêt`,"settings.devServerStopPlaceholder":`Optionnel — le processus sera tué automatiquement si vide`,"settings.selectProject":`Sélectionnez un projet ou ajoutez-en un nouveau`,"settings.useGlobal":`Utiliser le global`,"settings.saved":`Paramètres généraux enregistrés.`,"settings.unsavedChanges":`Modifications non enregistrées`,"settings.nav.general":`Général`,"settings.nav.agents":`Agents`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.workspaceTemplates":`Templates de workspace`,"workspaceTemplates.title":`Templates de workspace`,"workspaceTemplates.hint":`Préréglages enregistrés du formulaire de création. Choisissez-en un sur la page de création ; pour en modifier un, chargez-le là, ajustez, puis réenregistrez-le sous le même nom.`,"workspaceTemplates.empty":`Aucun template pour l'instant. Remplissez le formulaire de création et utilisez « Enregistrer comme template ».`,"workspaceTemplates.anyProject":`Tout projet`,"workspaceTemplates.rename":`Renommer`,"workspaceTemplates.renameTitle":`Renommer le template`,"workspaceTemplates.deleteConfirm":`Supprimer le template « {name} » ?`,"workspaceTemplates.deleted":`Template « {name} » supprimé`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Les identifiants restent locaux et sont utilisés uniquement par bkt.`,"settings.bitbucketUsername":`E-mail Atlassian`,"settings.bitbucketToken":`Token API Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voix`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.help.general":`Langue, accès réseau et valeurs par défaut dont hérite chaque projet.`,"settings.help.agents":`Modèles et permissions par défaut, ainsi que les limites de relance automatique.`,"settings.help.skills":`Les suites de skills que l'agent est invité à utiliser.`,"settings.help.prompts":`Instructions des agents après ouverture d’une PR/MR, pour les revues de code, les corrections CI et la finalisation.`,"settings.help.scripts":`Scripts de setup, de nettoyage et de changement de branche source, plus les hooks de cycle de vie.`,"settings.help.notion":`Importer une page Notion comme source de vérité d'un workspace.`,"settings.help.sentry":`Créer un workspace à partir d'une issue Sentry.`,"settings.help.forge":`Identifiants Bitbucket. GitHub et GitLab utilisent vos CLI gh/glab authentifiées ; choisissez la forge par projet.`,"settings.help.voice":`Dictée et push-to-talk.`,"settings.help.notifications":`Sons, notifications navigateur et rappel des questions sans réponse.`,"settings.help.worktrees":`Où les worktrees sont créés, rétention et purge automatique.`,"settings.help.projects":`Projets enregistrés et leurs surcharges par projet.`,"settings.help.templates":`Templates de prompt développés dans la zone de saisie du chat.`,"settings.help.workspaceTemplates":`Presets enregistrés du formulaire de création.`,"settings.help.export":`Exporter et importer tous les paramètres en JSON.`,"settings.openNav":`Ouvrir la navigation`,"settings.saveError":`Erreur lors de l'enregistrement des paramètres.`,"settings.projectSaved":`Projet enregistré.`,"settings.projectSaveError":`Erreur lors de l'enregistrement du projet.`,"settings.projectDeleted":`Projet supprimé.`,"settings.deleteProjectConfirmTitle":`Supprimer le projet ?`,"settings.deleteProjectConfirmMessage":`Retirer « {name} » de vos projets ? Cela supprime uniquement ses réglages Kōbō — votre code et vos worktrees ne sont pas touchés.`,"settings.projectDeleteError":`Erreur lors de la suppression du projet.`,"settings.projectPathRequired":`Le chemin du projet est requis.`,"templates.title":`Modèles`,"templates.newTemplate":`Nouveau modèle`,"templates.editTemplate":`Modifier le modèle`,"templates.deleteTemplate":`Supprimer le modèle`,"templates.deleteConfirm":`Supprimer le modèle '/{slug}' ?`,"templates.deleteConfirmMessage":`Cette action est irréversible.`,"templates.slug":`Slug`,"templates.slugHint":`Lettres minuscules, chiffres, tirets. Max 64 caractères.`,"templates.slugInvalid":`Le slug ne peut contenir que des lettres minuscules, chiffres et tirets`,"templates.slugDuplicate":`Un modèle avec ce slug existe déjà`,"templates.description":`Description`,"templates.descriptionHint":`Libellé court affiché dans le dropdown.`,"templates.descriptionRequired":`La description est requise`,"templates.contentRequired":`Le contenu est requis`,"templates.content":`Contenu`,"templates.contentHint":`Contenu du modèle. Utilise {variable_name} pour les substitutions.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Fichier : {path}`,"templates.empty":`Aucun modèle pour l'instant.`,"templates.createFailed":`Échec de la création du modèle`,"templates.updateFailed":`Échec de la modification du modèle`,"templates.deleteFailed":`Échec de la suppression du modèle`,"templates.save":`Enregistrer`,"templates.create":`Créer`,"templates.reloadDefaults":`Recharger les modèles par défaut`,"templates.reloadDefaultsHint":`Ajoute uniquement les modèles par défaut manquants. Les modèles existants (même modifiés) ne sont jamais écrasés.`,"templates.reloadDefaultsConfirmMessage":`Cette action ajoute les modèles par défaut absents de la liste. Les modèles existants — y compris ceux que tu as modifiés — ne seront pas touchés. Si tu veux récupérer la version d'origine d'un modèle modifié, supprime-le d'abord puis relance cette action.`,"templates.reloadDefaultsSuccess":`{added} ajouté(s), {kept} conservé(s)`,"templates.reloadDefaultsFailed":`Échec du rechargement des modèles par défaut`,"templates.resetToDefault":`Réinitialiser au défaut`,"templates.resetConfirmTitle":`Réinitialiser le template au défaut ?`,"templates.resetConfirmMessage":`Cela écrase vos modifications locales de /{slug} par le défaut intégré. Action irréversible.`,"templates.resetSuccess":`Template /{slug} réinitialisé au défaut`,"templates.resetFailed":`Échec de la réinitialisation du template`,"chatInput.dropdownSkills":`Skills Claude`,"chatInput.dropdownKobo":`Commandes Kōbō`,"chatInput.dropdownTemplates":`Modèles`,"documents.title":`Documents`,"documents.empty":`Aucun document trouvé`,"documents.refresh":`Actualiser`,"documents.back":`Retour`,"documents.loadFailed":`Échec du chargement du document`,"git.title":`Git`,"git.outputDialogTitle":`Git a signalé une erreur`,"git.statsFailed":`L’état git n’a pas pu être lu`,"git.section.repository":`Dépôt`,"git.section.changes":`Modifications`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Actions`,"git.actions.more":`Plus`,"git.localOnly":`local uniquement`,"git.pushed":`pushé`,"git.unpushed":`{count} non pushé`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Chargement des commits…`,"git.commits.empty":`Aucun commit sur cette branche`,"git.commits.pushed":`Pushé`,"git.commits.unpushed":`Non pushé`,"git.commits.clickToAppend":`clique pour ajouter le SHA au chat`,"git.commits.diffThisCommit":`Diff de ce commit (vs parent)`,"git.compareCommits":`Comparer des commits…`,"git.files":`{count} fichier | {count} fichiers`,"git.staged":`{count} indexé`,"git.modified":`{count} modifié`,"git.untracked":`{count} non suivi`,"git.workingTreeEmpty":`Aucune modification non commitée`,"git.fileStaged":`Indexé`,"git.fileModified":`Modifié`,"git.fileUntracked":`Non suivi`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.pushRejectedHistory":`Push refusé : la branche locale et la branche distante ont des historiques différents. Après un rebase de commits déjà publiés, utilisez « Force push » avec confirmation. Sinon, récupérez et intégrez les changements distants avant de réessayer.`,"git.pushRejectedLease":`Push forcé refusé : la branche distante a changé depuis votre dernière récupération. Récupérez et vérifiez ces changements avant de réessayer.`,"git.pushFailed":`Impossible de pousser la branche. Ouvrez les détails pour connaître la cause.`,"git.pushBlockedByOperation":`Terminez ou abandonnez d'abord l'opération {operation} en cours`,"git.pushUpToDate":`Rien à pousser : la branche est déjà à jour sur origin`,"git.forcePushHint":`Plus sûr que --force : le push est rejeté si le remote a des commits que tu n’as pas vus. À utiliser après un rebase ou un amend de commits déjà push.`,"git.branchForcePushed":`Branche force-pushée`,"git.pull":`Pull`,"git.pullNoUpstream":`Pas d'upstream pour cette branche — push-la d'abord pour activer Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la branche d'abord`,"git.viewRequest":`Voir la {request}`,"git.createRequest":`Créer une {request}`,"git.changeRequestBase":`Changer la branche cible de la {request}`,"git.forgeCliMissing":`{cli} n'est pas installé — installez-le pour les fonctions {request}`,"git.forgeNotAuthenticated":`Non authentifié — exécutez {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Détection automatique`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Aucune`,"git.pullConfirmTitle":`Pull la branche ?`,"git.pullConfirmMessage":`Pull {branch} depuis la remote (fast-forward uniquement).`,"git.branchPulled":`Branche pull`,"git.pullFailed":`Échec du pull`,"git.renameBranch":`Renommer la branche`,"git.renameBranchPrompt":"Renommer `{branch}` en :","git.renameBranchSuccess":"Branche renommée en `{branch}`","git.renameBranchFailed":`Échec du renommage`,"git.renameBranchExists":"La branche `{branch}` existe déjà (locale ou sur origin)","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Ouvre le diff viewer en mode Review — commentaires inline + soumission groupée à l'agent`,"pr.baseChanged":`Base de la PR modifiée : {oldBase} → {newBase}`,"pr.openPr":`Ouvrir la PR`,"pr.openWorkspace":`Ouvrir le workspace`,"pr.dismiss":`Fermer`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase la branche ?`,"git.rebaseConfirmMessage":`Rebase sur {branch}. Des conflits peuvent survenir.`,"git.rebaseSuccess":`Rebase terminé`,"git.rebaseFailed":`Rebase échoué`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Dépôt récupéré`,"git.fetchFailed":`Échec du fetch : {error}`,"git.mergeConfirmTitle":`Fusionner la branche ?`,"git.mergeConfirmMessage":`Fusionner {branch} dans cette branche. Des conflits sont possibles.`,"git.mergeSuccess":`Merge terminé`,"git.mergeFailed":`Merge échoué`,"git.commitFailed":`Commit échoué`,"git.commitChanges":`Committer les modifications`,"git.commitDialogTitle":`Committer les modifications non commitées`,"git.commitDialogDescription":`Saisissez votre message ou demandez à l’agent d’inspecter et de créer le commit.`,"git.commitMessage":`Message de commit`,"git.commitManual":`Committer`,"git.commitWithAgent":`Demander à l’agent`,"git.commitAgentSuccess":`Demande de commit envoyée à l’agent`,"git.discardFailed":`Abandon échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.operationPausedTitle":`Opération Git à poursuivre`,"git.operationPausedSubtitle":`Aucun fichier en conflit. Git attend simplement que tu poursuives l’opération.`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbortConfirmTitle":`Abandonner la résolution du conflit ?`,"git.conflictAbortConfirmMessage":`Tout ce que tu as résolu dans ce {op} est jeté et le worktree revient à son état d’avant. C’est irréversible.`,"git.conflictAbort":`Abandonner`,"git.conflictContinue":`Continuer`,"git.conflictContinued":`Opération Git poursuivie`,"git.conflictResolveWithAgent":`Demander à l'agent de résoudre`,"git.conflictAborted":`Opération abandonnée`,"git.conflictHandoffSuccess":`L'agent résout les conflits`,"git.dirtyTitleRebase":`Des modifications non commitées bloquent le rebase`,"git.dirtyTitleMerge":`Des modifications non commitées bloquent le merge`,"git.dirtyTitlePull":`Des modifications non commitées bloquent le pull`,"git.dirtySubtitle":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s). Choisis comment continuer.`,"git.dirtyStash":`Stash & réessayer`,"git.dirtyCommit":`Commit d'abord`,"git.dirtyCommitPlaceholder":`Message de commit`,"git.dirtyCommitConfirm":`Commit & réessayer`,"git.dirtyDiscard":`Abandonner les modifs`,"git.dirtyDiscardConfirmTitle":`Abandonner toutes les modifications non commitées ?`,"git.dirtyDiscardConfirmMessage":`Les modifications suivies seront perdues (git reset --hard). Les fichiers non suivis sont conservés. Action irréversible.`,"git.pushConfirmTitle":`Pusher la branche ?`,"git.pushConfirmMessage":`Pusher {branch} vers le dépôt distant.`,"git.pushConfirmMessagePrefix":`Pusher la branche`,"git.pushConfirmMessageSuffix":`vers le dépôt distant.`,"git.changePrBaseTitle":`Changer la branche cible`,"git.changePrBaseMessage":`Entrez la nouvelle branche cible pour la {request}.`,"git.changePrBaseSuccess":`Branche cible de la {request} mise à jour`,"git.changePrBaseFailed":`Impossible de changer la branche cible de la {request}`,"git.mergeRequest":`Fusionner la {request}`,"git.mergeRequestConfirmTitle":`Fusionner la {request} ?`,"git.mergeRequestConfirmMessage":`Cette action fusionne la {request} ouverte dans sa branche cible.`,"git.mergeRequestSuccess":`{request} fusionnée`,"git.mergeRequestFailed":`Impossible de fusionner la {request}`,"git.deleteRemoteBranch":`Supprimer la branche distante`,"git.deleteRemoteBranchTitle":`Supprimer la branche distante ?`,"git.deleteRemoteBranchMessage":`La demande a été fusionnée. Supprimer la branche distante {branch} ?`,"git.deleteRemoteBranchSuccess":`Branche distante {branch} supprimée`,"git.deleteRemoteBranchFailed":`Impossible de supprimer la branche distante`,"git.changeSourceBranch":`Changer la branche source`,"git.changeSourceBranchTitle":`Changer la branche source`,"git.changeSourceBranchMessage":`Choisis la nouvelle branche source. La branche de travail sera reconstruite par-dessus.`,"git.changeSourceBranchDone":`Branche source changée vers {branch}`,"git.changeSourceBranchAligned":`Branche source changée vers {branch} (la branche n'avait aucun commit propre)`,"git.changeSourceBranchTooMany":`La branche a trop de commits propres ({n}) — rebase-la manuellement`,"git.changeSourceBranchDirty":`Commit ou stash tes changements avant de changer la branche source`,"git.changeSourceBranchAgentRunning":`Arrête l'agent avant de changer la branche source`,"git.changeSourceBranchErrorTitle":`Échec du changement de branche source`,"git.changeSourceBranchErrorOngoing":`Une opération {op} est encore en cours sur le worktree. Annule-la pour revenir à un état propre.`,"git.changeSourceBranchErrorAbort":`Annuler l'opération`,"git.changeSourceBranchLoading":`Changement de la branche source…`,"git.changeSourceForcePushTitle":`Force-push de la branche réécrite ?`,"git.changeSourceForcePushMessage":`L'historique de la branche a été réécrit. La force-pusher vers le remote avec --force-with-lease ?`,"git.changeSourceForcePushDone":`Branche force-pushée`,"git.openEditor":`Ouvrir dans l'éditeur`,"git.openEditorFailed":`Impossible d'ouvrir l'éditeur`,"git.branchPushed":`Branche pushée`,"git.pushFirst":`La branche n'est pas sur le dépôt distant. Cliquez d'abord sur Push.`,"git.unpushedCommits":`Les commits locaux ne sont pas pushés. Cliquez d'abord sur Push.`,"git.from":`depuis`,"git.aheadBehindTooltip":`{ahead} commits en avance, {behind} en retard sur {source}`,"git.divergence.title":`Divergence de branche`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} en avance`,"git.divergence.behind":`↓ {count} en retard`,"git.divergence.empty.ahead":`Aucun commit en avance.`,"git.divergence.empty.behind":`Aucun commit en retard.`,"git.divergence.close":`Fermer`,"git.divergence.loading":`Chargement des commits…`,"git.divergence.failed":`Échec du chargement de la divergence`,"git.divergence.retry":`Réessayer`,"git.prCreated":`{request} #{n} créée`,"git.pr.author":`Auteur`,"git.pr.reviewers":`Relecteurs`,"git.pr.assignees":`Assignés`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Modifications demandées`,"git.pr.approvedBadge":`Approuvée`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI en échec`,"git.pr.ci.pending":`CI en cours`,"git.pr.ci.failedCount":`{n} en échec`,"git.pr.ci.pendingCount":`{n} en cours`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} ignoré(s)`,"git.pr.ci.showPassed":`Afficher les {n} jobs réussis`,"git.pr.ci.hidePassed":`Masquer les jobs réussis`,"toast.prChangesRequested":`Des modifications ont été demandées sur la PR #{n}`,"toast.prApproved":`La PR #{n} a été approuvée`,"toast.prReadyToMerge":`La PR #{n} est prête à merger`,"toast.prCiFailed":`La CI de la PR #{n} est en échec`,"toast.prCiRecovered":`La CI de la PR #{n} est rétablie`,"toast.prMergeConflict":`La PR #{n} a un conflit de merge`,"toast.prMerged":`La PR #{n} a été mergée`,"devServer.title":`Serveur de dev`,"devServer.noWorkspace":`Aucun espace de travail sélectionné`,"devServer.notConfigured":`Non configuré —`,"devServer.goToSettings":`Paramètres`,"devServer.logs":`Logs`,"devServer.running":`En cours`,"devServer.starting":`Démarrage`,"devServer.stopping":`Arrêt`,"devServer.error":`Erreur`,"devServer.stopped":`Arrêté`,"devServer.unknown":`Inconnu`,"devServer.containers":`{count} conteneur | {count} conteneurs`,"devServer.logDialog.title":`Logs du serveur de dev`,"devServer.logDialog.empty":`Aucun log disponible`,"notion.title":`Notion`,"tasks.title":`Tâches`,"notion.addTask":`Ajouter une tâche`,"notion.noUrl":`Aucune URL Notion`,"notion.subtasks":`{done}/{total} sous-tâches`,"notion.noTasks":`Aucune tâche`,"notion.newTask":`Nouvelle tâche... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.title":`Critères d'acceptation`,"acceptance.addCriterion":`Ajouter un critère`,"acceptance.newCriterion":`Nouveau critère... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.empty":`Aucun critère d'acceptation`,"tasks.askProgress":`Demander à l'agent de vérifier sa progression`,"agentTodos.title":`Todos de l'agent`,"agentTodos.empty":`Aucun todo de l'agent`,"subagents.title":`Sub-agents`,"subagents.empty":`Aucune activité de sous-agent`,"subagents.tools":`{count} outils`,"subagents.running":`En cours : `,"subagents.status.running":`En cours`,"subagents.status.done":`Terminé`,"subagents.status.failed":`Échec`,"subagents.status.stopped":`Arrêté`,"subagents.ambient":`Surveillance en arrière-plan`,"subagents.ambientTooltip":`Surveillance en arrière-plan (ex. Monitor) : non comptée comme activité de l'agent`,"subagents.stop":`Arrêter ce sous-agent`,"subagents.stopAll":`Tout arrêter`,"subagents.stopFailed":`Impossible d'arrêter le sous-agent : {error}`,"subagents.activity":`Activité du sous-agent`,"subagents.noActivity":`Aucune activité visible du fournisseur pour le moment`,"chat.subagentActivity":`Activité d’un sous-agent`,"chat.openSubagentActivity":`Ouvrir ce sous-agent dans le panneau latéral`,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Quota {n}`,"quotaFooter.lastUpdated":`Dernière mise à jour : {time}`,"quotaFooter.empty":`Chargement…`,"quotaFooter.popover.title":`Utilisation Claude Code`,"quotaFooter.popover.refreshNow":`Rafraîchir`,"quotaFooter.popover.resetsIn":`Réinitialise à {value}`,"quotaFooter.popover.unauthenticated":`Auth requise`,"quotaFooter.popover.unauthenticatedHint":`Lancez "claude" une fois pour vous authentifier.`,"quotaFooter.popover.error":`Erreur`,"quotaFooter.bucket.fiveHour":`5 heures`,"quotaFooter.bucket.sevenDay":`7 jours`,"agent.error.spawn_failed":`Échec du lancement de l'agent`,"agent.error.parse_error":`Impossible d'analyser un message de l'agent`,"agent.error.rate_limit":`Limite de débit atteinte`,"agent.error.resume_failed":`Session introuvable — démarrage en session fraîche`,"agent.error.other":`Erreur de l'agent`,"quotaBackoff.banner.title":`Reprise auto à {time}`,"quotaBackoff.banner.transientTitle":`Reprise auto après interruption à {time}`,"quotaBackoff.resumeNow":`Reprendre maintenant`,"quotaBackoff.banner.tooltip":`Quota Claude épuisé. L'auto-loop reprendra automatiquement quand le quota se libère à {resets_at}.`,"quotaBackoff.banner.cancel":`Annuler la reprise`,"quotaBackoff.cancelled":`Reprise auto annulée — tu peux relancer manuellement à tout moment`,"rateLimitType.fiveHour":`Session 5h`,"rateLimitType.sevenDay":`Hebdo`,"tooltip.addTask":`Ajouter une tâche`,"tooltip.removeTask":`Supprimer la tâche`,"tooltip.addCriterion":`Ajouter un critère`,"tooltip.removeCriterion":`Supprimer le critère`,"tooltip.startDevServer":`Démarrer le serveur de dev`,"tooltip.stopDevServer":`Arrêter le serveur de dev`,"tooltip.closeDiffViewer":`Fermer le diff`,"tooltip.refreshLogs":`Actualiser les logs`,"tooltip.closeDialog":`Fermer`,"tooltip.refreshGitStats":`Actualiser les stats Git`,"tooltip.removeImage":`Supprimer l'image`,"tooltip.sendMessage":`Envoyer le message`,"tools.title":`Outils`,"tools.runSetupScript":`Relancer le script de setup`,"tools.runSetupScriptTooltip":`Exécuter le script de setup du projet dans le worktree`,"tools.runSetupScriptConfirm":`Relancer le script de setup dans cette tâche ? Les artefacts existants peuvent être écrasés.`,"tools.runSetupScriptBusy":`Impossible de relancer le setup pendant que l'agent travaille.`,"tools.noSetupScript":`Aucun script de setup configuré —`,"tools.setupScriptSuccess":`Script de setup terminé avec succès.`,"tools.setupScriptFailed":`Échec du script de setup.`,"tools.openNotion":`Ouvrir dans Notion`,"tools.openSentry":`Ouvrir dans Sentry`,"tools.review":`Reviewer les changes`,"tools.reviewTooltip":`Demander à l'agent de reviewer les changes de cette branche`,"tools.reviewBusy":`Agent occupé — attends qu'il soit idle`,"tools.fixCi":`Réparer la CI`,"tools.fixCiTooltip":`Demander à l'agent de diagnostiquer et corriger les jobs CI en échec`,"tools.fixCiLaunched":`Action « Fix CI » envoyée à l'agent`,"tools.fixCiFailed":`Échec du lancement de l'action « Fix CI »`,"tools.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"tools.openFileManagerTooltip":`Ouvrir le dossier du worktree dans votre explorateur de fichiers configuré`,"tools.openFileManagerFailed":`Échec de l'ouverture de l'explorateur de fichiers`,"tools.openTerminal":`Ouvrir dans un terminal`,"tools.openTerminalTooltip":`Ouvrir le worktree dans le terminal configuré`,"tools.openTerminalFailed":`Échec de l'ouverture du terminal`,"review.title":`Lancer une review`,"review.subtitle":`Demande à l'agent de reviewer tes changes et de te faire des retours.`,"review.additionalInstructions":`Instructions supplémentaires (optionnel)`,"review.additionalInstructionsPlaceholder":`Ajoute des instructions spécifiques pour la review…`,"review.newSession":`Nouvelle session`,"review.newSessionHint":`Démarre une nouvelle session d'agent au lieu de continuer la courante.`,"review.newSessionRequired":`Une nouvelle session est nécessaire pour changer les réglages de l’agent ou revenir automatiquement.`,"review.returnToSession":`Revenir à la session actuelle après la review`,"review.returnToSessionHint":`Reprend cette session avec le résumé final du reviewer. Sinon, la conversation continue dans la session de review.`,"review.readOnlyForced":`Une review qui revient à cette session tourne en lecture seule (Plan) : elle ne peut ni modifier de fichiers ni poser de questions.`,"review.returnUnavailable":`La session actuelle doit avoir démarré pour pouvoir être reprise.`,"review.start":`Lancer la review`,"review.cancel":`Annuler`,"review.launched":`Review lancée`,"review.failed":`Échec du lancement de la review`,"diff.title":`Diff`,"diff.side":`Côte à côte`,"diff.inline":`En ligne`,"diff.hideUnchanged":`Masquer le code inchangé`,"diff.showUnchanged":`Afficher le code inchangé`,"diff.showUntracked":`Afficher les fichiers non suivis`,"diff.hideUntracked":`Masquer les fichiers non suivis`,"diff.rollbackToRemote":`Revenir à la version distante`,"diff.rollbackConfirm":`Restaurer {path} à sa version distante (origin) ? Les modifications locales sur ce fichier seront perdues.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`Fichier restauré à la version distante`,"diff.rollbackDoneRemote":`Fichier restauré à la version distante`,"diff.rollbackDoneHead":`Modifications locales annulées (fichier restauré au dernier commit)`,"diff.rollbackDoneDeleted":`Fichier non suivi supprimé`,"diff.deleteUntracked":`Supprimer le fichier non suivi`,"diff.deleteUntrackedConfirm":`Supprimer définitivement {path} ? Ce fichier n'est pas suivi par git — son contenu sera perdu.`,"diff.deleteUntrackedConfirmOk":`Supprimer`,"diff.rollbackFailed":`Échec du rollback`,"diff.rollbackFailedDetail":`Échec du rollback : {error}`,"diff.modeInspect":`Édition`,"diff.modeReview":`Review`,"diff.addComment":`Ajouter un commentaire`,"diff.replyComment":`Répondre`,"diff.editComment":`Modifier`,"diff.deleteComment":`Supprimer`,"diff.deleteCommentConfirm":`Supprimer ce commentaire ?`,"diff.commentPlaceholder":`Écris un commentaire de revue… (Markdown accepté)`,"diff.reviewDraft":`Brouillon de revue`,"diff.reviewEmpty":`Aucun commentaire — survole une ligne dans le diff et clique + pour en ajouter un.`,"diff.reviewGlobalPlaceholder":`Ajoute un message global de revue (optionnel)`,"diff.submitReview":`Soumettre la revue ({n})`,"diff.reviewPending":`Une revue est déjà en cours d’envoi.`,"diff.reviewEmptySubmission":`La revue est vide.`,"diff.reviewNotAccepted":`Le message n’a pas été accepté. Votre revue a été conservée.`,"diff.reviewSubmitted":`Revue soumise à l'agent`,"diff.reviewSubmitFailed":`Échec de la soumission : {error}`,"diff.scopeBranch":`Branche`,"diff.scopeUnpushed":`Non pushé`,"diff.noChanges":`Aucun changement`,"diff.searchFiles":`Rechercher des fichiers…`,"diff.noFileMatch":`Aucun fichier correspondant`,"diff.selectFile":`Sélectionnez un fichier pour voir le diff`,"diff.fileLoadFailed":`Ce diff n’a pas pu être chargé`,"diff.fileLoadFailedHint":`Le fichier sur le disque est intact — seul le chargement du diff a échoué.`,"diff.fileListLoadFailed":`La liste des fichiers n’a pas pu être chargée`,"diff.fileListLoadFailedHint":`Il s’agit d’un échec de requête, pas d’une branche sans modification.`,"diff.addToChat":`Ajouter au chat`,"diff.compareTitle":`Comparer des commits`,"diff.compareFrom":`De`,"diff.compareTo":`À`,"diff.compareSubmit":`Comparer`,"diff.compareSourceBase":`{branch} (base de la branche)`,"diff.commitsReadOnly":`lecture seule`,"diffViewer.save":`Enregistrer`,"diffViewer.savedAt":`Enregistré`,"diffViewer.saveFailed":`Échec de l’enregistrement`,"diffViewer.saveFailedDetail":`Échec de l’enregistrement : {error}`,"diffViewer.unsavedChanges.title":`Modifications non enregistrées`,"diffViewer.unsavedChanges.message":`Tu as des modifications non enregistrées. Que veux-tu faire ?`,"diffViewer.unsavedChanges.save":`Enregistrer`,"diffViewer.unsavedChanges.cancel":`Annuler`,"diffViewer.conflict.title":`Fichier modifié sur le disque`,"diffViewer.conflict.message":`Le fichier a été modifié hors de Kōbō depuis que tu l’as ouvert.`,"diffViewer.conflict.reload":`Recharger (perdre les modifs locales)`,"diffViewer.conflict.keep":`Garder les miennes`,"diffViewer.conflict.overwrite":`Écraser quand même`,"diffViewer.conflict.overwriteHint":`Remplace le fichier sur le disque par ta version. L’autre modification est perdue.`,"diffViewer.conflict.keepHint":`Garde tes modifications dans l’éditeur et adopte la nouvelle signature du disque, pour que la prochaine sauvegarde fonctionne.`,"diffViewer.saveBlocked":`L’agent tourne — arrête-le pour enregistrer tes modifications.`,"diffViewer.unsavedBanner":`Modifications non enregistrées. Arrête l’agent pour les sauvegarder.`,"diffViewer.closeConfirm.title":`Modifications non enregistrées`,"diffViewer.closeConfirm.message":`Ce fichier contient des modifications jamais enregistrées. Fermer le visualiseur de diff les perdra.`,"diffViewer.closeConfirm.discard":`Fermer sans enregistrer`,"diffViewer.criteriaRail":`Checklist de revue`,"diffViewer.criteriaRailShow":`Afficher la checklist de revue`,"diffViewer.criteriaRailHide":`Masquer la checklist de revue`,"diffViewer.fileTreeShow":`Afficher l’arbre des fichiers`,"diffViewer.fileTreeHide":`Masquer l’arbre des fichiers`,"diffViewer.closeConfirm.saveAndClose":`Enregistrer et fermer`,"diffViewer.agentRunning":`L’agent tourne — arrête-le pour éditer`,"diffViewer.fileDeleted":`Fichier supprimé`,"notification.agentFinished":`{name} — Agent terminé`,"notification.agentQuestion":`{name} — L'agent te pose une question`,"notification.awaitingReminder":`{name} - attend toujours votre réponse ({minutes} min)`,"notification.agentPermissionRequest":`{name} — L'agent demande une permission`,"notification.autoLoopCompleted":`{name} — Auto-loop terminé`,"notification.autoLoopWaitingForSlot":`{name} - L'auto-loop attend un slot d'agent libre ({running}/{limit} en cours)`,"notification.autoLoopStalled":`{name} — Auto-loop bloqué (aucun progrès)`,"notification.autoLoopError":`{name} — Auto-loop arrêté sur erreur`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pause, en attente de votre précision`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop a forcé le mode plan en bypass`,"notification.agentError":`{name} — Erreur agent`,"contextMenu.rename":`Renommer`,"contextMenu.editDescription":`Modifier la description`,"contextMenu.copyPath":`Copier le chemin du worktree`,"contextMenu.copyWorkspaceId":`Copier l'identifiant du workspace`,"contextMenu.openEditor":`Ouvrir dans l'éditeur`,"contextMenu.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"contextMenu.unarchiveDisabledPurged":`Restaurez d’abord le worktree avec Restaurer le worktree, ou recréez-le manuellement. Kōbō détecte automatiquement les worktrees correspondants.`,"workspaceList.unarchiveBlockedPurged":`Restaurez d’abord le worktree avec Restaurer le worktree, ou recréez-le manuellement. Kōbō détecte automatiquement les worktrees correspondants.`,"contextMenu.purgeWorktree":`Libérer l'espace disque (supprimer le worktree)`,"contextMenu.purgeWorktreeTooltip":`Supprime le worktree du disque pour récupérer de l'espace — l'historique des messages et sessions est conservé. Archive automatiquement le workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Libérer l'espace disque ?`,"contextMenu.purgeWorktreeDialogMessage":`Le dossier worktree de « {name} » va être supprimé du disque. L'historique des messages et sessions est conservé. Le workspace sera archivé automatiquement. Cette action ne peut pas être annulée dans la version actuelle.`,"contextMenu.purgeWorktreeDialogConfirm":`Supprimer le worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree supprimé — espace disque récupéré.`,"settings.autoPurgeOnPrMerged":`Purger le worktree quand la PR est mergée`,"settings.autoPurgeOnPrMergedHint":`Quand activé, le worktree est supprimé du disque dès que la PR est mergée (en plus de l'archivage auto). L'historique des messages est conservé.`,"settings.autoLoopMaxRetries":`Nombre maximal de nouvelles tentatives`,"settings.awaitingUserReminder":`Rappel de question sans réponse`,"settings.awaitingUserReminderHint":`Minutes pendant lesquelles un workspace peut attendre votre réponse avant que Kōbō ne vous relance, puis à chaque intervalle suivant. 0 désactive.`,"settings.localeLoadFailed":`Impossible de charger cette langue ; la langue actuelle est conservée.`,"settings.autoLoopMaxRetriesHint":`Met la mission en pause après ce nombre de pannes temporaires du moteur ou du serveur. Les quotas attendent leur réinitialisation sans consommer cette limite.`,"settings.retentionTitle":`Rétention de l'historique de conversation (désactivée par défaut)`,"settings.retentionWarning":`Activer cette option supprime définitivement de la base l'historique de conversation des agents, à commencer par tout ce qui est déjà plus vieux que la fenêtre. Les événements supprimés sont irrécupérables.`,"settings.retentionHint":`Exécutée une fois au démarrage du serveur. Les workspaces, tâches, sessions, branches et worktrees ne sont jamais touchés — seule la sortie enregistrée des agents l'est.`,"settings.retentionDaysLabel":`Supprimer les événements plus vieux que (jours)`,"settings.retentionDaysHint":`0 — la valeur par défaut — conserve tous les événements indéfiniment. Renseignez une valeur pour activer la rétention.`,"settings.retentionKeepLabel":`Événements toujours conservés par workspace`,"settings.retentionKeepHint":`Les événements les plus récents de chaque workspace survivent quel que soit leur âge, pour qu'un workspace ancien mais toujours ouvert garde un historique lisible. Suggéré : 5000.`,"settings.retentionDisabledHint":`Rétention désactivée : rien ne sera jamais supprimé.`,"settings.retentionConfirmTitle":`Supprimer définitivement de l'historique de conversation ?`,"settings.retentionConfirmMessage":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, {count} des {total} événements d'agent enregistrés — y compris tout ce qui est déjà plus ancien. C'est irréversible. Continuer ?`,"settings.retentionConfirmMessageUnknown":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, tous les événements d'agent plus anciens — y compris tout ce qui est déjà accumulé. Le volume exact n'a pas pu être calculé. C'est irréversible. Continuer ?`,"settings.purgeDocsTitle":`Comment ça marche — restauration & permissions`,"settings.purgeDocsRestoreTitle":`Restaurer un worktree purgé (détection automatique)`,"settings.purgeDocsRestoreIntro":`Un workspace purgé conserve son historique de chat et les métadonnées de la PR, mais le dossier worktree n'existe plus. Recrée-le manuellement avec l'une de ces commandes — Kōbō détecte la réapparition du dossier dans les 30 secondes et réactive automatiquement le workspace (désarchive + clear flag purge) :`,"settings.purgeDocsRestoreCommands":`# GitHub (via le CLI gh) :
|
|
11
|
+
# ton script — utilise $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Réinitialiser au défaut Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`Réinitialiser le script ?`,"settings.changeSourceBranchScript.replaceConfirm":`Tes modifications seront remplacées par le script Kōbō par défaut. Continuer ?`,"settings.cleanupScriptHint":`Script shell exécuté dans le worktree après chaque fin de session de l'agent. En mode auto-loop, il ne s'exécute qu'une fois toutes les tâches terminées. Laisser vide pour désactiver.`,"settings.cleanupScriptPlaceholder":`ex. supprimer des fichiers temporaires, arrêter des conteneurs…`,"settings.cleanupScriptMode":`Quand l'exécuter`,"settings.cleanupScriptMode.idle":`À chaque fin de session — même s'il reste des tâches`,"settings.cleanupScriptMode.noTasks":`Uniquement quand plus aucune tâche Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Lancer uniquement si des fichiers ont été modifiés, ajoutés ou supprimés`,"settings.cleanupScriptMode.inherit":`Hériter du réglage global`,"settings.taskPromptTemplate":`Prompt de tâche`,"settings.taskPromptTemplatePlaceholder":`Prompt inséré automatiquement dans la description de tâche…`,"settings.taskPromptTemplateHint":`Injecté automatiquement dans la description de tâche sur la page de création quand ce projet est sélectionné. S'il n'est pas modifié, il est remplacé en changeant de projet ; dès que vous l'éditez, votre texte est conservé.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Exécuté avec bash dans le worktree après sa création, avant le démarrage de l'agent. Pas besoin de shebang. En cas d'échec, le workspace passe en erreur. Timeout : 5 minutes.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Aucun`,"settings.e2e.frameworkOther":`Autre`,"settings.e2e.skill":`Skill (optionnel)`,"settings.e2e.skillPlaceholder":`ex : cypress-tester`,"settings.e2e.prompt":`Guidance personnalisée (optionnel)`,"settings.e2e.promptPlaceholder":`ex : utiliser le page-object, cibler les data-testid`,"settings.e2e.helpText":`Quand configuré, l'agent de grooming auto-loop insère des sous-tâches E2E pour les fonctionnalités UI.`,"settings.finalization.title":`Finalisation de l'auto-loop`,"settings.finalization.helpText":`Optionnel : un prompt que l'agent exécute lors de la toute dernière itération de l'auto-loop. Typiquement utilisé pour les contrôles qualité finaux (lint, typecheck, tests). L'étape de grooming créera une tâche préfixée [FINAL] qui utilisera ce prompt.`,"settings.finalization.prompt":`Prompt de finalisation`,"settings.finalization.promptPlaceholder":`ex. Lance npm run lint et npm test, puis marque cette tâche comme terminée.`,"settings.editorCommand":`Commande éditeur`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Commande utilisée pour ouvrir le worktree dans votre éditeur. Le chemin du worktree est passé en argument.`,"settings.fileManagerCommand":`Commande explorateur de fichiers`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Commande utilisée pour ouvrir le worktree dans votre explorateur de fichiers. Le chemin du worktree est passé en argument. Laissez vide pour masquer le bouton.`,"settings.terminalCommand":`Commande du terminal`,"settings.terminalCommandHint":`Commande pour lancer le terminal dans le worktree. Placeholder {path} optionnel pour le répertoire.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Sélection MCP Claude`,"settings.mcpAutoSelect":`Auto (premier MCP actif correspondant)`,"settings.notionMcp":`Clé MCP Notion`,"settings.sentryMcp":`Clé MCP Sentry`,"settings.mcpSelectionHint":`Les entrées actives sont lues depuis ~/.claude.json. Laisser Auto pour utiliser le comportement par défaut.`,"settings.configuredProjects":`Projets configurés`,"settings.noProjects":`Aucun projet configuré`,"settings.addProject":`Ajouter un projet`,"settings.copyFrom":`Copier les settings depuis`,"settings.copyFromPlaceholder":`(aucun — partir des valeurs par défaut)`,"settings.copyFromHint":`Copie tous les settings sauf le path, le nom affiché et la branche source.`,"settings.copyFromConfirmTitle":`Écraser les valeurs actuelles ?`,"settings.copyFromConfirm":`Cela écrasera les valeurs du formulaire avec les settings de « {project} ». Continuer ?`,"settings.newProject":`Nouveau projet`,"settings.editProject":`Modifier le projet`,"help.title":`Aide`,"help.tours":`Visites guidées`,"help.steps":`{n} étape | {n} étapes`,"help.markAllSeen":`Marquer toutes comme vues`,"help.markAllSeenHint":`Valide les visites actuelles sans les lancer.`,"help.resetAll":`Réinitialiser toutes les visites`,"help.resetAllHint":`Relance l'accueil ; chaque écran rejouera sa visite à la prochaine ouverture.`,"help.status.unseen":`non vue`,"help.status.partial":`en partie`,"help.status.seen":`vue`,"help.replayThis":`Rejouer la visite de cet écran`,"tours.next":`Suivant`,"tours.prev":`Précédent`,"tours.done":`Terminé`,"tours.exitConfirm":`Quitter la visite guidée ? Elle ne se relancera plus automatiquement ; vous pourrez la rejouer à tout moment depuis le menu Aide.`,"tours.home.title":`S'orienter`,"tours.home.list.title":`Workspaces`,"tours.home.list.description":`Chaque mission vit ici avec son statut. Les badges signalent une CI en échec, une review demandant des changements ou une PR prête à merger. Faites glisser le bord intérieur d’un panneau avec la souris ou le doigt pour le redimensionner. Les boutons du haut passent sur plusieurs lignes si nécessaire.`,"tours.home.create.title":`Créer un workspace`,"tours.home.create.description":`Un workspace, c'est un worktree Git, une branche et une session d'agent pour une tâche.`,"tours.home.search.title":`Recherche`,"tours.home.search.description":`Filtrez la liste par nom. L'icône de recherche en haut ouvre la recherche plein texte dans les conversations des agents.`,"tours.home.dashboard.title":`Tableau de bord`,"tours.home.dashboard.description":`Un tableau pour tous les workspaces actifs : statut, attention, PR, diff, activité, plus la fiabilité des moteurs.`,"tours.home.health.title":`Santé et changelog`,"tours.home.health.description":`Vérifiez la base de données, les runtimes et les agents actifs. Le bouton voisin liste ce qui a changé à chaque version.`,"tours.home.settings.title":`Paramètres`,"tours.home.settings.description":`Moteurs, intégrations, automatisation, worktrees et projets. Créez maintenant votre premier workspace.`,"tours.create.title":`Créer un workspace`,"tours.create.project.title":`Projet et branche`,"tours.create.project.description":`Choisissez le projet et la branche de départ du worktree.`,"tours.create.mission.title":`Mission`,"tours.create.mission.description":`Décrivez la tâche, ou importez-la depuis une page Notion ou une issue Sentry.`,"tours.create.template.title":`Templates`,"tours.create.template.description":`Appliquez un preset enregistré, ou enregistrez ce formulaire comme preset. « Dupliquer » sur une carte de workspace ouvre ce formulaire prérempli.`,"tours.create.engine.title":`Moteur et modèle`,"tours.create.engine.description":`Claude Code ou Codex, le modèle, l'effort de raisonnement et ce que l'agent peut faire sans demander.`,"tours.create.brainstorm.title":`Brainstorm sur un autre modèle`,"tours.create.brainstorm.description":`Lancez la première session de brainstorming sur un autre modèle, puis revenez au modèle principal pour les itérations.`,"tours.create.autoloop.title":`Auto-loop`,"tours.create.autoloop.description":`Laissez l’agent terminer les tâches et les vérifications finales. Une review finale indépendante peut ensuite se répéter après correction jusqu’à zéro finding ; un blocage suspend la boucle.`,"tours.create.finalReview.title":`Configurer la review finale`,"tours.create.finalReview.description":`Choisissez à l’avance le moteur, le modèle, l’effort et les instructions du reviewer. La review tourne dans une session séparée en lecture seule ; l’agent d’origine corrige les findings, puis la review recommence jusqu’à ce qu’il n’en reste aucun.`,"tours.workspace.finalReview.title":`Review finale et corrections`,"tours.workspace.finalReview.description":`Configurez ici le reviewer final optionnel avant son lancement. Après les tâches et les vérifications finales, une session séparée examine le travail. Les findings reviennent dans la session d’origine pour correction automatique et nouvelle review. Fermer Kōbō préserve ce cycle.`,"tours.workspace.reviewReturn.title":`Retour de review`,"tours.workspace.reviewReturn.description":`Le résumé revient dans la session d’origine, même après redémarrage de Kōbō. Si la livraison est incertaine, consultez cette conversation avant Réessayer ; Annuler abandonne le retour. Une review manuelle attend vos instructions avant de corriger ; l’auto-loop corrige automatiquement.`,"tours.create.comparison.title":`Comparer deux moteurs`,"tours.create.comparison.description":`Créez deux workspaces jumeaux sur la même tâche et comparez leurs commits, tâches et activité.`,"tours.workspace.sessions.title":`Sessions du workspace`,"tours.workspace.sessions.description":`Clique sur le titre pour choisir une session, en créer une, la renommer ou retrouver son identifiant.`,"tours.workspace.actions.title":`Actions du workspace`,"tours.workspace.actions.description":`Le menu ⋯ regroupe la vue côte à côte, la palette de commandes, le panneau latéral et la visite guidée.`,"tours.workspace.title":`Dans un workspace`,"tours.workspace.chat.title":`Conversation`,"tours.workspace.chat.description":`La sortie de l'agent, en direct : messages, appels d'outils, questions et erreurs.`,"tours.workspace.input.title":`Parler à l'agent`,"tours.workspace.input.description":`Envoyez un message, utilisez les slash commands, dictez à la voix ou joignez des fichiers.`,"tours.workspace.selectors.title":`Réglages de session`,"tours.workspace.selectors.description":`Ouvre Configurer pour régler le modèle, l’effort, les permissions et l’auto-loop. Le moteur actuel y est indiqué.`,"tours.workspace.status.title":`Statut`,"tours.workspace.status.description":`L'état de la session en cours ; arrêtez-la ici si besoin.`,"tours.workspace.git.title":`Git`,"tours.workspace.git.description":`Commits, diff, push, rebase et la PR de cette branche.`,"tours.workspace.tasks.title":`Tâches`,"tours.workspace.tasks.description":`Ce que l'agent prévoit de faire, et les critères d'acceptation à respecter.`,"tours.workspace.timeline.title":`Chronologie`,"tours.workspace.timeline.description":`Toutes les sessions de ce workspace ; ouvrez-en une plus ancienne pour la relire.`,"tours.workspace.subagents.title":`Sous-agents`,"tours.workspace.subagents.description":`Suivez les sous-agents lancés par l'agent, avec leur progression en direct.`,"tours.workspace.documents.title":`Documents`,"tours.workspace.documents.description":`Plans et fichiers écrits par l'agent, consultables sans quitter le chat.`,"tours.workspace.schedule.title":`Programmation`,"tours.workspace.schedule.description":`Réveils et crons qui relancent l'agent plus tard.`,"tours.workspace.memory.title":`Mémoire du workspace`,"tours.workspace.memory.description":`Consultez la mémoire transmise à la conversation sélectionnée, les propositions en attente et les opérations du workspace. Son effacement ne modifie pas l’historique du fournisseur.`,"tours.workspace.handoff.title":`Repartir avec un contexte frais`,"tours.workspace.handoff.description":`Une longue conversation ? Démarre une session fraîche ici, ou utilise « Changer de LLM ». Le travail courant est interrompu immédiatement et la nouvelle session reprend automatiquement dans le même workspace. La synthèse de passation est facultative : désactive-la si le quota du LLM actuel est épuisé. Le suivi, le rapport et le lien vers la session précédente apparaissent sous ce bouton.`,"tours.workspace.terminal.title":`Terminal`,"tours.workspace.terminal.description":`Un shell dans le worktree, sans quitter Kōbō.`,"tours.gitPr.title":`Pull request`,"tours.gitPr.panel.title":`Statut de la PR`,"tours.gitPr.panel.description":`Résultat de la CI, décision de review et reviewers, rafraîchis toutes les 30 secondes.`,"tours.gitPr.actions.title":`Actions Git`,"tours.gitPr.actions.description":`Push, pull, rebase ou changement de branche de base. Pendant un conflit, un bouton laisse l'agent le résoudre.`,"tours.gitPr.attention.title":`Badges d'attention`,"tours.gitPr.attention.description":`La carte affiche une CI en échec, des changements demandés ou une PR prête à merger.`,"tours.settings.title":`Paramètres`,"tours.settings.engines.title":`Moteurs et modèles`,"tours.settings.engines.description":`Modèles, permissions par défaut et limites de relance automatique.`,"tours.settings.integrations.title":`Intégrations`,"tours.settings.integrations.description":`Connexions Notion et Sentry, et identifiants Bitbucket. GitHub et GitLab utilisent votre connexion CLI locale.`,"tours.settings.automation.title":`Automatisation`,"tours.settings.automation.description":`Scripts de setup et de cleanup, hooks de cycle de vie, templates de prompts, templates de workspace et skills.`,"tours.settings.worktrees.title":`Worktrees`,"tours.settings.memory.title":`Mémoire`,"tours.settings.memory.description":`Choisissez le mode manuel, automatique ou hybride, puis parcourez les portées et vérifiez ou effacez leurs données mémoire exactes. Les opérations mémoire sont immédiates ; le changement de mode passe par Enregistrer.`,"tours.settings.worktrees.description":`Où vivent les worktrees, combien de temps garder ceux qui sont mergés, et la purge automatique.`,"tours.settings.projects.title":`Projets`,"tours.settings.projects.description":`Les projets enregistrés et leurs surcharges par projet.`,"tours.settings.misc.title":`Général, voix, notifications, export`,"tours.settings.misc.description":`Langue, accès réseau, dictée, sons et notifications navigateur, et un export complet de vos réglages.`,"tours.dashboard.title":`Tableau de bord`,"tours.dashboard.overview.title":`Vue d'ensemble`,"tours.dashboard.overview.description":`Tous les workspaces actifs dans un tableau ; cliquez sur une ligne pour l'ouvrir.`,"tours.dashboard.reliability.title":`Fiabilité des moteurs`,"tours.dashboard.reliability.description":`Sessions, erreurs et durées par moteur et par modèle.`,"tours.health.title":`Santé`,"tours.health.checks.title":`Vérifications`,"tours.health.checks.description":`Environnement, base de données, runtimes, workspaces et sessions.`,"tours.health.active.title":`État actif`,"tours.health.active.description":`Les back-offs de quota, les réveils en attente et les auto-loops en cours en ce moment.`,"tours.search.title":`Recherche`,"tours.search.input.title":`Requête`,"tours.search.input.description":`Recherche dans les noms de workspaces et les conversations des agents.`,"tours.search.archived.title":`Archivés`,"tours.search.archived.description":`Inclure les workspaces archivés dans les résultats.`,"tours.changelog.title":`Nouveautés`,"tours.changelog.list.title":`Versions`,"tours.changelog.list.description":`Ce qui a changé à chaque version, la plus récente en premier.`,"settings.projectGroup.identity":`Identité`,"settings.projectGroup.defaults":`Valeurs par défaut`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Chemin du projet`,"settings.projectPathPlaceholder":`/chemin/vers/le/projet`,"settings.displayName":`Nom affiché`,"settings.displayNamePlaceholder":`Mon projet`,"settings.defaultSourceBranch":`Branche source par défaut`,"settings.defaultModel.project":`Modèle par défaut`,"settings.skipPermissions.project":`Ignorer les invites de permission`,"settings.prPromptTemplate.project":`Modèle de prompt PR`,"settings.prPromptPlaceholder.project":`Instructions spécifiques au projet pour la création de PR...`,"settings.reviewPromptTemplate.project":`Modèle de prompt de review`,"settings.ciFixPromptTemplate.project":`Modèle de prompt « Fix CI »`,"settings.gitConventions.project":`Conventions Git (projet)`,"settings.gitConventionsEmpty":`Laisser vide pour utiliser les conventions globales.`,"settings.notionStatus":`Statut ticket Notion`,"settings.notionStatusProperty":`Nom de la propriété`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valeur à définir`,"settings.notionInProgressStatusPlaceholder":`En cours, In progress...`,"settings.notionStatusHint":`Quand un workspace est créé avec un ticket Notion, la propriété spécifiée est mise à cette valeur. Les deux champs sont requis. Laisser vide pour désactiver.`,"settings.notionAssignee":`Assignation Notion`,"settings.notionAssigneeHint":`Quand un workspace est créé avec un ticket Notion, l'utilisateur authentifié sur le MCP Notion est ajouté à cette propriété People — uniquement si elle n'a pas déjà d'assigné. Laisser vide pour désactiver.`,"settings.notionAssigneeProperty":`Nom de la propriété`,"settings.notionAssigneePropertyPlaceholder":`Développeurs, Assignees...`,"settings.notionUserId":`Ton UUID Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Sélectionne ton compte dans la liste. Notion refuse l'assignation d'un bot — ce champ est obligatoire pour activer l'auto-assignation.`,"settings.notionUsersRefresh":`Rafraîchir`,"settings.notionUsersLoading":`Chargement des utilisateurs Notion…`,"settings.notionUsersLoadFailed":`Impossible de récupérer la liste : {error}`,"settings.notionUsersManualFallback":`Liste indisponible — colle ton UUID Notion manuellement.`,"settings.devServer":`Serveur de dev`,"settings.devServerStart":`Script de démarrage`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script d'arrêt`,"settings.devServerStopPlaceholder":`Optionnel — le processus sera tué automatiquement si vide`,"settings.selectProject":`Sélectionnez un projet ou ajoutez-en un nouveau`,"settings.useGlobal":`Utiliser le global`,"settings.saved":`Paramètres généraux enregistrés.`,"settings.unsavedChanges":`Modifications non enregistrées`,"settings.nav.general":`Général`,"settings.nav.agents":`Agents`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.workspaceTemplates":`Templates de workspace`,"workspaceTemplates.title":`Templates de workspace`,"workspaceTemplates.hint":`Préréglages enregistrés du formulaire de création. Choisissez-en un sur la page de création ; pour en modifier un, chargez-le là, ajustez, puis réenregistrez-le sous le même nom.`,"workspaceTemplates.empty":`Aucun template pour l'instant. Remplissez le formulaire de création et utilisez « Enregistrer comme template ».`,"workspaceTemplates.anyProject":`Tout projet`,"workspaceTemplates.rename":`Renommer`,"workspaceTemplates.renameTitle":`Renommer le template`,"workspaceTemplates.deleteConfirm":`Supprimer le template « {name} » ?`,"workspaceTemplates.deleted":`Template « {name} » supprimé`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Les identifiants restent locaux et sont utilisés uniquement par bkt.`,"settings.bitbucketUsername":`E-mail Atlassian`,"settings.bitbucketToken":`Token API Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voix`,"settings.nav.notifications":`Notifications`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Export`,"settings.help.general":`Langue, accès réseau et valeurs par défaut dont hérite chaque projet.`,"settings.help.agents":`Modèles et permissions par défaut, ainsi que les limites de relance automatique.`,"settings.help.skills":`Les suites de skills que l'agent est invité à utiliser.`,"settings.help.prompts":`Instructions des agents après ouverture d’une PR/MR, pour les revues de code, les corrections CI et la finalisation.`,"settings.help.scripts":`Scripts de setup, de nettoyage et de changement de branche source, plus les hooks de cycle de vie.`,"settings.help.notion":`Importer une page Notion comme source de vérité d'un workspace.`,"settings.help.sentry":`Créer un workspace à partir d'une issue Sentry.`,"settings.help.forge":`Identifiants Bitbucket. GitHub et GitLab utilisent vos CLI gh/glab authentifiées ; choisissez la forge par projet.`,"settings.help.voice":`Dictée et push-to-talk.`,"settings.help.notifications":`Sons, notifications navigateur et rappel des questions sans réponse.`,"settings.help.worktrees":`Où les worktrees sont créés, rétention et purge automatique.`,"settings.help.projects":`Projets enregistrés et leurs surcharges par projet.`,"settings.help.templates":`Templates de prompt développés dans la zone de saisie du chat.`,"settings.help.workspaceTemplates":`Presets enregistrés du formulaire de création.`,"settings.help.export":`Exporter et importer tous les paramètres en JSON.`,"settings.openNav":`Ouvrir la navigation`,"settings.saveError":`Erreur lors de l'enregistrement des paramètres.`,"settings.projectSaved":`Projet enregistré.`,"settings.projectSaveError":`Erreur lors de l'enregistrement du projet.`,"settings.projectDeleted":`Projet supprimé.`,"settings.deleteProjectConfirmTitle":`Supprimer le projet ?`,"settings.deleteProjectConfirmMessage":`Retirer « {name} » de vos projets ? Cela supprime uniquement ses réglages Kōbō — votre code et vos worktrees ne sont pas touchés.`,"settings.projectDeleteError":`Erreur lors de la suppression du projet.`,"settings.projectPathRequired":`Le chemin du projet est requis.`,"templates.title":`Modèles`,"templates.newTemplate":`Nouveau modèle`,"templates.editTemplate":`Modifier le modèle`,"templates.deleteTemplate":`Supprimer le modèle`,"templates.deleteConfirm":`Supprimer le modèle '/{slug}' ?`,"templates.deleteConfirmMessage":`Cette action est irréversible.`,"templates.slug":`Slug`,"templates.slugHint":`Lettres minuscules, chiffres, tirets. Max 64 caractères.`,"templates.slugInvalid":`Le slug ne peut contenir que des lettres minuscules, chiffres et tirets`,"templates.slugDuplicate":`Un modèle avec ce slug existe déjà`,"templates.description":`Description`,"templates.descriptionHint":`Libellé court affiché dans le dropdown.`,"templates.descriptionRequired":`La description est requise`,"templates.contentRequired":`Le contenu est requis`,"templates.content":`Contenu`,"templates.contentHint":`Contenu du modèle. Utilise {variable_name} pour les substitutions.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Fichier : {path}`,"templates.empty":`Aucun modèle pour l'instant.`,"templates.createFailed":`Échec de la création du modèle`,"templates.updateFailed":`Échec de la modification du modèle`,"templates.deleteFailed":`Échec de la suppression du modèle`,"templates.save":`Enregistrer`,"templates.create":`Créer`,"templates.reloadDefaults":`Recharger les modèles par défaut`,"templates.reloadDefaultsHint":`Ajoute uniquement les modèles par défaut manquants. Les modèles existants (même modifiés) ne sont jamais écrasés.`,"templates.reloadDefaultsConfirmMessage":`Cette action ajoute les modèles par défaut absents de la liste. Les modèles existants — y compris ceux que tu as modifiés — ne seront pas touchés. Si tu veux récupérer la version d'origine d'un modèle modifié, supprime-le d'abord puis relance cette action.`,"templates.reloadDefaultsSuccess":`{added} ajouté(s), {kept} conservé(s)`,"templates.reloadDefaultsFailed":`Échec du rechargement des modèles par défaut`,"templates.resetToDefault":`Réinitialiser au défaut`,"templates.resetConfirmTitle":`Réinitialiser le template au défaut ?`,"templates.resetConfirmMessage":`Cela écrase vos modifications locales de /{slug} par le défaut intégré. Action irréversible.`,"templates.resetSuccess":`Template /{slug} réinitialisé au défaut`,"templates.resetFailed":`Échec de la réinitialisation du template`,"chatInput.dropdownSkills":`Skills Claude`,"chatInput.dropdownKobo":`Commandes Kōbō`,"chatInput.dropdownTemplates":`Modèles`,"documents.title":`Documents`,"documents.empty":`Aucun document trouvé`,"documents.refresh":`Actualiser`,"documents.back":`Retour`,"documents.loadFailed":`Échec du chargement du document`,"git.title":`Git`,"git.outputDialogTitle":`Git a signalé une erreur`,"git.statsFailed":`L’état git n’a pas pu être lu`,"git.section.repository":`Dépôt`,"git.section.changes":`Modifications`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Actions`,"git.actions.more":`Plus`,"git.localOnly":`local uniquement`,"git.pushed":`pushé`,"git.unpushed":`{count} non pushé`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Chargement des commits…`,"git.commits.empty":`Aucun commit sur cette branche`,"git.commits.pushed":`Pushé`,"git.commits.unpushed":`Non pushé`,"git.commits.clickToAppend":`clique pour ajouter le SHA au chat`,"git.commits.diffThisCommit":`Diff de ce commit (vs parent)`,"git.compareCommits":`Comparer des commits…`,"git.files":`{count} fichier | {count} fichiers`,"git.staged":`{count} indexé`,"git.modified":`{count} modifié`,"git.untracked":`{count} non suivi`,"git.workingTreeEmpty":`Aucune modification non commitée`,"git.fileStaged":`Indexé`,"git.fileModified":`Modifié`,"git.fileUntracked":`Non suivi`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.pushRejectedHistory":`Push refusé : la branche locale et la branche distante ont des historiques différents. Après un rebase de commits déjà publiés, utilisez « Force push » avec confirmation. Sinon, récupérez et intégrez les changements distants avant de réessayer.`,"git.pushRejectedLease":`Push forcé refusé : la branche distante a changé depuis votre dernière récupération. Récupérez et vérifiez ces changements avant de réessayer.`,"git.pushFailed":`Impossible de pousser la branche. Ouvrez les détails pour connaître la cause.`,"git.pushBlockedByOperation":`Terminez ou abandonnez d'abord l'opération {operation} en cours`,"git.pushUpToDate":`Rien à pousser : la branche est déjà à jour sur origin`,"git.forcePushHint":`Plus sûr que --force : le push est rejeté si le remote a des commits que tu n’as pas vus. À utiliser après un rebase ou un amend de commits déjà push.`,"git.branchForcePushed":`Branche force-pushée`,"git.pull":`Pull`,"git.pullNoUpstream":`Pas d'upstream pour cette branche — push-la d'abord pour activer Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la branche d'abord`,"git.viewRequest":`Voir la {request}`,"git.createRequest":`Créer une {request}`,"git.changeRequestBase":`Changer la branche cible de la {request}`,"git.forgeCliMissing":`{cli} n'est pas installé — installez-le pour les fonctions {request}`,"git.forgeNotAuthenticated":`Non authentifié — exécutez {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Détection automatique`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Aucune`,"git.pullConfirmTitle":`Pull la branche ?`,"git.pullConfirmMessage":`Pull {branch} depuis la remote (fast-forward uniquement).`,"git.branchPulled":`Branche pull`,"git.pullFailed":`Échec du pull`,"git.renameBranch":`Renommer la branche`,"git.renameBranchPrompt":"Renommer `{branch}` en :","git.renameBranchSuccess":"Branche renommée en `{branch}`","git.renameBranchFailed":`Échec du renommage`,"git.renameBranchExists":"La branche `{branch}` existe déjà (locale ou sur origin)","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Ouvre le diff viewer en mode Review — commentaires inline + soumission groupée à l'agent`,"pr.baseChanged":`Base de la PR modifiée : {oldBase} → {newBase}`,"pr.openPr":`Ouvrir la PR`,"pr.openWorkspace":`Ouvrir le workspace`,"pr.dismiss":`Fermer`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`Rebase la branche ?`,"git.rebaseConfirmMessage":`Rebase sur {branch}. Des conflits peuvent survenir.`,"git.rebaseSuccess":`Rebase terminé`,"git.rebaseFailed":`Rebase échoué`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Dépôt récupéré`,"git.fetchFailed":`Échec du fetch : {error}`,"git.mergeConfirmTitle":`Fusionner la branche ?`,"git.mergeConfirmMessage":`Fusionner {branch} dans cette branche. Des conflits sont possibles.`,"git.mergeSuccess":`Merge terminé`,"git.mergeFailed":`Merge échoué`,"git.commitFailed":`Commit échoué`,"git.commitChanges":`Committer les modifications`,"git.commitDialogTitle":`Committer les modifications non commitées`,"git.commitDialogDescription":`Saisissez votre message ou demandez à l’agent d’inspecter et de créer le commit.`,"git.commitMessage":`Message de commit`,"git.commitManual":`Committer`,"git.commitWithAgent":`Demander à l’agent`,"git.commitAgentSuccess":`Demande de commit envoyée à l’agent`,"git.discardFailed":`Abandon échoué`,"git.conflictTitleMerge":`Conflits de merge détectés`,"git.conflictTitleRebase":`Conflits de rebase détectés`,"git.operationPausedTitle":`Opération Git à poursuivre`,"git.operationPausedSubtitle":`Aucun fichier en conflit. Git attend simplement que tu poursuives l’opération.`,"git.conflictSubtitle":`{count} fichier(s) en conflit. Choisis comment continuer.`,"git.conflictAbortConfirmTitle":`Abandonner la résolution du conflit ?`,"git.conflictAbortConfirmMessage":`Tout ce que tu as résolu dans ce {op} est jeté et le worktree revient à son état d’avant. C’est irréversible.`,"git.conflictAbort":`Abandonner`,"git.conflictContinue":`Continuer`,"git.conflictContinued":`Opération Git poursuivie`,"git.conflictResolveWithAgent":`Demander à l'agent de résoudre`,"git.conflictAborted":`Opération abandonnée`,"git.conflictHandoffSuccess":`L'agent résout les conflits`,"git.dirtyTitleRebase":`Des modifications non commitées bloquent le rebase`,"git.dirtyTitleMerge":`Des modifications non commitées bloquent le merge`,"git.dirtyTitlePull":`Des modifications non commitées bloquent le pull`,"git.dirtySubtitle":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s). Choisis comment continuer.`,"git.dirtyStash":`Stash & réessayer`,"git.dirtyCommit":`Commit d'abord`,"git.dirtyCommitPlaceholder":`Message de commit`,"git.dirtyCommitConfirm":`Commit & réessayer`,"git.dirtyDiscard":`Abandonner les modifs`,"git.dirtyDiscardConfirmTitle":`Abandonner toutes les modifications non commitées ?`,"git.dirtyDiscardConfirmMessage":`Les modifications suivies seront perdues (git reset --hard). Les fichiers non suivis sont conservés. Action irréversible.`,"git.pushConfirmTitle":`Pusher la branche ?`,"git.pushConfirmMessage":`Pusher {branch} vers le dépôt distant.`,"git.pushConfirmMessagePrefix":`Pusher la branche`,"git.pushConfirmMessageSuffix":`vers le dépôt distant.`,"git.changePrBaseTitle":`Changer la branche cible`,"git.changePrBaseMessage":`Entrez la nouvelle branche cible pour la {request}.`,"git.changePrBaseSuccess":`Branche cible de la {request} mise à jour`,"git.changePrBaseFailed":`Impossible de changer la branche cible de la {request}`,"git.mergeRequest":`Fusionner la {request}`,"git.mergeRequestConfirmTitle":`Fusionner la {request} ?`,"git.mergeRequestConfirmMessage":`Cette action fusionne la {request} ouverte dans sa branche cible.`,"git.mergeRequestSuccess":`{request} fusionnée`,"git.mergeRequestFailed":`Impossible de fusionner la {request}`,"git.deleteRemoteBranch":`Supprimer la branche distante`,"git.deleteRemoteBranchTitle":`Supprimer la branche distante ?`,"git.deleteRemoteBranchMessage":`La demande a été fusionnée. Supprimer la branche distante {branch} ?`,"git.deleteRemoteBranchSuccess":`Branche distante {branch} supprimée`,"git.deleteRemoteBranchFailed":`Impossible de supprimer la branche distante`,"git.changeSourceBranch":`Changer la branche source`,"git.changeSourceBranchTitle":`Changer la branche source`,"git.changeSourceBranchMessage":`Choisis la nouvelle branche source. La branche de travail sera reconstruite par-dessus.`,"git.changeSourceBranchDone":`Branche source changée vers {branch}`,"git.changeSourceBranchAligned":`Branche source changée vers {branch} (la branche n'avait aucun commit propre)`,"git.changeSourceBranchTooMany":`La branche a trop de commits propres ({n}) — rebase-la manuellement`,"git.changeSourceBranchDirty":`Commit ou stash tes changements avant de changer la branche source`,"git.changeSourceBranchAgentRunning":`Arrête l'agent avant de changer la branche source`,"git.changeSourceBranchErrorTitle":`Échec du changement de branche source`,"git.changeSourceBranchErrorOngoing":`Une opération {op} est encore en cours sur le worktree. Annule-la pour revenir à un état propre.`,"git.changeSourceBranchErrorAbort":`Annuler l'opération`,"git.changeSourceBranchLoading":`Changement de la branche source…`,"git.changeSourceForcePushTitle":`Force-push de la branche réécrite ?`,"git.changeSourceForcePushMessage":`L'historique de la branche a été réécrit. La force-pusher vers le remote avec --force-with-lease ?`,"git.changeSourceForcePushDone":`Branche force-pushée`,"git.openEditor":`Ouvrir dans l'éditeur`,"git.openEditorFailed":`Impossible d'ouvrir l'éditeur`,"git.branchPushed":`Branche pushée`,"git.pushFirst":`La branche n'est pas sur le dépôt distant. Cliquez d'abord sur Push.`,"git.unpushedCommits":`Les commits locaux ne sont pas pushés. Cliquez d'abord sur Push.`,"git.from":`depuis`,"git.aheadBehindTooltip":`{ahead} commits en avance, {behind} en retard sur {source}`,"git.divergence.title":`Divergence de branche`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} en avance`,"git.divergence.behind":`↓ {count} en retard`,"git.divergence.empty.ahead":`Aucun commit en avance.`,"git.divergence.empty.behind":`Aucun commit en retard.`,"git.divergence.close":`Fermer`,"git.divergence.loading":`Chargement des commits…`,"git.divergence.failed":`Échec du chargement de la divergence`,"git.divergence.retry":`Réessayer`,"git.prCreated":`{request} #{n} créée`,"git.pr.author":`Auteur`,"git.pr.reviewers":`Relecteurs`,"git.pr.assignees":`Assignés`,"git.pr.labels":`Labels`,"git.pr.changesRequestedBadge":`Modifications demandées`,"git.pr.approvedBadge":`Approuvée`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI en échec`,"git.pr.ci.pending":`CI en cours`,"git.pr.ci.failedCount":`{n} en échec`,"git.pr.ci.pendingCount":`{n} en cours`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} ignoré(s)`,"git.pr.ci.showPassed":`Afficher les {n} jobs réussis`,"git.pr.ci.hidePassed":`Masquer les jobs réussis`,"toast.prChangesRequested":`Des modifications ont été demandées sur la PR #{n}`,"toast.prApproved":`La PR #{n} a été approuvée`,"toast.prReadyToMerge":`La PR #{n} est prête à merger`,"toast.prCiFailed":`La CI de la PR #{n} est en échec`,"toast.prCiRecovered":`La CI de la PR #{n} est rétablie`,"toast.prMergeConflict":`La PR #{n} a un conflit de merge`,"toast.prMerged":`La PR #{n} a été mergée`,"devServer.title":`Serveur de dev`,"devServer.noWorkspace":`Aucun espace de travail sélectionné`,"devServer.notConfigured":`Non configuré —`,"devServer.goToSettings":`Paramètres`,"devServer.logs":`Logs`,"devServer.running":`En cours`,"devServer.starting":`Démarrage`,"devServer.stopping":`Arrêt`,"devServer.error":`Erreur`,"devServer.stopped":`Arrêté`,"devServer.unknown":`Inconnu`,"devServer.containers":`{count} conteneur | {count} conteneurs`,"devServer.logDialog.title":`Logs du serveur de dev`,"devServer.logDialog.empty":`Aucun log disponible`,"notion.title":`Notion`,"tasks.title":`Tâches`,"notion.addTask":`Ajouter une tâche`,"notion.noUrl":`Aucune URL Notion`,"notion.subtasks":`{done}/{total} sous-tâches`,"notion.noTasks":`Aucune tâche`,"notion.newTask":`Nouvelle tâche... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.title":`Critères d'acceptation`,"acceptance.addCriterion":`Ajouter un critère`,"acceptance.newCriterion":`Nouveau critère... (Entrée pour ajouter, Échap pour annuler)`,"acceptance.empty":`Aucun critère d'acceptation`,"tasks.askProgress":`Demander à l'agent de vérifier sa progression`,"agentTodos.title":`Todos de l'agent`,"agentTodos.empty":`Aucun todo de l'agent`,"subagents.title":`Sub-agents`,"subagents.empty":`Aucune activité de sous-agent`,"subagents.tools":`{count} outils`,"subagents.running":`En cours : `,"subagents.status.running":`En cours`,"subagents.status.done":`Terminé`,"subagents.status.failed":`Échec`,"subagents.status.stopped":`Arrêté`,"subagents.ambient":`Surveillance en arrière-plan`,"subagents.ambientTooltip":`Surveillance en arrière-plan (ex. Monitor) : non comptée comme activité de l'agent`,"subagents.stop":`Arrêter ce sous-agent`,"subagents.stopAll":`Tout arrêter`,"subagents.stopFailed":`Impossible d'arrêter le sous-agent : {error}`,"subagents.activity":`Activité du sous-agent`,"subagents.noActivity":`Aucune activité visible du fournisseur pour le moment`,"chat.subagentActivity":`Activité d’un sous-agent`,"chat.openSubagentActivity":`Ouvrir ce sous-agent dans le panneau latéral`,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Quota {n}`,"quotaFooter.lastUpdated":`Dernière mise à jour : {time}`,"quotaFooter.empty":`Chargement…`,"quotaFooter.popover.title":`Utilisation Claude Code`,"quotaFooter.popover.refreshNow":`Rafraîchir`,"quotaFooter.popover.resetsIn":`Réinitialise à {value}`,"quotaFooter.popover.unauthenticated":`Auth requise`,"quotaFooter.popover.unauthenticatedHint":`Lancez "claude" une fois pour vous authentifier.`,"quotaFooter.popover.error":`Erreur`,"quotaFooter.bucket.fiveHour":`5 heures`,"quotaFooter.bucket.sevenDay":`7 jours`,"agent.error.spawn_failed":`Échec du lancement de l'agent`,"agent.error.parse_error":`Impossible d'analyser un message de l'agent`,"agent.error.rate_limit":`Limite de débit atteinte`,"agent.error.resume_failed":`Session introuvable — démarrage en session fraîche`,"agent.error.other":`Erreur de l'agent`,"quotaBackoff.banner.title":`Reprise auto à {time}`,"quotaBackoff.banner.transientTitle":`Reprise auto après interruption à {time}`,"quotaBackoff.resumeNow":`Reprendre maintenant`,"quotaBackoff.banner.tooltip":`Quota Claude épuisé. L'auto-loop reprendra automatiquement quand le quota se libère à {resets_at}.`,"quotaBackoff.banner.cancel":`Annuler la reprise`,"quotaBackoff.cancelled":`Reprise auto annulée — tu peux relancer manuellement à tout moment`,"rateLimitType.fiveHour":`Session 5h`,"rateLimitType.sevenDay":`Hebdo`,"tooltip.addTask":`Ajouter une tâche`,"tooltip.removeTask":`Supprimer la tâche`,"tooltip.addCriterion":`Ajouter un critère`,"tooltip.removeCriterion":`Supprimer le critère`,"tooltip.startDevServer":`Démarrer le serveur de dev`,"tooltip.stopDevServer":`Arrêter le serveur de dev`,"tooltip.closeDiffViewer":`Fermer le diff`,"tooltip.refreshLogs":`Actualiser les logs`,"tooltip.closeDialog":`Fermer`,"tooltip.refreshGitStats":`Actualiser les stats Git`,"tooltip.removeImage":`Supprimer l'image`,"tooltip.sendMessage":`Envoyer le message`,"tools.title":`Outils`,"tools.runSetupScript":`Relancer le script de setup`,"tools.runSetupScriptTooltip":`Exécuter le script de setup du projet dans le worktree`,"tools.runSetupScriptConfirm":`Relancer le script de setup dans cette tâche ? Les artefacts existants peuvent être écrasés.`,"tools.runSetupScriptBusy":`Impossible de relancer le setup pendant que l'agent travaille.`,"tools.noSetupScript":`Aucun script de setup configuré —`,"tools.setupScriptSuccess":`Script de setup terminé avec succès.`,"tools.setupScriptFailed":`Échec du script de setup.`,"tools.openNotion":`Ouvrir dans Notion`,"tools.openSentry":`Ouvrir dans Sentry`,"tools.review":`Reviewer les changes`,"tools.reviewTooltip":`Demander à l'agent de reviewer les changes de cette branche`,"tools.reviewBusy":`Agent occupé — attends qu'il soit idle`,"tools.fixCi":`Réparer la CI`,"tools.fixCiTooltip":`Demander à l'agent de diagnostiquer et corriger les jobs CI en échec`,"tools.fixCiLaunched":`Action « Fix CI » envoyée à l'agent`,"tools.fixCiFailed":`Échec du lancement de l'action « Fix CI »`,"tools.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"tools.openFileManagerTooltip":`Ouvrir le dossier du worktree dans votre explorateur de fichiers configuré`,"tools.openFileManagerFailed":`Échec de l'ouverture de l'explorateur de fichiers`,"tools.openTerminal":`Ouvrir dans un terminal`,"tools.openTerminalTooltip":`Ouvrir le worktree dans le terminal configuré`,"tools.openTerminalFailed":`Échec de l'ouverture du terminal`,"review.title":`Lancer une review`,"review.subtitle":`Demande à l'agent de reviewer tes changes et de te faire des retours.`,"review.additionalInstructions":`Instructions supplémentaires (optionnel)`,"review.additionalInstructionsPlaceholder":`Ajoute des instructions spécifiques pour la review…`,"review.newSession":`Nouvelle session`,"review.newSessionHint":`Démarre une nouvelle session d'agent au lieu de continuer la courante.`,"review.newSessionRequired":`Une nouvelle session est nécessaire pour changer les réglages de l’agent ou revenir automatiquement.`,"review.returnToSession":`Revenir à la session actuelle après la review`,"review.returnToSessionHint":`Reprend cette session avec le résumé final du reviewer. Sinon, la conversation continue dans la session de review.`,"review.readOnlyForced":`Une review qui revient à cette session tourne en lecture seule (Plan) : elle ne peut ni modifier de fichiers ni poser de questions.`,"review.returnUnavailable":`La session actuelle doit avoir démarré pour pouvoir être reprise.`,"review.start":`Lancer la review`,"review.cancel":`Annuler`,"review.launched":`Review lancée`,"review.failed":`Échec du lancement de la review`,"diff.title":`Diff`,"diff.side":`Côte à côte`,"diff.inline":`En ligne`,"diff.hideUnchanged":`Masquer le code inchangé`,"diff.showUnchanged":`Afficher le code inchangé`,"diff.showUntracked":`Afficher les fichiers non suivis`,"diff.hideUntracked":`Masquer les fichiers non suivis`,"diff.rollbackToRemote":`Revenir à la version distante`,"diff.rollbackConfirm":`Restaurer {path} à sa version distante (origin) ? Les modifications locales sur ce fichier seront perdues.`,"diff.rollbackConfirmOk":`Rollback`,"diff.rollbackDone":`Fichier restauré à la version distante`,"diff.rollbackDoneRemote":`Fichier restauré à la version distante`,"diff.rollbackDoneHead":`Modifications locales annulées (fichier restauré au dernier commit)`,"diff.rollbackDoneDeleted":`Fichier non suivi supprimé`,"diff.deleteUntracked":`Supprimer le fichier non suivi`,"diff.deleteUntrackedConfirm":`Supprimer définitivement {path} ? Ce fichier n'est pas suivi par git — son contenu sera perdu.`,"diff.deleteUntrackedConfirmOk":`Supprimer`,"diff.rollbackFailed":`Échec du rollback`,"diff.rollbackFailedDetail":`Échec du rollback : {error}`,"diff.modeInspect":`Édition`,"diff.modeReview":`Review`,"diff.addComment":`Ajouter un commentaire`,"diff.replyComment":`Répondre`,"diff.editComment":`Modifier`,"diff.deleteComment":`Supprimer`,"diff.deleteCommentConfirm":`Supprimer ce commentaire ?`,"diff.commentPlaceholder":`Écris un commentaire de revue… (Markdown accepté)`,"diff.reviewDraft":`Brouillon de revue`,"diff.reviewEmpty":`Aucun commentaire — survole une ligne dans le diff et clique + pour en ajouter un.`,"diff.reviewGlobalPlaceholder":`Ajoute un message global de revue (optionnel)`,"diff.submitReview":`Soumettre la revue ({n})`,"diff.reviewPending":`Une revue est déjà en cours d’envoi.`,"diff.reviewEmptySubmission":`La revue est vide.`,"diff.reviewNotAccepted":`Le message n’a pas été accepté. Votre revue a été conservée.`,"diff.reviewSubmitted":`Revue soumise à l'agent`,"diff.reviewSubmitFailed":`Échec de la soumission : {error}`,"diff.scopeBranch":`Branche`,"diff.scopeUnpushed":`Non pushé`,"diff.noChanges":`Aucun changement`,"diff.searchFiles":`Rechercher des fichiers…`,"diff.noFileMatch":`Aucun fichier correspondant`,"diff.selectFile":`Sélectionnez un fichier pour voir le diff`,"diff.fileLoadFailed":`Ce diff n’a pas pu être chargé`,"diff.fileLoadFailedHint":`Le fichier sur le disque est intact — seul le chargement du diff a échoué.`,"diff.fileListLoadFailed":`La liste des fichiers n’a pas pu être chargée`,"diff.fileListLoadFailedHint":`Il s’agit d’un échec de requête, pas d’une branche sans modification.`,"diff.addToChat":`Ajouter au chat`,"diff.compareTitle":`Comparer des commits`,"diff.compareFrom":`De`,"diff.compareTo":`À`,"diff.compareSubmit":`Comparer`,"diff.compareSourceBase":`{branch} (base de la branche)`,"diff.commitsReadOnly":`lecture seule`,"diffViewer.save":`Enregistrer`,"diffViewer.savedAt":`Enregistré`,"diffViewer.saveFailed":`Échec de l’enregistrement`,"diffViewer.saveFailedDetail":`Échec de l’enregistrement : {error}`,"diffViewer.unsavedChanges.title":`Modifications non enregistrées`,"diffViewer.unsavedChanges.message":`Tu as des modifications non enregistrées. Que veux-tu faire ?`,"diffViewer.unsavedChanges.save":`Enregistrer`,"diffViewer.unsavedChanges.cancel":`Annuler`,"diffViewer.conflict.title":`Fichier modifié sur le disque`,"diffViewer.conflict.message":`Le fichier a été modifié hors de Kōbō depuis que tu l’as ouvert.`,"diffViewer.conflict.reload":`Recharger (perdre les modifs locales)`,"diffViewer.conflict.keep":`Garder les miennes`,"diffViewer.conflict.overwrite":`Écraser quand même`,"diffViewer.conflict.overwriteHint":`Remplace le fichier sur le disque par ta version. L’autre modification est perdue.`,"diffViewer.conflict.keepHint":`Garde tes modifications dans l’éditeur et adopte la nouvelle signature du disque, pour que la prochaine sauvegarde fonctionne.`,"diffViewer.saveBlocked":`L’agent tourne — arrête-le pour enregistrer tes modifications.`,"diffViewer.unsavedBanner":`Modifications non enregistrées. Arrête l’agent pour les sauvegarder.`,"diffViewer.closeConfirm.title":`Modifications non enregistrées`,"diffViewer.closeConfirm.message":`Ce fichier contient des modifications jamais enregistrées. Fermer le visualiseur de diff les perdra.`,"diffViewer.closeConfirm.discard":`Fermer sans enregistrer`,"diffViewer.criteriaRail":`Checklist de revue`,"diffViewer.criteriaRailShow":`Afficher la checklist de revue`,"diffViewer.criteriaRailHide":`Masquer la checklist de revue`,"diffViewer.fileTreeShow":`Afficher l’arbre des fichiers`,"diffViewer.fileTreeHide":`Masquer l’arbre des fichiers`,"diffViewer.closeConfirm.saveAndClose":`Enregistrer et fermer`,"diffViewer.agentRunning":`L’agent tourne — arrête-le pour éditer`,"diffViewer.fileDeleted":`Fichier supprimé`,"notification.agentFinished":`{name} — Agent terminé`,"notification.agentQuestion":`{name} — L'agent te pose une question`,"notification.awaitingReminder":`{name} - attend toujours votre réponse ({minutes} min)`,"notification.agentPermissionRequest":`{name} — L'agent demande une permission`,"notification.autoLoopCompleted":`{name} — Auto-loop terminé`,"notification.autoLoopWaitingForSlot":`{name} - L'auto-loop attend un slot d'agent libre ({running}/{limit} en cours)`,"notification.autoLoopStalled":`{name} — Auto-loop bloqué (aucun progrès)`,"notification.autoLoopError":`{name} — Auto-loop arrêté sur erreur`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pause, en attente de votre précision`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop a forcé le mode plan en bypass`,"notification.agentError":`{name} — Erreur agent`,"contextMenu.rename":`Renommer`,"contextMenu.editDescription":`Modifier la description`,"contextMenu.copyPath":`Copier le chemin du worktree`,"contextMenu.copyWorkspaceId":`Copier l'identifiant du workspace`,"contextMenu.openEditor":`Ouvrir dans l'éditeur`,"contextMenu.openFileManager":`Ouvrir dans l'explorateur de fichiers`,"contextMenu.unarchiveDisabledPurged":`Restaurez d’abord le worktree avec Restaurer le worktree, ou recréez-le manuellement. Kōbō détecte automatiquement les worktrees correspondants.`,"workspaceList.unarchiveBlockedPurged":`Restaurez d’abord le worktree avec Restaurer le worktree, ou recréez-le manuellement. Kōbō détecte automatiquement les worktrees correspondants.`,"contextMenu.purgeWorktree":`Libérer l'espace disque (supprimer le worktree)`,"contextMenu.purgeWorktreeTooltip":`Supprime le worktree du disque pour récupérer de l'espace — l'historique des messages et sessions est conservé. Archive automatiquement le workspace.`,"contextMenu.purgeWorktreeDialogTitle":`Libérer l'espace disque ?`,"contextMenu.purgeWorktreeDialogMessage":`Le dossier worktree de « {name} » va être supprimé du disque. L'historique des messages et sessions est conservé. Le workspace sera archivé automatiquement. Cette action ne peut pas être annulée dans la version actuelle.`,"contextMenu.purgeWorktreeDialogConfirm":`Supprimer le worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree supprimé — espace disque récupéré.`,"settings.autoPurgeOnPrMerged":`Purger le worktree quand la PR est mergée`,"settings.autoPurgeOnPrMergedHint":`Quand activé, le worktree est supprimé du disque dès que la PR est mergée (en plus de l'archivage auto). L'historique des messages est conservé.`,"settings.showProgressBars":`Afficher les barres de progression`,"settings.showProgressBarsHint":`Activé par défaut. Masquer les barres ne ferme aucune activité et ne suspend pas leur suivi. Le changement s’applique dès l’enregistrement.`,"tours.settings.progressBars.title":`Barres de progression`,"tours.settings.progressBars.description":`Affichez ou masquez les barres au-dessus du champ de message. Leur suivi continue même lorsqu’elles sont masquées.`,"settings.agentWatchdogEnabled":`Activer les watchdogs d’inactivité des agents`,"settings.agentWatchdogHint":`Désactivés par défaut. Si activés, Kōbō peut arrêter Claude ou Codex après un silence prolongé, y compris les outils, sous-agents et compactages. Pris en compte au prochain démarrage ou à la prochaine reprise de l’agent.`,"tours.settings.agentWatchdog.title":`Watchdogs d’inactivité des agents`,"tours.settings.agentWatchdog.description":`Laissez cette option désactivée pour permettre aux tâches longues d’attendre sans activité visible. Activez-la pour fermer automatiquement les sessions bloquées. Le changement s’applique au prochain démarrage ou à la prochaine reprise de l’agent.`,"settings.autoLoopMaxRetries":`Nombre maximal de nouvelles tentatives`,"settings.awaitingUserReminder":`Rappel de question sans réponse`,"settings.awaitingUserReminderHint":`Minutes pendant lesquelles un workspace peut attendre votre réponse avant que Kōbō ne vous relance, puis à chaque intervalle suivant. 0 désactive.`,"settings.localeLoadFailed":`Impossible de charger cette langue ; la langue actuelle est conservée.`,"settings.autoLoopMaxRetriesHint":`Met la mission en pause après ce nombre de pannes temporaires du moteur ou du serveur. Les quotas attendent leur réinitialisation sans consommer cette limite.`,"settings.retentionTitle":`Rétention de l'historique de conversation (désactivée par défaut)`,"settings.retentionWarning":`Activer cette option supprime définitivement de la base l'historique de conversation des agents, à commencer par tout ce qui est déjà plus vieux que la fenêtre. Les événements supprimés sont irrécupérables.`,"settings.retentionHint":`Exécutée une fois au démarrage du serveur. Les workspaces, tâches, sessions, branches et worktrees ne sont jamais touchés — seule la sortie enregistrée des agents l'est.`,"settings.retentionDaysLabel":`Supprimer les événements plus vieux que (jours)`,"settings.retentionDaysHint":`0 — la valeur par défaut — conserve tous les événements indéfiniment. Renseignez une valeur pour activer la rétention.`,"settings.retentionKeepLabel":`Événements toujours conservés par workspace`,"settings.retentionKeepHint":`Les événements les plus récents de chaque workspace survivent quel que soit leur âge, pour qu'un workspace ancien mais toujours ouvert garde un historique lisible. Suggéré : 5000.`,"settings.retentionDisabledHint":`Rétention désactivée : rien ne sera jamais supprimé.`,"settings.retentionConfirmTitle":`Supprimer définitivement de l'historique de conversation ?`,"settings.retentionConfirmMessage":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, {count} des {total} événements d'agent enregistrés — y compris tout ce qui est déjà plus ancien. C'est irréversible. Continuer ?`,"settings.retentionConfirmMessageUnknown":`Ne conserver que {days} jour(s) d'historique supprimera définitivement, au prochain démarrage du serveur, tous les événements d'agent plus anciens — y compris tout ce qui est déjà accumulé. Le volume exact n'a pas pu être calculé. C'est irréversible. Continuer ?`,"settings.purgeDocsTitle":`Comment ça marche — restauration & permissions`,"settings.purgeDocsRestoreTitle":`Restaurer un worktree purgé (détection automatique)`,"settings.purgeDocsRestoreIntro":`Un workspace purgé conserve son historique de chat et les métadonnées de la PR, mais le dossier worktree n'existe plus. Recrée-le manuellement avec l'une de ces commandes — Kōbō détecte la réapparition du dossier dans les 30 secondes et réactive automatiquement le workspace (désarchive + clear flag purge) :`,"settings.purgeDocsRestoreCommands":`# GitHub (via le CLI gh) :
|
|
12
12
|
gh pr checkout [numéro-pr] --recurse-submodules
|
|
13
13
|
|
|
14
14
|
# Ou directement via git (fonctionne sur GitHub même après suppression de la branche) :
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{n as e}from"./editor.api-
|
|
1
|
+
import{n as e}from"./editor.api-D2PTZoSF.js";var t=[`assign`,`flush`,`ftl`,`return`,`global`,`import`,`include`,`break`,`continue`,`local`,`nested`,`nt`,`setting`,`stop`,`t`,`lt`,`rt`,`fallback`],n=[`attempt`,`autoesc`,`autoEsc`,`compress`,`comment`,`escape`,`noescape`,`function`,`if`,`list`,`items`,`sep`,`macro`,`noparse`,`noParse`,`noautoesc`,`noAutoEsc`,`outputformat`,`switch`,`visit`,`recurse`],r={close:`>`,id:`angle`,open:`<`},i={close:`\\]`,id:`bracket`,open:`\\[`},a={close:`[>\\]]`,id:`auto`,open:`[<\\[]`},o={close:`\\}`,id:`dollar`,open1:`\\$`,open2:`\\{`},s={close:`\\]`,id:`bracket`,open1:`\\[`,open2:`=`};function c(r){return{brackets:[[`<`,`>`],[`[`,`]`],[`(`,`)`],[`{`,`}`]],comments:{blockComment:[`${r.open}--`,`--${r.close}`]},autoCloseBefore:`
|
|
2
2
|
\r }]),.:;=`,autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`,notIn:[`string`]},{open:`'`,close:`'`,notIn:[`string`]}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],folding:{markers:{start:RegExp(`${r.open}#(?:${n.join(`|`)})([^/${r.close}]*(?!/)${r.close})[^${r.open}]*$`),end:RegExp(`${r.open}/#(?:${n.join(`|`)})[\\r\\n\\t ]*>`)}},onEnterRules:[{beforeText:RegExp(`${r.open}#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/${r.close}]*(?!/)${r.close})[^${r.open}]*$`),afterText:RegExp(`^${r.open}/#([a-zA-Z_]+)[\\r\\n\\t ]*${r.close}$`),action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`${r.open}#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/${r.close}]*(?!/)${r.close})[^${r.open}]*$`),action:{indentAction:e.IndentAction.Indent}}]}}function l(){return{brackets:[[`<`,`>`],[`[`,`]`],[`(`,`)`],[`{`,`}`]],autoCloseBefore:`
|
|
3
3
|
\r }]),.:;=`,autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`,notIn:[`string`]},{open:`'`,close:`'`,notIn:[`string`]}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],folding:{markers:{start:RegExp(`[<\\[]#(?:${n.join(`|`)})([^/>\\]]*(?!/)[>\\]])[^<\\[]*$`),end:RegExp(`[<\\[]/#(?:${n.join(`|`)})[\\r\\n\\t ]*>`)}},onEnterRules:[{beforeText:RegExp(`[<\\[]#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`),afterText:RegExp(`^[<\\[]/#([a-zA-Z_]+)[\\r\\n\\t ]*[>\\]]$`),action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`[<\\[]#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`),action:{indentAction:e.IndentAction.Indent}}]}}function u(e,t){let n=`_${e.id}_${t.id}`,r=e=>e.replace(/__id__/g,n),i=e=>{let t=e.source.replace(/__id__/g,n);return new RegExp(t,e.flags)};return{unicode:!0,includeLF:!1,start:r(`default__id__`),ignoreCase:!1,defaultToken:`invalid`,tokenPostfix:`.freemarker2`,brackets:[{open:`{`,close:`}`,token:`delimiter.curly`},{open:`[`,close:`]`,token:`delimiter.square`},{open:`(`,close:`)`,token:`delimiter.parenthesis`},{open:`<`,close:`>`,token:`delimiter.angle`}],[r(`open__id__`)]:new RegExp(e.open),[r(`close__id__`)]:new RegExp(e.close),[r(`iOpen1__id__`)]:new RegExp(t.open1),[r(`iOpen2__id__`)]:new RegExp(t.open2),[r(`iClose__id__`)]:new RegExp(t.close),[r(`startTag__id__`)]:i(/(@open__id__)(#)/),[r(`endTag__id__`)]:i(/(@open__id__)(\/#)/),[r(`startOrEndTag__id__`)]:i(/(@open__id__)(\/?#)/),[r(`closeTag1__id__`)]:i(/((?:@blank)*)(@close__id__)/),[r(`closeTag2__id__`)]:i(/((?:@blank)*\/?)(@close__id__)/),blank:/[ \t\n\r]/,keywords:[`false`,`true`,`in`,`as`,`using`],directiveStartCloseTag1:/attempt|recover|sep|auto[eE]sc|no(?:autoe|AutoE)sc|compress|default|no[eE]scape|comment|no[pP]arse/,directiveStartCloseTag2:/else|break|continue|return|stop|flush|t|lt|rt|nt|nested|recurse|fallback|ftl/,directiveStartBlank:/if|else[iI]f|list|for[eE]ach|switch|case|assign|global|local|include|import|function|macro|transform|visit|stop|return|call|setting|output[fF]ormat|nested|recurse|escape|ftl|items/,directiveEndCloseTag1:/if|list|items|sep|recover|attempt|for[eE]ach|local|global|assign|function|macro|output[fF]ormat|auto[eE]sc|no(?:autoe|AutoE)sc|compress|transform|switch|escape|no[eE]scape/,escapedChar:/\\(?:[ntrfbgla\\'"\{=]|(?:x[0-9A-Fa-f]{1,4}))/,asciiDigit:/[0-9]/,integer:/[0-9]+/,nonEscapedIdStartChar:/[\$@-Z_a-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u1FFF\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183-\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3006\u3031-\u3035\u303B-\u303C\u3040-\u318F\u31A0-\u31BA\u31F0-\u31FF\u3300-\u337F\u3400-\u4DB5\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,escapedIdChar:/\\[\-\.:#]/,idStartChar:/(?:@nonEscapedIdStartChar)|(?:@escapedIdChar)/,id:/(?:@idStartChar)(?:(?:@idStartChar)|(?:@asciiDigit))*/,specialHashKeys:/\*\*|\*|false|true|in|as|using/,namedSymbols:/<=|>=|\\lte|\\lt|<|\\gte|\\gt|>|&&|\\and|->|->|==|!=|\+=|-=|\*=|\/=|%=|\+\+|--|<=|&&|\|\||:|\.\.\.|\.\.\*|\.\.<|\.\.!|\?\?|=|<|\+|-|\*|\/|%|\||\.\.|\?|!|&|\.|,|;/,arrows:[`->`,`->`],delimiters:[`;`,`:`,`,`,`.`],stringOperators:[`lte`,`lt`,`gte`,`gt`],noParseTags:[`noparse`,`noParse`,`comment`],tokenizer:{[r(`default__id__`)]:[{include:r(`@directive_token__id__`)},{include:r(`@interpolation_and_text_token__id__`)}],[r(`fmExpression__id__.directive`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@directive_end_token__id__`)},{include:r(`@expression_token__id__`)}],[r(`fmExpression__id__.interpolation`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@expression_token__id__`)},{include:r(`@greater_operators_token__id__`)}],[r(`inParen__id__.plain`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@directive_end_token__id__`)},{include:r(`@expression_token__id__`)}],[r(`inParen__id__.gt`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@expression_token__id__`)},{include:r(`@greater_operators_token__id__`)}],[r(`noSpaceExpression__id__`)]:[{include:r(`@no_space_expression_end_token__id__`)},{include:r(`@directive_end_token__id__`)},{include:r(`@expression_token__id__`)}],[r(`unifiedCall__id__`)]:[{include:r(`@unified_call_token__id__`)}],[r(`singleString__id__`)]:[{include:r(`@string_single_token__id__`)}],[r(`doubleString__id__`)]:[{include:r(`@string_double_token__id__`)}],[r(`rawSingleString__id__`)]:[{include:r(`@string_single_raw_token__id__`)}],[r(`rawDoubleString__id__`)]:[{include:r(`@string_double_raw_token__id__`)}],[r(`expressionComment__id__`)]:[{include:r(`@expression_comment_token__id__`)}],[r(`noParse__id__`)]:[{include:r(`@no_parse_token__id__`)}],[r(`terseComment__id__`)]:[{include:r(`@terse_comment_token__id__`)}],[r(`directive_token__id__`)]:[[i(/(?:@startTag__id__)(@directiveStartCloseTag1)(?:@closeTag1__id__)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{cases:{"@noParseTags":{token:`tag`,next:r(`@noParse__id__.$3`)},"@default":{token:`tag`}}},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(?:@startTag__id__)(@directiveStartCloseTag2)(?:@closeTag2__id__)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(?:@startTag__id__)(@directiveStartBlank)(@blank)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:``,next:r(`@fmExpression__id__.directive`)}]],[i(/(?:@endTag__id__)(@directiveEndCloseTag1)(?:@closeTag1__id__)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(@open__id__)(@)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`,next:r(`@unifiedCall__id__`)}]],[i(/(@open__id__)(\/@)((?:(?:@id)(?:\.(?:@id))*)?)(?:@closeTag1__id__)/),[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(@open__id__)#--/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:{token:`comment`,next:r(`@terseComment__id__`)}],[i(/(?:@startOrEndTag__id__)([a-zA-Z_]+)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag.invalid`,next:r(`@fmExpression__id__.directive`)}]]],[r(`interpolation_and_text_token__id__`)]:[[i(/(@iOpen1__id__)(@iOpen2__id__)/),[{token:t.id===`bracket`?`@brackets.interpolation`:`delimiter.interpolation`},{token:t.id===`bracket`?`delimiter.interpolation`:`@brackets.interpolation`,next:r(`@fmExpression__id__.interpolation`)}]],[/[\$#<\[\{]|(?:@blank)+|[^\$<#\[\{\n\r\t ]+/,{token:`source`}]],[r(`string_single_token__id__`)]:[[/[^'\\]/,{token:`string`}],[/@escapedChar/,{token:`string.escape`}],[/'/,{token:`string`,next:`@pop`}]],[r(`string_double_token__id__`)]:[[/[^"\\]/,{token:`string`}],[/@escapedChar/,{token:`string.escape`}],[/"/,{token:`string`,next:`@pop`}]],[r(`string_single_raw_token__id__`)]:[[/[^']+/,{token:`string.raw`}],[/'/,{token:`string.raw`,next:`@pop`}]],[r(`string_double_raw_token__id__`)]:[[/[^"]+/,{token:`string.raw`}],[/"/,{token:`string.raw`,next:`@pop`}]],[r(`expression_token__id__`)]:[[/(r?)(['"])/,{cases:{"r'":[{token:`keyword`},{token:`string.raw`,next:r(`@rawSingleString__id__`)}],'r"':[{token:`keyword`},{token:`string.raw`,next:r(`@rawDoubleString__id__`)}],"'":[{token:`source`},{token:`string`,next:r(`@singleString__id__`)}],'"':[{token:`source`},{token:`string`,next:r(`@doubleString__id__`)}]}}],[/(?:@integer)(?:\.(?:@integer))?/,{cases:{"(?:@integer)":{token:`number`},"@default":{token:`number.float`}}}],[/(\.)(@blank*)(@specialHashKeys)/,[{token:`delimiter`},{token:``},{token:`identifier`}]],[/(?:@namedSymbols)/,{cases:{"@arrows":{token:`meta.arrow`},"@delimiters":{token:`delimiter`},"@default":{token:`operators`}}}],[/@id/,{cases:{"@keywords":{token:`keyword.$0`},"@stringOperators":{token:`operators`},"@default":{token:`identifier`}}}],[/[\[\]\(\)\{\}]/,{cases:{"\\[":{cases:{"$S2==gt":{token:`@brackets`,next:r(`@inParen__id__.gt`)},"@default":{token:`@brackets`,next:r(`@inParen__id__.plain`)}}},"\\]":{cases:{...t.id===`bracket`?{"$S2==interpolation":{token:`@brackets.interpolation`,next:`@popall`}}:{},...e.id===`bracket`?{"$S2==directive":{token:`@brackets.directive`,next:`@popall`}}:{},[r(`$S1==inParen__id__`)]:{token:`@brackets`,next:`@pop`},"@default":{token:`@brackets`}}},"\\(":{token:`@brackets`,next:r(`@inParen__id__.gt`)},"\\)":{cases:{[r(`$S1==inParen__id__`)]:{token:`@brackets`,next:`@pop`},"@default":{token:`@brackets`}}},"\\{":{cases:{"$S2==gt":{token:`@brackets`,next:r(`@inParen__id__.gt`)},"@default":{token:`@brackets`,next:r(`@inParen__id__.plain`)}}},"\\}":{cases:{...t.id===`bracket`?{}:{"$S2==interpolation":{token:`@brackets.interpolation`,next:`@popall`}},[r(`$S1==inParen__id__`)]:{token:`@brackets`,next:`@pop`},"@default":{token:`@brackets`}}}}}],[/\$\{/,{token:`delimiter.invalid`}]],[r(`blank_and_expression_comment_token__id__`)]:[[/(?:@blank)+/,{token:``}],[/[<\[][#!]--/,{token:`comment`,next:r(`@expressionComment__id__`)}]],[r(`directive_end_token__id__`)]:[[/>/,e.id===`bracket`?{token:`operators`}:{token:`@brackets.directive`,next:`@popall`}],[i(/(\/)(@close__id__)/),[{token:`delimiter.directive`},{token:`@brackets.directive`,next:`@popall`}]]],[r(`greater_operators_token__id__`)]:[[/>/,{token:`operators`}],[/>=/,{token:`operators`}]],[r(`no_space_expression_end_token__id__`)]:[[/(?:@blank)+/,{token:``,switchTo:r(`@fmExpression__id__.directive`)}]],[r(`unified_call_token__id__`)]:[[/(@id)((?:@blank)+)/,[{token:`tag`},{token:``,next:r(`@fmExpression__id__.directive`)}]],[i(/(@id)(\/?)(@close__id__)/),[{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`,next:`@popall`}]],[/./,{token:`@rematch`,next:r(`@noSpaceExpression__id__`)}]],[r(`no_parse_token__id__`)]:[[i(/(@open__id__)(\/#?)([a-zA-Z]+)((?:@blank)*)(@close__id__)/),{cases:{"$S2==$3":[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:``},{token:`@brackets.directive`,next:`@popall`}],"$S2==comment":[{token:`comment`},{token:`comment`},{token:`comment`},{token:`comment`},{token:`comment`}],"@default":[{token:`source`},{token:`source`},{token:`source`},{token:`source`},{token:`source`}]}}],[/[^<\[\-]+|[<\[\-]/,{cases:{"$S2==comment":{token:`comment`},"@default":{token:`source`}}}]],[r(`expression_comment_token__id__`)]:[[/--[>\]]/,{token:`comment`,next:`@pop`}],[/[^\->\]]+|[>\]\-]/,{token:`comment`}]],[r(`terse_comment_token__id__`)]:[[i(/--(?:@close__id__)/),{token:`comment`,next:`@popall`}],[/[^<\[\-]+|[<\[\-]/,{token:`comment`}]]}}}function d(e){let t=u(r,e),n=u(i,e),o=u(a,e);return{...t,...n,...o,unicode:!0,includeLF:!1,start:`default_auto_${e.id}`,ignoreCase:!1,defaultToken:`invalid`,tokenPostfix:`.freemarker2`,brackets:[{open:`{`,close:`}`,token:`delimiter.curly`},{open:`[`,close:`]`,token:`delimiter.square`},{open:`(`,close:`)`,token:`delimiter.parenthesis`},{open:`<`,close:`>`,token:`delimiter.angle`}],tokenizer:{...t.tokenizer,...n.tokenizer,...o.tokenizer}}}var f={conf:c(r),language:u(r,o)},p={conf:c(i),language:u(i,o)},m={conf:c(r),language:u(r,s)},h={conf:c(i),language:u(i,s)},g={conf:l(),language:d(o)},_={conf:l(),language:d(s)};export{m as TagAngleInterpolationBracket,f as TagAngleInterpolationDollar,_ as TagAutoInterpolationBracket,g as TagAutoInterpolationDollar,h as TagBracketInterpolationBracket,p as TagBracketInterpolationDollar};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./editor.api-
|
|
1
|
+
import{n as e}from"./editor.api-D2PTZoSF.js";var t=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`menuitem`,`meta`,`param`,`source`,`track`,`wbr`],n={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:[`{{!--`,`--}}`]},brackets:[[`<!--`,`-->`],[`<`,`>`],[`{{`,`}}`],[`{`,`}`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`<`,close:`>`},{open:`"`,close:`"`},{open:`'`,close:`'`}],onEnterRules:[{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}]},r={defaultToken:``,tokenPostfix:``,tokenizer:{root:[[/\{\{!--/,`comment.block.start.handlebars`,`@commentBlock`],[/\{\{!/,`comment.start.handlebars`,`@comment`],[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.root`}],[/<!DOCTYPE/,`metatag.html`,`@doctype`],[/<!--/,`comment.html`,`@commentHtml`],[/(<)(\w+)(\/>)/,[`delimiter.html`,`tag.html`,`delimiter.html`]],[/(<)(script)/,[`delimiter.html`,{token:`tag.html`,next:`@script`}]],[/(<)(style)/,[`delimiter.html`,{token:`tag.html`,next:`@style`}]],[/(<)([:\w]+)/,[`delimiter.html`,{token:`tag.html`,next:`@otherTag`}]],[/(<\/)(\w+)/,[`delimiter.html`,{token:`tag.html`,next:`@otherTag`}]],[/</,`delimiter.html`],[/\{/,`delimiter.html`],[/[^<{]+/]],doctype:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.comment`}],[/[^>]+/,`metatag.content.html`],[/>/,`metatag.html`,`@pop`]],comment:[[/\}\}/,`comment.end.handlebars`,`@pop`],[/./,`comment.content.handlebars`]],commentBlock:[[/--\}\}/,`comment.block.end.handlebars`,`@pop`],[/./,`comment.content.handlebars`]],commentHtml:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.comment`}],[/-->/,`comment.html`,`@pop`],[/[^-]+/,`comment.content.html`],[/./,`comment.content.html`]],otherTag:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.otherTag`}],[/\/?>/,`delimiter.html`,`@pop`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/]],script:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.script`}],[/type/,`attribute.name`,`@scriptAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,[`delimiter.html`,`tag.html`,{token:`delimiter.html`,next:`@pop`}]]],scriptAfterType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptAfterType`}],[/=/,`delimiter`,`@scriptAfterTypeEquals`],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptAfterTypeEquals:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptAfterTypeEquals`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptWithCustomType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptWithCustomType.$S2`}],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptEmbedded:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInEmbeddedState.scriptEmbedded.$S2`,nextEmbedded:`@pop`}],[/<\/script/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}]],style:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.style`}],[/type/,`attribute.name`,`@styleAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,[`delimiter.html`,`tag.html`,{token:`delimiter.html`,next:`@pop`}]]],styleAfterType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleAfterType`}],[/=/,`delimiter`,`@styleAfterTypeEquals`],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleAfterTypeEquals:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleAfterTypeEquals`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleWithCustomType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleWithCustomType.$S2`}],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleEmbedded:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInEmbeddedState.styleEmbedded.$S2`,nextEmbedded:`@pop`}],[/<\/style/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}]],handlebarsInSimpleState:[[/\{\{\{?/,`delimiter.handlebars`],[/\}\}\}?/,{token:`delimiter.handlebars`,switchTo:`@$S2.$S3`}],{include:`handlebarsRoot`}],handlebarsInEmbeddedState:[[/\{\{\{?/,`delimiter.handlebars`],[/\}\}\}?/,{token:`delimiter.handlebars`,switchTo:`@$S2.$S3`,nextEmbedded:`$S3`}],{include:`handlebarsRoot`}],handlebarsRoot:[[/"[^"]*"/,`string.handlebars`],[/[#/][^\s}]+/,`keyword.helper.handlebars`],[/else\b/,`keyword.helper.handlebars`],[/[\s]+/],[/[^}]/,`variable.parameter.handlebars`]]}};export{n as conf,r as language};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./editor.api-
|
|
1
|
+
import{n as e}from"./editor.api-D2PTZoSF.js";var t=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`menuitem`,`meta`,`param`,`source`,`track`,`wbr`],n={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:[`<!--`,`-->`]},brackets:[[`<!--`,`-->`],[`<`,`>`],[`{`,`}`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],onEnterRules:[{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}],folding:{markers:{start:RegExp(`^\\s*<!--\\s*#region\\b.*-->`),end:RegExp(`^\\s*<!--\\s*#endregion\\b.*-->`)}}},r={defaultToken:``,tokenPostfix:`.html`,ignoreCase:!0,tokenizer:{root:[[/<!DOCTYPE/,`metatag`,`@doctype`],[/<!--/,`comment`,`@comment`],[/(<)((?:[\w\-]+:)?[\w\-]+)(\s*)(\/>)/,[`delimiter`,`tag`,``,`delimiter`]],[/(<)(script)/,[`delimiter`,{token:`tag`,next:`@script`}]],[/(<)(style)/,[`delimiter`,{token:`tag`,next:`@style`}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,[`delimiter`,{token:`tag`,next:`@otherTag`}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,[`delimiter`,{token:`tag`,next:`@otherTag`}]],[/</,`delimiter`],[/[^<]+/]],doctype:[[/[^>]+/,`metatag.content`],[/>/,`metatag`,`@pop`]],comment:[[/-->/,`comment`,`@pop`],[/[^-]+/,`comment.content`],[/./,`comment.content`]],otherTag:[[/\/?>/,`delimiter`,`@pop`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/]],script:[[/type/,`attribute.name`,`@scriptAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,[`delimiter`,`tag`,{token:`delimiter`,next:`@pop`}]]],scriptAfterType:[[/=/,`delimiter`,`@scriptAfterTypeEquals`],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptAfterTypeEquals:[[/"module"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.text/javascript`}],[/'module'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.text/javascript`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptWithCustomType:[[/>/,{token:`delimiter`,next:`@scriptEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptEmbedded:[[/<\/script/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}],[/[^<]+/,``]],style:[[/type/,`attribute.name`,`@styleAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,[`delimiter`,`tag`,{token:`delimiter`,next:`@pop`}]]],styleAfterType:[[/=/,`delimiter`,`@styleAfterTypeEquals`],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleWithCustomType:[[/>/,{token:`delimiter`,next:`@styleEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleEmbedded:[[/<\/style/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}],[/[^<]+/,``]]}};export{n as conf,r as language};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Jt as e,Xt as t,Yt as n,p as r,qt as i}from"./index-BZKHE14f.js";var a=r(async({app:r})=>{if(r.use(e),n!==`en`)try{await t(n)}catch(e){console.error(`[i18n] could not load the saved locale, staying in English:`,e)}i(n)});export{a as default};
|