@openchambery/web 2.1.8-beta.7 → 2.1.8-beta.8

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 (80) hide show
  1. package/dist/assets/{AgentAvatar-qSjSZvIG.js → AgentAvatar-E6PHIbw0.js} +1 -1
  2. package/dist/assets/AssistantView-CrPmjRtv.js +3 -0
  3. package/dist/assets/{DiagramView-BzgI7Ugy.js → DiagramView-CCzzM-fz.js} +1 -1
  4. package/dist/assets/{FadeInOnReveal-CD5d1k_u.js → FadeInOnReveal-xpZjAd1R.js} +1 -1
  5. package/dist/assets/{Icon-QASb6r3F.js → Icon-Ck4jqC3w.js} +1 -1
  6. package/dist/assets/{ImageLoadingPlaceholder-BuGiEI7w.js → ImageLoadingPlaceholder-Dq1QizPZ.js} +1 -1
  7. package/dist/assets/{LoadingImage-FRySi1BM.js → LoadingImage-BJoCBGIj.js} +1 -1
  8. package/dist/assets/{MarkdownRenderer-C7Rxb6Z8.js → MarkdownRenderer-B6MQVdvh.js} +2 -2
  9. package/dist/assets/{MarkdownRendererImpl-DtHTDXL6.js → MarkdownRendererImpl-BWzO09y-.js} +2 -2
  10. package/dist/assets/{MarkstreamRendererImpl-H0RBa8Lc.js → MarkstreamRendererImpl-Dk-TtCMB.js} +1 -1
  11. package/dist/assets/{MobileDetailNavigation-D-1rcvj_.js → MobileDetailNavigation-B_6fTiJ5.js} +1 -1
  12. package/dist/assets/{MobileShareBridge-CDiwapde.js → MobileShareBridge-DvZmmS4t.js} +1 -1
  13. package/dist/assets/{MobileTabPageHeader-CJoiSp8u.js → MobileTabPageHeader-DA7J54Rh.js} +1 -1
  14. package/dist/assets/{MultiRunWindow-BzJkoXja.js → MultiRunWindow-_gV3YG6-.js} +1 -1
  15. package/dist/assets/{OnboardingScreen-CHa767GT.js → OnboardingScreen-DL7A9CIA.js} +1 -1
  16. package/dist/assets/{OverlayScrollbar-C7Ls30Hy.js → OverlayScrollbar-Ds68zSwB.js} +1 -1
  17. package/dist/assets/{SettingsView-CQUOFiau.js → SettingsView-WbtiYsNN.js} +6 -6
  18. package/dist/assets/{SettingsWindow-pAUyRdBf.js → SettingsWindow-xi8slLEy.js} +1 -1
  19. package/dist/assets/{TerminalView-Cc54ph8a.js → TerminalView-B7-AnhDP.js} +1 -1
  20. package/dist/assets/{ToolOutputDialog-CfVHQDPS.js → ToolOutputDialog-DUB8jV8h.js} +1 -1
  21. package/dist/assets/{appThemeRegistry-Dijsc1TR.js → appThemeRegistry-dZvExJC7.js} +1 -1
  22. package/dist/assets/{button-DOrwfkre.js → button-BidoKJDv.js} +1 -1
  23. package/dist/assets/{collapsible-BJwPZMpo.js → collapsible-CvUPZkE7.js} +1 -1
  24. package/dist/assets/{diagram-BFevUcKu.js → diagram-S5dT10Wc.js} +1 -1
  25. package/dist/assets/{dialog-FSXwOR2i.js → dialog-C8RKHhJ5.js} +1 -1
  26. package/dist/assets/{dropdown-menu.styles-CfTQwJHe.js → dropdown-menu.styles-f8GwJpe8.js} +1 -1
  27. package/dist/assets/{es-VbQQdCdi.js → es-Bm0MbIOW.js} +1 -1
  28. package/dist/assets/{fileMentionTouchSelection-DNtAG7n8.js → fileMentionTouchSelection-GJdFmrrQ.js} +1 -1
  29. package/dist/assets/{fr-BotRbS9t.js → fr-BwfOHzhU.js} +1 -1
  30. package/dist/assets/{gitApi-CizY9AdM.js → gitApi-BOOTkw_q.js} +1 -1
  31. package/dist/assets/{input-Ctgb06ot.js → input-CFl_7BAn.js} +1 -1
  32. package/dist/assets/insertionBoundaries-Bx9ENE3b.js +1 -0
  33. package/dist/assets/{ja-l_gq6Coh.js → ja-CwKRZPvS.js} +1 -1
  34. package/dist/assets/{ko-yhU5rfe5.js → ko-BeSVeShr.js} +1 -1
  35. package/dist/assets/{main-CRTSUx9O.js → main-BQTHxROo.js} +2 -2
  36. package/dist/assets/main-Bx-ZOlR4.js +169 -0
  37. package/dist/assets/{markdownHeightCache-B6drDnVO.js → markdownHeightCache-B5Wct8zF.js} +1 -1
  38. package/dist/assets/{mcpQueries-CWF6gsQp.js → mcpQueries-CIyYw1VL.js} +1 -1
  39. package/dist/assets/{miniChat-Co2aZmGn.js → miniChat-D_ZNs48R.js} +2 -2
  40. package/dist/assets/{mobile-C-jsM-at.js → mobile-Bn8qQUfc.js} +2 -2
  41. package/dist/assets/{multirun-BrG61uYF.js → multirun-CnXinACF.js} +1 -1
  42. package/dist/assets/{pl-BkynZgOJ.js → pl-BMj_nSdU.js} +1 -1
  43. package/dist/assets/{projectMeta-DeZn_2IB.js → projectMeta-DAdDjK8k.js} +1 -1
  44. package/dist/assets/{pt-BR-Dw_Dokez.js → pt-BR-NVS-v7Sy.js} +1 -1
  45. package/dist/assets/{renderElectronMiniChatApp-94_7gkv4.js → renderElectronMiniChatApp-CpcK2vb4.js} +2 -2
  46. package/dist/assets/renderMobileApp-x12aD8-c.js +28 -0
  47. package/dist/assets/{runtimeConfig-GWscdI1w.js → runtimeConfig-NJMSLiAh.js} +1 -1
  48. package/dist/assets/{runtimeEndpointReset-CQOgpDQQ.js → runtimeEndpointReset-ynhyvgjk.js} +15 -15
  49. package/dist/assets/{scheduledTaskNavigation-DEMPeoot.js → scheduledTaskNavigation-s5_c3gNQ.js} +1 -1
  50. package/dist/assets/{sessionChangeSummary-CLeHgwn-.js → sessionChangeSummary-BEjJ2gf-.js} +1 -1
  51. package/dist/assets/{sessionLookup-BNyl-F_j.js → sessionLookup-BDUIB_qx.js} +1 -1
  52. package/dist/assets/{sortable-tabs-strip-BVnwfMAa.js → sortable-tabs-strip-DVn55-Ri.js} +1 -1
  53. package/dist/assets/speechSettingsQueries-C-8YcLM1.js +4 -0
  54. package/dist/assets/{src-C9BNQK0O.css → src-OjoeiMbd.css} +1 -1
  55. package/dist/assets/{store-COtDAfPx.js → store-BUI-iRhM.js} +2 -2
  56. package/dist/assets/{textarea-DJ52TDJj.js → textarea-BJAl-1yB.js} +1 -1
  57. package/dist/assets/{tooltip-JgW0lJaV.js → tooltip-CBIMCP7g.js} +1 -1
  58. package/dist/assets/{uk-DSl09YqU.js → uk-CDPvEnfr.js} +1 -1
  59. package/dist/assets/{useAppFontEffects-DrhKfpyE.js → useAppFontEffects-HXChXK4t.js} +26 -26
  60. package/dist/assets/{useDesktopWindowControlsLayout-CqByoGOq.js → useDesktopWindowControlsLayout-ChUCpDR9.js} +1 -1
  61. package/dist/assets/{useEffectiveDirectory-C562rMTt.js → useEffectiveDirectory-CWSf_QKs.js} +1 -1
  62. package/dist/assets/useMobileNavigationStore-B4hTCxg2.js +417 -0
  63. package/dist/assets/{useWorkerHighlightedLines-B1wPAG8-.js → useWorkerHighlightedLines-UcbAXl3h.js} +1 -1
  64. package/dist/assets/{zh-CN-NtO1bA00.js → zh-CN-DQV_0Jdv.js} +1 -1
  65. package/dist/assets/{zh-TW-CF0z_L0k.js → zh-TW-BsnIeuGE.js} +1 -1
  66. package/dist/index.html +3 -3
  67. package/dist/mini-chat.html +3 -3
  68. package/dist/mobile.html +3 -3
  69. package/package.json +1 -1
  70. package/server/lib/opencode/feature-routes-runtime.js +1 -0
  71. package/server/lib/session-folders/DOCUMENTATION.md +20 -0
  72. package/server/lib/session-folders/order-routes.js +69 -0
  73. package/server/lib/session-folders/routes.js +3 -0
  74. package/server/lib/session-folders/routes.test.js +49 -0
  75. package/dist/assets/AssistantView-BYVyU99L.js +0 -3
  76. package/dist/assets/insertionBoundaries-DiezF3t9.js +0 -1
  77. package/dist/assets/main-Bq9n4CsP.js +0 -169
  78. package/dist/assets/renderMobileApp-C7Ab_Jn1.js +0 -28
  79. package/dist/assets/speechSettingsQueries-BNqvjxZr.js +0 -4
  80. package/dist/assets/useMobileNavigationStore-CYheYCC_.js +0 -417
