@loicngr/kobo 2.1.24 → 2.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +39 -0
- package/CHANGELOG.md +8 -0
- package/CONFIGURATION.md +107 -0
- package/README.md +2 -1
- package/dist/server/routes/usage.js +24 -0
- package/dist/server/routes/workspaces.js +41 -7
- package/dist/server/services/agent/engines/claude-code/engine.js +2 -0
- package/dist/server/services/agent/engines/claude-code/progress-reporting-hook.js +99 -0
- package/dist/server/services/forge/github/provider.js +4 -2
- package/dist/server/services/forge/types.js +0 -1
- package/dist/server/services/provider-accounts-service.js +202 -0
- package/dist/server/services/usage/poller.js +44 -3
- package/dist/server/utils/git-ops.js +29 -20
- package/dist/shared/forge-merge.js +5 -0
- package/dist/shared/progress-bar-prompts.js +1 -1
- package/dist/shared/provider-accounts.js +1 -0
- package/package.json +1 -1
- package/src/client/dist/pwa/assets/{ActivityFeed-BYspOKKg.js → ActivityFeed-DfYrVNEh.js} +1 -1
- package/src/client/dist/pwa/assets/{AutoLoopFinalReviewSettings-DXX3CqrY.js → AutoLoopFinalReviewSettings-DOr41E2Y.js} +1 -1
- package/src/client/dist/pwa/assets/{ChangelogPage-DKkI5IU-.js → ChangelogPage-DOCgZMpn.js} +1 -1
- package/src/client/dist/pwa/assets/{ComparisonPanel-Cw5Dkan0.js → ComparisonPanel-b5nTBjK6.js} +1 -1
- package/src/client/dist/pwa/assets/{CreatePage-B7PLFOH6.js → CreatePage-B7VPHEqm.js} +1 -1
- package/src/client/dist/pwa/assets/{DashboardPage-Dw8nfkYR.js → DashboardPage-dBpJaQSb.js} +1 -1
- package/src/client/dist/pwa/assets/DiffViewer-BLQz2Qyx.js +8 -0
- package/src/client/dist/pwa/assets/{DiffViewer-DEPOa3D7.css → DiffViewer-XzCvEKLJ.css} +1 -1
- package/src/client/dist/pwa/assets/{DocumentsPanel-CH0KzdJV.js → DocumentsPanel-AqLx0MzB.js} +1 -1
- package/src/client/dist/pwa/assets/{DrawerToggleButton-CZVpU8HH.js → DrawerToggleButton-BLWaFgh0.js} +1 -1
- package/src/client/dist/pwa/assets/GitPanel-Ba7ltCsM.js +3 -0
- package/src/client/dist/pwa/assets/{GitPanel-CNFtj6k0.css → GitPanel-CRaLJzjc.css} +1 -1
- package/src/client/dist/pwa/assets/{HealthPage-DnPp8GSx.js → HealthPage-DeryVLyz.js} +1 -1
- package/src/client/dist/pwa/assets/{MainLayout-1PaKfzdy.js → MainLayout-B2XvjdWi.js} +2 -2
- package/src/client/dist/pwa/assets/{MemoryPanel-BarliK2r.js → MemoryPanel-B34DENtz.js} +1 -1
- package/src/client/dist/pwa/assets/{MemoryProposalList-BtVjVPp7.js → MemoryProposalList-BpN_OU8J.js} +1 -1
- package/src/client/dist/pwa/assets/{QBtnDropdown-Rzurb7nO.js → QBtnDropdown-BPcK_rVs.js} +1 -1
- package/src/client/dist/pwa/assets/{QExpansionItem-CaKEBcyx.js → QExpansionItem-CpwQ8L_F.js} +1 -1
- package/src/client/dist/pwa/assets/{QScrollArea-hrsAyyJf.js → QScrollArea-BkNSVl7s.js} +1 -1
- package/src/client/dist/pwa/assets/{QSelect-Dr7rAt6u.js → QSelect-DrLpbvcr.js} +1 -1
- package/src/client/dist/pwa/assets/{QTooltip-CNMsXTmD.js → QTooltip-Dp8fitHV.js} +1 -1
- package/src/client/dist/pwa/assets/{SchedulePanel-nDw2eZ9K.js → SchedulePanel-Ck8LKDCa.js} +1 -1
- package/src/client/dist/pwa/assets/{SearchPage-BXJ6iVt1.js → SearchPage-BAUZg1zq.js} +1 -1
- package/src/client/dist/pwa/assets/{SettingsPage-SHpE2q9Z.js → SettingsPage-Cj6kSVT5.js} +1 -1
- package/src/client/dist/pwa/assets/{SplitWorkspacePage-tfZ1kAdZ.js → SplitWorkspacePage-CH8OHmtn.js} +1 -1
- package/src/client/dist/pwa/assets/{TerminalPanel-Cw8R7lAw.js → TerminalPanel-CBmZ0IzQ.js} +1 -1
- package/src/client/dist/pwa/assets/{ToolCallItem-DEKhFJEv.js → ToolCallItem-CLtGTV6w.js} +1 -1
- package/src/client/dist/pwa/assets/{TouchPan-DybGzRRK.js → TouchPan-9SH2dx6m.js} +1 -1
- package/src/client/dist/pwa/assets/{TourReplayButton-BNdlAZUR.js → TourReplayButton-Dw4sGf9B.js} +1 -1
- package/src/client/dist/pwa/assets/{WorkspaceAttentionLabels-B0H9omcK.js → WorkspaceAttentionLabels-wd_sObJa.js} +1 -1
- package/src/client/dist/pwa/assets/WorkspacePage-BEBwwr81.css +1 -0
- package/src/client/dist/pwa/assets/WorkspacePage-D4ODPOG-.js +4 -0
- package/src/client/dist/pwa/assets/{browser-DUTZhU-w.js → browser-CC4W8r76.js} +1 -1
- package/src/client/dist/pwa/assets/{build-path-tree-ZThcsIN5.js → build-path-tree-BBuyB-my.js} +1 -1
- package/src/client/dist/pwa/assets/{custom-sounds-CquHn2gw.js → custom-sounds-BbPNRzAs.js} +1 -1
- package/src/client/dist/pwa/assets/{de-B3H0T-ft.js → de-D9VzPDGF.js} +2 -2
- package/src/client/dist/pwa/assets/{editor.api-pSvhgban.js → editor.api-BwfxvQ88.js} +1 -1
- package/src/client/dist/pwa/assets/{efforts-DJaFsLgd.js → efforts-B3I7w5bs.js} +1 -1
- package/src/client/dist/pwa/assets/{es-B4lACW6k.js → es-3R4MJuTt.js} +2 -2
- package/src/client/dist/pwa/assets/{expand-template-C5D_p5eV.js → expand-template-Ci9UjnxZ.js} +1 -1
- package/src/client/dist/pwa/assets/{format-DRfnkeRP.js → format-CJIzi3Vf.js} +1 -1
- package/src/client/dist/pwa/assets/{formatters-Cog2icjt.js → formatters-DQ8cP7nO.js} +1 -1
- package/src/client/dist/pwa/assets/{fr-3uNi02Jz.js → fr-DXwDVnJ4.js} +2 -2
- package/src/client/dist/pwa/assets/{freemarker2-W-OLsqOk.js → freemarker2-DbpVO-cL.js} +1 -1
- package/src/client/dist/pwa/assets/{handlebars-Kt5RbWuO.js → handlebars-BHve0PpA.js} +1 -1
- package/src/client/dist/pwa/assets/{html-D5VKPBbB.js → html-BhUkdFPz.js} +1 -1
- package/src/client/dist/pwa/assets/i18n-CGLQAADf.js +1 -0
- package/src/client/dist/pwa/assets/{index-BZwhT2-I.js → index-CNcXBpzz.js} +3 -3
- package/src/client/dist/pwa/assets/{it-DtFWyLHb.js → it-T9AjnG42.js} +2 -2
- package/src/client/dist/pwa/assets/{javascript-DBjx8Bg2.js → javascript-BLAorPa3.js} +1 -1
- package/src/client/dist/pwa/assets/{liquid-DYT4a7D7.js → liquid-CJGF-h-f.js} +1 -1
- package/src/client/dist/pwa/assets/{mdx-9L1kysEY.js → mdx-Cm0oNz_l.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco-contributions-DAme5TZS.js → monaco-contributions-nBg6wf05.js} +1 -1
- package/src/client/dist/pwa/assets/{monaco.contribution-C58k7TPw.js → monaco.contribution-hr9s26Ud.js} +2 -2
- package/src/client/dist/pwa/assets/{network-auth-BDUlgV-U.js → network-auth-C850jGfI.js} +1 -1
- package/src/client/dist/pwa/assets/{notify-theme-DrQB-mrb.js → notify-theme-EcbxuH_8.js} +1 -1
- package/src/client/dist/pwa/assets/{project-color-BlV5PUUW.js → project-color-vDuTaTJn.js} +1 -1
- package/src/client/dist/pwa/assets/{python-DJIlKr-Y.js → python-BEjbzFAQ.js} +1 -1
- package/src/client/dist/pwa/assets/{razor-CC3uqdaH.js → razor-BJPT7Wxx.js} +1 -1
- package/src/client/dist/pwa/assets/{typescript-BnnkT9oE.js → typescript-DPqM46Ef.js} +1 -1
- package/src/client/dist/pwa/assets/{use-search-index-status-CExdHIar.js → use-search-index-status-BwwrB410.js} +1 -1
- package/src/client/dist/pwa/assets/{use-tours-DOUjqO2f.js → use-tours-B0KtCS9w.js} +1 -1
- package/src/client/dist/pwa/assets/{use-worktree-restore-zIOYNIcb.js → use-worktree-restore-tzd2FESU.js} +1 -1
- package/src/client/dist/pwa/assets/{workspace-templates-DXJG6flv.js → workspace-templates-CubzsZUU.js} +1 -1
- package/src/client/dist/pwa/assets/{xml-DJtVmsJT.js → xml-C6SVzw5_.js} +1 -1
- package/src/client/dist/pwa/assets/{yaml-Dwuw8FcP.js → yaml-OpCqnv4g.js} +1 -1
- package/src/client/dist/pwa/index.html +1 -1
- package/src/client/dist/pwa/sw.js +1 -1
- package/src/mcp-server/README.md +8 -0
- package/src/client/dist/pwa/assets/DiffViewer-DFlDwkmd.js +0 -8
- package/src/client/dist/pwa/assets/GitPanel-DjKL30gM.js +0 -3
- package/src/client/dist/pwa/assets/WorkspacePage-B-82Rw9T.css +0 -1
- package/src/client/dist/pwa/assets/WorkspacePage-tWGXnmrz.js +0 -4
- package/src/client/dist/pwa/assets/i18n-CEzCwMir.js +0 -1
|
@@ -8,10 +8,10 @@ KOBO_WORKSPACE_ID — id Kōbō del workspace (estable tras renombrar)
|
|
|
8
8
|
KOBO_WORKSPACE_NAME — nombre visible del workspace
|
|
9
9
|
KOBO_FORGE — forge resuelta: github / gitlab / none
|
|
10
10
|
KOBO_PR_NUMBER — número de PR/MR en la forge resuelta (vacío si no hay ninguna abierta)`,"settings.changeSourceBranchScript.placeholder":`#!/usr/bin/env bash
|
|
11
|
-
# tu script — usa $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Restablecer al predeterminado de Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`¿Restablecer el script?`,"settings.changeSourceBranchScript.replaceConfirm":`Tus modificaciones se reemplazarán por el script predeterminado de Kōbō. ¿Continuar?`,"settings.cleanupScriptHint":`Script de shell ejecutado en el worktree después de cada sesión del agente. En modo auto-loop solo se ejecuta cuando todas las tareas están terminadas. Dejar vacío para desactivar.`,"settings.cleanupScriptPlaceholder":`p. ej. eliminar archivos temporales, detener contenedores…`,"settings.cleanupScriptMode":`Cuándo ejecutar`,"settings.cleanupScriptMode.idle":`Después de cada sesión — aunque queden tareas`,"settings.cleanupScriptMode.noTasks":`Solo cuando no queda ninguna tarea de Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Ejecutar solo si se modificaron, añadieron o eliminaron archivos`,"settings.cleanupScriptMode.inherit":`Heredar la configuración global`,"settings.taskPromptTemplate":`Prompt de tarea`,"settings.taskPromptTemplatePlaceholder":`Prompt insertado automáticamente en la descripción de la tarea…`,"settings.taskPromptTemplateHint":`Se inyecta automáticamente en la descripción de la tarea en la página de creación cuando este proyecto está seleccionado. Si no se modifica, se reemplaza al cambiar de proyecto; en cuanto lo editas, se conserva tu texto.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Se ejecuta con bash en el worktree después de su creación, antes de que el agente inicie. No necesita shebang. Si falla, el workspace se establece en error. Timeout: 5 minutos.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Ninguno`,"settings.e2e.frameworkOther":`Otro`,"settings.e2e.skill":`Skill (opcional)`,"settings.e2e.skillPlaceholder":`p. ej. cypress-tester`,"settings.e2e.prompt":`Guía personalizada (opcional)`,"settings.e2e.promptPlaceholder":`p. ej. usar el patrón page-object, apuntar a data-testid`,"settings.e2e.helpText":`Cuando está configurado, el agente de grooming auto-loop inserta subtareas E2E para funciones UI.`,"settings.finalization.title":`Finalización del auto-loop`,"settings.finalization.helpText":`Opcional: un prompt que el agente ejecuta como la última iteración del auto-loop. Típicamente usado para controles de calidad finales (lint, typecheck, tests). La fase de grooming creará una tarea con prefijo [FINAL] que usará este prompt.`,"settings.finalization.prompt":`Prompt de finalización`,"settings.finalization.promptPlaceholder":`p. ej. Ejecuta npm run lint y npm test, luego marca esta tarea como hecha.`,"settings.editorCommand":`Comando del editor`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Comando para abrir el worktree en su editor. La ruta del worktree se pasa como argumento.`,"settings.fileManagerCommand":`Comando del explorador de archivos`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Comando para abrir el worktree en su explorador de archivos. La ruta del worktree se pasa como argumento. Déjalo vacío para ocultar el botón.`,"settings.terminalCommand":`Comando de terminal`,"settings.terminalCommandHint":`Comando para abrir tu terminal en el worktree. Marcador {path} opcional para el directorio.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Selección MCP de Claude`,"settings.mcpAutoSelect":`Auto (primer MCP activo que coincide)`,"settings.notionMcp":`Clave MCP de Notion`,"settings.sentryMcp":`Clave MCP de Sentry`,"settings.mcpSelectionHint":`Las entradas activas se leen desde ~/.claude.json. Deja Auto para usar el comportamiento por defecto.`,"settings.configuredProjects":`Proyectos configurados`,"settings.noProjects":`No hay proyectos configurados`,"settings.addProject":`Añadir proyecto`,"settings.copyFrom":`Copiar ajustes desde`,"settings.copyFromPlaceholder":`(ninguno — partir de los valores por defecto)`,"settings.copyFromHint":`Copia todos los ajustes excepto path, nombre y rama fuente.`,"settings.copyFromConfirmTitle":`¿Sobrescribir los valores actuales?`,"settings.copyFromConfirm":`Se sobrescribirán los valores del formulario con los ajustes de «{project}». ¿Continuar?`,"settings.newProject":`Nuevo proyecto`,"settings.editProject":`Editar proyecto`,"help.title":`Ayuda`,"help.tours":`Visitas guiadas`,"help.steps":`{n} paso | {n} pasos`,"help.markAllSeen":`Marcar todas como vistas`,"help.markAllSeenHint":`Marca las visitas actuales como vistas sin iniciarlas.`,"help.resetAll":`Restablecer todas las visitas`,"help.resetAllHint":`Inicia ahora la visita de inicio; cada pantalla repetirá la suya al abrirla de nuevo.`,"help.status.unseen":`no vista`,"help.status.partial":`en parte`,"help.status.seen":`vista`,"help.replayThis":`Repetir la visita de esta pantalla`,"tours.next":`Siguiente`,"tours.prev":`Atrás`,"tours.done":`Terminar`,"tours.exitConfirm":`¿Salir de la visita guiada? No volverá a iniciarse sola; puedes repetirla cuando quieras desde el menú Ayuda.`,"tours.home.title":`Orientarse`,"tours.home.list.title":`Workspaces`,"tours.home.list.description":`Cada misión vive aquí con su estado. Los badges señalan una CI fallida, una review que pide cambios o una PR lista para merge. Arrastra el borde interior de un panel lateral con el ratón o el dedo para cambiar su tamaño. Los botones superiores se distribuyen en varias líneas si falta espacio.`,"tours.home.create.title":`Crear un workspace`,"tours.home.create.description":`Un workspace es un worktree de Git, una rama y una sesión de agente para una tarea.`,"tours.home.search.title":`Búsqueda`,"tours.home.search.description":`Filtra la lista por nombre. El icono de búsqueda de arriba abre la búsqueda de texto completo en las conversaciones de los agentes.`,"tours.home.dashboard.title":`Panel`,"tours.home.dashboard.description":`Una tabla con todos los workspaces activos: estado, atención, PR, diff, actividad y la fiabilidad de los motores.`,"tours.home.health.title":`Salud y changelog`,"tours.home.health.description":`Comprueba la base de datos, los runtimes y los agentes activos. El botón de al lado lista lo que cambió en cada versión.`,"tours.home.settings.title":`Ajustes`,"tours.home.settings.description":`Motores, integraciones, automatización, worktrees y proyectos. Ahora crea tu primer workspace.`,"tours.create.title":`Crear un workspace`,"tours.create.project.title":`Proyecto y rama`,"tours.create.project.description":`Elige el proyecto y la rama de la que parte el worktree.`,"tours.create.mission.title":`Misión`,"tours.create.mission.description":`Describe la tarea, o impórtala desde una página de Notion o una issue de Sentry.`,"tours.create.template.title":`Templates`,"tours.create.template.description":`Aplica un preset guardado, o guarda este formulario como preset. «Duplicar» en una tarjeta de workspace abre este formulario ya rellenado.`,"tours.create.engine.title":`Motor y modelo`,"tours.create.engine.description":`Claude Code o Codex, el modelo, el esfuerzo de razonamiento y lo que el agente puede hacer sin preguntar.`,"tours.create.brainstorm.title":`Brainstorm en otro modelo`,"tours.create.brainstorm.description":`Ejecuta la primera sesión de brainstorming en otro modelo y vuelve al principal para las iteraciones.`,"tours.create.autoloop.title":`Auto-loop`,"tours.create.autoloop.description":`El agente completa las tareas y las verificaciones finales. Una review final independiente opcional se repite tras las correcciones hasta que no queden hallazgos; si no hay progreso, el bucle se pausa.`,"tours.create.finalReview.title":`Configurar la review final`,"tours.create.finalReview.description":`Elige de antemano el motor, el modelo, el esfuerzo y las instrucciones del reviewer. La review se ejecuta en una sesión separada de solo lectura; el agente original corrige los hallazgos y la review se repite hasta que no quede ninguno.`,"tours.workspace.finalReview.title":`Review final y correcciones`,"tours.workspace.finalReview.description":`Configura aquí el reviewer final opcional antes de iniciarlo. Tras las tareas y las verificaciones finales, una sesión separada revisa el trabajo. Los hallazgos vuelven a la sesión original para corregirlos automáticamente y repetir la review. Cerrar Kōbō conserva el ciclo.`,"tours.workspace.reviewReturn.title":`Volver de una review`,"tours.workspace.reviewReturn.description":`El resumen vuelve a la sesión original incluso tras reiniciar Kōbō. Si la entrega es incierta, consulta esa conversación antes de Reintentar; Cancelar abandona el retorno. Las reviews manuales esperan tus instrucciones antes de corregir; auto-loop corrige automáticamente.`,"tours.create.comparison.title":`Comparar dos motores`,"tours.create.comparison.description":`Crea dos workspaces gemelos sobre la misma tarea y compara sus commits, tareas y actividad.`,"tours.workspace.sessions.title":`Sesiones del workspace`,"tours.workspace.sessions.description":`Pulsa el título para elegir, crear o renombrar una sesión, o copiar su identificador.`,"tours.workspace.actions.title":`Acciones del workspace`,"tours.workspace.actions.description":`El menú ⋯ reúne la vista en paralelo, la paleta de comandos, el panel lateral y la visita guiada.`,"tours.workspace.title":`Dentro de un workspace`,"tours.workspace.chat.title":`Conversación`,"tours.workspace.chat.description":`La salida del agente, en directo: mensajes, llamadas a herramientas, preguntas y errores.`,"tours.workspace.input.title":`Hablar con el agente`,"tours.workspace.input.description":`Envía un mensaje, usa slash commands, dicta por voz o adjunta archivos.`,"tours.workspace.selectors.title":`Ajustes de sesión`,"tours.workspace.selectors.description":`Abre Configurar para ajustar modelo, esfuerzo, permisos y auto-loop. También muestra el motor actual.`,"tours.workspace.status.title":`Estado`,"tours.workspace.status.description":`El estado de la sesión actual; detenla aquí cuando haga falta.`,"tours.workspace.git.title":`Git`,"tours.workspace.git.description":`Commits, diff, push, rebase y la PR de esta rama.`,"tours.workspace.tasks.title":`Tareas`,"tours.workspace.tasks.description":`Lo que el agente planea hacer, y los criterios de aceptación que debe cumplir.`,"tours.workspace.timeline.title":`Cronología`,"tours.workspace.timeline.description":`Todas las sesiones de este workspace; abre una anterior para releerla.`,"tours.workspace.subagents.title":`Subagentes`,"tours.workspace.subagents.description":`Sigue los subagentes que lanzó el agente, con su progreso en directo.`,"tours.workspace.documents.title":`Documentos`,"tours.workspace.documents.description":`Planes y archivos que escribió el agente, consultables sin salir del chat.`,"tours.workspace.schedule.title":`Programación`,"tours.workspace.schedule.description":`Wake-ups y crons que relanzan el agente más tarde.`,"tours.workspace.memory.title":`Memoria del workspace`,"tours.workspace.memory.description":`Consulta la memoria entregada a la conversación seleccionada, las propuestas pendientes y las operaciones del workspace. Borrarla no modifica el historial del proveedor.`,"tours.workspace.handoff.title":`Continuar con un contexto nuevo`,"tours.workspace.handoff.description":`¿Una conversación larga? Inicia aquí una sesión nueva o usa «Cambiar de LLM». El trabajo actual se interrumpe de inmediato y la nueva sesión continúa automáticamente en el mismo workspace. El resumen de traspaso es opcional: desactívalo si el LLM actual ha agotado su cuota. El progreso, el informe y el enlace a la sesión anterior aparecen debajo de este botón.`,"tours.workspace.terminal.title":`Terminal`,"tours.workspace.terminal.description":`Una shell dentro del worktree, sin salir de Kōbō.`,"tours.gitPr.title":`Pull request`,"tours.gitPr.panel.title":`Estado de la PR`,"tours.gitPr.panel.description":`Resultado de la CI, decisión de la review y reviewers, actualizados cada 30 segundos.`,"tours.gitPr.actions.title":`Acciones Git`,"tours.gitPr.actions.description":`Push, pull, rebase o cambiar la rama base. Durante un conflicto, un botón deja que el agente lo resuelva.`,"tours.gitPr.attention.title":`Badges de atención`,"tours.gitPr.attention.description":`La tarjeta muestra una CI fallida, cambios solicitados o una PR lista para merge.`,"tours.settings.title":`Ajustes`,"tours.settings.engines.title":`Motores y modelos`,"tours.settings.engines.description":`Modelos, permisos predeterminados y límites de reintentos automáticos.`,"tours.settings.integrations.title":`Integraciones`,"tours.settings.integrations.description":`Conexiones de Notion y Sentry, y credenciales de Bitbucket. GitHub y GitLab usan tu sesión CLI local.`,"tours.settings.automation.title":`Automatización`,"tours.settings.automation.description":`Scripts de setup y cleanup, lifecycle hooks, templates de prompts, templates de workspace y skills. Abre «Variables disponibles» bajo cada script para consultar las variables del workspace, Docker y el hook.`,"tours.settings.worktrees.title":`Worktrees`,"tours.settings.memory.title":`Memoria`,"tours.settings.memory.description":`Elige el comportamiento manual, automático o híbrido y explora, revisa o borra los datos exactos de cada ámbito. Las operaciones de memoria son inmediatas; el modo se aplica al guardar los ajustes.`,"tours.settings.worktrees.description":`Dónde viven los worktrees, cuánto tiempo se conservan los ya fusionados, y la purga automática.`,"tours.settings.projects.title":`Proyectos`,"tours.settings.projects.description":`Los proyectos registrados y sus ajustes específicos por proyecto.`,"tours.settings.misc.title":`General, voz, notificaciones, exportación`,"tours.settings.misc.description":`Idioma, acceso a la red, dictado, sonidos y notificaciones del navegador, y una exportación completa de tus ajustes.`,"tours.dashboard.title":`Panel`,"tours.dashboard.overview.title":`Visión general`,"tours.dashboard.overview.description":`Todos los workspaces activos en una tabla; haz clic en una fila para abrirla.`,"tours.dashboard.reliability.title":`Fiabilidad de los motores`,"tours.dashboard.reliability.description":`Sesiones, errores y duraciones por motor y modelo.`,"tours.health.title":`Salud`,"tours.health.checks.title":`Comprobaciones`,"tours.health.checks.description":`Entorno, base de datos, runtimes, workspaces y sesiones.`,"tours.health.active.title":`Estado activo`,"tours.health.active.description":`Los back-offs de cuota, los wake-ups pendientes y los auto-loops en curso en este momento.`,"tours.search.title":`Búsqueda`,"tours.search.input.title":`Consulta`,"tours.search.input.description":`Coincide con nombres de workspaces y conversaciones de agentes.`,"tours.search.archived.title":`Archivados`,"tours.search.archived.description":`Incluir los workspaces archivados en los resultados.`,"tours.changelog.title":`Novedades`,"tours.changelog.list.title":`Versiones`,"tours.changelog.list.description":`Lo que cambió en cada versión, la más reciente primero.`,"settings.projectGroup.identity":`Identidad`,"settings.projectGroup.defaults":`Valores predeterminados`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Ruta del proyecto`,"settings.projectPathPlaceholder":`/ruta/al/proyecto`,"settings.displayName":`Nombre para mostrar`,"settings.displayNamePlaceholder":`Mi proyecto`,"settings.defaultSourceBranch":`Rama fuente por defecto`,"settings.defaultModel.project":`Modelo por defecto`,"settings.skipPermissions.project":`Omitir solicitudes de permisos`,"settings.prPromptTemplate.project":`Plantilla de prompt PR`,"settings.prPromptPlaceholder.project":`Instrucciones específicas del proyecto para la creación de PRs...`,"settings.reviewPromptTemplate.project":`Plantilla de prompt de revisión`,"settings.ciFixPromptTemplate.project":`Plantilla de prompt «Reparar CI»`,"settings.gitConventions.project":`Convenciones Git (por proyecto)`,"settings.gitConventionsEmpty":`Dejar vacío para usar las convenciones globales.`,"settings.notionStatus":`Estado ticket Notion`,"settings.notionStatusProperty":`Nombre de la propiedad`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valor a establecer`,"settings.notionInProgressStatusPlaceholder":`En progreso, In progress...`,"settings.notionStatusHint":`Cuando se crea un workspace con un ticket Notion, la propiedad especificada se establece a este valor. Ambos campos son obligatorios. Dejar vacío para desactivar.`,"settings.notionAssignee":`Asignación Notion`,"settings.notionAssigneeHint":`Cuando se crea un workspace con un ticket Notion, el usuario autenticado en el MCP de Notion se añade a esta propiedad People — solo si aún no tiene un asignado. Dejar vacío para desactivar.`,"settings.notionAssigneeProperty":`Nombre de la propiedad`,"settings.notionAssigneePropertyPlaceholder":`Desarrolladores, Assignees...`,"settings.notionUserId":`Tu UUID de Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Selecciona tu cuenta en la lista. Notion rechaza la asignación de bots en propiedades People — este campo es obligatorio para activar la auto-asignación.`,"settings.notionUsersRefresh":`Refrescar`,"settings.notionUsersLoading":`Cargando usuarios de Notion…`,"settings.notionUsersLoadFailed":`Error al cargar la lista: {error}`,"settings.notionUsersManualFallback":`Lista no disponible — pega tu UUID de Notion manualmente.`,"settings.devServer":`Servidor de desarrollo`,"settings.devServerStart":`Script de inicio`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script de parada`,"settings.devServerStopPlaceholder":`Opcional — el proceso se cerrará automáticamente si está vacío`,"settings.selectProject":`Selecciona un proyecto o añade uno nuevo`,"settings.projectPathRequired":`La ruta del proyecto es obligatoria.`,"settings.useGlobal":`Usar global`,"settings.saved":`Ajustes globales guardados.`,"settings.unsavedChanges":`Cambios sin guardar`,"settings.nav.general":`General`,"settings.nav.agents":`Agentes`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.workspaceTemplates":`Plantillas de workspace`,"workspaceTemplates.title":`Plantillas de workspace`,"workspaceTemplates.hint":`Preajustes guardados del formulario de creación. Elige uno en la página de creación; para modificarlo, cárgalo allí, ajústalo y guárdalo de nuevo con el mismo nombre.`,"workspaceTemplates.empty":`Todavía no hay plantillas. Rellena el formulario de creación y usa «Guardar como plantilla».`,"workspaceTemplates.anyProject":`Cualquier proyecto`,"workspaceTemplates.rename":`Renombrar`,"workspaceTemplates.renameTitle":`Renombrar la plantilla`,"workspaceTemplates.deleteConfirm":`¿Eliminar la plantilla «{name}»?`,"workspaceTemplates.deleted":`Plantilla «{name}» eliminada`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Las credenciales se guardan localmente y solo las usa bkt.`,"settings.bitbucketUsername":`Correo de Atlassian`,"settings.bitbucketToken":`Token API de Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voz`,"settings.nav.notifications":`Notificaciones`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Exportar`,"settings.help.general":`Idioma, acceso a la red y los valores por defecto que hereda cada proyecto.`,"settings.help.agents":`Modelos y permisos predeterminados, y límites de reintentos automáticos.`,"settings.help.skills":`Qué suites de skills se le indica usar al agente.`,"settings.help.prompts":`Instrucciones del agente tras abrir una PR/MR, para revisiones de código, correcciones CI y finalización.`,"settings.help.scripts":`Scripts de setup, limpieza y cambio de rama origen, además de los hooks de ciclo de vida.`,"settings.help.notion":`Importar una página de Notion como fuente de verdad de un workspace.`,"settings.help.sentry":`Crear un workspace a partir de una issue de Sentry.`,"settings.help.forge":`Credenciales de Bitbucket. GitHub y GitLab usan tu CLI gh/glab autenticada; elige la forja por proyecto.`,"settings.help.voice":`Dictado y push-to-talk.`,"settings.help.notifications":`Sonidos, notificaciones del navegador y recordatorio de preguntas sin responder.`,"settings.help.worktrees":`Dónde se crean los worktrees, retención y borrado automático.`,"settings.help.projects":`Proyectos registrados y sus ajustes específicos por proyecto.`,"settings.help.templates":`Plantillas de prompt expandidas en la entrada del chat.`,"settings.help.workspaceTemplates":`Presets guardados del formulario de creación.`,"settings.help.export":`Exportar e importar todos los ajustes como JSON.`,"settings.openNav":`Abrir la navegación`,"settings.saveError":`Error al guardar los ajustes.`,"settings.projectSaved":`Proyecto guardado.`,"settings.projectSaveError":`Error al guardar el proyecto.`,"settings.projectDeleted":`Proyecto eliminado.`,"settings.deleteProjectConfirmTitle":`¿Eliminar proyecto?`,"settings.deleteProjectConfirmMessage":`¿Quitar «{name}» de tus proyectos? Esto solo elimina sus ajustes de Kōbō — tu código y tus worktrees no se modifican.`,"settings.projectDeleteError":`Error al eliminar el proyecto.`,"templates.title":`Plantillas`,"templates.newTemplate":`Nueva plantilla`,"templates.editTemplate":`Editar plantilla`,"templates.deleteTemplate":`Eliminar plantilla`,"templates.deleteConfirm":`¿Eliminar la plantilla '/{slug}'?`,"templates.deleteConfirmMessage":`Esta acción no se puede deshacer.`,"templates.slug":`Slug`,"templates.slugHint":`Minúsculas, dígitos, guiones. Máx. 64 caracteres.`,"templates.slugInvalid":`El slug solo puede contener minúsculas, dígitos y guiones`,"templates.slugDuplicate":`Ya existe una plantilla con este slug`,"templates.description":`Descripción`,"templates.descriptionHint":`Etiqueta corta mostrada en el dropdown.`,"templates.descriptionRequired":`La descripción es obligatoria`,"templates.contentRequired":`El contenido es obligatorio`,"templates.content":`Contenido`,"templates.contentHint":`Contenido de la plantilla. Usa {variable_name} para las sustituciones.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Archivo: {path}`,"templates.empty":`Aún no hay plantillas.`,"templates.createFailed":`Error al crear la plantilla`,"templates.updateFailed":`Error al actualizar la plantilla`,"templates.deleteFailed":`Error al eliminar la plantilla`,"templates.save":`Guardar`,"templates.create":`Crear`,"templates.reloadDefaults":`Recargar plantillas predeterminadas`,"templates.reloadDefaultsHint":`Solo añade las plantillas predeterminadas que faltan. Las plantillas existentes (modificadas o no) nunca se sobrescriben.`,"templates.reloadDefaultsConfirmMessage":`Esta acción añadirá a la lista las plantillas predeterminadas que falten. Las plantillas existentes — incluidas las que hayas personalizado — no se tocarán. Si quieres restaurar una plantilla predeterminada que has modificado, elimínala primero y vuelve a ejecutar esta acción.`,"templates.reloadDefaultsSuccess":`{added} añadida(s), {kept} conservada(s)`,"templates.reloadDefaultsFailed":`Error al recargar las plantillas predeterminadas`,"templates.resetToDefault":`Restablecer al valor predeterminado`,"templates.resetConfirmTitle":`¿Restablecer la plantilla al valor predeterminado?`,"templates.resetConfirmMessage":`Esto sobrescribe tus cambios locales en /{slug} con el predeterminado. No se puede deshacer.`,"templates.resetSuccess":`Plantilla /{slug} restablecida al predeterminado`,"templates.resetFailed":`Error al restablecer la plantilla`,"chatInput.dropdownSkills":`Skills de Claude`,"chatInput.dropdownKobo":`Comandos Kōbō`,"chatInput.dropdownTemplates":`Plantillas`,"documents.title":`Documentos`,"documents.empty":`No se encontraron documentos`,"documents.refresh":`Actualizar`,"documents.back":`Volver`,"documents.loadFailed":`Error al cargar el documento`,"git.title":`Git`,"git.outputDialogTitle":`Git informó de un error`,"git.statsFailed":`No se pudo leer el estado de git`,"git.section.repository":`Repositorio`,"git.section.changes":`Cambios`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Acciones`,"git.actions.more":`Más`,"git.localOnly":`solo local`,"git.pushed":`pushed`,"git.unpushed":`{count} sin push`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Cargando commits…`,"git.commits.empty":`Sin commits en esta rama`,"git.commits.pushed":`Pusheado`,"git.commits.unpushed":`Sin pushear`,"git.commits.clickToAppend":`click para agregar SHA al chat`,"git.commits.diffThisCommit":`Diff de este commit (vs padre)`,"git.compareCommits":`Comparar commits…`,"git.files":`{count} archivo | {count} archivos`,"git.staged":`{count} staged`,"git.modified":`{count} modificados`,"git.untracked":`{count} sin seguimiento`,"git.workingTreeEmpty":`Sin cambios sin confirmar`,"git.fileStaged":`Preparado`,"git.fileModified":`Modificado`,"git.fileUntracked":`Sin seguimiento`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.pushRejectedHistory":`Push rechazado: las ramas local y remota tienen historiales distintos. Después de un rebase de commits publicados, use Force push con confirmación. En otro caso, obtenga e integre los cambios remotos antes de reintentarlo.`,"git.pushRejectedLease":`Force push rechazado: la rama remota cambió desde la última descarga. Obtenga y revise esos cambios antes de reintentarlo.`,"git.pushFailed":`No se pudo enviar la rama. Abra los detalles para ver la causa.`,"git.pushBlockedByOperation":`Primero termina o aborta la operación {operation} en curso`,"git.pushUpToDate":`Nada que enviar: la rama ya está actualizada en origin`,"git.forcePushHint":`Más seguro que --force: el push se rechaza si el remoto tiene commits que no has visto. Úsalo tras un rebase o amend de commits ya pusheados.`,"git.branchForcePushed":`Rama force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`No hay upstream para esta rama — hazle push primero para habilitar Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la rama primero`,"git.viewRequest":`Ver {request}`,"git.createRequest":`Crear {request}`,"git.changeRequestBase":`Cambiar la rama base de la {request}`,"git.forgeCliMissing":`{cli} no está instalado — instálalo para usar las funciones de {request}`,"git.forgeNotAuthenticated":`No autenticado — ejecuta {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Detección automática`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Ninguna`,"git.pullConfirmTitle":`¿Pull la rama?`,"git.pullConfirmMessage":`Pull {branch} desde el remoto (solo fast-forward).`,"git.branchPulled":`Rama actualizada`,"git.pullFailed":`Error al hacer pull`,"git.renameBranch":`Renombrar rama`,"git.renameBranchPrompt":"Renombrar `{branch}` a:","git.renameBranchSuccess":"Rama renombrada a `{branch}`","git.renameBranchFailed":`Error al renombrar la rama`,"git.renameBranchExists":"La rama `{branch}` ya existe localmente o en origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Abre el visor de diff en modo Review — comentarios en línea + envío por lotes al agente`,"pr.baseChanged":`Base de la PR cambiada: {oldBase} → {newBase}`,"pr.openPr":`Abrir PR`,"pr.openWorkspace":`Abrir el workspace`,"pr.dismiss":`Cerrar`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`¿Rebase de la rama?`,"git.rebaseConfirmMessage":`Rebase sobre {branch}. Pueden surgir conflictos.`,"git.rebaseSuccess":`Rebase completado`,"git.rebaseFailed":`Rebase fallido`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repositorio actualizado`,"git.fetchFailed":`Fallo al hacer fetch: {error}`,"git.mergeConfirmTitle":`¿Fusionar la rama?`,"git.mergeConfirmMessage":`Fusionar {branch} en esta rama. Puede haber conflictos.`,"git.mergeSuccess":`Merge completado`,"git.mergeFailed":`Merge fallido`,"git.commitFailed":`Commit fallido`,"git.commitChanges":`Confirmar cambios`,"git.commitDialogTitle":`Confirmar cambios sin confirmar`,"git.commitDialogDescription":`Escribe tu mensaje o pide al agente que revise y cree el commit.`,"git.commitMessage":`Mensaje de commit`,"git.commitManual":`Confirmar`,"git.commitWithAgent":`Pedir al agente`,"git.commitAgentSuccess":`Solicitud de commit enviada al agente`,"git.discardFailed":`Descarte fallido`,"git.conflictTitleMerge":`Conflictos de merge detectados`,"git.conflictTitleRebase":`Conflictos de rebase detectados`,"git.operationPausedTitle":`Operación Git para continuar`,"git.operationPausedSubtitle":`No hay archivos en conflicto. Git solo espera que continúes la operación.`,"git.conflictSubtitle":`{count} archivo(s) con conflictos. Elige cómo continuar.`,"git.conflictAbortConfirmTitle":`¿Descartar la resolución del conflicto?`,"git.conflictAbortConfirmMessage":`Todo lo que has resuelto en este {op} se descarta y el worktree vuelve a su estado anterior. Es irreversible.`,"git.conflictAbort":`Abortar`,"git.conflictContinue":`Continuar`,"git.conflictContinued":`Operación Git continuada`,"git.conflictResolveWithAgent":`Pedir al agente que resuelva`,"git.conflictAborted":`Operación abortada`,"git.conflictHandoffSuccess":`El agente está resolviendo los conflictos`,"git.dirtyTitleRebase":`Cambios sin confirmar bloquean el rebase`,"git.dirtyTitleMerge":`Cambios sin confirmar bloquean el merge`,"git.dirtyTitlePull":`Cambios sin confirmar bloquean el pull`,"git.dirtySubtitle":`{modified} modificado(s), {staged} preparado(s), {untracked} sin seguimiento. Elige cómo continuar.`,"git.dirtyStash":`Stash y reintentar`,"git.dirtyCommit":`Commit primero`,"git.dirtyCommitPlaceholder":`Mensaje del commit`,"git.dirtyCommitConfirm":`Commit y reintentar`,"git.dirtyDiscard":`Descartar cambios`,"git.dirtyDiscardConfirmTitle":`¿Descartar todos los cambios sin confirmar?`,"git.dirtyDiscardConfirmMessage":`Los cambios con seguimiento se perderán (git reset --hard). Los archivos sin seguimiento se conservan. Acción irreversible.`,"git.pushConfirmTitle":`¿Pushar la rama?`,"git.pushConfirmMessage":`Pushar {branch} al remoto.`,"git.pushConfirmMessagePrefix":`Pushar la rama`,"git.pushConfirmMessageSuffix":`al remoto.`,"git.changePrBaseTitle":`Cambiar rama base`,"git.changePrBaseMessage":`Ingrese la nueva rama destino para el {request}.`,"git.changePrBaseSuccess":`Rama base de la {request} actualizada`,"git.changePrBaseFailed":`No se pudo cambiar la rama base de la {request}`,"git.mergeRequest":`Fusionar {request}`,"git.mergeRequestConfirmTitle":`¿Fusionar {request}?`,"git.mergeRequestConfirmMessage":`Esto fusionará la {request} abierta en su rama de destino.`,"git.mergeRequestSuccess":`{request} fusionada`,"git.mergeRequestFailed":`No se pudo fusionar {request}`,"git.deleteRemoteBranch":`Eliminar rama remota`,"git.deleteRemoteBranchTitle":`¿Eliminar rama remota?`,"git.deleteRemoteBranchMessage":`La solicitud se fusionó. ¿Eliminar la rama remota {branch}?`,"git.deleteRemoteBranchSuccess":`Rama remota {branch} eliminada`,"git.deleteRemoteBranchFailed":`No se pudo eliminar la rama remota`,"git.changeSourceBranch":`Cambiar la rama de origen`,"git.changeSourceBranchTitle":`Cambiar la rama de origen`,"git.changeSourceBranchMessage":`Elige la nueva rama de origen. La rama de trabajo se reconstruirá encima.`,"git.changeSourceBranchDone":`Rama de origen cambiada a {branch}`,"git.changeSourceBranchAligned":`Rama de origen cambiada a {branch} (la rama no tenía commits propios)`,"git.changeSourceBranchTooMany":`La rama tiene demasiados commits propios ({n}) — rebásala manualmente`,"git.changeSourceBranchDirty":`Haz commit o stash de tus cambios antes de cambiar la rama de origen`,"git.changeSourceBranchAgentRunning":`Detén el agente antes de cambiar la rama de origen`,"git.changeSourceBranchErrorTitle":`Error al cambiar la rama de origen`,"git.changeSourceBranchErrorOngoing":`Una operación {op} sigue en curso en el worktree. Cancélala para volver a un estado limpio.`,"git.changeSourceBranchErrorAbort":`Cancelar la operación`,"git.changeSourceBranchLoading":`Cambiando la rama de origen…`,"git.changeSourceForcePushTitle":`¿Forzar el push de la rama reescrita?`,"git.changeSourceForcePushMessage":`El historial de la rama se reescribió. ¿Hacer force-push al remoto con --force-with-lease?`,"git.changeSourceForcePushDone":`Rama enviada con force-push`,"git.openEditor":`Abrir en editor`,"git.openEditorFailed":`No se pudo abrir el editor`,"git.branchPushed":`Rama enviada`,"git.pushFirst":`La rama no está en el remoto. Haz Push primero.`,"git.unpushedCommits":`Los commits locales no están enviados. Haz Push primero.`,"git.from":`desde`,"git.aheadBehindTooltip":`{ahead} commits por delante, {behind} por detrás de {source}`,"git.divergence.title":`Divergencia de rama`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} por delante`,"git.divergence.behind":`↓ {count} por detrás`,"git.divergence.empty.ahead":`Sin commits por delante.`,"git.divergence.empty.behind":`Sin commits por detrás.`,"git.divergence.close":`Cerrar`,"git.divergence.loading":`Cargando commits…`,"git.divergence.failed":`No se pudo cargar la divergencia`,"git.divergence.retry":`Reintentar`,"git.prCreated":`{request} #{n} creada`,"git.pr.author":`Autor`,"git.pr.reviewers":`Revisores`,"git.pr.assignees":`Asignados`,"git.pr.labels":`Etiquetas`,"git.pr.changesRequestedBadge":`Cambios solicitados`,"git.pr.approvedBadge":`Aprobada`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI fallida`,"git.pr.ci.pending":`CI en curso`,"git.pr.ci.failedCount":`{n} fallido(s)`,"git.pr.ci.pendingCount":`{n} en curso`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} omitido(s)`,"git.pr.ci.showPassed":`Mostrar {n} jobs OK`,"git.pr.ci.hidePassed":`Ocultar los jobs OK`,"toast.prChangesRequested":`Se solicitaron cambios en la PR #{n}`,"toast.prApproved":`La PR #{n} ha sido aprobada`,"toast.prReadyToMerge":`La PR #{n} está lista para merge`,"toast.prCiFailed":`La CI de la PR #{n} ha fallado`,"toast.prCiRecovered":`La CI de la PR #{n} se ha recuperado`,"toast.prMergeConflict":`La PR #{n} tiene conflictos de merge`,"toast.prMerged":`La PR #{n} se ha fusionado`,"devServer.title":`Servidor de desarrollo`,"devServer.noWorkspace":`Ningún workspace seleccionado`,"devServer.notConfigured":`No configurado —`,"devServer.goToSettings":`Ajustes`,"devServer.logs":`Logs`,"devServer.running":`En ejecución`,"devServer.starting":`Iniciando`,"devServer.stopping":`Deteniendo`,"devServer.error":`Error`,"devServer.stopped":`Detenido`,"devServer.unknown":`Desconocido`,"devServer.containers":`{count} contenedor | {count} contenedores`,"devServer.logDialog.title":`Logs del servidor de desarrollo`,"devServer.logDialog.empty":`No hay logs disponibles`,"notion.title":`Notion`,"tasks.title":`Tareas`,"notion.addTask":`Añadir tarea`,"notion.noUrl":`Sin URL de Notion`,"notion.subtasks":`{done}/{total} subtareas`,"notion.noTasks":`Sin tareas`,"notion.newTask":`Nueva tarea... (Enter para añadir, Esc para cancelar)`,"acceptance.title":`Criterios de aceptación`,"acceptance.addCriterion":`Añadir criterio`,"acceptance.newCriterion":`Nuevo criterio... (Enter para añadir, Esc para cancelar)`,"acceptance.empty":`Sin criterios de aceptación`,"tasks.askProgress":`Pedir al agente que revise el progreso`,"agentTodos.title":`Tareas del agente`,"agentTodos.empty":`Sin tareas del agente`,"subagents.title":`Sub-agentes`,"subagents.empty":`Aún no hay actividad de sub-agentes`,"subagents.tools":`{count} herramientas`,"subagents.running":`En ejecución: `,"subagents.status.running":`En ejecución`,"subagents.status.done":`Completado`,"subagents.status.failed":`Fallido`,"subagents.status.stopped":`Detenido`,"subagents.ambient":`Vigilancia en segundo plano`,"subagents.ambientTooltip":`Vigilancia en segundo plano (p. ej. Monitor): no cuenta como actividad del agente`,"subagents.stop":`Detener este sub-agente`,"subagents.stopAll":`Detener todos`,"subagents.stopFailed":`No se pudo detener el sub-agente: {error}`,"subagents.activity":`Actividad del subagente`,"subagents.noActivity":`Aún no hay actividad visible del proveedor`,"chat.subagentActivity":`Actividad del subagente`,"chat.openSubagentActivity":`Abrir este subagente en el panel lateral`,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Bucket de uso {n}`,"quotaFooter.lastUpdated":`Última actualización: {time}`,"quotaFooter.empty":`Cargando…`,"quotaFooter.popover.title":`Uso de Claude Code`,"quotaFooter.popover.refreshNow":`Actualizar`,"quotaFooter.popover.resetsIn":`Se reinicia a las {value}`,"quotaFooter.popover.unauthenticated":`Auth requerida`,"quotaFooter.popover.unauthenticatedHint":`Ejecuta "claude" una vez para autenticarte.`,"quotaFooter.popover.error":`Error`,"quotaFooter.bucket.fiveHour":`5 horas`,"quotaFooter.bucket.sevenDay":`7 días`,"agent.error.spawn_failed":`No se pudo iniciar el agente`,"agent.error.parse_error":`No se pudo analizar un mensaje del agente`,"agent.error.rate_limit":`Límite de tasa alcanzado`,"agent.error.resume_failed":`Sesión no encontrada — iniciando sesión nueva`,"agent.error.other":`Error del agente`,"quotaBackoff.banner.title":`Reanudación automática a las {time}`,"quotaBackoff.banner.transientTitle":`Reanudación automática tras interrupción a las {time}`,"quotaBackoff.resumeNow":`Reanudar ahora`,"quotaBackoff.banner.tooltip":`Cuota de Claude agotada. El auto-loop se reanudará automáticamente cuando la cuota se restablezca a las {resets_at}.`,"quotaBackoff.banner.cancel":`Cancelar reanudación`,"quotaBackoff.cancelled":`Reanudación automática cancelada — puedes reanudar manualmente cuando quieras`,"rateLimitType.fiveHour":`Sesión 5h`,"rateLimitType.sevenDay":`Semanal`,"tooltip.addTask":`Añadir tarea`,"tooltip.removeTask":`Eliminar tarea`,"tooltip.addCriterion":`Añadir criterio`,"tooltip.removeCriterion":`Eliminar criterio`,"tooltip.startDevServer":`Iniciar servidor de desarrollo`,"tooltip.stopDevServer":`Detener servidor de desarrollo`,"tooltip.closeDiffViewer":`Cerrar visor de diff`,"tooltip.refreshLogs":`Actualizar logs`,"tooltip.closeDialog":`Cerrar`,"tooltip.refreshGitStats":`Actualizar estadísticas Git`,"tooltip.removeImage":`Eliminar imagen`,"tooltip.sendMessage":`Enviar mensaje`,"tools.title":`Herramientas`,"tools.runSetupScript":`Volver a ejecutar script de setup`,"tools.runSetupScriptTooltip":`Ejecutar el script de setup del proyecto en el worktree`,"tools.runSetupScriptConfirm":`¿Volver a ejecutar el script de setup en este workspace? Los artefactos existentes pueden ser sobrescritos.`,"tools.runSetupScriptBusy":`No se puede volver a ejecutar el setup mientras el agente está trabajando.`,"tools.noSetupScript":`Ningún script de setup configurado —`,"tools.setupScriptSuccess":`Script de setup completado con éxito.`,"tools.setupScriptFailed":`Falló el script de setup.`,"tools.openNotion":`Abrir en Notion`,"tools.openSentry":`Abrir en Sentry`,"tools.review":`Revisar cambios`,"tools.reviewTooltip":`Pedir al agente que revise los cambios de esta rama`,"tools.reviewBusy":`Agente ocupado — espera a que esté libre`,"tools.fixCi":`Reparar CI`,"tools.fixCiTooltip":`Pedir al agente que diagnostique y arregle los jobs de CI que fallan`,"tools.fixCiLaunched":`Acción «Reparar CI» enviada al agente`,"tools.fixCiFailed":`No se pudo lanzar la acción «Reparar CI»`,"tools.openFileManager":`Abrir en el explorador de archivos`,"tools.openFileManagerTooltip":`Abrir la carpeta del worktree en tu explorador de archivos configurado`,"tools.openFileManagerFailed":`No se pudo abrir el explorador de archivos`,"tools.openTerminal":`Abrir en terminal`,"tools.openTerminalTooltip":`Abrir el worktree en tu terminal configurada`,"tools.openTerminalFailed":`No se pudo abrir la terminal`,"review.title":`Iniciar revisión`,"review.subtitle":`Pide al agente que revise tus cambios y dé feedback.`,"review.additionalInstructions":`Instrucciones adicionales (opcional)`,"review.additionalInstructionsPlaceholder":`Añade instrucciones específicas para la revisión…`,"review.newSession":`Nueva sesión`,"review.newSessionHint":`Inicia una sesión nueva en vez de continuar la actual.`,"review.newSessionRequired":`Cambiar los ajustes del agente o volver automáticamente requiere una nueva sesión.`,"review.returnToSession":`Volver a la sesión actual después de la revisión`,"review.returnToSessionHint":`Reanuda esta sesión con el resumen final del revisor. Si se desactiva, la conversación continúa en la sesión de revisión.`,"review.readOnlyForced":`Una review que vuelve a esta sesión se ejecuta en solo lectura (Plan): no puede modificar archivos ni hacer preguntas.`,"review.returnUnavailable":`La sesión actual debe haberse iniciado para poder reanudarla.`,"review.start":`Iniciar revisión`,"review.cancel":`Cancelar`,"review.launched":`Revisión iniciada`,"review.failed":`No se pudo iniciar la revisión`,"diff.title":`Diff`,"diff.side":`Lado a lado`,"diff.inline":`En línea`,"diff.hideUnchanged":`Ocultar código sin cambios`,"diff.showUnchanged":`Mostrar código sin cambios`,"diff.showUntracked":`Mostrar archivos no rastreados`,"diff.hideUntracked":`Ocultar archivos no rastreados`,"diff.rollbackToRemote":`Restaurar a la versión remota`,"diff.rollbackConfirm":`¿Restaurar {path} a su versión remota (origin)? Los cambios locales en este archivo se perderán.`,"diff.rollbackConfirmOk":`Restaurar`,"diff.rollbackDone":`Archivo restaurado a la versión remota`,"diff.rollbackDoneRemote":`Archivo restaurado a la versión remota`,"diff.rollbackDoneHead":`Cambios locales descartados (archivo restaurado al último commit)`,"diff.rollbackDoneDeleted":`Archivo no rastreado eliminado`,"diff.deleteUntracked":`Eliminar archivo no rastreado`,"diff.deleteUntrackedConfirm":`¿Eliminar definitivamente {path}? Este archivo no está rastreado por git — su contenido se perderá.`,"diff.deleteUntrackedConfirmOk":`Eliminar`,"diff.rollbackFailed":`Falló el rollback`,"diff.rollbackFailedDetail":`Rollback fallido: {error}`,"diff.modeInspect":`Editar`,"diff.modeReview":`Review`,"diff.addComment":`Añadir comentario`,"diff.replyComment":`Responder`,"diff.editComment":`Editar`,"diff.deleteComment":`Eliminar`,"diff.deleteCommentConfirm":`¿Eliminar este comentario?`,"diff.commentPlaceholder":`Escribe un comentario de revisión… (Markdown soportado)`,"diff.reviewDraft":`Borrador de revisión`,"diff.reviewEmpty":`Aún no hay comentarios — pasa el cursor sobre una línea del diff y haz clic en + para añadir uno.`,"diff.reviewGlobalPlaceholder":`Mensaje general de revisión (opcional)`,"diff.submitReview":`Enviar revisión ({n})`,"diff.reviewPending":`Ya se está enviando una revisión.`,"diff.reviewEmptySubmission":`La revisión está vacía.`,"diff.reviewNotAccepted":`El mensaje no fue aceptado. Tu revisión se ha conservado.`,"diff.reviewSubmitted":`Revisión enviada al agente`,"diff.reviewSubmitFailed":`No se pudo enviar la revisión: {error}`,"diff.scopeBranch":`Branch`,"diff.scopeUnpushed":`Sin pushear`,"diff.noChanges":`Sin cambios`,"diff.searchFiles":`Buscar archivos…`,"diff.noFileMatch":`Ningún archivo coincide`,"diff.selectFile":`Selecciona un archivo para ver el diff`,"diff.fileLoadFailed":`No se pudo cargar este diff`,"diff.fileLoadFailedHint":`El archivo en disco está intacto — solo falló la carga del diff.`,"diff.fileListLoadFailed":`No se pudo cargar la lista de archivos`,"diff.fileListLoadFailedHint":`Es un fallo de la petición, no una rama sin cambios.`,"diff.addToChat":`Añadir al chat`,"diff.compareTitle":`Comparar commits`,"diff.compareFrom":`Desde`,"diff.compareTo":`Hasta`,"diff.compareSubmit":`Comparar`,"diff.compareSourceBase":`{branch} (base de la rama)`,"diff.commitsReadOnly":`solo lectura`,"diffViewer.save":`Guardar`,"diffViewer.savedAt":`Guardado`,"diffViewer.saveFailed":`Error al guardar`,"diffViewer.saveFailedDetail":`Error al guardar: {error}`,"diffViewer.unsavedChanges.title":`Cambios sin guardar`,"diffViewer.unsavedChanges.message":`Tienes cambios sin guardar. ¿Qué quieres hacer?`,"diffViewer.unsavedChanges.save":`Guardar`,"diffViewer.unsavedChanges.cancel":`Cancelar`,"diffViewer.conflict.title":`Archivo modificado en disco`,"diffViewer.conflict.message":`El archivo fue modificado fuera de Kōbō desde que lo abriste.`,"diffViewer.conflict.reload":`Recargar (descartar cambios locales)`,"diffViewer.conflict.keep":`Mantener los míos`,"diffViewer.conflict.overwrite":`Sobrescribir de todos modos`,"diffViewer.conflict.overwriteHint":`Reemplaza el archivo del disco por tu versión. El otro cambio se pierde.`,"diffViewer.conflict.keepHint":`Mantiene tus cambios en el editor y adopta la nueva firma del disco, para que el próximo guardado funcione.`,"diffViewer.saveBlocked":`El agente está en marcha — detenlo para guardar tus cambios.`,"diffViewer.unsavedBanner":`Cambios sin guardar. Detén el agente para guardarlos.`,"diffViewer.closeConfirm.title":`Cambios sin guardar`,"diffViewer.closeConfirm.message":`Este archivo tiene cambios que nunca se guardaron. Cerrar el visor de diferencias los descarta.`,"diffViewer.closeConfirm.discard":`Cerrar sin guardar`,"diffViewer.criteriaRail":`Checklist de revisión`,"diffViewer.criteriaRailShow":`Mostrar la checklist de revisión`,"diffViewer.criteriaRailHide":`Ocultar la checklist de revisión`,"diffViewer.fileTreeShow":`Mostrar el árbol de archivos`,"diffViewer.fileTreeHide":`Ocultar el árbol de archivos`,"diffViewer.closeConfirm.saveAndClose":`Guardar y cerrar`,"diffViewer.agentRunning":`El agente está activo — detenlo para editar`,"diffViewer.fileDeleted":`Archivo eliminado`,"notification.agentFinished":`{name} — Agente terminado`,"notification.agentQuestion":`{name} — El agente hace una pregunta`,"notification.awaitingReminder":`{name} - sigue esperándote ({minutes} min)`,"notification.agentPermissionRequest":`{name} — El agente solicita un permiso`,"notification.autoLoopCompleted":`{name} — Auto-loop completado`,"notification.autoLoopWaitingForSlot":`{name} - El auto-loop espera un slot de agente libre ({running}/{limit} en curso)`,"notification.autoLoopStalled":`{name} — Auto-loop bloqueado (sin progreso)`,"notification.autoLoopError":`{name} — Auto-loop detenido por error`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pausa, esperando tu aclaración`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop forzó el modo plan a bypass`,"notification.agentError":`{name} — Error del agente`,"contextMenu.rename":`Renombrar`,"contextMenu.editDescription":`Editar la descripción`,"contextMenu.copyPath":`Copiar ruta del worktree`,"contextMenu.copyWorkspaceId":`Copiar ID del workspace`,"contextMenu.openEditor":`Abrir en editor`,"contextMenu.openFileManager":`Abrir en el explorador de archivos`,"contextMenu.unarchiveDisabledPurged":`Restaura primero el worktree con Restaurar worktree o recréalo manualmente. Kōbō detecta automáticamente los worktrees correspondientes.`,"workspaceList.unarchiveBlockedPurged":`Restaura primero el worktree con Restaurar worktree o recréalo manualmente. Kōbō detecta automáticamente los worktrees correspondientes.`,"contextMenu.purgeWorktree":`Liberar espacio en disco (borrar worktree)`,"contextMenu.purgeWorktreeTooltip":`Borra el worktree del disco para recuperar espacio — el historial de mensajes y sesiones se conserva. Archiva automáticamente el workspace.`,"contextMenu.purgeWorktreeDialogTitle":`¿Liberar espacio en disco?`,"contextMenu.purgeWorktreeDialogMessage":`La carpeta del worktree de «{name}» será eliminada del disco. El historial de mensajes y sesiones se conserva. El workspace se archivará automáticamente. Esta acción no se puede deshacer en la versión actual.`,"contextMenu.purgeWorktreeDialogConfirm":`Borrar el worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree borrado — espacio en disco recuperado.`,"settings.autoPurgeOnPrMerged":`Borrar worktree al mergear la PR`,"settings.autoPurgeOnPrMergedHint":`Cuando está activado, el worktree se borra del disco en cuanto se mergea la PR (además del archivado automático). El historial de mensajes se conserva.`,"settings.forceImmediateMessages":`Forzar el envío inmediato de mensajes`,"settings.forceImmediateMessagesHint":`Desactivado por defecto. Envía nuevos mensajes mientras el agente trabaja, como Ctrl+Enter, sin ponerlos en cola. En auto-loop, envía ahora y pausa el bucle. Los mensajes ya en cola no cambian; se mantienen los bloqueos de compactación y permisos.`,"settings.showProgressBars":`Mostrar barras de progreso`,"settings.showProgressBarsHint":`Activado de forma predeterminada. Ocultar las barras no cierra las actividades ni detiene su seguimiento. Los cambios se aplican al guardar.`,"tours.settings.immediateMessages.title":`Envío inmediato`,"tours.settings.immediateMessages.description":`Activa este ajuste para enviar nuevos mensajes directamente, como Ctrl+Enter. Desactivado por defecto: los mensajes esperan al final del turno.`,"tours.settings.progressBars.title":`Barras de progreso`,"tours.settings.progressBars.description":`Muestra u oculta las barras sobre el campo de mensaje. El seguimiento continúa mientras están ocultas.`,"settings.agentWatchdogEnabled":`Activar los watchdogs de inactividad de los agentes`,"settings.agentWatchdogHint":`Desactivados por defecto. Si se activan, Kōbō puede detener Claude o Codex tras un silencio prolongado, incluidas herramientas, subagentes y compactación. Se aplica al iniciar o reanudar el agente.`,"tours.settings.agentWatchdog.title":`Watchdogs de inactividad`,"tours.settings.agentWatchdog.description":`Deja esta opción desactivada para permitir esperas largas sin actividad visible. Actívala para cerrar automáticamente sesiones bloqueadas. Se aplica al iniciar o reanudar el agente.`,"settings.autoLoopMaxRetries":`Máximo de reintentos automáticos`,"settings.awaitingUserReminder":`Recordatorio de pregunta sin responder`,"settings.awaitingUserReminderHint":`Minutos que un workspace puede esperar tu respuesta antes de que Kōbō te avise, y luego en cada intervalo siguiente. 0 lo desactiva.`,"settings.localeLoadFailed":`No se pudo cargar ese idioma; se mantiene el actual.`,"settings.autoLoopMaxRetriesHint":`Pausa la misión tras este número de fallos temporales del motor o del servidor. Las cuotas esperan su restablecimiento y no consumen este límite.`,"settings.retentionTitle":`Retención del historial de conversación (desactivada por defecto)`,"settings.retentionWarning":`Activar esta opción elimina definitivamente de la base de datos el historial de conversación de los agentes, empezando por todo lo que ya sea más antiguo que la ventana. Los eventos eliminados no se pueden recuperar.`,"settings.retentionHint":`Se ejecuta una vez al arrancar el servidor. Los workspaces, tareas, sesiones, branches y worktrees nunca se tocan — solo la salida registrada de los agentes.`,"settings.retentionDaysLabel":`Eliminar eventos más antiguos de (días)`,"settings.retentionDaysHint":`0 — el valor por defecto — conserva todos los eventos indefinidamente. Indica un valor para activar la retención.`,"settings.retentionKeepLabel":`Eventos siempre conservados por workspace`,"settings.retentionKeepHint":`Los eventos más recientes de cada workspace sobreviven sea cual sea su antigüedad, para que un workspace antiguo pero aún abierto conserve un historial legible. Sugerido: 5000.`,"settings.retentionDisabledHint":`Retención desactivada: nunca se eliminará nada.`,"settings.retentionConfirmTitle":`¿Eliminar definitivamente el historial de conversación?`,"settings.retentionConfirmMessage":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, {count} de los {total} eventos de agente registrados — incluido todo lo que ya sea más antiguo. Es irreversible. ¿Continuar?`,"settings.retentionConfirmMessageUnknown":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, todos los eventos de agente más antiguos — incluido todo lo ya acumulado. No se ha podido calcular el volumen exacto. Es irreversible. ¿Continuar?`,"settings.purgeDocsTitle":`Cómo funciona el borrado — restauración y permisos`,"settings.purgeDocsRestoreTitle":`Restaurar un worktree borrado (detección automática)`,"settings.purgeDocsRestoreIntro":`Un workspace borrado conserva su historial de chat y los metadatos de la PR, pero la carpeta worktree ya no existe. Recréala manualmente con uno de estos comandos — Kōbō detecta la reaparición de la carpeta en menos de 30 segundos y reactiva automáticamente el workspace (desarchivar + limpiar flag de borrado):`,"settings.purgeDocsRestoreCommands":`# GitHub (con CLI gh):
|
|
11
|
+
# tu script — usa $KOBO_NEW_BASE / $KOBO_OLD_BASE / $KOBO_WORKING_BRANCH …`,"settings.changeSourceBranchScript.resetDefault":`Restablecer al predeterminado de Kōbō`,"settings.changeSourceBranchScript.replaceConfirmTitle":`¿Restablecer el script?`,"settings.changeSourceBranchScript.replaceConfirm":`Tus modificaciones se reemplazarán por el script predeterminado de Kōbō. ¿Continuar?`,"settings.cleanupScriptHint":`Script de shell ejecutado en el worktree después de cada sesión del agente. En modo auto-loop solo se ejecuta cuando todas las tareas están terminadas. Dejar vacío para desactivar.`,"settings.cleanupScriptPlaceholder":`p. ej. eliminar archivos temporales, detener contenedores…`,"settings.cleanupScriptMode":`Cuándo ejecutar`,"settings.cleanupScriptMode.idle":`Después de cada sesión — aunque queden tareas`,"settings.cleanupScriptMode.noTasks":`Solo cuando no queda ninguna tarea de Kōbō`,"settings.cleanupScriptOnlyOnChanges":`Ejecutar solo si se modificaron, añadieron o eliminaron archivos`,"settings.cleanupScriptMode.inherit":`Heredar la configuración global`,"settings.taskPromptTemplate":`Prompt de tarea`,"settings.taskPromptTemplatePlaceholder":`Prompt insertado automáticamente en la descripción de la tarea…`,"settings.taskPromptTemplateHint":`Se inyecta automáticamente en la descripción de la tarea en la página de creación cuando este proyecto está seleccionado. Si no se modifica, se reemplaza al cambiar de proyecto; en cuanto lo editas, se conserva tu texto.`,"settings.setupScriptPlaceholder":`npm install`,"settings.setupScriptHint":`Se ejecuta con bash en el worktree después de su creación, antes de que el agente inicie. No necesita shebang. Si falla, el workspace se establece en error. Timeout: 5 minutos.`,"settings.e2e.title":`Tests E2E`,"settings.e2e.framework":`Framework`,"settings.e2e.frameworkNone":`Ninguno`,"settings.e2e.frameworkOther":`Otro`,"settings.e2e.skill":`Skill (opcional)`,"settings.e2e.skillPlaceholder":`p. ej. cypress-tester`,"settings.e2e.prompt":`Guía personalizada (opcional)`,"settings.e2e.promptPlaceholder":`p. ej. usar el patrón page-object, apuntar a data-testid`,"settings.e2e.helpText":`Cuando está configurado, el agente de grooming auto-loop inserta subtareas E2E para funciones UI.`,"settings.finalization.title":`Finalización del auto-loop`,"settings.finalization.helpText":`Opcional: un prompt que el agente ejecuta como la última iteración del auto-loop. Típicamente usado para controles de calidad finales (lint, typecheck, tests). La fase de grooming creará una tarea con prefijo [FINAL] que usará este prompt.`,"settings.finalization.prompt":`Prompt de finalización`,"settings.finalization.promptPlaceholder":`p. ej. Ejecuta npm run lint y npm test, luego marca esta tarea como hecha.`,"settings.editorCommand":`Comando del editor`,"settings.editorCommandPlaceholder":`code, phpstorm, subl, vim...`,"settings.editorCommandHint":`Comando para abrir el worktree en su editor. La ruta del worktree se pasa como argumento.`,"settings.fileManagerCommand":`Comando del explorador de archivos`,"settings.fileManagerCommandPlaceholder":`xdg-open, open, nautilus, dolphin, explorer...`,"settings.fileManagerCommandHint":`Comando para abrir el worktree en su explorador de archivos. La ruta del worktree se pasa como argumento. Déjalo vacío para ocultar el botón.`,"settings.terminalCommand":`Comando de terminal`,"settings.terminalCommandHint":`Comando para abrir tu terminal en el worktree. Marcador {path} opcional para el directorio.`,"settings.terminalCommandPlaceholder":`kitty · alacritty · gnome-terminal --working-directory={path}`,"settings.mcpSelection":`Selección MCP de Claude`,"settings.mcpAutoSelect":`Auto (primer MCP activo que coincide)`,"settings.notionMcp":`Clave MCP de Notion`,"settings.sentryMcp":`Clave MCP de Sentry`,"settings.mcpSelectionHint":`Las entradas activas se leen desde ~/.claude.json. Deja Auto para usar el comportamiento por defecto.`,"settings.configuredProjects":`Proyectos configurados`,"settings.noProjects":`No hay proyectos configurados`,"settings.addProject":`Añadir proyecto`,"settings.copyFrom":`Copiar ajustes desde`,"settings.copyFromPlaceholder":`(ninguno — partir de los valores por defecto)`,"settings.copyFromHint":`Copia todos los ajustes excepto path, nombre y rama fuente.`,"settings.copyFromConfirmTitle":`¿Sobrescribir los valores actuales?`,"settings.copyFromConfirm":`Se sobrescribirán los valores del formulario con los ajustes de «{project}». ¿Continuar?`,"settings.newProject":`Nuevo proyecto`,"settings.editProject":`Editar proyecto`,"help.title":`Ayuda`,"help.tours":`Visitas guiadas`,"help.steps":`{n} paso | {n} pasos`,"help.markAllSeen":`Marcar todas como vistas`,"help.markAllSeenHint":`Marca las visitas actuales como vistas sin iniciarlas.`,"help.resetAll":`Restablecer todas las visitas`,"help.resetAllHint":`Inicia ahora la visita de inicio; cada pantalla repetirá la suya al abrirla de nuevo.`,"help.status.unseen":`no vista`,"help.status.partial":`en parte`,"help.status.seen":`vista`,"help.replayThis":`Repetir la visita de esta pantalla`,"tours.next":`Siguiente`,"tours.prev":`Atrás`,"tours.done":`Terminar`,"tours.exitConfirm":`¿Salir de la visita guiada? No volverá a iniciarse sola; puedes repetirla cuando quieras desde el menú Ayuda.`,"tours.home.title":`Orientarse`,"tours.home.list.title":`Workspaces`,"tours.home.list.description":`Cada misión vive aquí con su estado. Los badges señalan una CI fallida, una review que pide cambios o una PR lista para merge. Arrastra el borde interior de un panel lateral con el ratón o el dedo para cambiar su tamaño. Los botones superiores se distribuyen en varias líneas si falta espacio.`,"tours.home.create.title":`Crear un workspace`,"tours.home.create.description":`Un workspace es un worktree de Git, una rama y una sesión de agente para una tarea.`,"tours.home.search.title":`Búsqueda`,"tours.home.search.description":`Filtra la lista por nombre. El icono de búsqueda de arriba abre la búsqueda de texto completo en las conversaciones de los agentes.`,"tours.home.dashboard.title":`Panel`,"tours.home.dashboard.description":`Una tabla con todos los workspaces activos: estado, atención, PR, diff, actividad y la fiabilidad de los motores.`,"tours.home.health.title":`Salud y changelog`,"tours.home.health.description":`Comprueba la base de datos, los runtimes y los agentes activos. El botón de al lado lista lo que cambió en cada versión.`,"tours.home.settings.title":`Ajustes`,"tours.home.settings.description":`Motores, integraciones, automatización, worktrees y proyectos. Ahora crea tu primer workspace.`,"tours.create.title":`Crear un workspace`,"tours.create.project.title":`Proyecto y rama`,"tours.create.project.description":`Elige el proyecto y la rama de la que parte el worktree.`,"tours.create.mission.title":`Misión`,"tours.create.mission.description":`Describe la tarea, o impórtala desde una página de Notion o una issue de Sentry.`,"tours.create.template.title":`Templates`,"tours.create.template.description":`Aplica un preset guardado, o guarda este formulario como preset. «Duplicar» en una tarjeta de workspace abre este formulario ya rellenado.`,"tours.create.engine.title":`Motor y modelo`,"tours.create.engine.description":`Claude Code o Codex, el modelo, el esfuerzo de razonamiento y lo que el agente puede hacer sin preguntar.`,"tours.create.brainstorm.title":`Brainstorm en otro modelo`,"tours.create.brainstorm.description":`Ejecuta la primera sesión de brainstorming en otro modelo y vuelve al principal para las iteraciones.`,"tours.create.autoloop.title":`Auto-loop`,"tours.create.autoloop.description":`El agente completa las tareas y las verificaciones finales. Una review final independiente opcional se repite tras las correcciones hasta que no queden hallazgos; si no hay progreso, el bucle se pausa.`,"tours.create.finalReview.title":`Configurar la review final`,"tours.create.finalReview.description":`Elige de antemano el motor, el modelo, el esfuerzo y las instrucciones del reviewer. La review se ejecuta en una sesión separada de solo lectura; el agente original corrige los hallazgos y la review se repite hasta que no quede ninguno.`,"tours.workspace.finalReview.title":`Review final y correcciones`,"tours.workspace.finalReview.description":`Configura aquí el reviewer final opcional antes de iniciarlo. Tras las tareas y las verificaciones finales, una sesión separada revisa el trabajo. Los hallazgos vuelven a la sesión original para corregirlos automáticamente y repetir la review. Cerrar Kōbō conserva el ciclo.`,"tours.workspace.reviewReturn.title":`Volver de una review`,"tours.workspace.reviewReturn.description":`El resumen vuelve a la sesión original incluso tras reiniciar Kōbō. Si la entrega es incierta, consulta esa conversación antes de Reintentar; Cancelar abandona el retorno. Las reviews manuales esperan tus instrucciones antes de corregir; auto-loop corrige automáticamente.`,"tours.create.comparison.title":`Comparar dos motores`,"tours.create.comparison.description":`Crea dos workspaces gemelos sobre la misma tarea y compara sus commits, tareas y actividad.`,"tours.workspace.sessions.title":`Sesiones del workspace`,"tours.workspace.sessions.description":`Pulsa el título para elegir, crear o renombrar una sesión, o copiar su identificador.`,"tours.workspace.actions.title":`Acciones del workspace`,"tours.workspace.actions.description":`El menú ⋯ reúne la vista en paralelo, la paleta de comandos y la visita guiada. El botón justo a su derecha abre o cierra el panel lateral.`,"tours.workspace.title":`Dentro de un workspace`,"tours.workspace.chat.title":`Conversación`,"tours.workspace.chat.description":`La salida del agente, en directo: mensajes, llamadas a herramientas, preguntas y errores.`,"tours.workspace.input.title":`Hablar con el agente`,"tours.workspace.input.description":`Envía un mensaje, usa slash commands, dicta por voz o adjunta archivos.`,"tours.workspace.selectors.title":`Ajustes de sesión`,"tours.workspace.selectors.description":`Abre Configurar para ajustar modelo, esfuerzo, permisos y auto-loop. También muestra el motor actual.`,"tours.workspace.status.title":`Estado`,"tours.workspace.status.description":`El estado de la sesión actual; detenla aquí cuando haga falta.`,"tours.workspace.git.title":`Git`,"tours.workspace.git.description":`Commits, diff, push, rebase y la PR de esta rama. El diff se abre en línea. La edición se desactiva mientras un agente trabaja; Sin push incluye commits locales y archivos sin commit.`,"tours.workspace.tasks.title":`Tareas`,"tours.workspace.tasks.description":`Lo que el agente planea hacer, y los criterios de aceptación que debe cumplir.`,"tours.workspace.timeline.title":`Cronología`,"tours.workspace.timeline.description":`Todas las sesiones de este workspace; abre una anterior para releerla.`,"tours.workspace.subagents.title":`Subagentes`,"tours.workspace.subagents.description":`Sigue los subagentes que lanzó el agente, con su progreso en directo.`,"tours.workspace.documents.title":`Documentos`,"tours.workspace.documents.description":`Planes y archivos que escribió el agente, consultables sin salir del chat.`,"tours.workspace.schedule.title":`Programación`,"tours.workspace.schedule.description":`Wake-ups y crons que relanzan el agente más tarde.`,"tours.workspace.memory.title":`Memoria del workspace`,"tours.workspace.memory.description":`Consulta la memoria entregada a la conversación seleccionada, las propuestas pendientes y las operaciones del workspace. Borrarla no modifica el historial del proveedor.`,"tours.workspace.handoff.title":`Continuar con un contexto nuevo`,"tours.workspace.handoff.description":`¿Una conversación larga? Inicia aquí una sesión nueva o usa «Cambiar de LLM». El trabajo actual se interrumpe de inmediato y la nueva sesión continúa automáticamente en el mismo workspace. El resumen de traspaso es opcional: desactívalo si el LLM actual ha agotado su cuota. El progreso, el informe y el enlace a la sesión anterior aparecen debajo de este botón.`,"tours.workspace.terminal.title":`Terminal`,"tours.workspace.terminal.description":`Una shell dentro del worktree, sin salir de Kōbō.`,"tours.gitPr.title":`Pull request`,"tours.gitPr.panel.title":`Estado de la PR`,"tours.gitPr.panel.description":`Resultado de la CI, decisión de la review y reviewers, actualizados cada 30 segundos.`,"tours.gitPr.actions.title":`Acciones Git`,"tours.gitPr.actions.description":`Push, pull, rebase o cambiar la rama base. Durante un conflicto, un botón deja que el agente lo resuelva. Para PR de GitHub, elige commit de fusión, squash o rebase al confirmar la fusión.`,"tours.gitPr.attention.title":`Badges de atención`,"tours.gitPr.attention.description":`La tarjeta muestra una CI fallida, cambios solicitados o una PR lista para merge.`,"tours.settings.title":`Ajustes`,"tours.settings.engines.title":`Motores y modelos`,"tours.settings.engines.description":`Modelos, permisos predeterminados y límites de reintentos automáticos.`,"tours.settings.integrations.title":`Integraciones`,"tours.settings.integrations.description":`Conexiones de Notion y Sentry, y credenciales de Bitbucket. GitHub y GitLab usan tu sesión CLI local.`,"tours.settings.automation.title":`Automatización`,"tours.settings.automation.description":`Scripts de setup y cleanup, lifecycle hooks, templates de prompts, templates de workspace y skills. Abre «Variables disponibles» bajo cada script para consultar las variables del workspace, Docker y el hook.`,"tours.settings.worktrees.title":`Worktrees`,"tours.settings.memory.title":`Memoria`,"tours.settings.memory.description":`Elige el comportamiento manual, automático o híbrido y explora, revisa o borra los datos exactos de cada ámbito. Las operaciones de memoria son inmediatas; el modo se aplica al guardar los ajustes.`,"tours.settings.worktrees.description":`Dónde viven los worktrees, cuánto tiempo se conservan los ya fusionados, y la purga automática.`,"tours.settings.projects.title":`Proyectos`,"tours.settings.projects.description":`Los proyectos registrados y sus ajustes específicos por proyecto.`,"tours.settings.misc.title":`General, voz, notificaciones, exportación`,"tours.settings.misc.description":`Idioma, acceso a la red, dictado, sonidos y notificaciones del navegador, y una exportación completa de tus ajustes.`,"tours.dashboard.title":`Panel`,"tours.dashboard.overview.title":`Visión general`,"tours.dashboard.overview.description":`Todos los workspaces activos en una tabla; haz clic en una fila para abrirla.`,"tours.dashboard.reliability.title":`Fiabilidad de los motores`,"tours.dashboard.reliability.description":`Sesiones, errores y duraciones por motor y modelo.`,"tours.health.title":`Salud`,"tours.health.checks.title":`Comprobaciones`,"tours.health.checks.description":`Entorno, base de datos, runtimes, workspaces y sesiones.`,"tours.health.active.title":`Estado activo`,"tours.health.active.description":`Los back-offs de cuota, los wake-ups pendientes y los auto-loops en curso en este momento.`,"tours.search.title":`Búsqueda`,"tours.search.input.title":`Consulta`,"tours.search.input.description":`Coincide con nombres de workspaces y conversaciones de agentes.`,"tours.search.archived.title":`Archivados`,"tours.search.archived.description":`Incluir los workspaces archivados en los resultados.`,"tours.changelog.title":`Novedades`,"tours.changelog.list.title":`Versiones`,"tours.changelog.list.description":`Lo que cambió en cada versión, la más reciente primero.`,"settings.projectGroup.identity":`Identidad`,"settings.projectGroup.defaults":`Valores predeterminados`,"settings.projectGroup.prompts":`Prompts`,"settings.projectGroup.scripts":`Scripts`,"settings.projectPath":`Ruta del proyecto`,"settings.projectPathPlaceholder":`/ruta/al/proyecto`,"settings.displayName":`Nombre para mostrar`,"settings.displayNamePlaceholder":`Mi proyecto`,"settings.defaultSourceBranch":`Rama fuente por defecto`,"settings.defaultModel.project":`Modelo por defecto`,"settings.skipPermissions.project":`Omitir solicitudes de permisos`,"settings.prPromptTemplate.project":`Plantilla de prompt PR`,"settings.prPromptPlaceholder.project":`Instrucciones específicas del proyecto para la creación de PRs...`,"settings.reviewPromptTemplate.project":`Plantilla de prompt de revisión`,"settings.ciFixPromptTemplate.project":`Plantilla de prompt «Reparar CI»`,"settings.gitConventions.project":`Convenciones Git (por proyecto)`,"settings.gitConventionsEmpty":`Dejar vacío para usar las convenciones globales.`,"settings.notionStatus":`Estado ticket Notion`,"settings.notionStatusProperty":`Nombre de la propiedad`,"settings.notionStatusPropertyPlaceholder":`État, Status...`,"settings.notionInProgressStatus":`Valor a establecer`,"settings.notionInProgressStatusPlaceholder":`En progreso, In progress...`,"settings.notionStatusHint":`Cuando se crea un workspace con un ticket Notion, la propiedad especificada se establece a este valor. Ambos campos son obligatorios. Dejar vacío para desactivar.`,"settings.notionAssignee":`Asignación Notion`,"settings.notionAssigneeHint":`Cuando se crea un workspace con un ticket Notion, el usuario autenticado en el MCP de Notion se añade a esta propiedad People — solo si aún no tiene un asignado. Dejar vacío para desactivar.`,"settings.notionAssigneeProperty":`Nombre de la propiedad`,"settings.notionAssigneePropertyPlaceholder":`Desarrolladores, Assignees...`,"settings.notionUserId":`Tu UUID de Notion`,"settings.notionUserIdPlaceholder":`135d872b-594c-8126-9604-00024ad6e5b5`,"settings.notionUserIdHint":`Selecciona tu cuenta en la lista. Notion rechaza la asignación de bots en propiedades People — este campo es obligatorio para activar la auto-asignación.`,"settings.notionUsersRefresh":`Refrescar`,"settings.notionUsersLoading":`Cargando usuarios de Notion…`,"settings.notionUsersLoadFailed":`Error al cargar la lista: {error}`,"settings.notionUsersManualFallback":`Lista no disponible — pega tu UUID de Notion manualmente.`,"settings.devServer":`Servidor de desarrollo`,"settings.devServerStart":`Script de inicio`,"settings.devServerStartPlaceholder":`npm run dev`,"settings.devServerStop":`Script de parada`,"settings.devServerStopPlaceholder":`Opcional — el proceso se cerrará automáticamente si está vacío`,"settings.selectProject":`Selecciona un proyecto o añade uno nuevo`,"settings.projectPathRequired":`La ruta del proyecto es obligatoria.`,"settings.useGlobal":`Usar global`,"settings.saved":`Ajustes globales guardados.`,"settings.unsavedChanges":`Cambios sin guardar`,"settings.nav.general":`General`,"settings.nav.agents":`Agentes`,"settings.nav.skills":`Skills`,"settings.nav.prompts":`Prompts`,"settings.nav.scripts":`Scripts`,"settings.nav.workspaceTemplates":`Plantillas de workspace`,"workspaceTemplates.title":`Plantillas de workspace`,"workspaceTemplates.hint":`Preajustes guardados del formulario de creación. Elige uno en la página de creación; para modificarlo, cárgalo allí, ajústalo y guárdalo de nuevo con el mismo nombre.`,"workspaceTemplates.empty":`Todavía no hay plantillas. Rellena el formulario de creación y usa «Guardar como plantilla».`,"workspaceTemplates.anyProject":`Cualquier proyecto`,"workspaceTemplates.rename":`Renombrar`,"workspaceTemplates.renameTitle":`Renombrar la plantilla`,"workspaceTemplates.deleteConfirm":`¿Eliminar la plantilla «{name}»?`,"workspaceTemplates.deleted":`Plantilla «{name}» eliminada`,"settings.nav.notion":`Notion`,"settings.nav.forge":`Forge`,"settings.bitbucketCommunity":`Bitbucket Community`,"settings.bitbucketCommunityHint":`Las credenciales se guardan localmente y solo las usa bkt.`,"settings.bitbucketUsername":`Correo de Atlassian`,"settings.bitbucketToken":`Token API de Bitbucket`,"settings.nav.sentry":`Sentry`,"settings.nav.voice":`Voz`,"settings.nav.notifications":`Notificaciones`,"settings.nav.worktrees":`Worktrees`,"settings.nav.export":`Exportar`,"settings.help.general":`Idioma, acceso a la red y los valores por defecto que hereda cada proyecto.`,"settings.help.agents":`Modelos y permisos predeterminados, y límites de reintentos automáticos.`,"settings.help.skills":`Qué suites de skills se le indica usar al agente.`,"settings.help.prompts":`Instrucciones del agente tras abrir una PR/MR, para revisiones de código, correcciones CI y finalización.`,"settings.help.scripts":`Scripts de setup, limpieza y cambio de rama origen, además de los hooks de ciclo de vida.`,"settings.help.notion":`Importar una página de Notion como fuente de verdad de un workspace.`,"settings.help.sentry":`Crear un workspace a partir de una issue de Sentry.`,"settings.help.forge":`Credenciales de Bitbucket. GitHub y GitLab usan tu CLI gh/glab autenticada; elige la forja por proyecto.`,"settings.help.voice":`Dictado y push-to-talk.`,"settings.help.notifications":`Sonidos, notificaciones del navegador y recordatorio de preguntas sin responder.`,"settings.help.worktrees":`Dónde se crean los worktrees, retención y borrado automático.`,"settings.help.projects":`Proyectos registrados y sus ajustes específicos por proyecto.`,"settings.help.templates":`Plantillas de prompt expandidas en la entrada del chat.`,"settings.help.workspaceTemplates":`Presets guardados del formulario de creación.`,"settings.help.export":`Exportar e importar todos los ajustes como JSON.`,"settings.openNav":`Abrir la navegación`,"settings.saveError":`Error al guardar los ajustes.`,"settings.projectSaved":`Proyecto guardado.`,"settings.projectSaveError":`Error al guardar el proyecto.`,"settings.projectDeleted":`Proyecto eliminado.`,"settings.deleteProjectConfirmTitle":`¿Eliminar proyecto?`,"settings.deleteProjectConfirmMessage":`¿Quitar «{name}» de tus proyectos? Esto solo elimina sus ajustes de Kōbō — tu código y tus worktrees no se modifican.`,"settings.projectDeleteError":`Error al eliminar el proyecto.`,"templates.title":`Plantillas`,"templates.newTemplate":`Nueva plantilla`,"templates.editTemplate":`Editar plantilla`,"templates.deleteTemplate":`Eliminar plantilla`,"templates.deleteConfirm":`¿Eliminar la plantilla '/{slug}'?`,"templates.deleteConfirmMessage":`Esta acción no se puede deshacer.`,"templates.slug":`Slug`,"templates.slugHint":`Minúsculas, dígitos, guiones. Máx. 64 caracteres.`,"templates.slugInvalid":`El slug solo puede contener minúsculas, dígitos y guiones`,"templates.slugDuplicate":`Ya existe una plantilla con este slug`,"templates.description":`Descripción`,"templates.descriptionHint":`Etiqueta corta mostrada en el dropdown.`,"templates.descriptionRequired":`La descripción es obligatoria`,"templates.contentRequired":`El contenido es obligatorio`,"templates.content":`Contenido`,"templates.contentHint":`Contenido de la plantilla. Usa {variable_name} para las sustituciones.`,"templates.availableVars":`Variables disponibles`,"templates.filePath":`Archivo: {path}`,"templates.empty":`Aún no hay plantillas.`,"templates.createFailed":`Error al crear la plantilla`,"templates.updateFailed":`Error al actualizar la plantilla`,"templates.deleteFailed":`Error al eliminar la plantilla`,"templates.save":`Guardar`,"templates.create":`Crear`,"templates.reloadDefaults":`Recargar plantillas predeterminadas`,"templates.reloadDefaultsHint":`Solo añade las plantillas predeterminadas que faltan. Las plantillas existentes (modificadas o no) nunca se sobrescriben.`,"templates.reloadDefaultsConfirmMessage":`Esta acción añadirá a la lista las plantillas predeterminadas que falten. Las plantillas existentes — incluidas las que hayas personalizado — no se tocarán. Si quieres restaurar una plantilla predeterminada que has modificado, elimínala primero y vuelve a ejecutar esta acción.`,"templates.reloadDefaultsSuccess":`{added} añadida(s), {kept} conservada(s)`,"templates.reloadDefaultsFailed":`Error al recargar las plantillas predeterminadas`,"templates.resetToDefault":`Restablecer al valor predeterminado`,"templates.resetConfirmTitle":`¿Restablecer la plantilla al valor predeterminado?`,"templates.resetConfirmMessage":`Esto sobrescribe tus cambios locales en /{slug} con el predeterminado. No se puede deshacer.`,"templates.resetSuccess":`Plantilla /{slug} restablecida al predeterminado`,"templates.resetFailed":`Error al restablecer la plantilla`,"chatInput.dropdownSkills":`Skills de Claude`,"chatInput.dropdownKobo":`Comandos Kōbō`,"chatInput.dropdownTemplates":`Plantillas`,"documents.title":`Documentos`,"documents.empty":`No se encontraron documentos`,"documents.refresh":`Actualizar`,"documents.back":`Volver`,"documents.loadFailed":`Error al cargar el documento`,"git.title":`Git`,"git.outputDialogTitle":`Git informó de un error`,"git.statsFailed":`No se pudo leer el estado de git`,"git.section.repository":`Repositorio`,"git.section.changes":`Cambios`,"git.section.pullRequest":`Pull request`,"git.section.actions":`Acciones`,"git.actions.more":`Más`,"git.localOnly":`solo local`,"git.pushed":`pushed`,"git.unpushed":`{count} sin push`,"git.commits":`{count} commit | {count} commits`,"git.commits.loading":`Cargando commits…`,"git.commits.empty":`Sin commits en esta rama`,"git.commits.pushed":`Pusheado`,"git.commits.unpushed":`Sin pushear`,"git.commits.clickToAppend":`click para agregar SHA al chat`,"git.commits.diffThisCommit":`Diff de este commit (vs padre)`,"git.compareCommits":`Comparar commits…`,"git.files":`{count} archivo | {count} archivos`,"git.staged":`{count} staged`,"git.modified":`{count} modificados`,"git.untracked":`{count} sin seguimiento`,"git.workingTreeEmpty":`Sin cambios sin confirmar`,"git.fileStaged":`Preparado`,"git.fileModified":`Modificado`,"git.fileUntracked":`Sin seguimiento`,"git.push":`Push`,"git.forcePush":`Force push`,"git.forcePushToggle":`Force push (--force-with-lease)`,"git.pushRejectedHistory":`Push rechazado: las ramas local y remota tienen historiales distintos. Después de un rebase de commits publicados, use Force push con confirmación. En otro caso, obtenga e integre los cambios remotos antes de reintentarlo.`,"git.pushRejectedLease":`Force push rechazado: la rama remota cambió desde la última descarga. Obtenga y revise esos cambios antes de reintentarlo.`,"git.pushFailed":`No se pudo enviar la rama. Abra los detalles para ver la causa.`,"git.pushBlockedByOperation":`Primero termina o aborta la operación {operation} en curso`,"git.pushUpToDate":`Nada que enviar: la rama ya está actualizada en origin`,"git.forcePushHint":`Más seguro que --force: el push se rechaza si el remoto tiene commits que no has visto. Úsalo tras un rebase o amend de commits ya pusheados.`,"git.branchForcePushed":`Rama force-pushed`,"git.pull":`Pull`,"git.pullNoUpstream":`No hay upstream para esta rama — hazle push primero para habilitar Pull.`,"git.sync":`Sync`,"git.createPrNoRemote":`Push la rama primero`,"git.viewRequest":`Ver {request}`,"git.createRequest":`Crear {request}`,"git.changeRequestBase":`Cambiar la rama base de la {request}`,"git.forgeCliMissing":`{cli} no está instalado — instálalo para usar las funciones de {request}`,"git.forgeNotAuthenticated":`No autenticado — ejecuta {cli} auth login`,"settings.forge":`Forge`,"settings.forge.auto":`Detección automática`,"settings.forge.github":`GitHub`,"settings.forge.gitlab":`GitLab`,"settings.forge.bitbucketCommunity":`Bitbucket Community (bkt)`,"settings.forge.none":`Ninguna`,"git.pullConfirmTitle":`¿Pull la rama?`,"git.pullConfirmMessage":`Pull {branch} desde el remoto (solo fast-forward).`,"git.branchPulled":`Rama actualizada`,"git.pullFailed":`Error al hacer pull`,"git.renameBranch":`Renombrar rama`,"git.renameBranchPrompt":"Renombrar `{branch}` a:","git.renameBranchSuccess":"Rama renombrada a `{branch}`","git.renameBranchFailed":`Error al renombrar la rama`,"git.renameBranchExists":"La rama `{branch}` ya existe localmente o en origin","git.diff":`Diff`,"git.diffReview":`Diff`,"git.diffReviewTooltip":`Abre el visor de diff en modo Review — comentarios en línea + envío por lotes al agente`,"pr.baseChanged":`Base de la PR cambiada: {oldBase} → {newBase}`,"pr.openPr":`Abrir PR`,"pr.openWorkspace":`Abrir el workspace`,"pr.dismiss":`Cerrar`,"git.rebase":`Rebase`,"git.rebaseConfirmTitle":`¿Rebase de la rama?`,"git.rebaseConfirmMessage":`Rebase sobre {branch}. Pueden surgir conflictos.`,"git.rebaseSuccess":`Rebase completado`,"git.rebaseFailed":`Rebase fallido`,"git.merge":`Merge`,"git.fetch":`Fetch`,"git.fetchSuccess":`Repositorio actualizado`,"git.fetchFailed":`Fallo al hacer fetch: {error}`,"git.mergeConfirmTitle":`¿Fusionar la rama?`,"git.mergeConfirmMessage":`Fusionar {branch} en esta rama. Puede haber conflictos.`,"git.mergeSuccess":`Merge completado`,"git.mergeFailed":`Merge fallido`,"git.commitFailed":`Commit fallido`,"git.commitChanges":`Confirmar cambios`,"git.commitDialogTitle":`Confirmar cambios sin confirmar`,"git.commitDialogDescription":`Escribe tu mensaje o pide al agente que revise y cree el commit.`,"git.commitMessage":`Mensaje de commit`,"git.commitManual":`Confirmar`,"git.commitWithAgent":`Pedir al agente`,"git.commitAgentSuccess":`Solicitud de commit enviada al agente`,"git.discardFailed":`Descarte fallido`,"git.conflictTitleMerge":`Conflictos de merge detectados`,"git.conflictTitleRebase":`Conflictos de rebase detectados`,"git.operationPausedTitle":`Operación Git para continuar`,"git.operationPausedSubtitle":`No hay archivos en conflicto. Git solo espera que continúes la operación.`,"git.conflictSubtitle":`{count} archivo(s) con conflictos. Elige cómo continuar.`,"git.conflictAbortConfirmTitle":`¿Descartar la resolución del conflicto?`,"git.conflictAbortConfirmMessage":`Todo lo que has resuelto en este {op} se descarta y el worktree vuelve a su estado anterior. Es irreversible.`,"git.conflictAbort":`Abortar`,"git.conflictContinue":`Continuar`,"git.conflictContinued":`Operación Git continuada`,"git.conflictResolveWithAgent":`Pedir al agente que resuelva`,"git.conflictAborted":`Operación abortada`,"git.conflictHandoffSuccess":`El agente está resolviendo los conflictos`,"git.dirtyTitleRebase":`Cambios sin confirmar bloquean el rebase`,"git.dirtyTitleMerge":`Cambios sin confirmar bloquean el merge`,"git.dirtyTitlePull":`Cambios sin confirmar bloquean el pull`,"git.dirtySubtitle":`{modified} modificado(s), {staged} preparado(s), {untracked} sin seguimiento. Elige cómo continuar.`,"git.dirtyStash":`Stash y reintentar`,"git.dirtyCommit":`Commit primero`,"git.dirtyCommitPlaceholder":`Mensaje del commit`,"git.dirtyCommitConfirm":`Commit y reintentar`,"git.dirtyDiscard":`Descartar cambios`,"git.dirtyDiscardConfirmTitle":`¿Descartar todos los cambios sin confirmar?`,"git.dirtyDiscardConfirmMessage":`Los cambios con seguimiento se perderán (git reset --hard). Los archivos sin seguimiento se conservan. Acción irreversible.`,"git.pushConfirmTitle":`¿Pushar la rama?`,"git.pushConfirmMessage":`Pushar {branch} al remoto.`,"git.pushConfirmMessagePrefix":`Pushar la rama`,"git.pushConfirmMessageSuffix":`al remoto.`,"git.changePrBaseTitle":`Cambiar rama base`,"git.changePrBaseMessage":`Ingrese la nueva rama destino para el {request}.`,"git.changePrBaseSuccess":`Rama base de la {request} actualizada`,"git.changePrBaseFailed":`No se pudo cambiar la rama base de la {request}`,"git.mergeRequest":`Fusionar {request}`,"git.mergeMethod.merge":`Crear un commit de fusión — conservar todos los commits`,"git.mergeMethod.squash":`Squash y fusión — combinar en un solo commit`,"git.mergeMethod.rebase":`Rebase y fusión — reaplicar los commits sin commit de fusión`,"git.mergeRequestConfirmTitle":`¿Fusionar {request}?`,"git.mergeRequestConfirmMessage":`Esto fusionará la {request} abierta en su rama de destino.`,"git.mergeRequestSuccess":`{request} fusionada`,"git.mergeRequestFailed":`No se pudo fusionar {request}`,"git.deleteRemoteBranch":`Eliminar rama remota`,"git.deleteRemoteBranchTitle":`¿Eliminar rama remota?`,"git.deleteRemoteBranchMessage":`La solicitud se fusionó. ¿Eliminar la rama remota {branch}?`,"git.deleteRemoteBranchSuccess":`Rama remota {branch} eliminada`,"git.deleteRemoteBranchFailed":`No se pudo eliminar la rama remota`,"git.changeSourceBranch":`Cambiar la rama de origen`,"git.changeSourceBranchTitle":`Cambiar la rama de origen`,"git.changeSourceBranchMessage":`Elige la nueva rama de origen. La rama de trabajo se reconstruirá encima.`,"git.changeSourceBranchDone":`Rama de origen cambiada a {branch}`,"git.changeSourceBranchAligned":`Rama de origen cambiada a {branch} (la rama no tenía commits propios)`,"git.changeSourceBranchTooMany":`La rama tiene demasiados commits propios ({n}) — rebásala manualmente`,"git.changeSourceBranchDirty":`Haz commit o stash de tus cambios antes de cambiar la rama de origen`,"git.changeSourceBranchAgentRunning":`Detén el agente antes de cambiar la rama de origen`,"git.changeSourceBranchErrorTitle":`Error al cambiar la rama de origen`,"git.changeSourceBranchErrorOngoing":`Una operación {op} sigue en curso en el worktree. Cancélala para volver a un estado limpio.`,"git.changeSourceBranchErrorAbort":`Cancelar la operación`,"git.changeSourceBranchLoading":`Cambiando la rama de origen…`,"git.changeSourceForcePushTitle":`¿Forzar el push de la rama reescrita?`,"git.changeSourceForcePushMessage":`El historial de la rama se reescribió. ¿Hacer force-push al remoto con --force-with-lease?`,"git.changeSourceForcePushDone":`Rama enviada con force-push`,"git.openEditor":`Abrir en editor`,"git.openEditorFailed":`No se pudo abrir el editor`,"git.branchPushed":`Rama enviada`,"git.pushFirst":`La rama no está en el remoto. Haz Push primero.`,"git.unpushedCommits":`Los commits locales no están enviados. Haz Push primero.`,"git.from":`desde`,"git.aheadBehindTooltip":`{ahead} commits por delante, {behind} por detrás de {source}`,"git.divergence.title":`Divergencia de rama`,"git.divergence.subtitle":`vs {source}`,"git.divergence.ahead":`↑ {count} por delante`,"git.divergence.behind":`↓ {count} por detrás`,"git.divergence.empty.ahead":`Sin commits por delante.`,"git.divergence.empty.behind":`Sin commits por detrás.`,"git.divergence.close":`Cerrar`,"git.divergence.loading":`Cargando commits…`,"git.divergence.failed":`No se pudo cargar la divergencia`,"git.divergence.retry":`Reintentar`,"git.prCreated":`{request} #{n} creada`,"git.pr.author":`Autor`,"git.pr.reviewers":`Revisores`,"git.pr.assignees":`Asignados`,"git.pr.labels":`Etiquetas`,"git.pr.changesRequestedBadge":`Cambios solicitados`,"git.pr.approvedBadge":`Aprobada`,"git.pr.ci.passed":`CI OK`,"git.pr.ci.failed":`CI fallida`,"git.pr.ci.pending":`CI en curso`,"git.pr.ci.failedCount":`{n} fallido(s)`,"git.pr.ci.pendingCount":`{n} en curso`,"git.pr.ci.passedCount":`{n} OK`,"git.pr.ci.skippedCount":`{n} omitido(s)`,"git.pr.ci.showPassed":`Mostrar {n} jobs OK`,"git.pr.ci.hidePassed":`Ocultar los jobs OK`,"toast.prChangesRequested":`Se solicitaron cambios en la PR #{n}`,"toast.prApproved":`La PR #{n} ha sido aprobada`,"toast.prReadyToMerge":`La PR #{n} está lista para merge`,"toast.prCiFailed":`La CI de la PR #{n} ha fallado`,"toast.prCiRecovered":`La CI de la PR #{n} se ha recuperado`,"toast.prMergeConflict":`La PR #{n} tiene conflictos de merge`,"toast.prMerged":`La PR #{n} se ha fusionado`,"devServer.title":`Servidor de desarrollo`,"devServer.noWorkspace":`Ningún workspace seleccionado`,"devServer.notConfigured":`No configurado —`,"devServer.goToSettings":`Ajustes`,"devServer.logs":`Logs`,"devServer.running":`En ejecución`,"devServer.starting":`Iniciando`,"devServer.stopping":`Deteniendo`,"devServer.error":`Error`,"devServer.stopped":`Detenido`,"devServer.unknown":`Desconocido`,"devServer.containers":`{count} contenedor | {count} contenedores`,"devServer.logDialog.title":`Logs del servidor de desarrollo`,"devServer.logDialog.empty":`No hay logs disponibles`,"notion.title":`Notion`,"tasks.title":`Tareas`,"notion.addTask":`Añadir tarea`,"notion.noUrl":`Sin URL de Notion`,"notion.subtasks":`{done}/{total} subtareas`,"notion.noTasks":`Sin tareas`,"notion.newTask":`Nueva tarea... (Enter para añadir, Esc para cancelar)`,"acceptance.title":`Criterios de aceptación`,"acceptance.addCriterion":`Añadir criterio`,"acceptance.newCriterion":`Nuevo criterio... (Enter para añadir, Esc para cancelar)`,"acceptance.empty":`Sin criterios de aceptación`,"tasks.askProgress":`Pedir al agente que revise el progreso`,"agentTodos.title":`Tareas del agente`,"agentTodos.empty":`Sin tareas del agente`,"subagents.title":`Sub-agentes`,"subagents.empty":`Aún no hay actividad de sub-agentes`,"subagents.tools":`{count} herramientas`,"subagents.running":`En ejecución: `,"subagents.status.running":`En ejecución`,"subagents.status.done":`Completado`,"subagents.status.failed":`Fallido`,"subagents.status.stopped":`Detenido`,"subagents.ambient":`Vigilancia en segundo plano`,"subagents.ambientTooltip":`Vigilancia en segundo plano (p. ej. Monitor): no cuenta como actividad del agente`,"subagents.stop":`Detener este sub-agente`,"subagents.stopAll":`Detener todos`,"subagents.stopFailed":`No se pudo detener el sub-agente: {error}`,"subagents.activity":`Actividad del subagente`,"subagents.noActivity":`Aún no hay actividad visible del proveedor`,"chat.subagentActivity":`Actividad del subagente`,"chat.openSubagentActivity":`Abrir este subagente en el panel lateral`,"stats.resetsAt":`Reset {value}`,"stats.usageBucket":`Bucket de uso {n}`,"quotaFooter.popover.codexTitle":`Cuentas de Codex`,"quotaFooter.accounts.trigger":`Cuentas`,"quotaFooter.accounts.current":`Cuenta configurada`,"quotaFooter.accounts.unknown":`La sesión actual no corresponde a ninguna cuenta guardada.`,"quotaFooter.accounts.empty":`No hay cuentas de {provider} guardadas. Añada una cuenta con ccswap en el entorno de ejecución de Kōbō.`,"quotaFooter.accounts.choose":`Cambiar a la cuenta`,"quotaFooter.accounts.scopeHint":`Cambia las credenciales compartidas por todos los espacios de {provider}. Puede ser necesario detener y reanudar las sesiones en curso para usar la nueva cuenta.`,"quotaFooter.accounts.switch":`Cambiar cuenta`,"quotaFooter.accounts.reload":`Recargar cuentas`,"quotaFooter.accounts.unsupportedEnvironment":`Esta configuración de autenticación no permite cambiar de cuenta con ccswap. Consulte la documentación.`,"quotaFooter.accounts.loadError":`No se pudieron cargar las cuentas. Recargue la lista para volver a intentarlo.`,"quotaFooter.accounts.switchError":`No se pudo confirmar el cambio de cuenta. Revise la lista actualizada antes de volver a intentarlo.`,"quotaFooter.lastUpdated":`Última actualización: {time}`,"quotaFooter.empty":`Cargando…`,"quotaFooter.popover.title":`Uso de Claude Code`,"quotaFooter.popover.refreshNow":`Actualizar`,"quotaFooter.popover.resetsIn":`Se reinicia a las {value}`,"quotaFooter.popover.unauthenticated":`Auth requerida`,"quotaFooter.popover.unauthenticatedHint":`Ejecuta "claude" una vez para autenticarte.`,"quotaFooter.popover.error":`Error`,"quotaFooter.bucket.fiveHour":`5 horas`,"quotaFooter.bucket.sevenDay":`7 días`,"agent.error.spawn_failed":`No se pudo iniciar el agente`,"agent.error.parse_error":`No se pudo analizar un mensaje del agente`,"agent.error.rate_limit":`Límite de tasa alcanzado`,"agent.error.resume_failed":`Sesión no encontrada — iniciando sesión nueva`,"agent.error.other":`Error del agente`,"quotaBackoff.banner.title":`Reanudación automática a las {time}`,"quotaBackoff.banner.transientTitle":`Reanudación automática tras interrupción a las {time}`,"quotaBackoff.resumeNow":`Reanudar ahora`,"quotaBackoff.banner.tooltip":`Cuota de Claude agotada. El auto-loop se reanudará automáticamente cuando la cuota se restablezca a las {resets_at}.`,"quotaBackoff.banner.cancel":`Cancelar reanudación`,"quotaBackoff.cancelled":`Reanudación automática cancelada — puedes reanudar manualmente cuando quieras`,"rateLimitType.fiveHour":`Sesión 5h`,"rateLimitType.sevenDay":`Semanal`,"tooltip.addTask":`Añadir tarea`,"tooltip.removeTask":`Eliminar tarea`,"tooltip.addCriterion":`Añadir criterio`,"tooltip.removeCriterion":`Eliminar criterio`,"tooltip.startDevServer":`Iniciar servidor de desarrollo`,"tooltip.stopDevServer":`Detener servidor de desarrollo`,"tooltip.closeDiffViewer":`Cerrar visor de diff`,"tooltip.refreshLogs":`Actualizar logs`,"tooltip.closeDialog":`Cerrar`,"tooltip.refreshGitStats":`Actualizar estadísticas Git`,"tooltip.removeImage":`Eliminar imagen`,"tooltip.sendMessage":`Enviar mensaje`,"tools.title":`Herramientas`,"tools.runSetupScript":`Volver a ejecutar script de setup`,"tools.runSetupScriptTooltip":`Ejecutar el script de setup del proyecto en el worktree`,"tools.runSetupScriptConfirm":`¿Volver a ejecutar el script de setup en este workspace? Los artefactos existentes pueden ser sobrescritos.`,"tools.runSetupScriptBusy":`No se puede volver a ejecutar el setup mientras el agente está trabajando.`,"tools.noSetupScript":`Ningún script de setup configurado —`,"tools.setupScriptSuccess":`Script de setup completado con éxito.`,"tools.setupScriptFailed":`Falló el script de setup.`,"tools.openNotion":`Abrir en Notion`,"tools.openSentry":`Abrir en Sentry`,"tools.review":`Revisar cambios`,"tools.reviewTooltip":`Pedir al agente que revise los cambios de esta rama`,"tools.reviewBusy":`Agente ocupado — espera a que esté libre`,"tools.fixCi":`Reparar CI`,"tools.fixCiTooltip":`Pedir al agente que diagnostique y arregle los jobs de CI que fallan`,"tools.fixCiLaunched":`Acción «Reparar CI» enviada al agente`,"tools.fixCiFailed":`No se pudo lanzar la acción «Reparar CI»`,"tools.openFileManager":`Abrir en el explorador de archivos`,"tools.openFileManagerTooltip":`Abrir la carpeta del worktree en tu explorador de archivos configurado`,"tools.openFileManagerFailed":`No se pudo abrir el explorador de archivos`,"tools.openTerminal":`Abrir en terminal`,"tools.openTerminalTooltip":`Abrir el worktree en tu terminal configurada`,"tools.openTerminalFailed":`No se pudo abrir la terminal`,"review.title":`Iniciar revisión`,"review.subtitle":`Pide al agente que revise tus cambios y dé feedback.`,"review.additionalInstructions":`Instrucciones adicionales (opcional)`,"review.additionalInstructionsPlaceholder":`Añade instrucciones específicas para la revisión…`,"review.newSession":`Nueva sesión`,"review.newSessionHint":`Inicia una sesión nueva en vez de continuar la actual.`,"review.newSessionRequired":`Cambiar los ajustes del agente o volver automáticamente requiere una nueva sesión.`,"review.returnToSession":`Volver a la sesión actual después de la revisión`,"review.returnToSessionHint":`Reanuda esta sesión con el resumen final del revisor. Si se desactiva, la conversación continúa en la sesión de revisión.`,"review.readOnlyForced":`Una review que vuelve a esta sesión se ejecuta en solo lectura (Plan): no puede modificar archivos ni hacer preguntas.`,"review.returnUnavailable":`La sesión actual debe haberse iniciado para poder reanudarla.`,"review.start":`Iniciar revisión`,"review.cancel":`Cancelar`,"review.launched":`Revisión iniciada`,"review.failed":`No se pudo iniciar la revisión`,"diff.title":`Diff`,"diff.side":`Lado a lado`,"diff.inline":`En línea`,"diff.hideUnchanged":`Ocultar código sin cambios`,"diff.showUnchanged":`Mostrar código sin cambios`,"diff.showUntracked":`Mostrar archivos no rastreados`,"diff.hideUntracked":`Ocultar archivos no rastreados`,"diff.rollbackToRemote":`Restaurar a la versión remota`,"diff.rollbackConfirm":`¿Restaurar {path} a su versión remota (origin)? Los cambios locales en este archivo se perderán.`,"diff.rollbackConfirmOk":`Restaurar`,"diff.rollbackDone":`Archivo restaurado a la versión remota`,"diff.rollbackDoneRemote":`Archivo restaurado a la versión remota`,"diff.rollbackDoneHead":`Cambios locales descartados (archivo restaurado al último commit)`,"diff.rollbackDoneDeleted":`Archivo no rastreado eliminado`,"diff.deleteUntracked":`Eliminar archivo no rastreado`,"diff.deleteUntrackedConfirm":`¿Eliminar definitivamente {path}? Este archivo no está rastreado por git — su contenido se perderá.`,"diff.deleteUntrackedConfirmOk":`Eliminar`,"diff.rollbackFailed":`Falló el rollback`,"diff.rollbackFailedDetail":`Rollback fallido: {error}`,"diff.modeInspect":`Editar`,"diff.modeReview":`Review`,"diff.addComment":`Añadir comentario`,"diff.replyComment":`Responder`,"diff.editComment":`Editar`,"diff.deleteComment":`Eliminar`,"diff.deleteCommentConfirm":`¿Eliminar este comentario?`,"diff.commentPlaceholder":`Escribe un comentario de revisión… (Markdown soportado)`,"diff.reviewDraft":`Borrador de revisión`,"diff.reviewEmpty":`Aún no hay comentarios — pasa el cursor sobre una línea del diff y haz clic en + para añadir uno.`,"diff.reviewGlobalPlaceholder":`Mensaje general de revisión (opcional)`,"diff.submitReview":`Enviar revisión ({n})`,"diff.reviewPending":`Ya se está enviando una revisión.`,"diff.reviewEmptySubmission":`La revisión está vacía.`,"diff.reviewNotAccepted":`El mensaje no fue aceptado. Tu revisión se ha conservado.`,"diff.reviewSubmitted":`Revisión enviada al agente`,"diff.reviewSubmitFailed":`No se pudo enviar la revisión: {error}`,"diff.scopeBranch":`Branch`,"diff.workingTree":`Copia de trabajo`,"diff.scopeUnpushed":`Sin pushear`,"diff.noChanges":`Sin cambios`,"diff.searchFiles":`Buscar archivos…`,"diff.noFileMatch":`Ningún archivo coincide`,"diff.selectFile":`Selecciona un archivo para ver el diff`,"diff.fileLoadFailed":`No se pudo cargar este diff`,"diff.fileLoadFailedHint":`El archivo en disco está intacto — solo falló la carga del diff.`,"diff.fileListLoadFailed":`No se pudo cargar la lista de archivos`,"diff.fileListLoadFailedHint":`Es un fallo de la petición, no una rama sin cambios.`,"diff.addToChat":`Añadir al chat`,"diff.compareTitle":`Comparar commits`,"diff.compareFrom":`Desde`,"diff.compareTo":`Hasta`,"diff.compareSubmit":`Comparar`,"diff.compareSourceBase":`{branch} (base de la rama)`,"diff.commitsReadOnly":`solo lectura`,"diffViewer.save":`Guardar`,"diffViewer.savedAt":`Guardado`,"diffViewer.saveFailed":`Error al guardar`,"diffViewer.saveFailedDetail":`Error al guardar: {error}`,"diffViewer.unsavedChanges.title":`Cambios sin guardar`,"diffViewer.unsavedChanges.message":`Tienes cambios sin guardar. ¿Qué quieres hacer?`,"diffViewer.unsavedChanges.save":`Guardar`,"diffViewer.unsavedChanges.cancel":`Cancelar`,"diffViewer.conflict.title":`Archivo modificado en disco`,"diffViewer.conflict.message":`El archivo fue modificado fuera de Kōbō desde que lo abriste.`,"diffViewer.conflict.reload":`Recargar (descartar cambios locales)`,"diffViewer.conflict.keep":`Mantener los míos`,"diffViewer.conflict.overwrite":`Sobrescribir de todos modos`,"diffViewer.conflict.overwriteHint":`Reemplaza el archivo del disco por tu versión. El otro cambio se pierde.`,"diffViewer.conflict.keepHint":`Mantiene tus cambios en el editor y adopta la nueva firma del disco, para que el próximo guardado funcione.`,"diffViewer.saveBlocked":`El agente está en marcha — detenlo para guardar tus cambios.`,"diffViewer.unsavedBanner":`Cambios sin guardar. Detén el agente para guardarlos.`,"diffViewer.closeConfirm.title":`Cambios sin guardar`,"diffViewer.closeConfirm.message":`Este archivo tiene cambios que nunca se guardaron. Cerrar el visor de diferencias los descarta.`,"diffViewer.closeConfirm.discard":`Cerrar sin guardar`,"diffViewer.criteriaRail":`Checklist de revisión`,"diffViewer.criteriaRailShow":`Mostrar la checklist de revisión`,"diffViewer.criteriaRailHide":`Ocultar la checklist de revisión`,"diffViewer.fileTreeShow":`Mostrar el árbol de archivos`,"diffViewer.fileTreeHide":`Ocultar el árbol de archivos`,"diffViewer.closeConfirm.saveAndClose":`Guardar y cerrar`,"diffViewer.agentRunning":`Un agente está trabajando. Detenlo para habilitar la edición.`,"diffViewer.fileDeleted":`Archivo eliminado`,"notification.agentFinished":`{name} — Agente terminado`,"notification.agentQuestion":`{name} — El agente hace una pregunta`,"notification.awaitingReminder":`{name} - sigue esperándote ({minutes} min)`,"notification.agentPermissionRequest":`{name} — El agente solicita un permiso`,"notification.autoLoopCompleted":`{name} — Auto-loop completado`,"notification.autoLoopWaitingForSlot":`{name} - El auto-loop espera un slot de agente libre ({running}/{limit} en curso)`,"notification.autoLoopStalled":`{name} — Auto-loop bloqueado (sin progreso)`,"notification.autoLoopError":`{name} — Auto-loop detenido por error`,"notification.autoLoopAwaitingClarification":`{name} — Auto-loop en pausa, esperando tu aclaración`,"notification.autoLoopPermissionOverridden":`{name} — Auto-loop forzó el modo plan a bypass`,"notification.agentError":`{name} — Error del agente`,"contextMenu.rename":`Renombrar`,"contextMenu.editDescription":`Editar la descripción`,"contextMenu.copyPath":`Copiar ruta del worktree`,"contextMenu.copyWorkspaceId":`Copiar ID del workspace`,"contextMenu.openEditor":`Abrir en editor`,"contextMenu.openFileManager":`Abrir en el explorador de archivos`,"contextMenu.unarchiveDisabledPurged":`Restaura primero el worktree con Restaurar worktree o recréalo manualmente. Kōbō detecta automáticamente los worktrees correspondientes.`,"workspaceList.unarchiveBlockedPurged":`Restaura primero el worktree con Restaurar worktree o recréalo manualmente. Kōbō detecta automáticamente los worktrees correspondientes.`,"contextMenu.purgeWorktree":`Liberar espacio en disco (borrar worktree)`,"contextMenu.purgeWorktreeTooltip":`Borra el worktree del disco para recuperar espacio — el historial de mensajes y sesiones se conserva. Archiva automáticamente el workspace.`,"contextMenu.purgeWorktreeDialogTitle":`¿Liberar espacio en disco?`,"contextMenu.purgeWorktreeDialogMessage":`La carpeta del worktree de «{name}» será eliminada del disco. El historial de mensajes y sesiones se conserva. El workspace se archivará automáticamente. Esta acción no se puede deshacer en la versión actual.`,"contextMenu.purgeWorktreeDialogConfirm":`Borrar el worktree`,"contextMenu.purgeWorktreeSuccess":`Worktree borrado — espacio en disco recuperado.`,"settings.autoPurgeOnPrMerged":`Borrar worktree al mergear la PR`,"settings.autoPurgeOnPrMergedHint":`Cuando está activado, el worktree se borra del disco en cuanto se mergea la PR (además del archivado automático). El historial de mensajes se conserva.`,"settings.forceImmediateMessages":`Forzar el envío inmediato de mensajes`,"settings.forceImmediateMessagesHint":`Desactivado por defecto. Envía nuevos mensajes mientras el agente trabaja, como Ctrl+Enter, sin ponerlos en cola. En auto-loop, envía ahora y pausa el bucle. Los mensajes ya en cola no cambian; se mantienen los bloqueos de compactación y permisos.`,"settings.showProgressBars":`Mostrar barras de progreso`,"settings.showProgressBarsHint":`Activado de forma predeterminada. Ocultar las barras no cierra las actividades ni detiene su seguimiento. Los cambios se aplican al guardar.`,"tours.settings.immediateMessages.title":`Envío inmediato`,"tours.settings.immediateMessages.description":`Activa este ajuste para enviar nuevos mensajes directamente, como Ctrl+Enter. Desactivado por defecto: los mensajes esperan al final del turno.`,"tours.settings.progressBars.title":`Barras de progreso`,"tours.settings.progressBars.description":`Muestra u oculta las barras sobre el campo de mensaje. El seguimiento continúa mientras están ocultas.`,"settings.agentWatchdogEnabled":`Activar los watchdogs de inactividad de los agentes`,"settings.agentWatchdogHint":`Desactivados por defecto. Si se activan, Kōbō puede detener Claude o Codex tras un silencio prolongado, incluidas herramientas, subagentes y compactación. Se aplica al iniciar o reanudar el agente.`,"tours.settings.agentWatchdog.title":`Watchdogs de inactividad`,"tours.settings.agentWatchdog.description":`Deja esta opción desactivada para permitir esperas largas sin actividad visible. Actívala para cerrar automáticamente sesiones bloqueadas. Se aplica al iniciar o reanudar el agente.`,"settings.autoLoopMaxRetries":`Máximo de reintentos automáticos`,"settings.awaitingUserReminder":`Recordatorio de pregunta sin responder`,"settings.awaitingUserReminderHint":`Minutos que un workspace puede esperar tu respuesta antes de que Kōbō te avise, y luego en cada intervalo siguiente. 0 lo desactiva.`,"settings.localeLoadFailed":`No se pudo cargar ese idioma; se mantiene el actual.`,"settings.autoLoopMaxRetriesHint":`Pausa la misión tras este número de fallos temporales del motor o del servidor. Las cuotas esperan su restablecimiento y no consumen este límite.`,"settings.retentionTitle":`Retención del historial de conversación (desactivada por defecto)`,"settings.retentionWarning":`Activar esta opción elimina definitivamente de la base de datos el historial de conversación de los agentes, empezando por todo lo que ya sea más antiguo que la ventana. Los eventos eliminados no se pueden recuperar.`,"settings.retentionHint":`Se ejecuta una vez al arrancar el servidor. Los workspaces, tareas, sesiones, branches y worktrees nunca se tocan — solo la salida registrada de los agentes.`,"settings.retentionDaysLabel":`Eliminar eventos más antiguos de (días)`,"settings.retentionDaysHint":`0 — el valor por defecto — conserva todos los eventos indefinidamente. Indica un valor para activar la retención.`,"settings.retentionKeepLabel":`Eventos siempre conservados por workspace`,"settings.retentionKeepHint":`Los eventos más recientes de cada workspace sobreviven sea cual sea su antigüedad, para que un workspace antiguo pero aún abierto conserve un historial legible. Sugerido: 5000.`,"settings.retentionDisabledHint":`Retención desactivada: nunca se eliminará nada.`,"settings.retentionConfirmTitle":`¿Eliminar definitivamente el historial de conversación?`,"settings.retentionConfirmMessage":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, {count} de los {total} eventos de agente registrados — incluido todo lo que ya sea más antiguo. Es irreversible. ¿Continuar?`,"settings.retentionConfirmMessageUnknown":`Conservar solo {days} día(s) de historial eliminará definitivamente, en el próximo arranque del servidor, todos los eventos de agente más antiguos — incluido todo lo ya acumulado. No se ha podido calcular el volumen exacto. Es irreversible. ¿Continuar?`,"settings.purgeDocsTitle":`Cómo funciona el borrado — restauración y permisos`,"settings.purgeDocsRestoreTitle":`Restaurar un worktree borrado (detección automática)`,"settings.purgeDocsRestoreIntro":`Un workspace borrado conserva su historial de chat y los metadatos de la PR, pero la carpeta worktree ya no existe. Recréala manualmente con uno de estos comandos — Kōbō detecta la reaparición de la carpeta en menos de 30 segundos y reactiva automáticamente el workspace (desarchivar + limpiar flag de borrado):`,"settings.purgeDocsRestoreCommands":`# GitHub (con CLI gh):
|
|
12
12
|
gh pr checkout [número-pr] --recurse-submodules
|
|
13
13
|
|
|
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":`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};
|
|
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.unmeasured":`Progreso sin cuantificar`,"progress.stale":`Sin actualizaciones desde hace {minutes} min`,"progress.staleHint":`No se ha recibido un nuevo informe de progreso. Esto no significa que el trabajo se haya detenido.`,"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};
|
package/src/client/dist/pwa/assets/{expand-template-C5D_p5eV.js → expand-template-Ci9UjnxZ.js}
RENAMED
|
@@ -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{Qt as P,Tt as F,Ut as I}from"./index-BZwhT2-I.js";import{t as L}from"./use-slide-transition-B_Nu6u-t.js";import{a as ee}from"./use-tours-DOUjqO2f.js";import{a as te,i as ne,n as re,o as R,r as z,s as B}from"./efforts-DJaFsLgd.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
|
+
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-CNcXBpzz.js";import{t as L}from"./use-slide-transition-B_Nu6u-t.js";import{a as ee}from"./use-tours-B0KtCS9w.js";import{a as te,i as ne,n as re,o as R,r as z,s as B}from"./efforts-B3I7w5bs.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{Zt as t}from"./index-
|
|
1
|
+
import{t as e}from"./defineProperty-BbfpZ9Tg.js";import{Zt as t}from"./index-CNcXBpzz.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{Qt as e}from"./index-
|
|
1
|
+
import{Qt as e}from"./index-CNcXBpzz.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};
|