@loicngr/kobo 2.1.9 → 2.1.10

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.
Files changed (93) hide show
  1. package/AGENTS.md +3 -1
  2. package/CHANGELOG.md +4 -2
  3. package/CONFIGURATION.md +8 -4
  4. package/dist/server/routes/memory.js +18 -33
  5. package/dist/server/routes/workspaces.js +2 -0
  6. package/dist/server/services/agent/engines/claude-code/engine.js +7 -3
  7. package/dist/server/services/agent/engines/claude-code/event-mapper.js +10 -1
  8. package/dist/server/services/memory-budget-service.js +22 -0
  9. package/dist/server/services/memory-context-service.js +39 -20
  10. package/dist/server/services/memory-mcp-service.js +17 -46
  11. package/dist/server/services/settings-defaults.js +2 -2
  12. package/dist/server/services/settings-service.js +2 -2
  13. package/dist/server/utils/memory-token-budget.js +5 -0
  14. package/dist/shared/memory-prompts.js +6 -7
  15. package/dist/shared/memory-tools.js +1 -1
  16. package/dist/shared/subagent-classification.js +5 -0
  17. package/package.json +1 -1
  18. package/src/client/dist/pwa/assets/{ActivityFeed-w8TNfMKd.js → ActivityFeed-CkiYsNd5.js} +2 -2
  19. package/src/client/dist/pwa/assets/{ChangelogPage-B1rkKskD.js → ChangelogPage-DkoB2IEa.js} +1 -1
  20. package/src/client/dist/pwa/assets/ComparisonPanel-DH9Q0XNK.js +2 -0
  21. package/src/client/dist/pwa/assets/{CreatePage-DOamHqeH.js → CreatePage-Com5PQPV.js} +2 -2
  22. package/src/client/dist/pwa/assets/{DashboardPage-Ds6Y8xlV.js → DashboardPage-DOeZUleS.js} +1 -1
  23. package/src/client/dist/pwa/assets/{DiffViewer-j7rwPKxU.js → DiffViewer-Bke40k8T.js} +4 -4
  24. package/src/client/dist/pwa/assets/{DocumentsPanel-BTp3J6Rq.js → DocumentsPanel-CO16-Q1X.js} +1 -1
  25. package/src/client/dist/pwa/assets/{DrawerToggleButton-DcVhAbjN.js → DrawerToggleButton-fjWJjVF_.js} +1 -1
  26. package/src/client/dist/pwa/assets/GitPanel-BAgnXzXP.js +3 -0
  27. package/src/client/dist/pwa/assets/{HealthPage-BSrTmp1k.js → HealthPage-DR-ywiB2.js} +1 -1
  28. package/src/client/dist/pwa/assets/MainLayout-B1suu_Nn.js +2 -0
  29. package/src/client/dist/pwa/assets/{MemoryPanel-BivQoMQ6.js → MemoryPanel-DKp9mn5X.js} +1 -1
  30. package/src/client/dist/pwa/assets/{MemoryProposalList-BnoVbFsj.js → MemoryProposalList-B3v7marz.js} +1 -1
  31. package/src/client/dist/pwa/assets/{QBtnDropdown-B9xNOKD0.js → QBtnDropdown-a6q0PVGm.js} +1 -1
  32. package/src/client/dist/pwa/assets/{QExpansionItem-BBTTV_37.js → QExpansionItem-2fylQBjy.js} +1 -1
  33. package/src/client/dist/pwa/assets/{QScrollArea-bm6nYMnB.js → QScrollArea-I9pplcfM.js} +1 -1
  34. package/src/client/dist/pwa/assets/QSelect-CWXNtFAO.js +1 -0
  35. package/src/client/dist/pwa/assets/{QTooltip-CgVCYatx.js → QTooltip-fzzd3anS.js} +1 -1
  36. package/src/client/dist/pwa/assets/{SchedulePanel-DNwt3V1a.js → SchedulePanel-4KNBIQvY.js} +1 -1
  37. package/src/client/dist/pwa/assets/{SearchPage-Dr43rGji.js → SearchPage-CGul0ui9.js} +1 -1
  38. package/src/client/dist/pwa/assets/SettingsPage-_h4xQlof.js +9 -0
  39. package/src/client/dist/pwa/assets/{SplitWorkspacePage-Cjd_Lq-0.js → SplitWorkspacePage-DxifLUAa.js} +1 -1
  40. package/src/client/dist/pwa/assets/{TerminalPanel-Bsrg96VZ.js → TerminalPanel-CRo3ETg_.js} +9 -9
  41. package/src/client/dist/pwa/assets/ToolCallItem-i60zEGsY.js +8 -0
  42. package/src/client/dist/pwa/assets/{ToolCallItem-DhjdG8vp.css → ToolCallItem-m-YnWEbv.css} +1 -1
  43. package/src/client/dist/pwa/assets/{TouchPan-CxThkotY.js → TouchPan-DjFq7Kjf.js} +1 -1
  44. package/src/client/dist/pwa/assets/{TourReplayButton-COI4vR7q.js → TourReplayButton-DmEgJ_5R.js} +1 -1
  45. package/src/client/dist/pwa/assets/{WorkspaceAttentionLabels-CqlhQOqG.js → WorkspaceAttentionLabels-C7MLWyKy.js} +1 -1
  46. package/src/client/dist/pwa/assets/WorkspacePage-Bw7yTZ3h.js +4 -0
  47. package/src/client/dist/pwa/assets/{browser-DuFAaYHh.js → browser-3unJ6AQX.js} +1 -1
  48. package/src/client/dist/pwa/assets/{build-path-tree-DFwB0SSs.js → build-path-tree-CPo0G1mj.js} +1 -1
  49. package/src/client/dist/pwa/assets/custom-sounds-C5fGFFdT.js +1 -0
  50. package/src/client/dist/pwa/assets/{de-YFD4X2nQ.js → de-B3oUHpbN.js} +1 -1
  51. package/src/client/dist/pwa/assets/{editor.api-DDwuA_C9.js → editor.api-CMBx0cvf.js} +1 -1
  52. package/src/client/dist/pwa/assets/{efforts-DU9dTnaN.js → efforts-Bjrcpo2R.js} +1 -1
  53. package/src/client/dist/pwa/assets/{es-BvRPXBHq.js → es-X1ki-Z2w.js} +1 -1
  54. package/src/client/dist/pwa/assets/{expand-template-LaRhdYUp.js → expand-template-cR43uBa5.js} +1 -1
  55. package/src/client/dist/pwa/assets/{format-BUmAn8W2.js → format-B1k_qdxW.js} +1 -1
  56. package/src/client/dist/pwa/assets/{formatters-DfLD95iT.js → formatters-gz0Rg7Rw.js} +1 -1
  57. package/src/client/dist/pwa/assets/{fr-CZhjMFZl.js → fr-nkT5LuOx.js} +1 -1
  58. package/src/client/dist/pwa/assets/{freemarker2-DVQM2t3e.js → freemarker2-C8DHgbX4.js} +1 -1
  59. package/src/client/dist/pwa/assets/{handlebars-ChiPNy9j.js → handlebars-BmEGWkcn.js} +1 -1
  60. package/src/client/dist/pwa/assets/{html-CnGW31DH.js → html-giJc-yQc.js} +1 -1
  61. package/src/client/dist/pwa/assets/i18n-PAAy4Hkn.js +1 -0
  62. package/src/client/dist/pwa/assets/{index-DPN7dSDH.js → index-BjqJ45nb.js} +3 -3
  63. package/src/client/dist/pwa/assets/{it-B4rz5PZO.js → it-Bfp_J8p0.js} +1 -1
  64. package/src/client/dist/pwa/assets/{javascript-BmeNra1c.js → javascript-CwQBOtjT.js} +1 -1
  65. package/src/client/dist/pwa/assets/{liquid-C5qQFvIu.js → liquid-BPEVDB8V.js} +1 -1
  66. package/src/client/dist/pwa/assets/{mdx-TsWwhlKp.js → mdx-DAa4McnC.js} +1 -1
  67. package/src/client/dist/pwa/assets/{monaco-contributions-SMzL7GRn.js → monaco-contributions-Ct4RhitT.js} +1 -1
  68. package/src/client/dist/pwa/assets/{monaco.contribution-sN2BZtSW.js → monaco.contribution-BKnd0ZwH.js} +2 -2
  69. package/src/client/dist/pwa/assets/network-auth-S-KP7qhA.js +1 -0
  70. package/src/client/dist/pwa/assets/{notify-theme-BXJypfo4.js → notify-theme-DIqeoflM.js} +1 -1
  71. package/src/client/dist/pwa/assets/{project-color-CBLQt6bM.js → project-color-LZ5CKuTW.js} +1 -1
  72. package/src/client/dist/pwa/assets/{python-CKHf2s-D.js → python-D8xYERv8.js} +1 -1
  73. package/src/client/dist/pwa/assets/{razor-D_5X4O5M.js → razor-BnFyr836.js} +1 -1
  74. package/src/client/dist/pwa/assets/{typescript-D62emDGo.js → typescript-DW45V56c.js} +1 -1
  75. package/src/client/dist/pwa/assets/{use-search-index-status-bIKbEP5q.js → use-search-index-status-DzlqDFPy.js} +1 -1
  76. package/src/client/dist/pwa/assets/{use-tours-CTNYIX-Q.js → use-tours-CErX5nL7.js} +2 -2
  77. package/src/client/dist/pwa/assets/{use-worktree-restore-D69uzYON.js → use-worktree-restore-BpaEGfds.js} +1 -1
  78. package/src/client/dist/pwa/assets/{workspace-templates-CSwgMrUf.js → workspace-templates-CKduJ2zA.js} +1 -1
  79. package/src/client/dist/pwa/assets/{xml-Kyg_K_5X.js → xml-gQTv5O31.js} +1 -1
  80. package/src/client/dist/pwa/assets/{yaml-DC__PKjj.js → yaml-B4TEYUEa.js} +1 -1
  81. package/src/client/dist/pwa/index.html +1 -1
  82. package/src/client/dist/pwa/sw.js +1 -1
  83. package/src/mcp-server/README.md +3 -1
  84. package/src/client/dist/pwa/assets/ComparisonPanel-kMWS9il3.js +0 -2
  85. package/src/client/dist/pwa/assets/GitPanel-DOugIJUS.js +0 -3
  86. package/src/client/dist/pwa/assets/MainLayout-DWzXL1KW.js +0 -2
  87. package/src/client/dist/pwa/assets/QSelect-CPE9LsIn.js +0 -1
  88. package/src/client/dist/pwa/assets/SettingsPage-oSGNwimG.js +0 -9
  89. package/src/client/dist/pwa/assets/ToolCallItem-M3CSguac.js +0 -8
  90. package/src/client/dist/pwa/assets/WorkspacePage-C-JXKt-S.js +0 -4
  91. package/src/client/dist/pwa/assets/custom-sounds-DTV-xHVv.js +0 -1
  92. package/src/client/dist/pwa/assets/i18n-v1pgIO4z.js +0 -1
  93. package/src/client/dist/pwa/assets/network-auth-DXsDKXrM.js +0 -1