@@ -1,4 +1,4 @@
1
- var e={"mobile.notifications.service":`Service de notifications des tâches en arrière-plan`,"mobile.notifications.connected":`Connexion maintenue pour recevoir les notifications des tâches lorsque l’application est en arrière-plan.`,"mobile.notifications.unavailable":`Impossible de démarrer les notifications en arrière-plan. Rouvrez l’application et réessayez.`,"mobile.notifications.auth":`Accès aux notifications refusé. Reconnectez ou associez à nouveau ce serveur.`,"mobile.notifications.endpoint":`Point d’accès aux notifications introuvable. Mettez à jour et redémarrez OpenChamberY sur votre ordinateur ; sinon, vérifiez le chemin du proxy.`,"mobile.notifications.response":`Le serveur n’a pas renvoyé de flux de notifications valide. Vérifiez la version de l’application sur l’ordinateur et la configuration du proxy.`,"mobile.notifications.server":`Le serveur est temporairement indisponible ou occupé. Nouvelle tentative automatique.`,"mobile.notifications.relay":`La connexion au relais est indisponible. Vérifiez qu’OpenChamberY est en ligne sur votre ordinateur ; nouvelle tentative automatique.`,"mobile.notifications.identity":`L’identité du serveur ne correspond pas à l’appareil associé. Reconnectez-le ou associez-le à nouveau.`,"mobile.notifications.gap":`Certaines notifications ont pu être manquées pendant la déconnexion. Ouvrez l’application pour consulter les résultats des tâches.`,"chat.chatInput.stopUnconfirmed":`L’arrêt n’est pas encore confirmé. Veuillez réessayer.`,"chat.response.rateLimit":`Limite de requêtes du fournisseur atteinte`,"chat.response.auth":`Échec de l’authentification du fournisseur. Reconnectez-vous et réessayez.`,"chat.response.quota":`Quota du fournisseur épuisé`,"chat.response.contentFilter":`Réponse bloquée par le fournisseur`,"chat.response.transport":`Échec de la connexion au fournisseur`,"chat.response.internal":`Erreur interne du fournisseur`,"chat.response.invalidOutput":`Réponse non valide du fournisseur`,"chat.response.invalidRequest":`Requête refusée par le fournisseur`,"chat.response.unsupportedOperation":`Opération non prise en charge par le fournisseur`,"chat.response.noRoute":`Modèle ou configuration du fournisseur indisponible`,"chat.response.providerUnknown":`Erreur du fournisseur`,"chat.response.timeout":`Délai de la requête au fournisseur dépassé`,"chat.response.permissionRejected":`Autorisation refusée`,"chat.response.toolExecution":`Échec de l’exécution de l’outil`,"chat.response.compactionFailed":`Échec de la compression du contexte`,"chat.response.compactionUnavailable":`Aucun contenu à compresser pour le moment`,"chat.response.compactionInterrupted":`Compression du contexte interrompue`,"chat.response.compactionCancelled":`Compression du contexte annulée`,"chat.response.stopped":`Arrêté par l’utilisateur`,"chat.response.interrupted":`Réponse interrompue`,"chat.response.toolInterrupted":`Exécution de l’outil interrompue`,"chat.response.resumeExhausted":`Récupération automatique arrêtée après des interruptions répétées`,"chat.response.retrying":`Nouvelle tentative automatique en cours`,"chat.response.failed":`Échec de l’exécution`,"chat.response.continuingAfterRestart":`Reprise après redémarrage`,"chat.queuedMessage.inheritsSessionSelection":`Hérite du modèle, de l’agent et de la variante de la session à l’exécution.`,"chat.sessionRecovery.awaitingConfirmation":`Service redémarré. En attente de confirmation de l’état de la tâche.`,"chat.btw.title":`Side Chat`,"chat.btw.failed":`La génération de la réponse a échoué. Veuillez réessayer.`,"chat.btw.description":`Posez une question sur la conversation en conservant son historique intact.`,"chat.btw.placeholder":`Posez une question dans Side Chat…`,"chat.btw.removeQuoteAria":`Retirer la citation`,"chat.message.conversationQuotesLabel":`Cité depuis la conversation`,"chat.btw.sessionRequired":`Ouvrez une conversation existante pour ouvrir Side Chat.`,"chat.btw.plainTextRequired":`Utilisez du texte brut. Vos références restent dans la zone de saisie.`,"chat.btw.pending":`Préparation de la réponse…`,"chat.btw.cancelled":`Réponse annulée. Réessayez pour poser la question à nouveau.`,"chat.btw.resize":`Redimensionner le panneau Side Chat`,"settings.voice.volcengine.save":`Enregistrer`,"settings.voice.volcengine.saveFailed":`Échec de l’enregistrement. Vos modifications sont conservées ; réessayez.`,"settings.voice.volcengine.loadFailed":`Impossible de charger les paramètres vocaux de ce serveur.`,"settings.voice.volcengine.retry":`Réessayer`,"chat.dictation.error.microphoneNotFound":`Aucun microphone détecté. Branchez-en un et réessayez.`,"settings.voice.volcengine.name":`Volcengine (Doubao)`,"settings.voice.volcengine.providerOption":`Volcengine Doubao (Recommandé | Payant)`,"settings.voice.volcengine.keyHelp":`Obtenir ici :`,"settings.voice.volcengine.openLink":`Cliquer pour ouvrir`,"settings.voice.volcengine.asrResource":`ID de ressource ASR en continu`,"settings.voice.volcengine.asrContext":`Contexte de reconnaissance`,"settings.voice.volcengine.asrContextHelp":`Décrivez le sujet et les termes utilisés. Videz pour désactiver ; enregistrez pour le prochain enregistrement. Maximum 2 000 caractères.`,"settings.voice.volcengine.custom":`ID personnalisé`,"settings.voice.volcengine.durationHelp":`Forfait horaire, facturé selon la durée de reconnaissance.`,"settings.voice.volcengine.concurrentHelp":`Forfait simultané, utilise la capacité achetée.`,"settings.voice.volcengine.resource":`ID de ressource TTS`,"settings.voice.volcengine.speaker":`ID de voix TTS`,"settings.voice.volcengine.asrTest":`Test du microphone`,"settings.voice.volcengine.testHelp":`Enregistrez avec les réglages actuels et consultez la transcription en direct.`,"settings.voice.volcengine.startRecording":`Démarrer l’enregistrement`,"settings.voice.volcengine.finishRecording":`Arrêter et transcrire`,"settings.voice.volcengine.recordingUnsupported":`Enregistrement indisponible ici. Utilisez HTTPS ou l’application mobile.`,"settings.voice.volcengine.fileLimit":`WAV, MP3 ou OGG, jusqu’à 20 Mo. Test de reconnaissance de fichiers, pas de sous-titres en direct.`,"settings.voice.volcengine.invalidTranscript":`Réponse de transcription invalide`,"settings.voice.volcengine.silence":`Aucune parole détectée`,"settings.voice.volcengine.stop":`Arrêter`,"settings.voice.volcengine.setup":`Ouvrir la console vocale`,"settings.remoteInstances.pairing.advanced":`Paramètres avancés`,"settings.remoteInstances.pairing.relayHint":`Configurez le serveur relais pour les connexions Internet. Il ne sert pas aux connexions locales directes.`,"settings.remoteInstances.pairing.downloadStep":`Installer l’app`,"settings.remoteInstances.pairing.name":`Nom du serveur`,"settings.remoteInstances.pairing.anywhere":`Chez vous ou ailleurs`,"settings.remoteInstances.pairing.lan":`Sur le même Wi-Fi`,"settings.remoteInstances.pairing.local":`Sur cet ordinateur`,"settings.remoteInstances.quick.sshTitle":`Travaillez sur un autre ordinateur`,"settings.remoteInstances.quick.sshHint":`Ajoutez une adresse SSH pour exécuter OpenChamberY sur un ordinateur distant et accéder à ses projets ici. Préparez vos identifiants SSH.`,"settings.remoteInstances.quick.emptyHint":`Connectez votre téléphone ou un autre ordinateur pour poursuivre votre travail où que vous soyez.`,"settings.remoteInstances.quick.title":`Appareils connectés`,"settings.remoteInstances.quick.error":`Impossible d’actualiser l’état des appareils.`,"settings.remoteInstances.quick.download":`Télécharger l’application OpenChamberY`,"settings.usage.magpie.url":`URL Magpie supplémentaire`,"settings.usage.magpie.description":`Magpie est détecté automatiquement sur ce serveur. Lancez Magpie, puis actualisez l’utilisation. Aucune configuration nécessaire.`,"settings.usage.magpie.connected":`Connecté · fournisseurs : {count}`,"settings.usage.magpie.manual":`Connecter un autre Magpie…`,"settings.usage.magpie.unavailable":`Magpie est temporairement indisponible. Actualisez pour réessayer.`,"settings.usage.magpie.cached":`Valeur en cache ; en attente de données récentes`,"settings.usage.magpie.save":`Enregistrer`,"settings.remoteInstances.clientAuth.edit.title":`Modifier l’appareil`,"settings.remoteInstances.clientAuth.edit.action":`Modifier`,"settings.remoteInstances.clientAuth.edit.name":`Nom de l’appareil`,"settings.openchamber.about.opencodeGuidance.manualGlobal":`Mettez à jour le CLI OpenCode configuré avec son gestionnaire de paquets, puis redémarrez le service.`,"settings.openchamber.about.opencodeGuidance.manualExternal":`Confiez la mise à jour et le redémarrage du service OpenCode externe à son responsable.`,"settings.openchamber.about.opencodeGuidance.bundled":`Mettez à jour OpenChamberY Desktop pour actualiser sa version intégrée d’OpenCode.`,"settings.chat.questionDelegate.label":`Déléguer automatiquement les questions en attente`,"settings.chat.questionDelegate.description":`Après 30 secondes sans réponse, demander au modèle de décider et de poursuivre. Interagir avec une question suspend son compte à rebours.`,"settings.chat.questionDelegate.saveFailed":`Échec de l’enregistrement. Vérifiez l’état actuel avant de réessayer.`,"settings.globalConfig.title":`Configuration globale`,"settings.globalConfig.description":`Modifiez les fichiers de configuration actifs dans ~/.config/opencode.`,"settings.globalConfig.actions.reload":`Recharger le fichier`,"settings.globalConfig.restartHint":`Redémarrez OpenCode après l’enregistrement pour appliquer les modifications de configuration.`,"settings.globalConfig.toast.loadFailed":`Échec du chargement du fichier de configuration`,"settings.globalConfig.toast.saveFailed":`Échec de l’enregistrement du fichier de configuration`,"settings.globalConfig.toast.saved":`Configuration enregistrée.`,"settings.providers.page.openCodeGo.title":`Suivi de l’utilisation d’OpenCode Go`,"settings.providers.page.openCodeGo.description":`Connectez le tableau de bord OpenCode Go pour afficher les quotas glissant, hebdomadaire et mensuel.`,"settings.providers.page.openCodeGo.workspaceId":`ID de l’espace de travail`,"settings.providers.page.openCodeGo.authCookie":`Cookie d’authentification`,"settings.providers.page.openCodeGo.consoleSignIn":`Se connecter avec OpenCode Console`,"settings.providers.page.openCodeGo.consoleConnected":`OpenCode Console est connecté. OpenCode Go peut utiliser ces identifiants.`,"settings.providers.page.openCodeGo.consoleHint":`OpenCode Go se connecte via OpenCode Console. Les clés de compte de service ci-dessous restent utilisables.`,"settings.providers.page.openCodeGo.help":`Copiez l’ID depuis l’URL du tableau de bord et le cookie auth depuis les outils du navigateur. OpenChamberY n’analyse jamais les cookies du navigateur.`,"settings.providers.page.openCodeGo.save":`Enregistrer et valider`,"settings.providers.page.openCodeGo.replace":`Remplacer`,"settings.providers.page.openCodeGo.validate":`Valider`,"settings.providers.page.openCodeGo.delete":`Supprimer`,"settings.providers.page.quotaCredentials.saved":`Identifiants de {provider} enregistrés.`,"settings.providers.page.openCodeGo.saveFailed":`Impossible de valider les identifiants OpenCode Go.`,"settings.providers.page.openCodeGo.valid":`Les identifiants OpenCode Go sont valides.`,"settings.providers.page.openCodeGo.invalid":`Les identifiants OpenCode Go sont invalides ou expirés.`,"settings.providers.page.openCodeGo.deleted":`Identifiants OpenCode Go supprimés.`,"settings.providers.page.openCodeGo.deleteFailed":`Impossible de supprimer les identifiants OpenCode Go.`,"settings.appearance.language.label":`Langue`,"settings.appearance.language.description":`Choisissez la langue de l'interface.`,"settings.appearance.language.select":`Sélectionnez la langue`,"settings.window.description":`Fenêtre des paramètres OpenChamberY.`,"settings.view.home.title":`Paramètres`,"settings.view.home.description":`Accédez aux pages communes.`,"settings.view.home.cards.providers.title":`Fournisseurs`,"settings.view.home.cards.providers.description":`Connecter les modèles + les identifiants`,"settings.view.home.cards.agents.title":`Configuration des agents`,"settings.view.home.cards.agents.description":`Invites, autorisations et contraintes d’exécution`,"settings.view.home.cards.skillsCatalog.title":`Catalogue de skills`,"settings.view.home.cards.skillsCatalog.description":`Installer des skills depuis des catalogues`,"settings.view.home.cards.mcp.title":`MCP`,"settings.view.home.cards.mcp.description":`Configurer les serveurs MCP + connexions`,"settings.view.home.cards.plugins.title":`Plugins`,"settings.view.home.cards.plugins.description":`Gérer les plugins OpenCode`,"settings.view.home.cards.usage.title":`Usage`,"settings.view.home.cards.usage.description":`Quota + visibilité des dépenses`,"settings.view.unavailable.title":`Pas disponible`,"settings.view.unavailable.description":`Cette page de paramètres n'est pas disponible dans ce runtime.`,"settings.view.badge.beta":`bêta`,"settings.view.actions.reloadOpenCode":`Recharger OpenCode`,"settings.view.actions.reloadOpenCodeTooltip":`Rechargez la configuration d’exécution d’OpenCode sans redémarrer le service.`,"settings.view.actions.backToSettings":`Retour aux paramètres`,"settings.view.actions.closeSettings":`Fermer les paramètres`,"settings.view.actions.openSectionList":`Ouvrir la liste des sections`,"settings.view.actions.closeSettingsWithShortcut":`Fermer les paramètres ({shortcut}+,)`,"settings.view.actions.back":`Retour`,"settings.view.actions.resizeNavigation":`Redimensionner la navigation dans les paramètres`,"settings.view.navigation.groups.connection":`Connexion`,"settings.view.navigation.groups.personalization":`Personnalisation`,"settings.view.navigation.groups.workspace":`Espace de travail`,"settings.view.navigation.groups.opencode":`OpenCode`,"settings.view.navigation.groups.content":`Contenu et automatisation`,"settings.view.navigation.groups.system":`Système`,"settings.page.projects.title":`Projets`,"settings.page.remoteInstances.title":`Instances distantes`,"settings.page.providers.title":`Fournisseurs`,"settings.page.usage.title":`Usage`,"settings.page.agents.title":`Configuration des agents`,"settings.page.commands.title":`Commandes`,"settings.page.mcp.title":`MCP`,"settings.page.plugins.title":`Plugins`,"settings.page.skills.title":`Skills`,"settings.page.skillsCatalog.title":`Catalogue de skills`,"settings.page.git.title":`Git`,"settings.page.appearance.title":`Apparence`,"settings.page.chat.title":`Chat`,"settings.page.shortcuts.title":`Raccourcis`,"settings.page.sessions.title":`Sessions`,"settings.page.archivedSessions.title":`Sessions archivées`,"settings.page.summaryAI.title":`Résumés IA`,"settings.page.magicPrompts.title":`Prompts magiques`,"settings.page.notifications.title":`Notifications`,"settings.page.voice.title":`Voix`,"settings.page.promptTemplates.title":`Modèles de prompt`,"settings.promptTemplates.sidebar.title":`Modèles de prompt`,"settings.promptTemplates.sidebar.total":`Total : {count}`,"settings.promptTemplates.sidebar.empty.title":`Aucun modèle de prompt`,"settings.promptTemplates.sidebar.empty.description":`Créez un modèle de prompt pour commencer.`,"settings.promptTemplates.sidebar.toast.deleted":`Modèle "{name}" supprimé`,"settings.promptTemplates.sidebar.toast.deleteFailed":`Échec de la suppression du modèle`,"settings.promptTemplates.sidebar.toast.nameRequired":`Le nom du modèle est obligatoire`,"settings.promptTemplates.sidebar.toast.renamed":`Modèle renommé`,"settings.promptTemplates.sidebar.toast.renameFailed":`Échec du changement de nom du modèle`,"settings.promptTemplates.sidebar.dialog.deleteTitle":`Supprimer le modèle ?`,"settings.promptTemplates.sidebar.dialog.deleteDescription":`Cela supprimera définitivement "{name}". Cette action ne peut pas être annulée.`,"settings.promptTemplates.sidebar.renameDialog.title":`Renommer le modèle`,"settings.promptTemplates.sidebar.renameDialog.description":`Entrez un nouveau nom pour "{name}".`,"settings.promptTemplates.sidebar.renameDialog.placeholder":`Nom du modèle`,"settings.promptTemplates.sidebar.badge.default":`défaut`,"settings.promptTemplates.page.empty.title":`Sélectionnez un modèle`,"settings.promptTemplates.page.empty.description":`Choisissez un modèle dans la barre latérale pour le modifier.`,"settings.promptTemplates.page.title.new":`Nouveau modèle`,"settings.promptTemplates.page.subtitle.edit":`Modifier le modèle`,"settings.promptTemplates.page.subtitle.new":`Créer un nouveau modèle de prompt`,"settings.promptTemplates.page.section.identity":`Identité`,"settings.promptTemplates.page.field.name":`Nom`,"settings.promptTemplates.page.field.namePlaceholder":`Nom du modèle`,"settings.promptTemplates.page.section.template":`Modèle`,"settings.promptTemplates.page.field.templatePlaceholder":`Saisissez le texte du modèle de prompt...`,"settings.promptTemplates.page.templateHint":`Ce texte sera ajouté au début du prompt de l'utilisateur lorsqu'il est sélectionné dans un groupe multi-run.`,"settings.promptTemplates.page.toast.nameRequired":`Le nom du modèle est obligatoire`,"settings.promptTemplates.page.toast.updated":`Modèle mis à jour`,"settings.promptTemplates.page.toast.updateFailed":`Échec de la mise à jour du modèle`,"settings.promptTemplates.page.toast.created":`Modèle créé`,"settings.promptTemplates.page.toast.createFailed":`Échec de la création du modèle`,"settings.promptTemplates.page.toast.saveUnexpectedError":`Une erreur inattendue s'est produite lors de l'enregistrement`,"settings.magicPrompts.sidebar.title":`Prompts magiques`,"settings.magicPrompts.sidebar.description":`Sélectionnez un modèle de prompt à modifier.`,"settings.magicPrompts.sidebar.group.git":`Git`,"settings.magicPrompts.sidebar.group.github":`GitHub`,"settings.magicPrompts.sidebar.group.session":`Session`,"settings.magicPrompts.sidebar.item.gitCommitGenerate":`Génération de commit`,"settings.magicPrompts.sidebar.item.gitPrGenerate":`Génération de PR`,"settings.magicPrompts.sidebar.item.gitConflictResolve":`Résolution des conflits de fusion/rebase`,"settings.magicPrompts.sidebar.item.gitCherrypickConflictResolve":`Résolution des conflits par sélection`,"settings.magicPrompts.sidebar.item.githubPrReview":`Revue de PR`,"settings.magicPrompts.sidebar.item.githubIssueReview":`Examen du problème`,"settings.magicPrompts.sidebar.item.githubPrFailedChecksReview":`Examen des checks PR en échec`,"settings.magicPrompts.sidebar.item.githubPrCommentsReview":`Examen des commentaires PR`,"settings.magicPrompts.sidebar.item.githubSinglePrCommentReview":`Examen des commentaires PR uniques`,"settings.magicPrompts.sidebar.item.sessionSummary":`Résumé de la session`,"settings.magicPrompts.sidebar.item.sessionWorkspaceReview":`Examen de l'espace de travail`,"settings.magicPrompts.sidebar.item.sessionFusion":`Fusion`,"settings.remoteInstances.sidebar.title":`Instances distantes`,"settings.remoteInstances.sidebar.description":`Connectez-vous à d’autres serveurs OpenChamberY via un lien d’import ou SSH.`,"settings.remoteInstances.sidebar.empty":`Aucune instance distante pour le moment. Importez un lien ou ajoutez une connexion SSH.`,"settings.remoteInstances.channel.link":`Lien`,"settings.remoteInstances.channel.ssh":`SSH`,"settings.remoteInstances.sidebar.total":`Total {count}`,"settings.remoteInstances.sidebar.newSshInstanceName":`Nouvelle instance SSH`,"settings.remoteInstances.sidebar.actions.addSshInstance":`Ajouter une instance SSH`,"settings.remoteInstances.sidebar.actions.connect":`Connecter`,"settings.remoteInstances.sidebar.actions.disconnect":`Déconnecter`,"settings.remoteInstances.sidebar.actions.retry":`Réessayer`,"settings.remoteInstances.sidebar.actions.remove":`Retirer`,"settings.remoteInstances.sidebar.confirm.localPortInUseRetry":`Le port local est déjà utilisé. Choisir un port local gratuit et réessayer ?`,"settings.remoteInstances.sidebar.toast.createFailed":`Échec de la création de l'instance SSH`,"settings.remoteInstances.sidebar.toast.retriedWithRandomPort":`Réessayé avec un port local aléatoire`,"settings.remoteInstances.sidebar.toast.connectFailed":`Échec de la connexion de l'instance`,"settings.remoteInstances.sidebar.toast.disconnectFailed":`Échec de la déconnexion de l'instance`,"settings.remoteInstances.sidebar.toast.retryFailed":`Échec de la nouvelle tentative de connexion`,"settings.remoteInstances.sidebar.toast.removeFailed":`Échec de la suppression de l'instance`,"settings.remoteInstances.sidebar.phase.ready":`Prêt`,"settings.remoteInstances.sidebar.phase.error":`Erreur`,"settings.remoteInstances.sidebar.phase.reconnect":`Reconnecter`,"settings.remoteInstances.sidebar.phase.installing":`Installation`,"settings.remoteInstances.sidebar.phase.updating":`Mise à jour`,"settings.remoteInstances.sidebar.phase.forwarding":`Transfert`,"settings.remoteInstances.sidebar.phase.starting":`Démarrage`,"settings.remoteInstances.sidebar.phase.connecting":`Connexion`,"settings.remoteInstances.sidebar.phase.idle":`Inactif`,"settings.remoteInstances.page.section.instance":`Instance`,"settings.remoteInstances.page.section.instanceDescription":`Paramètres de base du SSH.`,"settings.remoteInstances.page.field.mode":`Mode`,"settings.remoteInstances.page.field.modeHint":`Installations/mises à jour gérées et démarrage de OpenChamberY à distance. Externe suppose qu'il est déjà en cours d'exécution.`,"settings.remoteInstances.page.field.modePlaceholder":`Sélectionnez le mode`,"settings.remoteInstances.page.field.modeManaged":`Géré (démarrage automatique)`,"settings.remoteInstances.page.field.modeExternal":`Externe (déjà en cours d'exécution)`,"settings.remoteInstances.page.field.preferredRemotePort":`Port distant préféré`,"settings.remoteInstances.page.field.preferredRemotePortHint":`Le port OpenChamberY doit être utilisé sur l'hôte distant. Laissez vide pour laisser le runtime choisir.`,"settings.remoteInstances.page.field.keepServerRunning":`Maintenir le serveur en marche`,"settings.remoteInstances.page.field.keepServerRunningHint":`S'il est activé, le démon OpenChamberY continue de s'exécuter à distance lorsque vous vous déconnectez.`,"settings.remoteInstances.page.field.bindHost":`Lier l'hôte`,"settings.remoteInstances.page.field.bindHostHint":`Interface réseau pour l’URL locale principale. Utilisez 127.0.0.1/localhost pour un accès uniquement local.`,"settings.remoteInstances.page.field.preferredLocalPort":`Port local préféré`,"settings.remoteInstances.page.field.preferredLocalPortHint":`Port local préféré pour le tunnel principal OpenChamberY. Laissez vide pour la sélection automatique.`,"settings.remoteInstances.page.field.forwardType":`Type de transfert`,"settings.remoteInstances.page.field.localListen":`Écoute locale`,"settings.remoteInstances.page.field.localTarget":`Cible locale`,"settings.remoteInstances.page.field.remoteListen":`Écoute distante`,"settings.remoteInstances.page.field.remoteTarget":`Cible distante`,"settings.remoteInstances.page.field.localHostPlaceholder":`127.0.0.1`,"settings.remoteInstances.page.field.remoteHostPlaceholder":`127.0.0.1`,"settings.remoteInstances.page.field.auto":`Auto`,"settings.remoteInstances.page.confirm.bindAllInterfaces":`La liaison à 0.0.0.0 expose les ports transférés à votre réseau local. Continuer?`,"settings.remoteInstances.page.preview.localSocks5":`(SOCKS5 local)`,"settings.remoteInstances.page.preview.local":`(local)`,"settings.remoteInstances.page.preview.remote":`(hôte distant)`,"settings.remoteInstances.page.toast.openLocalEndpointFailed":`Échec de l'ouverture du point de terminaison local`,"settings.remoteInstances.page.toast.localUrlCopied":`URL locale copiée`,"settings.remoteInstances.page.actions.copyLocalUrl":`Copier l’URL locale`,"settings.remoteInstances.page.actions.open":`Ouvrir`,"settings.remoteInstances.page.logsDialog.selectedInstanceFallback":`Instance sélectionnée`,"settings.remoteInstances.page.patternDialog.descriptionWithHost":`{host} nécessite une destination concrète.`,"settings.remoteInstances.page.patternDialog.description":`Entrez la destination.`,"settings.common.actions.cancel":`Annuler`,"settings.common.actions.create":`Créer`,"settings.common.actions.delete":`Supprimer`,"settings.common.actions.reset":`Réinitialiser`,"settings.common.actions.rename":`Rebaptiser`,"settings.common.actions.duplicate":`Dupliquer`,"settings.common.actions.import":`Importer`,"settings.common.actions.copyAll":`Copier tout`,"settings.common.actions.clear":`Effacer`,"settings.common.actions.saving":`Enregistrement...`,"settings.common.actions.saveChanges":`Enregistrer les modifications`,"settings.common.scope.global":`Mondial`,"settings.common.scope.project":`Projet`,"settings.common.field.description":`Description`,"settings.common.badge.new":`Nouveau`,"settings.common.badge.modified":`Modifié`,"settings.common.permission.allow":`Permettre`,"settings.common.permission.ask":`Demander`,"settings.common.permission.deny":`Refuser`,"settings.common.state.comingSoon":`À venir...`,"settings.projects.actions.title":`Actions`,"settings.projects.actions.description":`Commandes par projet affichées dans l'en-tête à côté du nom du projet.`,"settings.projects.actions.validation.fillNameAndCommand":`Remplissez le nom de l'action et la commande avant d'enregistrer.`,"settings.projects.actions.state.loading":`Chargement...`,"settings.projects.actions.state.empty":`Aucune action configurée pour le moment.`,"settings.projects.actions.state.untitled":`Action sans titre`,"settings.projects.actions.state.noDesktopSshForwards":`Aucun transfert local SSH activé disponible.`,"settings.projects.actions.field.selectIconAria":`Sélectionner l'icône`,"settings.projects.actions.field.iconAria":`Icône {icon}`,"settings.projects.actions.field.actionNamePlaceholder":`Nom de l'action`,"settings.projects.actions.field.command":`Commande`,"settings.projects.actions.field.commandPlaceholder":`p. ex. bun install`,"settings.projects.actions.field.autoOpenUrl":`Ouverture automatique de l’URL`,"settings.projects.actions.field.autoOpenUrlForAria":`Ouverture automatique de l’URL pour {title}`,"settings.projects.actions.field.autoOpenUrlDescription":`Ouvrir l’URL détectée dans la sortie, ou l’URL personnalisée ci-dessous`,"settings.projects.actions.field.overrideUrlPlaceholder":`Remplacer URL (facultatif)`,"settings.projects.actions.field.overrideUrlTooltip":`Si ce champ est rempli, l’URL personnalisée est utilisée. Sinon, l'application ouvre la meilleure URL détectée dans la sortie.`,"settings.projects.actions.field.desktopSshForward":`Transfert SSH local`,"settings.projects.actions.field.useOutputManualUrl":`Utiliser l’URL de sortie ou l’URL manuelle`,"settings.projects.actions.actions.add":`Ajouter une action`,"settings.projects.actions.actions.save":`Enregistrer les actions`,"settings.projects.actions.toast.saveFailed":`Échec de l'enregistrement des actions`,"settings.projects.actions.toast.saved":`Actions du projet enregistrées`,"settings.openchamber.about.title":`À propos de OpenChamberY`,"settings.openchamber.about.field.version":`Version`,"settings.openchamber.about.field.clientVersion":`Client`,"settings.openchamber.about.field.webBundle":`Bundle web`,"settings.openchamber.about.field.instanceOpenChamberVersion":`OpenChamberY`,"settings.openchamber.about.field.instanceOpenCodeVersion":`OpenCode`,"settings.openchamber.about.state.checking":`Vérification...`,"settings.openchamber.about.state.upToDate":`À jour`,"settings.openchamber.about.state.builtin":`intégré`,"settings.openchamber.about.actions.checkUpdates":`Vérifier les mises à jour`,"settings.openchamber.about.actions.update":`Mise à jour`,"settings.openchamber.about.actions.updateToVersion":`Mise à jour vers {version}`,"settings.openchamber.about.actions.applyOtaToVersion":`Mettre à jour vers {version}`,"settings.openchamber.about.actions.installNativeToVersion":`Installer {version}`,"settings.openchamber.about.actions.checkForUpdates":`Vérifier les mises à jour`,"settings.openchamber.about.actions.submitFeedback":`Envoyer des commentaires`,"settings.openchamber.about.toast.latestVersion":`Vous êtes sur la dernière version`,"settings.openchamber.about.toast.checkFailed":`Impossible de vérifier les mises à jour`,"settings.openchamber.about.betaUpdates.label":`Rejoindre les mises à jour bêta`,"settings.openchamber.about.betaUpdates.description":`Recevez les mises à jour de l’application en avant-première sur cet appareil.`,"settings.openchamber.about.betaUpdates.rollback.title":`Revenir à la version stable ?`,"settings.openchamber.about.betaUpdates.rollback.description":`Vous utilisez une version bêta. La désactivation des mises à jour bêta ramènera OpenChamberY à la version stable v{version}. Redémarrez l’application pour appliquer ce changement.`,"settings.openchamber.about.betaUpdates.rollback.actions.cancel":`Garder la bêta`,"settings.openchamber.about.betaUpdates.rollback.actions.confirm":`Revenir à la version stable`,"settings.openchamber.about.diagnostics.label":`Journal de diagnostic`,"settings.openchamber.about.diagnostics.description":`Exporte les feat de diagnostic locaux pour analyser les problèmes d’affichage et de synchronisation. Aucun corps de message ni jeton n’est inclus.`,"settings.openchamber.about.diagnostics.export":`Exporter le journal`,"settings.openchamber.about.diagnostics.exporting":`Exportation…`,"settings.openchamber.about.diagnostics.enable":`Enregistrer les feat de diagnostic`,"settings.openchamber.about.diagnostics.enableHint":`Disponible dans les versions bêta. Enregistre sur cet appareil le cycle de synchronisation et d’affichage de la session, sans le corps du message.`,"settings.openchamber.about.diagnostics.toast.exported":`Journal de diagnostic exporté`,"settings.openchamber.about.diagnostics.toast.failed":`Impossible d’exporter le journal de diagnostic`,"settings.openchamber.about.diagnostics.toast.empty":`Journal de diagnostic exporté. Aucun événement n’a encore été enregistré.`,"settings.agents.sidebar.title":`Configuration des agents`,"settings.agents.sidebar.total":`Total {count}`,"settings.agents.sidebar.empty.title":`Aucun agent configuré`,"settings.agents.sidebar.empty.description":`Utilisez le bouton + ci-dessus pour en créer un`,"settings.agents.sidebar.section.builtIn":`Agents intégrés`,"settings.agents.sidebar.section.custom":`Agents personnalisés`,"settings.agents.sidebar.badge.system":`système`,"settings.agents.sidebar.badge.disabled":`Désactivé`,"settings.agents.sidebar.dialog.deleteTitle":`Supprimer un agent`,"settings.agents.sidebar.dialog.resetTitle":`Agent de réinitialisation`,"settings.agents.sidebar.dialog.deleteDescription":`Etes-vous sûr de vouloir supprimer l'agent "{name}" ?`,"settings.agents.sidebar.dialog.resetDescription":`Êtes-vous sûr de vouloir réinitialiser l'agent «\xA0{name}\xA0» à sa configuration par défaut ?`,"settings.agents.sidebar.renameDialog.title":`Renommer l'agent`,"settings.agents.sidebar.renameDialog.description":`Entrez un nouveau nom pour l'agent "@{name}"`,"settings.agents.sidebar.renameDialog.placeholder":`Nouveau nom d'agent...`,"settings.agents.sidebar.toast.builtInCannotDelete":`Les agents intégrés ne peuvent pas être supprimés`,"settings.agents.sidebar.toast.agentDeleted":`Agent "{name}" supprimé avec succès`,"settings.agents.sidebar.toast.agentReset":`Agent "{name}" réinitialisé aux valeurs par défaut`,"settings.agents.sidebar.toast.deleteFailed":`Échec de la suppression de l'agent`,"settings.agents.sidebar.toast.definitionNotFound":`Définition de l’agent introuvable. Aucune modification effectuée.`,"settings.agents.sidebar.toast.resetFailed":`Échec de la réinitialisation de l'agent`,"settings.agents.sidebar.toast.agentNameRequired":`Le nom de l'agent est requis`,"settings.agents.sidebar.toast.agentExists":`Un agent portant ce nom existe déjà`,"settings.agents.sidebar.toast.removeOldAfterRenameFailed":`Échec de la suppression de l'ancien agent après le changement de nom`,"settings.agents.sidebar.toast.renameFailed":`Échec du changement de nom de l'agent`,"settings.agents.sidebar.toast.agentRenamed":`Agent renommé en "{name}"`,"settings.agents.page.toast.permissionNameRequired":`Le nom de l'autorisation est requis`,"settings.agents.page.toast.created":`Agent créé avec succès`,"settings.agents.page.toast.updated":`Agent mis à jour avec succès`,"settings.agents.page.toast.createFailed":`Échec de la création de l'agent`,"settings.agents.page.toast.updateFailed":`Échec de la mise à jour de l'agent`,"settings.agents.page.toast.saveUnexpectedError":`Une erreur s'est produite lors de l'enregistrement`,"settings.agents.page.toast.savedManualRestart":`Enregistré sur le disque. Redémarrez votre serveur OpenCode connecté pour appliquer les modifications.`,"settings.agents.page.empty.title":`Sélectionnez un agent dans la barre latérale`,"settings.agents.page.empty.description":`ou créez-en un nouveau`,"settings.agents.page.title.new":`Nouvel agent`,"settings.agents.page.subtitle.new":`Configurer un nouveau personnage d'assistant`,"settings.agents.page.subtitle.edit":`Modifier les paramètres de l'agent`,"settings.agents.page.section.identityRole":`Identité et rôle`,"settings.agents.page.section.modelParameters":`Modèle`,"settings.agents.page.section.runtime":`Exécution`,"settings.agents.page.field.steps":`Limite d'étapes`,"settings.agents.page.field.stepsHint":`Vide signifie sans limite. À la limite, la requête suivante ne peut répondre qu’en texte.`,"settings.agents.page.field.hidden":`Masqué`,"settings.agents.page.field.hiddenHint":`Masque cet agent du sélecteur principal et des mentions @. La tâche peut encore l’appeler si les autorisations le permettent.`,"settings.agents.page.field.disabled":`Désactivé`,"settings.agents.page.field.disabledHint":`Retire cet agent du catalogue. Désactivez cette option et enregistrez pour le ramener dans la liste.`,"settings.agents.page.field.color":`Couleur`,"settings.agents.page.field.colorHint":`Couleur hexadécimale, par exemple #FF6B6B.`,"settings.agents.page.field.colorInvalid":`Saisissez une couleur hexadécimale comme #FF6B6B.`,"settings.agents.page.field.clearColorAria":`Effacer la couleur`,"settings.agents.page.field.modelHint":`Laissez vide pour garder le modèle de l’appelant. La variante est enregistrée avec le modèle.`,"settings.agents.page.system.inheritHint":`Vide conserve l’invite intégrée. Le texte ici la remplace. Les instructions du projet sont ajoutées ensuite.`,"settings.agents.page.apply.hint":`S’applique à la prochaine requête et aux nouvelles sessions. Une session déjà en cours garde son modèle.`,"settings.agents.page.legacy.convertible":`L’enregistrement convertit ce fichier d’agent au format actuel.`,"settings.agents.page.legacy.dropped":`Ces champs ne seront pas conservés : {fields}. Ils ne changent pas la prochaine requête.`,"settings.agents.page.legacy.confirmDrop":`Convertir et abandonner ces champs`,"settings.agents.page.toast.savedNextRequest":`Enregistré. La prochaine requête et les nouvelles sessions utilisent cet agent. Une session en cours garde son modèle.`,"settings.agents.page.section.systemPrompt":`Prompt système`,"settings.agents.page.section.toolPermissions":`Autorisations des outils`,"settings.agents.page.field.agentName":`Nom de l'agent`,"settings.agents.page.field.agentNamePlaceholder":`nom-agent`,"settings.agents.page.field.scope":`Portée`,"settings.agents.page.field.scopePlaceholder":`Portée`,"settings.agents.page.field.descriptionPlaceholder":`Que fait cet agent ?`,"settings.agents.page.field.mode":`Mode`,"settings.agents.page.field.modeTooltip":`Visibilité principale et sous-agent`,"settings.agents.page.field.overrideModel":`Remplacer le modèle`,"settings.agents.page.field.variant":`Variante de réflexion`,"settings.agents.page.field.variantTooltip":`Optionnel. Si le modèle prend en charge le raisonnement, la variante contrôle la profondeur du raisonnement.`,"settings.agents.page.field.variantHint":`Spécifique au modèle (par ex. variante Anthropic)`,"settings.agents.page.field.variantPlaceholder":`par ex. high, max, low, none`,"settings.agents.page.field.temperature":`Température`,"settings.agents.page.field.temperatureTooltip":`Contrôle le caractère aléatoire. Plus élevé = créatif, Inférieur = concentré.`,"settings.agents.page.field.temperatureRange":`0.0 à 2.0`,"settings.agents.page.field.clearTemperatureAria":`Effacer le remplacement de la température`,"settings.agents.page.field.topP":`Haut P`,"settings.agents.page.field.topPTooltip":`Diversité d'échantillonnage du noyau. Inférieur = jetons probables uniquement.`,"settings.agents.page.field.topPRange":`0.0 à 1.0`,"settings.agents.page.field.clearTopPAria":`Effacer le remplacement p supérieur`,"settings.agents.page.field.systemPromptPlaceholder":`Vous êtes un assistant expert en codage...`,"settings.agents.page.mode.primary":`Primaire`,"settings.agents.page.mode.subagent":`Sous-agent`,"settings.agents.page.mode.all":`Tous`,"settings.agents.page.permissions.defaultLabel":`Défaut`,"settings.agents.page.permissions.shell":`Shell`,"settings.agents.page.permissions.subagent":`Sous-agent`,"settings.agents.page.permissions.edit":`Modifier`,"settings.agents.page.permissions.externalDirectory":`Répertoire externe`,"settings.agents.page.permissions.question":`Question`,"settings.agents.page.permissions.read":`Lecture`,"settings.agents.page.permissions.glob":`Fichiers`,"settings.agents.page.permissions.grep":`Recherche`,"settings.agents.page.permissions.skill":`Compétence`,"settings.agents.page.permissions.webfetch":`Récupérer l'URL`,"settings.agents.page.permissions.websearch":`Recherche web`,"settings.agents.page.permissions.execute":`Exécuter`,"settings.agents.page.permissions.browser":`Navigateur`,"settings.agents.page.permissions.hideEditor":`Masquer l'éditeur`,"settings.agents.page.permissions.advancedEditor":`Éditeur avancé`,"settings.agents.page.permissions.globalSummary":`Mondial : {summary}`,"settings.agents.page.permissions.rulesSummary":`Règles : {summary}`,"settings.agents.page.permissions.globalDefault":`Valeur par défaut globale`,"settings.agents.page.permissions.pattern":`Modèle`,"settings.agents.page.permissions.addCustomRule":`Ajouter une règle personnalisée`,"settings.agents.page.permissions.permissionPlaceholder":`Autorisation...`,"settings.agents.page.permissions.patternPlaceholder":`Modèle (e.g. *)`,"settings.permissions.saved.retry":`Réessayer`,"settings.permissions.saved.title":`Autorisations de projet enregistrées`,"settings.permissions.saved.empty":`Aucune autorisation enregistrée pour ce projet`,"settings.permissions.saved.delete":`Supprimer`,"settings.permissions.saved.deleteFailed":`Impossible de supprimer l'autorisation enregistrée`,"settings.permissions.saved.loadFailed":`Impossible de charger les autorisations enregistrées`,"settings.agents.page.permissions.lastMatchHint":`La dernière règle correspondante l'emporte`,"settings.page.behavior.title":`Comportement`,"settings.behavior.page.title":`Comportement`,"settings.behavior.page.warning.title":`Les règles globales sont combinées avec les règles du projet`,"settings.behavior.page.warning.description":`Les modifications apportées ici mettent à jour {path}. OpenCode inclut également toutes les règles AGENTS.md au niveau du projet lorsqu'elles existent.`,"settings.behavior.page.section.systemPrompt":`Mondial AGENTS.md`,"settings.behavior.page.field.systemPromptPlaceholder":`Vous êtes un assistant IA utile...
1
+ var e={"sessions.order.saveFailed":`Impossible d’enregistrer l’ordre des conversations. Veuillez réessayer.`,"mobile.notifications.service":`Service de notifications des tâches en arrière-plan`,"mobile.notifications.connected":`Connexion maintenue pour recevoir les notifications des tâches lorsque l’application est en arrière-plan.`,"mobile.notifications.unavailable":`Impossible de démarrer les notifications en arrière-plan. Rouvrez l’application et réessayez.`,"mobile.notifications.auth":`Accès aux notifications refusé. Reconnectez ou associez à nouveau ce serveur.`,"mobile.notifications.endpoint":`Point d’accès aux notifications introuvable. Mettez à jour et redémarrez OpenChamberY sur votre ordinateur ; sinon, vérifiez le chemin du proxy.`,"mobile.notifications.response":`Le serveur n’a pas renvoyé de flux de notifications valide. Vérifiez la version de l’application sur l’ordinateur et la configuration du proxy.`,"mobile.notifications.server":`Le serveur est temporairement indisponible ou occupé. Nouvelle tentative automatique.`,"mobile.notifications.relay":`La connexion au relais est indisponible. Vérifiez qu’OpenChamberY est en ligne sur votre ordinateur ; nouvelle tentative automatique.`,"mobile.notifications.identity":`L’identité du serveur ne correspond pas à l’appareil associé. Reconnectez-le ou associez-le à nouveau.`,"mobile.notifications.gap":`Certaines notifications ont pu être manquées pendant la déconnexion. Ouvrez l’application pour consulter les résultats des tâches.`,"chat.chatInput.stopUnconfirmed":`L’arrêt n’est pas encore confirmé. Veuillez réessayer.`,"chat.response.rateLimit":`Limite de requêtes du fournisseur atteinte`,"chat.response.auth":`Échec de l’authentification du fournisseur. Reconnectez-vous et réessayez.`,"chat.response.quota":`Quota du fournisseur épuisé`,"chat.response.contentFilter":`Réponse bloquée par le fournisseur`,"chat.response.transport":`Échec de la connexion au fournisseur`,"chat.response.internal":`Erreur interne du fournisseur`,"chat.response.invalidOutput":`Réponse non valide du fournisseur`,"chat.response.invalidRequest":`Requête refusée par le fournisseur`,"chat.response.unsupportedOperation":`Opération non prise en charge par le fournisseur`,"chat.response.noRoute":`Modèle ou configuration du fournisseur indisponible`,"chat.response.providerUnknown":`Erreur du fournisseur`,"chat.response.timeout":`Délai de la requête au fournisseur dépassé`,"chat.response.permissionRejected":`Autorisation refusée`,"chat.response.toolExecution":`Échec de l’exécution de l’outil`,"chat.response.compactionFailed":`Échec de la compression du contexte`,"chat.response.compactionUnavailable":`Aucun contenu à compresser pour le moment`,"chat.response.compactionInterrupted":`Compression du contexte interrompue`,"chat.response.compactionCancelled":`Compression du contexte annulée`,"chat.response.stopped":`Arrêté par l’utilisateur`,"chat.response.interrupted":`Réponse interrompue`,"chat.response.toolInterrupted":`Exécution de l’outil interrompue`,"chat.response.resumeExhausted":`Récupération automatique arrêtée après des interruptions répétées`,"chat.response.retrying":`Nouvelle tentative automatique en cours`,"chat.response.failed":`Échec de l’exécution`,"chat.response.continuingAfterRestart":`Reprise après redémarrage`,"chat.queuedMessage.inheritsSessionSelection":`Hérite du modèle, de l’agent et de la variante de la session à l’exécution.`,"chat.sessionRecovery.awaitingConfirmation":`Service redémarré. En attente de confirmation de l’état de la tâche.`,"chat.btw.title":`Side Chat`,"chat.btw.failed":`La génération de la réponse a échoué. Veuillez réessayer.`,"chat.btw.description":`Posez une question sur la conversation en conservant son historique intact.`,"chat.btw.placeholder":`Posez une question dans Side Chat…`,"chat.btw.removeQuoteAria":`Retirer la citation`,"chat.message.conversationQuotesLabel":`Cité depuis la conversation`,"chat.btw.sessionRequired":`Ouvrez une conversation existante pour ouvrir Side Chat.`,"chat.btw.plainTextRequired":`Utilisez du texte brut. Vos références restent dans la zone de saisie.`,"chat.btw.pending":`Préparation de la réponse…`,"chat.btw.cancelled":`Réponse annulée. Réessayez pour poser la question à nouveau.`,"chat.btw.resize":`Redimensionner le panneau Side Chat`,"settings.voice.volcengine.save":`Enregistrer`,"settings.voice.volcengine.saveFailed":`Échec de l’enregistrement. Vos modifications sont conservées ; réessayez.`,"settings.voice.volcengine.loadFailed":`Impossible de charger les paramètres vocaux de ce serveur.`,"settings.voice.volcengine.retry":`Réessayer`,"chat.dictation.error.microphoneNotFound":`Aucun microphone détecté. Branchez-en un et réessayez.`,"settings.voice.volcengine.name":`Volcengine (Doubao)`,"settings.voice.volcengine.providerOption":`Volcengine Doubao (Recommandé | Payant)`,"settings.voice.volcengine.keyHelp":`Obtenir ici :`,"settings.voice.volcengine.openLink":`Cliquer pour ouvrir`,"settings.voice.volcengine.asrResource":`ID de ressource ASR en continu`,"settings.voice.volcengine.asrContext":`Contexte de reconnaissance`,"settings.voice.volcengine.asrContextHelp":`Décrivez le sujet et les termes utilisés. Videz pour désactiver ; enregistrez pour le prochain enregistrement. Maximum 2 000 caractères.`,"settings.voice.volcengine.custom":`ID personnalisé`,"settings.voice.volcengine.durationHelp":`Forfait horaire, facturé selon la durée de reconnaissance.`,"settings.voice.volcengine.concurrentHelp":`Forfait simultané, utilise la capacité achetée.`,"settings.voice.volcengine.resource":`ID de ressource TTS`,"settings.voice.volcengine.speaker":`ID de voix TTS`,"settings.voice.volcengine.asrTest":`Test du microphone`,"settings.voice.volcengine.testHelp":`Enregistrez avec les réglages actuels et consultez la transcription en direct.`,"settings.voice.volcengine.startRecording":`Démarrer l’enregistrement`,"settings.voice.volcengine.finishRecording":`Arrêter et transcrire`,"settings.voice.volcengine.recordingUnsupported":`Enregistrement indisponible ici. Utilisez HTTPS ou l’application mobile.`,"settings.voice.volcengine.fileLimit":`WAV, MP3 ou OGG, jusqu’à 20 Mo. Test de reconnaissance de fichiers, pas de sous-titres en direct.`,"settings.voice.volcengine.invalidTranscript":`Réponse de transcription invalide`,"settings.voice.volcengine.silence":`Aucune parole détectée`,"settings.voice.volcengine.stop":`Arrêter`,"settings.voice.volcengine.setup":`Ouvrir la console vocale`,"settings.remoteInstances.pairing.advanced":`Paramètres avancés`,"settings.remoteInstances.pairing.relayHint":`Configurez le serveur relais pour les connexions Internet. Il ne sert pas aux connexions locales directes.`,"settings.remoteInstances.pairing.downloadStep":`Installer l’app`,"settings.remoteInstances.pairing.name":`Nom du serveur`,"settings.remoteInstances.pairing.anywhere":`Chez vous ou ailleurs`,"settings.remoteInstances.pairing.lan":`Sur le même Wi-Fi`,"settings.remoteInstances.pairing.local":`Sur cet ordinateur`,"settings.remoteInstances.quick.sshTitle":`Travaillez sur un autre ordinateur`,"settings.remoteInstances.quick.sshHint":`Ajoutez une adresse SSH pour exécuter OpenChamberY sur un ordinateur distant et accéder à ses projets ici. Préparez vos identifiants SSH.`,"settings.remoteInstances.quick.emptyHint":`Connectez votre téléphone ou un autre ordinateur pour poursuivre votre travail où que vous soyez.`,"settings.remoteInstances.quick.title":`Appareils connectés`,"settings.remoteInstances.quick.error":`Impossible d’actualiser l’état des appareils.`,"settings.remoteInstances.quick.download":`Télécharger l’application OpenChamberY`,"settings.usage.magpie.url":`URL Magpie supplémentaire`,"settings.usage.magpie.description":`Magpie est détecté automatiquement sur ce serveur. Lancez Magpie, puis actualisez l’utilisation. Aucune configuration nécessaire.`,"settings.usage.magpie.connected":`Connecté · fournisseurs : {count}`,"settings.usage.magpie.manual":`Connecter un autre Magpie…`,"settings.usage.magpie.unavailable":`Magpie est temporairement indisponible. Actualisez pour réessayer.`,"settings.usage.magpie.cached":`Valeur en cache ; en attente de données récentes`,"settings.usage.magpie.save":`Enregistrer`,"settings.remoteInstances.clientAuth.edit.title":`Modifier l’appareil`,"settings.remoteInstances.clientAuth.edit.action":`Modifier`,"settings.remoteInstances.clientAuth.edit.name":`Nom de l’appareil`,"settings.openchamber.about.opencodeGuidance.manualGlobal":`Mettez à jour le CLI OpenCode configuré avec son gestionnaire de paquets, puis redémarrez le service.`,"settings.openchamber.about.opencodeGuidance.manualExternal":`Confiez la mise à jour et le redémarrage du service OpenCode externe à son responsable.`,"settings.openchamber.about.opencodeGuidance.bundled":`Mettez à jour OpenChamberY Desktop pour actualiser sa version intégrée d’OpenCode.`,"settings.chat.questionDelegate.label":`Déléguer automatiquement les questions en attente`,"settings.chat.questionDelegate.description":`Après 30 secondes sans réponse, demander au modèle de décider et de poursuivre. Interagir avec une question suspend son compte à rebours.`,"settings.chat.questionDelegate.saveFailed":`Échec de l’enregistrement. Vérifiez l’état actuel avant de réessayer.`,"settings.globalConfig.title":`Configuration globale`,"settings.globalConfig.description":`Modifiez les fichiers de configuration actifs dans ~/.config/opencode.`,"settings.globalConfig.actions.reload":`Recharger le fichier`,"settings.globalConfig.restartHint":`Redémarrez OpenCode après l’enregistrement pour appliquer les modifications de configuration.`,"settings.globalConfig.toast.loadFailed":`Échec du chargement du fichier de configuration`,"settings.globalConfig.toast.saveFailed":`Échec de l’enregistrement du fichier de configuration`,"settings.globalConfig.toast.saved":`Configuration enregistrée.`,"settings.providers.page.openCodeGo.title":`Suivi de l’utilisation d’OpenCode Go`,"settings.providers.page.openCodeGo.description":`Connectez le tableau de bord OpenCode Go pour afficher les quotas glissant, hebdomadaire et mensuel.`,"settings.providers.page.openCodeGo.workspaceId":`ID de l’espace de travail`,"settings.providers.page.openCodeGo.authCookie":`Cookie d’authentification`,"settings.providers.page.openCodeGo.consoleSignIn":`Se connecter avec OpenCode Console`,"settings.providers.page.openCodeGo.consoleConnected":`OpenCode Console est connecté. OpenCode Go peut utiliser ces identifiants.`,"settings.providers.page.openCodeGo.consoleHint":`OpenCode Go se connecte via OpenCode Console. Les clés de compte de service ci-dessous restent utilisables.`,"settings.providers.page.openCodeGo.help":`Copiez l’ID depuis l’URL du tableau de bord et le cookie auth depuis les outils du navigateur. OpenChamberY n’analyse jamais les cookies du navigateur.`,"settings.providers.page.openCodeGo.save":`Enregistrer et valider`,"settings.providers.page.openCodeGo.replace":`Remplacer`,"settings.providers.page.openCodeGo.validate":`Valider`,"settings.providers.page.openCodeGo.delete":`Supprimer`,"settings.providers.page.quotaCredentials.saved":`Identifiants de {provider} enregistrés.`,"settings.providers.page.openCodeGo.saveFailed":`Impossible de valider les identifiants OpenCode Go.`,"settings.providers.page.openCodeGo.valid":`Les identifiants OpenCode Go sont valides.`,"settings.providers.page.openCodeGo.invalid":`Les identifiants OpenCode Go sont invalides ou expirés.`,"settings.providers.page.openCodeGo.deleted":`Identifiants OpenCode Go supprimés.`,"settings.providers.page.openCodeGo.deleteFailed":`Impossible de supprimer les identifiants OpenCode Go.`,"settings.appearance.language.label":`Langue`,"settings.appearance.language.description":`Choisissez la langue de l'interface.`,"settings.appearance.language.select":`Sélectionnez la langue`,"settings.window.description":`Fenêtre des paramètres OpenChamberY.`,"settings.view.home.title":`Paramètres`,"settings.view.home.description":`Accédez aux pages communes.`,"settings.view.home.cards.providers.title":`Fournisseurs`,"settings.view.home.cards.providers.description":`Connecter les modèles + les identifiants`,"settings.view.home.cards.agents.title":`Configuration des agents`,"settings.view.home.cards.agents.description":`Invites, autorisations et contraintes d’exécution`,"settings.view.home.cards.skillsCatalog.title":`Catalogue de skills`,"settings.view.home.cards.skillsCatalog.description":`Installer des skills depuis des catalogues`,"settings.view.home.cards.mcp.title":`MCP`,"settings.view.home.cards.mcp.description":`Configurer les serveurs MCP + connexions`,"settings.view.home.cards.plugins.title":`Plugins`,"settings.view.home.cards.plugins.description":`Gérer les plugins OpenCode`,"settings.view.home.cards.usage.title":`Usage`,"settings.view.home.cards.usage.description":`Quota + visibilité des dépenses`,"settings.view.unavailable.title":`Pas disponible`,"settings.view.unavailable.description":`Cette page de paramètres n'est pas disponible dans ce runtime.`,"settings.view.badge.beta":`bêta`,"settings.view.actions.reloadOpenCode":`Recharger OpenCode`,"settings.view.actions.reloadOpenCodeTooltip":`Rechargez la configuration d’exécution d’OpenCode sans redémarrer le service.`,"settings.view.actions.backToSettings":`Retour aux paramètres`,"settings.view.actions.closeSettings":`Fermer les paramètres`,"settings.view.actions.openSectionList":`Ouvrir la liste des sections`,"settings.view.actions.closeSettingsWithShortcut":`Fermer les paramètres ({shortcut}+,)`,"settings.view.actions.back":`Retour`,"settings.view.actions.resizeNavigation":`Redimensionner la navigation dans les paramètres`,"settings.view.navigation.groups.connection":`Connexion`,"settings.view.navigation.groups.personalization":`Personnalisation`,"settings.view.navigation.groups.workspace":`Espace de travail`,"settings.view.navigation.groups.opencode":`OpenCode`,"settings.view.navigation.groups.content":`Contenu et automatisation`,"settings.view.navigation.groups.system":`Système`,"settings.page.projects.title":`Projets`,"settings.page.remoteInstances.title":`Instances distantes`,"settings.page.providers.title":`Fournisseurs`,"settings.page.usage.title":`Usage`,"settings.page.agents.title":`Configuration des agents`,"settings.page.commands.title":`Commandes`,"settings.page.mcp.title":`MCP`,"settings.page.plugins.title":`Plugins`,"settings.page.skills.title":`Skills`,"settings.page.skillsCatalog.title":`Catalogue de skills`,"settings.page.git.title":`Git`,"settings.page.appearance.title":`Apparence`,"settings.page.chat.title":`Chat`,"settings.page.shortcuts.title":`Raccourcis`,"settings.page.sessions.title":`Sessions`,"settings.page.archivedSessions.title":`Sessions archivées`,"settings.page.summaryAI.title":`Résumés IA`,"settings.page.magicPrompts.title":`Prompts magiques`,"settings.page.notifications.title":`Notifications`,"settings.page.voice.title":`Voix`,"settings.page.promptTemplates.title":`Modèles de prompt`,"settings.promptTemplates.sidebar.title":`Modèles de prompt`,"settings.promptTemplates.sidebar.total":`Total : {count}`,"settings.promptTemplates.sidebar.empty.title":`Aucun modèle de prompt`,"settings.promptTemplates.sidebar.empty.description":`Créez un modèle de prompt pour commencer.`,"settings.promptTemplates.sidebar.toast.deleted":`Modèle "{name}" supprimé`,"settings.promptTemplates.sidebar.toast.deleteFailed":`Échec de la suppression du modèle`,"settings.promptTemplates.sidebar.toast.nameRequired":`Le nom du modèle est obligatoire`,"settings.promptTemplates.sidebar.toast.renamed":`Modèle renommé`,"settings.promptTemplates.sidebar.toast.renameFailed":`Échec du changement de nom du modèle`,"settings.promptTemplates.sidebar.dialog.deleteTitle":`Supprimer le modèle ?`,"settings.promptTemplates.sidebar.dialog.deleteDescription":`Cela supprimera définitivement "{name}". Cette action ne peut pas être annulée.`,"settings.promptTemplates.sidebar.renameDialog.title":`Renommer le modèle`,"settings.promptTemplates.sidebar.renameDialog.description":`Entrez un nouveau nom pour "{name}".`,"settings.promptTemplates.sidebar.renameDialog.placeholder":`Nom du modèle`,"settings.promptTemplates.sidebar.badge.default":`défaut`,"settings.promptTemplates.page.empty.title":`Sélectionnez un modèle`,"settings.promptTemplates.page.empty.description":`Choisissez un modèle dans la barre latérale pour le modifier.`,"settings.promptTemplates.page.title.new":`Nouveau modèle`,"settings.promptTemplates.page.subtitle.edit":`Modifier le modèle`,"settings.promptTemplates.page.subtitle.new":`Créer un nouveau modèle de prompt`,"settings.promptTemplates.page.section.identity":`Identité`,"settings.promptTemplates.page.field.name":`Nom`,"settings.promptTemplates.page.field.namePlaceholder":`Nom du modèle`,"settings.promptTemplates.page.section.template":`Modèle`,"settings.promptTemplates.page.field.templatePlaceholder":`Saisissez le texte du modèle de prompt...`,"settings.promptTemplates.page.templateHint":`Ce texte sera ajouté au début du prompt de l'utilisateur lorsqu'il est sélectionné dans un groupe multi-run.`,"settings.promptTemplates.page.toast.nameRequired":`Le nom du modèle est obligatoire`,"settings.promptTemplates.page.toast.updated":`Modèle mis à jour`,"settings.promptTemplates.page.toast.updateFailed":`Échec de la mise à jour du modèle`,"settings.promptTemplates.page.toast.created":`Modèle créé`,"settings.promptTemplates.page.toast.createFailed":`Échec de la création du modèle`,"settings.promptTemplates.page.toast.saveUnexpectedError":`Une erreur inattendue s'est produite lors de l'enregistrement`,"settings.magicPrompts.sidebar.title":`Prompts magiques`,"settings.magicPrompts.sidebar.description":`Sélectionnez un modèle de prompt à modifier.`,"settings.magicPrompts.sidebar.group.git":`Git`,"settings.magicPrompts.sidebar.group.github":`GitHub`,"settings.magicPrompts.sidebar.group.session":`Session`,"settings.magicPrompts.sidebar.item.gitCommitGenerate":`Génération de commit`,"settings.magicPrompts.sidebar.item.gitPrGenerate":`Génération de PR`,"settings.magicPrompts.sidebar.item.gitConflictResolve":`Résolution des conflits de fusion/rebase`,"settings.magicPrompts.sidebar.item.gitCherrypickConflictResolve":`Résolution des conflits par sélection`,"settings.magicPrompts.sidebar.item.githubPrReview":`Revue de PR`,"settings.magicPrompts.sidebar.item.githubIssueReview":`Examen du problème`,"settings.magicPrompts.sidebar.item.githubPrFailedChecksReview":`Examen des checks PR en échec`,"settings.magicPrompts.sidebar.item.githubPrCommentsReview":`Examen des commentaires PR`,"settings.magicPrompts.sidebar.item.githubSinglePrCommentReview":`Examen des commentaires PR uniques`,"settings.magicPrompts.sidebar.item.sessionSummary":`Résumé de la session`,"settings.magicPrompts.sidebar.item.sessionWorkspaceReview":`Examen de l'espace de travail`,"settings.magicPrompts.sidebar.item.sessionFusion":`Fusion`,"settings.remoteInstances.sidebar.title":`Instances distantes`,"settings.remoteInstances.sidebar.description":`Connectez-vous à d’autres serveurs OpenChamberY via un lien d’import ou SSH.`,"settings.remoteInstances.sidebar.empty":`Aucune instance distante pour le moment. Importez un lien ou ajoutez une connexion SSH.`,"settings.remoteInstances.channel.link":`Lien`,"settings.remoteInstances.channel.ssh":`SSH`,"settings.remoteInstances.sidebar.total":`Total {count}`,"settings.remoteInstances.sidebar.newSshInstanceName":`Nouvelle instance SSH`,"settings.remoteInstances.sidebar.actions.addSshInstance":`Ajouter une instance SSH`,"settings.remoteInstances.sidebar.actions.connect":`Connecter`,"settings.remoteInstances.sidebar.actions.disconnect":`Déconnecter`,"settings.remoteInstances.sidebar.actions.retry":`Réessayer`,"settings.remoteInstances.sidebar.actions.remove":`Retirer`,"settings.remoteInstances.sidebar.confirm.localPortInUseRetry":`Le port local est déjà utilisé. Choisir un port local gratuit et réessayer ?`,"settings.remoteInstances.sidebar.toast.createFailed":`Échec de la création de l'instance SSH`,"settings.remoteInstances.sidebar.toast.retriedWithRandomPort":`Réessayé avec un port local aléatoire`,"settings.remoteInstances.sidebar.toast.connectFailed":`Échec de la connexion de l'instance`,"settings.remoteInstances.sidebar.toast.disconnectFailed":`Échec de la déconnexion de l'instance`,"settings.remoteInstances.sidebar.toast.retryFailed":`Échec de la nouvelle tentative de connexion`,"settings.remoteInstances.sidebar.toast.removeFailed":`Échec de la suppression de l'instance`,"settings.remoteInstances.sidebar.phase.ready":`Prêt`,"settings.remoteInstances.sidebar.phase.error":`Erreur`,"settings.remoteInstances.sidebar.phase.reconnect":`Reconnecter`,"settings.remoteInstances.sidebar.phase.installing":`Installation`,"settings.remoteInstances.sidebar.phase.updating":`Mise à jour`,"settings.remoteInstances.sidebar.phase.forwarding":`Transfert`,"settings.remoteInstances.sidebar.phase.starting":`Démarrage`,"settings.remoteInstances.sidebar.phase.connecting":`Connexion`,"settings.remoteInstances.sidebar.phase.idle":`Inactif`,"settings.remoteInstances.page.section.instance":`Instance`,"settings.remoteInstances.page.section.instanceDescription":`Paramètres de base du SSH.`,"settings.remoteInstances.page.field.mode":`Mode`,"settings.remoteInstances.page.field.modeHint":`Installations/mises à jour gérées et démarrage de OpenChamberY à distance. Externe suppose qu'il est déjà en cours d'exécution.`,"settings.remoteInstances.page.field.modePlaceholder":`Sélectionnez le mode`,"settings.remoteInstances.page.field.modeManaged":`Géré (démarrage automatique)`,"settings.remoteInstances.page.field.modeExternal":`Externe (déjà en cours d'exécution)`,"settings.remoteInstances.page.field.preferredRemotePort":`Port distant préféré`,"settings.remoteInstances.page.field.preferredRemotePortHint":`Le port OpenChamberY doit être utilisé sur l'hôte distant. Laissez vide pour laisser le runtime choisir.`,"settings.remoteInstances.page.field.keepServerRunning":`Maintenir le serveur en marche`,"settings.remoteInstances.page.field.keepServerRunningHint":`S'il est activé, le démon OpenChamberY continue de s'exécuter à distance lorsque vous vous déconnectez.`,"settings.remoteInstances.page.field.bindHost":`Lier l'hôte`,"settings.remoteInstances.page.field.bindHostHint":`Interface réseau pour l’URL locale principale. Utilisez 127.0.0.1/localhost pour un accès uniquement local.`,"settings.remoteInstances.page.field.preferredLocalPort":`Port local préféré`,"settings.remoteInstances.page.field.preferredLocalPortHint":`Port local préféré pour le tunnel principal OpenChamberY. Laissez vide pour la sélection automatique.`,"settings.remoteInstances.page.field.forwardType":`Type de transfert`,"settings.remoteInstances.page.field.localListen":`Écoute locale`,"settings.remoteInstances.page.field.localTarget":`Cible locale`,"settings.remoteInstances.page.field.remoteListen":`Écoute distante`,"settings.remoteInstances.page.field.remoteTarget":`Cible distante`,"settings.remoteInstances.page.field.localHostPlaceholder":`127.0.0.1`,"settings.remoteInstances.page.field.remoteHostPlaceholder":`127.0.0.1`,"settings.remoteInstances.page.field.auto":`Auto`,"settings.remoteInstances.page.confirm.bindAllInterfaces":`La liaison à 0.0.0.0 expose les ports transférés à votre réseau local. Continuer?`,"settings.remoteInstances.page.preview.localSocks5":`(SOCKS5 local)`,"settings.remoteInstances.page.preview.local":`(local)`,"settings.remoteInstances.page.preview.remote":`(hôte distant)`,"settings.remoteInstances.page.toast.openLocalEndpointFailed":`Échec de l'ouverture du point de terminaison local`,"settings.remoteInstances.page.toast.localUrlCopied":`URL locale copiée`,"settings.remoteInstances.page.actions.copyLocalUrl":`Copier l’URL locale`,"settings.remoteInstances.page.actions.open":`Ouvrir`,"settings.remoteInstances.page.logsDialog.selectedInstanceFallback":`Instance sélectionnée`,"settings.remoteInstances.page.patternDialog.descriptionWithHost":`{host} nécessite une destination concrète.`,"settings.remoteInstances.page.patternDialog.description":`Entrez la destination.`,"settings.common.actions.cancel":`Annuler`,"settings.common.actions.create":`Créer`,"settings.common.actions.delete":`Supprimer`,"settings.common.actions.reset":`Réinitialiser`,"settings.common.actions.rename":`Rebaptiser`,"settings.common.actions.duplicate":`Dupliquer`,"settings.common.actions.import":`Importer`,"settings.common.actions.copyAll":`Copier tout`,"settings.common.actions.clear":`Effacer`,"settings.common.actions.saving":`Enregistrement...`,"settings.common.actions.saveChanges":`Enregistrer les modifications`,"settings.common.scope.global":`Mondial`,"settings.common.scope.project":`Projet`,"settings.common.field.description":`Description`,"settings.common.badge.new":`Nouveau`,"settings.common.badge.modified":`Modifié`,"settings.common.permission.allow":`Permettre`,"settings.common.permission.ask":`Demander`,"settings.common.permission.deny":`Refuser`,"settings.common.state.comingSoon":`À venir...`,"settings.projects.actions.title":`Actions`,"settings.projects.actions.description":`Commandes par projet affichées dans l'en-tête à côté du nom du projet.`,"settings.projects.actions.validation.fillNameAndCommand":`Remplissez le nom de l'action et la commande avant d'enregistrer.`,"settings.projects.actions.state.loading":`Chargement...`,"settings.projects.actions.state.empty":`Aucune action configurée pour le moment.`,"settings.projects.actions.state.untitled":`Action sans titre`,"settings.projects.actions.state.noDesktopSshForwards":`Aucun transfert local SSH activé disponible.`,"settings.projects.actions.field.selectIconAria":`Sélectionner l'icône`,"settings.projects.actions.field.iconAria":`Icône {icon}`,"settings.projects.actions.field.actionNamePlaceholder":`Nom de l'action`,"settings.projects.actions.field.command":`Commande`,"settings.projects.actions.field.commandPlaceholder":`p. ex. bun install`,"settings.projects.actions.field.autoOpenUrl":`Ouverture automatique de l’URL`,"settings.projects.actions.field.autoOpenUrlForAria":`Ouverture automatique de l’URL pour {title}`,"settings.projects.actions.field.autoOpenUrlDescription":`Ouvrir l’URL détectée dans la sortie, ou l’URL personnalisée ci-dessous`,"settings.projects.actions.field.overrideUrlPlaceholder":`Remplacer URL (facultatif)`,"settings.projects.actions.field.overrideUrlTooltip":`Si ce champ est rempli, l’URL personnalisée est utilisée. Sinon, l'application ouvre la meilleure URL détectée dans la sortie.`,"settings.projects.actions.field.desktopSshForward":`Transfert SSH local`,"settings.projects.actions.field.useOutputManualUrl":`Utiliser l’URL de sortie ou l’URL manuelle`,"settings.projects.actions.actions.add":`Ajouter une action`,"settings.projects.actions.actions.save":`Enregistrer les actions`,"settings.projects.actions.toast.saveFailed":`Échec de l'enregistrement des actions`,"settings.projects.actions.toast.saved":`Actions du projet enregistrées`,"settings.openchamber.about.title":`À propos de OpenChamberY`,"settings.openchamber.about.field.version":`Version`,"settings.openchamber.about.field.clientVersion":`Client`,"settings.openchamber.about.field.webBundle":`Bundle web`,"settings.openchamber.about.field.instanceOpenChamberVersion":`OpenChamberY`,"settings.openchamber.about.field.instanceOpenCodeVersion":`OpenCode`,"settings.openchamber.about.state.checking":`Vérification...`,"settings.openchamber.about.state.upToDate":`À jour`,"settings.openchamber.about.state.builtin":`intégré`,"settings.openchamber.about.actions.checkUpdates":`Vérifier les mises à jour`,"settings.openchamber.about.actions.update":`Mise à jour`,"settings.openchamber.about.actions.updateToVersion":`Mise à jour vers {version}`,"settings.openchamber.about.actions.applyOtaToVersion":`Mettre à jour vers {version}`,"settings.openchamber.about.actions.installNativeToVersion":`Installer {version}`,"settings.openchamber.about.actions.checkForUpdates":`Vérifier les mises à jour`,"settings.openchamber.about.actions.submitFeedback":`Envoyer des commentaires`,"settings.openchamber.about.toast.latestVersion":`Vous êtes sur la dernière version`,"settings.openchamber.about.toast.checkFailed":`Impossible de vérifier les mises à jour`,"settings.openchamber.about.betaUpdates.label":`Rejoindre les mises à jour bêta`,"settings.openchamber.about.betaUpdates.description":`Recevez les mises à jour de l’application en avant-première sur cet appareil.`,"settings.openchamber.about.betaUpdates.rollback.title":`Revenir à la version stable ?`,"settings.openchamber.about.betaUpdates.rollback.description":`Vous utilisez une version bêta. La désactivation des mises à jour bêta ramènera OpenChamberY à la version stable v{version}. Redémarrez l’application pour appliquer ce changement.`,"settings.openchamber.about.betaUpdates.rollback.actions.cancel":`Garder la bêta`,"settings.openchamber.about.betaUpdates.rollback.actions.confirm":`Revenir à la version stable`,"settings.openchamber.about.diagnostics.label":`Journal de diagnostic`,"settings.openchamber.about.diagnostics.description":`Exporte les feat de diagnostic locaux pour analyser les problèmes d’affichage et de synchronisation. Aucun corps de message ni jeton n’est inclus.`,"settings.openchamber.about.diagnostics.export":`Exporter le journal`,"settings.openchamber.about.diagnostics.exporting":`Exportation…`,"settings.openchamber.about.diagnostics.enable":`Enregistrer les feat de diagnostic`,"settings.openchamber.about.diagnostics.enableHint":`Disponible dans les versions bêta. Enregistre sur cet appareil le cycle de synchronisation et d’affichage de la session, sans le corps du message.`,"settings.openchamber.about.diagnostics.toast.exported":`Journal de diagnostic exporté`,"settings.openchamber.about.diagnostics.toast.failed":`Impossible d’exporter le journal de diagnostic`,"settings.openchamber.about.diagnostics.toast.empty":`Journal de diagnostic exporté. Aucun événement n’a encore été enregistré.`,"settings.agents.sidebar.title":`Configuration des agents`,"settings.agents.sidebar.total":`Total {count}`,"settings.agents.sidebar.empty.title":`Aucun agent configuré`,"settings.agents.sidebar.empty.description":`Utilisez le bouton + ci-dessus pour en créer un`,"settings.agents.sidebar.section.builtIn":`Agents intégrés`,"settings.agents.sidebar.section.custom":`Agents personnalisés`,"settings.agents.sidebar.badge.system":`système`,"settings.agents.sidebar.badge.disabled":`Désactivé`,"settings.agents.sidebar.dialog.deleteTitle":`Supprimer un agent`,"settings.agents.sidebar.dialog.resetTitle":`Agent de réinitialisation`,"settings.agents.sidebar.dialog.deleteDescription":`Etes-vous sûr de vouloir supprimer l'agent "{name}" ?`,"settings.agents.sidebar.dialog.resetDescription":`Êtes-vous sûr de vouloir réinitialiser l'agent «\xA0{name}\xA0» à sa configuration par défaut ?`,"settings.agents.sidebar.renameDialog.title":`Renommer l'agent`,"settings.agents.sidebar.renameDialog.description":`Entrez un nouveau nom pour l'agent "@{name}"`,"settings.agents.sidebar.renameDialog.placeholder":`Nouveau nom d'agent...`,"settings.agents.sidebar.toast.builtInCannotDelete":`Les agents intégrés ne peuvent pas être supprimés`,"settings.agents.sidebar.toast.agentDeleted":`Agent "{name}" supprimé avec succès`,"settings.agents.sidebar.toast.agentReset":`Agent "{name}" réinitialisé aux valeurs par défaut`,"settings.agents.sidebar.toast.deleteFailed":`Échec de la suppression de l'agent`,"settings.agents.sidebar.toast.definitionNotFound":`Définition de l’agent introuvable. Aucune modification effectuée.`,"settings.agents.sidebar.toast.resetFailed":`Échec de la réinitialisation de l'agent`,"settings.agents.sidebar.toast.agentNameRequired":`Le nom de l'agent est requis`,"settings.agents.sidebar.toast.agentExists":`Un agent portant ce nom existe déjà`,"settings.agents.sidebar.toast.removeOldAfterRenameFailed":`Échec de la suppression de l'ancien agent après le changement de nom`,"settings.agents.sidebar.toast.renameFailed":`Échec du changement de nom de l'agent`,"settings.agents.sidebar.toast.agentRenamed":`Agent renommé en "{name}"`,"settings.agents.page.toast.permissionNameRequired":`Le nom de l'autorisation est requis`,"settings.agents.page.toast.created":`Agent créé avec succès`,"settings.agents.page.toast.updated":`Agent mis à jour avec succès`,"settings.agents.page.toast.createFailed":`Échec de la création de l'agent`,"settings.agents.page.toast.updateFailed":`Échec de la mise à jour de l'agent`,"settings.agents.page.toast.saveUnexpectedError":`Une erreur s'est produite lors de l'enregistrement`,"settings.agents.page.toast.savedManualRestart":`Enregistré sur le disque. Redémarrez votre serveur OpenCode connecté pour appliquer les modifications.`,"settings.agents.page.empty.title":`Sélectionnez un agent dans la barre latérale`,"settings.agents.page.empty.description":`ou créez-en un nouveau`,"settings.agents.page.title.new":`Nouvel agent`,"settings.agents.page.subtitle.new":`Configurer un nouveau personnage d'assistant`,"settings.agents.page.subtitle.edit":`Modifier les paramètres de l'agent`,"settings.agents.page.section.identityRole":`Identité et rôle`,"settings.agents.page.section.modelParameters":`Modèle`,"settings.agents.page.section.runtime":`Exécution`,"settings.agents.page.field.steps":`Limite d'étapes`,"settings.agents.page.field.stepsHint":`Vide signifie sans limite. À la limite, la requête suivante ne peut répondre qu’en texte.`,"settings.agents.page.field.hidden":`Masqué`,"settings.agents.page.field.hiddenHint":`Masque cet agent du sélecteur principal et des mentions @. La tâche peut encore l’appeler si les autorisations le permettent.`,"settings.agents.page.field.disabled":`Désactivé`,"settings.agents.page.field.disabledHint":`Retire cet agent du catalogue. Désactivez cette option et enregistrez pour le ramener dans la liste.`,"settings.agents.page.field.color":`Couleur`,"settings.agents.page.field.colorHint":`Couleur hexadécimale, par exemple #FF6B6B.`,"settings.agents.page.field.colorInvalid":`Saisissez une couleur hexadécimale comme #FF6B6B.`,"settings.agents.page.field.clearColorAria":`Effacer la couleur`,"settings.agents.page.field.modelHint":`Laissez vide pour garder le modèle de l’appelant. La variante est enregistrée avec le modèle.`,"settings.agents.page.system.inheritHint":`Vide conserve l’invite intégrée. Le texte ici la remplace. Les instructions du projet sont ajoutées ensuite.`,"settings.agents.page.apply.hint":`S’applique à la prochaine requête et aux nouvelles sessions. Une session déjà en cours garde son modèle.`,"settings.agents.page.legacy.convertible":`L’enregistrement convertit ce fichier d’agent au format actuel.`,"settings.agents.page.legacy.dropped":`Ces champs ne seront pas conservés : {fields}. Ils ne changent pas la prochaine requête.`,"settings.agents.page.legacy.confirmDrop":`Convertir et abandonner ces champs`,"settings.agents.page.toast.savedNextRequest":`Enregistré. La prochaine requête et les nouvelles sessions utilisent cet agent. Une session en cours garde son modèle.`,"settings.agents.page.section.systemPrompt":`Prompt système`,"settings.agents.page.section.toolPermissions":`Autorisations des outils`,"settings.agents.page.field.agentName":`Nom de l'agent`,"settings.agents.page.field.agentNamePlaceholder":`nom-agent`,"settings.agents.page.field.scope":`Portée`,"settings.agents.page.field.scopePlaceholder":`Portée`,"settings.agents.page.field.descriptionPlaceholder":`Que fait cet agent ?`,"settings.agents.page.field.mode":`Mode`,"settings.agents.page.field.modeTooltip":`Visibilité principale et sous-agent`,"settings.agents.page.field.overrideModel":`Remplacer le modèle`,"settings.agents.page.field.variant":`Variante de réflexion`,"settings.agents.page.field.variantTooltip":`Optionnel. Si le modèle prend en charge le raisonnement, la variante contrôle la profondeur du raisonnement.`,"settings.agents.page.field.variantHint":`Spécifique au modèle (par ex. variante Anthropic)`,"settings.agents.page.field.variantPlaceholder":`par ex. high, max, low, none`,"settings.agents.page.field.temperature":`Température`,"settings.agents.page.field.temperatureTooltip":`Contrôle le caractère aléatoire. Plus élevé = créatif, Inférieur = concentré.`,"settings.agents.page.field.temperatureRange":`0.0 à 2.0`,"settings.agents.page.field.clearTemperatureAria":`Effacer le remplacement de la température`,"settings.agents.page.field.topP":`Haut P`,"settings.agents.page.field.topPTooltip":`Diversité d'échantillonnage du noyau. Inférieur = jetons probables uniquement.`,"settings.agents.page.field.topPRange":`0.0 à 1.0`,"settings.agents.page.field.clearTopPAria":`Effacer le remplacement p supérieur`,"settings.agents.page.field.systemPromptPlaceholder":`Vous êtes un assistant expert en codage...`,"settings.agents.page.mode.primary":`Primaire`,"settings.agents.page.mode.subagent":`Sous-agent`,"settings.agents.page.mode.all":`Tous`,"settings.agents.page.permissions.defaultLabel":`Défaut`,"settings.agents.page.permissions.shell":`Shell`,"settings.agents.page.permissions.subagent":`Sous-agent`,"settings.agents.page.permissions.edit":`Modifier`,"settings.agents.page.permissions.externalDirectory":`Répertoire externe`,"settings.agents.page.permissions.question":`Question`,"settings.agents.page.permissions.read":`Lecture`,"settings.agents.page.permissions.glob":`Fichiers`,"settings.agents.page.permissions.grep":`Recherche`,"settings.agents.page.permissions.skill":`Compétence`,"settings.agents.page.permissions.webfetch":`Récupérer l'URL`,"settings.agents.page.permissions.websearch":`Recherche web`,"settings.agents.page.permissions.execute":`Exécuter`,"settings.agents.page.permissions.browser":`Navigateur`,"settings.agents.page.permissions.hideEditor":`Masquer l'éditeur`,"settings.agents.page.permissions.advancedEditor":`Éditeur avancé`,"settings.agents.page.permissions.globalSummary":`Mondial : {summary}`,"settings.agents.page.permissions.rulesSummary":`Règles : {summary}`,"settings.agents.page.permissions.globalDefault":`Valeur par défaut globale`,"settings.agents.page.permissions.pattern":`Modèle`,"settings.agents.page.permissions.addCustomRule":`Ajouter une règle personnalisée`,"settings.agents.page.permissions.permissionPlaceholder":`Autorisation...`,"settings.agents.page.permissions.patternPlaceholder":`Modèle (e.g. *)`,"settings.permissions.saved.retry":`Réessayer`,"settings.permissions.saved.title":`Autorisations de projet enregistrées`,"settings.permissions.saved.empty":`Aucune autorisation enregistrée pour ce projet`,"settings.permissions.saved.delete":`Supprimer`,"settings.permissions.saved.deleteFailed":`Impossible de supprimer l'autorisation enregistrée`,"settings.permissions.saved.loadFailed":`Impossible de charger les autorisations enregistrées`,"settings.agents.page.permissions.lastMatchHint":`La dernière règle correspondante l'emporte`,"settings.page.behavior.title":`Comportement`,"settings.behavior.page.title":`Comportement`,"settings.behavior.page.warning.title":`Les règles globales sont combinées avec les règles du projet`,"settings.behavior.page.warning.description":`Les modifications apportées ici mettent à jour {path}. OpenCode inclut également toutes les règles AGENTS.md au niveau du projet lorsqu'elles existent.`,"settings.behavior.page.section.systemPrompt":`Mondial AGENTS.md`,"settings.behavior.page.field.systemPromptPlaceholder":`Vous êtes un assistant IA utile...
2
2
 
