@loicngr/kobo 2.1.18 → 2.1.20

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 (114) hide show
  1. package/AGENTS.md +49 -0
  2. package/CHANGELOG.md +8 -0
  3. package/CONFIGURATION.md +60 -1
  4. package/README.md +2 -0
  5. package/dist/mcp-server/kobo-tasks-server.js +28 -6
  6. package/dist/mcp-server/progress-bar-client.js +20 -0
  7. package/dist/mcp-server/workspace-dialogue-client.js +27 -7
  8. package/dist/server/db/migrations.js +2 -0
  9. package/dist/server/db/progress-bar-schema.js +27 -0
  10. package/dist/server/db/schema.js +2 -0
  11. package/dist/server/index.js +4 -0
  12. package/dist/server/routes/mcp.js +19 -9
  13. package/dist/server/routes/progress-bars.js +56 -0
  14. package/dist/server/routes/workspaces.js +33 -63
  15. package/dist/server/services/agent/engines/claude-code/engine.js +59 -16
  16. package/dist/server/services/agent/engines/claude-code/options-builder.js +13 -34
  17. package/dist/server/services/agent/engines/claude-code/stop-hook.js +8 -27
  18. package/dist/server/services/agent/engines/codex/engine.js +8 -1
  19. package/dist/server/services/agent/engines/codex/options-builder.js +11 -16
  20. package/dist/server/services/agent/orchestrator.js +53 -7
  21. package/dist/server/services/auto-loop-final-review-service.js +1 -1
  22. package/dist/server/services/auto-loop-service.js +10 -10
  23. package/dist/server/services/progress-bar-mcp-service.js +44 -0
  24. package/dist/server/services/progress-bar-runtime.js +29 -0
  25. package/dist/server/services/progress-bar-service.js +232 -0
  26. package/dist/shared/auto-loop-prompts.js +12 -12
  27. package/dist/shared/launch-instructions.js +57 -0
  28. package/dist/shared/progress-bar-prompts.js +11 -0
  29. package/dist/shared/progress-bar-tools.js +73 -0
  30. package/dist/shared/progress-bars.js +3 -0
  31. package/package.json +1 -1
  32. package/src/client/dist/pwa/assets/ActivityFeed-DiUxnmGJ.js +2 -0
  33. package/src/client/dist/pwa/assets/{AutoLoopFinalReviewSettings-CC8ICe_I.js → AutoLoopFinalReviewSettings-f4VDR5dd.js} +1 -1
  34. package/src/client/dist/pwa/assets/{ChangelogPage-C1aiPBoi.js → ChangelogPage-dEWpjTlp.js} +1 -1
  35. package/src/client/dist/pwa/assets/ComparisonPanel-Bwbqgvr4.js +2 -0
  36. package/src/client/dist/pwa/assets/CreatePage-CCCCAhrx.js +2 -0
  37. package/src/client/dist/pwa/assets/{DashboardPage-D1S3QGp4.js → DashboardPage-3byhBITf.js} +1 -1
  38. package/src/client/dist/pwa/assets/DiffViewer-Bj_NTfCF.js +8 -0
  39. package/src/client/dist/pwa/assets/{DocumentsPanel-C4AvyZF3.js → DocumentsPanel-xyLDV3T1.js} +1 -1
  40. package/src/client/dist/pwa/assets/{DrawerToggleButton-LzIEeeJY.js → DrawerToggleButton-pwBSstQP.js} +1 -1
  41. package/src/client/dist/pwa/assets/GitPanel-DvIdrkVw.js +3 -0
  42. package/src/client/dist/pwa/assets/{HealthPage-Cm13vxOi.js → HealthPage-BSwhZQRo.js} +1 -1
  43. package/src/client/dist/pwa/assets/MainLayout-DZJ9BvZw.js +2 -0
  44. package/src/client/dist/pwa/assets/{MemoryPanel-C6tzCv6D.js → MemoryPanel-ChR032zP.js} +1 -1
  45. package/src/client/dist/pwa/assets/{MemoryProposalList-CzpzIirK.js → MemoryProposalList-BRKSoS4K.js} +1 -1
  46. package/src/client/dist/pwa/assets/{QBtnDropdown-BnuKPevV.js → QBtnDropdown-o3QH0Bb8.js} +1 -1
  47. package/src/client/dist/pwa/assets/{QExpansionItem-DjaUhgjt.js → QExpansionItem-BhFHiyq9.js} +1 -1
  48. package/src/client/dist/pwa/assets/{QScrollArea-Dpksslru.js → QScrollArea-BsNY6slB.js} +1 -1
  49. package/src/client/dist/pwa/assets/QSelect-bEq3g_io.js +1 -0
  50. package/src/client/dist/pwa/assets/{QTooltip-CH45NuVs.js → QTooltip-xYZ6KNu2.js} +1 -1
  51. package/src/client/dist/pwa/assets/{SchedulePanel-QAjXuTIN.js → SchedulePanel-DIFv_FTY.js} +1 -1
  52. package/src/client/dist/pwa/assets/{SearchPage-B1pbwDej.js → SearchPage-BqTBIt5E.js} +1 -1
  53. package/src/client/dist/pwa/assets/SettingsPage-BLD0xWFB.js +9 -0
  54. package/src/client/dist/pwa/assets/{SplitWorkspacePage-CJ7e-KPh.js → SplitWorkspacePage-D6r2pl5g.js} +1 -1
  55. package/src/client/dist/pwa/assets/{TerminalPanel-DVomz3oo.js → TerminalPanel-CladK9Vv.js} +9 -9
  56. package/src/client/dist/pwa/assets/{ToolCallItem-BntDHc6p.js → ToolCallItem-CdzEME4w.js} +3 -3
  57. package/src/client/dist/pwa/assets/{TouchPan-DwqfsAxH.js → TouchPan-B4gQPwGN.js} +1 -1
  58. package/src/client/dist/pwa/assets/{TourReplayButton-OIavXdUg.js → TourReplayButton-B0j6AZwU.js} +1 -1
  59. package/src/client/dist/pwa/assets/{WorkspaceAttentionLabels-CYwN1-Rf.js → WorkspaceAttentionLabels-CeVhoidC.js} +1 -1
  60. package/src/client/dist/pwa/assets/WorkspacePage-CK5XCuG_.js +4 -0
  61. package/src/client/dist/pwa/assets/{WorkspacePage-B248nKIU.css → WorkspacePage-w2bF8wTd.css} +1 -1
  62. package/src/client/dist/pwa/assets/{browser-Cl0d1gbu.js → browser-B8tNScg1.js} +1 -1
  63. package/src/client/dist/pwa/assets/{build-path-tree-J3YQeMuV.js → build-path-tree-kmVAcvs_.js} +1 -1
  64. package/src/client/dist/pwa/assets/custom-sounds-CJwd-8TL.js +1 -0
  65. package/src/client/dist/pwa/assets/{de-C-RtXLqL.js → de-BaO6kbdO.js} +1 -1
  66. package/src/client/dist/pwa/assets/{editor.api-BoFiCjBZ.js → editor.api-CgbPVW9s.js} +1 -1
  67. package/src/client/dist/pwa/assets/{efforts-Y6XotW97.js → efforts-y7Wf_Rgd.js} +2 -2
  68. package/src/client/dist/pwa/assets/{es-CBlW91ZK.js → es-DTvSsbD0.js} +1 -1
  69. package/src/client/dist/pwa/assets/{expand-template-sfOHWudd.js → expand-template-BFbbjj7X.js} +1 -1
  70. package/src/client/dist/pwa/assets/{format-mWov137C.js → format-BETfc4z9.js} +1 -1
  71. package/src/client/dist/pwa/assets/{formatters-B_XsveM0.js → formatters-C22K9vlC.js} +1 -1
  72. package/src/client/dist/pwa/assets/{fr-Hfzp_sF5.js → fr-BH7V66Yz.js} +1 -1
  73. package/src/client/dist/pwa/assets/{freemarker2-2pGNakhH.js → freemarker2-DiRVvp9O.js} +1 -1
  74. package/src/client/dist/pwa/assets/{handlebars-Bn2V6Liw.js → handlebars-BLYRroSQ.js} +1 -1
  75. package/src/client/dist/pwa/assets/{html-BBhkJkf2.js → html-DAW2vteY.js} +1 -1
  76. package/src/client/dist/pwa/assets/i18n-DnuTmw3O.js +1 -0
  77. package/src/client/dist/pwa/assets/{index-DCpe-Tfm.js → index-CbyHfF8I.js} +2 -2
  78. package/src/client/dist/pwa/assets/{it-Bl-v27qg.js → it-DZGbkkoy.js} +1 -1
  79. package/src/client/dist/pwa/assets/{javascript-Ba0G68U2.js → javascript-Bb5J8n0k.js} +1 -1
  80. package/src/client/dist/pwa/assets/{liquid-C5VrzHr_.js → liquid-Dqx3adnJ.js} +1 -1
  81. package/src/client/dist/pwa/assets/{mdx-DrPRiuKb.js → mdx-D_7igLV3.js} +1 -1
  82. package/src/client/dist/pwa/assets/{monaco-contributions-qQUY6VS7.js → monaco-contributions-C-0CbrAy.js} +1 -1
  83. package/src/client/dist/pwa/assets/{monaco.contribution-Dtq2RsyB.js → monaco.contribution-c6JPBEZI.js} +2 -2
  84. package/src/client/dist/pwa/assets/network-auth-BE4qbvWm.js +1 -0
  85. package/src/client/dist/pwa/assets/notify-theme-BVFBBGrJ.js +1 -0
  86. package/src/client/dist/pwa/assets/{project-color-Dzvvmaml.js → project-color-CHOR2jB5.js} +1 -1
  87. package/src/client/dist/pwa/assets/{python-Cuf_7umq.js → python-Dqubw1F5.js} +1 -1
  88. package/src/client/dist/pwa/assets/{razor-DcVpxFeh.js → razor-BQphc9Kt.js} +1 -1
  89. package/src/client/dist/pwa/assets/{typescript-Bjcc3kYC.js → typescript-Dep00l0X.js} +1 -1
  90. package/src/client/dist/pwa/assets/{use-search-index-status-Bwf40BEI.js → use-search-index-status-CQHHvHwM.js} +1 -1
  91. package/src/client/dist/pwa/assets/{use-tours-CWafZt-m.js → use-tours-IVbXTmz2.js} +2 -2
  92. package/src/client/dist/pwa/assets/{use-worktree-restore-DkcM2FAZ.js → use-worktree-restore-B3s5xDGR.js} +1 -1
  93. package/src/client/dist/pwa/assets/{workspace-templates-DL_Cs7mD.js → workspace-templates-CyuTpztP.js} +1 -1
  94. package/src/client/dist/pwa/assets/{xml-BmJwqJOz.js → xml-BMS2dvaF.js} +1 -1
  95. package/src/client/dist/pwa/assets/{yaml-DAssfLhS.js → yaml-CYw92aic.js} +1 -1
  96. package/src/client/dist/pwa/index.html +1 -1
  97. package/src/client/dist/pwa/sw.js +1 -1
  98. package/src/mcp-server/README.md +112 -1
  99. package/src/mcp-server/kobo-tasks-server.ts +34 -6
  100. package/src/mcp-server/progress-bar-client.ts +27 -0
  101. package/src/mcp-server/workspace-dialogue-client.ts +26 -7
  102. package/src/client/dist/pwa/assets/ActivityFeed-S3XGw3WW.js +0 -2
  103. package/src/client/dist/pwa/assets/ComparisonPanel-DElbn4ac.js +0 -2
  104. package/src/client/dist/pwa/assets/CreatePage-Bx58t4YW.js +0 -2
  105. package/src/client/dist/pwa/assets/DiffViewer-BH4X9ru1.js +0 -8
  106. package/src/client/dist/pwa/assets/GitPanel-BP3N_4nh.js +0 -3
  107. package/src/client/dist/pwa/assets/MainLayout-DGmMkfuw.js +0 -2
  108. package/src/client/dist/pwa/assets/QSelect-Dh4CjliE.js +0 -1
  109. package/src/client/dist/pwa/assets/SettingsPage-CUQefsDh.js +0 -9
  110. package/src/client/dist/pwa/assets/WorkspacePage-CAsY7Hl-.js +0 -4
  111. package/src/client/dist/pwa/assets/custom-sounds-D-T5rpgv.js +0 -1
  112. package/src/client/dist/pwa/assets/i18n-sBCWwf8Y.js +0 -1
  113. package/src/client/dist/pwa/assets/network-auth-BPJpXK4L.js +0 -1
  114. package/src/client/dist/pwa/assets/notify-theme-Bl9iRsZB.js +0 -1