@@ -1,4 +1,4 @@
1
- var e={"memory.panel.contextsHint":`Ce qui a été transmis au LLM pour cette conversation.`,"memory.panel.entriesHint":`Les notes persistantes que vous pouvez modifier ou réutiliser.`,"memory.panel.proposalsHint":`Les ajouts suggérés par les agents, à approuver ou refuser.`,"memory.panel.operationsHint":`Le journal des lectures et modifications de la mémoire.`,"memory.panel.openDialog":`Ouvrir la mémoire dans un dialogue`,"memory.panel.closeDialog":`Fermer le dialogue mémoire`,"tours.workspace.memorySettings.title":`Gérer les trois niveaux`,"tours.workspace.memorySettings.description":`Ce lien ouvre les paramètres Mémoire : globale pour tous vos projets, projet pour ses workspaces, workspace pour cette mission. Chaque niveau peut être effacé indépendamment, après confirmation ; cela ne retire pas les informations déjà envoyées au LLM.`,"tours.settings.memoryModes.title":`Choisir le mode de mémoire`,"tours.settings.memoryModes.description":`Hybride par défaut : l’agent mémorise dans le workspace et propose les ajouts projet/globaux à valider. Manuel : vous seul écrivez. Automatique : l’agent écrit aux trois niveaux. Cliquez sur Enregistrer pour appliquer le mode.`,"tours.settings.skills.title":`Choisir une suite de skills`,"tours.settings.skills.description":`Commencez avec Standard : aucune extension requise. Superpowers, gstack, ECC et leurs combinaisons ciblent des skills déjà installés et accessibles au moteur choisi. Sélectionner une suite change les consignes de l’agent ; cela n’installe aucun skill et n’accorde aucune permission. Personnalisé permet d’écrire vos propres consignes. Enregistrez votre choix pour l’appliquer.`,"tours.settings.git.description":`Choisissez quand les agents peuvent créer des commits, pousser ou publier. Définissez les conventions Git et les préfixes de branches.`,"tours.settings.git.title":`Fonctionnement Git`,"settings.reviewPromptHint":`Instructions transmises à l’agent au lancement d’une revue de code.`,"settings.help.git":`Préférences de commit, push et publication, conventions Git et préfixes de branches.`,"settings.nav.promptTemplates":`Templates de prompts`,"memory.scope.label":`Portée de la mémoire`,"settings.nav.memory":`Mémoire`,"settings.help.memory":`Choisissez comment Kōbō utilise la mémoire et gérez les mémoires globale, de projet et de workspace.`,"memory.settings.title":`Mémoire`,"memory.panel.title":`Mémoire`,"memory.panel.contexts":`Contextes transmis à cette conversation`,"memory.panel.noContext":`Aucun contexte mémoire transmis à cette conversation.`,"memory.panel.contextStats":`{tokens} jetons estimés · {cumulative} cumulés · {remaining} restants · {omitted} omis`,"memory.panel.entries":`Mémoires disponibles`,"memory.panel.proposals":`Propositions en attente`,"memory.panel.operations":`Opérations du workspace`,"memory.panel.add":`Ajouter une mémoire`,"memory.panel.clearWorkspace":`Effacer la mémoire du workspace`,"memory.panel.settingsLink":`Gérer les mémoires globale et de projet dans les paramètres`,"memory.panel.clearConfirm":`Effacer {entries} mémoires et {proposals} propositions de ce workspace ?`,"memory.panel.confirmClear":`Effacer la mémoire du workspace`,"memory.panel.promoteTo":`Promouvoir vers`,"memory.panel.loading":`Chargement de la mémoire du workspace…`,"memory.panel.loadFailed":`Impossible de charger la mémoire du workspace.`,"memory.panel.archived":`Archivé`,"memory.panel.purged":`Worktree purgé`,"memory.panel.changed":`Modifiée depuis ce contexte`,"memory.panel.deleted":`Supprimée depuis ce contexte`,"memory.panel.truncated":`(texte tronqué)`,"memory.engine.codex":`Codex`,"memory.engine.claude-code":`Claude Code`,"memory.context.state.failed":`Échec`,"memory.context.state.prepared":`Préparé`,"memory.context.state.submitted":`Envoyé`,"memory.context.state.initialized":`Initialisé`,"memory.context.state.unknown":`Transmission inconnue`,"memory.settings.intro":`La mémoire conserve des notes explicites pour les prochaines sessions d’agent. Elle ne remplace pas l’historique du fournisseur ni celui des conversations.`,"memory.settings.mode":`Comportement automatique de la mémoire`,"memory.settings.mode.manual":`Manuel`,"memory.settings.modeHint.manual":`Les agents peuvent lire la mémoire. Vous seul pouvez créer ou modifier les notes.`,"memory.settings.mode.automatic":`Automatique`,"memory.settings.modeHint.automatic":`Les agents peuvent retrouver et mettre à jour automatiquement les mémoires pertinentes.`,"memory.settings.mode.hybrid":`Hybride`,"memory.settings.modeHint.hybrid":`Les agents peuvent modifier directement la mémoire du workspace. Les changements projet et globaux nécessitent votre approbation.`,"memory.settings.saveNote":`Le mode fait partie des paramètres et s’applique après enregistrement. Quitter sans enregistrer conserve le mode précédent.`,"memory.settings.manageTitle":`Parcourir et gérer la mémoire`,"memory.settings.independentNote":`Créer, modifier, approuver et effacer une mémoire prend effet immédiatement, indépendamment de l’enregistrement des paramètres.`,"memory.settings.add":`Ajouter une mémoire`,"memory.settings.clear":`Vider cette portée…`,"memory.settings.clearConfirmTitle":`Vider cette portée mémoire ?`,"memory.settings.clearConfirm":`Cette action supprimera {entries} mémoires et {proposals} propositions en attente de la portée {scope} sélectionnée.`,"memory.settings.clearWarning":`Cela efface uniquement les données mémoire de Kōbō, pas les conversations précédentes chez le fournisseur ni l’historique du chat.`,"memory.settings.confirmClear":`Vider la portée`,"memory.settings.cancel":`Annuler`,"memory.settings.loadFailed":`Impossible de charger les portées mémoire.`,"memory.settings.saveFailed":`Impossible d’enregistrer cette modification mémoire.`,"memory.settings.clearFailed":`Impossible d’apercevoir ou de vider cette portée mémoire.`,"memory.settings.clearConflict":`La mémoire a changé depuis l’aperçu. Les nombres ont été actualisés ; vérifiez-les avant de confirmer à nouveau.`,"memory.settings.loadMoreScopes":`Charger plus de portées`,"memory.entry.loadMore":`Charger plus de mémoires`,"memory.settings.loadingScopes":`Chargement des portées…`,"memory.settings.deleteConfirmTitle":`Confirmer la suppression mémoire`,"memory.settings.deleteConfirm":`Supprimer « {title} » de {scope} ?`,"memory.settings.deleteConfirmAction":`Supprimer la mémoire`,"memory.scope.choose":`Choisir une portée`,"memory.scope.global":`Globale`,"memory.scope.project":`Projet`,"memory.scope.workspace":`Workspace`,"memory.entry.empty":`Aucune mémoire dans cette portée.`,"memory.entry.revision":`Révision {revision}`,"memory.entry.edit":`Modifier`,"memory.entry.editAria":`Modifier {title}`,"memory.entry.delete":`Supprimer`,"memory.entry.deleteAria":`Supprimer {title}`,"memory.entry.promote":`Promouvoir`,"memory.entry.promoteAria":`Promouvoir {title}`,"memory.editor.key":`Clé stable`,"memory.editor.title":`Titre`,"memory.editor.body":`Mémoire`,"memory.editor.save":`Enregistrer la mémoire`,"memory.editor.saving":`Enregistrement…`,"memory.editor.cancel":`Annuler`,"memory.editor.conflict":`Cette mémoire a changé ailleurs. Rechargez-la ou gardez votre brouillon et rebasez-le explicitement sur la révision actuelle.`,"memory.editor.reload":`Recharger la version actuelle`,"memory.editor.rebase":`Garder le brouillon et le rebaser`,"memory.proposal.empty":`Aucune proposition en attente.`,"memory.proposal.approve":`Approuver`,"memory.proposal.approveAria":`Approuver {title}`,"memory.proposal.reject":`Refuser`,"memory.proposal.rejectAria":`Refuser {title}`,"memory.operation.empty":`Aucune opération mémoire pour le moment.`,"memory.operation.created":`Mémoire créée`,"memory.operation.updated":`Mémoire modifiée`,"memory.operation.deleted":`Mémoire supprimée`,"memory.operation.proposed":`Modification proposée`,"memory.operation.approved":`Proposition approuvée`,"memory.operation.rejected":`Proposition refusée`,"memory.operation.promoted":`Mémoire promue`,"memory.operation.cleared":`Portée vidée`,"memory.operation.read":`Mémoire renvoyée par une lecture`,"memory.operation.humanActor":`Vous`,"memory.operation.internalActor":`Agent · {engine}`,"memory.operation.externalActor":`{name} via {transport}`,"memory.operation.loadMore":`Charger les opérations précédentes`,"memory.operation.loading":`Chargement…`,"settings.nav.git":`Git`,"integration.direct":`Connexion directe`,"integration.directHint":`Optionnel : configurez une commande MCP de confiance sur ce serveur, sans configuration Claude. Placez les identifiants dans les variables d’environnement. L’enregistrement remplace toute la connexion ; activez ensuite l’intégration.`,"integration.agentScope":`Les connexions activées sont transmises à Claude Code et Codex au prochain lancement ou à la prochaine reprise. Arrêtez un agent en cours pour appliquer les changements. Les configurations MCP personnelles restent indépendantes.`,"integration.directOverrides":`La connexion directe enregistrée est prioritaire. Supprimez-la pour utiliser une entrée MCP Claude.`,"integration.stored":`Une connexion privée est enregistrée. Ses valeurs ne sont jamais renvoyées au navigateur.`,"integration.example":`Exemple : {example}`,"integration.tokenExample":`VOTRE_TOKEN_NOTION`,"integration.packageExample":`votre-paquet-mcp`,"integration.variableExample":`VOTRE_VARIABLE`,"integration.valueExample":`votre-valeur`,"integration.command":`Exécutable`,"integration.args":`Arguments (tableau JSON)`,"integration.environment":`Environnement et identifiants (objet JSON)`,"integration.failed":`Impossible de charger ou enregistrer la connexion. Vérifiez le JSON et le stockage local.`,"integration.saved":`Connexion enregistrée. Activez l’intégration puis utilisez Tester la connexion.`,"integration.save":`Remplacer la connexion`,"integration.clear":`Supprimer la connexion directe`,"settings.notificationSoundReady":`Signal de fin`,"settings.customSounds":`Sons importés`,"settings.customSoundsHint":`Importe tes propres sons de notification ({count} maximum, {size} Mo chacun, .wav .mp3 .ogg .webm). Ils sont stockés dans le dossier de données de Kōbō et apparaissent dans tous les sélecteurs ci-dessous.`,"settings.customSoundsImport":`Importer un son`,"settings.customSoundsFull":`Limite atteinte ({count} sons). Supprimes-en un avant d’en importer un autre.`,"settings.customSoundsError.type":`Format non supporté. Utilise un fichier .wav, .mp3, .ogg ou .webm.`,"settings.customSoundsError.size":`Fichier trop volumineux. La limite est de {size} Mo.`,"settings.customSoundsError.count":`Limite atteinte ({count} sons). Supprimes-en un avant d’en importer un autre.`,"settings.customSoundsError.failed":`Action impossible. Vérifie la connexion et réessaie.`,"setup.check.worktrees":`Dossier des worktrees`,"setup.fix.worktrees":`Vérifiez la destination des worktrees dans les réglages et ses droits d’écriture.`,"setup.title":`Configurer la première mission`,"setup.intro":`Choisissez un moteur et un projet Git local. Aucun skill ni intégration requis.`,"setup.project":`Dossier local du projet`,"setup.credentials":`Connectez-vous sur ce serveur avec claude /login ou codex login, ou configurez votre clé API. Ces vérifications ne lancent aucun prompt payant.`,"setup.permissions":`Commencez par un plan. Choisissez explicitement les permissions dans le formulaire de création ; un worktree ne cloisonne pas votre machine.`,"setup.check":`Vérifier l’environnement`,"setup.failed":`Cette action a échoué. Vérifiez la connexion puis réessayez.`,"setup.start":`Décrire ma première mission`,"setup.settings":`Ouvrir les réglages`,"setup.skip":`Passer pour le moment`,"setup.status.ok":`Disponible`,"setup.status.missing":`Manquant`,"setup.status.error":`À vérifier`,"setup.status.unknown":`Non vérifié`,"setup.check.node":`Node.js`,"setup.check.platform":`Plateforme`,"setup.check.git":`Git`,"setup.check.shell":`Bash`,"setup.check.storage":`Dossier de données`,"setup.check.runtime":`Paquet du moteur`,"setup.check.authentication":`Authentification`,"setup.check.model":`Accès au modèle`,"setup.check.repository":`Dépôt Git`,"setup.check.firstCommit":`Premier commit`,"setup.check.projectWritable":`Écriture dans le projet`,"setup.fix.node":`Installez Node.js 24.15 ou supérieur.`,"setup.fix.platform":`Utilisez Linux, macOS ou WSL2 ; Windows natif n’est pas pris en charge.`,"setup.fix.git":`Installez Git sur ce serveur.`,"setup.fix.shell":`Installez Bash sur ce serveur.`,"setup.fix.storage":`Vérifiez KOBO_HOME et les droits du dossier.`,"setup.fix.runtime":`Réinstallez Kōbō avec ses dépendances optionnelles de moteur.`,"setup.fix.authentication":`Connectez-vous au fournisseur choisi. La première mission vérifiera l’accès.`,"setup.fix.model":`Choisissez Auto ou un modèle accessible à votre compte.`,"setup.fix.repository":`Choisissez un dossier de travail Git existant.`,"setup.fix.firstCommit":`Créez le premier commit du projet avant de créer un worktree.`,"setup.fix.projectWritable":`Choisissez un dossier de projet accessible en écriture.`,"handoff.freshTitle":`Continuer dans une session fraîche`,"handoff.switchTitle":`Changer de LLM`,"handoff.warning":`Le travail courant est interrompu immédiatement. Une session fraîche reprend automatiquement dans le même workspace, avec les tâches et l’historique conservés.`,"handoff.generate":`Générer une passation avec l’agent actuel`,"handoff.generateHint":`Désactive cette option si son quota est épuisé. Kōbō transmettra l’objectif, les tâches, l’état Git et l’historique sans appeler le LLM actuel.`,"handoff.start":`Démarrer la session fraîche`,"handoff.stopping":`Arrêt de l’agent actuel`,"handoff.generating":`Préparation de la passation`,"handoff.starting":`Démarrage de la session fraîche`,"handoff.completed":`Session fraîche démarrée`,"handoff.failed":`Échec de la passation`,"handoff.interrupted":`Passation interrompue`,"handoff.cancelled":`Passation annulée`,"handoff.skip":`Continuer sans synthèse LLM`,"handoff.cancel":`Annuler la passation`,"handoff.report":`Lire la passation`,"handoff.source":`Session précédente`,"handoff.progress":`Passation de session en cours`,"handoff.blocked":`Résous ou annule la passation pour continuer.`,"handoff.error":`Impossible de préparer la passation de session.`,"handoff.loadFailed":`Impossible de charger l’état de la passation.`,"handoff.status":`Passation de session`,"chat.externalLlm":`LLM externe · {name}`,"search.indexing":`Indexation de l’historique : {processed}/{total}. Résultats partiels.`,"search.indexUnavailable":`Index de recherche indisponible. Réessayez plus tard.`,"blockers.setupConfiguration":`Aucun script de préparation n’est configuré. Ajoutez-en un dans la section Scripts des paramètres.`,"blockers.noWorkspace":`Sélectionnez un workspace pour utiliser cette action.`,"blockers.purged":`Restaurez le worktree depuis le bandeau du workspace avant cette action.`,"blockers.archived":`Désarchivez le workspace depuis son menu pour utiliser cette action.`,"blockers.operation":`Attendez la fin de l’opération en cours.`,"blockers.agentBusy":`Attendez la fin du tour ou arrêtez l’agent depuis la conversation.`,"blockers.configuration":`Configurez cette fonctionnalité dans les paramètres du projet.`,"blockers.settings":`Ouvrir les paramètres`,"workspaceSort.label":`Trier les workspaces`,"workspaceSort.activity":`Dernière activité`,"workspaceSort.created":`Date de création`,"workspaceSort.name":`Nom`,"workspaceSort.attention":`Priorité d’attention`,"workspaceSort.asc":`Croissant`,"workspaceSort.desc":`Décroissant`,"workspaceSort.hint":`Tri dans chaque groupe, archives comprises. Consulter un workspace ne change pas sa dernière activité.`,"model.tooltip":`Modèle utilisé par l’agent pour ce workspace`,"reasoning.tooltip":`Niveau de raisonnement utilisé par l’agent pour ce workspace`,"thinking.label":`Réflexion`,"thinking.noDetails":`L’agent réfléchit…`,"common.save":`Enregistrer`,"common.duplicate":`Dupliquer`,"common.confirm":`Confirmer`,"common.cancel":`Annuler`,"common.open":`Ouvrir`,"common.retry":`Réessayer`,"common.delete":`Supprimer`,"common.close":`Fermer`,"workspace.deleteTitle":`Supprimer le workspace`,"workspace.deleteTypeBranch":`Retapez le nom de la branche pour confirmer`,"workspace.deleteConsequences":`Cela supprime le worktree et tout l’historique.`,"workspace.deleteFailed":`Suppression du workspace impossible.`,"workspace.archiveFailed":`Archivage du workspace impossible.`,"tasks.updateFailed":`Mise à jour de la tâche impossible.`,"dashboard.tooltip":`Tableau de bord`,"dashboard.title":`Tableau de bord`,"dashboard.count":`{n} workspace | {n} workspaces`,"dashboard.empty":`Aucun workspace actif.`,"dashboard.workspace":`Workspace`,"dashboard.status":`Statut`,"dashboard.attention":`Attention`,"dashboard.pr":`PR`,"dashboard.diff":`Diff`,"dashboard.activity":`Activité`,"dashboard.prOpen":`ouverte`,"reliability.title":`Fiabilité des modèles`,"reliability.subtitle":`Comment chaque moteur et modèle s'est réellement terminé sur ce poste.`,"reliability.empty":`Aucune session terminée pour l'instant.`,"reliability.loadFailed":`Impossible de charger les chiffres de fiabilité.`,"reliability.engine":`Moteur`,"reliability.model":`Modèle`,"reliability.sessions":`Sessions`,"reliability.completed":`Terminées`,"reliability.watchdog":`Watchdog`,"reliability.killed":`Arrêtées`,"reliability.errors":`Erreurs`,"reliability.unknown":`Inconnu`,"reliability.median":`Médiane`,"reliability.durationSeconds":`{s}s`,"reliability.durationMinutes":`{m}min {s}s`,"reliability.durationHours":`{h}h {m}min`,"reliability.reset":`Réinitialiser : ne compter que les sessions terminées à partir de maintenant`,"reliability.since":`Depuis le {date}`,"reliability.showAll":`Tout afficher`,"update.available":`Une version plus récente de Kōbō est disponible : {version}`,"update.how":`Comment mettre à jour`,"common.dismiss":`Ignorer`,"common.details":`Détails`,"common.ok":`OK`,"whatsNew.title":`Quoi de neuf`,"common.loading":`Chargement...`,"common.search":`Rechercher...`,"common.refresh":`Actualiser`,"common.copy":`Copier`,"common.copied":`Copié dans le presse-papiers`,"common.copyFailed":`Échec de la copie`,"common.add":`Ajouter`,"folderPicker.title":`Choisir un dossier`,"folderPicker.parent":`Dossier parent`,"folderPicker.empty":`Aucun sous-dossier`,"folderPicker.select":`Choisir ce dossier`,"common.start":`Démarrer`,"common.stop":`Arrêter`,"common.archive":`Archiver`,"common.unarchive":`Désarchiver`,"common.selectWorkspace":`Sélectionnez un espace de travail`,"common.noResults":`Aucun résultat pour « {query} »`,"common.send":`envoyer`,"common.newLine":`nouvelle ligne`,"common.history":`historique`,"common.justNow":`a l'instant`,"common.minutesAgo":`il y a {count}m`,"common.hoursAgo":`il y a {count}h`,"common.daysAgo":`il y a {count}j`,"model.auto":`Auto`,"model.opus55":`Opus 5.5`,"model.opus55Description":`Pour les tâches complexes et quotidiennes, contexte 1M`,"model.sonnet55":`Sonnet 5.5`,"model.sonnet55Description":`Efficace pour les tâches courantes, contexte 1M`,"model.gpt61sol":`GPT-6.1 Sol`,"model.gpt61solDescription":`Dernier modèle polyvalent pour le code et le travail quotidien`,"model.gpt6sol":`GPT-6 Sol`,"model.gpt6solDescription":`Modèle polyvalent de la génération précédente`,"model.gpt6luna":`GPT-6 Luna`,"model.gpt6lunaDescription":`Modèle rapide pour les tâches simples`,"model.fable51":`Fable 5.1`,"model.fable5":`Fable 5`,"model.fable5Description":`Pour les tâches exigeantes et de longue durée`,"model.mythos51":`Mythos 5.1 (Glasswing)`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable51Description":`Modèle le plus capable - remplace Fable 5, contexte 1M, adaptive thinking`,"model.mythos51Description":`Fable 5.1 proposé sur invitation uniquement via Project Glasswing`,"model.mythos5Description":`Fable 5.1 sans classificateurs de sécurité — accès limité (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude choisit le modèle optimal`,"model.opus5Description":`Pour le coding agentique complexe et le travail en entreprise, contexte 1M`,"model.opus48Description":`Opus le plus capable — coding agentique long-horizon, contexte 1M par défaut, effort high par défaut`,"model.opus47ClassicDescription":`Dernier Opus, le plus capable`,"model.opus471mDescription":`Dernier Opus, contexte 1M`,"model.opusClassicDescription":`Le plus puissant`,"model.opus1mDescription":`Le plus puissant, contexte 1M`,"model.sonnet5Description":`Meilleure combinaison vitesse/intelligence, contexte 1M`,"model.sonnetClassicDescription":`Équilibré`,"model.sonnet1mDescription":`Équilibré, contexte 1M`,"model.haikuDescription":`Le plus rapide`,"model.gpt6astra":`GPT-6 Astra`,"model.gpt6astraDescription":`Modèle frontière le plus capable, contexte 1M (nécessite une authentification ChatGPT)`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`Modèle polyvalent de génération antérieure`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Modèle de codage agentique équilibré pour un usage quotidien (nécessite une authentification ChatGPT)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Modèle de codage agentique rapide et économique (nécessite une authentification ChatGPT)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Ancien modèle de programmation`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Repli par défaut — raisonnement solide, compatible avec une clé API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Rapide et efficient — idéal pour les tâches réactives et les sous-agents`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Optimisé pour un usage professionnel et les agents longue durée`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modèle spécialisé code pour l'ingénierie logicielle complexe`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`aucun`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Laisse le moteur choisir`,"reasoning.minimalDescription":`Raisonnement le plus rapide et superficiel`,"reasoning.noneDescription":`Sans raisonnement supplémentaire`,"reasoning.lowDescription":`Plus rapide, moins profond`,"reasoning.mediumDescription":`Équilibré`,"reasoning.highDescription":`Plus de profondeur`,"reasoning.xhighDescription":`Profondeur étendue, tâches longues`,"reasoning.maxDescription":`Profondeur maximale`,"agentPermissionMode.label":`Mode de permission`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Strict (édits)`,"agentPermissionMode.interactive":`Interactif`,"agentPermissionMode.tooltip":`Comment l'agent gère les permissions d'outils. Plan : lecture seule, aucune écriture. Bypass : aucune demande. Strict : auto-accept des éditions de fichiers, respect des allow/deny pour le reste. Interactif : demande à l'utilisateur avant chaque outil via le panneau de permission.`,"agentPermissionMode.autoLoopOverride":`L'auto-loop force un mode autre que Plan — Plan bloque les outils MCP et les éditions dont la boucle a besoin. Choisis Bypass, Strict ou Interactif.`,"agentPermissionMode.autoLoopLocked":`Verrouillé sur Bypass tant que l'auto-loop est activé — un autre mode bloquerait la boucle sur les demandes de permission. AskUserQuestion fonctionne toujours.`,"workspaceList.title":`Espaces de travail`,"workspaceList.a11y.groupToggle":`Groupe {group}, {count} workspaces`,"workspaceList.a11y.list":`Workspaces`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Attention requise`,"workspaceList.running":`En cours`,"workspaceList.idle":`Inactif`,"workspaceList.archived":`Archivés`,"workspaceList.archivedToast":`« {name} » archivé`,"workspaceList.archivedUndo":`Annuler`,"workspaceList.unarchiveFailed":`Impossible de désarchiver ce workspace`,"workspaceList.noWorkspaces":`Aucun espace de travail`,"workspaceList.loadFailed":`Impossible de charger vos workspaces`,"workspaceList.loadFailedHint":`Il s’agit d’un échec de connexion, pas d’un compte vide.`,"workspaceList.footer":`{count} espace de travail | {count} espaces de travail`,"workspaceList.footerRunning":`{count} en cours`,"workspaceList.deleteDialog.title":`Supprimer l'espace de travail ?`,"workspaceList.deleteDialog.deleteLocal":`Supprimer la branche locale`,"workspaceList.deleteDialog.deleteRemote":`Supprimer la branche distante`,"workspaceList.deleteDialog.warning":`Attention : cette action est irréversible sur le dépôt distant.`,"workspaceList.deleteArchivedDialog.tooltip":`Supprimer tous les espaces de travail archivés`,"workspaceList.deleteArchivedDialog.title":`Supprimer tous les espaces archivés ?`,"workspaceList.deleteArchivedDialog.message":`Cela supprimera définitivement les {count} espaces de travail archivés. Cette action est irréversible.`,"workspaceList.deleteArchivedDialog.typeCount":`Tapez {count} pour confirmer`,"workspacePage.configure":`Configurer`,"workspacePage.permissions":`Permissions`,"workspacePage.selectWorkspace":`Sélectionnez un espace de travail pour commencer`,"workspacePage.commandPalettePlaceholder":`Rechercher une commande…`,"workspacePage.commandPaletteEmpty":`Aucune commande correspondante`,"workspacePage.commandFocusChat":`Placer le curseur dans le chat`,"workspacePage.commandSearchHistory":`Rechercher dans l'historique du workspace`,"workspacePage.commandTogglePanel":`Afficher ou masquer le panneau latéral`,"workspacePage.commandStartAgent":`Démarrer l'agent`,"workspacePage.commandStopAgent":`Arrêter l'agent`,"workspacePage.commandOpenSettings":`Ouvrir les réglages`,"workspacePage.commandOpenCreate":`Créer un workspace`,"workspacePage.commandOpenSearch":`Recherche globale`,"workspacePage.commandOpenHealth":`Page Santé`,"workspacePage.commandOpenChangelog":`Journal des versions`,"workspacePage.commandGroupWorkspaces":`Aller à un workspace`,"workspacePage.commandPaletteHint":`Palette de commandes`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ Nouvelle session`,"workspacePage.renameSession":`Renommer`,"workspacePage.renameSessionTitle":`Renommer la session`,"workspacePage.sessionNameLabel":`Nom de la session`,"workspacePage.sessionEndedNotice":`Cette session est terminée. Crée une nouvelle session pour continuer.`,"workspacePage.renameFailed":`Échec du renommage`,"workspacePage.copySessionId":`Copier l'ID de session`,"workspacePage.deleteSession":`Supprimer la session`,"workspacePage.deleteSessionTitle":`Supprimer la session ?`,"workspacePage.deleteSessionConfirm":`Cette action supprime définitivement cette session et son historique de conversation.`,"workspacePage.deleteSessionFailed":`Échec de la suppression de la session`,"workspacePage.noEngineSessionId":`Pas encore d'ID de session — l'agent n'a pas encore démarré cette session`,"workspacePage.createSessionFailed":`Échec de la création de la session`,"workspacePage.startFailed":`Échec du démarrage`,"workspacePage.stopFailed":`Échec de l'arrêt`,"workspacePage.interrupt":`Interrompre`,"workspacePage.interrupted":`Agent interrompu — en attente de votre prochain message`,"workspacePage.lastAgentEvent":`Dernier événement {when}`,"workspacePage.agentStopping":`Arrêt en cours…`,"workspacePage.agentNotRunning":`Aucun agent en cours — le statut est périmé`,"contextMenu.restoreWorktree":`Restaurer le worktree`,"workspacePage.restoringWorktree":`Restauration…`,"workspacePage.worktreeRestoreSuccess":`Worktree restauré`,"workspacePage.worktreeRestoreLimitations":`Recrée les fichiers Git commités. Les dépendances et les fichiers locaux supprimés précédemment ne sont pas restaurés.`,"workspacePage.restoreError.not-found":`Ce workspace n’existe plus. Actualisez la liste des workspaces.`,"workspacePage.restoreError.not-purged":`Ce workspace n’est pas marqué comme purgé. Actualisez-le et vérifiez son répertoire de travail.`,"workspacePage.restoreError.workspace-busy":`Une autre opération est en cours sur ce workspace. Attendez sa fin, puis réessayez.`,"workspacePage.restoreError.worktree-not-owned":`Ce worktree n’est pas géré par Kōbō. Restaurez-le manuellement dans son projet d’origine.`,"workspacePage.restoreError.project-unavailable":`Le projet d’origine est indisponible. Reconnectez son disque ou restaurez le projet à son emplacement initial, puis réessayez.`,"workspacePage.restoreError.path-conflict":`Le chemin du worktree est occupé par un autre dossier ou dépôt. Déplacez le dossier en conflit ou suivez les instructions de récupération manuelle dans Détails.`,"workspacePage.restoreError.branch-in-use":`La branche de travail est déjà utilisée ailleurs. Utilisez ce worktree ou libérez sa branche avant de réessayer.`,"workspacePage.restoreError.recovery-source-unavailable":`La branche de travail et le commit sauvegardé sont introuvables. Vérifiez l’accès au dépôt distant ou consultez la récupération manuelle dans Détails.`,"workspacePage.restoreError.git-failed":`La restauration a échoué. Vérifiez l’accès à Git et les permissions du disque, puis réessayez. Détails ouvre le guide de récupération manuelle.`,"workspacePage.archivedBanner":`Workspace archivé — lecture seule`,"workspacePage.worktreePurgedBanner":`Worktree supprimé — historique conservé`,"workspacePage.worktreePurgedTooltip":`Restaurer le worktree recrée le répertoire de travail et désarchive ce workspace. La conversation, les tâches et les sessions sont conservées. Aucun agent ni serveur de développement ne démarre.`,"workspacePage.pendingInitialPromptBanner":`Un prompt initial est en attente — l'agent ne l'a jamais reçu (le script de setup a planté ou le workspace n'a jamais été démarré). Cliquez sur Démarrer pour l'envoyer.`,"workspacePage.unarchived":`Workspace désarchivé`,"workspacePage.unarchiveFailed":`Échec du désarchivage`,"workspacePage.interruptFailed":`Échec de l'interruption`,"workspacePage.interruptHint":`Interrompre le tour en cours sans terminer la session.`,"workspacePage.interruptTooltip":`Interruption douce (comme Escape) — arrête le tool en cours mais garde la session active`,"workspacePage.pendingNextRun":`Appliqué au prochain démarrage`,"workspacePage.activeSessionModel":`En cours : {model}`,"workspacePage.activeSessionModelTooltip":`Modèle effectivement utilisé par la session sélectionnée`,"workspacePage.switchEngine":`Changer d’engine`,"workspacePage.switchEngineHint":`Continuer ce workspace avec un autre engine agent`,"workspacePage.moreActions":`Plus d'actions`,"workspacePage.switchEngineTitle":`Changer d’engine agent`,"workspacePage.switchEngineWarning":`L’agent actuel sera arrêté et une nouvelle session démarrera dans le même worktree.`,"workspacePage.engineLabel":`Engine`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Passation pour le nouvel engine`,"workspacePage.engineHandoffHint":`Relisez ou modifiez le contexte envoyé au nouvel agent.`,"workspacePage.confirmSwitchEngine":`Changer d’engine`,"workspacePage.switchEngineFailed":`Échec du changement d’engine`,"whip.dispatchFailed":`Impossible d'envoyer le message du fouet`,"whip.phrase1":`Continue, s’il te plaît.`,"whip.phrase2":`Poursuis les tâches prévues.`,"whip.phrase3":`Passe à l’étape suivante.`,"whip.phrase4":`Vérifie la progression et continue.`,"whip.phrase5":`Continue dans le périmètre convenu.`,"search.title":`Recherche`,"search.tooltip":`Rechercher dans l'historique des agents`,"search.placeholder":`Rechercher dans tous les messages agents…`,"search.includeArchived":`Inclure les workspaces archivés`,"search.loading":`Recherche en cours…`,"search.noResults":`Aucun résultat`,"search.error":`Échec de la recherche : {message}`,"search.resultCount":`{n} résultat(s)`,"search.eventType.userMessage":`Vous`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`Aucune activité`,"activityFeed.emptyHint":`Démarrez un espace de travail pour voir la sortie de l'agent ici`,"activityFeed.initialPrompt":`Prompt initial`,"activityFeed.you":`Vous`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Aller au message précédent`,"activityFeed.scrollToBottom":`Défiler vers le bas`,"activityFeed.sendAnswers":`Envoyer les réponses`,"agentBusy.banner":`L'agent est occupé`,"agentBusy.subagentsRunning":`1 sous-agent en cours | {n} sous-agents en cours`,"agentBusy.viewSubagents":`Voir les sous-agents`,"agentBusy.pendingMessage":`En attente — l'agent est occupé`,"terminal.title":`Terminal`,"terminal.open":`Ouvrir le terminal`,"terminal.close":`Fermer le terminal`,"terminal.noWorkspace":`Sélectionnez un espace de travail`,"terminal.noWorktree":`Worktree pas encore créé`,"terminal.error":`Erreur du terminal`,"terminal.exited":`Terminal fermé`,"terminal.disconnected":`Connexion perdue`,"terminal.outputMayBeMissing":`[Connexion interrompue. Une partie de la sortie du terminal peut manquer.]`,"terminal.reconnecting":`Reconnexion… (essai {attempt} sur {max})`,"terminal.reconnect":`Reconnecter`,"chatInput.placeholder":`Message... (/ pour les skills)`,"chatInput.fileSearchHint":`chercher un fichier`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Joindre une image`,"chatInput.queueBanner":`Message en file d'attente — sera envoyé quand l'agent aura terminé`,"chatInput.forceQueue":`forcer l’envoi`,"chatInput.searchHistory":`rechercher`,"chatInput.commandPalette":`commandes`,"chatInput.shortcuts":`Raccourcis clavier`,"chatInput.cancelQueue":`Annuler la file d'attente`,"chatInput.autoLoopBanner":`L'auto-loop tourne — arrête-le pour envoyer un message`,"chatInput.awaitingUserBanner":`L'agent attend ta réponse ci-dessus — réponds via le panneau de question`,"chatInput.autoLoopStop":`Arrêter`,"koboCommand.checkProgressDesc":`Vérifier la progression des tâches et critères d'acceptation`,"chatInput.uploading":`Envoi en cours...`,"voice.title":`Transcription vocale`,"voice.enabled":`Activer la transcription vocale locale`,"voice.pttKey":`Touche push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Espace`,"voice.language":`Langue (auto ou code)`,"voice.model":`Modèle actif`,"voice.commandPath":`Chemin du binaire Whisper (optionnel)`,"voice.ffmpegPath":`Chemin du binaire ffmpeg (optionnel)`,"voice.temperature":`Température`,"voice.temperatureHint":`Plus bas = plus déterministe ; plus haut = plus flexible mais moins stable.`,"voice.initialPrompt":`Prompt initial (optionnel)`,"voice.initialPromptHint":`Contexte optionnel pour aider Whisper sur les noms, acronymes ou jargon métier.`,"voice.translateToEnglish":`Traduire vers anglais`,"voice.translateToEnglishHint":`Si activé, la parole non anglaise est traduite en anglais au lieu d’être transcrite telle quelle.`,"voice.suppressNst":`Supprimer les tokens non vocaux`,"voice.suppressNstHint":`Essaie de réduire les artefacts non vocaux dans la transcription.`,"voice.installLink":`Installer whisper.cpp`,"voice.installGuideTitle":`Guide d'installation`,"voice.installGuideIntro":`Installe whisper.cpp et ffmpeg, puis renseigne les chemins binaires ci-dessous si nécessaire.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Après le build CMake, le binaire Whisper est généralement ici : whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Ensuite, renseigne "Chemin du binaire Whisper" et "Chemin du binaire ffmpeg" dans cette section (ou laisse vide si c’est dans le PATH).`,"voice.noneModel":`Aucun modèle actif`,"voice.notInstalled":`non installé`,"voice.download":`Télécharger`,"voice.delete":`Supprimer`,"voice.holdToTalk":`Maintiens pour parler`,"voice.recording":`Enregistrement...`,"voice.transcribing":`Transcription...`,"voice.notSupported":`L'enregistrement vocal n'est pas supporté par ce navigateur`,"voice.errorMicPermission":`Permission micro refusée`,"voice.errorTranscription":`La transcription vocale a échoué`,"voice.downloadFailed":`Échec du téléchargement du modèle`,"voice.deleteFailed":`Échec de la suppression du modèle`,"voice.errorDisabled":`La transcription vocale est désactivée dans les réglages`,"voice.errorModelMissing":`Aucun modèle vocal actif n'est configuré`,"voice.errorModelNotInstalled":`Le modèle vocal actif n'est pas installé`,"voice.errorAudioInvalid":`La capture audio est invalide ou vide`,"voice.errorLanguageInvalid":`La configuration de langue vocale est invalide`,"voice.errorRuntimeMissing":`Le runtime Whisper n'est pas installé ou pas dans le PATH`,"voice.maxDurationReached":`Durée maximale d'enregistrement atteinte`,"voice.runtimeReady":`Runtime prêt : {command}`,"voice.runtimeMissing":`Runtime manquant : {command}`,"voice.ffmpegReady":`ffmpeg prêt`,"voice.ffmpegMissing":`ffmpeg manquant`,"voice.sectionRuntime":`État du runtime`,"voice.sectionActivation":`Activation`,"voice.sectionModels":`Modèles Whisper`,"voice.sectionAdvanced":`Options avancées`,"voice.sectionBehavior":`Comportement de la transcription`,"voice.sectionBinaries":`Chemins des binaires`,"voice.downloadModels":`Télécharger un modèle`,"voice.cancelFailed":`Échec de l'annulation du téléchargement`,"attachments.error.upload":`Échec de l’envoi du fichier. Retirez la pièce jointe puis réessayez.`,"attachments.add":`Joindre des fichiers`,"attachments.remove":`Retirer la pièce jointe`,"attachments.hint":`Collez ou déposez vos fichiers ici · {count} maximum · {size} Mo chacun · {total} Mo au total`,"attachments.error.type":`Utilisez des images PNG, JPEG, GIF ou WebP, des PDF, du Markdown ou des documents texte (TXT, CSV, JSON, YAML, XML, LOG, RST, TOML).`,"attachments.error.size":`Chaque fichier doit être non vide et ne pas dépasser 50 Mo.`,"attachments.error.count":`Vous pouvez joindre jusqu’à 10 fichiers.`,"attachments.error.total":`Les pièces jointes ne doivent pas dépasser 50 Mo au total.`,"attachments.descriptionRequired":`Saisissez une description ou joignez un fichier.`,"createPage.title":`Créer un workspace`,"createPage.fromTemplate":`Depuis un template`,"createPage.fromTemplateNone":`Aucun`,"createPage.saveAsTemplate":`Enregistrer comme template`,"createPage.saveTemplateTitle":`Enregistrer ce formulaire comme template`,"createPage.saveTemplateName":`Nom du template`,"createPage.saveTemplateOverwrite":`Un template nommé « {name} » existe. L'écraser ?`,"createPage.templateSaved":`Template « {name} » enregistré`,"createPage.templateApplied":`Template « {name} » appliqué`,"createPage.duplicatedFrom":`Dupliqué depuis « {name} »`,"createPage.duplicateLoadFailed":`Impossible de charger le workspace à dupliquer.`,"createPage.templateSaveFailed":`Impossible d'enregistrer le template.`,"createPage.presetProjectUnknown":`Ce template vise un projet qui n'est plus configuré ; le projet actuel a été conservé.`,"createPage.copySuffix":`(copie)`,"createPage.subtitle":`Décrivez la mission, choisissez un projet, puis configurez l’agent.`,"createPage.sectionMission":`Mission`,"createPage.sectionMissionHint":`Donnez à l’agent un objectif clair et le contexte nécessaire pour le réaliser.`,"createPage.workspaceNameLabel":`Nom du workspace`,"createPage.descriptionLabel":`Description de la mission`,"createPage.tagsLabel":`Tags`,"createPage.tagsHint":`Classifiez ce workspace`,"createPage.sources":`Sources facultatives`,"createPage.sectionGit":`Projet Git`,"createPage.sectionGitHint":`Choisissez le dépôt, la branche de départ et le mode de worktree.`,"createPage.worktreeMode":`Mode de worktree`,"createPage.worktreeNew":`Nouveau worktree isolé`,"createPage.worktreeExisting":`Réutiliser un worktree existant`,"createPage.projectLabel":`Projet`,"createPage.sourceBranch":`Branche de départ`,"createPage.workingBranchPreview":`Aperçu de la branche de travail`,"createPage.branchNamePending":`nom-du-workspace`,"createPage.sectionAgent":`Agent`,"createPage.sectionAgentHint":`Vérifiez les réglages d’exécution ou activez l’automatisation.`,"createPage.configureAgent":`Configurer l’agent`,"createPage.advancedOptions":`Options avancées`,"createPage.keyboardHint":`Appuyez sur Ctrl/Cmd + Entrée pour créer le workspace.`,"createPage.createWorkspace":`Créer le workspace`,"createPage.compareEngines":`Comparer deux moteurs`,"createPage.engineA":`Moteur A`,"createPage.engineB":`Moteur B`,"createPage.compareBrainstormLocked":`Mode comparaison : chaque moteur brainstorme avec le modèle et l'effort définis dans son bloc ci-dessus.`,"createPage.compareEnginesHint":`Crée deux workspaces à partir de cette tâche, un par moteur, dans des worktrees frères. Leurs diffs peuvent ensuite être comparés côte à côte.`,"createPage.compareNeedsNewWorktree":`Comparer deux moteurs nécessite deux nouveaux worktrees. Désactivez d'abord « utiliser un worktree existant ».`,"createPage.compareNeedsSecondEngine":`Choisissez un second moteur, différent du premier, pour la comparaison.`,"comparison.title":`Comparaison de moteurs`,"comparison.hint":`La même tâche, exécutée par chaque moteur dans son propre worktree.`,"comparison.engine":`Moteur`,"comparison.status":`Statut`,"comparison.tasks":`Tâches`,"comparison.commits":`Commits`,"comparison.files":`Fichiers`,"comparison.diff":`Diff`,"comparison.messages":`Messages`,"comparison.messagesTitle":`Messages de l'agent / vos messages`,"comparison.questions":`Questions`,"comparison.tools":`Outils`,"comparison.errors":`Erreurs`,"comparison.tokens":`Tokens`,"comparison.tokensTitle":`Tokens en entrée / en sortie`,"comparison.sessions":`Sessions`,"comparison.duration":`Durée`,"comparison.exportCsv":`Exporter en CSV`,"comparison.open":`Ouvrir`,"comparison.current":`Celui-ci`,"comparison.archived":`archivé`,"comparison.incomplete":`Un seul workspace de cette comparaison existe. L'autre n'a jamais été créé, ou a été supprimé.`,"createPage.comparisonPartial":`Seulement {count} workspace(s) sur {total} ont été créés. Celui qui existe est utilisable tel quel ; supprimez-le si vous préférez recommencer.`,"createPage.notionEnabled":`Notion activé`,"createPage.importNotion":`Importer depuis Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL doit commencer par https://www.notion.so/ ou https://app.notion.com/`,"createPage.notionAutoExtract":`Les sous-tâches et critères d'acceptation seront extraits automatiquement.`,"createPage.notionPanelChoiceLabel":`Cette URL pointe vers une sous-page (?p=). Sur laquelle veux-tu travailler ?`,"createPage.notionPanelOption":`Sous-page (panel)`,"createPage.notionPanelOptionDesc":`La page que tu consultais — recommandé`,"createPage.notionParentOption":`Page parente`,"createPage.notionParentOptionDesc":`L'epic / database qui la contient`,"createPage.importSentry":`Importer Sentry`,"createPage.sentryEnabled":`Sentry activé`,"createPage.sentryPlaceholder":`https://votre-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL doit pointer vers une issue Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue Sentry sera importée automatiquement`,"createPage.sentryExtractHint":`Kobo va extraire l'issue et l'écrire dans .ai/thoughts/`,"createPage.importPr":`Importer depuis une PR`,"createPage.importPrRequiresProject":`Choisir d'abord un projet`,"createPage.importPrNotSupported":`Le forge de ce projet ne permet pas de lister les pull requests`,"createPage.lockedToPr":`Verrouillé sur la PR #{number}`,"createPage.prReadyToCreate":`PR #{number} importée — le workspace peut être créé.`,"createPage.prResumeIntro":`Reprise du travail sur la pull request existante #{number} « {title} » ({url}).`,"createPage.unlockPrCheckout":`Déverrouiller`,"createPage.workspaceName":`Nom de l'espace de travail (par défaut le titre de la page Notion)`,"createPage.workspaceNamePlaceholder":`Nom de l'espace de travail...`,"createPage.instructions":`Instructions supplémentaires (optionnel)...`,"createPage.instructionsPlaceholder":`Décrivez la tâche...`,"createPage.tasks":`Tâches ({count})`,"createPage.addTask":`Ajouter une tâche...`,"createPage.acceptanceCriteria":`Critères d'acceptation ({count})`,"createPage.addCriterion":`Ajouter un critère...`,"createPage.projectPath":`Chemin du projet`,"createPage.branchType":`Type de branche`,"createPage.branch":`Branche`,"createPage.noBranches":`Aucune branche trouvée`,"createPage.enterPath":`Entrez le chemin du projet`,"createPage.skipSetupScript":`Ignorer le script de setup`,"createPage.worktreePickerLabel":`Worktree existant`,"createPage.noOrphanWorktrees":`Aucun worktree orphelin pour ce projet`,"createPage.pickWorktreeRequired":`Sélectionne un worktree à réutiliser`,"createPage.notionExtractHint":`Les sous-tâches et critères d'acceptation seront extraits de la page Notion.`,"createPage.errorCreating":`Erreur lors de la création de l'espace de travail.`,"createPage.branchAdjusted":"Branche déjà existante — création de `{branch}` à la place. Le dossier worktree correspondant utilise le même suffixe.","createPage.localSourceFallback":`Workspace créé à partir de la branche locale (origin injoignable) — la base peut être périmée.`,"createPage.validationNotionUrl":`Veuillez coller une URL Notion valide (https://www.notion.so/... ou https://app.notion.com/...).`,"createPage.validationDescription":`Veuillez décrire la tâche.`,"createPage.validationName":`Veuillez fournir un nom d'espace de travail.`,"createPage.validationPath":`Veuillez entrer le chemin du projet.`,"createPage.validationBranch":`Veuillez sélectionner une branche.`,"createPage.validationFocusHint":`Le champ à corriger est mis en évidence ci-dessous.`,"createPage.progress.validate":`Validation de la demande…`,"createPage.progress.fetch-source-branch":`Récupération de la branche source depuis origin…`,"createPage.progress.inspect-worktree":`Inspection du worktree existant…`,"createPage.progress.extract-notion":`Extraction de la page Notion…`,"createPage.progress.extract-sentry":`Extraction de l’issue Sentry…`,"createPage.progress.create-record":`Création du workspace…`,"createPage.progress.create-tasks":`Création des tâches et critères d’acceptation…`,"createPage.progress.create-worktree":`Création du worktree git…`,"createPage.progress.write-conventions":`Écriture des conventions git…`,"createPage.progress.write-context-files":`Écriture des fichiers de contexte…`,"createPage.progress.build-prompt":`Construction du prompt initial…`,"createPage.progress.setup-script":`Exécution de votre script d’installation…`,"createPage.progress.start-agent":`Démarrage de l’agent…`,"createPage.progress.rollback":`Annulation de la création échouée…`,"createPage.progress.done":`Terminé`,"createPage.progress.step":`Étape {index} sur {total}`,"createPage.errorAtStep":`La création a échoué à l’étape « {step} » : {message}`,"createPage.override.title":`Deux de vos choix ont été remplacés`,"createPage.override.setup-script-forced":`Script d’installation ignoré : le relancer sur un worktree que vous avez déjà préparé pourrait en détruire le contenu.`,"createPage.override.permission-mode-downgraded":`Mode de permission passé de Plan à Bypass : une boucle autonome ne peut pas tourner en Plan, qui bloque les outils et les modifications.`,"settings.title":`Paramètres`,"settings.language":`Langue`,"settings.projectColor":`Couleur`,"settings.projectColorClear":`Effacer`,"settings.projectColorDefault":`Par défaut (gris)`,"settings.workspaceListSection":`Liste des workspaces`,"settings.flattenWorkspaceList":`Afficher en liste plate`,"settings.flattenWorkspaceListHint":`Affiche tous les espaces de travail en liste plate avec un badge projet, plutôt que regroupés par projet.`,"workflow.title":`Fonctionnement Git`,"workflow.hint":`Ces préférences guident les agents ; elles ne remplacent pas les permissions système. Les instructions utilisateur plus restrictives restent prioritaires. Publier ne permet jamais de fusionner. Les nouveaux espaces conservent une copie de ces choix.`,"workflow.commit":`Créer des commits`,"workflow.push":`Pousser la branche`,"workflow.publish":`Publier une PR/MR ou des commentaires`,"workflow.manual":`Manuel — demande explicite`,"workflow.automatic":`Automatique — si nécessaire`,"workflow.inherit":`Hériter`,"workflow.locked":`Arrête l’agent pour modifier ces préférences. La session en cours les a déjà reçues.`,"workflow.updateFailed":`Impossible d’enregistrer la préférence. Vérifie la connexion et réessaie.`,"workflow.save":`Enregistrer les préférences Git`,"workflow.saved":`Préférences Git enregistrées.`,"workflow.planExecution":`Plan permet de préparer la mission. Pour exécuter, choisissez explicitement un mode de permissions compatible puis reprenez la boucle.`,"settings.skillSuite.standard":`Standard (sans extension)`,"settings.skillSuite.standardHint":`Fonctionnement intégré sans suite de skills requise.`,"settings.skillSuite.section":`Suite de skills`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personnalisé`,"settings.skillSuite.superpowersHint":`Workflow opiné TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite de Garry Tan — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Les deux suites s'empilent — superpowers pour la méthodo (brainstorm / TDD / plans / review au niveau principes), gstack pour les workflows concrets (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`Framework agentique d'affaan-m — agents, skills, rules et hooks pour planifier, tester, implémenter, relire et mémoriser (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`Les trois suites s'empilent — superpowers pour la méthodo, gstack pour les workflows concrets, ECC pour des passes de relecture/implémentation multi-agents structurées.`,"settings.skillSuite.customHint":`Compose les cinq prompts ci-dessous à partir des templates de ton choix, puis modifie-les librement.`,"settings.skillSuite.reloadDefaults":`Recharger les valeurs par défaut`,"settings.skillSuite.reloadDefaultsConfirm":`Remplacer les cinq prompts personnalisés par les valeurs agnostiques par défaut ?`,"settings.skillSuite.customPrompts":`Prompts personnalisés`,"settings.skillSuite.agnostic":`Base agnostique`,"settings.skillSuite.importPrompt":`Importer un template`,"settings.skillSuite.imported":`Template importé. Tu peux maintenant le modifier.`,"settings.skillSuite.importFailed":`Impossible d'importer le template`,"settings.skillSuite.reviewTemplate":`Template de relecture`,"settings.skillSuite.autoLoopReviewGate":`Gate de relecture auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro de grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Instruction phase brainstorming`,"settings.global":`Général`,"settings.projects":`Projets`,"settings.globalSettings":`Paramètres généraux`,"settings.defaultModel":`Modèle par défaut`,"settings.defaultModelClaude":`Modèle par défaut (Claude Code)`,"settings.defaultModelCodex":`Modèle par défaut (OpenAI Codex)`,"settings.agentPermissions":`Permissions de l'agent`,"settings.skipPermissions":`Ignorer les invites de permission (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attention : désactiver cette option entraînera le refus automatique de toutes les permissions d'outils (Write, Edit, Bash...) en mode headless. L'agent ne pourra que lire.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Notification navigateur quand l'agent termine`,"settings.audioNotifications":`Notification sonore quand l'agent termine`,"settings.enableBrowserNotifications":`Activer les notifications navigateur`,"settings.testBrowserNotification":`Tester la notification`,"settings.browserNotificationGranted":`Notifications du navigateur autorisées`,"settings.browserNotificationDenied":`Notifications du navigateur bloquées`,"settings.browserNotificationAsk":`Autorisation du navigateur requise`,"settings.browserNotificationUnsupported":`Notifications du navigateur indisponibles`,"settings.browserNotificationPermissionNeeded":`Autorisez les notifications du navigateur pour envoyer un test.`,"settings.browserNotificationTestTitle":`Test de notification Kōbō`,"settings.browserNotificationTestBody":`Les notifications du navigateur fonctionnent.`,"settings.enableAudio":`Activer l'audio`,"settings.notificationSound":`Son de notification`,"settings.notificationSoundHint":`Joué quand l'agent termine ou demande une permission.`,"settings.questionSound":`Son des questions`,"settings.questionSoundHint":`Joué uniquement quand l'agent te pose une question.`,"settings.workspaceCreatedSound":`Son de création d'espace de travail`,"settings.workspaceCreatedSoundHint":`Joué après la création d'un espace de travail.`,"settings.notificationSoundPreview":`Écouter`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Erreurs de l’agent`,"settings.agentErrorSoundHint":`Joué pour les quotas, rate limits et erreurs de l’agent.`,"settings.notificationSoundBasic":`Notification basique`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Travail`,"settings.notificationSoundTravailTermine":`Travail terminé`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Ça va péter`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR et CI`,"settings.soundGeneral":`Son général`,"settings.soundNone":`Aucun son`,"settings.prCiFailedSound":`CI en échec`,"settings.prCiRecoveredSound":`CI rétablie`,"settings.prChangesRequestedSound":`Modifications demandées`,"settings.prApprovedSound":`PR approuvée`,"settings.prMergeConflictSound":`Conflit de merge`,"settings.prReadyToMergeSound":`Prête à merger`,"settings.prMergedSound":`PR mergée`,"settings.prCiFailedSoundHint":`Joué quand la CI passe en échec.`,"settings.prCiRecoveredSoundHint":`Joué quand la CI se rétablit après un échec.`,"settings.prChangesRequestedSoundHint":`Joué quand une review demande des modifications.`,"settings.prApprovedSoundHint":`Joué quand la pull request est approuvée.`,"settings.prMergeConflictSoundHint":`Joué quand un conflit de merge est détecté.`,"settings.prReadyToMergeSoundHint":`Joué quand la pull request devient prête à merger.`,"settings.prMergedSoundHint":`Joué quand la pull request est mergée.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Mode de permission par défaut`,"settings.defaultPermissionModeClaude":`Mode de permission par défaut (Claude Code)`,"settings.defaultPermissionModeCodex":`Mode de permission par défaut (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Mode appliqué à la création d'un workspace. Plan = lecture seule, Bypass = sans prompt, Strict = auto-accept des éditions avec allow-list, Interactif = demande avant chaque outil.`,"settings.activityFeed":`Flux d'activité`,"settings.verboseMessages":`Afficher les messages système détaillés (task_progress, task_started)`,"settings.showThinkingBlocks":`Afficher les blocs de réflexion des agents`,"settings.whipSettings":`Fouet`,"settings.whipSettingsHint":`Configurez le raccourci et le volume du fouet optionnel.`,"settings.whipEnabled":`Activer le fouet`,"settings.whipEnabledHint":`Affiche le fouet interactif dans les workspaces actifs compatibles.`,"settings.whipVolume":`Volume du fouet`,"settings.whipVolumeMasterAudioDisabled":`L’audio principal est désactivé. Activez les notifications audio pour régler le volume du fouet ; la valeur enregistrée est conservée.`,"whip.overlayLabel":`Fouet interactif`,"whip.overlayInstructions":`Déplacez le pointeur pour contrôler le fouet. Appuyez sur Entrée ou Espace pour le faire claquer. Appuyez sur Échap pour fermer.`,"settings.whipShortcut":`Raccourci du fouet`,"settings.whipShortcutHint":`Cliquez, puis appuyez sur le raccourci à utiliser.`,"settings.whipShortcutRecording":`Appuyez sur un raccourci…`,"settings.whipShortcutButtonLabel":`Raccourci du fouet : {shortcut}`,"settings.whipShortcutRecordingLabel":`Enregistrement du raccourci du fouet. Appuyez sur un raccourci…`,"settings.whipShortcutReset":`Réinitialiser le raccourci`,"settings.whipShortcutReserved":`Ce raccourci est réservé par le navigateur.`,"settings.testIntegration":`Tester la connexion`,"pwa.offline":`Vous êtes hors ligne. Le chat et les agents nécessitent le serveur Kōbō.`,"pwa.reconnecting":`Reconnexion au serveur Kōbō…`,"pwa.installReady":`Installez Kōbō comme application.`,"pwa.install":`Installer`,"pwa.ignore":`Ignorer`,"pwa.updateReady":`Une mise à jour de Kōbō est disponible.`,"pwa.reload":`Recharger`,"chat.searchWorkspaceHistory":`Rechercher dans l’historique du workspace`,"chat.historySearch.user":`Vous`,"chat.historySearch.agent":`Agent`,"chat.openInGitDiff":`Ouvrir dans le diff Git`,"timeline.title":`Chronologie des sessions`,"timeline.export":`Exporter le diagnostic`,"timeline.unnamed":`Session agent`,"timeline.tools":`{count} outils`,"timeline.errors":`{count} erreurs`,"settings.availableVariables":`Variables disponibles dans les modèles de prompt`,"settings.prPromptTemplate":`Modèle de prompt PR`,"settings.prPromptPlaceholder":`Instructions pour l'agent lors de la création de PR GitHub...`,"settings.prPromptHint":`Utilisez les variables listées ci-dessus (syntaxe doubles accolades).`,"settings.reviewPromptTemplate":`Modèle de prompt de review`,"settings.reviewPromptPlaceholder":`Instructions pour l'agent lors de la review des changes de la branche...`,"settings.ciFixPromptTemplate":`Modèle de prompt « Fix CI »`,"settings.ciFixPromptHint":`Envoyé à l'agent quand un workspace voit sa CI échouer. Variables (syntaxe double-accolades) : pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Demande à l'agent de diagnostiquer et de corriger les jobs CI en échec...`,"settings.finalizationPromptTemplate":`Prompt de finalisation de l'auto-loop`,"settings.finalizationPromptHint":`Prompt par défaut pour la dernière itération de l'auto-loop (contrôles qualité finaux). Utilisé quand un projet laisse son propre prompt de finalisation vide.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Prompt initial Notion`,"settings.notionInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a un ticket Notion. Variables : {variables}.`,"settings.notionInitialPrompt.project":`Prompt initial Notion (override)`,"settings.sentryInitialPrompt":`Prompt initial Sentry`,"settings.sentryInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a une issue Sentry. Variables : {variables}.`,"settings.sentryInitialPrompt.project":`Prompt initial Sentry (override)`,"settings.initialPrompt.inheritHint":`Laisser vide pour hériter. Saisir un caractère d'espacement pour désactiver l'injection à ce niveau.`,"settings.resetToDefault":`Réinitialiser`,"settings.resetFailed":`Échec du chargement de la valeur par défaut`,"settings.sentryIntegration":`Intégration Sentry`,"settings.var.prNumber":`Numéro de PR (ex : 42)`,"settings.var.prUrl":`URL complète de la PR créée`,"settings.var.branchName":`Nom de la branche de travail`,"settings.var.sourceBranch":`Branche source ciblée par la PR`,"settings.var.workspaceName":`Nom du workspace`,"settings.var.projectName":`Dernier segment du chemin du projet`,"settings.var.notionUrl":`URL Notion si définie, vide sinon`,"settings.var.commits":`Liste à puces des commits entre source et head`,"settings.var.diffStats":`Résumé shortstat Git (fichiers, insertions, suppressions)`,"settings.var.tasks":`Tâches classiques en liste à cocher`,"settings.var.acceptanceCriteria":`Critères d'acceptation en liste à cocher`,"settings.gitConventions":`Conventions Git (global)`,"settings.gitConventionsPlaceholder":`# Conventions Git...`,"settings.gitConventionsHint":`Ces conventions sont écrites dans .ai/.git-conventions.md pour chaque nouvel espace de travail et doivent être respectées par l'agent avant toute opération Git. Remplacées par les conventions par projet si définies.`,"settings.setupScript":`Script de setup`,"settings.cleanupScript":`Script de cleanup`,"settings.archiveScript":`Script d'archivage`,"settings.archiveScriptHint":`Script shell exécuté côté serveur dans le worktree quand un workspace est archivé. Laisser vide pour désactiver.`,"settings.archiveScriptPlaceholder":`ex. nettoyer des conteneurs, libérer de l'espace disque…`,"settings.hook.sessionEndedTitle":`Hook : fin de session`,"settings.hook.sessionEndedHint":`Exécuté quand une session d'agent se termine, quelle qu'en soit la raison. Lit KOBO_SESSION_END_REASON (completed / error / killed / watchdog), KOBO_SESSION_STOP_CAUSE, KOBO_AUTOLOOP_ACTIVE, KOBO_SESSION_ID et KOBO_SESSION_EXIT_CODE. Vide = désactivé.`,"settings.hook.sessionEndedPlaceholder":`ex. npm test, ou notifier un canal de discussion…`,"settings.hook.prMergedTitle":`Hook : PR mergée`,"settings.hook.prMergedHint":`Exécuté quand une PR est détectée comme mergée, avant l'archivage ou la purge du workspace - le worktree est encore sur le disque. Lit KOBO_PR_NUMBER et KOBO_PR_URL. Vide = désactivé.`,"settings.hook.prMergedPlaceholder":`ex. déclencher un déploiement, taguer une release…`,"settings.hook.autoLoopDisabledTitle":`Hook : auto-loop arrêtée`,"settings.hook.autoLoopDisabledHint":`Exécuté à chaque désactivation de l'auto-loop, par Kōbō ou par vous. Lit KOBO_AUTOLOOP_REASON (completed / stall / error / user-action / awaiting-clarification) et KOBO_TASKS_PENDING. Vide = désactivé.`,"settings.hook.autoLoopDisabledPlaceholder":`ex. envoyer une notification quand la boucle bloque…`,"settings.changeSourceBranchScript":`Script de changement de branche source`,"settings.changeSourceBranchScript.help":`Remplace le cherry-pick intégré quand non vide. Le script possède git, base de PR, force-push et conflits ; Kōbō refuse seulement si l'agent tourne et met à jour la métadonnée source à exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nouvelle branche source choisie dans le dialogue
1
+ var e={"memory.panel.contextsHint":`Ce qui a été transmis au LLM pour cette conversation.`,"memory.panel.entriesHint":`Les notes persistantes que vous pouvez modifier ou réutiliser.`,"memory.panel.proposalsHint":`Les ajouts suggérés par les agents, à approuver ou refuser.`,"memory.panel.operationsHint":`Le journal des lectures et modifications de la mémoire.`,"memory.panel.openDialog":`Ouvrir la mémoire dans un dialogue`,"memory.panel.closeDialog":`Fermer le dialogue mémoire`,"tours.workspace.memorySettings.title":`Gérer les trois niveaux`,"tours.workspace.memorySettings.description":`Ce lien ouvre les paramètres Mémoire : globale pour tous vos projets, projet pour ses workspaces, workspace pour cette mission. Chaque niveau peut être effacé indépendamment, après confirmation ; cela ne retire pas les informations déjà envoyées au LLM.`,"tours.settings.memoryModes.title":`Choisir le mode de mémoire`,"tours.settings.memoryModes.description":`Hybride par défaut : l’agent mémorise dans le workspace et propose les ajouts projet/globaux à valider. Manuel : vous seul écrivez. Automatique : l’agent écrit aux trois niveaux. Cliquez sur Enregistrer pour appliquer le mode.`,"tours.settings.skills.title":`Choisir une suite de skills`,"tours.settings.skills.description":`Commencez avec Standard : aucune extension requise. Superpowers, gstack, ECC et leurs combinaisons ciblent des skills déjà installés et accessibles au moteur choisi. Sélectionner une suite change les consignes de l’agent ; cela n’installe aucun skill et n’accorde aucune permission. Personnalisé permet d’écrire vos propres consignes. Enregistrez votre choix pour l’appliquer.`,"tours.settings.git.description":`Choisissez quand les agents peuvent créer des commits, pousser ou publier. Définissez les conventions Git et les préfixes de branches.`,"tours.settings.git.title":`Fonctionnement Git`,"settings.reviewPromptHint":`Instructions transmises à l’agent au lancement d’une revue de code.`,"settings.help.git":`Préférences de commit, push et publication, conventions Git et préfixes de branches.`,"settings.nav.promptTemplates":`Templates de prompts`,"memory.scope.label":`Portée de la mémoire`,"settings.nav.memory":`Mémoire`,"settings.help.memory":`Choisissez comment Kōbō utilise la mémoire et gérez les mémoires globale, de projet et de workspace.`,"memory.settings.title":`Mémoire`,"memory.panel.title":`Mémoire`,"memory.panel.contexts":`Contextes transmis à cette conversation`,"memory.panel.noContext":`Aucun contexte mémoire transmis à cette conversation.`,"memory.panel.contextStats":`{tokens} jetons estimés · {cumulative} cumulés · {remaining} restants · {omitted} omis`,"memory.panel.entries":`Mémoires disponibles`,"memory.panel.proposals":`Propositions en attente`,"memory.panel.operations":`Opérations du workspace`,"memory.panel.add":`Ajouter une mémoire`,"memory.panel.clearWorkspace":`Effacer la mémoire du workspace`,"memory.panel.settingsLink":`Gérer les mémoires globale et de projet dans les paramètres`,"memory.panel.clearConfirm":`Effacer {entries} mémoires et {proposals} propositions de ce workspace ?`,"memory.panel.confirmClear":`Effacer la mémoire du workspace`,"memory.panel.promoteTo":`Promouvoir vers`,"memory.panel.loading":`Chargement de la mémoire du workspace…`,"memory.panel.loadFailed":`Impossible de charger la mémoire du workspace.`,"memory.panel.archived":`Archivé`,"memory.panel.purged":`Worktree purgé`,"memory.panel.changed":`Modifiée depuis ce contexte`,"memory.panel.deleted":`Supprimée depuis ce contexte`,"memory.panel.truncated":`(texte tronqué)`,"memory.engine.codex":`Codex`,"memory.tool.unexplainedError":`L’outil mémoire n’a fourni aucun détail. Si le budget de lecture est épuisé, arrêtez les lectures ; enregistrer reste possible selon les permissions. Une nouvelle conversation ou une compaction confirmée renouvelle le budget de lecture, pas un simple message.`,"memory.engine.claude-code":`Claude Code`,"memory.context.state.failed":`Échec`,"memory.context.state.prepared":`Préparé`,"memory.context.state.submitted":`Envoyé`,"memory.context.state.initialized":`Initialisé`,"memory.context.state.unknown":`Transmission inconnue`,"memory.settings.intro":`La mémoire conserve des notes explicites pour les prochaines sessions d’agent. Elle ne remplace pas l’historique du fournisseur ni celui des conversations.`,"memory.settings.mode":`Comportement automatique de la mémoire`,"memory.settings.mode.manual":`Manuel`,"memory.settings.modeHint.manual":`Les agents peuvent lire la mémoire. Vous seul pouvez créer ou modifier les notes.`,"memory.settings.mode.automatic":`Automatique`,"memory.settings.modeHint.automatic":`Les agents peuvent retrouver et mettre à jour automatiquement les mémoires pertinentes.`,"memory.settings.mode.hybrid":`Hybride`,"memory.settings.modeHint.hybrid":`Les agents peuvent modifier directement la mémoire du workspace. Les changements projet et globaux nécessitent votre approbation.`,"memory.settings.saveNote":`Le mode fait partie des paramètres et s’applique après enregistrement. Quitter sans enregistrer conserve le mode précédent.`,"memory.settings.manageTitle":`Parcourir et gérer la mémoire`,"memory.settings.independentNote":`Créer, modifier, approuver et effacer une mémoire prend effet immédiatement, indépendamment de l’enregistrement des paramètres.`,"memory.settings.add":`Ajouter une mémoire`,"memory.settings.clear":`Vider cette portée…`,"memory.settings.clearConfirmTitle":`Vider cette portée mémoire ?`,"memory.settings.clearConfirm":`Cette action supprimera {entries} mémoires et {proposals} propositions en attente de la portée {scope} sélectionnée.`,"memory.settings.clearWarning":`Cela efface uniquement les données mémoire de Kōbō, pas les conversations précédentes chez le fournisseur ni l’historique du chat.`,"memory.settings.confirmClear":`Vider la portée`,"memory.settings.cancel":`Annuler`,"memory.settings.loadFailed":`Impossible de charger les portées mémoire.`,"memory.settings.saveFailed":`Impossible d’enregistrer cette modification mémoire.`,"memory.settings.clearFailed":`Impossible d’apercevoir ou de vider cette portée mémoire.`,"memory.settings.clearConflict":`La mémoire a changé depuis l’aperçu. Les nombres ont été actualisés ; vérifiez-les avant de confirmer à nouveau.`,"memory.settings.loadMoreScopes":`Charger plus de portées`,"memory.entry.loadMore":`Charger plus de mémoires`,"memory.settings.loadingScopes":`Chargement des portées…`,"memory.settings.deleteConfirmTitle":`Confirmer la suppression mémoire`,"memory.settings.deleteConfirm":`Supprimer « {title} » de {scope} ?`,"memory.settings.deleteConfirmAction":`Supprimer la mémoire`,"memory.scope.choose":`Choisir une portée`,"memory.scope.global":`Globale`,"memory.scope.project":`Projet`,"memory.scope.workspace":`Workspace`,"memory.entry.empty":`Aucune mémoire dans cette portée.`,"memory.entry.revision":`Révision {revision}`,"memory.entry.edit":`Modifier`,"memory.entry.editAria":`Modifier {title}`,"memory.entry.delete":`Supprimer`,"memory.entry.deleteAria":`Supprimer {title}`,"memory.entry.promote":`Promouvoir`,"memory.entry.promoteAria":`Promouvoir {title}`,"memory.editor.key":`Clé stable`,"memory.editor.title":`Titre`,"memory.editor.body":`Mémoire`,"memory.editor.save":`Enregistrer la mémoire`,"memory.editor.saving":`Enregistrement…`,"memory.editor.cancel":`Annuler`,"memory.editor.conflict":`Cette mémoire a changé ailleurs. Rechargez-la ou gardez votre brouillon et rebasez-le explicitement sur la révision actuelle.`,"memory.editor.reload":`Recharger la version actuelle`,"memory.editor.rebase":`Garder le brouillon et le rebaser`,"memory.proposal.empty":`Aucune proposition en attente.`,"memory.proposal.approve":`Approuver`,"memory.proposal.approveAria":`Approuver {title}`,"memory.proposal.reject":`Refuser`,"memory.proposal.rejectAria":`Refuser {title}`,"memory.operation.empty":`Aucune opération mémoire pour le moment.`,"memory.operation.created":`Mémoire créée`,"memory.operation.updated":`Mémoire modifiée`,"memory.operation.deleted":`Mémoire supprimée`,"memory.operation.proposed":`Modification proposée`,"memory.operation.approved":`Proposition approuvée`,"memory.operation.rejected":`Proposition refusée`,"memory.operation.promoted":`Mémoire promue`,"memory.operation.cleared":`Portée vidée`,"memory.operation.read":`Mémoire renvoyée par une lecture`,"memory.operation.humanActor":`Vous`,"memory.operation.internalActor":`Agent · {engine}`,"memory.operation.externalActor":`{name} via {transport}`,"memory.operation.loadMore":`Charger les opérations précédentes`,"memory.operation.loading":`Chargement…`,"settings.nav.git":`Git`,"integration.direct":`Connexion directe`,"integration.directHint":`Optionnel : configurez une commande MCP de confiance sur ce serveur, sans configuration Claude. Placez les identifiants dans les variables d’environnement. L’enregistrement remplace toute la connexion ; activez ensuite l’intégration.`,"integration.agentScope":`Les connexions activées sont transmises à Claude Code et Codex au prochain lancement ou à la prochaine reprise. Arrêtez un agent en cours pour appliquer les changements. Les configurations MCP personnelles restent indépendantes.`,"integration.directOverrides":`La connexion directe enregistrée est prioritaire. Supprimez-la pour utiliser une entrée MCP Claude.`,"integration.stored":`Une connexion privée est enregistrée. Ses valeurs ne sont jamais renvoyées au navigateur.`,"integration.example":`Exemple : {example}`,"integration.tokenExample":`VOTRE_TOKEN_NOTION`,"integration.packageExample":`votre-paquet-mcp`,"integration.variableExample":`VOTRE_VARIABLE`,"integration.valueExample":`votre-valeur`,"integration.command":`Exécutable`,"integration.args":`Arguments (tableau JSON)`,"integration.environment":`Environnement et identifiants (objet JSON)`,"integration.failed":`Impossible de charger ou enregistrer la connexion. Vérifiez le JSON et le stockage local.`,"integration.saved":`Connexion enregistrée. Activez l’intégration puis utilisez Tester la connexion.`,"integration.save":`Remplacer la connexion`,"integration.clear":`Supprimer la connexion directe`,"settings.notificationSoundReady":`Signal de fin`,"settings.customSounds":`Sons importés`,"settings.customSoundsHint":`Importe tes propres sons de notification ({count} maximum, {size} Mo chacun, .wav .mp3 .ogg .webm). Ils sont stockés dans le dossier de données de Kōbō et apparaissent dans tous les sélecteurs ci-dessous.`,"settings.customSoundsImport":`Importer un son`,"settings.customSoundsFull":`Limite atteinte ({count} sons). Supprimes-en un avant d’en importer un autre.`,"settings.customSoundsError.type":`Format non supporté. Utilise un fichier .wav, .mp3, .ogg ou .webm.`,"settings.customSoundsError.size":`Fichier trop volumineux. La limite est de {size} Mo.`,"settings.customSoundsError.count":`Limite atteinte ({count} sons). Supprimes-en un avant d’en importer un autre.`,"settings.customSoundsError.failed":`Action impossible. Vérifie la connexion et réessaie.`,"setup.check.worktrees":`Dossier des worktrees`,"setup.fix.worktrees":`Vérifiez la destination des worktrees dans les réglages et ses droits d’écriture.`,"setup.title":`Configurer la première mission`,"setup.intro":`Choisissez un moteur et un projet Git local. Aucun skill ni intégration requis.`,"setup.project":`Dossier local du projet`,"setup.credentials":`Connectez-vous sur ce serveur avec claude /login ou codex login, ou configurez votre clé API. Ces vérifications ne lancent aucun prompt payant.`,"setup.permissions":`Commencez par un plan. Choisissez explicitement les permissions dans le formulaire de création ; un worktree ne cloisonne pas votre machine.`,"setup.check":`Vérifier l’environnement`,"setup.failed":`Cette action a échoué. Vérifiez la connexion puis réessayez.`,"setup.start":`Décrire ma première mission`,"setup.settings":`Ouvrir les réglages`,"setup.skip":`Passer pour le moment`,"setup.status.ok":`Disponible`,"setup.status.missing":`Manquant`,"setup.status.error":`À vérifier`,"setup.status.unknown":`Non vérifié`,"setup.check.node":`Node.js`,"setup.check.platform":`Plateforme`,"setup.check.git":`Git`,"setup.check.shell":`Bash`,"setup.check.storage":`Dossier de données`,"setup.check.runtime":`Paquet du moteur`,"setup.check.authentication":`Authentification`,"setup.check.model":`Accès au modèle`,"setup.check.repository":`Dépôt Git`,"setup.check.firstCommit":`Premier commit`,"setup.check.projectWritable":`Écriture dans le projet`,"setup.fix.node":`Installez Node.js 24.15 ou supérieur.`,"setup.fix.platform":`Utilisez Linux, macOS ou WSL2 ; Windows natif n’est pas pris en charge.`,"setup.fix.git":`Installez Git sur ce serveur.`,"setup.fix.shell":`Installez Bash sur ce serveur.`,"setup.fix.storage":`Vérifiez KOBO_HOME et les droits du dossier.`,"setup.fix.runtime":`Réinstallez Kōbō avec ses dépendances optionnelles de moteur.`,"setup.fix.authentication":`Connectez-vous au fournisseur choisi. La première mission vérifiera l’accès.`,"setup.fix.model":`Choisissez Auto ou un modèle accessible à votre compte.`,"setup.fix.repository":`Choisissez un dossier de travail Git existant.`,"setup.fix.firstCommit":`Créez le premier commit du projet avant de créer un worktree.`,"setup.fix.projectWritable":`Choisissez un dossier de projet accessible en écriture.`,"handoff.freshTitle":`Continuer dans une session fraîche`,"handoff.switchTitle":`Changer de LLM`,"handoff.warning":`Le travail courant est interrompu immédiatement. Une session fraîche reprend automatiquement dans le même workspace, avec les tâches et l’historique conservés.`,"handoff.generate":`Générer une passation avec l’agent actuel`,"handoff.generateHint":`Désactive cette option si son quota est épuisé. Kōbō transmettra l’objectif, les tâches, l’état Git et l’historique sans appeler le LLM actuel.`,"handoff.start":`Démarrer la session fraîche`,"handoff.stopping":`Arrêt de l’agent actuel`,"handoff.generating":`Préparation de la passation`,"handoff.starting":`Démarrage de la session fraîche`,"handoff.completed":`Session fraîche démarrée`,"handoff.failed":`Échec de la passation`,"handoff.interrupted":`Passation interrompue`,"handoff.cancelled":`Passation annulée`,"handoff.skip":`Continuer sans synthèse LLM`,"handoff.cancel":`Annuler la passation`,"handoff.report":`Lire la passation`,"handoff.source":`Session précédente`,"handoff.progress":`Passation de session en cours`,"handoff.blocked":`Résous ou annule la passation pour continuer.`,"handoff.error":`Impossible de préparer la passation de session.`,"handoff.loadFailed":`Impossible de charger l’état de la passation.`,"handoff.status":`Passation de session`,"chat.externalLlm":`LLM externe · {name}`,"search.indexing":`Indexation de l’historique : {processed}/{total}. Résultats partiels.`,"search.indexUnavailable":`Index de recherche indisponible. Réessayez plus tard.`,"blockers.setupConfiguration":`Aucun script de préparation n’est configuré. Ajoutez-en un dans la section Scripts des paramètres.`,"blockers.noWorkspace":`Sélectionnez un workspace pour utiliser cette action.`,"blockers.purged":`Restaurez le worktree depuis le bandeau du workspace avant cette action.`,"blockers.archived":`Désarchivez le workspace depuis son menu pour utiliser cette action.`,"blockers.operation":`Attendez la fin de l’opération en cours.`,"blockers.agentBusy":`Attendez la fin du tour ou arrêtez l’agent depuis la conversation.`,"blockers.configuration":`Configurez cette fonctionnalité dans les paramètres du projet.`,"blockers.settings":`Ouvrir les paramètres`,"workspaceSort.label":`Trier les workspaces`,"workspaceSort.activity":`Dernière activité`,"workspaceSort.created":`Date de création`,"workspaceSort.name":`Nom`,"workspaceSort.attention":`Priorité d’attention`,"workspaceSort.asc":`Croissant`,"workspaceSort.desc":`Décroissant`,"workspaceSort.hint":`Tri dans chaque groupe, archives comprises. Consulter un workspace ne change pas sa dernière activité.`,"model.tooltip":`Modèle utilisé par l’agent pour ce workspace`,"reasoning.tooltip":`Niveau de raisonnement utilisé par l’agent pour ce workspace`,"thinking.label":`Réflexion`,"thinking.noDetails":`L’agent réfléchit…`,"common.save":`Enregistrer`,"common.duplicate":`Dupliquer`,"common.confirm":`Confirmer`,"common.cancel":`Annuler`,"common.open":`Ouvrir`,"common.retry":`Réessayer`,"common.delete":`Supprimer`,"common.close":`Fermer`,"workspace.deleteTitle":`Supprimer le workspace`,"workspace.deleteTypeBranch":`Retapez le nom de la branche pour confirmer`,"workspace.deleteConsequences":`Cela supprime le worktree et tout l’historique.`,"workspace.deleteFailed":`Suppression du workspace impossible.`,"workspace.archiveFailed":`Archivage du workspace impossible.`,"tasks.updateFailed":`Mise à jour de la tâche impossible.`,"dashboard.tooltip":`Tableau de bord`,"dashboard.title":`Tableau de bord`,"dashboard.count":`{n} workspace | {n} workspaces`,"dashboard.empty":`Aucun workspace actif.`,"dashboard.workspace":`Workspace`,"dashboard.status":`Statut`,"dashboard.attention":`Attention`,"dashboard.pr":`PR`,"dashboard.diff":`Diff`,"dashboard.activity":`Activité`,"dashboard.prOpen":`ouverte`,"reliability.title":`Fiabilité des modèles`,"reliability.subtitle":`Comment chaque moteur et modèle s'est réellement terminé sur ce poste.`,"reliability.empty":`Aucune session terminée pour l'instant.`,"reliability.loadFailed":`Impossible de charger les chiffres de fiabilité.`,"reliability.engine":`Moteur`,"reliability.model":`Modèle`,"reliability.sessions":`Sessions`,"reliability.completed":`Terminées`,"reliability.watchdog":`Watchdog`,"reliability.killed":`Arrêtées`,"reliability.errors":`Erreurs`,"reliability.unknown":`Inconnu`,"reliability.median":`Médiane`,"reliability.durationSeconds":`{s}s`,"reliability.durationMinutes":`{m}min {s}s`,"reliability.durationHours":`{h}h {m}min`,"reliability.reset":`Réinitialiser : ne compter que les sessions terminées à partir de maintenant`,"reliability.since":`Depuis le {date}`,"reliability.showAll":`Tout afficher`,"update.available":`Une version plus récente de Kōbō est disponible : {version}`,"update.how":`Comment mettre à jour`,"common.dismiss":`Ignorer`,"common.details":`Détails`,"common.ok":`OK`,"whatsNew.title":`Quoi de neuf`,"common.loading":`Chargement...`,"common.search":`Rechercher...`,"common.refresh":`Actualiser`,"common.copy":`Copier`,"common.copied":`Copié dans le presse-papiers`,"common.copyFailed":`Échec de la copie`,"common.add":`Ajouter`,"folderPicker.title":`Choisir un dossier`,"folderPicker.parent":`Dossier parent`,"folderPicker.empty":`Aucun sous-dossier`,"folderPicker.select":`Choisir ce dossier`,"common.start":`Démarrer`,"common.stop":`Arrêter`,"common.archive":`Archiver`,"common.unarchive":`Désarchiver`,"common.selectWorkspace":`Sélectionnez un espace de travail`,"common.noResults":`Aucun résultat pour « {query} »`,"common.send":`envoyer`,"common.newLine":`nouvelle ligne`,"common.history":`historique`,"common.justNow":`a l'instant`,"common.minutesAgo":`il y a {count}m`,"common.hoursAgo":`il y a {count}h`,"common.daysAgo":`il y a {count}j`,"model.auto":`Auto`,"model.opus55":`Opus 5.5`,"model.opus55Description":`Pour les tâches complexes et quotidiennes, contexte 1M`,"model.sonnet55":`Sonnet 5.5`,"model.sonnet55Description":`Efficace pour les tâches courantes, contexte 1M`,"model.gpt61sol":`GPT-6.1 Sol`,"model.gpt61solDescription":`Dernier modèle polyvalent pour le code et le travail quotidien`,"model.gpt6sol":`GPT-6 Sol`,"model.gpt6solDescription":`Modèle polyvalent de la génération précédente`,"model.gpt6luna":`GPT-6 Luna`,"model.gpt6lunaDescription":`Modèle rapide pour les tâches simples`,"model.fable51":`Fable 5.1`,"model.fable5":`Fable 5`,"model.fable5Description":`Pour les tâches exigeantes et de longue durée`,"model.mythos51":`Mythos 5.1 (Glasswing)`,"model.mythos5":`Mythos 5 (Glasswing)`,"model.fable51Description":`Modèle le plus capable - remplace Fable 5, contexte 1M, adaptive thinking`,"model.mythos51Description":`Fable 5.1 proposé sur invitation uniquement via Project Glasswing`,"model.mythos5Description":`Fable 5.1 sans classificateurs de sécurité — accès limité (Project Glasswing)`,"model.opus":`Opus 4.6`,"model.sonnet":`Sonnet 4.6`,"model.opus5":`Opus 5`,"model.opus48":`Opus 4.8`,"model.opus47Classic":`Opus 4.7 (Classic)`,"model.opus471m":`Opus 4.7 (1M)`,"model.opusClassic":`Opus 4.6 (Classic)`,"model.opus1m":`Opus 4.6 (1M)`,"model.sonnet5":`Sonnet 5`,"model.sonnetClassic":`Sonnet 4.6 (Classic)`,"model.sonnet1m":`Sonnet 4.6 (1M)`,"model.haiku":`Haiku 4.5`,"model.autoDescription":`Claude choisit le modèle optimal`,"model.opus5Description":`Pour le coding agentique complexe et le travail en entreprise, contexte 1M`,"model.opus48Description":`Opus le plus capable — coding agentique long-horizon, contexte 1M par défaut, effort high par défaut`,"model.opus47ClassicDescription":`Dernier Opus, le plus capable`,"model.opus471mDescription":`Dernier Opus, contexte 1M`,"model.opusClassicDescription":`Le plus puissant`,"model.opus1mDescription":`Le plus puissant, contexte 1M`,"model.sonnet5Description":`Meilleure combinaison vitesse/intelligence, contexte 1M`,"model.sonnetClassicDescription":`Équilibré`,"model.sonnet1mDescription":`Équilibré, contexte 1M`,"model.haikuDescription":`Le plus rapide`,"model.gpt6astra":`GPT-6 Astra`,"model.gpt6astraDescription":`Modèle frontière le plus capable, contexte 1M (nécessite une authentification ChatGPT)`,"model.gpt56sol":`GPT-5.6 Sol`,"model.gpt56solDescription":`Modèle polyvalent de génération antérieure`,"model.gpt56terra":`GPT-5.6 Terra`,"model.gpt56terraDescription":`Modèle de codage agentique équilibré pour un usage quotidien (nécessite une authentification ChatGPT)`,"model.gpt56luna":`GPT-5.6 Luna`,"model.gpt56lunaDescription":`Modèle de codage agentique rapide et économique (nécessite une authentification ChatGPT)`,"model.gpt55":`GPT-5.5`,"model.gpt55Description":`Ancien modèle de programmation`,"model.gpt54":`GPT-5.4`,"model.gpt54Description":`Repli par défaut — raisonnement solide, compatible avec une clé API`,"model.gpt54mini":`GPT-5.4 mini`,"model.gpt54miniDescription":`Rapide et efficient — idéal pour les tâches réactives et les sous-agents`,"model.gpt52":`GPT-5.2`,"model.gpt52Description":`Optimisé pour un usage professionnel et les agents longue durée`,"model.gpt53codex":`GPT-5.3 Codex`,"model.gpt53codexDescription":`Modèle spécialisé code pour l'ingénierie logicielle complexe`,"reasoning.auto":`auto`,"reasoning.minimal":`minimal`,"reasoning.none":`aucun`,"reasoning.low":`low`,"reasoning.medium":`medium`,"reasoning.high":`high`,"reasoning.xhigh":`xhigh`,"reasoning.max":`max`,"reasoning.autoDescription":`Laisse le moteur choisir`,"reasoning.minimalDescription":`Raisonnement le plus rapide et superficiel`,"reasoning.noneDescription":`Sans raisonnement supplémentaire`,"reasoning.lowDescription":`Plus rapide, moins profond`,"reasoning.mediumDescription":`Équilibré`,"reasoning.highDescription":`Plus de profondeur`,"reasoning.xhighDescription":`Profondeur étendue, tâches longues`,"reasoning.maxDescription":`Profondeur maximale`,"agentPermissionMode.label":`Mode de permission`,"agentPermissionMode.plan":`Plan`,"agentPermissionMode.bypass":`Bypass`,"agentPermissionMode.strict":`Strict (édits)`,"agentPermissionMode.interactive":`Interactif`,"agentPermissionMode.tooltip":`Comment l'agent gère les permissions d'outils. Plan : lecture seule, aucune écriture. Bypass : aucune demande. Strict : auto-accept des éditions de fichiers, respect des allow/deny pour le reste. Interactif : demande à l'utilisateur avant chaque outil via le panneau de permission.`,"agentPermissionMode.autoLoopOverride":`L'auto-loop force un mode autre que Plan — Plan bloque les outils MCP et les éditions dont la boucle a besoin. Choisis Bypass, Strict ou Interactif.`,"agentPermissionMode.autoLoopLocked":`Verrouillé sur Bypass tant que l'auto-loop est activé — un autre mode bloquerait la boucle sur les demandes de permission. AskUserQuestion fonctionne toujours.`,"workspaceList.title":`Espaces de travail`,"workspaceList.a11y.groupToggle":`Groupe {group}, {count} workspaces`,"workspaceList.a11y.list":`Workspaces`,"workspaceList.a11y.card":`{name}, {status}`,"workspaceList.needsAttention":`Attention requise`,"workspaceList.running":`En cours`,"workspaceList.idle":`Inactif`,"workspaceList.archived":`Archivés`,"workspaceList.archivedToast":`« {name} » archivé`,"workspaceList.archivedUndo":`Annuler`,"workspaceList.unarchiveFailed":`Impossible de désarchiver ce workspace`,"workspaceList.noWorkspaces":`Aucun espace de travail`,"workspaceList.loadFailed":`Impossible de charger vos workspaces`,"workspaceList.loadFailedHint":`Il s’agit d’un échec de connexion, pas d’un compte vide.`,"workspaceList.footer":`{count} espace de travail | {count} espaces de travail`,"workspaceList.footerRunning":`{count} en cours`,"workspaceList.deleteDialog.title":`Supprimer l'espace de travail ?`,"workspaceList.deleteDialog.deleteLocal":`Supprimer la branche locale`,"workspaceList.deleteDialog.deleteRemote":`Supprimer la branche distante`,"workspaceList.deleteDialog.warning":`Attention : cette action est irréversible sur le dépôt distant.`,"workspaceList.deleteArchivedDialog.tooltip":`Supprimer tous les espaces de travail archivés`,"workspaceList.deleteArchivedDialog.title":`Supprimer tous les espaces archivés ?`,"workspaceList.deleteArchivedDialog.message":`Cela supprimera définitivement les {count} espaces de travail archivés. Cette action est irréversible.`,"workspaceList.deleteArchivedDialog.typeCount":`Tapez {count} pour confirmer`,"workspacePage.configure":`Configurer`,"workspacePage.permissions":`Permissions`,"workspacePage.selectWorkspace":`Sélectionnez un espace de travail pour commencer`,"workspacePage.commandPalettePlaceholder":`Rechercher une commande…`,"workspacePage.commandPaletteEmpty":`Aucune commande correspondante`,"workspacePage.commandFocusChat":`Placer le curseur dans le chat`,"workspacePage.commandSearchHistory":`Rechercher dans l'historique du workspace`,"workspacePage.commandTogglePanel":`Afficher ou masquer le panneau latéral`,"workspacePage.commandStartAgent":`Démarrer l'agent`,"workspacePage.commandStopAgent":`Arrêter l'agent`,"workspacePage.commandOpenSettings":`Ouvrir les réglages`,"workspacePage.commandOpenCreate":`Créer un workspace`,"workspacePage.commandOpenSearch":`Recherche globale`,"workspacePage.commandOpenHealth":`Page Santé`,"workspacePage.commandOpenChangelog":`Journal des versions`,"workspacePage.commandGroupWorkspaces":`Aller à un workspace`,"workspacePage.commandPaletteHint":`Palette de commandes`,"workspacePage.session":`Session #{n}`,"workspacePage.newSession":`+ Nouvelle session`,"workspacePage.renameSession":`Renommer`,"workspacePage.renameSessionTitle":`Renommer la session`,"workspacePage.sessionNameLabel":`Nom de la session`,"workspacePage.sessionEndedNotice":`Cette session est terminée. Crée une nouvelle session pour continuer.`,"workspacePage.renameFailed":`Échec du renommage`,"workspacePage.copySessionId":`Copier l'ID de session`,"workspacePage.deleteSession":`Supprimer la session`,"workspacePage.deleteSessionTitle":`Supprimer la session ?`,"workspacePage.deleteSessionConfirm":`Cette action supprime définitivement cette session et son historique de conversation.`,"workspacePage.deleteSessionFailed":`Échec de la suppression de la session`,"workspacePage.noEngineSessionId":`Pas encore d'ID de session — l'agent n'a pas encore démarré cette session`,"workspacePage.createSessionFailed":`Échec de la création de la session`,"workspacePage.startFailed":`Échec du démarrage`,"workspacePage.stopFailed":`Échec de l'arrêt`,"workspacePage.interrupt":`Interrompre`,"workspacePage.interrupted":`Agent interrompu — en attente de votre prochain message`,"workspacePage.lastAgentEvent":`Dernier événement {when}`,"workspacePage.agentStopping":`Arrêt en cours…`,"workspacePage.agentNotRunning":`Aucun agent en cours — le statut est périmé`,"contextMenu.restoreWorktree":`Restaurer le worktree`,"workspacePage.restoringWorktree":`Restauration…`,"workspacePage.worktreeRestoreSuccess":`Worktree restauré`,"workspacePage.worktreeRestoreLimitations":`Recrée les fichiers Git commités. Les dépendances et les fichiers locaux supprimés précédemment ne sont pas restaurés.`,"workspacePage.restoreError.not-found":`Ce workspace n’existe plus. Actualisez la liste des workspaces.`,"workspacePage.restoreError.not-purged":`Ce workspace n’est pas marqué comme purgé. Actualisez-le et vérifiez son répertoire de travail.`,"workspacePage.restoreError.workspace-busy":`Une autre opération est en cours sur ce workspace. Attendez sa fin, puis réessayez.`,"workspacePage.restoreError.worktree-not-owned":`Ce worktree n’est pas géré par Kōbō. Restaurez-le manuellement dans son projet d’origine.`,"workspacePage.restoreError.project-unavailable":`Le projet d’origine est indisponible. Reconnectez son disque ou restaurez le projet à son emplacement initial, puis réessayez.`,"workspacePage.restoreError.path-conflict":`Le chemin du worktree est occupé par un autre dossier ou dépôt. Déplacez le dossier en conflit ou suivez les instructions de récupération manuelle dans Détails.`,"workspacePage.restoreError.branch-in-use":`La branche de travail est déjà utilisée ailleurs. Utilisez ce worktree ou libérez sa branche avant de réessayer.`,"workspacePage.restoreError.recovery-source-unavailable":`La branche de travail et le commit sauvegardé sont introuvables. Vérifiez l’accès au dépôt distant ou consultez la récupération manuelle dans Détails.`,"workspacePage.restoreError.git-failed":`La restauration a échoué. Vérifiez l’accès à Git et les permissions du disque, puis réessayez. Détails ouvre le guide de récupération manuelle.`,"workspacePage.archivedBanner":`Workspace archivé — lecture seule`,"workspacePage.worktreePurgedBanner":`Worktree supprimé — historique conservé`,"workspacePage.worktreePurgedTooltip":`Restaurer le worktree recrée le répertoire de travail et désarchive ce workspace. La conversation, les tâches et les sessions sont conservées. Aucun agent ni serveur de développement ne démarre.`,"workspacePage.pendingInitialPromptBanner":`Un prompt initial est en attente — l'agent ne l'a jamais reçu (le script de setup a planté ou le workspace n'a jamais été démarré). Cliquez sur Démarrer pour l'envoyer.`,"workspacePage.unarchived":`Workspace désarchivé`,"workspacePage.unarchiveFailed":`Échec du désarchivage`,"workspacePage.interruptFailed":`Échec de l'interruption`,"workspacePage.interruptHint":`Interrompre le tour en cours sans terminer la session.`,"workspacePage.interruptTooltip":`Interruption douce (comme Escape) — arrête le tool en cours mais garde la session active`,"workspacePage.pendingNextRun":`Appliqué au prochain démarrage`,"workspacePage.activeSessionModel":`En cours : {model}`,"workspacePage.activeSessionModelTooltip":`Modèle effectivement utilisé par la session sélectionnée`,"workspacePage.switchEngine":`Changer d’engine`,"workspacePage.switchEngineHint":`Continuer ce workspace avec un autre engine agent`,"workspacePage.moreActions":`Plus d'actions`,"workspacePage.switchEngineTitle":`Changer d’engine agent`,"workspacePage.switchEngineWarning":`L’agent actuel sera arrêté et une nouvelle session démarrera dans le même worktree.`,"workspacePage.engineLabel":`Engine`,"workspacePage.engineClaude":`Claude Code`,"workspacePage.engineCodex":`Codex`,"workspacePage.engineHandoff":`Passation pour le nouvel engine`,"workspacePage.engineHandoffHint":`Relisez ou modifiez le contexte envoyé au nouvel agent.`,"workspacePage.confirmSwitchEngine":`Changer d’engine`,"workspacePage.switchEngineFailed":`Échec du changement d’engine`,"whip.dispatchFailed":`Impossible d'envoyer le message du fouet`,"whip.phrase1":`Continue, s’il te plaît.`,"whip.phrase2":`Poursuis les tâches prévues.`,"whip.phrase3":`Passe à l’étape suivante.`,"whip.phrase4":`Vérifie la progression et continue.`,"whip.phrase5":`Continue dans le périmètre convenu.`,"search.title":`Recherche`,"search.tooltip":`Rechercher dans l'historique des agents`,"search.placeholder":`Rechercher dans tous les messages agents…`,"search.includeArchived":`Inclure les workspaces archivés`,"search.loading":`Recherche en cours…`,"search.noResults":`Aucun résultat`,"search.error":`Échec de la recherche : {message}`,"search.resultCount":`{n} résultat(s)`,"search.eventType.userMessage":`Vous`,"search.eventType.agentOutput":`Agent`,"activityFeed.empty":`Aucune activité`,"activityFeed.emptyHint":`Démarrez un espace de travail pour voir la sortie de l'agent ici`,"activityFeed.initialPrompt":`Prompt initial`,"activityFeed.you":`Vous`,"activityFeed.agent":`Agent`,"activityFeed.question":`Question`,"activityFeed.goToPrevious":`Aller au message précédent`,"activityFeed.scrollToBottom":`Défiler vers le bas`,"activityFeed.sendAnswers":`Envoyer les réponses`,"agentBusy.banner":`L'agent est occupé`,"agentBusy.subagentsRunning":`1 sous-agent en cours | {n} sous-agents en cours`,"agentBusy.viewSubagents":`Voir les sous-agents`,"agentBusy.pendingMessage":`En attente — l'agent est occupé`,"terminal.title":`Terminal`,"terminal.open":`Ouvrir le terminal`,"terminal.close":`Fermer le terminal`,"terminal.noWorkspace":`Sélectionnez un espace de travail`,"terminal.noWorktree":`Worktree pas encore créé`,"terminal.error":`Erreur du terminal`,"terminal.exited":`Terminal fermé`,"terminal.disconnected":`Connexion perdue`,"terminal.outputMayBeMissing":`[Connexion interrompue. Une partie de la sortie du terminal peut manquer.]`,"terminal.reconnecting":`Reconnexion… (essai {attempt} sur {max})`,"terminal.reconnect":`Reconnecter`,"chatInput.placeholder":`Message... (/ pour les skills)`,"chatInput.fileSearchHint":`chercher un fichier`,"chatInput.skills":`Skills`,"chatInput.attachImage":`Joindre une image`,"chatInput.queueBanner":`Message en file d'attente — sera envoyé quand l'agent aura terminé`,"chatInput.forceQueue":`forcer l’envoi`,"chatInput.searchHistory":`rechercher`,"chatInput.commandPalette":`commandes`,"chatInput.shortcuts":`Raccourcis clavier`,"chatInput.cancelQueue":`Annuler la file d'attente`,"chatInput.autoLoopBanner":`L'auto-loop tourne — arrête-le pour envoyer un message`,"chatInput.awaitingUserBanner":`L'agent attend ta réponse ci-dessus — réponds via le panneau de question`,"chatInput.autoLoopStop":`Arrêter`,"koboCommand.checkProgressDesc":`Vérifier la progression des tâches et critères d'acceptation`,"chatInput.uploading":`Envoi en cours...`,"voice.title":`Transcription vocale`,"voice.enabled":`Activer la transcription vocale locale`,"voice.pttKey":`Touche push-to-talk`,"voice.pttAlt":`Alt`,"voice.pttCtrlSpace":`Ctrl+Espace`,"voice.language":`Langue (auto ou code)`,"voice.model":`Modèle actif`,"voice.commandPath":`Chemin du binaire Whisper (optionnel)`,"voice.ffmpegPath":`Chemin du binaire ffmpeg (optionnel)`,"voice.temperature":`Température`,"voice.temperatureHint":`Plus bas = plus déterministe ; plus haut = plus flexible mais moins stable.`,"voice.initialPrompt":`Prompt initial (optionnel)`,"voice.initialPromptHint":`Contexte optionnel pour aider Whisper sur les noms, acronymes ou jargon métier.`,"voice.translateToEnglish":`Traduire vers anglais`,"voice.translateToEnglishHint":`Si activé, la parole non anglaise est traduite en anglais au lieu d’être transcrite telle quelle.`,"voice.suppressNst":`Supprimer les tokens non vocaux`,"voice.suppressNstHint":`Essaie de réduire les artefacts non vocaux dans la transcription.`,"voice.installLink":`Installer whisper.cpp`,"voice.installGuideTitle":`Guide d'installation`,"voice.installGuideIntro":`Installe whisper.cpp et ffmpeg, puis renseigne les chemins binaires ci-dessous si nécessaire.`,"voice.installGuideUbuntuTitle":`Ubuntu / Debian`,"voice.installGuideWindowsTitle":`Windows`,"voice.installGuideBinaryPathHint":`Après le build CMake, le binaire Whisper est généralement ici : whisper.cpp/build/bin/whisper-cli`,"voice.installGuideSettingsHint":`Ensuite, renseigne "Chemin du binaire Whisper" et "Chemin du binaire ffmpeg" dans cette section (ou laisse vide si c’est dans le PATH).`,"voice.noneModel":`Aucun modèle actif`,"voice.notInstalled":`non installé`,"voice.download":`Télécharger`,"voice.delete":`Supprimer`,"voice.holdToTalk":`Maintiens pour parler`,"voice.recording":`Enregistrement...`,"voice.transcribing":`Transcription...`,"voice.notSupported":`L'enregistrement vocal n'est pas supporté par ce navigateur`,"voice.errorMicPermission":`Permission micro refusée`,"voice.errorTranscription":`La transcription vocale a échoué`,"voice.downloadFailed":`Échec du téléchargement du modèle`,"voice.deleteFailed":`Échec de la suppression du modèle`,"voice.errorDisabled":`La transcription vocale est désactivée dans les réglages`,"voice.errorModelMissing":`Aucun modèle vocal actif n'est configuré`,"voice.errorModelNotInstalled":`Le modèle vocal actif n'est pas installé`,"voice.errorAudioInvalid":`La capture audio est invalide ou vide`,"voice.errorLanguageInvalid":`La configuration de langue vocale est invalide`,"voice.errorRuntimeMissing":`Le runtime Whisper n'est pas installé ou pas dans le PATH`,"voice.maxDurationReached":`Durée maximale d'enregistrement atteinte`,"voice.runtimeReady":`Runtime prêt : {command}`,"voice.runtimeMissing":`Runtime manquant : {command}`,"voice.ffmpegReady":`ffmpeg prêt`,"voice.ffmpegMissing":`ffmpeg manquant`,"voice.sectionRuntime":`État du runtime`,"voice.sectionActivation":`Activation`,"voice.sectionModels":`Modèles Whisper`,"voice.sectionAdvanced":`Options avancées`,"voice.sectionBehavior":`Comportement de la transcription`,"voice.sectionBinaries":`Chemins des binaires`,"voice.downloadModels":`Télécharger un modèle`,"voice.cancelFailed":`Échec de l'annulation du téléchargement`,"attachments.error.upload":`Échec de l’envoi du fichier. Retirez la pièce jointe puis réessayez.`,"attachments.add":`Joindre des fichiers`,"attachments.remove":`Retirer la pièce jointe`,"attachments.hint":`Collez ou déposez vos fichiers ici · {count} maximum · {size} Mo chacun · {total} Mo au total`,"attachments.error.type":`Utilisez des images PNG, JPEG, GIF ou WebP, des PDF, du Markdown ou des documents texte (TXT, CSV, JSON, YAML, XML, LOG, RST, TOML).`,"attachments.error.size":`Chaque fichier doit être non vide et ne pas dépasser 50 Mo.`,"attachments.error.count":`Vous pouvez joindre jusqu’à 10 fichiers.`,"attachments.error.total":`Les pièces jointes ne doivent pas dépasser 50 Mo au total.`,"attachments.descriptionRequired":`Saisissez une description ou joignez un fichier.`,"createPage.title":`Créer un workspace`,"createPage.fromTemplate":`Depuis un template`,"createPage.fromTemplateNone":`Aucun`,"createPage.saveAsTemplate":`Enregistrer comme template`,"createPage.saveTemplateTitle":`Enregistrer ce formulaire comme template`,"createPage.saveTemplateName":`Nom du template`,"createPage.saveTemplateOverwrite":`Un template nommé « {name} » existe. L'écraser ?`,"createPage.templateSaved":`Template « {name} » enregistré`,"createPage.templateApplied":`Template « {name} » appliqué`,"createPage.duplicatedFrom":`Dupliqué depuis « {name} »`,"createPage.duplicateLoadFailed":`Impossible de charger le workspace à dupliquer.`,"createPage.templateSaveFailed":`Impossible d'enregistrer le template.`,"createPage.presetProjectUnknown":`Ce template vise un projet qui n'est plus configuré ; le projet actuel a été conservé.`,"createPage.copySuffix":`(copie)`,"createPage.subtitle":`Décrivez la mission, choisissez un projet, puis configurez l’agent.`,"createPage.sectionMission":`Mission`,"createPage.sectionMissionHint":`Donnez à l’agent un objectif clair et le contexte nécessaire pour le réaliser.`,"createPage.workspaceNameLabel":`Nom du workspace`,"createPage.descriptionLabel":`Description de la mission`,"createPage.tagsLabel":`Tags`,"createPage.tagsHint":`Classifiez ce workspace`,"createPage.sources":`Sources facultatives`,"createPage.sectionGit":`Projet Git`,"createPage.sectionGitHint":`Choisissez le dépôt, la branche de départ et le mode de worktree.`,"createPage.worktreeMode":`Mode de worktree`,"createPage.worktreeNew":`Nouveau worktree isolé`,"createPage.worktreeExisting":`Réutiliser un worktree existant`,"createPage.projectLabel":`Projet`,"createPage.sourceBranch":`Branche de départ`,"createPage.workingBranchPreview":`Aperçu de la branche de travail`,"createPage.branchNamePending":`nom-du-workspace`,"createPage.sectionAgent":`Agent`,"createPage.sectionAgentHint":`Vérifiez les réglages d’exécution ou activez l’automatisation.`,"createPage.configureAgent":`Configurer l’agent`,"createPage.advancedOptions":`Options avancées`,"createPage.keyboardHint":`Appuyez sur Ctrl/Cmd + Entrée pour créer le workspace.`,"createPage.createWorkspace":`Créer le workspace`,"createPage.compareEngines":`Comparer deux moteurs`,"createPage.engineA":`Moteur A`,"createPage.engineB":`Moteur B`,"createPage.compareBrainstormLocked":`Mode comparaison : chaque moteur brainstorme avec le modèle et l'effort définis dans son bloc ci-dessus.`,"createPage.compareEnginesHint":`Crée deux workspaces à partir de cette tâche, un par moteur, dans des worktrees frères. Leurs diffs peuvent ensuite être comparés côte à côte.`,"createPage.compareNeedsNewWorktree":`Comparer deux moteurs nécessite deux nouveaux worktrees. Désactivez d'abord « utiliser un worktree existant ».`,"createPage.compareNeedsSecondEngine":`Choisissez un second moteur, différent du premier, pour la comparaison.`,"comparison.title":`Comparaison de moteurs`,"comparison.hint":`La même tâche, exécutée par chaque moteur dans son propre worktree.`,"comparison.engine":`Moteur`,"comparison.status":`Statut`,"comparison.tasks":`Tâches`,"comparison.commits":`Commits`,"comparison.files":`Fichiers`,"comparison.diff":`Diff`,"comparison.messages":`Messages`,"comparison.messagesTitle":`Messages de l'agent / vos messages`,"comparison.questions":`Questions`,"comparison.tools":`Outils`,"comparison.errors":`Erreurs`,"comparison.tokens":`Tokens`,"comparison.tokensTitle":`Tokens en entrée / en sortie`,"comparison.sessions":`Sessions`,"comparison.duration":`Durée`,"comparison.exportCsv":`Exporter en CSV`,"comparison.open":`Ouvrir`,"comparison.current":`Celui-ci`,"comparison.archived":`archivé`,"comparison.incomplete":`Un seul workspace de cette comparaison existe. L'autre n'a jamais été créé, ou a été supprimé.`,"createPage.comparisonPartial":`Seulement {count} workspace(s) sur {total} ont été créés. Celui qui existe est utilisable tel quel ; supprimez-le si vous préférez recommencer.`,"createPage.notionEnabled":`Notion activé`,"createPage.importNotion":`Importer depuis Notion`,"createPage.notionPlaceholder":`https://www.notion.so/workspace/Page-title-abc123...`,"createPage.notionValidation":`L'URL doit commencer par https://www.notion.so/ ou https://app.notion.com/`,"createPage.notionAutoExtract":`Les sous-tâches et critères d'acceptation seront extraits automatiquement.`,"createPage.notionPanelChoiceLabel":`Cette URL pointe vers une sous-page (?p=). Sur laquelle veux-tu travailler ?`,"createPage.notionPanelOption":`Sous-page (panel)`,"createPage.notionPanelOptionDesc":`La page que tu consultais — recommandé`,"createPage.notionParentOption":`Page parente`,"createPage.notionParentOptionDesc":`L'epic / database qui la contient`,"createPage.importSentry":`Importer Sentry`,"createPage.sentryEnabled":`Sentry activé`,"createPage.sentryPlaceholder":`https://votre-org.sentry.io/issues/123456`,"createPage.sentryValidation":`L'URL doit pointer vers une issue Sentry (/issues/<id>)`,"createPage.sentryAutoExtract":`L'issue Sentry sera importée automatiquement`,"createPage.sentryExtractHint":`Kobo va extraire l'issue et l'écrire dans .ai/thoughts/`,"createPage.importPr":`Importer depuis une PR`,"createPage.importPrRequiresProject":`Choisir d'abord un projet`,"createPage.importPrNotSupported":`Le forge de ce projet ne permet pas de lister les pull requests`,"createPage.lockedToPr":`Verrouillé sur la PR #{number}`,"createPage.prReadyToCreate":`PR #{number} importée — le workspace peut être créé.`,"createPage.prResumeIntro":`Reprise du travail sur la pull request existante #{number} « {title} » ({url}).`,"createPage.unlockPrCheckout":`Déverrouiller`,"createPage.workspaceName":`Nom de l'espace de travail (par défaut le titre de la page Notion)`,"createPage.workspaceNamePlaceholder":`Nom de l'espace de travail...`,"createPage.instructions":`Instructions supplémentaires (optionnel)...`,"createPage.instructionsPlaceholder":`Décrivez la tâche...`,"createPage.tasks":`Tâches ({count})`,"createPage.addTask":`Ajouter une tâche...`,"createPage.acceptanceCriteria":`Critères d'acceptation ({count})`,"createPage.addCriterion":`Ajouter un critère...`,"createPage.projectPath":`Chemin du projet`,"createPage.branchType":`Type de branche`,"createPage.branch":`Branche`,"createPage.noBranches":`Aucune branche trouvée`,"createPage.enterPath":`Entrez le chemin du projet`,"createPage.skipSetupScript":`Ignorer le script de setup`,"createPage.worktreePickerLabel":`Worktree existant`,"createPage.noOrphanWorktrees":`Aucun worktree orphelin pour ce projet`,"createPage.pickWorktreeRequired":`Sélectionne un worktree à réutiliser`,"createPage.notionExtractHint":`Les sous-tâches et critères d'acceptation seront extraits de la page Notion.`,"createPage.errorCreating":`Erreur lors de la création de l'espace de travail.`,"createPage.branchAdjusted":"Branche déjà existante — création de `{branch}` à la place. Le dossier worktree correspondant utilise le même suffixe.","createPage.localSourceFallback":`Workspace créé à partir de la branche locale (origin injoignable) — la base peut être périmée.`,"createPage.validationNotionUrl":`Veuillez coller une URL Notion valide (https://www.notion.so/... ou https://app.notion.com/...).`,"createPage.validationDescription":`Veuillez décrire la tâche.`,"createPage.validationName":`Veuillez fournir un nom d'espace de travail.`,"createPage.validationPath":`Veuillez entrer le chemin du projet.`,"createPage.validationBranch":`Veuillez sélectionner une branche.`,"createPage.validationFocusHint":`Le champ à corriger est mis en évidence ci-dessous.`,"createPage.progress.validate":`Validation de la demande…`,"createPage.progress.fetch-source-branch":`Récupération de la branche source depuis origin…`,"createPage.progress.inspect-worktree":`Inspection du worktree existant…`,"createPage.progress.extract-notion":`Extraction de la page Notion…`,"createPage.progress.extract-sentry":`Extraction de l’issue Sentry…`,"createPage.progress.create-record":`Création du workspace…`,"createPage.progress.create-tasks":`Création des tâches et critères d’acceptation…`,"createPage.progress.create-worktree":`Création du worktree git…`,"createPage.progress.write-conventions":`Écriture des conventions git…`,"createPage.progress.write-context-files":`Écriture des fichiers de contexte…`,"createPage.progress.build-prompt":`Construction du prompt initial…`,"createPage.progress.setup-script":`Exécution de votre script d’installation…`,"createPage.progress.start-agent":`Démarrage de l’agent…`,"createPage.progress.rollback":`Annulation de la création échouée…`,"createPage.progress.done":`Terminé`,"createPage.progress.step":`Étape {index} sur {total}`,"createPage.errorAtStep":`La création a échoué à l’étape « {step} » : {message}`,"createPage.override.title":`Deux de vos choix ont été remplacés`,"createPage.override.setup-script-forced":`Script d’installation ignoré : le relancer sur un worktree que vous avez déjà préparé pourrait en détruire le contenu.`,"createPage.override.permission-mode-downgraded":`Mode de permission passé de Plan à Bypass : une boucle autonome ne peut pas tourner en Plan, qui bloque les outils et les modifications.`,"settings.title":`Paramètres`,"settings.language":`Langue`,"settings.projectColor":`Couleur`,"settings.projectColorClear":`Effacer`,"settings.projectColorDefault":`Par défaut (gris)`,"settings.workspaceListSection":`Liste des workspaces`,"settings.flattenWorkspaceList":`Afficher en liste plate`,"settings.flattenWorkspaceListHint":`Affiche tous les espaces de travail en liste plate avec un badge projet, plutôt que regroupés par projet.`,"workflow.title":`Fonctionnement Git`,"workflow.hint":`Ces préférences guident les agents ; elles ne remplacent pas les permissions système. Les instructions utilisateur plus restrictives restent prioritaires. Publier ne permet jamais de fusionner. Les nouveaux espaces conservent une copie de ces choix.`,"workflow.commit":`Créer des commits`,"workflow.push":`Pousser la branche`,"workflow.publish":`Publier une PR/MR ou des commentaires`,"workflow.manual":`Manuel — demande explicite`,"workflow.automatic":`Automatique — si nécessaire`,"workflow.inherit":`Hériter`,"workflow.locked":`Arrête l’agent pour modifier ces préférences. La session en cours les a déjà reçues.`,"workflow.updateFailed":`Impossible d’enregistrer la préférence. Vérifie la connexion et réessaie.`,"workflow.save":`Enregistrer les préférences Git`,"workflow.saved":`Préférences Git enregistrées.`,"workflow.planExecution":`Plan permet de préparer la mission. Pour exécuter, choisissez explicitement un mode de permissions compatible puis reprenez la boucle.`,"settings.skillSuite.standard":`Standard (sans extension)`,"settings.skillSuite.standardHint":`Fonctionnement intégré sans suite de skills requise.`,"settings.skillSuite.section":`Suite de skills`,"settings.skillSuite.superpowers":`Superpowers`,"settings.skillSuite.gstack":`gstack`,"settings.skillSuite.custom":`Personnalisé`,"settings.skillSuite.superpowersHint":`Workflow opiné TDD / brainstorm / plan (github.com/obra/superpowers).`,"settings.skillSuite.gstackHint":`Suite de Garry Tan — /review, /ship, /qa, /office-hours, etc. (github.com/garrytan/gstack).`,"settings.skillSuite.superpowersGstack":`Superpowers + gstack`,"settings.skillSuite.superpowersGstackHint":`Les deux suites s'empilent — superpowers pour la méthodo (brainstorm / TDD / plans / review au niveau principes), gstack pour les workflows concrets (/review, /qa, /browse, /design-review, /investigate).`,"settings.skillSuite.ecc":`ECC`,"settings.skillSuite.eccHint":`Framework agentique d'affaan-m — agents, skills, rules et hooks pour planifier, tester, implémenter, relire et mémoriser (github.com/affaan-m/ECC).`,"settings.skillSuite.allThree":`Superpowers + gstack + ECC`,"settings.skillSuite.allThreeHint":`Les trois suites s'empilent — superpowers pour la méthodo, gstack pour les workflows concrets, ECC pour des passes de relecture/implémentation multi-agents structurées.`,"settings.skillSuite.customHint":`Compose les cinq prompts ci-dessous à partir des templates de ton choix, puis modifie-les librement.`,"settings.skillSuite.reloadDefaults":`Recharger les valeurs par défaut`,"settings.skillSuite.reloadDefaultsConfirm":`Remplacer les cinq prompts personnalisés par les valeurs agnostiques par défaut ?`,"settings.skillSuite.customPrompts":`Prompts personnalisés`,"settings.skillSuite.agnostic":`Base agnostique`,"settings.skillSuite.importPrompt":`Importer un template`,"settings.skillSuite.imported":`Template importé. Tu peux maintenant le modifier.`,"settings.skillSuite.importFailed":`Impossible d'importer le template`,"settings.skillSuite.reviewTemplate":`Template de relecture`,"settings.skillSuite.autoLoopReviewGate":`Gate de relecture auto-loop`,"settings.skillSuite.autoLoopGroomingIntro":`Intro de grooming auto-loop`,"settings.skillSuite.qaTemplate":`Template QA`,"settings.skillSuite.brainstormingInstruction":`Instruction phase brainstorming`,"settings.global":`Général`,"settings.projects":`Projets`,"settings.globalSettings":`Paramètres généraux`,"settings.defaultModel":`Modèle par défaut`,"settings.defaultModelClaude":`Modèle par défaut (Claude Code)`,"settings.defaultModelCodex":`Modèle par défaut (OpenAI Codex)`,"settings.agentPermissions":`Permissions de l'agent`,"settings.skipPermissions":`Ignorer les invites de permission (--dangerously-skip-permissions)`,"settings.skipPermissionsWarning":`Attention : désactiver cette option entraînera le refus automatique de toutes les permissions d'outils (Write, Edit, Bash...) en mode headless. L'agent ne pourra que lire.`,"settings.notifications":`Notifications`,"settings.browserNotifications":`Notification navigateur quand l'agent termine`,"settings.audioNotifications":`Notification sonore quand l'agent termine`,"settings.enableBrowserNotifications":`Activer les notifications navigateur`,"settings.testBrowserNotification":`Tester la notification`,"settings.browserNotificationGranted":`Notifications du navigateur autorisées`,"settings.browserNotificationDenied":`Notifications du navigateur bloquées`,"settings.browserNotificationAsk":`Autorisation du navigateur requise`,"settings.browserNotificationUnsupported":`Notifications du navigateur indisponibles`,"settings.browserNotificationPermissionNeeded":`Autorisez les notifications du navigateur pour envoyer un test.`,"settings.browserNotificationTestTitle":`Test de notification Kōbō`,"settings.browserNotificationTestBody":`Les notifications du navigateur fonctionnent.`,"settings.enableAudio":`Activer l'audio`,"settings.notificationSound":`Son de notification`,"settings.notificationSoundHint":`Joué quand l'agent termine ou demande une permission.`,"settings.questionSound":`Son des questions`,"settings.questionSoundHint":`Joué uniquement quand l'agent te pose une question.`,"settings.workspaceCreatedSound":`Son de création d'espace de travail`,"settings.workspaceCreatedSoundHint":`Joué après la création d'un espace de travail.`,"settings.notificationSoundPreview":`Écouter`,"settings.notificationVolume":`Volume`,"settings.notificationSoundHey":`Hey`,"settings.agentErrorSound":`Erreurs de l’agent`,"settings.agentErrorSoundHint":`Joué pour les quotas, rate limits et erreurs de l’agent.`,"settings.notificationSoundBasic":`Notification basique`,"settings.notificationSoundWorkspaceCreated":`Warcraft III — Travail`,"settings.notificationSoundTravailTermine":`Travail terminé`,"settings.notificationSoundFaaah":`Faaah`,"settings.notificationSoundCaVaPeter":`Ça va péter`,"settings.notificationSoundDryFart":`Dry fart`,"settings.notificationSoundForShure":`For shure`,"settings.prSoundSection":`PR / MR et CI`,"settings.soundGeneral":`Son général`,"settings.soundNone":`Aucun son`,"settings.prCiFailedSound":`CI en échec`,"settings.prCiRecoveredSound":`CI rétablie`,"settings.prChangesRequestedSound":`Modifications demandées`,"settings.prApprovedSound":`PR approuvée`,"settings.prMergeConflictSound":`Conflit de merge`,"settings.prReadyToMergeSound":`Prête à merger`,"settings.prMergedSound":`PR mergée`,"settings.prCiFailedSoundHint":`Joué quand la CI passe en échec.`,"settings.prCiRecoveredSoundHint":`Joué quand la CI se rétablit après un échec.`,"settings.prChangesRequestedSoundHint":`Joué quand une review demande des modifications.`,"settings.prApprovedSoundHint":`Joué quand la pull request est approuvée.`,"settings.prMergeConflictSoundHint":`Joué quand un conflit de merge est détecté.`,"settings.prReadyToMergeSoundHint":`Joué quand la pull request devient prête à merger.`,"settings.prMergedSoundHint":`Joué quand la pull request est mergée.`,"settings.notificationSoundSeptiemeCompagnie03":`7ème compagnie 03`,"settings.notificationSoundAllerFtg":`Aller FTG`,"settings.notificationSoundArreteDeMentir":`Arrête de mentir`,"settings.notificationSoundArretezLesMessages":`Arrêtez d'envoyer les messages`,"settings.notificationSoundBahAlorsOnEstNul":`Bah alors, on est nul`,"settings.notificationSoundGtaVDeath":`GTA V — Death`,"settings.notificationSoundNanTuDegages":`Nan, tu dégages`,"settings.notificationSoundNanWallahPardon":`Nan, wallah, pardon`,"settings.notificationSoundOuaisCestGreg":`Ouais, c'est Greg`,"settings.notificationSoundPasCaZinedine":`Pas ça, Zinedine`,"settings.notificationSoundTaGueule":`Ta gueule`,"settings.notificationSoundTuVasLaFermer":`Tu vas la fermer`,"settings.notificationSoundYaaa":`Yaaa`,"settings.notificationSoundMaisLaisseMoiDormirZebi":`Mais laisse-moi dormir zebi`,"settings.defaultPermissionMode":`Mode de permission par défaut`,"settings.defaultPermissionModeClaude":`Mode de permission par défaut (Claude Code)`,"settings.defaultPermissionModeCodex":`Mode de permission par défaut (OpenAI Codex)`,"settings.defaultPermissionModeHint":`Mode appliqué à la création d'un workspace. Plan = lecture seule, Bypass = sans prompt, Strict = auto-accept des éditions avec allow-list, Interactif = demande avant chaque outil.`,"settings.activityFeed":`Flux d'activité`,"settings.verboseMessages":`Afficher les messages système détaillés (task_progress, task_started)`,"settings.showThinkingBlocks":`Afficher les blocs de réflexion des agents`,"settings.whipSettings":`Fouet`,"settings.whipSettingsHint":`Configurez le raccourci et le volume du fouet optionnel.`,"settings.whipEnabled":`Activer le fouet`,"settings.whipEnabledHint":`Affiche le fouet interactif dans les workspaces actifs compatibles.`,"settings.whipVolume":`Volume du fouet`,"settings.whipVolumeMasterAudioDisabled":`L’audio principal est désactivé. Activez les notifications audio pour régler le volume du fouet ; la valeur enregistrée est conservée.`,"whip.overlayLabel":`Fouet interactif`,"whip.overlayInstructions":`Déplacez le pointeur pour contrôler le fouet. Appuyez sur Entrée ou Espace pour le faire claquer. Appuyez sur Échap pour fermer.`,"settings.whipShortcut":`Raccourci du fouet`,"settings.whipShortcutHint":`Cliquez, puis appuyez sur le raccourci à utiliser.`,"settings.whipShortcutRecording":`Appuyez sur un raccourci…`,"settings.whipShortcutButtonLabel":`Raccourci du fouet : {shortcut}`,"settings.whipShortcutRecordingLabel":`Enregistrement du raccourci du fouet. Appuyez sur un raccourci…`,"settings.whipShortcutReset":`Réinitialiser le raccourci`,"settings.whipShortcutReserved":`Ce raccourci est réservé par le navigateur.`,"settings.testIntegration":`Tester la connexion`,"pwa.offline":`Vous êtes hors ligne. Le chat et les agents nécessitent le serveur Kōbō.`,"pwa.reconnecting":`Reconnexion au serveur Kōbō…`,"pwa.installReady":`Installez Kōbō comme application.`,"pwa.install":`Installer`,"pwa.ignore":`Ignorer`,"pwa.updateReady":`Une mise à jour de Kōbō est disponible.`,"pwa.reload":`Recharger`,"chat.searchWorkspaceHistory":`Rechercher dans l’historique du workspace`,"chat.historySearch.user":`Vous`,"chat.historySearch.agent":`Agent`,"chat.openInGitDiff":`Ouvrir dans le diff Git`,"timeline.title":`Chronologie des sessions`,"timeline.export":`Exporter le diagnostic`,"timeline.unnamed":`Session agent`,"timeline.tools":`{count} outils`,"timeline.errors":`{count} erreurs`,"settings.availableVariables":`Variables disponibles dans les modèles de prompt`,"settings.prPromptTemplate":`Modèle de prompt PR`,"settings.prPromptPlaceholder":`Instructions pour l'agent lors de la création de PR GitHub...`,"settings.prPromptHint":`Utilisez les variables listées ci-dessus (syntaxe doubles accolades).`,"settings.reviewPromptTemplate":`Modèle de prompt de review`,"settings.reviewPromptPlaceholder":`Instructions pour l'agent lors de la review des changes de la branche...`,"settings.ciFixPromptTemplate":`Modèle de prompt « Fix CI »`,"settings.ciFixPromptHint":`Envoyé à l'agent quand un workspace voit sa CI échouer. Variables (syntaxe double-accolades) : pr_url, pr_number, pr_title, branch_name, source_branch, workspace_name, workspace_id, project_name, failed_jobs, ci_run_url.`,"settings.ciFixPromptPlaceholder":`Demande à l'agent de diagnostiquer et de corriger les jobs CI en échec...`,"settings.finalizationPromptTemplate":`Prompt de finalisation de l'auto-loop`,"settings.finalizationPromptHint":`Prompt par défaut pour la dernière itération de l'auto-loop (contrôles qualité finaux). Utilisé quand un projet laisse son propre prompt de finalisation vide.`,"settings.finalizationPromptPlaceholder":`Run final quality checks before closing the workspace...`,"settings.notionInitialPrompt":`Prompt initial Notion`,"settings.notionInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a un ticket Notion. Variables : {variables}.`,"settings.notionInitialPrompt.project":`Prompt initial Notion (override)`,"settings.sentryInitialPrompt":`Prompt initial Sentry`,"settings.sentryInitialPrompt.help":`Ajouté au prompt de création de workspace quand le workspace a une issue Sentry. Variables : {variables}.`,"settings.sentryInitialPrompt.project":`Prompt initial Sentry (override)`,"settings.initialPrompt.inheritHint":`Laisser vide pour hériter. Saisir un caractère d'espacement pour désactiver l'injection à ce niveau.`,"settings.resetToDefault":`Réinitialiser`,"settings.resetFailed":`Échec du chargement de la valeur par défaut`,"settings.sentryIntegration":`Intégration Sentry`,"settings.var.prNumber":`Numéro de PR (ex : 42)`,"settings.var.prUrl":`URL complète de la PR créée`,"settings.var.branchName":`Nom de la branche de travail`,"settings.var.sourceBranch":`Branche source ciblée par la PR`,"settings.var.workspaceName":`Nom du workspace`,"settings.var.projectName":`Dernier segment du chemin du projet`,"settings.var.notionUrl":`URL Notion si définie, vide sinon`,"settings.var.commits":`Liste à puces des commits entre source et head`,"settings.var.diffStats":`Résumé shortstat Git (fichiers, insertions, suppressions)`,"settings.var.tasks":`Tâches classiques en liste à cocher`,"settings.var.acceptanceCriteria":`Critères d'acceptation en liste à cocher`,"settings.gitConventions":`Conventions Git (global)`,"settings.gitConventionsPlaceholder":`# Conventions Git...`,"settings.gitConventionsHint":`Ces conventions sont écrites dans .ai/.git-conventions.md pour chaque nouvel espace de travail et doivent être respectées par l'agent avant toute opération Git. Remplacées par les conventions par projet si définies.`,"settings.setupScript":`Script de setup`,"settings.cleanupScript":`Script de cleanup`,"settings.archiveScript":`Script d'archivage`,"settings.archiveScriptHint":`Script shell exécuté côté serveur dans le worktree quand un workspace est archivé. Laisser vide pour désactiver.`,"settings.archiveScriptPlaceholder":`ex. nettoyer des conteneurs, libérer de l'espace disque…`,"settings.hook.sessionEndedTitle":`Hook : fin de session`,"settings.hook.sessionEndedHint":`Exécuté quand une session d'agent se termine, quelle qu'en soit la raison. Lit KOBO_SESSION_END_REASON (completed / error / killed / watchdog), KOBO_SESSION_STOP_CAUSE, KOBO_AUTOLOOP_ACTIVE, KOBO_SESSION_ID et KOBO_SESSION_EXIT_CODE. Vide = désactivé.`,"settings.hook.sessionEndedPlaceholder":`ex. npm test, ou notifier un canal de discussion…`,"settings.hook.prMergedTitle":`Hook : PR mergée`,"settings.hook.prMergedHint":`Exécuté quand une PR est détectée comme mergée, avant l'archivage ou la purge du workspace - le worktree est encore sur le disque. Lit KOBO_PR_NUMBER et KOBO_PR_URL. Vide = désactivé.`,"settings.hook.prMergedPlaceholder":`ex. déclencher un déploiement, taguer une release…`,"settings.hook.autoLoopDisabledTitle":`Hook : auto-loop arrêtée`,"settings.hook.autoLoopDisabledHint":`Exécuté à chaque désactivation de l'auto-loop, par Kōbō ou par vous. Lit KOBO_AUTOLOOP_REASON (completed / stall / error / user-action / awaiting-clarification) et KOBO_TASKS_PENDING. Vide = désactivé.`,"settings.hook.autoLoopDisabledPlaceholder":`ex. envoyer une notification quand la boucle bloque…`,"settings.changeSourceBranchScript":`Script de changement de branche source`,"settings.changeSourceBranchScript.help":`Remplace le cherry-pick intégré quand non vide. Le script possède git, base de PR, force-push et conflits ; Kōbō refuse seulement si l'agent tourne et met à jour la métadonnée source à exit 0.`,"settings.changeSourceBranchScript.envHelp":`KOBO_NEW_BASE — nouvelle branche source choisie dans le dialogue
2
2
  KOBO_OLD_BASE — précédente branche source du workspace
3
3
  KOBO_WORKING_BRANCH — branche de travail du workspace
4
4
  KOBO_WORKTREE_PATH — chemin absolu du worktree (et cwd)
@@ -1,3 +1,3 @@
1
- import{n as e}from"./editor.api-DDwuA_C9.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:`
1
+ import{n as e}from"./editor.api-CMBx0cvf.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:/&lt;=|&gt;=|\\lte|\\lt|&lt;|\\gte|\\gt|&gt;|&amp;&amp;|\\and|-&gt;|->|==|!=|\+=|-=|\*=|\/=|%=|\+\+|--|<=|&&|\|\||:|\.\.\.|\.\.\*|\.\.<|\.\.!|\?\?|=|<|\+|-|\*|\/|%|\||\.\.|\?|!|&|\.|,|;/,arrows:[`->`,`-&gt;`],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-DDwuA_C9.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
+ import{n as e}from"./editor.api-CMBx0cvf.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-DDwuA_C9.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};
1
+ import{n as e}from"./editor.api-CMBx0cvf.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{Gt as e,Kt as t,Ut as n,Wt as r,p as i}from"./index-BjqJ45nb.js";var a=i(async({app:i})=>{if(i.use(r),e!==`en`)try{await t(e)}catch(e){console.error(`[i18n] could not load the saved locale, staying in English:`,e)}n(e)});export{a as default};