3
3
  Utilisez cet espace pour définir des règles absolues sur la façon dont l'IA doit se comporter dans toutes les sessions et tous les fournisseurs.`,"settings.behavior.page.section.responseStyle":`Style de réponse`,"settings.behavior.page.responseStyle.tooltip":`Lorsqu'elles sont activées, ces instructions guident la manière dont l'assistant répond à chaque nouvelle conversation. Ils sont envoyés avec votre premier message et ne modifient pas vos règles globales AGENTS.md.`,"settings.behavior.page.responseStyle.enableAria":`Activer les instructions de style de réponse`,"settings.behavior.page.responseStyle.enable":`Ajouter des instructions de style de réponse aux nouvelles conversations`,"settings.behavior.page.responseStyle.preset":`Préréglage`,"settings.behavior.page.responseStyle.option.concise":`Concis`,"settings.behavior.page.responseStyle.option.detailed":`Détaillé`,"settings.behavior.page.responseStyle.option.mentor":`Mentor`,"settings.behavior.page.responseStyle.option.pushback":`Repoussement`,"settings.behavior.page.responseStyle.option.noFiller":`Pas de remplissage`,"settings.behavior.page.responseStyle.option.matchEnergy":`Correspond à mon énergie`,"settings.behavior.page.responseStyle.option.warmPeer":`Pair chaleureux`,"settings.behavior.page.responseStyle.option.custom":`Personnalisé`,"settings.behavior.page.responseStyle.customPlaceholder":`Écrivez l'instruction à ajouter au premier message...`,"settings.behavior.page.toast.saved":`Comportement enregistré avec succès`,"settings.behavior.page.toast.saveFailed":`Échec de l'enregistrement du comportement`,"settings.commands.sidebar.title":`Commandes`,"settings.commands.sidebar.total":`Total {count}`,"settings.commands.sidebar.empty.title":`Aucune commande configurée`,"settings.commands.sidebar.empty.description":`Utilisez le bouton + ci-dessus pour en créer un`,"settings.commands.sidebar.section.builtIn":`Commandes intégrées`,"settings.commands.sidebar.section.custom":`Commandes personnalisées`,"settings.commands.sidebar.dialog.deleteTitle":`Supprimer la commande`,"settings.commands.sidebar.dialog.resetTitle":`Commande de réinitialisation`,"settings.commands.sidebar.dialog.deleteDescription":`Etes-vous sûr de vouloir supprimer la commande «\xA0{name}\xA0» ?`,"settings.commands.sidebar.dialog.resetDescription":`Êtes-vous sûr de vouloir réinitialiser la commande «\xA0{name}\xA0» à sa configuration par défaut ?`,"settings.commands.sidebar.renameDialog.title":`Commande Renommer`,"settings.commands.sidebar.renameDialog.description":`Entrez un nouveau nom pour la commande "/{name}"`,"settings.commands.sidebar.renameDialog.placeholder":`Nouveau nom de commande...`,"settings.commands.sidebar.toast.builtInCannotDelete":`Les commandes intégrées ne peuvent pas être supprimées`,"settings.commands.sidebar.toast.commandDeleted":`Commande "{name}" supprimée avec succès`,"settings.commands.sidebar.toast.commandReset":`Commande "{name}" réinitialisée aux valeurs par défaut`,"settings.commands.sidebar.toast.deleteFailed":`Échec de la suppression de la commande`,"settings.commands.sidebar.toast.resetFailed":`Échec de la réinitialisation de la commande`,"settings.commands.sidebar.toast.commandNameRequired":`Le nom de la commande est obligatoire`,"settings.commands.sidebar.toast.commandExists":`Une commande portant ce nom existe déjà`,"settings.commands.sidebar.toast.removeOldAfterRenameFailed":`Échec de la suppression de l'ancienne commande après le changement de nom`,"settings.commands.sidebar.toast.renameFailed":`Échec du renommage de la commande`,"settings.commands.page.toast.templateRequired":`Le modèle de commande est requis`,"settings.commands.page.toast.created":`Commande créée avec succès`,"settings.commands.page.toast.updated":`Commande mise à jour avec succès`,"settings.commands.page.toast.createFailed":`Échec de la création de la commande`,"settings.commands.page.toast.updateFailed":`Échec de la mise à jour de la commande`,"settings.commands.page.toast.saveUnexpectedError":`Une erreur s'est produite lors de l'enregistrement`,"settings.commands.page.empty.title":`Sélectionnez une commande dans la barre latérale`,"settings.commands.page.empty.description":`ou créez-en un nouveau`,"settings.commands.page.title.new":`Nouvelle commande`,"settings.commands.page.subtitle.new":`Configurer une nouvelle commande slash`,"settings.commands.page.subtitle.edit":`Modifier les paramètres de la commande`,"settings.commands.page.section.identity":`Identité`,"settings.commands.page.section.executionContext":`Contexte d'exécution`,"settings.commands.page.section.template":`Modèle de commande`,"settings.commands.page.field.commandName":`Nom de la commande`,"settings.commands.page.field.commandNamePlaceholder":`nom-commande`,"settings.commands.page.field.descriptionPlaceholder":`Que fait cette commande ?`,"settings.commands.page.field.overrideAgent":`Remplacer l'agent`,"settings.commands.page.field.templatePlaceholder":`Votre modèle de commande ici...