@@ -14,4 +14,4 @@ KOBO_PR_NUMBER — número de PR/MR en la forge resuelta (vacío si no hay
14
14
  # O directamente con git (funciona en GitHub aunque la rama se haya borrado):
15
15
  git fetch origin pull/[número-pr]/head:[nombre-rama]
16
16
  git worktree add [ruta] [nombre-rama]`,"settings.purgeDocsRestoreFootnote":`GitHub mantiene la ref HEAD de la PR accesible mucho tiempo después de borrar la rama origen (meses / años). La autodetección corre en el watcher de 30 s — no hay que tocar la UI una vez que la carpeta vuelve a existir.`,"settings.purgeDocsPermissionsTitle":`Evitar errores de permisos durante el borrado`,"settings.purgeDocsPermissionsIntro":`Docker suele dejar archivos root-owned en node_modules / vendor dentro del worktree. Cuando Kōbō intenta borrarlos, te topas con EACCES / EPERM y el borrado falla. Dos formas de prevenirlo:`,"settings.purgeDocsPermissionsDocker":'Configurar tu contenedor para que se ejecute como tu usuario host — directiva USER en el Dockerfile, o `user: "${UID}:${GID}"` en docker-compose (con UID/GID exportados en tu shell).',"settings.purgeDocsPermissionsAcl":`Pre-establecer una ACL por defecto en la raíz de los worktrees — red de seguridad que funciona en la MAYORÍA de los casos (ext4/btrfs/xfs + bind mount Docker clásico). Cada archivo nuevo hereda entonces una entrada de acceso para tu usuario, además del propietario nominal:`,"settings.purgeDocsPermissionsAclCommand":` setfacl -d -m u:$(whoami):rwX [raíz-worktrees]`,"settings.purgeDocsPermissionsFootnote":"Limitaciones de las ACL: NO funcionan con volúmenes Docker con nombre (usa un bind mount), sistemas de archivos sin soporte ACL (NTFS, exFAT, tmpfs), SELinux estricto con `:Z`, o cuando Docker `userns-remap` está activado. La solución más fiable sigue siendo configurar el usuario dentro del contenedor (opción 1). Consejo: `rwX` (X mayúscula) solo añade el bit de ejecución en directorios y archivos ya ejecutables — más limpio que `rwx` que haría ejecutable cualquier archivo de texto.","settings.purgeDocsPermissionsRecoverTitle":`Desbloquear un worktree ya roto (archivos root-owned existentes)`,"settings.purgeDocsPermissionsRecoverIntro":`Si te encuentras con un worktree ya lleno de archivos root-owned (Docker ya ha ejecutado, vendor / node_modules están bloqueados), las ACL preventivas de arriba no son suficientes — hay que tratar los archivos EXISTENTES. Dos enfoques, a ejecutar dentro de la carpeta del worktree:`,"settings.purgeDocsPermissionsRecoverAclIntro":`Opción A — ACL recursiva (preserva la propiedad root para auditoría, solo añade acceso para tu usuario en paralelo):`,"settings.purgeDocsPermissionsRecoverAclCommand":`# establece ACL por defecto para archivos futuros Y otorga acceso a todo lo existente
17
- sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Opción B — Tomar la propiedad (más simple, pierde la huella "creado por root en el contenedor" pero rara vez importa):`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Consejo: puedes ejecutar estos comandos directamente sobre la raíz de tus worktrees (ej. `~/.worktrees/`) para cubrir todos los workspaces existentes Y futuros de una sola vez. Una vez hecho, el borrado de Kōbō funcionará sin errores de permisos.","contextMenu.runSetup":`Ejecutar script de setup`,"contextMenu.exportEvents":`Exportar eventos (CSV)`,"contextMenu.dismissChangesRequested":`Marcar «Cambios solicitados» como visto`,"contextMenu.dismissCiFailure":`Marcar «CI en error» como visto`,"contextMenu.restoreChangesRequested":`Marcar «Cambios solicitados» como no visto`,"contextMenu.restoreCiFailure":`Marcar «CI en error» como no visto`,"contextMenu.exportingEvents":`Preparando la exportación…`,"contextMenu.exportEventsError":`Error al exportar los eventos`,"contextMenu.openNotion":`Abrir en Notion`,"contextMenu.openSentry":`Abrir en Sentry`,"contextMenu.openPr":`Abrir PR`,"contextMenu.ignorePrWatch":`Ignorar comprobaciones de PR`,"contextMenu.resumePrWatch":`Reanudar comprobaciones de PR`,"contextMenu.prWatchToggleFailed":`Error al actualizar las comprobaciones de PR`,"workspace.favorite":`Marcar como favorito`,"workspace.unfavorite":`Quitar de favoritos`,"workspace.showFavoritesOnly":`Mostrar solo favoritos`,"workspace.tagFilter":`Filtrar por tags`,"workspace.tagFilterActive":`Filtrar por tags ({count} seleccionados)`,"workspace.tagFilterClear":`Borrar`,"workspace.tagFilterEmpty":`Aún no hay tags. Defínelos en los ajustes y asígnalos desde el menú de un workspace.`,"workspace.searchArchivedToggle":`Buscar también en workspaces archivados`,"workspace.descriptionPlaceholder":`Añadir una breve descripción`,"workspace.descriptionDialogHint":`Texto sin formato, máximo 200 caracteres. Dejar vacío para borrar.`,"workspace.descriptionTooLong":`La descripción debe tener 200 caracteres o menos.`,"workspace.descriptionSaveFailed":`No se pudo guardar la descripción.`,"workspace.agentDescriptionTooltip":`Estado en vivo mantenido por el agente`,"mcp.tool.setWorkspaceDescription":`Establece la breve descripción del workspace (≤ 200 caracteres).`,"tags.manage":`Gestionar etiquetas`,"tags.manageTitle":`Gestionar etiquetas del workspace`,"tags.noTagsDefined":`Sin etiquetas. Añádelas en Ajustes > Global > Etiquetas.`,"tags.orphanedHint":`{count} etiqueta(s) ya no están en el catálogo global. Desmárcalas para quitarlas.`,"settings.tagsTitle":`Etiquetas de workspace`,"settings.tagsHint":`Define las etiquetas asignables a los workspaces. Escribe para añadir, clic en la cruz para quitar.`,"settings.tagsLabel":`Etiquetas disponibles`,"settings.branchPrefixesTitle":`Prefijos de rama`,"settings.branchPrefixesHint":`Gestiona los prefijos de rama de Git disponibles en la página de creación de workspaces. El primero se preselecciona por defecto.`,"settings.branchPrefixesEmpty":`No hay ningún prefijo de rama definido. Añade al menos uno abajo.`,"settings.branchPrefixesAddLabel":`Nuevo prefijo`,"settings.branchPrefixesEditHint":`Haz clic para renombrar`,"settings.branchPrefixesMoveUp":`Subir`,"settings.branchPrefixesMoveDown":`Bajar`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Elige dónde se crean los worktrees de nuevos workspaces. Las rutas relativas se resuelven desde el proyecto; se admiten rutas absolutas Linux/macOS y Windows, $HOME, ~ y %USERPROFILE%.`,"settings.worktreesPathLabel":`Ruta de worktrees`,"settings.worktreesPathRequired":`La ruta de worktrees es obligatoria.`,"settings.worktreesPrefixByProject":`Prefijar los worktrees con el nombre del proyecto`,"settings.worktreesPrefixByProjectHint":`Coloca cada worktree en un subdirectorio con el nombre del proyecto para evitar colisiones cuando varios proyectos comparten la misma raíz.`,"settings.shareTitle":`Compartir configuración`,"settings.shareHint":`Exporta tus ajustes, plantillas y etiquetas en un bundle JSON. Las claves MCP no se incluyen por seguridad.`,"settings.exportConfig":`Exportar`,"settings.importConfig":`Importar`,"settings.exportSuccess":`Configuración exportada`,"settings.importSuccess":`Configuración importada`,"settings.importConfirmTitle":`Importar configuración`,"settings.importConfirmMessage":`Esto reemplazará tus ajustes, plantillas y etiquetas actuales. Las claves MCP se conservan. ¿Continuar?`,"settings.mcp.title":`Conexiones de LLM externos (MCP)`,"settings.mcp.hint":`Conecta un cliente MCP para crear, archivar, liberar espacio, eliminar o restaurar workspaces, retomar una PR y hablar con tus agentes.`,"settings.mcp.remoteDisabled":`Las conexiones remotas requieren acceso de red y reiniciar el servidor después de activarlo.`,"settings.mcp.clientName":`Nombre del cliente (opcional)`,"settings.mcp.connection":`Conexión`,"settings.mcp.local":`HTTP local`,"settings.mcp.remote":`HTTP remoto`,"settings.mcp.proxy":`Proxy inverso`,"settings.mcp.stdio":`Stdio local`,"settings.mcp.copyUrl":`Copiar URL`,"settings.mcp.copyConfig":`Copiar configuración`,"settings.mcp.copyWithToken":`Copiar con token`,"settings.mcp.genericFormat":`Estos ejemplos usan el formato genérico mcpServers. Adapta el contenedor a tu cliente MCP. Las vistas previas muestran un marcador para el token.`,"settings.mcp.tokenUnavailable":`No hay ningún token disponible. Activa el acceso de red antes de copiar una configuración autenticada.`,"settings.mcp.stdioUnavailable":`El punto de entrada stdio no está disponible en esta instalación. Usa HTTP o compila Kōbō primero.`,"settings.mcp.copyFailed":`No se pudo copiar al portapapeles.`,"tours.settings.mcp.title":`Conectar un LLM externo`,"tours.settings.mcp.description":`Copia una configuración HTTP o stdio para conectar un asistente externo. Puede crear un workspace con las opciones del formulario, retomar una PR, gestionar su archivado, eliminación o restauración y comunicarse con tus agentes.`,"settings.network.title":`Acceso de red`,"settings.network.hint":`Controla Kōbō desde otro dispositivo de tu LAN de confianza. Off = solo localhost. On = accesible en tu red, protegido por un token. Reinicia Kōbō tras cambiar.`,"settings.network.enable":`Activar acceso de red`,"settings.network.behindProxy":`Detrás de un reverse proxy`,"settings.network.behindProxyHint":`Kōbō ya no puede distinguir tu propia máquina de una solicitud reenviada — incluso localhost necesitará el token a partir de ahora. Actívalo solo si un reverse proxy (Traefik, nginx, Caddy…) está delante de Kōbō.`,"settings.network.restartRequired":`Reinicia Kōbō para aplicar la nueva dirección de bind.`,"settings.network.token":`Token de acceso`,"settings.network.copy":`Copiar`,"settings.network.copied":`Copiado`,"settings.network.regenerate":`Regenerar`,"settings.network.regenerateConfirm":`¿Regenerar el token? Los dispositivos conectados necesitarán el nuevo token.`,"settings.network.urls":`URLs de LAN`,"settings.network.scan":`Escanea para conectar`,"settings.network.noUrls":`No se detectó ninguna dirección LAN.`,"settings.network.loadFailed":`No se pudieron cargar los ajustes de acceso de red.`,"settings.network.updateFailed":`No se pudieron actualizar los ajustes de acceso de red.`,"settings.unsavedChanges.title":`Cambios sin guardar`,"settings.unsavedChanges.message":`Este proyecto tiene cambios sin guardar. Cambiar de proyecto los descartará.`,"settings.unsavedChanges.discard":`Descartar y cambiar`,"settings.unsavedChanges.cancel":`Cancelar`,"settings.loadFailed":`No se pudieron cargar los ajustes`,"settings.loadFailedHint":`Guardar está desactivado: el formulario muestra valores por defecto y escribirlos sobrescribiría tu configuración real.`,"health.title":`Salud`,"health.tooltip":`Estado del sistema`,"changelog.title":`Changelog`,"changelog.tooltip":`Novedades de Kōbō`,"changelog.empty":`Ningún changelog disponible.`,"changelog.current":`actual`,"changelog.currentVersion":`Versión actual: v{version}`,"health.envTitle":`Entorno`,"health.version":`Versión`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de datos`,"health.dbPath":`Ruta`,"health.dbSize":`Tamaño`,"health.schemaVersion":`Versión del esquema`,"health.settingsSchemaVersion":`Esquema de ajustes`,"health.runtimesTitle":`Motores de agente`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude no encontrado en PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binario codex no resoluble`,"health.forgeCliTitle":`CLI de forge (gh / glab)`,"health.forgeCliMissing":`No se encontró ni gh ni glab — pull requests y vigilancia de CI no disponibles`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} en total, {archived} archivados`,"health.worktreesMissing":`{count} worktree(s) faltan en el disco`,"health.sessionsTitle":`Sesiones de agente`,"health.sessionsOrphaned":`{n} sesión/sesiones huérfana(s) en ejecución`,"health.integrationsTitle":`Integraciones`,"health.integrationConfigured":`configurada`,"health.integrationMissing":`sin configurar`,"health.integrationDisabled":`desactivada`,"settings.integrationEnabled":`Activar integración`,"health.activeTitle":`Estado activo`,"health.activeQuotaBackoffs":`Quota backoffs pendientes`,"health.activeWakeups":`Despertares programados`,"health.activeAutoLoop":`Auto-loop en ejecución`,"health.activeAgentSessions":`Sesiones de agente activas`,"health.activeDevServers":`Servidores de desarrollo activos`,"health.noneActive":`Ninguno.`,"health.quotaResumeAt":`reanuda a las {time}`,"health.wakeupAt":`despierta a las {time}`,"health.startedAgo":`iniciada hace {time}`,"health.autoLoopReady":`listo, iterando`,"health.autoLoopGrooming":`grooming en curso`,"session.started":`Sesión iniciada`,"session.ended":`Sesión finalizada`,"session.compacted":`Contexto compactado`,"session.endedCompleted":`Turno finalizado: envía un mensaje para continuar`,"session.endedKilled":`Sesión detenida`,"session.endedError":`La sesión terminó con un error`,"session.endedWatchdog":`Sesión cerrada a la fuerza tras un periodo de inactividad`,"tool.running":`Ejecutando...`,"activity.raw_lines":`Líneas de salida brutas ({n})`,"api.timeout":`La solicitud superó el límite de {seconds} segundos.`,"api.mutationTimeout":`La solicitud superó el límite de {seconds} segundos. La operación puede seguir en curso. Actualiza su estado antes de volver a intentarlo.`,"activity.sessionsError":`No se pudieron cargar las sesiones: {message}`,"activity.historyError":`No se pudo cargar el historial: {message}`,"activity.loading_older":`Cargando mensajes anteriores…`,"activity.compacting":`Compactando el contexto…`,"activity.prev_user_message":`Mensaje anterior del usuario`,"activity.scroll_to_bottom":`Desplazar al final`,"activity.empty":`Nada todavía`,"activity.emptyHint":`La salida del agente aparecerá aquí en cuanto arranque una sesión.`,"activity.a11y.region":`Anuncios de actividad del agente`,"activity.a11y.agentSaid":`Agente: {text}`,"activity.a11y.toolStarted":`Herramienta {name} iniciada`,"activity.a11y.toolFinished":`Herramienta {name} finalizada`,"activity.a11y.toolFailed":`Herramienta {name} falló`,"chat.systemPrompt":`Prompt del sistema`,"chat.agent":`Agente`,"chat.cleanupScript":`Script de limpieza`,"chat.archiveScript":`Script de archivado`,"chat.setupScript":`Script de setup`,"chat.hookScript":`Hook {event}`,"chat.scriptDone":`Hecho`,"chat.scriptComplete":`[{phase}] Completado`,"chat.scriptError":`[{phase}] Error: {message}`,"chat.unknownError":`desconocido`,"chat.you":`Tú`,"chat.session":`Sesión`,"chat.nActions":`{n} acción | {n} acciones`,"chat.lastUpdatedAt":`Última actualización a las {time}`,"chat.scrollToTurnTop":`Desplazar al inicio del mensaje`,"migration.backing_up":`Haciendo copia de seguridad de la base de datos…`,"migration.running":`Migrando datos del agente — {processed}/{total}`,"migration.error":`La migración falló`,"migration.backup_location":`Se guardó una copia de seguridad en {path}. Reinicia Kōbō para reintentar.`,"migration.retry":`Reinicia Kōbō para reintentar.`,"engine.select":`Motor`,"engine.model":`Modelo`,"engine.effort":`Esfuerzo de razonamiento`,"wakeup.scheduledIn":`Próximo despertar en {n}s`,"wakeup.scheduledAt":`Próximo despertar a las {time}`,"wakeup.firing":`Despertando...`,"wakeup.reason":`Razón: {reason}`,"wakeup.cancel":`Cancelar este despertar`,"wakeup.pendingIndicator":`Despertar programado`,"cron.pendingIndicator":`{n} cron(s) programado(s)`,"schedule.tabLabel":`Programación`,"schedule.admissionTitle":`Nueva sesión automática no disponible por ahora.`,"schedule.admissionHint":`Los plazos no cambian. La entrega en una conversación existente sigue sus propias reglas.`,"schedule.admission.not-found":`Espacio no encontrado.`,"schedule.admission.archived":`Espacio archivado.`,"schedule.admission.purged":`Restaura el worktree.`,"schedule.admission.shutdown":`El servidor se está apagando.`,"schedule.admission.lifecycle":`Hay una operación del espacio en curso.`,"schedule.admission.active-session":`La sesión actual aún no se ha cerrado.`,"schedule.admission.awaiting-user":`Se espera una respuesta del usuario.`,"schedule.admission.compacting":`Compactación del contexto en curso.`,"schedule.admission.quota":`Esperando la recuperación de la cuota.`,"schedule.admission.blocked":`Bucle bloqueado; resuelve la causa indicada.`,"schedule.admission.capacity":`Límite de concurrencia alcanzado: {running}/{limit} sesiones.`,"schedule.panelTitle":`Automatización`,"schedule.panelDescription":`Despertar este workspace más tarde o ejecutar instrucciones según una programación.`,"schedule.activeTitle":`Programaciones activas`,"schedule.emptyTitle":`Nada programado`,"schedule.emptyDescription":`Crea un wakeup puntual o una tarea recurrente abajo.`,"schedule.cancelWakeup":`Cancelar este wakeup`,"schedule.cancelCron":`Eliminar esta tarea recurrente`,"schedule.createTitle":`Crear una programación`,"schedule.createDescription":`Elige cuándo y cómo debe ejecutarse el agente.`,"schedule.typeWakeup":`Wakeup puntual`,"schedule.typeRecurring":`Tarea recurrente`,"schedule.wakeupDescription":`Ejecutar el prompt una vez después de un retraso.`,"schedule.cronDescription":`Ejecutar el prompt periódicamente con una frecuencia fija.`,"schedule.promptHint":`Instrucciones que se enviarán al agente`,"schedule.frequencyTitle":`Frecuencia`,"schedule.advancedDescription":`Usar una expresión cron sin procesar`,"schedule.cronExpressionLabel":`Expresión cron`,"schedule.sessionModeTitle":`Sesión de ejecución`,"schedule.modeResume":`Reanudar sesión`,"schedule.oneShotHint":`Eliminar esta programación después de su primera ejecución.`,"schedule.wakeupTitle":`Wakeup pendiente`,"schedule.cronsTitle":`Programaciones recurrentes`,"schedule.noWakeup":`Sin wakeup programado`,"schedule.noCrons":`Sin cron programado`,"schedule.invalidCron":`Inactiva: expresión no válida. Elimina y vuelve a crear esta programación.`,"schedule.nextFireAt":`próximo a las {time}`,"schedule.lastFiredAt":`último hace {time}`,"schedule.addCronTitle":`Añadir una tarea recurrente`,"schedule.addWakeupTitle":`Programar un wakeup`,"schedule.every":`Cada`,"schedule.unitMinutes":`minutos`,"schedule.unitHours":`horas`,"schedule.unitDays":`días`,"schedule.daysDriftWarning":`El intervalo puede reducirse a 1 día a fin de mes (limitación de cron).`,"schedule.advancedExpression":`Expresión avanzada (opcional)`,"schedule.advancedHint":`Cron sin procesar (p. ej. */15 * * * *) o {'@'}hourly/{'@'}daily — anula el selector si se rellena.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Etiqueta (opcional)`,"schedule.delayMinutes":`Retraso (minutos)`,"schedule.modeFresh":`Nueva sesión`,"schedule.oneShot":`Ejecutar solo una vez`,"schedule.addCronBtn":`Añadir cron`,"schedule.addWakeupBtn":`Programar wakeup`,"schedule.cronCreated":`Tarea recurrente añadida`,"schedule.wakeupCreated":`Wakeup programado`,"askUserQuestion.title":`El agente hace una pregunta`,"askUserQuestion.submit":`Enviar respuesta`,"askUserQuestion.multiSelectHint":`Selecciona una o más opciones`,"askUserQuestion.otherOption":`Otro`,"askUserQuestion.otherOptionHint":`especifíquelo en su próximo mensaje`,"askUserQuestion.freeFormLabel":`Especifique su respuesta`,"askUserQuestion.freeFormHint":`Esta respuesta se enviará directamente al agente.`,"askUserQuestion.noPending":`Ninguna pregunta pendiente`,"askUserQuestion.next":`Siguiente`,"askUserQuestion.previous":`Anterior`,"askUserQuestion.cancel":`Cancelar`,"askUserQuestion.cancelTooltip":`Saltar esta pregunta — el agente continuará sin respuesta`,"askUserQuestion.collapse":`Contraer el panel de pregunta`,"askUserQuestion.expand":`Expandir el panel de pregunta`,"permissionRequest.title":`El agente quiere usar una herramienta`,"permissionRequest.allow":`Permitir`,"permissionRequest.allowOnce":`Permitir una vez`,"permissionRequest.allowTurn":`Permitir este turno`,"permissionRequest.operationUnavailable":`Detalles no disponibles; permite una vez o toda la herramienta.`,"permissionRequest.allowOperation":`Permitir siempre esta operación`,"permissionRequest.allowTool":`Permitir siempre esta herramienta`,"permissionRequest.deny":`Denegar`,"permissionRequest.tool":`Herramienta`,"permissionRequest.input":`Entrada`,"permissionRequest.rawInput":`Detalles técnicos`,"permissionRequest.collapse":`Contraer el panel de permisos`,"permissionRequest.expand":`Expandir el panel de permisos`,"permissionRequest.denied":`denegado por el usuario`,"workspaceStatus.created":`creado`,"workspaceStatus.extracting":`extracción`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.compacting":`compactando`,"chatInput.compactingBanner":`Compactando el contexto. Podrás enviar mensajes cuando termine.`,"workspaceStatus.executing":`en curso`,"workspaceStatus.awaitingUser":`esperando tu respuesta`,"workspaceStatus.completed":`completado`,"workspaceStatus.idle":`inactivo`,"workspaceStatus.error":`error`,"workspaceStatus.quota":`cuota alcanzada`,"workspaceStatus.retrying":`reanudación automática`,"workspaceList.prOpen":`#{n} — Pull request abierta`,"workspaceList.prWatchDisabledIndicator":`Comprobaciones de PR ignoradas para este workspace`,"workspaceList.prChangesRequested":`#{n} — Cambios solicitados`,"workspaceList.attentionCiFailed":`CI fallida`,"workspaceList.attentionChangesRequested":`Cambios solicitados`,"workspaceList.attentionReadyToMerge":`Listo para merge`,"autoLoop.status.active":`Activo`,"autoLoop.status.waiting":`En espera`,"autoLoop.status.blocked":`Bloqueado`,"autoLoop.status.completed":`Completado`,"autoLoop.status.stopped":`Detenido`,"autoLoop.phase.grooming":`Preparación`,"autoLoop.phase.execution":`Ejecución`,"autoLoop.phase.finalization":`Finalización`,"autoLoop.iteration":`Iteración {count}`,"autoLoop.resume":`Reanudar auto-loop`,"autoLoop.retryAt":`Reanudación prevista para`,"autoLoop.actionFailed":`No se pudo completar la acción.`,"autoLoop.messages.count":`{count} instrucción(es) en cola`,"autoLoop.messages.pending":`En cola`,"autoLoop.messages.dispatching":`Enviando`,"autoLoop.messages.unknown":`Entrega incierta`,"autoLoop.messages.delivered":`Entregada`,"autoLoop.messages.cancel":`Cancelar instrucción`,"autoLoop.messages.acknowledge":`Marcar como recibida`,"autoLoop.messages.retry":`Volver a enviar`,"autoLoop.messages.unknownHelp":`No se pudo confirmar la entrega. Revise la conversación antes de decidir. Volver a enviar puede duplicar una instrucción ya recibida.`,"autoLoop.reason.quota":`Esperando la cuota del proveedor.`,"autoLoop.reason.transient":`Reanudación tras una interrupción temporal.`,"autoLoop.reason.awaiting-user":`Esperando su respuesta.`,"autoLoop.reason.capacity-or-lifecycle":`Esperando una plaza disponible para un agente.`,"autoLoop.reason.message-delivery-unknown":`Resuelva la instrucción con entrega incierta antes de reanudar.`,"autoLoop.reason.error":`El bucle necesita atención antes de continuar.`,"autoLoop.reason.stall":`No se detectó progreso. Revise la última sesión antes de reanudar.`,"autoLoop.reason.awaiting-clarification":`Se necesita una aclaración antes de continuar.`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Iniciar auto-loop`,"autoLoop.prepare":`Preparar para auto-loop`,"autoLoop.reprepare":`Volver a preparar para auto-loop`,"autoLoop.reprepareTooltip":`Volver a ejecutar la fase de grooming para añadir o refrescar tareas antes de reanudar el bucle`,"autoLoop.prepareBusy":`Espera a que el agente termine antes de preparar`,"autoLoop.forceReady":`Sé lo que hago — omitir preparación`,"autoLoop.forceReadyConfirm":`¿Omitir la preparación y marcar auto-loop listo? El loop puede quedarse bloqueado si las tareas no son atómicas.`,"autoLoop.stop":`Detener auto-loop`,"autoLoop.notReady":`Ejecute primero 'Preparar para auto-loop'`,"autoLoop.noTasks":`Añada tareas primero`,"autoLoop.progress":`Auto-loop · {done}/{total} tareas`,"autoLoop.preparing":`Auto-loop · preparando`,"autoLoop.preparingTooltip":`Preparación en curso — el agente está creando / revisando tareas. El bucle arrancará cuando llame a mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en ejecución`,"autoLoop.startInMode":`Iniciar en modo auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm:`,"autoLoop.brainstormModelTooltip":`Modelo usado solo para la sesión de brainstorming inicial — cada tarea posterior usa el modelo elegido arriba`,"autoLoop.brainstormReasoningPrefix":`Brainstorm:`,"autoLoop.brainstormReasoningTooltip":`Nivel de razonamiento usado solo para la sesión de brainstorming inicial`,"autoLoop.executionModelPrefix":`Loop:`,"autoLoop.executionModelTooltip":`Modelo usado para cada tarea del auto-loop tras la sesión de brainstorming inicial`,"autoLoop.sessionMode.perTask":`Nueva sesión por tarea`,"autoLoop.sessionMode.label":`Sesión:`,"autoLoop.sessionMode.perTaskTooltip":`Cada tarea inicia una sesión nueva de Claude Code sin memoria de tareas anteriores`,"autoLoop.sessionMode.continuous":`Sesión continua`,"autoLoop.sessionMode.continuousTooltip":`Todas las tareas se encadenan en la misma sesión — el agente conserva todo el contexto, pero la sesión se alarga con el tiempo`,"koboCommand.prepAutoloopDesc":`Preparar tareas para modo auto-loop (atomicidad)`,"staleSessionBanner.title":`Auto-loop en curso`,"staleSessionBanner.message":`Estás viendo una sesión anterior — el agente está trabajando en la más reciente.`,"staleSessionBanner.staleTitle":`Sesión anterior`,"staleSessionBanner.staleMessage":`Estás viendo una sesión anterior — los mensajes que envíes irán a esta sesión, no a la más reciente.`,"staleSessionBanner.switchToCurrent":`Cambiar a la actual`,"network.login.title":`Acceso de red`,"network.login.description":`Este Kōbō requiere un token para controlarse desde la red. Pega el token que aparece en Ajustes en la máquina anfitriona.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Pega tu token`,"network.login.connect":`Conectar`,"network.login.invalid":`Token no válido`,"network.login.serverError":`Error del servidor — inténtalo de nuevo.`,"network.login.unreachable":`Kōbō no es accesible — comprueba tu conexión.`,"layout.toggleWorkspaces":`Mostrar/ocultar el panel de espacios`,"layout.togglePanel":`Mostrar/ocultar el panel lateral`,"unsaved.title":`¿Salir sin guardar?`,"unsaved.message":`Tienes cambios sin guardar. Salir de esta página los descarta.`,"unsaved.leave":`Salir`,"unsaved.stay":`Quedarme`,"prCheckout.staleRetriesExhausted":`El estado del repositorio siguió cambiando mientras intentábamos aplicar tus decisiones. Cierra este diálogo e inténtalo de nuevo desde el selector de pull requests.`,"prPicker.title":`Importar desde una pull request`,"prPicker.filterAll":`Todas`,"prPicker.filterMine":`Las mías`,"prPicker.filterReviewRequested":`Revisión solicitada`,"prPicker.searchPlaceholder":`Buscar pull requests…`,"prPicker.loadMore":`Cargar más`,"prPicker.empty":`Ninguna pull request abierta coincide.`,"prPicker.forkNotSupported":`Esta PR proviene de un fork; Kōbō no puede hacerle checkout.`,"prPicker.loadFailed":`Error al cargar las pull requests.`,"prPicker.badge.workspaceExists":`Ya abierta en Kōbō`,"prPicker.badge.worktreePresent":`Worktree presente`,"prPicker.badge.localBranch":`Branch local`,"prPicker.badge.new":`Nueva`,"prPicker.badge.draft":`Borrador`,"prCheckout.title":`Preparar la worktree`,"prCheckout.apply":`Aplicar`,"prCheckout.cancel":`Cancelar`,"prCheckout.retry":`Reintentar`,"prCheckout.diagnoseFailed":`Error al diagnosticar la pull request.`,"prCheckout.resolveFailed":`Error al resolver el checkout de la pull request.`,"prCheckout.path.required":`Introduce una ruta de worktree que aún no exista.`,"prCheckout.workspace.restoreNotAvailable":"Restaurar un workspace purgado no está disponible todavía desde aquí. Vuelve a crear su carpeta de worktree en disco (por ejemplo, con `git worktree add`) y Kōbō la reconectará automáticamente en unos 30 segundos.","prCheckout.staleReloaded":`El repositorio cambió; el diagnóstico se ha actualizado.`,"prCheckout.step.blocked":`No se puede continuar`,"prCheckout.step.path":`Ubicación de la worktree`,"prCheckout.step.workspace":`Workspace existente`,"prCheckout.step.worktree":`Worktree existente`,"prCheckout.step.operation":`Operación git en curso`,"prCheckout.step.changes":`Cambios sin commitear`,"prCheckout.step.divergence":`Branch local vs origin`,"prCheckout.workspace.activeHint":`Un workspace llamado "{name}" ya sigue este branch.`,"prCheckout.workspace.open":`Abrir ese workspace`,"prCheckout.workspace.continue":`Continuar por otra ruta`,"prCheckout.workspace.unarchive":`Desarchivar y abrirlo`,"prCheckout.workspace.restore":`Recrear su worktree`,"prCheckout.worktree.orphanHint":`Ya existe una worktree en este branch en {path}.`,"prCheckout.worktree.attach":`Adjuntarla`,"prCheckout.worktree.branchInUse":`Esta rama ya está extraída. Adjunte su worktree existente.`,"prCheckout.worktree.createElsewhere":`Crear otra en otro lugar`,"prCheckout.operation.hint":`Hay un {operation} en curso en esa worktree.`,"prCheckout.operation.abort":`Abortarlo`,"prCheckout.operation.cancel":`Dejarlo tal cual y detenerse aquí`,"prCheckout.changes.hint":`{modified} modificado(s), {staged} en stage, {untracked} sin seguimiento.`,"prCheckout.changes.stash":`Guardarlos en un stash`,"prCheckout.changes.commit":`Commitearlos`,"prCheckout.changes.discard":`Descartarlos (se conservan en un stash etiquetado)`,"prCheckout.changes.keepResetConflict":`Conservar cambios locales es incompatible con un reset. Usa stash o commit, o conserva la rama.`,"prCheckout.changes.keep":`Dejarlos como están`,"prCheckout.divergence.behindHint":`Tu branch está {behind} commit(s) por detrás de origin.`,"prCheckout.divergence.aheadHint":`Tu branch tiene {ahead} commit(s) sin pushear.`,"prCheckout.divergence.divergedHint":`{ahead} por delante, {behind} por detrás de origin.`,"prCheckout.divergence.notFastForward":`No se puede hacer fast-forward: la rama contiene commits locales.`,"prCheckout.divergence.fastForward":`Fast-forward hacia origin`,"prCheckout.divergence.rebase":`Rebase sobre origin`,"prCheckout.divergence.resetHard":`Restablecer a origin (se crea antes un branch de respaldo)`,"prCheckout.divergence.keep":`Mantener el estado local`,"prCheckout.blocked.forgeUnavailable":`Falta el CLI de la forge o no está autenticado.`,"prCheckout.blocked.forkPr":`Esta PR proviene de un fork; Kōbō no puede hacerle checkout.`,"prCheckout.blocked.headBranchDeleted":`El branch ya no existe en el remote.`,"prCheckout.blocked.indexLock":`Hay otro proceso git en curso (index.lock está presente).`,"prCheckout.blocked.pathOccupied":`{path} ya existe y no es una worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} es una worktree en otro branch ({branch}).`,"prCheckout.blocked.noCommonAncestor":`Ya existe un branch local llamado {branch} con un historial sin relación.`,"split.title":`Vista doble de workspaces`,"split.open":`Abrir en paralelo`,"split.openBeside":`Abrir al lado`,"split.close":`Cerrar vista doble`,"split.left":`Workspace izquierdo`,"split.right":`Workspace derecho`,"split.choose":`Elegir un workspace`,"split.recipient":`Enviar a: {name}`,"absence.title":`Desde tu última visita`,"settings.activityDigestHint":`Muestra un resumen de los eventos ocurridos durante tu ausencia. Al desactivarlo, se oculta la entrada y se dejan de registrar nuevos eventos, sin borrar el historial existente.`,"absence.pending":`Cambios por revisar`,"absence.retention":`Actividad importante de los últimos 30 días, registrada desde la instalación de esta función. Las visitas se guardan solo en este navegador.`,"absence.since":`Desde {date}`,"absence.error":`No se pudo cargar la actividad.`,"absence.retry":`Reintentar`,"absence.empty":`No hay actividad nueva.`,"absence.more":`Cargar más`,"absence.markRead":`Marcar los eventos mostrados como leídos`,"absence.kind.question":`Pregunta realizada`,"absence.kind.permission":`Aprobación solicitada`,"absence.kind.completed":`Sesión finalizada`,"absence.kind.error":`Error del agente`,"absence.kind.pr-merged":`PR fusionada`,"absence.kind.pr-approved":`PR aprobada`,"absence.kind.pr-changes-requested":`Cambios solicitados`,"absence.kind.pr-ci-failed":`CI fallida`,"absence.kind.pr-ci-recovered":`CI recuperada`,"absence.kind.pr-merge-conflict":`Conflicto de merge`,"absence.kind.pr-ready-to-merge":`PR lista para merge`,"absence.kind.archived":`Workspace archivado`,"absence.kind.purged":`Worktree purgado`,"absence.kind.restored":`Worktree restaurado`,"tours.split.controls.title":`Dos workspaces independientes`,"tours.split.controls.description":`Elige un workspace por panel. Ajusta la separación; cada conversación conserva su destinatario y sus paneles.`,"tours.home.sort.title":`Ordenar workspaces`,"tours.home.sort.description":`Elige el orden y la dirección dentro de cada grupo. Tu selección se guarda.`,"tours.home.activity.title":`Revisar la actividad tras una ausencia`,"tours.home.activity.description":`Al pie del panel izquierdo encontrarás preguntas, sesiones finalizadas, errores y cambios de PR desde tu última visita.`};export{e as default};
17
+ sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Opción B — Tomar la propiedad (más simple, pierde la huella "creado por root en el contenedor" pero rara vez importa):`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Consejo: puedes ejecutar estos comandos directamente sobre la raíz de tus worktrees (ej. `~/.worktrees/`) para cubrir todos los workspaces existentes Y futuros de una sola vez. Una vez hecho, el borrado de Kōbō funcionará sin errores de permisos.","contextMenu.runSetup":`Ejecutar script de setup`,"contextMenu.exportEvents":`Exportar eventos (CSV)`,"contextMenu.dismissChangesRequested":`Marcar «Cambios solicitados» como visto`,"contextMenu.dismissCiFailure":`Marcar «CI en error» como visto`,"contextMenu.restoreChangesRequested":`Marcar «Cambios solicitados» como no visto`,"contextMenu.restoreCiFailure":`Marcar «CI en error» como no visto`,"contextMenu.exportingEvents":`Preparando la exportación…`,"contextMenu.exportEventsError":`Error al exportar los eventos`,"contextMenu.openNotion":`Abrir en Notion`,"contextMenu.openSentry":`Abrir en Sentry`,"contextMenu.openPr":`Abrir PR`,"contextMenu.ignorePrWatch":`Ignorar comprobaciones de PR`,"contextMenu.resumePrWatch":`Reanudar comprobaciones de PR`,"contextMenu.prWatchToggleFailed":`Error al actualizar las comprobaciones de PR`,"workspace.favorite":`Marcar como favorito`,"workspace.unfavorite":`Quitar de favoritos`,"workspace.showFavoritesOnly":`Mostrar solo favoritos`,"workspace.tagFilter":`Filtrar por tags`,"workspace.tagFilterActive":`Filtrar por tags ({count} seleccionados)`,"workspace.tagFilterClear":`Borrar`,"workspace.tagFilterEmpty":`Aún no hay tags. Defínelos en los ajustes y asígnalos desde el menú de un workspace.`,"workspace.searchArchivedToggle":`Buscar también en workspaces archivados`,"workspace.descriptionPlaceholder":`Añadir una breve descripción`,"workspace.descriptionDialogHint":`Texto sin formato, máximo 200 caracteres. Dejar vacío para borrar.`,"workspace.descriptionTooLong":`La descripción debe tener 200 caracteres o menos.`,"workspace.descriptionSaveFailed":`No se pudo guardar la descripción.`,"workspace.agentDescriptionTooltip":`Estado en vivo mantenido por el agente`,"mcp.tool.setWorkspaceDescription":`Establece la breve descripción del workspace (≤ 200 caracteres).`,"tags.manage":`Gestionar etiquetas`,"tags.manageTitle":`Gestionar etiquetas del workspace`,"tags.noTagsDefined":`Sin etiquetas. Añádelas en Ajustes > Global > Etiquetas.`,"tags.orphanedHint":`{count} etiqueta(s) ya no están en el catálogo global. Desmárcalas para quitarlas.`,"settings.tagsTitle":`Etiquetas de workspace`,"settings.tagsHint":`Define las etiquetas asignables a los workspaces. Escribe para añadir, clic en la cruz para quitar.`,"settings.tagsLabel":`Etiquetas disponibles`,"settings.branchPrefixesTitle":`Prefijos de rama`,"settings.branchPrefixesHint":`Gestiona los prefijos de rama de Git disponibles en la página de creación de workspaces. El primero se preselecciona por defecto.`,"settings.branchPrefixesEmpty":`No hay ningún prefijo de rama definido. Añade al menos uno abajo.`,"settings.branchPrefixesAddLabel":`Nuevo prefijo`,"settings.branchPrefixesEditHint":`Haz clic para renombrar`,"settings.branchPrefixesMoveUp":`Subir`,"settings.branchPrefixesMoveDown":`Bajar`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Elige dónde se crean los worktrees de nuevos workspaces. Las rutas relativas se resuelven desde el proyecto; se admiten rutas absolutas Linux/macOS y Windows, $HOME, ~ y %USERPROFILE%.`,"settings.worktreesPathLabel":`Ruta de worktrees`,"settings.worktreesPathRequired":`La ruta de worktrees es obligatoria.`,"settings.worktreesPrefixByProject":`Prefijar los worktrees con el nombre del proyecto`,"settings.worktreesPrefixByProjectHint":`Coloca cada worktree en un subdirectorio con el nombre del proyecto para evitar colisiones cuando varios proyectos comparten la misma raíz.`,"settings.shareTitle":`Compartir configuración`,"settings.shareHint":`Exporta tus ajustes, plantillas y etiquetas en un bundle JSON. Las claves MCP no se incluyen por seguridad.`,"settings.exportConfig":`Exportar`,"settings.importConfig":`Importar`,"settings.exportSuccess":`Configuración exportada`,"settings.importSuccess":`Configuración importada`,"settings.importConfirmTitle":`Importar configuración`,"settings.importConfirmMessage":`Esto reemplazará tus ajustes, plantillas y etiquetas actuales. Las claves MCP se conservan. ¿Continuar?`,"settings.mcp.title":`Conexiones de LLM externos (MCP)`,"settings.mcp.hint":`Conecta un cliente MCP para crear, archivar, liberar espacio, eliminar o restaurar workspaces, retomar una PR y hablar con tus agentes.`,"settings.mcp.remoteDisabled":`Las conexiones remotas requieren acceso de red y reiniciar el servidor después de activarlo.`,"settings.mcp.clientName":`Nombre del cliente (opcional)`,"settings.mcp.connection":`Conexión`,"settings.mcp.local":`HTTP local`,"settings.mcp.remote":`HTTP remoto`,"settings.mcp.proxy":`Proxy inverso`,"settings.mcp.stdio":`Stdio local`,"settings.mcp.copyUrl":`Copiar URL`,"settings.mcp.copyConfig":`Copiar configuración`,"settings.mcp.copyWithToken":`Copiar con token`,"settings.mcp.genericFormat":`Estos ejemplos usan el formato genérico mcpServers. Adapta el contenedor a tu cliente MCP. Las vistas previas muestran un marcador para el token.`,"settings.mcp.tokenUnavailable":`No hay ningún token disponible. Activa el acceso de red antes de copiar una configuración autenticada.`,"settings.mcp.stdioUnavailable":`El punto de entrada stdio no está disponible en esta instalación. Usa HTTP o compila Kōbō primero.`,"settings.mcp.copyFailed":`No se pudo copiar al portapapeles.`,"tours.settings.mcp.title":`Conectar un LLM externo`,"tours.settings.mcp.description":`Copia una configuración HTTP o stdio para conectar un asistente externo. Puede crear un workspace con las opciones del formulario, retomar una PR, gestionar su archivado, eliminación o restauración y comunicarse con tus agentes.`,"settings.network.title":`Acceso de red`,"settings.network.hint":`Controla Kōbō desde otro dispositivo de tu LAN de confianza. Off = solo localhost. On = accesible en tu red, protegido por un token. Reinicia Kōbō tras cambiar.`,"settings.network.enable":`Activar acceso de red`,"settings.network.behindProxy":`Detrás de un reverse proxy`,"settings.network.behindProxyHint":`Kōbō ya no puede distinguir tu propia máquina de una solicitud reenviada — incluso localhost necesitará el token a partir de ahora. Actívalo solo si un reverse proxy (Traefik, nginx, Caddy…) está delante de Kōbō.`,"settings.network.restartRequired":`Reinicia Kōbō para aplicar la nueva dirección de bind.`,"settings.network.token":`Token de acceso`,"settings.network.copy":`Copiar`,"settings.network.copied":`Copiado`,"settings.network.regenerate":`Regenerar`,"settings.network.regenerateConfirm":`¿Regenerar el token? Los dispositivos conectados necesitarán el nuevo token.`,"settings.network.urls":`URLs de LAN`,"settings.network.scan":`Escanea para conectar`,"settings.network.noUrls":`No se detectó ninguna dirección LAN.`,"settings.network.loadFailed":`No se pudieron cargar los ajustes de acceso de red.`,"settings.network.updateFailed":`No se pudieron actualizar los ajustes de acceso de red.`,"settings.unsavedChanges.title":`Cambios sin guardar`,"settings.unsavedChanges.message":`Este proyecto tiene cambios sin guardar. Cambiar de proyecto los descartará.`,"settings.unsavedChanges.discard":`Descartar y cambiar`,"settings.unsavedChanges.cancel":`Cancelar`,"settings.loadFailed":`No se pudieron cargar los ajustes`,"settings.loadFailedHint":`Guardar está desactivado: el formulario muestra valores por defecto y escribirlos sobrescribiría tu configuración real.`,"health.title":`Salud`,"health.tooltip":`Estado del sistema`,"changelog.title":`Changelog`,"changelog.tooltip":`Novedades de Kōbō`,"changelog.empty":`Ningún changelog disponible.`,"changelog.current":`actual`,"changelog.currentVersion":`Versión actual: v{version}`,"health.envTitle":`Entorno`,"health.version":`Versión`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de datos`,"health.dbPath":`Ruta`,"health.dbSize":`Tamaño`,"health.schemaVersion":`Versión del esquema`,"health.settingsSchemaVersion":`Esquema de ajustes`,"health.runtimesTitle":`Motores de agente`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude no encontrado en PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binario codex no resoluble`,"health.forgeCliTitle":`CLI de forge (gh / glab)`,"health.forgeCliMissing":`No se encontró ni gh ni glab — pull requests y vigilancia de CI no disponibles`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} en total, {archived} archivados`,"health.worktreesMissing":`{count} worktree(s) faltan en el disco`,"health.sessionsTitle":`Sesiones de agente`,"health.sessionsOrphaned":`{n} sesión/sesiones huérfana(s) en ejecución`,"health.integrationsTitle":`Integraciones`,"health.integrationConfigured":`configurada`,"health.integrationMissing":`sin configurar`,"health.integrationDisabled":`desactivada`,"settings.integrationEnabled":`Activar integración`,"health.activeTitle":`Estado activo`,"health.activeQuotaBackoffs":`Quota backoffs pendientes`,"health.activeWakeups":`Despertares programados`,"health.activeAutoLoop":`Auto-loop en ejecución`,"health.activeAgentSessions":`Sesiones de agente activas`,"health.activeDevServers":`Servidores de desarrollo activos`,"health.noneActive":`Ninguno.`,"health.quotaResumeAt":`reanuda a las {time}`,"health.wakeupAt":`despierta a las {time}`,"health.startedAgo":`iniciada hace {time}`,"health.autoLoopReady":`listo, iterando`,"health.autoLoopGrooming":`grooming en curso`,"session.started":`Sesión iniciada`,"session.ended":`Sesión finalizada`,"session.compacted":`Contexto compactado`,"session.endedCompleted":`Turno finalizado: envía un mensaje para continuar`,"session.endedKilled":`Sesión detenida`,"session.endedError":`La sesión terminó con un error`,"session.endedWatchdog":`Sesión cerrada a la fuerza tras un periodo de inactividad`,"tool.running":`Ejecutando...`,"activity.raw_lines":`Líneas de salida brutas ({n})`,"api.timeout":`La solicitud superó el límite de {seconds} segundos.`,"api.mutationTimeout":`La solicitud superó el límite de {seconds} segundos. La operación puede seguir en curso. Actualiza su estado antes de volver a intentarlo.`,"activity.sessionsError":`No se pudieron cargar las sesiones: {message}`,"activity.historyError":`No se pudo cargar el historial: {message}`,"activity.loading_older":`Cargando mensajes anteriores…`,"activity.compacting":`Compactando el contexto…`,"activity.prev_user_message":`Mensaje anterior del usuario`,"activity.scroll_to_bottom":`Desplazar al final`,"activity.empty":`Nada todavía`,"activity.emptyHint":`La salida del agente aparecerá aquí en cuanto arranque una sesión.`,"activity.a11y.region":`Anuncios de actividad del agente`,"activity.a11y.agentSaid":`Agente: {text}`,"activity.a11y.toolStarted":`Herramienta {name} iniciada`,"activity.a11y.toolFinished":`Herramienta {name} finalizada`,"activity.a11y.toolFailed":`Herramienta {name} falló`,"chat.systemPrompt":`Instrucciones de Kōbō`,"chat.agent":`Agente`,"chat.cleanupScript":`Script de limpieza`,"chat.archiveScript":`Script de archivado`,"chat.setupScript":`Script de setup`,"chat.hookScript":`Hook {event}`,"chat.scriptDone":`Hecho`,"chat.scriptComplete":`[{phase}] Completado`,"chat.scriptError":`[{phase}] Error: {message}`,"chat.unknownError":`desconocido`,"chat.you":`Tú`,"chat.session":`Sesión`,"chat.nActions":`{n} acción | {n} acciones`,"chat.lastUpdatedAt":`Última actualización a las {time}`,"chat.scrollToTurnTop":`Desplazar al inicio del mensaje`,"migration.backing_up":`Haciendo copia de seguridad de la base de datos…`,"migration.running":`Migrando datos del agente — {processed}/{total}`,"migration.error":`La migración falló`,"migration.backup_location":`Se guardó una copia de seguridad en {path}. Reinicia Kōbō para reintentar.`,"migration.retry":`Reinicia Kōbō para reintentar.`,"engine.select":`Motor`,"engine.model":`Modelo`,"engine.effort":`Esfuerzo de razonamiento`,"wakeup.scheduledIn":`Próximo despertar en {n}s`,"wakeup.scheduledAt":`Próximo despertar a las {time}`,"wakeup.firing":`Despertando...`,"wakeup.reason":`Razón: {reason}`,"wakeup.cancel":`Cancelar este despertar`,"wakeup.pendingIndicator":`Despertar programado`,"cron.pendingIndicator":`{n} cron(s) programado(s)`,"schedule.tabLabel":`Programación`,"schedule.admissionTitle":`Nueva sesión automática no disponible por ahora.`,"schedule.admissionHint":`Los plazos no cambian. La entrega en una conversación existente sigue sus propias reglas.`,"schedule.admission.not-found":`Espacio no encontrado.`,"schedule.admission.archived":`Espacio archivado.`,"schedule.admission.purged":`Restaura el worktree.`,"schedule.admission.shutdown":`El servidor se está apagando.`,"schedule.admission.lifecycle":`Hay una operación del espacio en curso.`,"schedule.admission.active-session":`La sesión actual aún no se ha cerrado.`,"schedule.admission.awaiting-user":`Se espera una respuesta del usuario.`,"schedule.admission.compacting":`Compactación del contexto en curso.`,"schedule.admission.quota":`Esperando la recuperación de la cuota.`,"schedule.admission.blocked":`Bucle bloqueado; resuelve la causa indicada.`,"schedule.admission.capacity":`Límite de concurrencia alcanzado: {running}/{limit} sesiones.`,"schedule.panelTitle":`Automatización`,"schedule.panelDescription":`Despertar este workspace más tarde o ejecutar instrucciones según una programación.`,"schedule.activeTitle":`Programaciones activas`,"schedule.emptyTitle":`Nada programado`,"schedule.emptyDescription":`Crea un wakeup puntual o una tarea recurrente abajo.`,"schedule.cancelWakeup":`Cancelar este wakeup`,"schedule.cancelCron":`Eliminar esta tarea recurrente`,"schedule.createTitle":`Crear una programación`,"schedule.createDescription":`Elige cuándo y cómo debe ejecutarse el agente.`,"schedule.typeWakeup":`Wakeup puntual`,"schedule.typeRecurring":`Tarea recurrente`,"schedule.wakeupDescription":`Ejecutar el prompt una vez después de un retraso.`,"schedule.cronDescription":`Ejecutar el prompt periódicamente con una frecuencia fija.`,"schedule.promptHint":`Instrucciones que se enviarán al agente`,"schedule.frequencyTitle":`Frecuencia`,"schedule.advancedDescription":`Usar una expresión cron sin procesar`,"schedule.cronExpressionLabel":`Expresión cron`,"schedule.sessionModeTitle":`Sesión de ejecución`,"schedule.modeResume":`Reanudar sesión`,"schedule.oneShotHint":`Eliminar esta programación después de su primera ejecución.`,"schedule.wakeupTitle":`Wakeup pendiente`,"schedule.cronsTitle":`Programaciones recurrentes`,"schedule.noWakeup":`Sin wakeup programado`,"schedule.noCrons":`Sin cron programado`,"schedule.invalidCron":`Inactiva: expresión no válida. Elimina y vuelve a crear esta programación.`,"schedule.nextFireAt":`próximo a las {time}`,"schedule.lastFiredAt":`último hace {time}`,"schedule.addCronTitle":`Añadir una tarea recurrente`,"schedule.addWakeupTitle":`Programar un wakeup`,"schedule.every":`Cada`,"schedule.unitMinutes":`minutos`,"schedule.unitHours":`horas`,"schedule.unitDays":`días`,"schedule.daysDriftWarning":`El intervalo puede reducirse a 1 día a fin de mes (limitación de cron).`,"schedule.advancedExpression":`Expresión avanzada (opcional)`,"schedule.advancedHint":`Cron sin procesar (p. ej. */15 * * * *) o {'@'}hourly/{'@'}daily — anula el selector si se rellena.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Etiqueta (opcional)`,"schedule.delayMinutes":`Retraso (minutos)`,"schedule.modeFresh":`Nueva sesión`,"schedule.oneShot":`Ejecutar solo una vez`,"schedule.addCronBtn":`Añadir cron`,"schedule.addWakeupBtn":`Programar wakeup`,"schedule.cronCreated":`Tarea recurrente añadida`,"schedule.wakeupCreated":`Wakeup programado`,"askUserQuestion.title":`El agente hace una pregunta`,"askUserQuestion.submit":`Enviar respuesta`,"askUserQuestion.multiSelectHint":`Selecciona una o más opciones`,"askUserQuestion.otherOption":`Otro`,"askUserQuestion.otherOptionHint":`especifíquelo en su próximo mensaje`,"askUserQuestion.freeFormLabel":`Especifique su respuesta`,"askUserQuestion.freeFormHint":`Esta respuesta se enviará directamente al agente.`,"askUserQuestion.noPending":`Ninguna pregunta pendiente`,"askUserQuestion.next":`Siguiente`,"askUserQuestion.previous":`Anterior`,"askUserQuestion.cancel":`Cancelar`,"askUserQuestion.cancelTooltip":`Saltar esta pregunta — el agente continuará sin respuesta`,"askUserQuestion.collapse":`Contraer el panel de pregunta`,"askUserQuestion.expand":`Expandir el panel de pregunta`,"permissionRequest.title":`El agente quiere usar una herramienta`,"permissionRequest.allow":`Permitir`,"permissionRequest.allowOnce":`Permitir una vez`,"permissionRequest.allowTurn":`Permitir este turno`,"permissionRequest.operationUnavailable":`Detalles no disponibles; permite una vez o toda la herramienta.`,"permissionRequest.allowOperation":`Permitir siempre esta operación`,"permissionRequest.allowTool":`Permitir siempre esta herramienta`,"permissionRequest.deny":`Denegar`,"permissionRequest.tool":`Herramienta`,"permissionRequest.input":`Entrada`,"permissionRequest.rawInput":`Detalles técnicos`,"permissionRequest.collapse":`Contraer el panel de permisos`,"permissionRequest.expand":`Expandir el panel de permisos`,"permissionRequest.denied":`denegado por el usuario`,"workspaceStatus.created":`creado`,"workspaceStatus.extracting":`extracción`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.compacting":`compactando`,"chatInput.compactingBanner":`Compactando el contexto. Podrás enviar mensajes cuando termine.`,"workspaceStatus.executing":`en curso`,"workspaceStatus.awaitingUser":`esperando tu respuesta`,"workspaceStatus.completed":`completado`,"workspaceStatus.idle":`inactivo`,"workspaceStatus.error":`error`,"workspaceStatus.quota":`cuota alcanzada`,"workspaceStatus.retrying":`reanudación automática`,"workspaceList.prOpen":`#{n} — Pull request abierta`,"workspaceList.prWatchDisabledIndicator":`Comprobaciones de PR ignoradas para este workspace`,"workspaceList.prChangesRequested":`#{n} — Cambios solicitados`,"workspaceList.attentionCiFailed":`CI fallida`,"workspaceList.attentionChangesRequested":`Cambios solicitados`,"workspaceList.attentionReadyToMerge":`Listo para merge`,"autoLoop.status.active":`Activo`,"autoLoop.status.waiting":`En espera`,"autoLoop.status.blocked":`Bloqueado`,"autoLoop.status.completed":`Completado`,"autoLoop.status.stopped":`Detenido`,"autoLoop.phase.grooming":`Preparación`,"autoLoop.phase.execution":`Ejecución`,"autoLoop.phase.finalization":`Finalización`,"autoLoop.iteration":`Iteración {count}`,"autoLoop.resume":`Reanudar auto-loop`,"autoLoop.retryAt":`Reanudación prevista para`,"autoLoop.actionFailed":`No se pudo completar la acción.`,"autoLoop.messages.count":`{count} instrucción(es) en cola`,"autoLoop.messages.pending":`En cola`,"autoLoop.messages.dispatching":`Enviando`,"autoLoop.messages.unknown":`Entrega incierta`,"autoLoop.messages.delivered":`Entregada`,"autoLoop.messages.cancel":`Cancelar instrucción`,"autoLoop.messages.acknowledge":`Marcar como recibida`,"autoLoop.messages.retry":`Volver a enviar`,"autoLoop.messages.unknownHelp":`No se pudo confirmar la entrega. Revise la conversación antes de decidir. Volver a enviar puede duplicar una instrucción ya recibida.`,"autoLoop.reason.quota":`Esperando la cuota del proveedor.`,"autoLoop.reason.transient":`Reanudación tras una interrupción temporal.`,"autoLoop.reason.awaiting-user":`Esperando su respuesta.`,"autoLoop.reason.capacity-or-lifecycle":`Esperando una plaza disponible para un agente.`,"autoLoop.reason.message-delivery-unknown":`Resuelva la instrucción con entrega incierta antes de reanudar.`,"autoLoop.reason.error":`El bucle necesita atención antes de continuar.`,"autoLoop.reason.stall":`No se detectó progreso. Revise la última sesión antes de reanudar.`,"autoLoop.reason.awaiting-clarification":`Se necesita una aclaración antes de continuar.`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Iniciar auto-loop`,"autoLoop.prepare":`Preparar para auto-loop`,"autoLoop.reprepare":`Volver a preparar para auto-loop`,"autoLoop.reprepareTooltip":`Volver a ejecutar la fase de grooming para añadir o refrescar tareas antes de reanudar el bucle`,"autoLoop.prepareBusy":`Espera a que el agente termine antes de preparar`,"autoLoop.forceReady":`Sé lo que hago — omitir preparación`,"autoLoop.forceReadyConfirm":`¿Omitir la preparación y marcar auto-loop listo? El loop puede quedarse bloqueado si las tareas no son atómicas.`,"autoLoop.stop":`Detener auto-loop`,"autoLoop.notReady":`Ejecute primero 'Preparar para auto-loop'`,"autoLoop.noTasks":`Añada tareas primero`,"autoLoop.progress":`Auto-loop · {done}/{total} tareas`,"autoLoop.preparing":`Auto-loop · preparando`,"autoLoop.preparingTooltip":`Preparación en curso — el agente está creando / revisando tareas. El bucle arrancará cuando llame a mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en ejecución`,"autoLoop.startInMode":`Iniciar en modo auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm:`,"autoLoop.brainstormModelTooltip":`Modelo usado solo para la sesión de brainstorming inicial — cada tarea posterior usa el modelo elegido arriba`,"autoLoop.brainstormReasoningPrefix":`Brainstorm:`,"autoLoop.brainstormReasoningTooltip":`Nivel de razonamiento usado solo para la sesión de brainstorming inicial`,"autoLoop.executionModelPrefix":`Loop:`,"autoLoop.executionModelTooltip":`Modelo usado para cada tarea del auto-loop tras la sesión de brainstorming inicial`,"autoLoop.sessionMode.perTask":`Nueva sesión por tarea`,"autoLoop.sessionMode.label":`Sesión:`,"autoLoop.sessionMode.perTaskTooltip":`Cada tarea inicia una sesión nueva de Claude Code sin memoria de tareas anteriores`,"autoLoop.sessionMode.continuous":`Sesión continua`,"autoLoop.sessionMode.continuousTooltip":`Todas las tareas se encadenan en la misma sesión — el agente conserva todo el contexto, pero la sesión se alarga con el tiempo`,"koboCommand.prepAutoloopDesc":`Preparar tareas para modo auto-loop (atomicidad)`,"staleSessionBanner.title":`Auto-loop en curso`,"staleSessionBanner.message":`Estás viendo una sesión anterior — el agente está trabajando en la más reciente.`,"staleSessionBanner.staleTitle":`Sesión anterior`,"staleSessionBanner.staleMessage":`Estás viendo una sesión anterior — los mensajes que envíes irán a esta sesión, no a la más reciente.`,"staleSessionBanner.switchToCurrent":`Cambiar a la actual`,"network.login.title":`Acceso de red`,"network.login.description":`Este Kōbō requiere un token para controlarse desde la red. Pega el token que aparece en Ajustes en la máquina anfitriona.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Pega tu token`,"network.login.connect":`Conectar`,"network.login.invalid":`Token no válido`,"network.login.serverError":`Error del servidor — inténtalo de nuevo.`,"network.login.unreachable":`Kōbō no es accesible — comprueba tu conexión.`,"layout.toggleWorkspaces":`Mostrar/ocultar el panel de espacios`,"layout.togglePanel":`Mostrar/ocultar el panel lateral`,"unsaved.title":`¿Salir sin guardar?`,"unsaved.message":`Tienes cambios sin guardar. Salir de esta página los descarta.`,"unsaved.leave":`Salir`,"unsaved.stay":`Quedarme`,"prCheckout.staleRetriesExhausted":`El estado del repositorio siguió cambiando mientras intentábamos aplicar tus decisiones. Cierra este diálogo e inténtalo de nuevo desde el selector de pull requests.`,"prPicker.title":`Importar desde una pull request`,"prPicker.filterAll":`Todas`,"prPicker.filterMine":`Las mías`,"prPicker.filterReviewRequested":`Revisión solicitada`,"prPicker.searchPlaceholder":`Buscar pull requests…`,"prPicker.loadMore":`Cargar más`,"prPicker.empty":`Ninguna pull request abierta coincide.`,"prPicker.forkNotSupported":`Esta PR proviene de un fork; Kōbō no puede hacerle checkout.`,"prPicker.loadFailed":`Error al cargar las pull requests.`,"prPicker.badge.workspaceExists":`Ya abierta en Kōbō`,"prPicker.badge.worktreePresent":`Worktree presente`,"prPicker.badge.localBranch":`Branch local`,"prPicker.badge.new":`Nueva`,"prPicker.badge.draft":`Borrador`,"prCheckout.title":`Preparar la worktree`,"prCheckout.apply":`Aplicar`,"prCheckout.cancel":`Cancelar`,"prCheckout.retry":`Reintentar`,"prCheckout.diagnoseFailed":`Error al diagnosticar la pull request.`,"prCheckout.resolveFailed":`Error al resolver el checkout de la pull request.`,"prCheckout.path.required":`Introduce una ruta de worktree que aún no exista.`,"prCheckout.workspace.restoreNotAvailable":"Restaurar un workspace purgado no está disponible todavía desde aquí. Vuelve a crear su carpeta de worktree en disco (por ejemplo, con `git worktree add`) y Kōbō la reconectará automáticamente en unos 30 segundos.","prCheckout.staleReloaded":`El repositorio cambió; el diagnóstico se ha actualizado.`,"prCheckout.step.blocked":`No se puede continuar`,"prCheckout.step.path":`Ubicación de la worktree`,"prCheckout.step.workspace":`Workspace existente`,"prCheckout.step.worktree":`Worktree existente`,"prCheckout.step.operation":`Operación git en curso`,"prCheckout.step.changes":`Cambios sin commitear`,"prCheckout.step.divergence":`Branch local vs origin`,"prCheckout.workspace.activeHint":`Un workspace llamado "{name}" ya sigue este branch.`,"prCheckout.workspace.open":`Abrir ese workspace`,"prCheckout.workspace.continue":`Continuar por otra ruta`,"prCheckout.workspace.unarchive":`Desarchivar y abrirlo`,"prCheckout.workspace.restore":`Recrear su worktree`,"prCheckout.worktree.orphanHint":`Ya existe una worktree en este branch en {path}.`,"prCheckout.worktree.attach":`Adjuntarla`,"prCheckout.worktree.branchInUse":`Esta rama ya está extraída. Adjunte su worktree existente.`,"prCheckout.worktree.createElsewhere":`Crear otra en otro lugar`,"prCheckout.operation.hint":`Hay un {operation} en curso en esa worktree.`,"prCheckout.operation.abort":`Abortarlo`,"prCheckout.operation.cancel":`Dejarlo tal cual y detenerse aquí`,"prCheckout.changes.hint":`{modified} modificado(s), {staged} en stage, {untracked} sin seguimiento.`,"prCheckout.changes.stash":`Guardarlos en un stash`,"prCheckout.changes.commit":`Commitearlos`,"prCheckout.changes.discard":`Descartarlos (se conservan en un stash etiquetado)`,"prCheckout.changes.keepResetConflict":`Conservar cambios locales es incompatible con un reset. Usa stash o commit, o conserva la rama.`,"prCheckout.changes.keep":`Dejarlos como están`,"prCheckout.divergence.behindHint":`Tu branch está {behind} commit(s) por detrás de origin.`,"prCheckout.divergence.aheadHint":`Tu branch tiene {ahead} commit(s) sin pushear.`,"prCheckout.divergence.divergedHint":`{ahead} por delante, {behind} por detrás de origin.`,"prCheckout.divergence.notFastForward":`No se puede hacer fast-forward: la rama contiene commits locales.`,"prCheckout.divergence.fastForward":`Fast-forward hacia origin`,"prCheckout.divergence.rebase":`Rebase sobre origin`,"prCheckout.divergence.resetHard":`Restablecer a origin (se crea antes un branch de respaldo)`,"prCheckout.divergence.keep":`Mantener el estado local`,"prCheckout.blocked.forgeUnavailable":`Falta el CLI de la forge o no está autenticado.`,"prCheckout.blocked.forkPr":`Esta PR proviene de un fork; Kōbō no puede hacerle checkout.`,"prCheckout.blocked.headBranchDeleted":`El branch ya no existe en el remote.`,"prCheckout.blocked.indexLock":`Hay otro proceso git en curso (index.lock está presente).`,"prCheckout.blocked.pathOccupied":`{path} ya existe y no es una worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} es una worktree en otro branch ({branch}).`,"prCheckout.blocked.noCommonAncestor":`Ya existe un branch local llamado {branch} con un historial sin relación.`,"split.title":`Vista doble de workspaces`,"split.open":`Abrir en paralelo`,"split.openBeside":`Abrir al lado`,"split.close":`Cerrar vista doble`,"split.left":`Workspace izquierdo`,"split.right":`Workspace derecho`,"split.choose":`Elegir un workspace`,"split.recipient":`Enviar a: {name}`,"absence.title":`Desde tu última visita`,"settings.activityDigestHint":`Muestra un resumen de los eventos ocurridos durante tu ausencia. Al desactivarlo, se oculta la entrada y se dejan de registrar nuevos eventos, sin borrar el historial existente.`,"absence.pending":`Cambios por revisar`,"absence.retention":`Actividad importante de los últimos 30 días, registrada desde la instalación de esta función. Las visitas se guardan solo en este navegador.`,"absence.since":`Desde {date}`,"absence.error":`No se pudo cargar la actividad.`,"absence.retry":`Reintentar`,"absence.empty":`No hay actividad nueva.`,"absence.more":`Cargar más`,"absence.markRead":`Marcar los eventos mostrados como leídos`,"absence.kind.question":`Pregunta realizada`,"absence.kind.permission":`Aprobación solicitada`,"absence.kind.completed":`Sesión finalizada`,"absence.kind.error":`Error del agente`,"absence.kind.pr-merged":`PR fusionada`,"absence.kind.pr-approved":`PR aprobada`,"absence.kind.pr-changes-requested":`Cambios solicitados`,"absence.kind.pr-ci-failed":`CI fallida`,"absence.kind.pr-ci-recovered":`CI recuperada`,"absence.kind.pr-merge-conflict":`Conflicto de merge`,"absence.kind.pr-ready-to-merge":`PR lista para merge`,"absence.kind.archived":`Workspace archivado`,"absence.kind.purged":`Worktree purgado`,"absence.kind.restored":`Worktree restaurado`,"tours.split.controls.title":`Dos workspaces independientes`,"tours.split.controls.description":`Elige un workspace por panel. Ajusta la separación; cada conversación conserva su destinatario y sus paneles.`,"tours.home.sort.title":`Ordenar workspaces`,"tours.home.sort.description":`Elige el orden y la dirección dentro de cada grupo. Tu selección se guarda.`,"tours.home.activity.title":`Revisar la actividad tras una ausencia`,"tours.home.activity.description":`Al pie del panel izquierdo encontrarás preguntas, sesiones finalizadas, errores y cambios de PR desde tu última visita.`,"progress.title":`Actividades`,"progress.status.running":`En curso`,"progress.status.succeeded":`Completada`,"progress.status.failed":`Fallida`,"progress.status.interrupted":`Seguimiento interrumpido`,"progress.dismiss":`Ocultar {label}`,"progress.dismissHint":`Ocultar esta actividad sin detener su trabajo`,"progress.others":`Ver las demás ({count})`,"progress.collapse":`Ver menos`,"progress.loadError":`No se pudieron cargar las actividades.`,"progress.dismissError":`No se pudo ocultar esta actividad. Vuelve a pulsar su botón de cierre.`,"progress.retry":`Reintentar`,"tours.workspace.progress.title":`Progreso de las actividades`,"tours.workspace.progress.description":`Los agentes y sus subagentes informan de tareas largas sobre el campo de mensaje. Se muestran tres actividades; despliega para ver las demás. Los valores son comunicados por los agentes y no constituyen una verificación. Los éxitos desaparecen tras cinco segundos; los fallos siguen visibles. Cerrar oculta solo esa actividad sin cancelar el trabajo.`};export{e as default};
@@ -1 +1 @@
1
- import{M as e,S as t,lt as n,pt as r,v as i}from"./reactivity.esm-bundler-DY1JkAEA.js";import{C as a,J as o,L as s,O as c,R as l,T as u,X as d,_ as f,f as p,i as m,l as h,p as g,r as _,u as v,y,z as b}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{$ as x,K as S,R as C,d as w,f as T,m as E,w as D,y as O,z as k}from"./dom-BtYTvLeN.js";import{c as A,l as j}from"./QBtn-BUSdPaf4.js";import{n as M,t as N}from"./use-dark-BHObfh0O.js";import{Ht as P,Zt as F,wt as I}from"./index-DCpe-Tfm.js";import{t as L}from"./use-slide-transition-B_Nu6u-t.js";import{a as ee}from"./use-tours-CWafZt-m.js";import{a as te,i as ne,n as re,o as R,r as z,s as B}from"./efforts-Y6XotW97.js";var V={"image/png":[`.png`],"image/jpeg":[`.jpg`,`.jpeg`],"image/gif":[`.gif`],"image/webp":[`.webp`]},H=[`.md`,`.markdown`,`.txt`,`.text`,`.pdf`,`.csv`,`.tsv`,`.json`,`.jsonl`,`.yaml`,`.yml`,`.xml`,`.log`,`.rst`,`.toml`],U=[...Object.keys(V),...Object.values(V).flat(),...H].join(`,`),W=52428800,G=52428800;function K(e){let t=/\.[^.\\/]+$/.exec(e.name??``)?.[0]?.toLowerCase()??``,n=V[e.type];return n?{kind:`image`,extension:n.includes(t)?t:n[0]}:H.includes(t)?{kind:`file`,extension:t}:(!e.type||e.type===`application/octet-stream`)&&Object.values(V).some(e=>e.includes(t))?{kind:`image`,extension:t}:null}function q(e){return e.length>10?`count`:e.some(e=>!K(e))?`type`:e.some(e=>e.size===0||e.size>52428800)?`size`:e.reduce((e,t)=>e+t.size,0)>52428800?`total`:null}function J(e){e.keyCode===32&&C(e)}var Y=k({name:`StepHeader`,props:{stepper:{},step:{},goToPanel:Function},setup(e,{attrs:n}){let r=w(),i=t(null),o=h(()=>e.stepper.modelValue===e.step.name),s=h(()=>{let t=e.step.disable;return t===!0||t===``}),c=h(()=>{let t=e.step.error;return t===!0||t===``}),l=h(()=>{let t=e.step.done;return!s.value&&(t===!0||t===``)}),u=h(()=>{let t=e.step.headerNav;return e.stepper.headerNav===!0&&(t===!0||t===``||t===void 0)}),f=h(()=>!s.value&&u.value),p=h(()=>{if(o.value)return e.step.activeIcon||e.stepper.activeIcon||r.iconSet.stepper.active;if(c.value)return e.step.errorIcon||e.stepper.errorIcon||r.iconSet.stepper.error;if(l.value)return e.step.doneIcon||e.stepper.doneIcon||r.iconSet.stepper.done}),m=h(()=>!!e.step.prefix&&(p.value===void 0||p.value===`none`)),g=h(()=>p.value!==void 0&&p.value!==`none`?p.value:e.step.icon||e.stepper.inactiveIcon),_=h(()=>{let t=c.value?e.step.errorColor||e.stepper.errorColor:void 0;if(o.value){let n=e.step.activeColor||e.stepper.activeColor||e.step.color;return n===void 0?t:n}return t===void 0?!s.value&&l.value?e.step.doneColor||e.stepper.doneColor||e.step.color||e.stepper.inactiveColor:e.step.color||e.stepper.inactiveColor:t}),v=h(()=>`q-stepper__tab col-grow flex items-center no-wrap relative-position q-stepper__tab--${e.stepper.vertical?`vertical`:`horizontal`}`+(_.value===void 0?``:` text-${_.value}`)+(c.value?` q-stepper__tab--error q-stepper__tab--error-with-`+(m.value?`prefix`:`icon`):``)+(o.value?` q-stepper__tab--active`:``)+(l.value?` q-stepper__tab--done`:``)+(f.value?` q-stepper__tab--navigation q-focusable q-hoverable`:``)+(s.value?` q-stepper__tab--disabled`:``)),y=h(()=>e.stepper.headerNav&&f.value);function b(){i.value?.focus({preventScroll:!0}),o.value||e.goToPanel(e.step.name)}function x(t){[13,32].includes(t.keyCode)&&(o.value||e.goToPanel(e.step.name),C(t))}return()=>{let t={class:v.value,"aria-current":o.value?`step`:void 0};u.value&&(t.role=`button`,s.value?(t.tabindex=-1,t[`aria-disabled`]=`true`):(t.onClick=b,t.onKeydown=J,t.onKeyup=x,t.tabindex=n.tabindex||0));let r=[a(`div`,{class:`q-focus-helper`,tabindex:-1,ref:i}),a(`div`,{class:`q-stepper__dot row flex-center q-stepper__line relative-position`},[a(`span`,{class:`row flex-center`},[m.value?e.step.prefix:a(j,{name:g.value})])])];if(e.step.title!==void 0&&e.step.title!==null){let t=[a(`div`,{class:`q-stepper__title`},e.step.title)];e.step.caption!==void 0&&e.step.caption!==null&&t.push(a(`div`,{class:`q-stepper__caption`},e.step.caption)),r.push(a(`div`,{class:`q-stepper__label q-stepper__line relative-position`},t))}return d(a(`div`,t,r),[[A,y.value]])}}});function X(e,t,n){return a(`div`,{class:`q-stepper__step-content`+(t?``:` q-panel scroll`),style:n},[a(`div`,{class:`q-stepper__step-inner q-stepper__step-inner--${t?`vertical`:`horizontal`}`},E(e.default))])}var Z={props:{vertical:Boolean},setup(e,{slots:t}){return()=>X(t,e.vertical)}},ie=k({name:`QStep`,props:{...z,icon:String,color:String,title:{type:String,required:!0},caption:String,prefix:[String,Number],doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String,headerNav:{type:Boolean,default:!0},done:Boolean,error:Boolean,onScroll:[Function,Array]},setup(e,{slots:n,emit:r}){let i=w(),s=u(D,O);if(s===O)return console.error(`QStep needs to be a child of QStepper`),O;let{getCache:l}=R(),{onEnter:d,onLeave:f}=L(()=>Number(s.value.transitionDuration)),p=t(null),g=h(()=>s.value.modelValue===e.name),_=h(()=>!i.platform.is.ios&&i.platform.is.chrome||!g.value||!s.value.vertical?{}:{onScroll(t){let{target:n}=t;n.scrollTop>0&&(n.scrollTop=0),e.onScroll!==void 0&&r(`scroll`,t)}}),v=h(()=>typeof e.name==`string`||typeof e.name==`number`?e.name:String(e.name)),y=h(()=>{if(s.value.vertical)return{css:!1,onEnter:d,onLeave:f};let e=s.value.panelTransition.value;return e===null?{}:{name:e,leaveActiveClass:`${e}-leave-active q-stepper__step-content--leaving`}}),b=t(!1);o(g,e=>{if(e||s.value.vertical||!s.value.animated){b.value=!1;return}b.value=!0,c(()=>{b.value=!1})});function x(){if(!g.value&&!b.value)return;let{vertical:e}=s.value,t=e?void 0:`--q-transition-duration: ${s.value.transitionDuration}ms`;return s.value.keepAlive?a(s.value.needsUniqueKeepAliveWrapper.value?l(v.value,()=>({...Z,name:String(v.value)})):Z,{key:v.value,vertical:e,style:t},n.default):X(n,e,t)}function C(){let e=x();return s.value.keepAlive?a(m,s.value.keepAliveProps.value,e===void 0?void 0:[e]):e}let T=h(()=>`q-stepper__step q-stepper__step--${s.value.vertical?`vertical`:`horizontal`}`);return()=>{let{vertical:t,animated:n}=s.value,r=t||g.value,i=[n?a(S,{key:`content`,...y.value},C):C()];return t&&i.unshift(a(Y,{key:`header`,stepper:s.value,step:e,goToPanel:s.value.goToPanel})),a(`div`,{ref:p,class:T.value,role:r?`group`:void 0,"aria-label":r?e.title:void 0,..._.value},i)}}}),ae=/(-\w)/g;function Q(e,t){return Array.isArray(e)?e.some(e=>Q(e,t)):typeof e==`string`?e.split(`,`).includes(t):e instanceof RegExp&&(e.lastIndex=0,e.test(t))}function oe(e){let t={};for(let n in e){let r=n.replace(ae,e=>e[1].toUpperCase());t[r]=e[n]}return t}var se=k({name:`QStepper`,props:{...M,...te,flat:Boolean,bordered:Boolean,alternativeLabels:Boolean,headerNav:Boolean,contracted:Boolean,headerClass:String,inactiveColor:String,inactiveIcon:String,doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String},emits:ne,setup(e,{slots:n}){let r=w(),i=N(e,r),{updatePanelsList:s,isValidPanelName:c,updatePanelIndex:u,getPanels:f,panelTransition:p,panelDirectives:m,goToPanel:g,keepAliveProps:_,needsUniqueKeepAliveWrapper:v}=re(),y=t([]);o(()=>e.modelValue,t=>{if(e.keepAliveMax===void 0||!c(t))return;let n=String(t),r=y.value.filter(e=>e!==n);r.push(n),r.length>e.keepAliveMax&&r.splice(0,r.length-e.keepAliveMax),y.value=r},{immediate:!0});let b=h(()=>e.keepAliveMax===void 0?_.value:{include:e.keepAliveInclude===void 0?y.value:y.value.filter(t=>Q(e.keepAliveInclude,t)),exclude:e.keepAliveExclude}),x=h(()=>e.keepAliveMax!==void 0||v.value);l(D,h(()=>({goToPanel:g,keepAliveProps:b,needsUniqueKeepAliveWrapper:x,panelTransition:p,...e})));let S=h(()=>`q-stepper q-stepper--${e.vertical?`vertical`:`horizontal`}`+(e.flat?` q-stepper--flat`:``)+(e.bordered?` q-stepper--bordered`:``)+(i()?` q-stepper--dark q-dark`:``)),C=h(()=>`q-stepper__header row items-stretch justify-between q-stepper__header--${e.alternativeLabels?`alternative`:`standard`}-labels`+(e.bordered||!e.flat?` q-stepper__header--border`:``)+(e.contracted?` q-stepper__header--contracted`:``)+(e.headerClass===void 0?``:` ${e.headerClass}`)),O=h(()=>`q-stepper__content`+(e.vertical?``:` q-panel-parent`)),k=h(()=>{if(!e.vertical)return m.value;let[t,,n,r]=m.value[0];return[[t,void 0,n,r]]});function A(){let t=E(n.message,[]);c(e.modelValue)&&u();let r=d(a(`div`,{key:`content`,class:O.value},E(n.default)),k.value);return e.vertical?t===void 0?[r]:t.concat(r):[a(`div`,{key:`header`,class:C.value},f().map(t=>{let n=oe(t.props);return a(Y,{key:n.name,stepper:e,step:n,goToPanel:g})})),t,r]}return()=>(s(n),a(`div`,{class:S.value},T(n.navigation,A())))}}),ce={class:`slash-suggestions rounded-borders`},le={class:`slash-section-header`},ue=[`onMousedown`],de={class:`slash-name text-caption`},fe={class:`slash-section-header`},pe=[`onMousedown`],$={class:`slash-name text-caption`},me={key:0,class:`slash-description text-caption text-kobo-3 q-ml-xs`},he={class:`slash-section-header`},ge=[`onMousedown`],_e={class:`slash-name text-caption`},ve={key:0,class:`slash-description text-caption text-kobo-3 q-ml-xs`},ye=ee(y({__name:`SlashSuggestionsPopup`,props:{groupedDropdown:{},flatDropdown:{},selectedIndex:{}},emits:[`select`],setup(t,{emit:i}){let{t:a}=F(),o=i;function c(e){let t=B[`/${e}`];if(!t)return``;let n=t.descriptionKey,r=a(n);return r===n?``:r}return(i,l)=>(s(),g(`div`,ce,[t.groupedDropdown.skills.length>0?(s(),g(_,{key:0},[v(`div`,le,r(e(a)(`chatInput.dropdownSkills`)),1),(s(!0),g(_,null,b(t.groupedDropdown.skills,e=>(s(),g(`div`,{key:`skill-${e.name}`,class:n([`slash-item row items-center q-px-sm q-py-xs cursor-pointer`,{"slash-item--active":t.flatDropdown.indexOf(e)===t.selectedIndex}]),onMousedown:x(t=>o(`select`,e),[`prevent`])},[f(j,{name:`bolt`,size:`12px`,color:`primary`,class:`q-mr-xs`}),v(`span`,de,r(e.name),1)],42,ue))),128))],64)):p(``,!0),t.groupedDropdown.kobo.length>0?(s(),g(_,{key:1},[v(`div`,fe,r(e(a)(`chatInput.dropdownKobo`)),1),(s(!0),g(_,null,b(t.groupedDropdown.kobo,e=>(s(),g(`div`,{key:`kobo-${e.name}`,class:n([`slash-item row items-center q-px-sm q-py-xs cursor-pointer`,{"slash-item--active":t.flatDropdown.indexOf(e)===t.selectedIndex}]),onMousedown:x(t=>o(`select`,e),[`prevent`])},[f(j,{name:`terminal`,size:`12px`,color:`teal-4`,class:`q-mr-xs`}),v(`span`,$,`/`+r(e.name),1),c(e.name)?(s(),g(`span`,me,`— `+r(c(e.name)),1)):p(``,!0)],42,pe))),128))],64)):p(``,!0),t.groupedDropdown.templates.length>0?(s(),g(_,{key:2},[v(`div`,he,r(e(a)(`chatInput.dropdownTemplates`)),1),(s(!0),g(_,null,b(t.groupedDropdown.templates,e=>(s(),g(`div`,{key:`tpl-${e.name}`,class:n([`slash-item row items-center q-px-sm q-py-xs cursor-pointer`,{"slash-item--active":t.flatDropdown.indexOf(e)===t.selectedIndex}]),onMousedown:x(t=>o(`select`,e),[`prevent`])},[f(j,{name:`description`,size:`12px`,color:`amber-4`,class:`q-mr-xs`}),v(`span`,_e,`/`+r(e.name),1),e.description?(s(),g(`span`,ve,`— `+r(e.description),1)):p(``,!0)],42,ge))),128))],64)):p(``,!0)]))}}),[[`__scopeId`,`data-v-931c9d69`]]);function be(e,t,n={}){let r=I(),a=i([]),s=i(!1),c=i(``),l=i(0),u=0;async function d(){let e=Date.now();if(!(e-u<5e3&&a.value.length>0)){u=e;try{let e=await P(`/api/skills`);e.ok&&(a.value=await e.json())}catch{}}}function f(){let n=t();if(!n)return null;let r=n.selectionStart??e.value.length,i=e.value.slice(0,r).match(/\/([\w:.-]*)$/);return i?i[1]:null}async function p(){let e=f();e===null?s.value=!1:(await d(),c.value=e,s.value=!0,l.value=0)}function m(){s.value=!1}function g(n){let r=t();if(!r){e.value=n;return}let i=r.selectionStart??e.value.length,a=e.value.slice(0,i),o=e.value.slice(i),s=a.match(/\/[\w:.-]*$/);if(!s){e.value=n;return}let c=s.index??i;e.value=e.value.slice(0,c)+n+o}let _=h(()=>{let e=c.value.toLowerCase(),t=t=>e===``||t.toLowerCase().includes(e);return{skills:a.value.filter(e=>t(e)).map(e=>({type:`skill`,name:e})),kobo:n.excludeKoboCommands?[]:Object.keys(B).map(e=>e.replace(/^\//,``)).filter(e=>t(e)).map(e=>({type:`kobo`,name:e})),templates:r.templates.filter(e=>t(e.slug)).map(e=>({type:`template`,name:e.slug,description:e.description}))}}),v=h(()=>[..._.value.skills,..._.value.kobo,..._.value.templates]);return o(()=>v.value.length,e=>{if(e===0){l.value=0;return}l.value>=e&&(l.value=e-1)}),{skills:a,showSkills:s,skillFilter:c,selectedSkillIndex:l,groupedDropdown:_,flatDropdown:v,fetchSkills:d,detectSlashFragment:p,replaceFragmentWith:g,closeDropdown:m}}function xe(e,t){return e.replace(/\{(\w+)\}/g,(e,n)=>{let r=t[n];return r==null?e:String(r)})}function Se(e){let t={};return e.workspace&&(t.workspace_name=e.workspace.name,t.working_branch=e.workspace.workingBranch,t.source_branch=e.workspace.sourceBranch,t.project_path=e.workspace.projectPath,t.worktree_path=e.workspace.worktreePath??`${e.workspace.projectPath}/.worktrees/${e.workspace.workingBranch}`),e.gitStats&&(t.commit_count=e.gitStats.commitCount,t.unpushed_count=e.gitStats.unpushedCount,t.files_changed=e.gitStats.filesChanged,t.insertions=e.gitStats.insertions,t.deletions=e.gitStats.deletions,e.gitStats.prNumber!=null&&(t.pr_number=e.gitStats.prNumber),e.gitStats.prUrl&&(t.pr_url=e.gitStats.prUrl),e.gitStats.prState&&(t.pr_state=e.gitStats.prState)),e.sessionName&&(t.session_name=e.sessionName),t}export{se as a,G as c,q as d,ye as i,W as l,xe as n,ie as o,be as r,U as s,Se as t,K as u};
1
+ import{M as e,S as t,lt as n,pt as r,v as i}from"./reactivity.esm-bundler-DY1JkAEA.js";import{C as a,J as o,L as s,O as c,R as l,T as u,X as d,_ as f,f as p,i as m,l as h,p as g,r as _,u as v,y,z as b}from"./runtime-core.esm-bundler-Bqg71Vll.js";import{$ as x,K as S,R as C,d as w,f as T,m as E,w as D,y as O,z as k}from"./dom-BtYTvLeN.js";import{c as A,l as j}from"./QBtn-BUSdPaf4.js";import{n as M,t as N}from"./use-dark-BHObfh0O.js";import{Qt as P,Tt as F,Ut as I}from"./index-CbyHfF8I.js";import{t as L}from"./use-slide-transition-B_Nu6u-t.js";import{a as ee}from"./use-tours-IVbXTmz2.js";import{a as te,i as ne,n as re,o as R,r as z,s as B}from"./efforts-y7Wf_Rgd.js";var V={"image/png":[`.png`],"image/jpeg":[`.jpg`,`.jpeg`],"image/gif":[`.gif`],"image/webp":[`.webp`]},H=[`.md`,`.markdown`,`.txt`,`.text`,`.pdf`,`.csv`,`.tsv`,`.json`,`.jsonl`,`.yaml`,`.yml`,`.xml`,`.log`,`.rst`,`.toml`],U=[...Object.keys(V),...Object.values(V).flat(),...H].join(`,`),W=52428800,G=52428800;function K(e){let t=/\.[^.\\/]+$/.exec(e.name??``)?.[0]?.toLowerCase()??``,n=V[e.type];return n?{kind:`image`,extension:n.includes(t)?t:n[0]}:H.includes(t)?{kind:`file`,extension:t}:(!e.type||e.type===`application/octet-stream`)&&Object.values(V).some(e=>e.includes(t))?{kind:`image`,extension:t}:null}function q(e){return e.length>10?`count`:e.some(e=>!K(e))?`type`:e.some(e=>e.size===0||e.size>52428800)?`size`:e.reduce((e,t)=>e+t.size,0)>52428800?`total`:null}function J(e){e.keyCode===32&&C(e)}var Y=k({name:`StepHeader`,props:{stepper:{},step:{},goToPanel:Function},setup(e,{attrs:n}){let r=w(),i=t(null),o=h(()=>e.stepper.modelValue===e.step.name),s=h(()=>{let t=e.step.disable;return t===!0||t===``}),c=h(()=>{let t=e.step.error;return t===!0||t===``}),l=h(()=>{let t=e.step.done;return!s.value&&(t===!0||t===``)}),u=h(()=>{let t=e.step.headerNav;return e.stepper.headerNav===!0&&(t===!0||t===``||t===void 0)}),f=h(()=>!s.value&&u.value),p=h(()=>{if(o.value)return e.step.activeIcon||e.stepper.activeIcon||r.iconSet.stepper.active;if(c.value)return e.step.errorIcon||e.stepper.errorIcon||r.iconSet.stepper.error;if(l.value)return e.step.doneIcon||e.stepper.doneIcon||r.iconSet.stepper.done}),m=h(()=>!!e.step.prefix&&(p.value===void 0||p.value===`none`)),g=h(()=>p.value!==void 0&&p.value!==`none`?p.value:e.step.icon||e.stepper.inactiveIcon),_=h(()=>{let t=c.value?e.step.errorColor||e.stepper.errorColor:void 0;if(o.value){let n=e.step.activeColor||e.stepper.activeColor||e.step.color;return n===void 0?t:n}return t===void 0?!s.value&&l.value?e.step.doneColor||e.stepper.doneColor||e.step.color||e.stepper.inactiveColor:e.step.color||e.stepper.inactiveColor:t}),v=h(()=>`q-stepper__tab col-grow flex items-center no-wrap relative-position q-stepper__tab--${e.stepper.vertical?`vertical`:`horizontal`}`+(_.value===void 0?``:` text-${_.value}`)+(c.value?` q-stepper__tab--error q-stepper__tab--error-with-`+(m.value?`prefix`:`icon`):``)+(o.value?` q-stepper__tab--active`:``)+(l.value?` q-stepper__tab--done`:``)+(f.value?` q-stepper__tab--navigation q-focusable q-hoverable`:``)+(s.value?` q-stepper__tab--disabled`:``)),y=h(()=>e.stepper.headerNav&&f.value);function b(){i.value?.focus({preventScroll:!0}),o.value||e.goToPanel(e.step.name)}function x(t){[13,32].includes(t.keyCode)&&(o.value||e.goToPanel(e.step.name),C(t))}return()=>{let t={class:v.value,"aria-current":o.value?`step`:void 0};u.value&&(t.role=`button`,s.value?(t.tabindex=-1,t[`aria-disabled`]=`true`):(t.onClick=b,t.onKeydown=J,t.onKeyup=x,t.tabindex=n.tabindex||0));let r=[a(`div`,{class:`q-focus-helper`,tabindex:-1,ref:i}),a(`div`,{class:`q-stepper__dot row flex-center q-stepper__line relative-position`},[a(`span`,{class:`row flex-center`},[m.value?e.step.prefix:a(j,{name:g.value})])])];if(e.step.title!==void 0&&e.step.title!==null){let t=[a(`div`,{class:`q-stepper__title`},e.step.title)];e.step.caption!==void 0&&e.step.caption!==null&&t.push(a(`div`,{class:`q-stepper__caption`},e.step.caption)),r.push(a(`div`,{class:`q-stepper__label q-stepper__line relative-position`},t))}return d(a(`div`,t,r),[[A,y.value]])}}});function X(e,t,n){return a(`div`,{class:`q-stepper__step-content`+(t?``:` q-panel scroll`),style:n},[a(`div`,{class:`q-stepper__step-inner q-stepper__step-inner--${t?`vertical`:`horizontal`}`},E(e.default))])}var Z={props:{vertical:Boolean},setup(e,{slots:t}){return()=>X(t,e.vertical)}},ie=k({name:`QStep`,props:{...z,icon:String,color:String,title:{type:String,required:!0},caption:String,prefix:[String,Number],doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String,headerNav:{type:Boolean,default:!0},done:Boolean,error:Boolean,onScroll:[Function,Array]},setup(e,{slots:n,emit:r}){let i=w(),s=u(D,O);if(s===O)return console.error(`QStep needs to be a child of QStepper`),O;let{getCache:l}=R(),{onEnter:d,onLeave:f}=L(()=>Number(s.value.transitionDuration)),p=t(null),g=h(()=>s.value.modelValue===e.name),_=h(()=>!i.platform.is.ios&&i.platform.is.chrome||!g.value||!s.value.vertical?{}:{onScroll(t){let{target:n}=t;n.scrollTop>0&&(n.scrollTop=0),e.onScroll!==void 0&&r(`scroll`,t)}}),v=h(()=>typeof e.name==`string`||typeof e.name==`number`?e.name:String(e.name)),y=h(()=>{if(s.value.vertical)return{css:!1,onEnter:d,onLeave:f};let e=s.value.panelTransition.value;return e===null?{}:{name:e,leaveActiveClass:`${e}-leave-active q-stepper__step-content--leaving`}}),b=t(!1);o(g,e=>{if(e||s.value.vertical||!s.value.animated){b.value=!1;return}b.value=!0,c(()=>{b.value=!1})});function x(){if(!g.value&&!b.value)return;let{vertical:e}=s.value,t=e?void 0:`--q-transition-duration: ${s.value.transitionDuration}ms`;return s.value.keepAlive?a(s.value.needsUniqueKeepAliveWrapper.value?l(v.value,()=>({...Z,name:String(v.value)})):Z,{key:v.value,vertical:e,style:t},n.default):X(n,e,t)}function C(){let e=x();return s.value.keepAlive?a(m,s.value.keepAliveProps.value,e===void 0?void 0:[e]):e}let T=h(()=>`q-stepper__step q-stepper__step--${s.value.vertical?`vertical`:`horizontal`}`);return()=>{let{vertical:t,animated:n}=s.value,r=t||g.value,i=[n?a(S,{key:`content`,...y.value},C):C()];return t&&i.unshift(a(Y,{key:`header`,stepper:s.value,step:e,goToPanel:s.value.goToPanel})),a(`div`,{ref:p,class:T.value,role:r?`group`:void 0,"aria-label":r?e.title:void 0,..._.value},i)}}}),ae=/(-\w)/g;function Q(e,t){return Array.isArray(e)?e.some(e=>Q(e,t)):typeof e==`string`?e.split(`,`).includes(t):e instanceof RegExp&&(e.lastIndex=0,e.test(t))}function oe(e){let t={};for(let n in e){let r=n.replace(ae,e=>e[1].toUpperCase());t[r]=e[n]}return t}var se=k({name:`QStepper`,props:{...M,...te,flat:Boolean,bordered:Boolean,alternativeLabels:Boolean,headerNav:Boolean,contracted:Boolean,headerClass:String,inactiveColor:String,inactiveIcon:String,doneIcon:String,doneColor:String,activeIcon:String,activeColor:String,errorIcon:String,errorColor:String},emits:ne,setup(e,{slots:n}){let r=w(),i=N(e,r),{updatePanelsList:s,isValidPanelName:c,updatePanelIndex:u,getPanels:f,panelTransition:p,panelDirectives:m,goToPanel:g,keepAliveProps:_,needsUniqueKeepAliveWrapper:v}=re(),y=t([]);o(()=>e.modelValue,t=>{if(e.keepAliveMax===void 0||!c(t))return;let n=String(t),r=y.value.filter(e=>e!==n);r.push(n),r.length>e.keepAliveMax&&r.splice(0,r.length-e.keepAliveMax),y.value=r},{immediate:!0});let b=h(()=>e.keepAliveMax===void 0?_.value:{include:e.keepAliveInclude===void 0?y.value:y.value.filter(t=>Q(e.keepAliveInclude,t)),exclude:e.keepAliveExclude}),x=h(()=>e.keepAliveMax!==void 0||v.value);l(D,h(()=>({goToPanel:g,keepAliveProps:b,needsUniqueKeepAliveWrapper:x,panelTransition:p,...e})));let S=h(()=>`q-stepper q-stepper--${e.vertical?`vertical`:`horizontal`}`+(e.flat?` q-stepper--flat`:``)+(e.bordered?` q-stepper--bordered`:``)+(i()?` q-stepper--dark q-dark`:``)),C=h(()=>`q-stepper__header row items-stretch justify-between q-stepper__header--${e.alternativeLabels?`alternative`:`standard`}-labels`+(e.bordered||!e.flat?` q-stepper__header--border`:``)+(e.contracted?` q-stepper__header--contracted`:``)+(e.headerClass===void 0?``:` ${e.headerClass}`)),O=h(()=>`q-stepper__content`+(e.vertical?``:` q-panel-parent`)),k=h(()=>{if(!e.vertical)return m.value;let[t,,n,r]=m.value[0];return[[t,void 0,n,r]]});function A(){let t=E(n.message,[]);c(e.modelValue)&&u();let r=d(a(`div`,{key:`content`,class:O.value},E(n.default)),k.value);return e.vertical?t===void 0?[r]:t.concat(r):[a(`div`,{key:`header`,class:C.value},f().map(t=>{let n=oe(t.props);return a(Y,{key:n.name,stepper:e,step:n,goToPanel:g})})),t,r]}return()=>(s(n),a(`div`,{class:S.value},T(n.navigation,A())))}}),ce={class:`slash-suggestions rounded-borders`},le={class:`slash-section-header`},ue=[`onMousedown`],de={class:`slash-name text-caption`},fe={class:`slash-section-header`},pe=[`onMousedown`],$={class:`slash-name text-caption`},me={key:0,class:`slash-description text-caption text-kobo-3 q-ml-xs`},he={class:`slash-section-header`},ge=[`onMousedown`],_e={class:`slash-name text-caption`},ve={key:0,class:`slash-description text-caption text-kobo-3 q-ml-xs`},ye=ee(y({__name:`SlashSuggestionsPopup`,props:{groupedDropdown:{},flatDropdown:{},selectedIndex:{}},emits:[`select`],setup(t,{emit:i}){let{t:a}=P(),o=i;function c(e){let t=B[`/${e}`];if(!t)return``;let n=t.descriptionKey,r=a(n);return r===n?``:r}return(i,l)=>(s(),g(`div`,ce,[t.groupedDropdown.skills.length>0?(s(),g(_,{key:0},[v(`div`,le,r(e(a)(`chatInput.dropdownSkills`)),1),(s(!0),g(_,null,b(t.groupedDropdown.skills,e=>(s(),g(`div`,{key:`skill-${e.name}`,class:n([`slash-item row items-center q-px-sm q-py-xs cursor-pointer`,{"slash-item--active":t.flatDropdown.indexOf(e)===t.selectedIndex}]),onMousedown:x(t=>o(`select`,e),[`prevent`])},[f(j,{name:`bolt`,size:`12px`,color:`primary`,class:`q-mr-xs`}),v(`span`,de,r(e.name),1)],42,ue))),128))],64)):p(``,!0),t.groupedDropdown.kobo.length>0?(s(),g(_,{key:1},[v(`div`,fe,r(e(a)(`chatInput.dropdownKobo`)),1),(s(!0),g(_,null,b(t.groupedDropdown.kobo,e=>(s(),g(`div`,{key:`kobo-${e.name}`,class:n([`slash-item row items-center q-px-sm q-py-xs cursor-pointer`,{"slash-item--active":t.flatDropdown.indexOf(e)===t.selectedIndex}]),onMousedown:x(t=>o(`select`,e),[`prevent`])},[f(j,{name:`terminal`,size:`12px`,color:`teal-4`,class:`q-mr-xs`}),v(`span`,$,`/`+r(e.name),1),c(e.name)?(s(),g(`span`,me,`— `+r(c(e.name)),1)):p(``,!0)],42,pe))),128))],64)):p(``,!0),t.groupedDropdown.templates.length>0?(s(),g(_,{key:2},[v(`div`,he,r(e(a)(`chatInput.dropdownTemplates`)),1),(s(!0),g(_,null,b(t.groupedDropdown.templates,e=>(s(),g(`div`,{key:`tpl-${e.name}`,class:n([`slash-item row items-center q-px-sm q-py-xs cursor-pointer`,{"slash-item--active":t.flatDropdown.indexOf(e)===t.selectedIndex}]),onMousedown:x(t=>o(`select`,e),[`prevent`])},[f(j,{name:`description`,size:`12px`,color:`amber-4`,class:`q-mr-xs`}),v(`span`,_e,`/`+r(e.name),1),e.description?(s(),g(`span`,ve,`— `+r(e.description),1)):p(``,!0)],42,ge))),128))],64)):p(``,!0)]))}}),[[`__scopeId`,`data-v-931c9d69`]]);function be(e,t,n={}){let r=F(),a=i([]),s=i(!1),c=i(``),l=i(0),u=0;async function d(){let e=Date.now();if(!(e-u<5e3&&a.value.length>0)){u=e;try{let e=await I(`/api/skills`);e.ok&&(a.value=await e.json())}catch{}}}function f(){let n=t();if(!n)return null;let r=n.selectionStart??e.value.length,i=e.value.slice(0,r).match(/\/([\w:.-]*)$/);return i?i[1]:null}async function p(){let e=f();e===null?s.value=!1:(await d(),c.value=e,s.value=!0,l.value=0)}function m(){s.value=!1}function g(n){let r=t();if(!r){e.value=n;return}let i=r.selectionStart??e.value.length,a=e.value.slice(0,i),o=e.value.slice(i),s=a.match(/\/[\w:.-]*$/);if(!s){e.value=n;return}let c=s.index??i;e.value=e.value.slice(0,c)+n+o}let _=h(()=>{let e=c.value.toLowerCase(),t=t=>e===``||t.toLowerCase().includes(e);return{skills:a.value.filter(e=>t(e)).map(e=>({type:`skill`,name:e})),kobo:n.excludeKoboCommands?[]:Object.keys(B).map(e=>e.replace(/^\//,``)).filter(e=>t(e)).map(e=>({type:`kobo`,name:e})),templates:r.templates.filter(e=>t(e.slug)).map(e=>({type:`template`,name:e.slug,description:e.description}))}}),v=h(()=>[..._.value.skills,..._.value.kobo,..._.value.templates]);return o(()=>v.value.length,e=>{if(e===0){l.value=0;return}l.value>=e&&(l.value=e-1)}),{skills:a,showSkills:s,skillFilter:c,selectedSkillIndex:l,groupedDropdown:_,flatDropdown:v,fetchSkills:d,detectSlashFragment:p,replaceFragmentWith:g,closeDropdown:m}}function xe(e,t){return e.replace(/\{(\w+)\}/g,(e,n)=>{let r=t[n];return r==null?e:String(r)})}function Se(e){let t={};return e.workspace&&(t.workspace_name=e.workspace.name,t.working_branch=e.workspace.workingBranch,t.source_branch=e.workspace.sourceBranch,t.project_path=e.workspace.projectPath,t.worktree_path=e.workspace.worktreePath??`${e.workspace.projectPath}/.worktrees/${e.workspace.workingBranch}`),e.gitStats&&(t.commit_count=e.gitStats.commitCount,t.unpushed_count=e.gitStats.unpushedCount,t.files_changed=e.gitStats.filesChanged,t.insertions=e.gitStats.insertions,t.deletions=e.gitStats.deletions,e.gitStats.prNumber!=null&&(t.pr_number=e.gitStats.prNumber),e.gitStats.prUrl&&(t.pr_url=e.gitStats.prUrl),e.gitStats.prState&&(t.pr_state=e.gitStats.prState)),e.sessionName&&(t.session_name=e.sessionName),t}export{se as a,G as c,q as d,ye as i,W as l,xe as n,ie as o,be as r,U as s,Se as t,K as u};
@@ -1,4 +1,4 @@
1
- import{t as e}from"./defineProperty-BbfpZ9Tg.js";import{Xt as t}from"./index-DCpe-Tfm.js";var n;function r(e){if(e.length===0)throw Error(`Invalid tail call`);return[e.slice(0,e.length-1),e[e.length-1]]}function i(e,t,n=(e,t)=>e===t){if(e===t)return!0;if(!e||!t||e.length!==t.length)return!1;for(let r=0,i=e.length;r<i;r++)if(!n(e[r],t[r]))return!1;return!0}function a(e,t){let n=e.length-1;t<n&&(e[t]=e[n]),e.pop()}function o(e,t,n){return s(e.length,r=>n(e[r],t))}function s(e,t){let n=0,r=e-1;for(;n<=r;){let e=(n+r)/2|0,i=t(e);if(i<0)n=e+1;else if(i>0)r=e-1;else return e}return-(n+1)}function c(e,t,n){if(e|=0,e>=t.length)throw TypeError(`invalid index`);let r=t[Math.floor(t.length*Math.random())],i=[],a=[],o=[];for(let e of t){let t=n(e,r);t<0?i.push(e):t>0?a.push(e):o.push(e)}return e<i.length?c(e,i,n):e<i.length+o.length?o[0]:c(e-(i.length+o.length),a,n)}function l(e,t){let n=[],r;for(let i of e.slice(0).sort(t))!r||t(r[0],i)!==0?(r=[i],n.push(r)):r.push(i);return n}function*u(e,t){let n,r;for(let i of e)r!==void 0&&t(r,i)?n.push(i):(n&&(yield n),n=[i]),r=i;n&&(yield n)}function d(e,t){for(let n=0;n<=e.length;n++)t(n===0?void 0:e[n-1],n===e.length?void 0:e[n])}function f(e,t){for(let n=0;n<e.length;n++)t(n===0?void 0:e[n-1],e[n],n+1===e.length?void 0:e[n+1])}function p(e){return e.filter(e=>!!e)}function m(e){let t=0;for(let n=0;n<e.length;n++)e[n]&&(e[t]=e[n],t+=1);e.length=t}function h(e){return!Array.isArray(e)||e.length===0}function g(e){return Array.isArray(e)&&e.length>0}function _(e,t=e=>e){let n=new Set;return e.filter(e=>{let r=t(e);return!n.has(r)&&(n.add(r),!0)})}function v(e,t){let n=typeof t==`number`?e:0;typeof t==`number`?n=e:(n=0,t=e);let r=[];if(n<=t)for(let e=n;e<t;e++)r.push(e);else for(let e=n;e>t;e--)r.push(e);return r}function y(e,t,n){let r=e.slice(0,t),i=e.slice(t);return r.concat(n,i)}function b(e,t){let n=e.indexOf(t);n>-1&&(e.splice(n,1),e.unshift(t))}function x(e,t){let n=e.indexOf(t);n>-1&&(e.splice(n,1),e.push(t))}function S(e,t){for(let n of t)e.push(n)}function C(e,t){let n=[];for(let r of e){let e=t(r);e!==void 0&&n.push(e)}return n}function w(e){return Array.isArray(e)?e:[e]}function T(e,t,n){let r=te(e,t),i=e.length,a=n.length;e.length=i+a;for(let t=i-1;t>=r;t--)e[t+a]=e[t];for(let t=0;t<a;t++)e[t+r]=n[t]}function ee(e,t,n,r){let i=te(e,t),a=e.splice(i,n);return a===void 0&&(a=[]),T(e,i,r),a}function te(e,t){return t<0?Math.max(t+e.length,0):Math.min(t,e.length)}var ne;(function(e){function t(e){return e<0}e.isLessThan=t;function n(e){return e<=0}e.isLessThanOrEqual=n;function r(e){return e>0}e.isGreaterThan=r;function i(e){return e===0}e.isNeitherLessOrGreaterThan=i,e.greaterThan=1,e.lessThan=-1,e.neitherLessOrGreaterThan=0})(ne||={});function re(e,t){return(n,r)=>t(e(n),e(r))}function ie(...e){return(t,n)=>{for(let r of e){let e=r(t,n);if(!ne.isNeitherLessOrGreaterThan(e))return e}return ne.neitherLessOrGreaterThan}}var ae=(e,t)=>e-t,oe=(e,t)=>ae(+!!e,+!!t);function se(e){return(t,n)=>-e(t,n)}function ce(e){return(t,n)=>t===void 0?n===void 0?ne.neitherLessOrGreaterThan:ne.lessThan:n===void 0?ne.greaterThan:e(t,n)}var le=class{constructor(e){this.firstIdx=0,this.items=e,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(e){let t=this.firstIdx;for(;t<=this.lastIdx&&e(this.items[t]);)t++;let n=t===this.firstIdx?null:this.items.slice(this.firstIdx,t);return this.firstIdx=t,n}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){let e=this.items[this.firstIdx];return this.firstIdx++,e}takeCount(e){let t=this.items.slice(this.firstIdx,this.firstIdx+e);return this.firstIdx+=e,t}},ue=class e{constructor(e){this.iterate=e}toArray(){let e=[];return this.iterate(t=>(e.push(t),!0)),e}filter(t){return new e(e=>this.iterate(n=>!t(n)||e(n)))}map(t){return new e(e=>this.iterate(n=>e(t(n))))}findLast(e){let t;return this.iterate(n=>(e(n)&&(t=n),!0)),t}findLastMaxBy(e){let t,n=!0;return this.iterate(r=>((n||ne.isGreaterThan(e(r,t)))&&(n=!1,t=r),!0)),t}};n=ue,n.empty=new n(e=>{});var de=class e{constructor(e){this._indexMap=e}static createSortPermutation(t,n){let r=Array.from(t.keys()).sort((e,r)=>n(t[e],t[r]));return new e(r)}apply(e){return e.map((t,n)=>e[this._indexMap[n]])}inverse(){let t=this._indexMap.slice();for(let e=0;e<this._indexMap.length;e++)t[this._indexMap[e]]=e;return new e(t)}};function fe(e){return e.reduce((e,t)=>e+t,0)}var pe=new class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?Te.isErrorNoTelemetry(e)?new Te(e.message+`
1
+ import{t as e}from"./defineProperty-BbfpZ9Tg.js";import{Zt as t}from"./index-CbyHfF8I.js";var n;function r(e){if(e.length===0)throw Error(`Invalid tail call`);return[e.slice(0,e.length-1),e[e.length-1]]}function i(e,t,n=(e,t)=>e===t){if(e===t)return!0;if(!e||!t||e.length!==t.length)return!1;for(let r=0,i=e.length;r<i;r++)if(!n(e[r],t[r]))return!1;return!0}function a(e,t){let n=e.length-1;t<n&&(e[t]=e[n]),e.pop()}function o(e,t,n){return s(e.length,r=>n(e[r],t))}function s(e,t){let n=0,r=e-1;for(;n<=r;){let e=(n+r)/2|0,i=t(e);if(i<0)n=e+1;else if(i>0)r=e-1;else return e}return-(n+1)}function c(e,t,n){if(e|=0,e>=t.length)throw TypeError(`invalid index`);let r=t[Math.floor(t.length*Math.random())],i=[],a=[],o=[];for(let e of t){let t=n(e,r);t<0?i.push(e):t>0?a.push(e):o.push(e)}return e<i.length?c(e,i,n):e<i.length+o.length?o[0]:c(e-(i.length+o.length),a,n)}function l(e,t){let n=[],r;for(let i of e.slice(0).sort(t))!r||t(r[0],i)!==0?(r=[i],n.push(r)):r.push(i);return n}function*u(e,t){let n,r;for(let i of e)r!==void 0&&t(r,i)?n.push(i):(n&&(yield n),n=[i]),r=i;n&&(yield n)}function d(e,t){for(let n=0;n<=e.length;n++)t(n===0?void 0:e[n-1],n===e.length?void 0:e[n])}function f(e,t){for(let n=0;n<e.length;n++)t(n===0?void 0:e[n-1],e[n],n+1===e.length?void 0:e[n+1])}function p(e){return e.filter(e=>!!e)}function m(e){let t=0;for(let n=0;n<e.length;n++)e[n]&&(e[t]=e[n],t+=1);e.length=t}function h(e){return!Array.isArray(e)||e.length===0}function g(e){return Array.isArray(e)&&e.length>0}function _(e,t=e=>e){let n=new Set;return e.filter(e=>{let r=t(e);return!n.has(r)&&(n.add(r),!0)})}function v(e,t){let n=typeof t==`number`?e:0;typeof t==`number`?n=e:(n=0,t=e);let r=[];if(n<=t)for(let e=n;e<t;e++)r.push(e);else for(let e=n;e>t;e--)r.push(e);return r}function y(e,t,n){let r=e.slice(0,t),i=e.slice(t);return r.concat(n,i)}function b(e,t){let n=e.indexOf(t);n>-1&&(e.splice(n,1),e.unshift(t))}function x(e,t){let n=e.indexOf(t);n>-1&&(e.splice(n,1),e.push(t))}function S(e,t){for(let n of t)e.push(n)}function C(e,t){let n=[];for(let r of e){let e=t(r);e!==void 0&&n.push(e)}return n}function w(e){return Array.isArray(e)?e:[e]}function T(e,t,n){let r=te(e,t),i=e.length,a=n.length;e.length=i+a;for(let t=i-1;t>=r;t--)e[t+a]=e[t];for(let t=0;t<a;t++)e[t+r]=n[t]}function ee(e,t,n,r){let i=te(e,t),a=e.splice(i,n);return a===void 0&&(a=[]),T(e,i,r),a}function te(e,t){return t<0?Math.max(t+e.length,0):Math.min(t,e.length)}var ne;(function(e){function t(e){return e<0}e.isLessThan=t;function n(e){return e<=0}e.isLessThanOrEqual=n;function r(e){return e>0}e.isGreaterThan=r;function i(e){return e===0}e.isNeitherLessOrGreaterThan=i,e.greaterThan=1,e.lessThan=-1,e.neitherLessOrGreaterThan=0})(ne||={});function re(e,t){return(n,r)=>t(e(n),e(r))}function ie(...e){return(t,n)=>{for(let r of e){let e=r(t,n);if(!ne.isNeitherLessOrGreaterThan(e))return e}return ne.neitherLessOrGreaterThan}}var ae=(e,t)=>e-t,oe=(e,t)=>ae(+!!e,+!!t);function se(e){return(t,n)=>-e(t,n)}function ce(e){return(t,n)=>t===void 0?n===void 0?ne.neitherLessOrGreaterThan:ne.lessThan:n===void 0?ne.greaterThan:e(t,n)}var le=class{constructor(e){this.firstIdx=0,this.items=e,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(e){let t=this.firstIdx;for(;t<=this.lastIdx&&e(this.items[t]);)t++;let n=t===this.firstIdx?null:this.items.slice(this.firstIdx,t);return this.firstIdx=t,n}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){let e=this.items[this.firstIdx];return this.firstIdx++,e}takeCount(e){let t=this.items.slice(this.firstIdx,this.firstIdx+e);return this.firstIdx+=e,t}},ue=class e{constructor(e){this.iterate=e}toArray(){let e=[];return this.iterate(t=>(e.push(t),!0)),e}filter(t){return new e(e=>this.iterate(n=>!t(n)||e(n)))}map(t){return new e(e=>this.iterate(n=>e(t(n))))}findLast(e){let t;return this.iterate(n=>(e(n)&&(t=n),!0)),t}findLastMaxBy(e){let t,n=!0;return this.iterate(r=>((n||ne.isGreaterThan(e(r,t)))&&(n=!1,t=r),!0)),t}};n=ue,n.empty=new n(e=>{});var de=class e{constructor(e){this._indexMap=e}static createSortPermutation(t,n){let r=Array.from(t.keys()).sort((e,r)=>n(t[e],t[r]));return new e(r)}apply(e){return e.map((t,n)=>e[this._indexMap[n]])}inverse(){let t=this._indexMap.slice();for(let e=0;e<this._indexMap.length;e++)t[this._indexMap[e]]=e;return new e(t)}};function fe(e){return e.reduce((e,t)=>e+t,0)}var pe=new class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?Te.isErrorNoTelemetry(e)?new Te(e.message+`
2
2
 
3
3
  `+e.stack):Error(e.message+`
4
4
 
@@ -1 +1 @@
1
- import{Zt as e}from"./index-DCpe-Tfm.js";function t(){let{t}=e();function n(e){let n=typeof e==`string`?new Date(e).getTime():e.getTime(),r=Date.now()-n,i=Math.floor(r/6e4);if(i<1)return t(`common.justNow`);if(i<60)return t(`common.minutesAgo`,{count:i});let a=Math.floor(i/60);if(a<24)return t(`common.hoursAgo`,{count:a});let o=Math.floor(a/24);return t(`common.daysAgo`,{count:o})}return{timeAgo:n}}export{t};
1
+ import{Qt as e}from"./index-CbyHfF8I.js";function t(){let{t}=e();function n(e){let n=typeof e==`string`?new Date(e).getTime():e.getTime(),r=Date.now()-n,i=Math.floor(r/6e4);if(i<1)return t(`common.justNow`);if(i<60)return t(`common.minutesAgo`,{count:i});let a=Math.floor(i/60);if(a<24)return t(`common.hoursAgo`,{count:a});let o=Math.floor(a/24);return t(`common.daysAgo`,{count:o})}return{timeAgo:n}}export{t};
@@ -14,4 +14,4 @@ KOBO_PR_NUMBER — numéro de PR/MR sur la forge résolue (vide si aucune o
14
14
  # Ou directement via git (fonctionne sur GitHub même après suppression de la branche) :
15
15
  git fetch origin pull/[numéro-pr]/head:[nom-branche]
16
16
  git worktree add [chemin] [nom-branche]`,"settings.purgeDocsRestoreFootnote":`GitHub conserve la ref HEAD de la PR bien après la suppression de la branche source (mois / années). L'auto-détection tourne dans le watcher 30s — pas besoin d'action dans l'UI une fois le dossier recréé.`,"settings.purgeDocsPermissionsTitle":`Éviter les erreurs de permissions pendant la suppression`,"settings.purgeDocsPermissionsIntro":`Docker laisse souvent des fichiers root-owned dans node_modules / vendor à l'intérieur du worktree. Quand Kōbō essaie de les supprimer, tu tombes sur EACCES / EPERM et la purge échoue. Deux moyens de prévenir :`,"settings.purgeDocsPermissionsDocker":'Configurer ton conteneur pour qu\'il tourne sous ton utilisateur hôte — directive USER dans le Dockerfile, ou `user: "${UID}:${GID}"` dans docker-compose (avec UID/GID exportés dans ton shell).',"settings.purgeDocsPermissionsAcl":`Pré-définir un ACL par défaut sur la racine des worktrees — filet de sécurité qui marche dans la PLUPART des cas (ext4/btrfs/xfs + bind mount Docker classique). Chaque nouveau fichier hérite alors d'une entrée d'accès pour ton user, en plus du propriétaire nominal :`,"settings.purgeDocsPermissionsAclCommand":` setfacl -d -m u:$(whoami):rwX [racine-worktrees]`,"settings.purgeDocsPermissionsFootnote":"Limites des ACL : ne marchent PAS sur les volumes Docker nommés (utilise un bind mount), filesystems sans support ACL (NTFS, exFAT, tmpfs), SELinux strict avec `:Z`, ou `userns-remap` Docker activé. La solution la plus fiable reste de configurer le user dans le conteneur (option 1). Astuce : `rwX` (X majuscule) n'ajoute le bit exécutable qu'aux dossiers et fichiers déjà exécutables — plus propre que `rwx` qui rendrait exécutables tous les fichiers texte.","settings.purgeDocsPermissionsRecoverTitle":`Débloquer un worktree déjà cassé (fichiers root-owned existants)`,"settings.purgeDocsPermissionsRecoverIntro":`Si tu te retrouves avec un worktree déjà rempli de fichiers root-owned (Docker a déjà tourné, vendor / node_modules sont coincés), les ACL préventives ci-dessus ne suffisent pas — il faut traiter les fichiers EXISTANTS. Deux approches, à exécuter dans le dossier du worktree :`,"settings.purgeDocsPermissionsRecoverAclIntro":`Option A — ACL récursive (préserve l'ownership root pour audit, t'ajoute juste un accès en parallèle) :`,"settings.purgeDocsPermissionsRecoverAclCommand":`# pose l'ACL par défaut pour les futurs fichiers ET donne accès à tout l'existant
17
- sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Option B — Reprendre la propriété (plus simple, perd l'info "créé par root dans le conteneur" mais osef en pratique) :`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Astuce : tu peux exécuter ces commandes directement sur la racine de tes worktrees (ex. `~/.worktrees/`) pour couvrir tous les workspaces existants ET futurs d'un seul coup. Une fois fait, la purge Kōbō fonctionnera sans erreur de permission.","contextMenu.runSetup":`Lancer le script de setup`,"contextMenu.exportEvents":`Exporter les events (CSV)`,"contextMenu.dismissChangesRequested":`Marquer « Modifications demandées » comme vu`,"contextMenu.dismissCiFailure":`Marquer « CI en échec » comme vu`,"contextMenu.restoreChangesRequested":`Marquer « Modifications demandées » comme non vu`,"contextMenu.restoreCiFailure":`Marquer « CI en échec » comme non vu`,"contextMenu.exportingEvents":`Préparation de l'export…`,"contextMenu.exportEventsError":`Échec de l'export des events`,"contextMenu.openNotion":`Ouvrir dans Notion`,"contextMenu.openSentry":`Ouvrir dans Sentry`,"contextMenu.openPr":`Ouvrir la PR`,"contextMenu.ignorePrWatch":`Ignorer les checks PR`,"contextMenu.resumePrWatch":`Réactiver les checks PR`,"contextMenu.prWatchToggleFailed":`Échec de la mise à jour des checks PR`,"workspace.favorite":`Ajouter aux favoris`,"workspace.unfavorite":`Retirer des favoris`,"workspace.showFavoritesOnly":`Afficher uniquement les favoris`,"workspace.tagFilter":`Filtrer par tags`,"workspace.tagFilterActive":`Filtrer par tags ({count} sélectionné(s))`,"workspace.tagFilterClear":`Effacer`,"workspace.tagFilterEmpty":`Aucun tag pour l'instant. Définissez-les dans les réglages, puis attribuez-les depuis le menu d'un workspace.`,"workspace.searchArchivedToggle":`Inclure les workspaces archivés dans la recherche`,"workspace.descriptionPlaceholder":`Ajouter une courte description`,"workspace.descriptionDialogHint":`Texte brut, 200 caractères maximum. Laisser vide pour effacer.`,"workspace.descriptionTooLong":`La description doit faire 200 caractères ou moins.`,"workspace.descriptionSaveFailed":`Échec de l'enregistrement de la description.`,"workspace.agentDescriptionTooltip":`État en direct maintenu par l'agent`,"mcp.tool.setWorkspaceDescription":`Définit la courte description du workspace (≤ 200 caractères).`,"tags.manage":`Gérer les tags`,"tags.manageTitle":`Gérer les tags du workspace`,"tags.noTagsDefined":`Aucun tag défini. Ajoutes-en dans Paramètres > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) ne sont plus dans le catalogue global. Décoche-les pour les retirer.`,"settings.tagsTitle":`Tags des workspaces`,"settings.tagsHint":`Définis les tags assignables aux workspaces. Tape pour ajouter, clique la croix pour retirer.`,"settings.tagsLabel":`Tags disponibles`,"settings.branchPrefixesTitle":`Préfixes de branche`,"settings.branchPrefixesHint":`Gérez les préfixes de branche Git disponibles sur la page de création. Le premier est présélectionné par défaut.`,"settings.branchPrefixesEmpty":`Aucun préfixe de branche défini. Ajoutez-en au moins un ci-dessous.`,"settings.branchPrefixesAddLabel":`Nouveau préfixe`,"settings.branchPrefixesEditHint":`Cliquer pour renommer`,"settings.branchPrefixesMoveUp":`Monter`,"settings.branchPrefixesMoveDown":`Descendre`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Choisis où créer les worktrees des nouveaux workspaces. Les chemins relatifs sont résolus depuis le projet ; les chemins absolus Linux/macOS et Windows, $HOME, ~ et %USERPROFILE% sont supportés.`,"settings.worktreesPathLabel":`Chemin des worktrees`,"settings.worktreesPathRequired":`Le chemin des worktrees est requis.`,"settings.worktreesPrefixByProject":`Préfixer les worktrees par le nom du projet`,"settings.worktreesPrefixByProjectHint":`Place chaque worktree dans un sous-dossier nommé d'après le projet, pour éviter les collisions quand plusieurs projets partagent la même racine.`,"settings.shareTitle":`Partager la configuration`,"settings.shareHint":`Exporte tes paramètres, templates et tags en bundle JSON. Les clés MCP sont retirées à l’export pour la sécurité.`,"settings.exportConfig":`Exporter`,"settings.importConfig":`Importer`,"settings.exportSuccess":`Configuration exportée`,"settings.importSuccess":`Configuration importée`,"settings.importConfirmTitle":`Importer la configuration`,"settings.importConfirmMessage":`Cela remplacera tes paramètres, templates et tags actuels. Tes clés MCP seront conservées. Continuer ?`,"settings.mcp.title":`Connexions des LLM externes (MCP)`,"settings.mcp.hint":`Connectez un client MCP pour créer, archiver, purger, supprimer ou restaurer des workspaces, reprendre une PR et dialoguer avec vos agents.`,"settings.mcp.remoteDisabled":`Les connexions distantes nécessitent l’accès réseau et un redémarrage du serveur après son activation.`,"settings.mcp.clientName":`Nom du client (facultatif)`,"settings.mcp.connection":`Connexion`,"settings.mcp.local":`HTTP local`,"settings.mcp.remote":`HTTP distant`,"settings.mcp.proxy":`Proxy inverse`,"settings.mcp.stdio":`Stdio local`,"settings.mcp.copyUrl":`Copier l’URL`,"settings.mcp.copyConfig":`Copier la configuration`,"settings.mcp.copyWithToken":`Copier avec le jeton`,"settings.mcp.genericFormat":`Ces exemples utilisent le format générique mcpServers. Adaptez le conteneur à votre client MCP. Les aperçus affichent un emplacement réservé au jeton.`,"settings.mcp.tokenUnavailable":`Aucun jeton disponible. Activez l’accès réseau avant de copier une configuration authentifiée.`,"settings.mcp.stdioUnavailable":`Le point d’entrée stdio est indisponible dans cette installation. Utilisez HTTP ou compilez Kōbō.`,"settings.mcp.copyFailed":`Impossible de copier dans le presse-papiers.`,"tours.settings.mcp.title":`Connecter un LLM externe`,"tours.settings.mcp.description":`Copiez une configuration HTTP ou stdio pour connecter un assistant externe. Il peut créer un workspace avec les options du formulaire, reprendre une PR, gérer son archivage, sa suppression ou sa restauration et communiquer avec vos agents.`,"settings.network.title":`Accès réseau`,"settings.network.hint":`Pilote Kōbō depuis un autre appareil de ton LAN de confiance. Off = localhost uniquement. On = accessible sur ton réseau, protégé par un token. Redémarre Kōbō après bascule.`,"settings.network.enable":`Activer l'accès réseau`,"settings.network.behindProxy":`Derrière un reverse proxy`,"settings.network.behindProxyHint":`Kōbō ne peut plus distinguer ta propre machine d'une requête relayée — même le localhost devra présenter le token désormais. N'active ceci que si un reverse proxy (Traefik, nginx, Caddy…) est devant Kōbō.`,"settings.network.restartRequired":`Redémarre Kōbō pour appliquer la nouvelle adresse de bind.`,"settings.network.token":`Token d'accès`,"settings.network.copy":`Copier`,"settings.network.copied":`Copié`,"settings.network.regenerate":`Régénérer`,"settings.network.regenerateConfirm":`Régénérer le token ? Les appareils connectés devront utiliser le nouveau token.`,"settings.network.urls":`URLs LAN`,"settings.network.scan":`Scanner pour se connecter`,"settings.network.noUrls":`Aucune adresse LAN détectée.`,"settings.network.loadFailed":`Échec du chargement des réglages d'accès réseau.`,"settings.network.updateFailed":`Échec de la mise à jour des réglages d'accès réseau.`,"settings.unsavedChanges.title":`Modifications non enregistrées`,"settings.unsavedChanges.message":`Ce projet a des modifications non enregistrées. Changer de projet les annulera.`,"settings.unsavedChanges.discard":`Ignorer et changer`,"settings.unsavedChanges.cancel":`Annuler`,"settings.loadFailed":`Les réglages n’ont pas pu être chargés`,"settings.loadFailedHint":`L’enregistrement est désactivé : le formulaire affiche les valeurs par défaut, et les écrire remplacerait votre configuration réelle.`,"health.title":`Santé`,"health.tooltip":`Santé du système`,"changelog.title":`Journal des changements`,"changelog.tooltip":`Quoi de neuf dans Kōbō`,"changelog.empty":`Aucun changelog disponible.`,"changelog.current":`actuelle`,"changelog.currentVersion":`Version actuelle : v{version}`,"health.envTitle":`Environnement`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de données`,"health.dbPath":`Chemin`,"health.dbSize":`Taille`,"health.schemaVersion":`Version du schéma`,"health.settingsSchemaVersion":`Schéma settings`,"health.runtimesTitle":`Moteurs d'agent`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude introuvable dans le PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binaire codex introuvable`,"health.forgeCliTitle":`CLI de forge (gh / glab)`,"health.forgeCliMissing":`Ni gh ni glab trouvés — pull requests et surveillance de CI indisponibles`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} au total, {archived} archivés`,"health.worktreesMissing":`{count} worktree(s) manquant(s) sur le disque`,"health.sessionsTitle":`Sessions agent`,"health.sessionsOrphaned":`{n} session(s) orpheline(s) marquées running`,"health.integrationsTitle":`Intégrations`,"health.integrationConfigured":`configurée`,"health.integrationMissing":`non configurée`,"health.integrationDisabled":`désactivée`,"settings.integrationEnabled":`Activer l’intégration`,"health.activeTitle":`État actif`,"health.activeQuotaBackoffs":`Quota backoffs en attente`,"health.activeWakeups":`Wakeups programmés`,"health.activeAutoLoop":`Auto-loop en cours`,"health.activeAgentSessions":`Sessions agent en cours`,"health.activeDevServers":`Serveurs de dev lancés`,"health.noneActive":`Aucun.`,"health.quotaResumeAt":`reprise à {time}`,"health.wakeupAt":`réveil à {time}`,"health.startedAgo":`démarré il y a {time}`,"health.autoLoopReady":`prêt, itération en cours`,"health.autoLoopGrooming":`grooming en cours`,"session.started":`Session démarrée`,"session.ended":`Session terminée`,"session.compacted":`Contexte compacté`,"session.endedCompleted":`Tour terminé — envoyez un message pour continuer`,"session.endedKilled":`Session arrêtée`,"session.endedError":`Session terminée sur une erreur`,"session.endedWatchdog":`Session fermée de force après une période d'inactivité`,"tool.running":`En cours...`,"activity.raw_lines":`Lignes de sortie brutes ({n})`,"api.timeout":`La requête a dépassé le délai de {seconds} secondes.`,"api.mutationTimeout":`La requête a dépassé le délai de {seconds} secondes. L’opération peut encore être en cours. Actualisez son état avant de réessayer.`,"activity.sessionsError":`Impossible de charger les sessions : {message}`,"activity.historyError":`Impossible de charger l’historique : {message}`,"activity.loading_older":`Chargement des messages plus anciens…`,"activity.compacting":`Compaction du contexte…`,"activity.prev_user_message":`Message utilisateur précédent`,"activity.scroll_to_bottom":`Défiler vers le bas`,"activity.empty":`Rien pour l’instant`,"activity.emptyHint":`La sortie de l’agent s’affichera ici dès qu’une session démarrera.`,"activity.a11y.region":`Annonces d’activité de l’agent`,"activity.a11y.agentSaid":`Agent : {text}`,"activity.a11y.toolStarted":`Outil {name} démarré`,"activity.a11y.toolFinished":`Outil {name} terminé`,"activity.a11y.toolFailed":`Outil {name} en échec`,"chat.systemPrompt":`Prompt système`,"chat.agent":`Agent`,"chat.cleanupScript":`Script de cleanup`,"chat.archiveScript":`Script d'archivage`,"chat.setupScript":`Script de setup`,"chat.hookScript":`Hook {event}`,"chat.scriptDone":`Fait`,"chat.scriptComplete":`[{phase}] Terminé`,"chat.scriptError":`[{phase}] Erreur : {message}`,"chat.unknownError":`inconnue`,"chat.you":`Vous`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Dernière mise à jour à {time}`,"chat.scrollToTurnTop":`Défiler vers le haut du message`,"migration.backing_up":`Sauvegarde de la base de données…`,"migration.running":`Migration des données d'agent — {processed}/{total}`,"migration.error":`Échec de la migration`,"migration.backup_location":`Une sauvegarde a été enregistrée à {path}. Redémarre Kōbō pour réessayer.`,"migration.retry":`Redémarre Kōbō pour réessayer.`,"engine.select":`Moteur`,"engine.model":`Modèle`,"engine.effort":`Effort de réflexion`,"wakeup.scheduledIn":`Prochain réveil dans {n}s`,"wakeup.scheduledAt":`Prochain réveil à {time}`,"wakeup.firing":`Réveil en cours…`,"wakeup.reason":`Raison : {reason}`,"wakeup.cancel":`Annuler ce réveil`,"wakeup.pendingIndicator":`Réveil programmé`,"cron.pendingIndicator":`{n} cron(s) programmé(s)`,"schedule.tabLabel":`Programmation`,"schedule.admissionTitle":`Nouvelle session automatique indisponible pour le moment.`,"schedule.admissionHint":`Les échéances restent inchangées. Un message vers une conversation existante suit ses propres règles.`,"schedule.admission.not-found":`Espace introuvable.`,"schedule.admission.archived":`Espace archivé.`,"schedule.admission.purged":`Restaurez le worktree.`,"schedule.admission.shutdown":`Le serveur est en cours d’arrêt.`,"schedule.admission.lifecycle":`Une opération sur cet espace est en cours.`,"schedule.admission.active-session":`La session actuelle n’est pas encore fermée.`,"schedule.admission.awaiting-user":`Une réponse utilisateur est attendue.`,"schedule.admission.compacting":`Le contexte est en cours de compactage.`,"schedule.admission.quota":`En attente du rétablissement du quota.`,"schedule.admission.blocked":`La boucle est bloquée ; corrigez la cause indiquée.`,"schedule.admission.capacity":`Limite de concurrence atteinte : {running}/{limit} sessions.`,"schedule.panelTitle":`Automatisation`,"schedule.panelDescription":`Réveiller ce workspace plus tard ou exécuter des instructions selon un planning.`,"schedule.activeTitle":`Planifications actives`,"schedule.emptyTitle":`Aucune planification`,"schedule.emptyDescription":`Créez un réveil ponctuel ou une tâche récurrente ci-dessous.`,"schedule.cancelWakeup":`Annuler ce réveil`,"schedule.cancelCron":`Supprimer cette tâche récurrente`,"schedule.createTitle":`Créer une planification`,"schedule.createDescription":`Choisissez quand et comment l'agent doit s'exécuter.`,"schedule.typeWakeup":`Réveil ponctuel`,"schedule.typeRecurring":`Tâche récurrente`,"schedule.wakeupDescription":`Exécuter le prompt une fois après un délai.`,"schedule.cronDescription":`Exécuter le prompt régulièrement selon une fréquence fixe.`,"schedule.promptHint":`Instructions qui seront envoyées à l'agent`,"schedule.frequencyTitle":`Fréquence`,"schedule.advancedDescription":`Utiliser une expression cron brute`,"schedule.cronExpressionLabel":`Expression cron`,"schedule.sessionModeTitle":`Session d'exécution`,"schedule.modeResume":`Reprendre la session`,"schedule.oneShotHint":`Supprimer cette planification après sa première exécution.`,"schedule.wakeupTitle":`Wakeup en attente`,"schedule.cronsTitle":`Tâches récurrentes`,"schedule.noWakeup":`Aucun wakeup programmé`,"schedule.noCrons":`Aucun cron programmé`,"schedule.invalidCron":`Inactive : expression invalide. Supprimez puis recréez cette programmation.`,"schedule.nextFireAt":`prochain à {time}`,"schedule.lastFiredAt":`dernier fire il y a {time}`,"schedule.addCronTitle":`Ajouter une tâche récurrente`,"schedule.addWakeupTitle":`Programmer un réveil`,"schedule.every":`Toutes les`,"schedule.unitMinutes":`minutes`,"schedule.unitHours":`heures`,"schedule.unitDays":`jours`,"schedule.daysDriftWarning":`L'intervalle peut se réduire à 1 jour en fin de mois (limitation du format cron).`,"schedule.advancedExpression":`Expression avancée (optionnel)`,"schedule.advancedHint":`Cron brut (ex. */15 * * * *) ou {'@'}hourly/{'@'}daily — remplace le sélecteur si rempli.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Libellé (optionnel)`,"schedule.delayMinutes":`Délai (minutes)`,"schedule.modeFresh":`Nouvelle session`,"schedule.oneShot":`Une seule fois`,"schedule.addCronBtn":`Ajouter le cron`,"schedule.addWakeupBtn":`Programmer le réveil`,"schedule.cronCreated":`Tâche récurrente ajoutée`,"schedule.wakeupCreated":`Réveil programmé`,"askUserQuestion.title":`L'agent te pose une question`,"askUserQuestion.submit":`Envoyer la réponse`,"askUserQuestion.multiSelectHint":`Sélectionne une ou plusieurs options`,"askUserQuestion.otherOption":`Autre`,"askUserQuestion.otherOptionHint":`précisez dans votre prochain message`,"askUserQuestion.freeFormLabel":`Précisez votre réponse`,"askUserQuestion.freeFormHint":`Cette réponse sera envoyée directement à l'agent.`,"askUserQuestion.noPending":`Aucune question en attente`,"askUserQuestion.next":`Suivant`,"askUserQuestion.previous":`Précédent`,"askUserQuestion.cancel":`Annuler`,"askUserQuestion.cancelTooltip":`Sauter cette question — l'agent continuera sans réponse`,"askUserQuestion.collapse":`Réduire le panneau de question`,"askUserQuestion.expand":`Agrandir le panneau de question`,"permissionRequest.title":`L'agent veut utiliser un outil`,"permissionRequest.allow":`Autoriser`,"permissionRequest.allowOnce":`Autoriser une fois`,"permissionRequest.allowTurn":`Autoriser ce tour`,"permissionRequest.operationUnavailable":`Détails indisponibles ; autorisez une fois ou pour tout l’outil.`,"permissionRequest.allowOperation":`Toujours cette opération`,"permissionRequest.allowTool":`Toujours cet outil`,"permissionRequest.deny":`Refuser`,"permissionRequest.tool":`Outil`,"permissionRequest.input":`Entrée`,"permissionRequest.rawInput":`Détails techniques`,"permissionRequest.collapse":`Réduire le panneau de permission`,"permissionRequest.expand":`Agrandir le panneau de permission`,"permissionRequest.denied":`refusé par l'utilisateur`,"workspaceStatus.created":`créé`,"workspaceStatus.extracting":`extraction`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.compacting":`compaction`,"chatInput.compactingBanner":`Compaction du contexte en cours. L’envoi sera disponible à la fin.`,"workspaceStatus.executing":`en cours`,"workspaceStatus.awaitingUser":`en attente de ta réponse`,"workspaceStatus.completed":`terminé`,"workspaceStatus.idle":`inactif`,"workspaceStatus.error":`erreur`,"workspaceStatus.quota":`quota atteint`,"workspaceStatus.retrying":`reprise automatique`,"workspaceList.prOpen":`#{n} — Pull request ouverte`,"workspaceList.prWatchDisabledIndicator":`Checks PR ignorés pour ce workspace`,"workspaceList.prChangesRequested":`#{n} — Modifications demandées`,"workspaceList.attentionCiFailed":`CI en échec`,"workspaceList.attentionChangesRequested":`Modifications demandées`,"workspaceList.attentionReadyToMerge":`Prêt à merger`,"autoLoop.status.active":`Active`,"autoLoop.status.waiting":`En attente`,"autoLoop.status.blocked":`Bloquée`,"autoLoop.status.completed":`Terminée`,"autoLoop.status.stopped":`Arrêtée`,"autoLoop.phase.grooming":`Préparation`,"autoLoop.phase.execution":`Exécution`,"autoLoop.phase.finalization":`Finalisation`,"autoLoop.iteration":`Itération {count}`,"autoLoop.resume":`Reprendre l’auto-loop`,"autoLoop.retryAt":`Reprise prévue le`,"autoLoop.actionFailed":`L’action n’a pas pu aboutir.`,"autoLoop.messages.count":`{count} instruction(s) en attente`,"autoLoop.messages.pending":`En attente`,"autoLoop.messages.dispatching":`Envoi en cours`,"autoLoop.messages.unknown":`Livraison incertaine`,"autoLoop.messages.delivered":`Livrée`,"autoLoop.messages.cancel":`Annuler l’instruction`,"autoLoop.messages.acknowledge":`Considérer comme reçue`,"autoLoop.messages.retry":`Renvoyer`,"autoLoop.messages.unknownHelp":`La livraison n’a pas pu être confirmée. Vérifiez la conversation avant de choisir. Renvoyer peut dupliquer une instruction déjà reçue.`,"autoLoop.reason.quota":`En attente du quota du fournisseur.`,"autoLoop.reason.transient":`Reprise après une interruption temporaire.`,"autoLoop.reason.awaiting-user":`En attente de votre réponse.`,"autoLoop.reason.capacity-or-lifecycle":`En attente d’une place disponible pour un agent.`,"autoLoop.reason.message-delivery-unknown":`Résolvez l’instruction à livraison incertaine avant de reprendre.`,"autoLoop.reason.error":`La boucle nécessite une intervention avant de continuer.`,"autoLoop.reason.stall":`Aucun progrès détecté. Consultez la dernière session avant de reprendre.`,"autoLoop.reason.awaiting-clarification":`Une précision est nécessaire avant de continuer.`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Démarrer l'auto-loop`,"autoLoop.prepare":`Préparer pour auto-loop`,"autoLoop.reprepare":`Re-préparer pour auto-loop`,"autoLoop.reprepareTooltip":`Relancer la phase de grooming pour ajouter ou rafraîchir les tâches avant de relancer la boucle`,"autoLoop.prepareBusy":`Attendre la fin de l'agent avant de préparer`,"autoLoop.forceReady":`Je sais ce que je fais — passer le grooming`,"autoLoop.forceReadyConfirm":`Passer le grooming et marquer auto-loop prêt ? La boucle peut stagner si les tâches ne sont pas atomiques.`,"autoLoop.stop":`Arrêter l'auto-loop`,"autoLoop.notReady":`Lancer d'abord « Préparer pour auto-loop »`,"autoLoop.noTasks":`Ajouter d'abord des tâches`,"autoLoop.progress":`Auto-loop · {done}/{total} tâches`,"autoLoop.preparing":`Auto-loop · préparation`,"autoLoop.preparingTooltip":`Grooming en cours — l'agent crée / révise les tâches. La boucle démarrera quand il appellera mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en cours`,"autoLoop.startInMode":`Démarrer en mode auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm :`,"autoLoop.brainstormModelTooltip":`Modèle utilisé uniquement pour la session de brainstorming initiale — chaque tâche ensuite utilise le modèle choisi au-dessus`,"autoLoop.brainstormReasoningPrefix":`Brainstorm :`,"autoLoop.brainstormReasoningTooltip":`Niveau de raisonnement utilisé uniquement pour la session de brainstorming initiale`,"autoLoop.executionModelPrefix":`Loop :`,"autoLoop.executionModelTooltip":`Modèle utilisé pour chaque tâche de l'auto-loop après la session de brainstorming initiale`,"autoLoop.sessionMode.perTask":`Nouvelle session par tâche`,"autoLoop.sessionMode.label":`Session :`,"autoLoop.sessionMode.perTaskTooltip":`Chaque tâche démarre une session Claude Code neuve, sans mémoire des tâches précédentes`,"autoLoop.sessionMode.continuous":`Session continue`,"autoLoop.sessionMode.continuousTooltip":`Toutes les tâches s'enchaînent dans la même session — l'agent garde tout le contexte, mais la session s'allonge au fil du temps`,"koboCommand.prepAutoloopDesc":`Préparer les tâches pour le mode auto-loop (atomicité)`,"staleSessionBanner.title":`Auto-loop en cours`,"staleSessionBanner.message":`Vous consultez une ancienne session — l'agent travaille actuellement dans la dernière.`,"staleSessionBanner.staleTitle":`Session précédente`,"staleSessionBanner.staleMessage":`Vous consultez une ancienne session — les messages envoyés iront dans cette session, pas la dernière.`,"staleSessionBanner.switchToCurrent":`Basculer sur la session active`,"network.login.title":`Accès réseau`,"network.login.description":`Ce Kōbō nécessite un token pour être piloté depuis le réseau. Colle le token affiché dans les Réglages sur la machine hôte.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Colle ton token`,"network.login.connect":`Se connecter`,"network.login.invalid":`Token invalide`,"network.login.serverError":`Erreur serveur — réessaie.`,"network.login.unreachable":`Kōbō est injoignable — vérifie ta connexion.`,"layout.toggleWorkspaces":`Afficher/masquer les espaces de travail`,"layout.togglePanel":`Afficher/masquer le panneau latéral`,"unsaved.title":`Quitter sans enregistrer ?`,"unsaved.message":`Vous avez des modifications non enregistrées. Quitter cette page les abandonne.`,"unsaved.leave":`Quitter`,"unsaved.stay":`Rester`,"prCheckout.staleRetriesExhausted":`L'état du dépôt a continué de changer pendant l'application de vos choix. Fermez cette fenêtre et réessayez depuis le sélecteur de pull request.`,"prPicker.title":`Importer depuis une pull request`,"prPicker.filterAll":`Toutes`,"prPicker.filterMine":`Les miennes`,"prPicker.filterReviewRequested":`Revue demandée`,"prPicker.searchPlaceholder":`Rechercher des pull requests…`,"prPicker.loadMore":`Charger plus`,"prPicker.empty":`Aucune pull request ouverte ne correspond.`,"prPicker.forkNotSupported":`Cette PR provient d'un fork ; Kōbō ne peut pas la checkout.`,"prPicker.loadFailed":`Échec du chargement des pull requests.`,"prPicker.badge.workspaceExists":`Déjà ouverte dans Kōbō`,"prPicker.badge.worktreePresent":`Worktree présente`,"prPicker.badge.localBranch":`Branche locale`,"prPicker.badge.new":`Nouvelle`,"prPicker.badge.draft":`Brouillon`,"prCheckout.title":`Préparer la worktree`,"prCheckout.apply":`Appliquer`,"prCheckout.cancel":`Annuler`,"prCheckout.retry":`Réessayer`,"prCheckout.diagnoseFailed":`Échec du diagnostic de la pull request.`,"prCheckout.resolveFailed":`Échec de la résolution du checkout de la pull request.`,"prCheckout.path.required":`Saisir un chemin de worktree qui n'existe pas encore.`,"prCheckout.workspace.restoreNotAvailable":"La restauration d'un workspace purgé n'est pas encore possible depuis cet écran. Recréez son dossier de worktree sur le disque (par ex. `git worktree add`) : Kōbō le rattachera automatiquement sous 30 secondes environ.","prCheckout.staleReloaded":`Le dépôt a changé ; le diagnostic a été rafraîchi.`,"prCheckout.step.blocked":`Impossible de continuer`,"prCheckout.step.path":`Emplacement de la worktree`,"prCheckout.step.workspace":`Workspace existant`,"prCheckout.step.worktree":`Worktree existante`,"prCheckout.step.operation":`Opération git en cours`,"prCheckout.step.changes":`Modifications non commitées`,"prCheckout.step.divergence":`Branche locale vs origin`,"prCheckout.workspace.activeHint":`Un workspace nommé « {name} » suit déjà cette branche.`,"prCheckout.workspace.open":`Ouvrir ce workspace`,"prCheckout.workspace.continue":`Continuer sur un autre chemin`,"prCheckout.workspace.unarchive":`Désarchiver et l'ouvrir`,"prCheckout.workspace.restore":`Recréer sa worktree`,"prCheckout.worktree.orphanHint":`Une worktree existe déjà sur cette branche à {path}.`,"prCheckout.worktree.attach":`L'attacher`,"prCheckout.worktree.branchInUse":`Cette branche est déjà extraite. Rattachez son worktree existant.`,"prCheckout.worktree.createElsewhere":`En créer une autre ailleurs`,"prCheckout.operation.hint":`Un {operation} est en cours dans cette worktree.`,"prCheckout.operation.abort":`Abandonner`,"prCheckout.operation.cancel":`Ne pas y toucher et s'arrêter ici`,"prCheckout.changes.hint":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s).`,"prCheckout.changes.stash":`Les stash`,"prCheckout.changes.commit":`Les commit`,"prCheckout.changes.discard":`Les abandonner (conservées dans un stash étiqueté)`,"prCheckout.changes.keepResetConflict":`Conserver les modifications est incompatible avec un reset. Faites un stash ou un commit, ou conservez la branche.`,"prCheckout.changes.keep":`Les laisser telles quelles`,"prCheckout.divergence.behindHint":`Votre branche a {behind} commit(s) de retard sur origin.`,"prCheckout.divergence.aheadHint":`Votre branche a {ahead} commit(s) non pushé(s).`,"prCheckout.divergence.divergedHint":`{ahead} en avance, {behind} en retard sur origin.`,"prCheckout.divergence.notFastForward":`Le fast-forward est impossible : la branche contient des commits locaux.`,"prCheckout.divergence.fastForward":`Fast-forward vers origin`,"prCheckout.divergence.rebase":`Rebase sur origin`,"prCheckout.divergence.resetHard":`Réinitialiser sur origin (une branche de sauvegarde est créée d'abord)`,"prCheckout.divergence.keep":`Conserver l'état local`,"prCheckout.blocked.forgeUnavailable":`Le CLI de la forge est absent ou non authentifié.`,"prCheckout.blocked.forkPr":`Cette PR provient d'un fork ; Kōbō ne peut pas la checkout.`,"prCheckout.blocked.headBranchDeleted":`La branche n'existe plus sur le remote.`,"prCheckout.blocked.indexLock":`Un autre processus git est en cours (index.lock est présent).`,"prCheckout.blocked.pathOccupied":`{path} existe déjà et n'est pas une worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} est une worktree sur une autre branche ({branch}).`,"prCheckout.blocked.noCommonAncestor":`Une branche locale nommée {branch} existe avec un historique sans rapport.`,"split.title":`Vue double workspace`,"split.open":`Ouvrir côte à côte`,"split.openBeside":`Ouvrir à côté`,"split.close":`Fermer la vue double`,"split.left":`Workspace de gauche`,"split.right":`Workspace de droite`,"split.choose":`Choisir un workspace`,"split.recipient":`Envoyer à : {name}`,"absence.title":`Depuis ta dernière visite`,"settings.activityDigestHint":`Affiche le récapitulatif des événements survenus pendant ton absence. Désactiver masque cette entrée et arrête la collecte des nouveaux événements, sans effacer l’historique existant.`,"absence.pending":`Changements à consulter`,"absence.retention":`Activité importante des 30 derniers jours, enregistrée depuis l’installation de cette fonctionnalité. Le suivi des visites est propre à ce navigateur.`,"absence.since":`Depuis le {date}`,"absence.error":`Impossible de charger l’activité.`,"absence.retry":`Réessayer`,"absence.empty":`Aucune nouvelle activité.`,"absence.more":`Charger la suite`,"absence.markRead":`Marquer les événements affichés comme lus`,"absence.kind.question":`Question posée`,"absence.kind.permission":`Autorisation demandée`,"absence.kind.completed":`Session terminée`,"absence.kind.error":`Erreur de l’agent`,"absence.kind.pr-merged":`PR mergée`,"absence.kind.pr-approved":`PR approuvée`,"absence.kind.pr-changes-requested":`Modifications demandées`,"absence.kind.pr-ci-failed":`CI en échec`,"absence.kind.pr-ci-recovered":`CI rétablie`,"absence.kind.pr-merge-conflict":`Conflit de merge`,"absence.kind.pr-ready-to-merge":`PR prête à merger`,"absence.kind.archived":`Workspace archivé`,"absence.kind.purged":`Worktree purgé`,"absence.kind.restored":`Worktree restauré`,"tours.split.controls.title":`Deux workspaces indépendants`,"tours.split.controls.description":`Choisis un workspace par panneau. Redimensionne la séparation ; chaque conversation garde son destinataire et ses panneaux.`,"tours.home.sort.title":`Trier les workspaces`,"tours.home.sort.description":`Choisis l’ordre et le sens dans chaque groupe. Ton choix est mémorisé.`,"tours.home.activity.title":`Consulter l’activité après une absence`,"tours.home.activity.description":`En bas du drawer gauche, retrouve les questions, fins de session, erreurs et changements de PR survenus pendant ton absence.`};export{e as default};
17
+ sudo setfacl -Rd -m u:$(whoami):rwX . && sudo setfacl -R -m u:$(whoami):rwX .`,"settings.purgeDocsPermissionsRecoverChownIntro":`Option B — Reprendre la propriété (plus simple, perd l'info "créé par root dans le conteneur" mais osef en pratique) :`,"settings.purgeDocsPermissionsRecoverChownCommand":` sudo chown -R $(whoami):$(whoami) .`,"settings.purgeDocsPermissionsRecoverFootnote":"Astuce : tu peux exécuter ces commandes directement sur la racine de tes worktrees (ex. `~/.worktrees/`) pour couvrir tous les workspaces existants ET futurs d'un seul coup. Une fois fait, la purge Kōbō fonctionnera sans erreur de permission.","contextMenu.runSetup":`Lancer le script de setup`,"contextMenu.exportEvents":`Exporter les events (CSV)`,"contextMenu.dismissChangesRequested":`Marquer « Modifications demandées » comme vu`,"contextMenu.dismissCiFailure":`Marquer « CI en échec » comme vu`,"contextMenu.restoreChangesRequested":`Marquer « Modifications demandées » comme non vu`,"contextMenu.restoreCiFailure":`Marquer « CI en échec » comme non vu`,"contextMenu.exportingEvents":`Préparation de l'export…`,"contextMenu.exportEventsError":`Échec de l'export des events`,"contextMenu.openNotion":`Ouvrir dans Notion`,"contextMenu.openSentry":`Ouvrir dans Sentry`,"contextMenu.openPr":`Ouvrir la PR`,"contextMenu.ignorePrWatch":`Ignorer les checks PR`,"contextMenu.resumePrWatch":`Réactiver les checks PR`,"contextMenu.prWatchToggleFailed":`Échec de la mise à jour des checks PR`,"workspace.favorite":`Ajouter aux favoris`,"workspace.unfavorite":`Retirer des favoris`,"workspace.showFavoritesOnly":`Afficher uniquement les favoris`,"workspace.tagFilter":`Filtrer par tags`,"workspace.tagFilterActive":`Filtrer par tags ({count} sélectionné(s))`,"workspace.tagFilterClear":`Effacer`,"workspace.tagFilterEmpty":`Aucun tag pour l'instant. Définissez-les dans les réglages, puis attribuez-les depuis le menu d'un workspace.`,"workspace.searchArchivedToggle":`Inclure les workspaces archivés dans la recherche`,"workspace.descriptionPlaceholder":`Ajouter une courte description`,"workspace.descriptionDialogHint":`Texte brut, 200 caractères maximum. Laisser vide pour effacer.`,"workspace.descriptionTooLong":`La description doit faire 200 caractères ou moins.`,"workspace.descriptionSaveFailed":`Échec de l'enregistrement de la description.`,"workspace.agentDescriptionTooltip":`État en direct maintenu par l'agent`,"mcp.tool.setWorkspaceDescription":`Définit la courte description du workspace (≤ 200 caractères).`,"tags.manage":`Gérer les tags`,"tags.manageTitle":`Gérer les tags du workspace`,"tags.noTagsDefined":`Aucun tag défini. Ajoutes-en dans Paramètres > Global > Tags.`,"tags.orphanedHint":`{count} tag(s) ne sont plus dans le catalogue global. Décoche-les pour les retirer.`,"settings.tagsTitle":`Tags des workspaces`,"settings.tagsHint":`Définis les tags assignables aux workspaces. Tape pour ajouter, clique la croix pour retirer.`,"settings.tagsLabel":`Tags disponibles`,"settings.branchPrefixesTitle":`Préfixes de branche`,"settings.branchPrefixesHint":`Gérez les préfixes de branche Git disponibles sur la page de création. Le premier est présélectionné par défaut.`,"settings.branchPrefixesEmpty":`Aucun préfixe de branche défini. Ajoutez-en au moins un ci-dessous.`,"settings.branchPrefixesAddLabel":`Nouveau préfixe`,"settings.branchPrefixesEditHint":`Cliquer pour renommer`,"settings.branchPrefixesMoveUp":`Monter`,"settings.branchPrefixesMoveDown":`Descendre`,"settings.worktreesTitle":`Worktrees Git`,"settings.worktreesHint":`Choisis où créer les worktrees des nouveaux workspaces. Les chemins relatifs sont résolus depuis le projet ; les chemins absolus Linux/macOS et Windows, $HOME, ~ et %USERPROFILE% sont supportés.`,"settings.worktreesPathLabel":`Chemin des worktrees`,"settings.worktreesPathRequired":`Le chemin des worktrees est requis.`,"settings.worktreesPrefixByProject":`Préfixer les worktrees par le nom du projet`,"settings.worktreesPrefixByProjectHint":`Place chaque worktree dans un sous-dossier nommé d'après le projet, pour éviter les collisions quand plusieurs projets partagent la même racine.`,"settings.shareTitle":`Partager la configuration`,"settings.shareHint":`Exporte tes paramètres, templates et tags en bundle JSON. Les clés MCP sont retirées à l’export pour la sécurité.`,"settings.exportConfig":`Exporter`,"settings.importConfig":`Importer`,"settings.exportSuccess":`Configuration exportée`,"settings.importSuccess":`Configuration importée`,"settings.importConfirmTitle":`Importer la configuration`,"settings.importConfirmMessage":`Cela remplacera tes paramètres, templates et tags actuels. Tes clés MCP seront conservées. Continuer ?`,"settings.mcp.title":`Connexions des LLM externes (MCP)`,"settings.mcp.hint":`Connectez un client MCP pour créer, archiver, purger, supprimer ou restaurer des workspaces, reprendre une PR et dialoguer avec vos agents.`,"settings.mcp.remoteDisabled":`Les connexions distantes nécessitent l’accès réseau et un redémarrage du serveur après son activation.`,"settings.mcp.clientName":`Nom du client (facultatif)`,"settings.mcp.connection":`Connexion`,"settings.mcp.local":`HTTP local`,"settings.mcp.remote":`HTTP distant`,"settings.mcp.proxy":`Proxy inverse`,"settings.mcp.stdio":`Stdio local`,"settings.mcp.copyUrl":`Copier l’URL`,"settings.mcp.copyConfig":`Copier la configuration`,"settings.mcp.copyWithToken":`Copier avec le jeton`,"settings.mcp.genericFormat":`Ces exemples utilisent le format générique mcpServers. Adaptez le conteneur à votre client MCP. Les aperçus affichent un emplacement réservé au jeton.`,"settings.mcp.tokenUnavailable":`Aucun jeton disponible. Activez l’accès réseau avant de copier une configuration authentifiée.`,"settings.mcp.stdioUnavailable":`Le point d’entrée stdio est indisponible dans cette installation. Utilisez HTTP ou compilez Kōbō.`,"settings.mcp.copyFailed":`Impossible de copier dans le presse-papiers.`,"tours.settings.mcp.title":`Connecter un LLM externe`,"tours.settings.mcp.description":`Copiez une configuration HTTP ou stdio pour connecter un assistant externe. Il peut créer un workspace avec les options du formulaire, reprendre une PR, gérer son archivage, sa suppression ou sa restauration et communiquer avec vos agents.`,"settings.network.title":`Accès réseau`,"settings.network.hint":`Pilote Kōbō depuis un autre appareil de ton LAN de confiance. Off = localhost uniquement. On = accessible sur ton réseau, protégé par un token. Redémarre Kōbō après bascule.`,"settings.network.enable":`Activer l'accès réseau`,"settings.network.behindProxy":`Derrière un reverse proxy`,"settings.network.behindProxyHint":`Kōbō ne peut plus distinguer ta propre machine d'une requête relayée — même le localhost devra présenter le token désormais. N'active ceci que si un reverse proxy (Traefik, nginx, Caddy…) est devant Kōbō.`,"settings.network.restartRequired":`Redémarre Kōbō pour appliquer la nouvelle adresse de bind.`,"settings.network.token":`Token d'accès`,"settings.network.copy":`Copier`,"settings.network.copied":`Copié`,"settings.network.regenerate":`Régénérer`,"settings.network.regenerateConfirm":`Régénérer le token ? Les appareils connectés devront utiliser le nouveau token.`,"settings.network.urls":`URLs LAN`,"settings.network.scan":`Scanner pour se connecter`,"settings.network.noUrls":`Aucune adresse LAN détectée.`,"settings.network.loadFailed":`Échec du chargement des réglages d'accès réseau.`,"settings.network.updateFailed":`Échec de la mise à jour des réglages d'accès réseau.`,"settings.unsavedChanges.title":`Modifications non enregistrées`,"settings.unsavedChanges.message":`Ce projet a des modifications non enregistrées. Changer de projet les annulera.`,"settings.unsavedChanges.discard":`Ignorer et changer`,"settings.unsavedChanges.cancel":`Annuler`,"settings.loadFailed":`Les réglages n’ont pas pu être chargés`,"settings.loadFailedHint":`L’enregistrement est désactivé : le formulaire affiche les valeurs par défaut, et les écrire remplacerait votre configuration réelle.`,"health.title":`Santé`,"health.tooltip":`Santé du système`,"changelog.title":`Journal des changements`,"changelog.tooltip":`Quoi de neuf dans Kōbō`,"changelog.empty":`Aucun changelog disponible.`,"changelog.current":`actuelle`,"changelog.currentVersion":`Version actuelle : v{version}`,"health.envTitle":`Environnement`,"health.version":`Version`,"health.koboHome":`Kōbō home`,"health.dbTitle":`Base de données`,"health.dbPath":`Chemin`,"health.dbSize":`Taille`,"health.schemaVersion":`Version du schéma`,"health.settingsSchemaVersion":`Schéma settings`,"health.runtimesTitle":`Moteurs d'agent`,"health.claudeCliTitle":`Claude Code`,"health.claudeCliMissing":`claude introuvable dans le PATH`,"health.codexCliTitle":`OpenAI Codex`,"health.codexCliMissing":`binaire codex introuvable`,"health.forgeCliTitle":`CLI de forge (gh / glab)`,"health.forgeCliMissing":`Ni gh ni glab trouvés — pull requests et surveillance de CI indisponibles`,"health.workspacesTitle":`Workspaces`,"health.workspacesCount":`{total} au total, {archived} archivés`,"health.worktreesMissing":`{count} worktree(s) manquant(s) sur le disque`,"health.sessionsTitle":`Sessions agent`,"health.sessionsOrphaned":`{n} session(s) orpheline(s) marquées running`,"health.integrationsTitle":`Intégrations`,"health.integrationConfigured":`configurée`,"health.integrationMissing":`non configurée`,"health.integrationDisabled":`désactivée`,"settings.integrationEnabled":`Activer l’intégration`,"health.activeTitle":`État actif`,"health.activeQuotaBackoffs":`Quota backoffs en attente`,"health.activeWakeups":`Wakeups programmés`,"health.activeAutoLoop":`Auto-loop en cours`,"health.activeAgentSessions":`Sessions agent en cours`,"health.activeDevServers":`Serveurs de dev lancés`,"health.noneActive":`Aucun.`,"health.quotaResumeAt":`reprise à {time}`,"health.wakeupAt":`réveil à {time}`,"health.startedAgo":`démarré il y a {time}`,"health.autoLoopReady":`prêt, itération en cours`,"health.autoLoopGrooming":`grooming en cours`,"session.started":`Session démarrée`,"session.ended":`Session terminée`,"session.compacted":`Contexte compacté`,"session.endedCompleted":`Tour terminé — envoyez un message pour continuer`,"session.endedKilled":`Session arrêtée`,"session.endedError":`Session terminée sur une erreur`,"session.endedWatchdog":`Session fermée de force après une période d'inactivité`,"tool.running":`En cours...`,"activity.raw_lines":`Lignes de sortie brutes ({n})`,"api.timeout":`La requête a dépassé le délai de {seconds} secondes.`,"api.mutationTimeout":`La requête a dépassé le délai de {seconds} secondes. L’opération peut encore être en cours. Actualisez son état avant de réessayer.`,"activity.sessionsError":`Impossible de charger les sessions : {message}`,"activity.historyError":`Impossible de charger l’historique : {message}`,"activity.loading_older":`Chargement des messages plus anciens…`,"activity.compacting":`Compaction du contexte…`,"activity.prev_user_message":`Message utilisateur précédent`,"activity.scroll_to_bottom":`Défiler vers le bas`,"activity.empty":`Rien pour l’instant`,"activity.emptyHint":`La sortie de l’agent s’affichera ici dès qu’une session démarrera.`,"activity.a11y.region":`Annonces d’activité de l’agent`,"activity.a11y.agentSaid":`Agent : {text}`,"activity.a11y.toolStarted":`Outil {name} démarré`,"activity.a11y.toolFinished":`Outil {name} terminé`,"activity.a11y.toolFailed":`Outil {name} en échec`,"chat.systemPrompt":`Instructions Kōbō`,"chat.agent":`Agent`,"chat.cleanupScript":`Script de cleanup`,"chat.archiveScript":`Script d'archivage`,"chat.setupScript":`Script de setup`,"chat.hookScript":`Hook {event}`,"chat.scriptDone":`Fait`,"chat.scriptComplete":`[{phase}] Terminé`,"chat.scriptError":`[{phase}] Erreur : {message}`,"chat.unknownError":`inconnue`,"chat.you":`Vous`,"chat.session":`Session`,"chat.nActions":`{n} action | {n} actions`,"chat.lastUpdatedAt":`Dernière mise à jour à {time}`,"chat.scrollToTurnTop":`Défiler vers le haut du message`,"migration.backing_up":`Sauvegarde de la base de données…`,"migration.running":`Migration des données d'agent — {processed}/{total}`,"migration.error":`Échec de la migration`,"migration.backup_location":`Une sauvegarde a été enregistrée à {path}. Redémarre Kōbō pour réessayer.`,"migration.retry":`Redémarre Kōbō pour réessayer.`,"engine.select":`Moteur`,"engine.model":`Modèle`,"engine.effort":`Effort de réflexion`,"wakeup.scheduledIn":`Prochain réveil dans {n}s`,"wakeup.scheduledAt":`Prochain réveil à {time}`,"wakeup.firing":`Réveil en cours…`,"wakeup.reason":`Raison : {reason}`,"wakeup.cancel":`Annuler ce réveil`,"wakeup.pendingIndicator":`Réveil programmé`,"cron.pendingIndicator":`{n} cron(s) programmé(s)`,"schedule.tabLabel":`Programmation`,"schedule.admissionTitle":`Nouvelle session automatique indisponible pour le moment.`,"schedule.admissionHint":`Les échéances restent inchangées. Un message vers une conversation existante suit ses propres règles.`,"schedule.admission.not-found":`Espace introuvable.`,"schedule.admission.archived":`Espace archivé.`,"schedule.admission.purged":`Restaurez le worktree.`,"schedule.admission.shutdown":`Le serveur est en cours d’arrêt.`,"schedule.admission.lifecycle":`Une opération sur cet espace est en cours.`,"schedule.admission.active-session":`La session actuelle n’est pas encore fermée.`,"schedule.admission.awaiting-user":`Une réponse utilisateur est attendue.`,"schedule.admission.compacting":`Le contexte est en cours de compactage.`,"schedule.admission.quota":`En attente du rétablissement du quota.`,"schedule.admission.blocked":`La boucle est bloquée ; corrigez la cause indiquée.`,"schedule.admission.capacity":`Limite de concurrence atteinte : {running}/{limit} sessions.`,"schedule.panelTitle":`Automatisation`,"schedule.panelDescription":`Réveiller ce workspace plus tard ou exécuter des instructions selon un planning.`,"schedule.activeTitle":`Planifications actives`,"schedule.emptyTitle":`Aucune planification`,"schedule.emptyDescription":`Créez un réveil ponctuel ou une tâche récurrente ci-dessous.`,"schedule.cancelWakeup":`Annuler ce réveil`,"schedule.cancelCron":`Supprimer cette tâche récurrente`,"schedule.createTitle":`Créer une planification`,"schedule.createDescription":`Choisissez quand et comment l'agent doit s'exécuter.`,"schedule.typeWakeup":`Réveil ponctuel`,"schedule.typeRecurring":`Tâche récurrente`,"schedule.wakeupDescription":`Exécuter le prompt une fois après un délai.`,"schedule.cronDescription":`Exécuter le prompt régulièrement selon une fréquence fixe.`,"schedule.promptHint":`Instructions qui seront envoyées à l'agent`,"schedule.frequencyTitle":`Fréquence`,"schedule.advancedDescription":`Utiliser une expression cron brute`,"schedule.cronExpressionLabel":`Expression cron`,"schedule.sessionModeTitle":`Session d'exécution`,"schedule.modeResume":`Reprendre la session`,"schedule.oneShotHint":`Supprimer cette planification après sa première exécution.`,"schedule.wakeupTitle":`Wakeup en attente`,"schedule.cronsTitle":`Tâches récurrentes`,"schedule.noWakeup":`Aucun wakeup programmé`,"schedule.noCrons":`Aucun cron programmé`,"schedule.invalidCron":`Inactive : expression invalide. Supprimez puis recréez cette programmation.`,"schedule.nextFireAt":`prochain à {time}`,"schedule.lastFiredAt":`dernier fire il y a {time}`,"schedule.addCronTitle":`Ajouter une tâche récurrente`,"schedule.addWakeupTitle":`Programmer un réveil`,"schedule.every":`Toutes les`,"schedule.unitMinutes":`minutes`,"schedule.unitHours":`heures`,"schedule.unitDays":`jours`,"schedule.daysDriftWarning":`L'intervalle peut se réduire à 1 jour en fin de mois (limitation du format cron).`,"schedule.advancedExpression":`Expression avancée (optionnel)`,"schedule.advancedHint":`Cron brut (ex. */15 * * * *) ou {'@'}hourly/{'@'}daily — remplace le sélecteur si rempli.`,"schedule.promptLabel":`Prompt`,"schedule.labelOptional":`Libellé (optionnel)`,"schedule.delayMinutes":`Délai (minutes)`,"schedule.modeFresh":`Nouvelle session`,"schedule.oneShot":`Une seule fois`,"schedule.addCronBtn":`Ajouter le cron`,"schedule.addWakeupBtn":`Programmer le réveil`,"schedule.cronCreated":`Tâche récurrente ajoutée`,"schedule.wakeupCreated":`Réveil programmé`,"askUserQuestion.title":`L'agent te pose une question`,"askUserQuestion.submit":`Envoyer la réponse`,"askUserQuestion.multiSelectHint":`Sélectionne une ou plusieurs options`,"askUserQuestion.otherOption":`Autre`,"askUserQuestion.otherOptionHint":`précisez dans votre prochain message`,"askUserQuestion.freeFormLabel":`Précisez votre réponse`,"askUserQuestion.freeFormHint":`Cette réponse sera envoyée directement à l'agent.`,"askUserQuestion.noPending":`Aucune question en attente`,"askUserQuestion.next":`Suivant`,"askUserQuestion.previous":`Précédent`,"askUserQuestion.cancel":`Annuler`,"askUserQuestion.cancelTooltip":`Sauter cette question — l'agent continuera sans réponse`,"askUserQuestion.collapse":`Réduire le panneau de question`,"askUserQuestion.expand":`Agrandir le panneau de question`,"permissionRequest.title":`L'agent veut utiliser un outil`,"permissionRequest.allow":`Autoriser`,"permissionRequest.allowOnce":`Autoriser une fois`,"permissionRequest.allowTurn":`Autoriser ce tour`,"permissionRequest.operationUnavailable":`Détails indisponibles ; autorisez une fois ou pour tout l’outil.`,"permissionRequest.allowOperation":`Toujours cette opération`,"permissionRequest.allowTool":`Toujours cet outil`,"permissionRequest.deny":`Refuser`,"permissionRequest.tool":`Outil`,"permissionRequest.input":`Entrée`,"permissionRequest.rawInput":`Détails techniques`,"permissionRequest.collapse":`Réduire le panneau de permission`,"permissionRequest.expand":`Agrandir le panneau de permission`,"permissionRequest.denied":`refusé par l'utilisateur`,"workspaceStatus.created":`créé`,"workspaceStatus.extracting":`extraction`,"workspaceStatus.brainstorming":`brainstorming`,"workspaceStatus.compacting":`compaction`,"chatInput.compactingBanner":`Compaction du contexte en cours. L’envoi sera disponible à la fin.`,"workspaceStatus.executing":`en cours`,"workspaceStatus.awaitingUser":`en attente de ta réponse`,"workspaceStatus.completed":`terminé`,"workspaceStatus.idle":`inactif`,"workspaceStatus.error":`erreur`,"workspaceStatus.quota":`quota atteint`,"workspaceStatus.retrying":`reprise automatique`,"workspaceList.prOpen":`#{n} — Pull request ouverte`,"workspaceList.prWatchDisabledIndicator":`Checks PR ignorés pour ce workspace`,"workspaceList.prChangesRequested":`#{n} — Modifications demandées`,"workspaceList.attentionCiFailed":`CI en échec`,"workspaceList.attentionChangesRequested":`Modifications demandées`,"workspaceList.attentionReadyToMerge":`Prêt à merger`,"autoLoop.status.active":`Active`,"autoLoop.status.waiting":`En attente`,"autoLoop.status.blocked":`Bloquée`,"autoLoop.status.completed":`Terminée`,"autoLoop.status.stopped":`Arrêtée`,"autoLoop.phase.grooming":`Préparation`,"autoLoop.phase.execution":`Exécution`,"autoLoop.phase.finalization":`Finalisation`,"autoLoop.iteration":`Itération {count}`,"autoLoop.resume":`Reprendre l’auto-loop`,"autoLoop.retryAt":`Reprise prévue le`,"autoLoop.actionFailed":`L’action n’a pas pu aboutir.`,"autoLoop.messages.count":`{count} instruction(s) en attente`,"autoLoop.messages.pending":`En attente`,"autoLoop.messages.dispatching":`Envoi en cours`,"autoLoop.messages.unknown":`Livraison incertaine`,"autoLoop.messages.delivered":`Livrée`,"autoLoop.messages.cancel":`Annuler l’instruction`,"autoLoop.messages.acknowledge":`Considérer comme reçue`,"autoLoop.messages.retry":`Renvoyer`,"autoLoop.messages.unknownHelp":`La livraison n’a pas pu être confirmée. Vérifiez la conversation avant de choisir. Renvoyer peut dupliquer une instruction déjà reçue.`,"autoLoop.reason.quota":`En attente du quota du fournisseur.`,"autoLoop.reason.transient":`Reprise après une interruption temporaire.`,"autoLoop.reason.awaiting-user":`En attente de votre réponse.`,"autoLoop.reason.capacity-or-lifecycle":`En attente d’une place disponible pour un agent.`,"autoLoop.reason.message-delivery-unknown":`Résolvez l’instruction à livraison incertaine avant de reprendre.`,"autoLoop.reason.error":`La boucle nécessite une intervention avant de continuer.`,"autoLoop.reason.stall":`Aucun progrès détecté. Consultez la dernière session avant de reprendre.`,"autoLoop.reason.awaiting-clarification":`Une précision est nécessaire avant de continuer.`,"autoLoop.toggle":`Auto-loop`,"autoLoop.start":`Démarrer l'auto-loop`,"autoLoop.prepare":`Préparer pour auto-loop`,"autoLoop.reprepare":`Re-préparer pour auto-loop`,"autoLoop.reprepareTooltip":`Relancer la phase de grooming pour ajouter ou rafraîchir les tâches avant de relancer la boucle`,"autoLoop.prepareBusy":`Attendre la fin de l'agent avant de préparer`,"autoLoop.forceReady":`Je sais ce que je fais — passer le grooming`,"autoLoop.forceReadyConfirm":`Passer le grooming et marquer auto-loop prêt ? La boucle peut stagner si les tâches ne sont pas atomiques.`,"autoLoop.stop":`Arrêter l'auto-loop`,"autoLoop.notReady":`Lancer d'abord « Préparer pour auto-loop »`,"autoLoop.noTasks":`Ajouter d'abord des tâches`,"autoLoop.progress":`Auto-loop · {done}/{total} tâches`,"autoLoop.preparing":`Auto-loop · préparation`,"autoLoop.preparingTooltip":`Grooming en cours — l'agent crée / révise les tâches. La boucle démarrera quand il appellera mark_auto_loop_ready.`,"autoLoop.running":`Auto-loop en cours`,"autoLoop.startInMode":`Démarrer en mode auto-loop`,"autoLoop.brainstormModelPrefix":`Brainstorm :`,"autoLoop.brainstormModelTooltip":`Modèle utilisé uniquement pour la session de brainstorming initiale — chaque tâche ensuite utilise le modèle choisi au-dessus`,"autoLoop.brainstormReasoningPrefix":`Brainstorm :`,"autoLoop.brainstormReasoningTooltip":`Niveau de raisonnement utilisé uniquement pour la session de brainstorming initiale`,"autoLoop.executionModelPrefix":`Loop :`,"autoLoop.executionModelTooltip":`Modèle utilisé pour chaque tâche de l'auto-loop après la session de brainstorming initiale`,"autoLoop.sessionMode.perTask":`Nouvelle session par tâche`,"autoLoop.sessionMode.label":`Session :`,"autoLoop.sessionMode.perTaskTooltip":`Chaque tâche démarre une session Claude Code neuve, sans mémoire des tâches précédentes`,"autoLoop.sessionMode.continuous":`Session continue`,"autoLoop.sessionMode.continuousTooltip":`Toutes les tâches s'enchaînent dans la même session — l'agent garde tout le contexte, mais la session s'allonge au fil du temps`,"koboCommand.prepAutoloopDesc":`Préparer les tâches pour le mode auto-loop (atomicité)`,"staleSessionBanner.title":`Auto-loop en cours`,"staleSessionBanner.message":`Vous consultez une ancienne session — l'agent travaille actuellement dans la dernière.`,"staleSessionBanner.staleTitle":`Session précédente`,"staleSessionBanner.staleMessage":`Vous consultez une ancienne session — les messages envoyés iront dans cette session, pas la dernière.`,"staleSessionBanner.switchToCurrent":`Basculer sur la session active`,"network.login.title":`Accès réseau`,"network.login.description":`Ce Kōbō nécessite un token pour être piloté depuis le réseau. Colle le token affiché dans les Réglages sur la machine hôte.`,"network.login.tokenLabel":`Token`,"network.login.tokenPlaceholder":`Colle ton token`,"network.login.connect":`Se connecter`,"network.login.invalid":`Token invalide`,"network.login.serverError":`Erreur serveur — réessaie.`,"network.login.unreachable":`Kōbō est injoignable — vérifie ta connexion.`,"layout.toggleWorkspaces":`Afficher/masquer les espaces de travail`,"layout.togglePanel":`Afficher/masquer le panneau latéral`,"unsaved.title":`Quitter sans enregistrer ?`,"unsaved.message":`Vous avez des modifications non enregistrées. Quitter cette page les abandonne.`,"unsaved.leave":`Quitter`,"unsaved.stay":`Rester`,"prCheckout.staleRetriesExhausted":`L'état du dépôt a continué de changer pendant l'application de vos choix. Fermez cette fenêtre et réessayez depuis le sélecteur de pull request.`,"prPicker.title":`Importer depuis une pull request`,"prPicker.filterAll":`Toutes`,"prPicker.filterMine":`Les miennes`,"prPicker.filterReviewRequested":`Revue demandée`,"prPicker.searchPlaceholder":`Rechercher des pull requests…`,"prPicker.loadMore":`Charger plus`,"prPicker.empty":`Aucune pull request ouverte ne correspond.`,"prPicker.forkNotSupported":`Cette PR provient d'un fork ; Kōbō ne peut pas la checkout.`,"prPicker.loadFailed":`Échec du chargement des pull requests.`,"prPicker.badge.workspaceExists":`Déjà ouverte dans Kōbō`,"prPicker.badge.worktreePresent":`Worktree présente`,"prPicker.badge.localBranch":`Branche locale`,"prPicker.badge.new":`Nouvelle`,"prPicker.badge.draft":`Brouillon`,"prCheckout.title":`Préparer la worktree`,"prCheckout.apply":`Appliquer`,"prCheckout.cancel":`Annuler`,"prCheckout.retry":`Réessayer`,"prCheckout.diagnoseFailed":`Échec du diagnostic de la pull request.`,"prCheckout.resolveFailed":`Échec de la résolution du checkout de la pull request.`,"prCheckout.path.required":`Saisir un chemin de worktree qui n'existe pas encore.`,"prCheckout.workspace.restoreNotAvailable":"La restauration d'un workspace purgé n'est pas encore possible depuis cet écran. Recréez son dossier de worktree sur le disque (par ex. `git worktree add`) : Kōbō le rattachera automatiquement sous 30 secondes environ.","prCheckout.staleReloaded":`Le dépôt a changé ; le diagnostic a été rafraîchi.`,"prCheckout.step.blocked":`Impossible de continuer`,"prCheckout.step.path":`Emplacement de la worktree`,"prCheckout.step.workspace":`Workspace existant`,"prCheckout.step.worktree":`Worktree existante`,"prCheckout.step.operation":`Opération git en cours`,"prCheckout.step.changes":`Modifications non commitées`,"prCheckout.step.divergence":`Branche locale vs origin`,"prCheckout.workspace.activeHint":`Un workspace nommé « {name} » suit déjà cette branche.`,"prCheckout.workspace.open":`Ouvrir ce workspace`,"prCheckout.workspace.continue":`Continuer sur un autre chemin`,"prCheckout.workspace.unarchive":`Désarchiver et l'ouvrir`,"prCheckout.workspace.restore":`Recréer sa worktree`,"prCheckout.worktree.orphanHint":`Une worktree existe déjà sur cette branche à {path}.`,"prCheckout.worktree.attach":`L'attacher`,"prCheckout.worktree.branchInUse":`Cette branche est déjà extraite. Rattachez son worktree existant.`,"prCheckout.worktree.createElsewhere":`En créer une autre ailleurs`,"prCheckout.operation.hint":`Un {operation} est en cours dans cette worktree.`,"prCheckout.operation.abort":`Abandonner`,"prCheckout.operation.cancel":`Ne pas y toucher et s'arrêter ici`,"prCheckout.changes.hint":`{modified} modifié(s), {staged} indexé(s), {untracked} non suivi(s).`,"prCheckout.changes.stash":`Les stash`,"prCheckout.changes.commit":`Les commit`,"prCheckout.changes.discard":`Les abandonner (conservées dans un stash étiqueté)`,"prCheckout.changes.keepResetConflict":`Conserver les modifications est incompatible avec un reset. Faites un stash ou un commit, ou conservez la branche.`,"prCheckout.changes.keep":`Les laisser telles quelles`,"prCheckout.divergence.behindHint":`Votre branche a {behind} commit(s) de retard sur origin.`,"prCheckout.divergence.aheadHint":`Votre branche a {ahead} commit(s) non pushé(s).`,"prCheckout.divergence.divergedHint":`{ahead} en avance, {behind} en retard sur origin.`,"prCheckout.divergence.notFastForward":`Le fast-forward est impossible : la branche contient des commits locaux.`,"prCheckout.divergence.fastForward":`Fast-forward vers origin`,"prCheckout.divergence.rebase":`Rebase sur origin`,"prCheckout.divergence.resetHard":`Réinitialiser sur origin (une branche de sauvegarde est créée d'abord)`,"prCheckout.divergence.keep":`Conserver l'état local`,"prCheckout.blocked.forgeUnavailable":`Le CLI de la forge est absent ou non authentifié.`,"prCheckout.blocked.forkPr":`Cette PR provient d'un fork ; Kōbō ne peut pas la checkout.`,"prCheckout.blocked.headBranchDeleted":`La branche n'existe plus sur le remote.`,"prCheckout.blocked.indexLock":`Un autre processus git est en cours (index.lock est présent).`,"prCheckout.blocked.pathOccupied":`{path} existe déjà et n'est pas une worktree.`,"prCheckout.blocked.worktreeOtherBranch":`{path} est une worktree sur une autre branche ({branch}).`,"prCheckout.blocked.noCommonAncestor":`Une branche locale nommée {branch} existe avec un historique sans rapport.`,"split.title":`Vue double workspace`,"split.open":`Ouvrir côte à côte`,"split.openBeside":`Ouvrir à côté`,"split.close":`Fermer la vue double`,"split.left":`Workspace de gauche`,"split.right":`Workspace de droite`,"split.choose":`Choisir un workspace`,"split.recipient":`Envoyer à : {name}`,"absence.title":`Depuis ta dernière visite`,"settings.activityDigestHint":`Affiche le récapitulatif des événements survenus pendant ton absence. Désactiver masque cette entrée et arrête la collecte des nouveaux événements, sans effacer l’historique existant.`,"absence.pending":`Changements à consulter`,"absence.retention":`Activité importante des 30 derniers jours, enregistrée depuis l’installation de cette fonctionnalité. Le suivi des visites est propre à ce navigateur.`,"absence.since":`Depuis le {date}`,"absence.error":`Impossible de charger l’activité.`,"absence.retry":`Réessayer`,"absence.empty":`Aucune nouvelle activité.`,"absence.more":`Charger la suite`,"absence.markRead":`Marquer les événements affichés comme lus`,"absence.kind.question":`Question posée`,"absence.kind.permission":`Autorisation demandée`,"absence.kind.completed":`Session terminée`,"absence.kind.error":`Erreur de l’agent`,"absence.kind.pr-merged":`PR mergée`,"absence.kind.pr-approved":`PR approuvée`,"absence.kind.pr-changes-requested":`Modifications demandées`,"absence.kind.pr-ci-failed":`CI en échec`,"absence.kind.pr-ci-recovered":`CI rétablie`,"absence.kind.pr-merge-conflict":`Conflit de merge`,"absence.kind.pr-ready-to-merge":`PR prête à merger`,"absence.kind.archived":`Workspace archivé`,"absence.kind.purged":`Worktree purgé`,"absence.kind.restored":`Worktree restauré`,"tours.split.controls.title":`Deux workspaces indépendants`,"tours.split.controls.description":`Choisis un workspace par panneau. Redimensionne la séparation ; chaque conversation garde son destinataire et ses panneaux.`,"tours.home.sort.title":`Trier les workspaces`,"tours.home.sort.description":`Choisis l’ordre et le sens dans chaque groupe. Ton choix est mémorisé.`,"tours.home.activity.title":`Consulter l’activité après une absence`,"tours.home.activity.description":`En bas du drawer gauche, retrouve les questions, fins de session, erreurs et changements de PR survenus pendant ton absence.`,"progress.title":`Activités`,"progress.status.running":`En cours`,"progress.status.succeeded":`Réussie`,"progress.status.failed":`Échec`,"progress.status.interrupted":`Suivi interrompu`,"progress.dismiss":`Masquer {label}`,"progress.dismissHint":`Masquer cette activité sans arrêter son travail`,"progress.others":`Voir les autres ({count})`,"progress.collapse":`Réduire`,"progress.loadError":`Impossible de charger les activités.`,"progress.dismissError":`Impossible de masquer cette activité. Réessayez avec sa croix de fermeture.`,"progress.retry":`Réessayer`,"tours.workspace.progress.title":`Progression des activités`,"tours.workspace.progress.description":`Les agents et leurs sous-agents signalent les tâches longues au-dessus du champ de message. Trois activités sont visibles ; dépliez pour voir les autres. Les valeurs sont déclarées par les agents et ne constituent pas une vérification. Un succès disparaît après cinq secondes ; un échec reste visible. Fermer masque uniquement cette activité sans annuler le travail.`};export{e as default};
@@ -1,3 +1,3 @@
1
- import{n as e}from"./editor.api-BoFiCjBZ.js";var t=[`assign`,`flush`,`ftl`,`return`,`global`,`import`,`include`,`break`,`continue`,`local`,`nested`,`nt`,`setting`,`stop`,`t`,`lt`,`rt`,`fallback`],n=[`attempt`,`autoesc`,`autoEsc`,`compress`,`comment`,`escape`,`noescape`,`function`,`if`,`list`,`items`,`sep`,`macro`,`noparse`,`noParse`,`noautoesc`,`noAutoEsc`,`outputformat`,`switch`,`visit`,`recurse`],r={close:`>`,id:`angle`,open:`<`},i={close:`\\]`,id:`bracket`,open:`\\[`},a={close:`[>\\]]`,id:`auto`,open:`[<\\[]`},o={close:`\\}`,id:`dollar`,open1:`\\$`,open2:`\\{`},s={close:`\\]`,id:`bracket`,open1:`\\[`,open2:`=`};function c(r){return{brackets:[[`<`,`>`],[`[`,`]`],[`(`,`)`],[`{`,`}`]],comments:{blockComment:[`${r.open}--`,`--${r.close}`]},autoCloseBefore:`
1
+ import{n as e}from"./editor.api-CgbPVW9s.js";var t=[`assign`,`flush`,`ftl`,`return`,`global`,`import`,`include`,`break`,`continue`,`local`,`nested`,`nt`,`setting`,`stop`,`t`,`lt`,`rt`,`fallback`],n=[`attempt`,`autoesc`,`autoEsc`,`compress`,`comment`,`escape`,`noescape`,`function`,`if`,`list`,`items`,`sep`,`macro`,`noparse`,`noParse`,`noautoesc`,`noAutoEsc`,`outputformat`,`switch`,`visit`,`recurse`],r={close:`>`,id:`angle`,open:`<`},i={close:`\\]`,id:`bracket`,open:`\\[`},a={close:`[>\\]]`,id:`auto`,open:`[<\\[]`},o={close:`\\}`,id:`dollar`,open1:`\\$`,open2:`\\{`},s={close:`\\]`,id:`bracket`,open1:`\\[`,open2:`=`};function c(r){return{brackets:[[`<`,`>`],[`[`,`]`],[`(`,`)`],[`{`,`}`]],comments:{blockComment:[`${r.open}--`,`--${r.close}`]},autoCloseBefore:`
2
2
  \r }]),.:;=`,autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`,notIn:[`string`]},{open:`'`,close:`'`,notIn:[`string`]}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],folding:{markers:{start:RegExp(`${r.open}#(?:${n.join(`|`)})([^/${r.close}]*(?!/)${r.close})[^${r.open}]*$`),end:RegExp(`${r.open}/#(?:${n.join(`|`)})[\\r\\n\\t ]*>`)}},onEnterRules:[{beforeText:RegExp(`${r.open}#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/${r.close}]*(?!/)${r.close})[^${r.open}]*$`),afterText:RegExp(`^${r.open}/#([a-zA-Z_]+)[\\r\\n\\t ]*${r.close}$`),action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`${r.open}#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/${r.close}]*(?!/)${r.close})[^${r.open}]*$`),action:{indentAction:e.IndentAction.Indent}}]}}function l(){return{brackets:[[`<`,`>`],[`[`,`]`],[`(`,`)`],[`{`,`}`]],autoCloseBefore:`
3
3
  \r }]),.:;=`,autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`,notIn:[`string`]},{open:`'`,close:`'`,notIn:[`string`]}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],folding:{markers:{start:RegExp(`[<\\[]#(?:${n.join(`|`)})([^/>\\]]*(?!/)[>\\]])[^<\\[]*$`),end:RegExp(`[<\\[]/#(?:${n.join(`|`)})[\\r\\n\\t ]*>`)}},onEnterRules:[{beforeText:RegExp(`[<\\[]#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`),afterText:RegExp(`^[<\\[]/#([a-zA-Z_]+)[\\r\\n\\t ]*[>\\]]$`),action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`[<\\[]#(?!(?:${t.join(`|`)}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`),action:{indentAction:e.IndentAction.Indent}}]}}function u(e,t){let n=`_${e.id}_${t.id}`,r=e=>e.replace(/__id__/g,n),i=e=>{let t=e.source.replace(/__id__/g,n);return new RegExp(t,e.flags)};return{unicode:!0,includeLF:!1,start:r(`default__id__`),ignoreCase:!1,defaultToken:`invalid`,tokenPostfix:`.freemarker2`,brackets:[{open:`{`,close:`}`,token:`delimiter.curly`},{open:`[`,close:`]`,token:`delimiter.square`},{open:`(`,close:`)`,token:`delimiter.parenthesis`},{open:`<`,close:`>`,token:`delimiter.angle`}],[r(`open__id__`)]:new RegExp(e.open),[r(`close__id__`)]:new RegExp(e.close),[r(`iOpen1__id__`)]:new RegExp(t.open1),[r(`iOpen2__id__`)]:new RegExp(t.open2),[r(`iClose__id__`)]:new RegExp(t.close),[r(`startTag__id__`)]:i(/(@open__id__)(#)/),[r(`endTag__id__`)]:i(/(@open__id__)(\/#)/),[r(`startOrEndTag__id__`)]:i(/(@open__id__)(\/?#)/),[r(`closeTag1__id__`)]:i(/((?:@blank)*)(@close__id__)/),[r(`closeTag2__id__`)]:i(/((?:@blank)*\/?)(@close__id__)/),blank:/[ \t\n\r]/,keywords:[`false`,`true`,`in`,`as`,`using`],directiveStartCloseTag1:/attempt|recover|sep|auto[eE]sc|no(?:autoe|AutoE)sc|compress|default|no[eE]scape|comment|no[pP]arse/,directiveStartCloseTag2:/else|break|continue|return|stop|flush|t|lt|rt|nt|nested|recurse|fallback|ftl/,directiveStartBlank:/if|else[iI]f|list|for[eE]ach|switch|case|assign|global|local|include|import|function|macro|transform|visit|stop|return|call|setting|output[fF]ormat|nested|recurse|escape|ftl|items/,directiveEndCloseTag1:/if|list|items|sep|recover|attempt|for[eE]ach|local|global|assign|function|macro|output[fF]ormat|auto[eE]sc|no(?:autoe|AutoE)sc|compress|transform|switch|escape|no[eE]scape/,escapedChar:/\\(?:[ntrfbgla\\'"\{=]|(?:x[0-9A-Fa-f]{1,4}))/,asciiDigit:/[0-9]/,integer:/[0-9]+/,nonEscapedIdStartChar:/[\$@-Z_a-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u1FFF\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183-\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3006\u3031-\u3035\u303B-\u303C\u3040-\u318F\u31A0-\u31BA\u31F0-\u31FF\u3300-\u337F\u3400-\u4DB5\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,escapedIdChar:/\\[\-\.:#]/,idStartChar:/(?:@nonEscapedIdStartChar)|(?:@escapedIdChar)/,id:/(?:@idStartChar)(?:(?:@idStartChar)|(?:@asciiDigit))*/,specialHashKeys:/\*\*|\*|false|true|in|as|using/,namedSymbols:/&lt;=|&gt;=|\\lte|\\lt|&lt;|\\gte|\\gt|&gt;|&amp;&amp;|\\and|-&gt;|->|==|!=|\+=|-=|\*=|\/=|%=|\+\+|--|<=|&&|\|\||:|\.\.\.|\.\.\*|\.\.<|\.\.!|\?\?|=|<|\+|-|\*|\/|%|\||\.\.|\?|!|&|\.|,|;/,arrows:[`->`,`-&gt;`],delimiters:[`;`,`:`,`,`,`.`],stringOperators:[`lte`,`lt`,`gte`,`gt`],noParseTags:[`noparse`,`noParse`,`comment`],tokenizer:{[r(`default__id__`)]:[{include:r(`@directive_token__id__`)},{include:r(`@interpolation_and_text_token__id__`)}],[r(`fmExpression__id__.directive`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@directive_end_token__id__`)},{include:r(`@expression_token__id__`)}],[r(`fmExpression__id__.interpolation`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@expression_token__id__`)},{include:r(`@greater_operators_token__id__`)}],[r(`inParen__id__.plain`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@directive_end_token__id__`)},{include:r(`@expression_token__id__`)}],[r(`inParen__id__.gt`)]:[{include:r(`@blank_and_expression_comment_token__id__`)},{include:r(`@expression_token__id__`)},{include:r(`@greater_operators_token__id__`)}],[r(`noSpaceExpression__id__`)]:[{include:r(`@no_space_expression_end_token__id__`)},{include:r(`@directive_end_token__id__`)},{include:r(`@expression_token__id__`)}],[r(`unifiedCall__id__`)]:[{include:r(`@unified_call_token__id__`)}],[r(`singleString__id__`)]:[{include:r(`@string_single_token__id__`)}],[r(`doubleString__id__`)]:[{include:r(`@string_double_token__id__`)}],[r(`rawSingleString__id__`)]:[{include:r(`@string_single_raw_token__id__`)}],[r(`rawDoubleString__id__`)]:[{include:r(`@string_double_raw_token__id__`)}],[r(`expressionComment__id__`)]:[{include:r(`@expression_comment_token__id__`)}],[r(`noParse__id__`)]:[{include:r(`@no_parse_token__id__`)}],[r(`terseComment__id__`)]:[{include:r(`@terse_comment_token__id__`)}],[r(`directive_token__id__`)]:[[i(/(?:@startTag__id__)(@directiveStartCloseTag1)(?:@closeTag1__id__)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{cases:{"@noParseTags":{token:`tag`,next:r(`@noParse__id__.$3`)},"@default":{token:`tag`}}},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(?:@startTag__id__)(@directiveStartCloseTag2)(?:@closeTag2__id__)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(?:@startTag__id__)(@directiveStartBlank)(@blank)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:``,next:r(`@fmExpression__id__.directive`)}]],[i(/(?:@endTag__id__)(@directiveEndCloseTag1)(?:@closeTag1__id__)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(@open__id__)(@)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`,next:r(`@unifiedCall__id__`)}]],[i(/(@open__id__)(\/@)((?:(?:@id)(?:\.(?:@id))*)?)(?:@closeTag1__id__)/),[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`}]],[i(/(@open__id__)#--/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:{token:`comment`,next:r(`@terseComment__id__`)}],[i(/(?:@startOrEndTag__id__)([a-zA-Z_]+)/),e.id===`auto`?{cases:{"$1==<":{token:`@rematch`,switchTo:`@default_angle_${t.id}`},"$1==[":{token:`@rematch`,switchTo:`@default_bracket_${t.id}`}}}:[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag.invalid`,next:r(`@fmExpression__id__.directive`)}]]],[r(`interpolation_and_text_token__id__`)]:[[i(/(@iOpen1__id__)(@iOpen2__id__)/),[{token:t.id===`bracket`?`@brackets.interpolation`:`delimiter.interpolation`},{token:t.id===`bracket`?`delimiter.interpolation`:`@brackets.interpolation`,next:r(`@fmExpression__id__.interpolation`)}]],[/[\$#<\[\{]|(?:@blank)+|[^\$<#\[\{\n\r\t ]+/,{token:`source`}]],[r(`string_single_token__id__`)]:[[/[^'\\]/,{token:`string`}],[/@escapedChar/,{token:`string.escape`}],[/'/,{token:`string`,next:`@pop`}]],[r(`string_double_token__id__`)]:[[/[^"\\]/,{token:`string`}],[/@escapedChar/,{token:`string.escape`}],[/"/,{token:`string`,next:`@pop`}]],[r(`string_single_raw_token__id__`)]:[[/[^']+/,{token:`string.raw`}],[/'/,{token:`string.raw`,next:`@pop`}]],[r(`string_double_raw_token__id__`)]:[[/[^"]+/,{token:`string.raw`}],[/"/,{token:`string.raw`,next:`@pop`}]],[r(`expression_token__id__`)]:[[/(r?)(['"])/,{cases:{"r'":[{token:`keyword`},{token:`string.raw`,next:r(`@rawSingleString__id__`)}],'r"':[{token:`keyword`},{token:`string.raw`,next:r(`@rawDoubleString__id__`)}],"'":[{token:`source`},{token:`string`,next:r(`@singleString__id__`)}],'"':[{token:`source`},{token:`string`,next:r(`@doubleString__id__`)}]}}],[/(?:@integer)(?:\.(?:@integer))?/,{cases:{"(?:@integer)":{token:`number`},"@default":{token:`number.float`}}}],[/(\.)(@blank*)(@specialHashKeys)/,[{token:`delimiter`},{token:``},{token:`identifier`}]],[/(?:@namedSymbols)/,{cases:{"@arrows":{token:`meta.arrow`},"@delimiters":{token:`delimiter`},"@default":{token:`operators`}}}],[/@id/,{cases:{"@keywords":{token:`keyword.$0`},"@stringOperators":{token:`operators`},"@default":{token:`identifier`}}}],[/[\[\]\(\)\{\}]/,{cases:{"\\[":{cases:{"$S2==gt":{token:`@brackets`,next:r(`@inParen__id__.gt`)},"@default":{token:`@brackets`,next:r(`@inParen__id__.plain`)}}},"\\]":{cases:{...t.id===`bracket`?{"$S2==interpolation":{token:`@brackets.interpolation`,next:`@popall`}}:{},...e.id===`bracket`?{"$S2==directive":{token:`@brackets.directive`,next:`@popall`}}:{},[r(`$S1==inParen__id__`)]:{token:`@brackets`,next:`@pop`},"@default":{token:`@brackets`}}},"\\(":{token:`@brackets`,next:r(`@inParen__id__.gt`)},"\\)":{cases:{[r(`$S1==inParen__id__`)]:{token:`@brackets`,next:`@pop`},"@default":{token:`@brackets`}}},"\\{":{cases:{"$S2==gt":{token:`@brackets`,next:r(`@inParen__id__.gt`)},"@default":{token:`@brackets`,next:r(`@inParen__id__.plain`)}}},"\\}":{cases:{...t.id===`bracket`?{}:{"$S2==interpolation":{token:`@brackets.interpolation`,next:`@popall`}},[r(`$S1==inParen__id__`)]:{token:`@brackets`,next:`@pop`},"@default":{token:`@brackets`}}}}}],[/\$\{/,{token:`delimiter.invalid`}]],[r(`blank_and_expression_comment_token__id__`)]:[[/(?:@blank)+/,{token:``}],[/[<\[][#!]--/,{token:`comment`,next:r(`@expressionComment__id__`)}]],[r(`directive_end_token__id__`)]:[[/>/,e.id===`bracket`?{token:`operators`}:{token:`@brackets.directive`,next:`@popall`}],[i(/(\/)(@close__id__)/),[{token:`delimiter.directive`},{token:`@brackets.directive`,next:`@popall`}]]],[r(`greater_operators_token__id__`)]:[[/>/,{token:`operators`}],[/>=/,{token:`operators`}]],[r(`no_space_expression_end_token__id__`)]:[[/(?:@blank)+/,{token:``,switchTo:r(`@fmExpression__id__.directive`)}]],[r(`unified_call_token__id__`)]:[[/(@id)((?:@blank)+)/,[{token:`tag`},{token:``,next:r(`@fmExpression__id__.directive`)}]],[i(/(@id)(\/?)(@close__id__)/),[{token:`tag`},{token:`delimiter.directive`},{token:`@brackets.directive`,next:`@popall`}]],[/./,{token:`@rematch`,next:r(`@noSpaceExpression__id__`)}]],[r(`no_parse_token__id__`)]:[[i(/(@open__id__)(\/#?)([a-zA-Z]+)((?:@blank)*)(@close__id__)/),{cases:{"$S2==$3":[{token:`@brackets.directive`},{token:`delimiter.directive`},{token:`tag`},{token:``},{token:`@brackets.directive`,next:`@popall`}],"$S2==comment":[{token:`comment`},{token:`comment`},{token:`comment`},{token:`comment`},{token:`comment`}],"@default":[{token:`source`},{token:`source`},{token:`source`},{token:`source`},{token:`source`}]}}],[/[^<\[\-]+|[<\[\-]/,{cases:{"$S2==comment":{token:`comment`},"@default":{token:`source`}}}]],[r(`expression_comment_token__id__`)]:[[/--[>\]]/,{token:`comment`,next:`@pop`}],[/[^\->\]]+|[>\]\-]/,{token:`comment`}]],[r(`terse_comment_token__id__`)]:[[i(/--(?:@close__id__)/),{token:`comment`,next:`@popall`}],[/[^<\[\-]+|[<\[\-]/,{token:`comment`}]]}}}function d(e){let t=u(r,e),n=u(i,e),o=u(a,e);return{...t,...n,...o,unicode:!0,includeLF:!1,start:`default_auto_${e.id}`,ignoreCase:!1,defaultToken:`invalid`,tokenPostfix:`.freemarker2`,brackets:[{open:`{`,close:`}`,token:`delimiter.curly`},{open:`[`,close:`]`,token:`delimiter.square`},{open:`(`,close:`)`,token:`delimiter.parenthesis`},{open:`<`,close:`>`,token:`delimiter.angle`}],tokenizer:{...t.tokenizer,...n.tokenizer,...o.tokenizer}}}var f={conf:c(r),language:u(r,o)},p={conf:c(i),language:u(i,o)},m={conf:c(r),language:u(r,s)},h={conf:c(i),language:u(i,s)},g={conf:l(),language:d(o)},_={conf:l(),language:d(s)};export{m as TagAngleInterpolationBracket,f as TagAngleInterpolationDollar,_ as TagAutoInterpolationBracket,g as TagAutoInterpolationDollar,h as TagBracketInterpolationBracket,p as TagBracketInterpolationDollar};
@@ -1 +1 @@
1
- import{n as e}from"./editor.api-BoFiCjBZ.js";var t=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`menuitem`,`meta`,`param`,`source`,`track`,`wbr`],n={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:[`{{!--`,`--}}`]},brackets:[[`<!--`,`-->`],[`<`,`>`],[`{{`,`}}`],[`{`,`}`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`<`,close:`>`},{open:`"`,close:`"`},{open:`'`,close:`'`}],onEnterRules:[{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}]},r={defaultToken:``,tokenPostfix:``,tokenizer:{root:[[/\{\{!--/,`comment.block.start.handlebars`,`@commentBlock`],[/\{\{!/,`comment.start.handlebars`,`@comment`],[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.root`}],[/<!DOCTYPE/,`metatag.html`,`@doctype`],[/<!--/,`comment.html`,`@commentHtml`],[/(<)(\w+)(\/>)/,[`delimiter.html`,`tag.html`,`delimiter.html`]],[/(<)(script)/,[`delimiter.html`,{token:`tag.html`,next:`@script`}]],[/(<)(style)/,[`delimiter.html`,{token:`tag.html`,next:`@style`}]],[/(<)([:\w]+)/,[`delimiter.html`,{token:`tag.html`,next:`@otherTag`}]],[/(<\/)(\w+)/,[`delimiter.html`,{token:`tag.html`,next:`@otherTag`}]],[/</,`delimiter.html`],[/\{/,`delimiter.html`],[/[^<{]+/]],doctype:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.comment`}],[/[^>]+/,`metatag.content.html`],[/>/,`metatag.html`,`@pop`]],comment:[[/\}\}/,`comment.end.handlebars`,`@pop`],[/./,`comment.content.handlebars`]],commentBlock:[[/--\}\}/,`comment.block.end.handlebars`,`@pop`],[/./,`comment.content.handlebars`]],commentHtml:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.comment`}],[/-->/,`comment.html`,`@pop`],[/[^-]+/,`comment.content.html`],[/./,`comment.content.html`]],otherTag:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.otherTag`}],[/\/?>/,`delimiter.html`,`@pop`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/]],script:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.script`}],[/type/,`attribute.name`,`@scriptAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,[`delimiter.html`,`tag.html`,{token:`delimiter.html`,next:`@pop`}]]],scriptAfterType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptAfterType`}],[/=/,`delimiter`,`@scriptAfterTypeEquals`],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptAfterTypeEquals:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptAfterTypeEquals`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptWithCustomType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptWithCustomType.$S2`}],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptEmbedded:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInEmbeddedState.scriptEmbedded.$S2`,nextEmbedded:`@pop`}],[/<\/script/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}]],style:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.style`}],[/type/,`attribute.name`,`@styleAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,[`delimiter.html`,`tag.html`,{token:`delimiter.html`,next:`@pop`}]]],styleAfterType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleAfterType`}],[/=/,`delimiter`,`@styleAfterTypeEquals`],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleAfterTypeEquals:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleAfterTypeEquals`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleWithCustomType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleWithCustomType.$S2`}],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleEmbedded:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInEmbeddedState.styleEmbedded.$S2`,nextEmbedded:`@pop`}],[/<\/style/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}]],handlebarsInSimpleState:[[/\{\{\{?/,`delimiter.handlebars`],[/\}\}\}?/,{token:`delimiter.handlebars`,switchTo:`@$S2.$S3`}],{include:`handlebarsRoot`}],handlebarsInEmbeddedState:[[/\{\{\{?/,`delimiter.handlebars`],[/\}\}\}?/,{token:`delimiter.handlebars`,switchTo:`@$S2.$S3`,nextEmbedded:`$S3`}],{include:`handlebarsRoot`}],handlebarsRoot:[[/"[^"]*"/,`string.handlebars`],[/[#/][^\s}]+/,`keyword.helper.handlebars`],[/else\b/,`keyword.helper.handlebars`],[/[\s]+/],[/[^}]/,`variable.parameter.handlebars`]]}};export{n as conf,r as language};
1
+ import{n as e}from"./editor.api-CgbPVW9s.js";var t=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`menuitem`,`meta`,`param`,`source`,`track`,`wbr`],n={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:[`{{!--`,`--}}`]},brackets:[[`<!--`,`-->`],[`<`,`>`],[`{{`,`}}`],[`{`,`}`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`<`,close:`>`},{open:`"`,close:`"`},{open:`'`,close:`'`}],onEnterRules:[{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}]},r={defaultToken:``,tokenPostfix:``,tokenizer:{root:[[/\{\{!--/,`comment.block.start.handlebars`,`@commentBlock`],[/\{\{!/,`comment.start.handlebars`,`@comment`],[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.root`}],[/<!DOCTYPE/,`metatag.html`,`@doctype`],[/<!--/,`comment.html`,`@commentHtml`],[/(<)(\w+)(\/>)/,[`delimiter.html`,`tag.html`,`delimiter.html`]],[/(<)(script)/,[`delimiter.html`,{token:`tag.html`,next:`@script`}]],[/(<)(style)/,[`delimiter.html`,{token:`tag.html`,next:`@style`}]],[/(<)([:\w]+)/,[`delimiter.html`,{token:`tag.html`,next:`@otherTag`}]],[/(<\/)(\w+)/,[`delimiter.html`,{token:`tag.html`,next:`@otherTag`}]],[/</,`delimiter.html`],[/\{/,`delimiter.html`],[/[^<{]+/]],doctype:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.comment`}],[/[^>]+/,`metatag.content.html`],[/>/,`metatag.html`,`@pop`]],comment:[[/\}\}/,`comment.end.handlebars`,`@pop`],[/./,`comment.content.handlebars`]],commentBlock:[[/--\}\}/,`comment.block.end.handlebars`,`@pop`],[/./,`comment.content.handlebars`]],commentHtml:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.comment`}],[/-->/,`comment.html`,`@pop`],[/[^-]+/,`comment.content.html`],[/./,`comment.content.html`]],otherTag:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.otherTag`}],[/\/?>/,`delimiter.html`,`@pop`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/]],script:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.script`}],[/type/,`attribute.name`,`@scriptAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,[`delimiter.html`,`tag.html`,{token:`delimiter.html`,next:`@pop`}]]],scriptAfterType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptAfterType`}],[/=/,`delimiter`,`@scriptAfterTypeEquals`],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptAfterTypeEquals:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptAfterTypeEquals`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.text/javascript`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptWithCustomType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.scriptWithCustomType.$S2`}],[/>/,{token:`delimiter.html`,next:`@scriptEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptEmbedded:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInEmbeddedState.scriptEmbedded.$S2`,nextEmbedded:`@pop`}],[/<\/script/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}]],style:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.style`}],[/type/,`attribute.name`,`@styleAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,[`delimiter.html`,`tag.html`,{token:`delimiter.html`,next:`@pop`}]]],styleAfterType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleAfterType`}],[/=/,`delimiter`,`@styleAfterTypeEquals`],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleAfterTypeEquals:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleAfterTypeEquals`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.text/css`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleWithCustomType:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInSimpleState.styleWithCustomType.$S2`}],[/>/,{token:`delimiter.html`,next:`@styleEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleEmbedded:[[/\{\{/,{token:`@rematch`,switchTo:`@handlebarsInEmbeddedState.styleEmbedded.$S2`,nextEmbedded:`@pop`}],[/<\/style/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}]],handlebarsInSimpleState:[[/\{\{\{?/,`delimiter.handlebars`],[/\}\}\}?/,{token:`delimiter.handlebars`,switchTo:`@$S2.$S3`}],{include:`handlebarsRoot`}],handlebarsInEmbeddedState:[[/\{\{\{?/,`delimiter.handlebars`],[/\}\}\}?/,{token:`delimiter.handlebars`,switchTo:`@$S2.$S3`,nextEmbedded:`$S3`}],{include:`handlebarsRoot`}],handlebarsRoot:[[/"[^"]*"/,`string.handlebars`],[/[#/][^\s}]+/,`keyword.helper.handlebars`],[/else\b/,`keyword.helper.handlebars`],[/[\s]+/],[/[^}]/,`variable.parameter.handlebars`]]}};export{n as conf,r as language};
@@ -1 +1 @@
1
- import{n as e}from"./editor.api-BoFiCjBZ.js";var t=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`menuitem`,`meta`,`param`,`source`,`track`,`wbr`],n={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:[`<!--`,`-->`]},brackets:[[`<!--`,`-->`],[`<`,`>`],[`{`,`}`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],onEnterRules:[{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}],folding:{markers:{start:RegExp(`^\\s*<!--\\s*#region\\b.*-->`),end:RegExp(`^\\s*<!--\\s*#endregion\\b.*-->`)}}},r={defaultToken:``,tokenPostfix:`.html`,ignoreCase:!0,tokenizer:{root:[[/<!DOCTYPE/,`metatag`,`@doctype`],[/<!--/,`comment`,`@comment`],[/(<)((?:[\w\-]+:)?[\w\-]+)(\s*)(\/>)/,[`delimiter`,`tag`,``,`delimiter`]],[/(<)(script)/,[`delimiter`,{token:`tag`,next:`@script`}]],[/(<)(style)/,[`delimiter`,{token:`tag`,next:`@style`}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,[`delimiter`,{token:`tag`,next:`@otherTag`}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,[`delimiter`,{token:`tag`,next:`@otherTag`}]],[/</,`delimiter`],[/[^<]+/]],doctype:[[/[^>]+/,`metatag.content`],[/>/,`metatag`,`@pop`]],comment:[[/-->/,`comment`,`@pop`],[/[^-]+/,`comment.content`],[/./,`comment.content`]],otherTag:[[/\/?>/,`delimiter`,`@pop`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/]],script:[[/type/,`attribute.name`,`@scriptAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,[`delimiter`,`tag`,{token:`delimiter`,next:`@pop`}]]],scriptAfterType:[[/=/,`delimiter`,`@scriptAfterTypeEquals`],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptAfterTypeEquals:[[/"module"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.text/javascript`}],[/'module'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.text/javascript`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptWithCustomType:[[/>/,{token:`delimiter`,next:`@scriptEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptEmbedded:[[/<\/script/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}],[/[^<]+/,``]],style:[[/type/,`attribute.name`,`@styleAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,[`delimiter`,`tag`,{token:`delimiter`,next:`@pop`}]]],styleAfterType:[[/=/,`delimiter`,`@styleAfterTypeEquals`],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleWithCustomType:[[/>/,{token:`delimiter`,next:`@styleEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleEmbedded:[[/<\/style/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}],[/[^<]+/,``]]}};export{n as conf,r as language};
1
+ import{n as e}from"./editor.api-CgbPVW9s.js";var t=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`menuitem`,`meta`,`param`,`source`,`track`,`wbr`],n={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:[`<!--`,`-->`]},brackets:[[`<!--`,`-->`],[`<`,`>`],[`{`,`}`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],onEnterRules:[{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}],folding:{markers:{start:RegExp(`^\\s*<!--\\s*#region\\b.*-->`),end:RegExp(`^\\s*<!--\\s*#endregion\\b.*-->`)}}},r={defaultToken:``,tokenPostfix:`.html`,ignoreCase:!0,tokenizer:{root:[[/<!DOCTYPE/,`metatag`,`@doctype`],[/<!--/,`comment`,`@comment`],[/(<)((?:[\w\-]+:)?[\w\-]+)(\s*)(\/>)/,[`delimiter`,`tag`,``,`delimiter`]],[/(<)(script)/,[`delimiter`,{token:`tag`,next:`@script`}]],[/(<)(style)/,[`delimiter`,{token:`tag`,next:`@style`}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,[`delimiter`,{token:`tag`,next:`@otherTag`}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,[`delimiter`,{token:`tag`,next:`@otherTag`}]],[/</,`delimiter`],[/[^<]+/]],doctype:[[/[^>]+/,`metatag.content`],[/>/,`metatag`,`@pop`]],comment:[[/-->/,`comment`,`@pop`],[/[^-]+/,`comment.content`],[/./,`comment.content`]],otherTag:[[/\/?>/,`delimiter`,`@pop`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/]],script:[[/type/,`attribute.name`,`@scriptAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,[`delimiter`,`tag`,{token:`delimiter`,next:`@pop`}]]],scriptAfterType:[[/=/,`delimiter`,`@scriptAfterTypeEquals`],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptAfterTypeEquals:[[/"module"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.text/javascript`}],[/'module'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.text/javascript`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptWithCustomType:[[/>/,{token:`delimiter`,next:`@scriptEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptEmbedded:[[/<\/script/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}],[/[^<]+/,``]],style:[[/type/,`attribute.name`,`@styleAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,[`delimiter`,`tag`,{token:`delimiter`,next:`@pop`}]]],styleAfterType:[[/=/,`delimiter`,`@styleAfterTypeEquals`],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleWithCustomType:[[/>/,{token:`delimiter`,next:`@styleEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleEmbedded:[[/<\/style/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}],[/[^<]+/,``]]}};export{n as conf,r as language};
@@ -0,0 +1 @@
1
+ import{Jt as e,Xt as t,Yt as n,p as r,qt as i}from"./index-CbyHfF8I.js";var a=r(async({app:r})=>{if(r.use(e),n!==`en`)try{await t(n)}catch(e){console.error(`[i18n] could not load the saved locale, staying in English:`,e)}i(n)});export{a as default};