4
4
 
@@ -1,4 +1,4 @@
1
- import{n as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,n}from"./runtime-switch-3ad3yzM7.js";import{n as r}from"./runtime-fetch-QCWYlAx0.js";import{Mn as i}from"./persistence-B7ORJ371.js";import{$ as a,A as o,C as s,F as c,G as l,J as u,K as d,L as f,M as p,N as m,Nt as ee,O as te,Q as ne,R as re,S as ie,T as ae,X as oe,Y as h,Z as se,_ as ce,at as le,b as ue,c as de,d as fe,gt as pe,h as me,ht as he,it as ge,lt as _e,m as ve,nt as ye,o as be,pt as xe,rt as Se,u as Ce,ut as we,v as Te,vt as Ee,w as De,x as Oe,xt as ke,yt as Ae,z as je}from"./platform-CiBU2bCp.js";import{ba as g,d as _,fa as v,l as Me}from"./useMobileNavigationStore-CYheYCC_.js";var Ne=e({COMMIT_DIFF_FILE_LIMIT:()=>30,COMMIT_DIFF_TOTAL_CHAR_LIMIT:()=>j,SESSION_GENERATE_TIMEOUT_MS:()=>M,applyGitStash:()=>K,checkIsGitRepository:()=>x,checkoutCommit:()=>$e,cherryPick:()=>et,collectSelectedFileDiffs:()=>N,countGitStashFiles:()=>W,createBranch:()=>Y,createGitIdentity:()=>Q,createGitWorktree:()=>B,deleteGitIdentity:()=>Je,deleteGitWorktree:()=>V,deleteRemoteBranch:()=>A,discoverGitCredentials:()=>Ye,discoverGitRepositories:()=>S,dropGitStash:()=>J,generateCommitMessage:()=>F,getCommitFileDiff:()=>X,getConflictDetails:()=>$,getGitBranches:()=>k,getGitIdentities:()=>Z,getGitStatus:()=>C,getGitWorktreeBootstrapStatus:()=>R,getGlobalGitIdentity:()=>Xe,git:()=>H,listGitStashes:()=>U,listGitWorktrees:()=>I,merge:()=>Qe,popGitStash:()=>q,previewGitWorktree:()=>z,rebase:()=>Ze,resetToCommit:()=>nt,resolveGitPrimaryRoot:()=>w,resolveGitTopLevel:()=>T,revertCommit:()=>tt,stageGitFile:()=>E,stageGitFiles:()=>D,stashGitChanges:()=>G,unstageGitFile:()=>Pe,unstageGitFiles:()=>O,updateGitIdentity:()=>qe,validateGitWorktree:()=>L}),y=()=>i()?.git??null,b=e=>{let t=e.trim(),n=(t.match(/```(?:json)?\s*([\s\S]*?)```/i)?.[1]??t).trim(),r=[n.indexOf(`{`)].filter(e=>e>=0);for(let e of r)for(let t=n.length;t>e;--t)if(n[t-1]===`}`)try{let r=JSON.parse(n.slice(e,t));if(r&&typeof r==`object`&&!Array.isArray(r))return r}catch{}return null};async function x(e){let t=y();return t?t.checkIsGitRepository(e):de(e)}async function S(e){return De(e)}async function C(e,t){let n=y();return n?n.getGitStatus(e,t):f(e,t)}async function w(e){return(await Se(e)).root}async function T(e){return(await ge(e)).root}async function E(e,t){let n=y();return n?.stageGitFile?n.stageGitFile(e,t):_e(e,t)}async function D(e,t){let n=y();return n?.stageGitFiles?n.stageGitFiles(e,t):we(e,t)}async function Pe(e,t){let n=y();return n?.unstageGitFile?n.unstageGitFile(e,t):he(e,t)}async function O(e,t){let n=y();return n?.unstageGitFiles?n.unstageGitFiles(e,t):pe(e,t)}async function k(e,t){let n=y();if(t?.signal?.throwIfAborted(),n){let r=await n.getGitBranches(e,t);return t?.signal?.throwIfAborted(),r}return p(e,t)}async function A(e,t){let n=y();return n?n.deleteRemoteBranch(e,t):ie(e,t)}var j=12e4,M=9e4,Fe=[`This is an auxiliary structured generation request (git copy).`,`Use the active session context plus the materials below.`,`Answer with the required JSON only.`,`Do not call any tools and do not take any actions.`,`Model and instructions follow the session.generate session contract.`].join(` `),Ie=`Select an active session for generation. session.generate uses that session model contract and does not mutate chat history.`,Le=`No default provider or model configured. Please select a provider and model in settings first.`,Re=`Runtime changed during session.generate`,ze=`session.generate returned empty text`,Be=`session.generate returned invalid structured output`,Ve=e=>{let t=[`Diff budget: included ${e.includedFileCount} of ${e.selectedFileCount} selected files`,`fileLimit=${e.fileLimit}`,`charLimit=${e.charLimit}`,`truncatedByCharLimit=${e.truncatedByCharLimit?`yes`:`no`}`,`omittedFiles=${e.omittedFileCount}`],n=e.omittedFileCount>0||e.truncatedByCharLimit?` Materials are partial under this budget — do not invent diffs for omitted or truncated files; base the message only on provided material.`:` Materials cover the full selected set within the budget.`;return`${t.join(`; `)}.${n}`};async function N(e,t){let n=t.length,r=t.slice(0,30),i=await Promise.all(r.map(async t=>{try{let[n,r]=await Promise.all([m(e,{path:t,staged:!0}).catch(()=>null),m(e,{path:t,staged:!1}).catch(()=>null)]);return[n?.diff,r?.diff].filter(e=>typeof e==`string`&&e.trim().length>0).join(`
1
+ import{n as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,n}from"./runtime-switch-3ad3yzM7.js";import{n as r}from"./runtime-fetch-QCWYlAx0.js";import{Mn as i}from"./persistence-B7ORJ371.js";import{$ as a,A as o,C as s,F as c,G as l,J as u,K as d,L as f,M as p,N as m,Nt as ee,O as te,Q as ne,R as re,S as ie,T as ae,X as oe,Y as h,Z as se,_ as ce,at as le,b as ue,c as de,d as fe,gt as pe,h as me,ht as he,it as ge,lt as _e,m as ve,nt as ye,o as be,pt as xe,rt as Se,u as Ce,ut as we,v as Te,vt as Ee,w as De,x as Oe,xt as ke,yt as Ae,z as je}from"./platform-CiBU2bCp.js";import{Sa as g,d as _,l as Me,ma as v}from"./useMobileNavigationStore-B4hTCxg2.js";var Ne=e({COMMIT_DIFF_FILE_LIMIT:()=>30,COMMIT_DIFF_TOTAL_CHAR_LIMIT:()=>j,SESSION_GENERATE_TIMEOUT_MS:()=>M,applyGitStash:()=>K,checkIsGitRepository:()=>x,checkoutCommit:()=>$e,cherryPick:()=>et,collectSelectedFileDiffs:()=>N,countGitStashFiles:()=>W,createBranch:()=>Y,createGitIdentity:()=>Q,createGitWorktree:()=>B,deleteGitIdentity:()=>Je,deleteGitWorktree:()=>V,deleteRemoteBranch:()=>A,discoverGitCredentials:()=>Ye,discoverGitRepositories:()=>S,dropGitStash:()=>J,generateCommitMessage:()=>F,getCommitFileDiff:()=>X,getConflictDetails:()=>$,getGitBranches:()=>k,getGitIdentities:()=>Z,getGitStatus:()=>C,getGitWorktreeBootstrapStatus:()=>R,getGlobalGitIdentity:()=>Xe,git:()=>H,listGitStashes:()=>U,listGitWorktrees:()=>I,merge:()=>Qe,popGitStash:()=>q,previewGitWorktree:()=>z,rebase:()=>Ze,resetToCommit:()=>nt,resolveGitPrimaryRoot:()=>w,resolveGitTopLevel:()=>T,revertCommit:()=>tt,stageGitFile:()=>E,stageGitFiles:()=>D,stashGitChanges:()=>G,unstageGitFile:()=>Pe,unstageGitFiles:()=>O,updateGitIdentity:()=>qe,validateGitWorktree:()=>L}),y=()=>i()?.git??null,b=e=>{let t=e.trim(),n=(t.match(/```(?:json)?\s*([\s\S]*?)```/i)?.[1]??t).trim(),r=[n.indexOf(`{`)].filter(e=>e>=0);for(let e of r)for(let t=n.length;t>e;--t)if(n[t-1]===`}`)try{let r=JSON.parse(n.slice(e,t));if(r&&typeof r==`object`&&!Array.isArray(r))return r}catch{}return null};async function x(e){let t=y();return t?t.checkIsGitRepository(e):de(e)}async function S(e){return De(e)}async function C(e,t){let n=y();return n?n.getGitStatus(e,t):f(e,t)}async function w(e){return(await Se(e)).root}async function T(e){return(await ge(e)).root}async function E(e,t){let n=y();return n?.stageGitFile?n.stageGitFile(e,t):_e(e,t)}async function D(e,t){let n=y();return n?.stageGitFiles?n.stageGitFiles(e,t):we(e,t)}async function Pe(e,t){let n=y();return n?.unstageGitFile?n.unstageGitFile(e,t):he(e,t)}async function O(e,t){let n=y();return n?.unstageGitFiles?n.unstageGitFiles(e,t):pe(e,t)}async function k(e,t){let n=y();if(t?.signal?.throwIfAborted(),n){let r=await n.getGitBranches(e,t);return t?.signal?.throwIfAborted(),r}return p(e,t)}async function A(e,t){let n=y();return n?n.deleteRemoteBranch(e,t):ie(e,t)}var j=12e4,M=9e4,Fe=[`This is an auxiliary structured generation request (git copy).`,`Use the active session context plus the materials below.`,`Answer with the required JSON only.`,`Do not call any tools and do not take any actions.`,`Model and instructions follow the session.generate session contract.`].join(` `),Ie=`Select an active session for generation. session.generate uses that session model contract and does not mutate chat history.`,Le=`No default provider or model configured. Please select a provider and model in settings first.`,Re=`Runtime changed during session.generate`,ze=`session.generate returned empty text`,Be=`session.generate returned invalid structured output`,Ve=e=>{let t=[`Diff budget: included ${e.includedFileCount} of ${e.selectedFileCount} selected files`,`fileLimit=${e.fileLimit}`,`charLimit=${e.charLimit}`,`truncatedByCharLimit=${e.truncatedByCharLimit?`yes`:`no`}`,`omittedFiles=${e.omittedFileCount}`],n=e.omittedFileCount>0||e.truncatedByCharLimit?` Materials are partial under this budget — do not invent diffs for omitted or truncated files; base the message only on provided material.`:` Materials cover the full selected set within the budget.`;return`${t.join(`; `)}.${n}`};async function N(e,t){let n=t.length,r=t.slice(0,30),i=await Promise.all(r.map(async t=>{try{let[n,r]=await Promise.all([m(e,{path:t,staged:!0}).catch(()=>null),m(e,{path:t,staged:!1}).catch(()=>null)]);return[n?.diff,r?.diff].filter(e=>typeof e==`string`&&e.trim().length>0).join(`
2
2
  `)||`--- ${t} (no textual diff available)`}catch{return`--- ${t} (diff unavailable)`}})),a=``,o=0,s=!1;for(let e of i){let t=a?`
3
3
 
4
4
  `:``;if(a.length+t.length+e.length>12e4){a+=`
@@ -1 +1 @@
1
- import"./rolldown-runtime-hePW80VL.js";import{it as e,rt as t}from"./vendor-base-ui-CdzJ6My_.js";import{n}from"./vendor-react-BP2cRVqX.js";import{r}from"./button-DOrwfkre.js";var i=n();e();var a=t();function o(e){let t=(0,i.c)(10),n,o,s;t[0]===e?(n=t[1],o=t[2],s=t[3]):({className:n,type:s,...o}=e,t[0]=e,t[1]=n,t[2]=o,t[3]=s);let c;t[4]===n?c=t[5]:(c=r(`text-foreground file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground bg-[var(--surface-elevated)] appearance-none flex h-9 w-full min-w-0 rounded-lg px-3 py-1 typography-markdown outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:typography-ui-label file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:typography-ui-label`,`ring-1 ring-inset ring-border/60 transition duration-200 ease-out`,`hover:[&:not(:focus)]:bg-[var(--surface-subtle)] hover:[&:not(:focus)]:ring-transparent`,`focus:ring-2 focus:ring-[var(--interactive-focus-ring)] focus-visible:outline-none`,`aria-invalid:ring-[var(--status-error)] aria-invalid:focus:ring-[var(--status-error)]`,n),t[4]=n,t[5]=c);let l;return t[6]!==o||t[7]!==c||t[8]!==s?(l=(0,a.jsx)(`input`,{type:s,"data-slot":`input`,className:c,spellCheck:!1,autoComplete:`off`,autoCorrect:`off`,autoCapitalize:`off`,...o}),t[6]=o,t[7]=c,t[8]=s,t[9]=l):l=t[9],l}export{o as t};
1
+ import"./rolldown-runtime-hePW80VL.js";import{it as e,rt as t}from"./vendor-base-ui-CdzJ6My_.js";import{n}from"./vendor-react-BP2cRVqX.js";import{r}from"./button-BidoKJDv.js";var i=n();e();var a=t();function o(e){let t=(0,i.c)(10),n,o,s;t[0]===e?(n=t[1],o=t[2],s=t[3]):({className:n,type:s,...o}=e,t[0]=e,t[1]=n,t[2]=o,t[3]=s);let c;t[4]===n?c=t[5]:(c=r(`text-foreground file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground bg-[var(--surface-elevated)] appearance-none flex h-9 w-full min-w-0 rounded-lg px-3 py-1 typography-markdown outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:typography-ui-label file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:typography-ui-label`,`ring-1 ring-inset ring-border/60 transition duration-200 ease-out`,`hover:[&:not(:focus)]:bg-[var(--surface-subtle)] hover:[&:not(:focus)]:ring-transparent`,`focus:ring-2 focus:ring-[var(--interactive-focus-ring)] focus-visible:outline-none`,`aria-invalid:ring-[var(--status-error)] aria-invalid:focus:ring-[var(--status-error)]`,n),t[4]=n,t[5]=c);let l;return t[6]!==o||t[7]!==c||t[8]!==s?(l=(0,a.jsx)(`input`,{type:s,"data-slot":`input`,className:c,spellCheck:!1,autoComplete:`off`,autoCorrect:`off`,autoCapitalize:`off`,...o}),t[6]=o,t[7]=c,t[8]=s,t[9]=l):l=t[9],l}export{o as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{c as t,i as n}from"./runtime-switch-3ad3yzM7.js";import{Mn as r,N as i,P as a,h as o,ln as s,m as c}from"./persistence-B7ORJ371.js";import{a as l,i as u,r as d}from"./vendor-zustand-o69pgTEK.js";import{it as f,rt as p}from"./vendor-base-ui-CdzJ6My_.js";import{B as m,Ct as h,M as g,Mt as _}from"./platform-CiBU2bCp.js";import{b as v,n as ee,x as y}from"./useUIStore-CDMI_Yzu.js";import{n as b}from"./vendor-react-BP2cRVqX.js";import{s as x}from"./vendor-tanstack-react-query-CdqCAt40.js";import{n as S}from"./vendor-reactuses-core-BpfIZ1tg.js";import{f as te,r as C,u as ne}from"./button-BidoKJDv.js";import{Mr as re,S as ie,Sa as ae,Tr as oe,Vt as w,Wn as T,ct as se,d as E,dt as ce,gt as le,ln as ue,lo as de,lt as fe,qa as pe,uo as D,ut as me,y as he,yn as ge}from"./useMobileNavigationStore-B4hTCxg2.js";import{n as O}from"./Icon-Ck4jqC3w.js";import{g as _e,v as ve}from"./gitApi-BOOTkw_q.js";import{f as ye,o as be}from"./projectMeta-DAdDjK8k.js";import{n as xe}from"./textarea-BJAl-1yB.js";import{n as Se,r as Ce,t as we}from"./fileMentionTouchSelection-GJdFmrrQ.js";var Te=e=>{switch(e.name){case`new`:return`add`;case`init`:return`file`;case`undo`:return`arrow-go-back`;case`redo`:return`arrow-go-forward`;case`timeline`:return`time`;case`compact`:return`scissors`;case`reload`:return`refresh`;case`goal`:return`target`;case`review`:return`search-eye`;case`test`:case`build`:case`run`:return`terminal-box`;default:return e.isBuiltIn?`flashlight`:`command`}},Ee=()=>`book-open`,De=e=>{if(e.isDirectory)return`folder-3-fill`;switch(e.extension?.toLowerCase()){case`ts`:case`tsx`:case`js`:case`jsx`:case`json`:return`code`;case`md`:case`mdx`:return`file`;case`png`:case`jpg`:case`jpeg`:case`gif`:case`svg`:return`file-image`;default:return`file-pdf`}},k=()=>`ai-agent`,Oe=()=>`chat-thread`,ke=(e,t)=>e.map(e=>{let n=e.isSkill?t.skill:e.isOpenChamber?`OpenChamberY`:e.isBuiltIn?t.system:e.scope||e.agent||t.command;return{id:e.id,title:`/${e.name}`,subtitle:e.description,badge:n,iconName:Te(e)}}),Ae=({skills:e=[],agents:t,sessions:n,recentFiles:r,pathHits:i,untitledSession:a,sessionBadge:o,skillBadge:s})=>{let c=[];for(let t of e)c.push({id:`skill:${t.name}-${t.scope}`,title:`@${t.name}`,subtitle:t.description,badge:s??t.scope,iconName:Ee()});for(let e of t)c.push({id:`agent:${e.name}`,title:`@${e.name}`,subtitle:e.description,iconName:k()});for(let e of n)c.push({id:`session:${e.id}`,title:e.title||a,badge:o,iconName:Oe()});for(let e of r)c.push({id:`recent:${e.path}`,title:e.relativePath||e.name,iconName:De(e)});for(let e of i)c.push({id:`file:${e.path}`,title:e.relativePath||e.name,iconName:De(e)});return c},je=(e,t)=>{let n=t.trim();if(!n.length)return[...e].sort((e,t)=>e.scope===`project`&&t.scope!==`project`?-1:e.scope!==`project`&&t.scope===`project`?1:e.name.localeCompare(t.name));let r=T([...e],n,e=>[e.name,e.description??``]);return r.sort((e,t)=>e.score===t.score?e.item.scope===`project`&&t.item.scope!==`project`?-1:e.item.scope!==`project`&&t.item.scope===`project`?1:e.item.name.localeCompare(t.item.name):e.score-t.score),r.map(e=>e.item)},Me=(e,t)=>{let n=t.trim();if(!n)return[...e].sort((e,t)=>e.isBuiltIn===t.isBuiltIn?e.name.localeCompare(t.name):e.isBuiltIn?-1:1);let r=T([...e],n,e=>[e.name,e.description??``]);return r.sort((e,t)=>e.score===t.score?e.item.isBuiltIn===t.item.isBuiltIn?e.item.name.localeCompare(t.item.name):e.item.isBuiltIn?-1:1:e.score-t.score),r.map(e=>e.item)},Ne=(e,t)=>e===t||e.length===t.length&&e.every((e,n)=>{let r=t[n];return r!=null&&e.id===r.id&&e.title===r.title&&(e.subtitle??``)===(r.subtitle??``)&&(e.badge??``)===(r.badge??``)&&e.iconName===r.iconName}),Pe=(e,t)=>e.highlightedIndex===t.highlightedIndex&&Ne(e.rows,t.rows),Fe=(e,t)=>Ne(e,t)?e:t.slice(),Ie=(e,t,n)=>{e&&(t.current&&Pe(t.current,n)||(t.current=n,e(n)))},Le=(e,t)=>{t.current=null,e?.({rows:[],highlightedIndex:0})},A=e(f(),1),j=e=>{if(!e)return``;let t=e.replace(/\\/g,`/`),n=t.startsWith(`//`),r=t.replace(/\/+/g,`/`);n&&!r.startsWith(`//`)&&(r=`/${r}`);let i=r===`/`,a=/^[A-Za-z]:\/$/.test(r);return!i&&!a&&(r=r.replace(/\/+$/,``)),r},M=e=>/^[A-Za-z]:\//.test(e)?e.toLowerCase():e,N=(e,t)=>{let n=j(t),r=j(e);if(!n||!r)return!1;let i=M(n),a=M(r);return a===i||a.startsWith(`${i}/`)},Re=e=>{if(!e||typeof e!=`object`)return{};let t=e,n={};for(let[e,r]of Object.entries(t)){let t=j(e);if(!t||!r||typeof r!=`object`)continue;let i=r,a=Array.isArray(i.openPaths)?Array.from(new Set(i.openPaths.filter(e=>typeof e==`string`).map(e=>j(e)).filter(e=>N(e,t)))):[],o=Array.isArray(i.expandedPaths)?Array.from(new Set(i.expandedPaths.filter(e=>typeof e==`string`).map(e=>j(e)).filter(e=>N(e,t)))):[],s=typeof i.selectedPath==`string`?j(i.selectedPath):null,c=s&&N(s,t)?s:a[0]??null,l=typeof i.touchedAt==`number`&&Number.isFinite(i.touchedAt)?i.touchedAt:Date.now(),u=n[t];if(u){let e=Array.from(new Set([...u.openPaths,...a])),r=Array.from(new Set([...u.expandedPaths,...o]));n[t]={openPaths:e,selectedPath:u.selectedPath??c??e[0]??null,expandedPaths:r,touchedAt:Math.max(u.touchedAt,l)};continue}n[t]={openPaths:a,selectedPath:c,expandedPaths:o,touchedAt:l}}return n},P=(e,t)=>{let n=Object.entries(e);if(n.length<=t)return e;n.sort((e,t)=>(t[1]?.touchedAt??0)-(e[1]?.touchedAt??0));let r={};for(let[e,i]of n.slice(0,t))r[e]=i;return r},F=e=>e?{...e,touchedAt:Date.now()}:{openPaths:[],selectedPath:null,expandedPaths:[],touchedAt:Date.now()},ze=l()(d(u((e,t)=>({byRoot:{},addOpenPath:(t,n,r)=>{let i=j((t||``).trim()),a=j((n||``).trim());!i||!a||!r?.allowOutsideRoot&&!N(a,i)||e(e=>{let t=e.byRoot[i],n=F(t),r=n.openPaths.includes(a),o=r?n.openPaths:[...n.openPaths,a],s=n.selectedPath??a;return t&&r&&t.selectedPath===s?e:{byRoot:P({...e.byRoot,[i]:{...n,openPaths:o,selectedPath:s}},20)}})},removeOpenPath:(t,n)=>{let r=j((t||``).trim()),i=j((n||``).trim());!r||!i||e(e=>{let t=e.byRoot[r];if(!t)return e;let n=M(i),a=e=>M(e)===n,o=t.selectedPath?a(t.selectedPath):!1;if(!t.openPaths.some(a)&&!o)return e;let s=t.openPaths.filter(e=>!a(e)),c=o?s[0]??null:t.selectedPath;return{byRoot:P({...e.byRoot,[r]:{...t,openPaths:s,selectedPath:c,touchedAt:Date.now()}},20)}})},removeOpenPathsByPrefix:(t,n)=>{let r=j((t||``).trim()),i=j((n||``).trim());!r||!i||e(e=>{let t=e.byRoot[r];if(!t)return e;let n=M(i),a=n.endsWith(`/`)?n:`${n}/`,o=e=>{let t=M(e);return t===n||t.startsWith(a)},s=t.openPaths.filter(e=>!o(e));if(s.length===t.openPaths.length)return e;let c=t.selectedPath&&o(t.selectedPath)?s[0]??null:t.selectedPath;return{byRoot:P({...e.byRoot,[r]:{...t,openPaths:s,selectedPath:c,touchedAt:Date.now()}},20)}})},removeExpandedPathsByPrefix:(t,n)=>{let r=j((t||``).trim()),i=j((n||``).trim());!r||!i||e(e=>{let t=e.byRoot[r];if(!t)return e;let n=M(i),a=n.endsWith(`/`)?n:`${n}/`,o=t.expandedPaths.filter(e=>{let t=M(e);return t!==n&&!t.startsWith(a)});return o.length===t.expandedPaths.length?e:{byRoot:P({...e.byRoot,[r]:{...t,expandedPaths:o,touchedAt:Date.now()}},20)}})},setSelectedPath:(t,n,r)=>{let i=j((t||``).trim()),a=n?j(n.trim()):null;!i||a&&!r?.allowOutsideRoot&&!N(a,i)||e(e=>{let t=e.byRoot[i],n=F(t),r=a&&!n.openPaths.includes(a)?[...n.openPaths,a]:n.openPaths;return t&&t.selectedPath===a&&r===t.openPaths?e:{byRoot:P({...e.byRoot,[i]:{...n,openPaths:r,selectedPath:a}},20)}})},ensureSelectedPath:e=>{let n=j((e||``).trim());if(!n)return;let r=t().byRoot[n];if(!r||r.selectedPath)return;let i=r.openPaths[0]??null;i&&t().setSelectedPath(n,i)},toggleExpandedPath:(t,n)=>{let r=j((t||``).trim()),i=j((n||``).trim());!r||!i||!N(i,r)||e(e=>{let t=e.byRoot[r],n=F(t),a=n.expandedPaths.includes(i)?n.expandedPaths.filter(e=>e!==i):[...n.expandedPaths,i];return t&&t.expandedPaths===a&&t.selectedPath===n.selectedPath&&t.openPaths===n.openPaths?e:{byRoot:P({...e.byRoot,[r]:{...n,expandedPaths:a}},20)}})},expandPath:(t,n)=>{let r=j((t||``).trim()),i=j((n||``).trim());!r||!i||!N(i,r)||e(e=>{let t=e.byRoot[r],n=F(t);return n.expandedPaths.includes(i)&&t?e:{byRoot:P({...e.byRoot,[r]:{...n,expandedPaths:[...n.expandedPaths,i]}},20)}})},expandPaths:(t,n)=>{let r=j((t||``).trim());if(!r||!n||n.length===0)return;let i=n.map(e=>j((e||``).trim())).filter(e=>e&&N(e,r));i.length!==0&&e(e=>{let t=e.byRoot[r],n=F(t),a=new Set(n.expandedPaths),o=i.filter(e=>!a.has(e));return o.length===0?e:{byRoot:P({...e.byRoot,[r]:{...n,expandedPaths:[...n.expandedPaths,...o]}},20)}})}}),{name:`files-view-tabs-store`,version:2,storage:v(),migrate:e=>{if(!e||typeof e!=`object`)return{byRoot:{}};let t=e.byRoot;return{byRoot:Re(t)}},partialize:e=>({byRoot:Re(e.byRoot)})}),{name:`files-view-tabs-store`})),I=b(),Be=(e,t)=>{let n=(0,I.c)(4),r=t===void 0?200:t,[i,a]=A.useState(e),o,s;return n[0]!==r||n[1]!==e?(o=()=>{let t=window.setTimeout(()=>{a(e)},r);return()=>{window.clearTimeout(t)}},s=[e,r],n[0]=r,n[1]=e,n[2]=o,n[3]=s):(o=n[2],s=n[3]),A.useEffect(o,s),i},Ve=()=>{let e=(0,I.c)(17),t=E(L),n=ge(),r;e[0]===t?r=e[1]:(r=e=>t?e.getAttachment(t):void 0,e[0]=t,e[1]=r);let i=ie(r),a=E(R),o=E(z),s=D(He),c=D(B),l=h(Ue);if(t){let r;e[2]===i?r=e[3]:(r=he(i),e[2]=i,e[3]=r);let o=r;if(o)return o;let s;e[4]!==t||e[5]!==a?(s=a.get(t),e[4]=t,e[5]=a,e[6]=s):s=e[6];let c=s;if(c?.path)return c.path;let l;if(e[7]!==t||e[8]!==n){let r;e[10]===t?r=e[11]:(r=e=>e.id===t,e[10]=t,e[11]=r),l=n.find(r),e[7]=t,e[8]=n,e[9]=l}else l=e[9];let u=l;if(u?.directory)return u.directory}if(o?.open&&(o.bootstrapPendingDirectory||o.directoryOverride))return(o.bootstrapPendingDirectory||o.directoryOverride)??void 0;if(s){let t;if(e[12]!==s||e[13]!==c){let n;e[15]===s?n=e[16]:(n=e=>e.id===s,e[15]=s,e[16]=n),t=c.find(n),e[12]=s,e[13]=c,e[14]=t}else t=e[14];let n=t;if(n?.path)return n.path}return l??void 0};function L(e){return e.currentSessionId}function R(e){return e.worktreeMetadata}function z(e){return e.newSessionDraft}function He(e){return e.activeProjectId}function B(e){return e.projects}function Ue(e){return e.currentDirectory}var V=p(),H=`bg-transparent font-[inherit] text-[var(--primary-base)]`,U=(e,t)=>{let n=t.trim().toLowerCase();if(!n)return e;let r=e.toLowerCase();if(!r.includes(n))return e;let i=[],a=0,o=r.indexOf(n);for(;o!==-1;)o>a&&i.push(e.slice(a,o)),i.push((0,V.jsx)(`mark`,{className:H,children:e.slice(o,o+n.length)},`${o}-${n}`)),a=o+n.length,o=r.indexOf(n,a);return a<e.length&&i.push(e.slice(a)),i},W=A.forwardRef(({searchQuery:e,onFileSelect:t,onAgentSelect:n,onSkillSelect:r,onSessionSelect:o,onClose:s,style:c,onRowsChange:l},u)=>{let{t:d}=te(),f=Ve()??``,p=E(e=>e.currentSessionId),m=re(e=>e.activeSessions),h=w({enabled:!!o}),g=D(e=>e.activeProjectId),v=D(e=>e.projects),y=A.useMemo(()=>v.find(e=>e.id===g)?.path??null,[g,v]),b=A.useMemo(()=>{let e=y||f;return e?e.replace(/\\/g,`/`).replace(/\/+$/,``):null},[y,f]),x=ze(e=>b?e.byRoot[b]:void 0),ie=ae(e=>e.getVisibleAgents),T=_(e=>e.searchFiles),ue=Be(e,180),de=a(),he=i(),[ge,_e]=A.useState([]),[ve,ye]=A.useState([]),[be,Te]=A.useState(!1),[k,Oe]=A.useState(0),ke=A.useRef(0),[Me,Ne]=A.useState(360),[Pe,Fe]=A.useState({}),[j,M]=A.useState({}),N=A.useRef([]),Re=A.useRef([]),P=A.useRef([]),F=A.useRef(null),I=A.useRef(null),L=A.useRef(null);L.current||=we();let R=ee(e=>e.isMobile),z=(e??``).trim(),He=pe({directory:f||null}),B=A.useMemo(()=>r?je(He.data??[],z):[],[z,r,He.data]),Ue=A.useMemo(()=>{if(!b||!x)return[];let e=[x.selectedPath,...x.openPaths.slice().reverse()].filter(e=>typeof e==`string`&&e.length>0),t=new Set,n=[];for(let r of e){if(t.has(r))continue;t.add(r);let e=r.replace(/\\/g,`/`),i=e.split(`/`).filter(Boolean).pop()||e,a=e.startsWith(`${b}/`)?e.slice(b.length+1):e;n.push({name:i,path:e,relativePath:a,extension:i.includes(`.`)?i.split(`.`).pop()?.toLowerCase():void 0})}return ce(n,z,{limit:6})},[z,b,x]),H=A.useMemo(()=>z.length>0?ve:ve.slice(0,2),[ve,z.length]),W=A.useMemo(()=>o?se({sessions:oe(m,h),currentSessionId:p,searchQuery:z}):[],[m,p,h,z,o]),G=Ue,K=ge;A.useEffect(()=>{let e=e=>{let t=e.target;!t||!F.current||F.current.contains(t)||s()};return document.addEventListener(`pointerdown`,e,!0),()=>{document.removeEventListener(`pointerdown`,e,!0)}},[s]),A.useEffect(()=>{if(!f){_e([]);return}let e=(ue??``).trim(),t=le(e);if(!t){_e([]);return}let n=!1;Te(!0);let r={includeHidden:de,respectGitignore:!he};return Promise.all([T(f,t,80,{...r,type:`file`}),T(f,t,40,{...r,type:`directory`})]).then(([t,r])=>{if(n)return;let i=new Set(Ue.map(e=>e.path));_e(fe({files:t,directories:r,query:e,excludePaths:i,limit:20}))}).catch(()=>{n||_e([])}).finally(()=>{n||Te(!1)}),()=>{n=!0}},[f,ue,Ue,T,de,he]),A.useEffect(()=>{let t=ie().filter(e=>e.mode&&e.mode!==`primary`).map(e=>({name:e.name,description:e.description,mode:e.mode}));ye(me(t,e??``))},[ie,e]),A.useEffect(()=>{Oe(0),Fe({}),M({})},[K,G.length,H.length,W.length,B.length]),A.useEffect(()=>{ke.current=k},[k]),A.useEffect(()=>{N.current[k]?.scrollIntoView({block:`nearest`})},[k]),A.useEffect(()=>{let e=null,t=()=>{e!==null&&cancelAnimationFrame(e),e=requestAnimationFrame(()=>{let e={},t={};Re.current.forEach((n,r)=>{if(!n)return;let i=P.current[r]?.offsetWidth??n.scrollWidth,a=Math.max(0,i-n.clientWidth),o=a>8;if(e[r]=o,o){let e=Math.max(.6,a/110);t[r]=e}}),Fe(e),M(t)})};return t(),window.addEventListener(`resize`,t),()=>{e!==null&&cancelAnimationFrame(e),window.removeEventListener(`resize`,t)}},[K,G]),A.useEffect(()=>{let e=Re.current[k];if(!e)return;let t=()=>{let t=e.clientWidth;t>0&&Ne(t)};if(t(),typeof ResizeObserver>`u`)return;let n=new ResizeObserver(t);return n.observe(e),()=>{n.disconnect()}},[k]);let We=S(e=>{t(e)}),Ge=S(e=>{n?.(e)}),Ke=S(e=>{o?.(e)}),q=S(e=>{r?.(e)}),J=B.length,qe=J,Je=qe+H.length,Y=Je+W.length,Ye=Y+G.length,Xe=(e,t)=>({onMouseDown:e=>e.preventDefault(),onPointerDown:e=>{e.pointerType===`touch`&&L.current?.pointerDown(e.clientX,e.clientY)},onPointerMove:e=>{e.pointerType===`touch`&&L.current?.pointerMove(e.clientX,e.clientY)},onPointerUp:e=>{e.pointerType===`touch`&&(L.current?.pointerUp(t)??!1)&&(e.preventDefault(),e.stopPropagation())},onPointerCancel:()=>L.current?.pointerCancel(),onClick:()=>{L.current?.click(t)},onMouseMove:()=>Oe(e)}),Ze=e=>{let t=J+H.length+W.length+G.length+K.length;if(t===0)return;let n=(e%t+t)%t;if(n<J){let e=B[n];e&&q(e);return}if(n<Je){let e=H[n-qe];e&&Ge(e.name);return}if(n<Y){let e=W[n-Je];e&&Ke(e);return}let r=n-Y,i=r<G.length?G[r]:K[r-G.length];i&&We(i)};A.useEffect(()=>{Ie(l,I,{rows:Ae({skills:B,agents:H,sessions:W,recentFiles:G,pathHits:K,untitledSession:d(`chat.fileMentionAutocomplete.untitledSession`),sessionBadge:d(`chat.fileMentionAutocomplete.sessionType`),skillBadge:d(`chat.commandAutocomplete.badge.skill`)}),highlightedIndex:k})},[l,k,d,H,K,G,W,B]);let X=A.useRef(l);X.current=l,A.useEffect(()=>()=>{Le(X.current,I)},[]),A.useImperativeHandle(u,()=>({acceptIndex:e=>{Ze(e)},handleKeyDown:e=>{if(e===`Escape`){s();return}let t=J+H.length+W.length+G.length+K.length;if(t!==0){if(e===`ArrowDown`){Oe(e=>(e+1)%t);return}if(e===`ArrowUp`){Oe(e=>(e-1+t)%t);return}(e===`Enter`||e===`Tab`)&&Ze(ke.current)}}}),[J,K,G,H,W,B,s,We,Ge,Ke,q]);let Z=e=>(0,V.jsx)(O,{name:De(e),className:`h-3.5 w-3.5 text-current`});return(0,V.jsxs)(Se,{ref:F,isMobile:R,className:`max-w-[640px] max-h-64`,style:c,children:[(0,V.jsx)(xe,{preventOverscroll:!0,outerClassName:`flex-1 min-h-0`,className:`px-0`,children:(0,V.jsxs)(`div`,{className:`pb-2`,children:[B.length>0&&(0,V.jsx)(`div`,{className:`px-3 pb-1 pt-2 typography-meta font-medium text-muted-foreground`,children:d(`chat.fileMentionAutocomplete.groups.skills`)}),B.map((e,t)=>{let n=k===t;return(0,V.jsx)(`div`,{ref:e=>{N.current[t]=e},className:C(`flex items-center gap-2 px-3 py-1.5 cursor-pointer typography-ui-label rounded-lg`,R&&`min-h-11`,Ce(R,n),!R&&n&&`text-interactive-selection-foreground`),...Xe(t,()=>q(e)),children:(0,V.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(O,{name:Ee(),className:`h-3.5 w-3.5 translate-y-px flex-shrink-0 text-current`}),(0,V.jsxs)(`span`,{className:`min-w-0 truncate`,children:[`@`,U(e.name,z)]}),R?null:(0,V.jsx)(`span`,{className:`flex-shrink-0 typography-meta text-muted-foreground`,children:e.scope})]}),e.description?(0,V.jsx)(`div`,{className:C(`pl-5.5 truncate text-muted-foreground`,R?`typography-micro`:`typography-meta`),children:U(e.description,z)}):null]})},`skill-${e.name}-${e.scope}`)}),H.length>0&&(0,V.jsx)(`div`,{className:`px-3 pb-1 pt-2 typography-meta font-medium text-muted-foreground`,children:d(`chat.fileMentionAutocomplete.groups.agents`)}),H.map((e,t)=>{let n=qe+t,r=k===n;return(0,V.jsx)(`div`,{ref:e=>{N.current[n]=e},className:C(`flex items-start gap-2 px-3 py-1.5 cursor-pointer typography-ui-label rounded-lg`,R&&`min-h-11`,Ce(R,r),!R&&r&&`text-interactive-selection-foreground`),...Xe(n,()=>Ge(e.name)),children:(0,V.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,V.jsxs)(`div`,{className:`truncate`,children:[`@`,U(e.name,z)]}),e.description&&!R?(0,V.jsx)(`div`,{className:`typography-meta text-muted-foreground truncate`,children:U(e.description,z)}):null]})},`agent-${e.name}`)}),H.length===2&&z.length===0&&ve.length>2&&(0,V.jsx)(`div`,{className:`px-3 py-1 typography-meta text-muted-foreground`,children:d(`chat.fileMentionAutocomplete.searchMoreAgents`)}),W.length>0&&(0,V.jsx)(`div`,{className:`px-3 pb-1 pt-2 typography-meta font-medium text-muted-foreground`,children:d(`chat.fileMentionAutocomplete.groups.sessions`)}),W.map((e,t)=>{let n=Je+t,r=k===n;return(0,V.jsxs)(`div`,{ref:e=>{N.current[n]=e},className:C(`flex items-center gap-2 px-3 py-1.5 cursor-pointer typography-ui-label rounded-lg`,R&&`min-h-11`,Ce(R,r),!R&&r&&`text-interactive-selection-foreground`),...Xe(n,()=>Ke(e)),children:[(0,V.jsx)(O,{name:`chat-thread`,className:`h-4 w-4 flex-shrink-0 text-[var(--primary-base)]`}),(0,V.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,title:e.title||d(`chat.fileMentionAutocomplete.untitledSession`),children:U(e.title||d(`chat.fileMentionAutocomplete.untitledSession`),z)}),R?null:(0,V.jsx)(`span`,{className:`flex-shrink-0 typography-meta text-muted-foreground`,children:d(`chat.fileMentionAutocomplete.sessionType`)})]},`session-${e.id}`)}),G.length>0&&(0,V.jsx)(`div`,{className:`px-3 pb-1 pt-2 typography-meta font-medium text-muted-foreground`,children:d(`chat.fileMentionAutocomplete.groups.recentFiles`)}),G.map((e,t)=>{let n=Y+t,r=e.relativePath||e.name,i=ne(r,{maxLength:60}),a=k===n,o=Pe[n]??!1,s=j[n]??2.6;return(0,V.jsxs)(`div`,{ref:e=>{N.current[n]=e},className:C(`flex items-center gap-2 px-3 py-1.5 cursor-pointer typography-ui-label rounded-lg`,R&&`min-h-11`,Ce(R,a),!R&&a&&`text-interactive-selection-foreground`),...Xe(n,()=>We(e)),children:[Z(e),(0,V.jsxs)(`span`,{ref:e=>{Re.current[n]=e},className:`relative flex-1 min-w-0 overflow-hidden file-mention-marquee-container`,style:a?{"--file-mention-marquee-width":`${Me}px`,"--file-mention-marquee-duration":`${s}s`}:void 0,"aria-label":r,children:[(0,V.jsx)(`span`,{ref:e=>{P.current[n]=e},className:`absolute invisible whitespace-nowrap pointer-events-none`,"aria-hidden":!0,children:r}),o&&a?(0,V.jsx)(`span`,{className:`inline-block whitespace-nowrap file-mention-marquee`,children:U(r,z)}):(0,V.jsx)(`span`,{className:`block truncate`,children:U(i,z)})]})]},`recent-${e.path}`)}),K.length>0&&(0,V.jsx)(`div`,{className:`px-3 pb-1 pt-2 typography-meta font-medium text-muted-foreground`,children:d(`chat.fileMentionAutocomplete.groups.files`)}),K.map((e,t)=>{let n=Ye+t,r=e.relativePath||e.name,i=ne(r,{maxLength:60}),a=k===n,o=Pe[n]??!1,s=j[n]??2.6;return(0,V.jsxs)(`div`,{ref:e=>{N.current[n]=e},className:C(`flex items-center gap-2 px-3 py-1.5 cursor-pointer typography-ui-label rounded-lg`,R&&`min-h-11`,Ce(R,a),!R&&a&&`text-interactive-selection-foreground`),...Xe(n,()=>We(e)),children:[Z(e),(0,V.jsxs)(`span`,{ref:e=>{Re.current[n]=e},className:`relative flex-1 min-w-0 overflow-hidden file-mention-marquee-container`,style:a?{"--file-mention-marquee-width":`${Me}px`,"--file-mention-marquee-duration":`${s}s`}:void 0,"aria-label":r,children:[(0,V.jsx)(`span`,{ref:e=>{P.current[n]=e},className:`absolute invisible whitespace-nowrap pointer-events-none`,"aria-hidden":!0,children:r}),o&&a?(0,V.jsx)(`span`,{className:`inline-block whitespace-nowrap file-mention-marquee`,children:U(r,z)}):(0,V.jsx)(`span`,{className:`block truncate`,children:U(i,z)})]})]},e.path)}),be&&K.length===0?(0,V.jsx)(`div`,{className:`flex items-center justify-center py-3`,children:(0,V.jsx)(O,{name:`refresh`,className:`h-4 w-4 animate-spin text-muted-foreground`})}):null,!be&&K.length===0&&G.length===0&&H.length===0&&W.length===0&&B.length===0&&(0,V.jsx)(`div`,{className:`px-3 py-2 typography-ui-label text-muted-foreground`,children:d(`chat.fileMentionAutocomplete.empty`)})]})}),!R&&(0,V.jsx)(`div`,{className:`px-3 pt-1 pb-1.5 border-t typography-meta text-muted-foreground`,children:d(`chat.autocomplete.keyboardHint`)})]})}),G=new Set([`new`,`fork`,`compact`,`reload`,`undo`,`redo`,`model`,`goal`,`btw`]),K=(e,t)=>{if(!t||e.isSkill)return!1;let n=e.name?.trim().toLowerCase();return!!(n&&G.has(n))},We=(e,t)=>!e||t({name:e}),Ge=` `,Ke=(e,t)=>{let n=Math.max(0,Math.min(t,e.length)),r=n;for(;r>0&&!/\s/.test(e[r-1]);)--r;return r>=2&&e[r-1]===Ge&&e[r-2]===`/`&&(r-=2),e[r]===`/`?{start:r,end:n}:null},q=`text-[10px] leading-none uppercase font-bold tracking-tight px-1.5 py-1 rounded border flex-shrink-0`,J=C(q,`bg-[color-mix(in_srgb,var(--primary-base)_12%,transparent)] text-[color-mix(in_srgb,var(--primary-base)_70%,transparent)] border-[color-mix(in_srgb,var(--primary-base)_24%,transparent)]`),qe=C(q,`bg-[color-mix(in_srgb,var(--status-success)_12%,transparent)] text-[color-mix(in_srgb,var(--status-success)_70%,transparent)] border-[color-mix(in_srgb,var(--status-success)_24%,transparent)]`),Je=C(q,`bg-[color-mix(in_srgb,var(--status-info)_12%,transparent)] text-[color-mix(in_srgb,var(--status-info)_70%,transparent)] border-[color-mix(in_srgb,var(--status-info)_24%,transparent)]`),Y=C(q,`bg-[var(--surface-muted)] text-muted-foreground border-[var(--interactive-border)]/60`),Ye=(e,t)=>e.length===t.length&&e.every((e,n)=>e.id===t[n]?.id&&e.description===t[n]?.description),Xe=(e,t)=>{let n=!!e.sessionID;return{hasSession:n,canStartSessionCommand:n||e.hasNewDraft,canUseReviewHandoffFlow:n&&!t&&!s()}},Ze=A.forwardRef(({searchQuery:e,onCommandSelect:t,onClose:n,directory:r,style:i,commandPolicy:a,commandContext:o,onRowsChange:c},l)=>{let{t:u}=te(),d=ee(e=>e.isMobile),f=E(e=>e.currentSessionId),p=E(e=>!!e.newSessionDraft?.open),m=E(A.useCallback(e=>f?e.getDirectoryForSession(f):void 0,[f])),h=ue(f??``,m??void 0),g=A.useMemo(()=>o??{sessionID:f??null,hasMessages:h.length>0,hasNewDraft:p},[o,f,h.length,p]),{hasSession:_,canStartSessionCommand:v,canUseReviewHandoffFlow:y}=A.useMemo(()=>Xe(g,d),[g,d]),b=g.hasMessages,[x,S]=A.useState([]),[ne,re]=A.useState(!1),ie=de({directory:r}),ae=A.useMemo(()=>ie.data??[],[ie.data]),oe=ie.isFetching,[w,T]=A.useState(0),se=A.useRef(0),ce=A.useRef(!1),le=A.useRef([]),fe=A.useRef(null),pe=A.useRef(!1),D=A.useRef(null),me=A.useRef(!1),he=A.useRef(null);A.useEffect(()=>{let e=e=>{let t=e.target;!t||!fe.current||fe.current.contains(t)||n()};return document.addEventListener(`pointerdown`,e,!0),()=>{document.removeEventListener(`pointerdown`,e,!0)}},[n]),A.useEffect(()=>{(async()=>{re(oe);try{let t=ae.flatMap((e,t)=>e.source===`skill`?[]:[{id:`opencode:${e.scope??`global`}:${e.name}:${e.agent??``}:${e.model??``}:${t}`,name:e.name,source:`opencode`,description:e.description,agent:e.agent??void 0,model:e.model??void 0,isBuiltIn:e.isBuiltIn,scope:e.scope,reference:e.reference}]),n=[{id:`openchamber:new`,name:`new`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.newDescription`),isBuiltIn:!0},..._&&!b?[{id:`openchamber:init`,name:`init`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.initDescription`),isBuiltIn:!0}]:[],..._?[{id:`openchamber:btw`,name:`btw`,source:`openchamber`,description:u(`chat.btw.description`),isBuiltIn:!0},{id:`openchamber:undo`,name:`undo`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.undoDescription`),isBuiltIn:!0},{id:`openchamber:redo`,name:`redo`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.redoDescription`),isBuiltIn:!0},{id:`openchamber:fork`,name:`fork`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.forkDescription`),isBuiltIn:!0},{id:`openchamber:timeline`,name:`timeline`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.timelineDescription`),isBuiltIn:!0}]:[],{id:`openchamber:model`,name:`model`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.modelDescription`),isBuiltIn:!0},{id:`openchamber:compact`,name:`compact`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.compactDescription`),isBuiltIn:!0},...s()?[{id:`openchamber:reload`,name:`reload`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.reloadDescription`),isBuiltIn:!0}]:[],..._?[{id:`openchamber:summary`,name:`summary`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.summaryDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:workspace-review`,name:`workspace-review`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.workspaceReviewDescription`),isOpenChamber:!0}]:[],...y?[{id:`openchamber:handoff-review`,name:`handoff-review`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.handoffReviewDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:craft-goal`,name:`craft-goal`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.craftGoalDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:goal`,name:`goal`,source:`openchamber`,description:u(`chat.goal.button.armAria`),isBuiltIn:!0}]:[],...v?[{id:`openchamber:catch-up`,name:`catch-up`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.catchUpDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:debug`,name:`debug`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.debugDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:weigh`,name:`weigh`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.weighDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:explore`,name:`explore`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.exploreDescription`),isOpenChamber:!0}]:[],...t],r=!b,i=Me(n.filter(e=>(r||e.name!==`init`)&&(a?.(e)??!0)),e);S(e=>Ye(e,i)?e:i)}catch{let t=!b,n=Me([{id:`openchamber:new`,name:`new`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.newDescription`),isBuiltIn:!0},..._&&!b?[{id:`openchamber:init`,name:`init`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.initDescription`),isBuiltIn:!0}]:[],..._?[{id:`openchamber:btw`,name:`btw`,source:`openchamber`,description:u(`chat.btw.description`),isBuiltIn:!0},{id:`openchamber:undo`,name:`undo`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.undoDescription`),isBuiltIn:!0},{id:`openchamber:redo`,name:`redo`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.redoDescription`),isBuiltIn:!0},{id:`openchamber:fork`,name:`fork`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.forkDescription`),isBuiltIn:!0},{id:`openchamber:timeline`,name:`timeline`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.timelineDescription`),isBuiltIn:!0}]:[],{id:`openchamber:model`,name:`model`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.modelDescription`),isBuiltIn:!0},{id:`openchamber:compact`,name:`compact`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.compactDescription`),isBuiltIn:!0},...s()?[{id:`openchamber:reload`,name:`reload`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.reloadDescription`),isBuiltIn:!0}]:[],..._?[{id:`openchamber:summary`,name:`summary`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.summaryDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:workspace-review`,name:`workspace-review`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.workspaceReviewDescription`),isOpenChamber:!0}]:[],...y?[{id:`openchamber:handoff-review`,name:`handoff-review`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.handoffReviewDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:craft-goal`,name:`craft-goal`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.craftGoalDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:goal`,name:`goal`,source:`openchamber`,description:u(`chat.goal.button.armAria`),isBuiltIn:!0}]:[],...v?[{id:`openchamber:catch-up`,name:`catch-up`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.catchUpDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:debug`,name:`debug`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.debugDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:weigh`,name:`weigh`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.weighDescription`),isOpenChamber:!0}]:[],...v?[{id:`openchamber:explore`,name:`explore`,source:`openchamber`,description:u(`chat.commandAutocomplete.command.exploreDescription`),isOpenChamber:!0}]:[]].filter(e=>(t||e.name!==`init`)&&(a?.(e)??!0)),e);S(e=>Ye(e,n)?e:n)}finally{re(!1)}})()},[e,b,_,v,y,ae,oe,u,a]),A.useEffect(()=>{T(0)},[x]),A.useEffect(()=>{se.current=w},[w]),A.useEffect(()=>{le.current[w]?.scrollIntoView({block:`nearest`})},[w]),A.useEffect(()=>{Ie(c,he,{rows:ke(x,{skill:u(`chat.commandAutocomplete.badge.skill`),command:u(`chat.commandAutocomplete.badge.command`),system:u(`chat.commandAutocomplete.badge.system`)}),highlightedIndex:w})},[x,c,w,u]);let ge=A.useRef(c);ge.current=c,A.useEffect(()=>()=>{Le(ge.current,he)},[]),A.useImperativeHandle(l,()=>({acceptIndex:(e,n=!0)=>{let r=x[e];r&&t(r,K(r,n))},handleKeyDown:e=>{let r=x.length;if(e===`Escape`){n();return}if(r!==0){if(e===`ArrowDown`){ce.current=!0,T(e=>(e+1)%r);return}if(e===`ArrowUp`){ce.current=!0,T(e=>(e-1+r)%r);return}if(e===`Enter`||e===`Tab`){let n=(se.current%r+r)%r,i=x[n];i&&t(i,K(i,e===`Enter`))}}}}),[x,n,t]);let _e=e=>{let t=Te(e);switch(e.name){case`new`:return(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5`});case`init`:return(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5 text-green-500`});case`undo`:return(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5 text-orange-500`});case`redo`:return(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5 text-orange-500`});case`timeline`:case`reload`:return(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5`});case`compact`:return(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5 text-purple-500`});case`goal`:return(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5`});case`review`:return(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5 text-blue-500`});case`test`:case`build`:case`run`:return(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5 text-cyan-500`});default:return e.isBuiltIn?(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5 text-yellow-500`}):(0,V.jsx)(O,{name:t,className:`h-3.5 w-3.5 text-muted-foreground`})}};return(0,V.jsxs)(Se,{ref:fe,isMobile:d,className:`max-w-[450px] max-h-64`,style:i,children:[(0,V.jsx)(xe,{preventOverscroll:!0,outerClassName:`flex-1 min-h-0`,className:`px-0 py-1.5`,children:ne?(0,V.jsx)(`div`,{className:`flex items-center justify-center py-4`,children:(0,V.jsx)(O,{name:`refresh`,className:`h-4 w-4 animate-spin text-muted-foreground`})}):(0,V.jsxs)(`div`,{children:[x.map((n,r)=>{let i=n.isBuiltIn,a=n.isOpenChamber;return(0,V.jsxs)(`div`,{ref:e=>{le.current[r]=e},className:C(`flex gap-2 px-2 py-2 cursor-pointer rounded-lg`,d?`items-center`:`items-start`,Ce(d,r===w),!d&&r===w&&`bg-interactive-selection/35`),onMouseDown:e=>e.preventDefault(),onPointerDown:e=>{e.pointerType===`touch`&&(D.current={x:e.clientX,y:e.clientY},me.current=!1)},onPointerMove:e=>{if(e.pointerType!==`touch`||!D.current)return;let t=e.clientX-D.current.x,n=e.clientY-D.current.y;Math.hypot(t,n)>6&&(me.current=!0)},onPointerUp:e=>{if(e.pointerType!==`touch`)return;let r=me.current;D.current=null,me.current=!1,!r&&(e.preventDefault(),e.stopPropagation(),pe.current=!0,t(n,K(n,d)))},onPointerCancel:()=>{D.current=null,me.current=!1},onClick:()=>{if(pe.current){pe.current=!1;return}t(n,K(n,d))},onMouseMove:()=>{ce.current=!1,T(r)},children:[(0,V.jsx)(`div`,{className:C(!d&&`mt-0.5`),children:_e(n)}),(0,V.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsxs)(`span`,{className:`typography-ui-label font-medium`,children:[`/`,U(n.name,e)]}),n.isSkill?(0,V.jsx)(`span`,{className:J,children:u(`chat.commandAutocomplete.badge.skill`)}):(0,V.jsx)(`span`,{className:J,children:u(`chat.commandAutocomplete.badge.command`)}),a?(0,V.jsx)(`span`,{className:Y,children:`OpenChamber`}):i?(0,V.jsx)(`span`,{className:Y,children:u(`chat.commandAutocomplete.badge.system`)}):n.scope?(0,V.jsx)(`span`,{className:n.scope===`project`?Je:qe,children:n.scope}):null,n.agent&&(0,V.jsx)(`span`,{className:Y,children:n.agent})]}),n.description&&!d&&(0,V.jsx)(`div`,{className:`typography-meta text-muted-foreground mt-0.5 truncate`,children:U(n.description,e)})]})]},n.id)}),x.length===0&&(0,V.jsx)(`div`,{className:`px-3 py-2 typography-ui-label text-muted-foreground`,children:u(`chat.commandAutocomplete.empty`)})]})}),!d&&(0,V.jsx)(`div`,{className:`px-3 pt-1 pb-1.5 border-t typography-meta text-muted-foreground`,children:u(`chat.autocomplete.keyboardHint`)})]})});Ze.displayName=`CommandAutocomplete`;var X=2,Z=e=>!!e&&typeof e==`object`&&!Array.isArray(e),Qe=e=>{let t=e?.trim().replace(/\\/g,`/`);return t?t.length>1?t.replace(/\/+$/,``):t:null},$e=e=>Z(e)&&Array.isArray(e.all)&&e.all.every(e=>typeof e==`string`)&&typeof e.current==`string`&&Z(e.branches),et=(e,t)=>JSON.stringify([e,t]),tt=e=>`version`in e&&e.version===X&&Z(e.entries),nt=e=>{if(!e)return null;try{let t=JSON.parse(e);return Z(t)?t.version===X&&Z(t.entries)?{version:X,entries:t.entries}:t:null}catch{return null}},rt=(e,t)=>{try{e.setItem(`oc.gitBranchCache`,JSON.stringify(t))}catch{}},it=(e,t,n)=>{let r=Qe(e);if(!r||!t)return null;let i;try{i=n.getItem(`oc.gitBranchCache`)}catch{return null}let a=nt(i);if(!a)return null;if(tt(a))return $e(a.entries[et(t,r)])?a.entries[et(t,r)]:null;let o={};for(let[e,n]of Object.entries(a)){let r=Qe(e);r&&$e(n)&&(o[et(t,r)]=n)}return rt(n,{version:X,entries:o}),o[et(t,r)]??null},at=(e,t,n,r)=>{let i=Qe(e);if(!i||!t||!$e(n))return;let a=null;try{a=r.getItem(`oc.gitBranchCache`)}catch{return}let o=nt(a);rt(r,{version:X,entries:{...o&&tt(o)?o.entries:{},[et(t,i)]:n}})},ot=3e4,st=Qe,ct=(e,t=n())=>o.git.branches(st(e),t),lt=(e,t=n())=>o.git.remotes(st(e),t),ut=async(e,t,n)=>{n.throwIfAborted();let i=r()?.git,a=t?.getGitBranches?await t.getGitBranches(e,{signal:n}):i?await i.getGitBranches(e,{signal:n}):await g(e,{signal:n});return n.throwIfAborted(),a},dt=async(e,t,n)=>{n.throwIfAborted();let i=r()?.git,a=t?.getRemotes?await t.getRemotes(e,{signal:n}):i?await i.getRemotes(e,{signal:n}):await m(e,{signal:n});return n.throwIfAborted(),a},ft=(e,t,r=n(),i=y())=>{let a=st(e),o=t;return{queryKey:ct(a,r),queryFn:async({signal:e})=>{if(!a)throw Error(`Git branches require a directory`);let t=await ut(a,o,e);return at(a,r,t,i),t},staleTime:ot,gcTime:1/0,initialData:()=>it(a,r,i)??void 0,initialDataUpdatedAt:0}},pt=(e,t,r=n())=>{let i=st(e),a=t;return{queryKey:lt(i,r),queryFn:({signal:e})=>{if(!i)throw Error(`Git remotes require a directory`);return dt(i,a,e)},staleTime:ot,gcTime:1/0}},mt=(e,r,i)=>{let a=(0,I.c)(9),o=i===void 0||i,s=A.useSyncExternalStore(t,n,n),c,l,u;a[0]!==e||a[1]!==r||a[2]!==s?(c=st(e),u=x,l=ft(c,r,s),a[0]=e,a[1]=r,a[2]=s,a[3]=c,a[4]=l,a[5]=u):(c=a[3],l=a[4],u=a[5]);let d=o&&!!c,f;return a[6]!==l||a[7]!==d?(f={...l,enabled:d},a[6]=l,a[7]=d,a[8]=f):f=a[8],u(f)},ht=(e,r,i)=>{let a=(0,I.c)(9),o=i===void 0||i,s=A.useSyncExternalStore(t,n,n),c,l,u;a[0]!==e||a[1]!==r||a[2]!==s?(c=st(e),u=x,l=pt(c,r,s),a[0]=e,a[1]=r,a[2]=s,a[3]=c,a[4]=l,a[5]=u):(c=a[3],l=a[4],u=a[5]);let d=o&&!!c,f;return a[6]!==l||a[7]!==d?(f={...l,enabled:d},a[6]=l,a[7]=d,a[8]=f):f=a[8],u(f)},gt=(e,t,r=c,i=n())=>r.fetchQuery(ft(e,t,i)),_t=(e,t,r=c,i=n())=>r.fetchQuery({...ft(e,t,i),staleTime:0}),vt=e=>e instanceof Error?e.name===`AbortError`||e.name===`CancelledError`||e.name===`Error`&&e.message===`CancelledError`:!1,yt=1e4,bt=6e4,xt=5e3,St=3e4,Ct=6e4,wt=25,Tt=40,Et=2,Dt=15e3,Ot=500,kt=30,At=20971520,jt=new Map,Mt=new Map,Nt=new Map,Pt=new Map,Ft=new Map,It=(e,t)=>`${t}:${e}`,Lt=e=>Mt.get(e)??0,Rt=e=>{let t=Lt(e)+1;return Mt.set(e,t),t},zt=e=>{let t=(Nt.get(e)??0)+1;return Nt.set(e,t),t},Bt=e=>{let t=jt.get(e);if(t)return t;let n=new Set;return jt.set(e,n),n},Q=()=>({isGitRepo:null,status:null,branches:null,branchesTransportIdentity:null,log:null,identity:null,diffCache:new Map,indexRevision:0,lastRepoCheckAt:0,lastStatusFetch:0,lastStatusChange:0,lastLogFetch:0,lastBranchesFetch:0,lastIdentityFetch:0,logMaxCount:25,isLoadingStatus:!1,isLoadingLog:!1,isLoadingBranches:!1,isLoadingIdentity:!1}),Vt=(e,t=kt,n=At)=>{let r=0;for(let t of e.values())r+=(t.original?.length??0)+(t.modified?.length??0);if(e.size<=t&&r<=n)return e;let i=Array.from(e.entries()).sort((e,t)=>e[1].fetchedAt-t[1].fetchedAt),a=new Map,o=0;for(let e=i.length-1;e>=0;e--){let[r,s]=i[e],c=(s.original?.length??0)+(s.modified?.length??0);if(a.size>=t)break;o+c>n&&a.size>0||(a.set(r,s),o+=c)}return a},Ht=(e,t)=>{if(!e&&!t)return!1;if(!e||!t)return!0;let n=new Set([...Object.keys(e),...Object.keys(t)]);for(let r of n){let n=e[r],i=t[r];if(!(!n&&!i)&&(!n||!i||n.insertions!==i.insertions||n.deletions!==i.deletions))return!0}return!1},Ut=(e,t)=>!e&&!t?!1:!e||!t||e.remote!==t.remote||e.branch!==t.branch||e.ahead!==t.ahead||e.behind!==t.behind,Wt=(e,t)=>{if(!e&&!t)return!1;if(!e||!t)return!0;let n=e.files??[],r=t.files??[];if(n.length!==r.length||e.ahead!==t.ahead||e.behind!==t.behind||e.current!==t.current||e.tracking!==t.tracking||e.isClean!==t.isClean||t.upstreamComparison!==void 0&&Ut(e.upstreamComparison,t.upstreamComparison))return!0;let i=new Set(n.map(e=>`${e.path}:${e.index}:${e.working_dir}`));for(let e of r)if(!i.has(`${e.path}:${e.index}:${e.working_dir}`))return!0;return!!(t.diffStats!==void 0&&Ht(e.diffStats,t.diffStats))},Gt=(e,t)=>{let n=new Set;if(!t)return n;let r=e?.files??[],i=t.files??[],a=new Map(r.map(e=>[e.path,e])),o=new Map(i.map(e=>[e.path,e])),s=new Set([...a.keys(),...o.keys()]);for(let e of s){let t=a.get(e),r=o.get(e);if(!t||!r){n.add(e);continue}if(t.index!==r.index||t.working_dir!==r.working_dir){n.add(e);continue}}if(t.diffStats!==void 0){let r=e?.diffStats??{},i=t.diffStats??{},a=new Set([...Object.keys(r),...Object.keys(i)]);for(let e of a){let t=r[e],a=i[e];if(!t||!a){n.add(e);continue}(t.insertions!==a.insertions||t.deletions!==a.deletions)&&n.add(e)}}return n},Kt=(e,t)=>{if(!e&&!t)return!1;if(!e||!t)return!0;let n=e.files??[],r=t.files??[],i=e=>{let t=e?.trim()??``;return t===`?`?``:t},a=new Map(n.map(e=>[e.path,i(e.index)])),o=new Map(r.map(e=>[e.path,i(e.index)])),s=new Set([...a.keys(),...o.keys()]);for(let e of s)if((a.get(e)??``)!==(o.get(e)??``))return!0;return!1},qt=e=>!e||e.trim().length===0,Jt=e=>(e||``).trim()===`U`,Yt=e=>{let t=(e.index||``).trim(),n=(e.working_dir||``).trim();if(Jt(t)||Jt(n))return e;let r=t===`?`||n===`?`?`A`:t||n||` `;return{...e,index:r,working_dir:` `}},Xt=e=>{let t=(e.index||``).trim(),n=(e.working_dir||``).trim();if(Jt(t)||Jt(n))return e;let r=n||(t===`A`||t===`?`?`?`:t)||` `;return{...e,index:` `,working_dir:r}},Zt=e=>qt(e.index)&&qt(e.working_dir),$=l()(d((e,t)=>({directories:new Map,activeDirectory:null,setActiveDirectory:n=>{let{activeDirectory:r,directories:i}=t();if(r!==n)if(r&&Rt(r),n&&Rt(n),n&&!i.has(n)){let t=new Map(i);t.set(n,Q()),e({activeDirectory:n,directories:t})}else e({activeDirectory:n})},getDirectoryState:e=>t().directories.get(e)??null,fetchStatus:async(n,r,i={})=>{let a=i.mode??`full`,o=It(n,a),s=Pt.get(o)??(a===`light`?Pt.get(It(n,`full`)):void 0);if(s)return s;let c=(async()=>{let{silent:a=!1}=i,{directories:o}=t(),s=o.get(n);if(s||=Q(),!a){let r=new Map(t().directories),i=r.get(n)??Q();r.set(n,{...i,isLoadingStatus:!0}),e({directories:r})}let c=!1;try{let a=Date.now(),o=s.isGitRepo!==!0||a-(s.lastRepoCheckAt||0)>bt,l=s.isGitRepo===!0;if(o&&(l=await r.checkIsGitRepository(n)),!l){let r=new Map(t().directories),i=r.get(n)??s;return r.set(n,{...i,isGitRepo:!1,status:null,isLoadingStatus:!1,lastRepoCheckAt:a,lastStatusFetch:a}),e({directories:r}),!1}let u=await r.getGitStatus(n,i.mode?{mode:i.mode}:void 0);if(Wt(s.status,u)){c=!0;let r=new Map(t().directories),i=r.get(n)??Q(),s=Gt(i.status,u),l=Kt(i.status,u),d=new Set((i.status?.files??[]).map(e=>e.path)),f=new Set((u.files??[]).map(e=>e.path)),p=new Map(i.diffCache);for(let e of d)f.has(e)||p.delete(e);for(let e of s)p.delete(e);let m=s.size>0;m&&Rt(n);let h={...u,diffStats:u.diffStats===void 0&&i.status?.diffStats!==void 0?i.status.diffStats:u.diffStats,upstreamComparison:u.upstreamComparison===void 0?i.status?.upstreamComparison:u.upstreamComparison};r.set(n,{...i,isGitRepo:!0,status:h,diffCache:p,indexRevision:l?i.indexRevision+1:i.indexRevision,lastRepoCheckAt:o?a:i.lastRepoCheckAt,lastStatusFetch:Date.now(),lastStatusChange:m?Date.now():i.lastStatusChange}),e({directories:r})}else{let r=new Map(t().directories),i=r.get(n)??Q();r.set(n,{...i,isGitRepo:!0,lastRepoCheckAt:o?a:i.lastRepoCheckAt,lastStatusFetch:Date.now(),lastStatusChange:i.lastStatusChange}),e({directories:r})}}catch(e){console.error(`Failed to fetch git status:`,e)}finally{if(!a){let r=new Map(t().directories),i=r.get(n)??Q();r.set(n,{...i,isLoadingStatus:!1}),e({directories:r})}}return c})();Pt.set(o,c);try{return await c}finally{Pt.get(o)===c&&Pt.delete(o)}},moveStatusPathsOptimistically:(n,r,i)=>{let a=new Set(r.map(e=>e.trim()).filter(Boolean));if(a.size===0)return null;let{directories:o}=t(),s=o.get(n),c=s?.status??null;if(!s||!c)return c;let l=!1,u=[];for(let e of c.files){if(!a.has(e.path)){u.push(e);continue}let t=i===`stage`?Yt(e):Xt(e);t!==e&&(l=!0),Zt(t)?l=!0:u.push(t)}if(!l)return c;let d=new Map(o);return d.set(n,{...s,status:{...c,files:u,isClean:u.length===0},indexRevision:s.indexRevision+1,lastStatusChange:Date.now()}),e({directories:d}),c},restoreStatus:(n,r)=>{let{directories:i}=t(),a=i.get(n);if(!a)return;let o=new Map(i);o.set(n,{...a,status:r,indexRevision:a.indexRevision+1,lastStatusChange:Date.now()}),e({directories:o})},bumpIndexRevision:n=>{let{directories:r}=t(),i=r.get(n);if(!i)return;let a=new Map(r);a.set(n,{...i,indexRevision:i.indexRevision+1}),e({directories:a})},fetchBranches:async(r,i,a={})=>{let o=n(),s=zt(r);{let n=new Map(t().directories),i=n.get(r)??Q();n.set(r,{...i,isLoadingBranches:!0}),e({directories:n})}try{let c=a.force?await _t(r,i,void 0,o):await gt(r,i,void 0,o);if(s!==Nt.get(r)||o!==n())return;let l=new Map(t().directories),u=l.get(r)??Q();l.set(r,{...u,branches:c,branchesTransportIdentity:o,isLoadingBranches:!1,lastBranchesFetch:Date.now()}),e({directories:l})}catch(i){if(vt(i)||console.error(`Failed to fetch git branches:`,i),s!==Nt.get(r)||o!==n())return;let a=new Map(t().directories),c=a.get(r)??Q();a.set(r,{...c,isLoadingBranches:!1}),e({directories:a})}},fetchLog:async(n,r,i)=>{let{directories:a}=t(),o=a.get(n),s=i??o?.logMaxCount??25;{let r=new Map(t().directories),i=r.get(n)??Q();r.set(n,{...i,isLoadingLog:!0}),e({directories:r})}try{let i=await r.getGitLog(n,{maxCount:s}),a=new Map(t().directories),o=a.get(n)??Q();a.set(n,{...o,log:i,isLoadingLog:!1,lastLogFetch:Date.now(),logMaxCount:s}),e({directories:a})}catch(r){console.error(`Failed to fetch git log:`,r);let i=new Map(t().directories),a=i.get(n)??Q();i.set(n,{...a,isLoadingLog:!1}),e({directories:i})}},fetchIdentity:async(n,r)=>{{let r=new Map(t().directories),i=r.get(n)??Q();r.set(n,{...i,isLoadingIdentity:!0}),e({directories:r})}try{let i=await r.getCurrentGitIdentity(n),a=new Map(t().directories),o=a.get(n)??Q();a.set(n,{...o,identity:i,isLoadingIdentity:!1,lastIdentityFetch:Date.now()}),e({directories:a})}catch(r){console.error(`Failed to fetch git identity:`,r);let i=new Map(t().directories),a=i.get(n)??Q();i.set(n,{...a,isLoadingIdentity:!1}),e({directories:i})}},fetchAll:async(n,r,i={})=>{let{directories:a}=t(),o=a.get(n);if(!o){o=Q();let t=new Map(a);t.set(n,o),e({directories:t})}let{force:s=!1,silentIfCached:c=!1}=i,l=Date.now();await t().fetchStatus(n,r,{silent:c&&!!o?.status});let u=t().directories.get(n);if(!u?.isGitRepo)return;await t().fetchBranches(n,r,{force:s});let d=l-(u.lastLogFetch||0);(s||d>yt||!u.log)&&await t().fetchLog(n,r),await t().fetchIdentity(n,r)},getDiff:(e,n)=>t().directories.get(e)?.diffCache.get(n)??null,setDiff:(n,r,i)=>{let a=new Map(t().directories),o=a.get(n)??Q(),s=new Map(o.diffCache);s.set(r,{...i,fetchedAt:Date.now()});let c=Vt(s);a.set(n,{...o,diffCache:c}),e({directories:a})},clearDiffCache:n=>{Rt(n);let r=new Map(t().directories),i=r.get(n);i&&(r.set(n,{...i,diffCache:new Map}),e({directories:r}))},fetchAllDiffs:async(e,n)=>{let r=t().directories.get(e);if(!r?.status?.files||r.status.files.length===0)return;let i=r.status.files.map(e=>e.path).slice(0,wt);await t().prefetchDiffs(e,n,i,{maxFiles:wt})},prefetchDiffs:async(n,r,i,a={})=>{let o=t().directories.get(n);if(!o?.status?.files||o.status.files.length===0||i.length===0)return;let{maxFiles:s=Tt}=a,c=new Set(o.status.files.map(e=>e.path)),l=o.status.diffStats,u=Bt(n),d=[],f=new Set;for(let e of i){if(!e||f.has(e)||(f.add(e),!c.has(e))||o.diffCache.has(e)||u.has(e))continue;let t=l?.[e];t&&t.insertions+t.deletions>Ot||d.push(e)}let p=d.slice(0,Math.max(1,s));if(p.length===0)return;let m=Lt(n);if(typeof document<`u`&&document.hidden)return;p.forEach(e=>u.add(e));let h=0,g=[],_=()=>{let e=h;return h+=1,e<p.length?p[e]:null},v=async e=>{let t=r.getGitFileDiff(n,{path:e}),i=new Promise((e,t)=>{setTimeout(()=>t(Error(`Timed out after ${Dt}ms`)),Dt)}),a=await Promise.race([t,i]);return{path:e,diff:{original:a.original??``,modified:a.modified??``,isBinary:a.isBinary}}},ee=async()=>{for(;;){if(m!==Lt(n))return;let e=_();if(!e)return;try{g.push(await v(e))}catch{}finally{u.delete(e)}}},y=Math.min(Et,p.length);if(await Promise.allSettled(Array.from({length:y},()=>ee())),p.forEach(e=>u.delete(e)),m!==Lt(n))return;let b=new Map(t().directories),x=b.get(n);if(!x)return;let S=new Map(x.diffCache),te=Date.now();g.forEach(e=>{!e.diff.isBinary&&e.diff.original===``&&e.diff.modified===``||S.set(e.path,{...e.diff,fetchedAt:te})});let C=Vt(S);b.set(n,{...x,diffCache:C}),e({directories:b})},setLogMaxCount:(n,r)=>{let i=new Map(t().directories),a=i.get(n)??Q();i.set(n,{...a,logMaxCount:r}),e({directories:i})},ensureStatus:async(e,n)=>{let r=t().directories.get(e),i=Date.now();r?.status&&i-r.lastStatusFetch<xt||await t().fetchStatus(e,n,{silent:!!r?.status})},ensureAll:(e,n)=>{let r=Ft.get(e);if(r)return r;let i=(async()=>{let r=t().directories.get(e),i=Date.now();(!r?.status||r.status.diffStats===void 0||i-(r?.lastStatusFetch??0)>=xt)&&await t().fetchStatus(e,n,{silent:!!r?.status});let a=t().directories.get(e);if(!a?.isGitRepo)return;let o=[];(!a.branches||i-a.lastBranchesFetch>=St)&&o.push(t().fetchBranches(e,n)),(!a.log||i-a.lastLogFetch>=yt)&&o.push(t().fetchLog(e,n)),(!a.identity||i-a.lastIdentityFetch>=Ct)&&o.push(t().fetchIdentity(e,n)),o.length>0&&await Promise.all(o)})();return Ft.set(e,i),i.finally(()=>{Ft.get(e)===i&&Ft.delete(e)}),i},refresh:async(e,n={})=>{let{activeDirectory:r}=t();r&&await t().fetchAll(r,e,n)}}),{name:`git-store`})),Qt=e=>{let t=(0,I.c)(2),n;return t[0]===e?n=t[1]:(n=t=>e?t.directories.get(e)?.status??null:null,t[0]=e,t[1]=n),$(n)},$t=e=>{let r=(0,I.c)(3),i=A.useSyncExternalStore(t,n,n),a;return r[0]!==e||r[1]!==i?(a=t=>{if(!e)return null;let n=t.directories.get(e);return n?.branchesTransportIdentity===i?n.branches:null},r[0]=e,r[1]=i,r[2]=a):a=r[2],$(a)},en=e=>{let t=(0,I.c)(2),n;return t[0]===e?n=t[1]:(n=t=>e?t.directories.get(e)?.log??null:null,t[0]=e,t[1]=n),$(n)},tn=e=>{let t=(0,I.c)(2),n;return t[0]===e?n=t[1]:(n=t=>e?t.directories.get(e)?.isGitRepo??null:null,t[0]=e,t[1]=n),$(n)},nn=e=>{let t=(0,I.c)(2),n;return t[0]===e?n=t[1]:(n=t=>e?t.directories.get(e)?.status?.current?.trim()??null:null,t[0]=e,t[1]=n),$(n)},rn=e=>{let t=(0,I.c)(3),n;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(n=new Map,t[0]=n):n=t[0];let r=A.useRef(n),i;return t[1]===e?i=t[2]:(i=t=>{let n=r.current,i=n.size===e.length;if(i)for(let r of e){let e=t.directories.get(r),a=n.get(r);if(!a||(e?.isGitRepo??null)!==a.isGitRepo||(e?.status?.current??null)!==a.branch){i=!1;break}}if(i)return n;let a=new Map;for(let n of e){let e=t.directories.get(n);a.set(n,{isGitRepo:e?.isGitRepo??null,branch:e?.status?.current??null})}return r.current=a,a},t[1]=e,t[2]=i),$(i)},an=e=>{let t=(0,I.c)(2),n;return t[0]===e?n=t[1]:(n=t=>e?t.directories.get(e)?.isLoadingStatus??!1:!1,t[0]=e,t[1]=n),$(n)},on=e=>{let t=(0,I.c)(2),n;return t[0]===e?n=t[1]:(n=t=>e?t.directories.get(e)?.isLoadingLog??!1:!1,t[0]=e,t[1]=n),$(n)},sn=e=>{let t=(0,I.c)(2),n;return t[0]===e?n=t[1]:(n=t=>e?t.directories.get(e)?.isLoadingBranches??!1:!1,t[0]=e,t[1]=n),$(n)},cn=e=>{let t=String(e||``).trim().replace(/^remotes\//,``);if(!t)return null;let n=t.indexOf(`/`);return n<=0||n>=t.length-1?null:{remote:t.slice(0,n),branch:t.slice(n+1)}},ln=e=>String(e||``).trim().replace(/^refs\/heads\//,``).replace(/^heads\//,``).replace(/^remotes\//,``),un=e=>e.branchName?ln(e.branchName):e.mode===`existing`?ln(e.existingBranch||e.preferredName||``):ln(e.preferredName||``),dn=async e=>{let t=await ye(e);try{let n=cn((await _e(e)).branches?.[t]?.tracking||null);if(n?.remote)return n.remote}catch{}try{let t=cn((await ve(e)).tracking);if(t?.remote)return t.remote}catch{}return null},fn=async(e,t)=>{let n=await dn(e),r=ln(t);return!n||!r?null:{setUpstream:!0,upstreamRemote:n,upstreamBranch:r}},pn=async(e,t,n)=>{let r=un(t),i=n?.resolvedRootTrackingRemote,a=i===void 0?await fn(e,r):i&&ln(r)?{setUpstream:!0,upstreamRemote:i,upstreamBranch:ln(r)}:null;return a?{...t,setUpstream:t.setUpstream??a.setUpstream,upstreamRemote:t.upstreamRemote||a.upstreamRemote,upstreamBranch:t.upstreamBranch||a.upstreamBranch}:t},mn=async(e,t,n)=>{let r=await pn(e.path,t,n);return be(e,r)},hn=`oc:lastWorktreeSourceBranch`,gn=({mode:e,sourceBranch:t,linkedPr:n,selectedBranch:r})=>e===`existing-branch`?r||null:n?null:t||null,_n=({branches:e,savedSourceBranch:t,rootBranch:n})=>t&&e.includes(t)&&t?{sourceBranch:t,shouldClearSavedSourceBranch:!1}:{sourceBranch:n&&e.includes(n)?n:e.includes(`main`)?`main`:e.includes(`master`)?`master`:e[0]??``,shouldClearSavedSourceBranch:!!t},vn=(e,t,n)=>{if(!e)return e;let r=t.length>0&&!/\s$/.test(t)&&!/^\s/.test(e)&&!/[([{]$/.test(t),i=n.length>0&&!/\s$/.test(e)&&!/^\s/.test(n)&&!/^[\])}.,;:!?]/.test(n);return`${r?` `:``}${e}${i?` `:``}`},yn=(e,t,n)=>{let r=vn(e,t,n);return`${t.length===0&&!/^\s/.test(r)?` `:``}${r}${n.length===0&&!/\s$/.test(r)?` `:``}`},bn=(e,t,n,r)=>{let i=e.slice(0,t),a=e.slice(n),o=yn(r,i,a),s=Math.max(0,o.indexOf(r)),c=i.length+s;return{text:`${i}${o}${a}`,caret:i.length+o.length,start:c,end:c+r.length}},xn=(e,t)=>{let n=e=>`${e.kind}:${e.value}:${e.range.start}:${e.range.end}`;return new Set(e.map(n)).has(n(t))||e.some(e=>e.range.start<t.range.end&&t.range.start<e.range.end)?[...e]:[...e,t]},Sn=(e,t)=>t<e.length&&e[t]===` `?t+1:t;export{ze as A,ht as C,W as D,We as E,Ve as O,mt as S,Ke as T,rn as _,hn as a,tn as b,mn as c,nn as d,$t as f,en as g,an as h,yn as i,Fe as j,Be as k,dn as l,on as m,xn as n,_n as o,sn as p,bn as r,gn as s,Sn as t,pn as u,Qt as v,Ze as w,_t as x,$ as y};