dsh-eslat 0.0.0-stage → 1.0.0
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/LICENSE +21 -0
- package/README.md +265 -2
- package/cordis.patch.yml +9 -0
- package/icon.svg +14 -0
- package/lib/client.js +569 -0
- package/lib/client.js.map +1 -0
- package/lib/index.js +12 -0
- package/locale/en.json +6 -0
- package/locale/es.json +6 -0
- package/package.json +70 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dsh-locale-es-labels contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,266 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-eslat · EsLat
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **English summary** — **EsLat**, a [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeek-Harness)
|
|
4
|
+
> language bundle that shows **Spanish labels for tool calls and status summaries** in the web GUI
|
|
5
|
+
> (`Read`, `Running`, `Preparing tool call`, `Reading files`, `Ran commands`, …) while everything else
|
|
6
|
+
> keeps its English fallback. 435 labels across four client namespaces; it selects Spanish once and
|
|
7
|
+
> never overrides a language the user chose afterwards. Install with
|
|
8
|
+
> `dsh plugin add dsh-eslat`, or from the **Plugins** page in the sidebar. Revert with
|
|
9
|
+
> Settings → General → *Idioma* → English. Full documentation below is in Spanish.
|
|
10
|
+
|
|
11
|
+
Etiquetas en español para las **llamadas a herramientas** y los **resúmenes de estado** de la
|
|
12
|
+
interfaz web de DSH. Es un plugin local: un paquete de idioma que registra el idioma `es` y sus
|
|
13
|
+
diccionarios en los namespaces que DSH usa para esas dos cosas, y deja todo lo demás en su texto
|
|
14
|
+
original en inglés.
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
Llamada a herramienta → Leer / Escribir / Editar / Buscar en el contenido / Buscar archivos
|
|
18
|
+
Bash / PowerShell / Obtener página web / Crear subagente …
|
|
19
|
+
Estado de la llamada → En ejecución / Preparando la llamada / Fallida / Detenida
|
|
20
|
+
Resumen de estado en curso → Leyendo archivos / Ejecutando comandos / Coordinando subagentes …
|
|
21
|
+
Resumen del turno terminado → Completado en 12 s · Se leyeron archivos y se ejecutaron comandos
|
|
22
|
+
Panel Inspeccionar → Estado / Tipo / Código de salida / Resultado / Sin resultados …
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Instalación
|
|
26
|
+
|
|
27
|
+
Es un **bundle** de DSH (`dsh.bundle.patch`), así que se instala como cualquier otro plugin. Tres
|
|
28
|
+
formas, de la más cómoda a la más manual:
|
|
29
|
+
|
|
30
|
+
### Desde npm
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
dsh plugin add dsh-eslat
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
o en la interfaz web: barra lateral → **Plugins** → **Add plugin** → escribe el nombre del paquete →
|
|
37
|
+
**Install**. El diálogo acepta también una dirección Git, un tarball o una ruta local absoluta.
|
|
38
|
+
|
|
39
|
+
### Desde un tarball
|
|
40
|
+
|
|
41
|
+
Sin cuenta de npm y sin permisos de compilación: el tarball ya trae la mitad Cliente construida.
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
dsh plugin add ./dsh-eslat-1.0.0.tgz
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Desde un repositorio Git
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
dsh plugin add github:Amador-Aguilar/dsh-eslat
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Este paquete **no necesita `prepare` ni autorizar scripts de compilación** en la instalación: el
|
|
54
|
+
bundle del navegador (`lib/client.js`) se publica ya construido, no se genera al instalar.
|
|
55
|
+
|
|
56
|
+
### En este equipo (desarrollo)
|
|
57
|
+
|
|
58
|
+
En el perfil `desktop` está instalado como dependencia local enlazada:
|
|
59
|
+
|
|
60
|
+
```jsonc
|
|
61
|
+
// C:\Users\HP ZBook\.dsh\profiles\desktop\package.json
|
|
62
|
+
"dependencies": { "dsh-eslat": "link:C:/Users/HP ZBook/Documents/deepseek-harness/default-workspace/dsh-eslat" },
|
|
63
|
+
"dsh": { "profile": { "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-eslat"] } }
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Como es un enlace, editar `src/*.es.json`, ejecutar `node tools/build.mjs` y recargar la página
|
|
67
|
+
aplica los cambios sin reinstalar.
|
|
68
|
+
|
|
69
|
+
Al desactivarlo, el idioma `es` desaparece del selector y la interfaz vuelve al idioma disponible (no
|
|
70
|
+
borra la preferencia guardada, simplemente deja de estar disponible).
|
|
71
|
+
|
|
72
|
+
## Activación
|
|
73
|
+
|
|
74
|
+
Al montarse, el plugin hace dos cosas: registra el idioma y selecciona **Español** una sola vez,
|
|
75
|
+
sustituyendo únicamente el idioma por defecto (`en`). Después:
|
|
76
|
+
|
|
77
|
+
| Situación | Qué ocurre |
|
|
78
|
+
|---|---|
|
|
79
|
+
| La interfaz estaba en inglés (por defecto) | Pasa a Español; las etiquetas de herramientas y los resúmenes de estado salen en español |
|
|
80
|
+
| Ya estaba en chino o en otro idioma elegido | No se toca nada: solo sustituye el idioma por defecto |
|
|
81
|
+
| El usuario cambia a otro idioma en Ajustes → Idioma | Se respeta para siempre; el plugin no vuelve a forzar el español |
|
|
82
|
+
| Un shell nativo vuelve a anunciar su idioma por defecto | El plugin recupera el español, porque la elección no fue del usuario |
|
|
83
|
+
|
|
84
|
+
La memoria de esa decisión vive en `localStorage` del navegador
|
|
85
|
+
(`dsh-eslat:activation`). Si el almacenamiento no está disponible, el plugin se limita a
|
|
86
|
+
seleccionar español en cada carga cuando la interfaz está en inglés.
|
|
87
|
+
|
|
88
|
+
**Para volver atrás:** Ajustes → General → *Idioma* → English. Las etiquetas vuelven al inglés y el
|
|
89
|
+
plugin no las cambiará de nuevo. Para quitarlo del todo, desactívalo o desinstálalo desde la página
|
|
90
|
+
**Plugins**.
|
|
91
|
+
|
|
92
|
+
## Alcance
|
|
93
|
+
|
|
94
|
+
Traduce 435 etiquetas en cuatro namespaces del cliente. La cobertura de las claves que pertenecen a
|
|
95
|
+
llamadas a herramientas y resúmenes de estado es del 100 %; el resto de la interfaz no se toca.
|
|
96
|
+
|
|
97
|
+
| Namespace | Claves traducidas | Qué cubre |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| `conversation` | 284 de 367 | Títulos de cada herramienta (`tool.title.*`), estado de la fila (`row.*`, `bash.*`), tarjetas de búsqueda y lectura (`search.*`, `read.*`, `diff.*`), web (`web.*`), terminal (`terminal.*`), preguntas al usuario (`ask.*`), tareas (`todo.*`) y etiquetas del panel Inspeccionar (`detail.*`) |
|
|
100
|
+
| `chat` | 109 de 186 | Resúmenes de estado en curso y terminados (`message.stepProcess.*`, `message.turnProcess.*`), disparadores del turno (`message.trigger.*`), reintentos, errores, uso del turno, `row.*`, `command.*`, duraciones y formato de fecha |
|
|
101
|
+
| `common` | 41 de 41 | Vocabulario compartido de las tarjetas: Copiar, Copiado, Contraer, Expandir, Bloque de código… |
|
|
102
|
+
| `settings.locale` | 1 de 1 | El título de la fila de idioma: *Idioma* |
|
|
103
|
+
|
|
104
|
+
Las claves que no se traducen caen automáticamente al inglés, porque el idioma `es` declara `en`
|
|
105
|
+
como respaldo. Ese es el motivo de que la interfaz quede mixta: español en las herramientas y los
|
|
106
|
+
estados, inglés en el resto.
|
|
107
|
+
|
|
108
|
+
## Identidad del plugin
|
|
109
|
+
|
|
110
|
+
| Capa | Valor | Dónde se define |
|
|
111
|
+
|---|---|---|
|
|
112
|
+
| Nombre visible | **EsLat** | `locale/{en,es}.json` → `meta.title` |
|
|
113
|
+
| Nombre técnico (npm y **id del módulo del navegador**) | `dsh-eslat` | `package.json` → `name` |
|
|
114
|
+
| Icono | monograma «ñ»: tilde cian sobre trazo azul degradado, 36×36 | `icon.svg` |
|
|
115
|
+
| Autor | Amador Aguilar (`@amador_aguilar` en npm, `Amador-Aguilar` en GitHub) | `package.json` → `author` |
|
|
116
|
+
| Repositorio | [github.com/Amador-Aguilar/dsh-eslat](https://github.com/Amador-Aguilar/dsh-eslat) | `package.json` → `repository` |
|
|
117
|
+
|
|
118
|
+
La tarjeta de la página **Plugins** muestra el icono, el título visible y la descripción, y debajo el
|
|
119
|
+
nombre del paquete. La autoría formal no depende de la tarjeta: la registra npm al publicar, y se
|
|
120
|
+
consulta con `npm owner ls dsh-eslat`.
|
|
121
|
+
|
|
122
|
+
### Si prefieres un nombre con ámbito
|
|
123
|
+
|
|
124
|
+
`@amador_aguilar/dsh-eslat` es válido en npm (el ámbito es tu usuario, confirmado) y pone tu nombre en
|
|
125
|
+
el propio nombre del paquete. Cuesta tres cambios y una reconstrucción, y la verificación falla si te
|
|
126
|
+
falta uno:
|
|
127
|
+
|
|
128
|
+
```powershell
|
|
129
|
+
# 1. package.json → "name": "@amador_aguilar/dsh-eslat"
|
|
130
|
+
# 2. cordis.patch.yml → name: '@amador_aguilar/dsh-eslat'
|
|
131
|
+
node tools/build.mjs # 3. regenera el id del módulo
|
|
132
|
+
npm run verify
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
El paquete sin ámbito es más fácil de teclear y de encontrar por búsqueda; el ámbito pone tu usuario
|
|
136
|
+
a la vista. Ambas opciones son válidas: npm registra al editor en cualquiera de las dos.
|
|
137
|
+
|
|
138
|
+
### Campos del repositorio (ya configurados)
|
|
139
|
+
|
|
140
|
+
`package.json` ya enlaza el código, así que la ficha de npm mostrará los botones de repositorio e
|
|
141
|
+
incidencias:
|
|
142
|
+
|
|
143
|
+
```jsonc
|
|
144
|
+
"repository": { "type": "git", "url": "git+https://github.com/Amador-Aguilar/dsh-eslat.git" },
|
|
145
|
+
"homepage": "https://github.com/Amador-Aguilar/dsh-eslat#readme",
|
|
146
|
+
"bugs": { "url": "https://github.com/Amador-Aguilar/dsh-eslat/issues" }
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Publicar
|
|
150
|
+
|
|
151
|
+
Requisitos de DSH para que un paquete sea instalable y aparezca como tarjeta en **Plugins**
|
|
152
|
+
(según la [guía oficial de empaquetado](https://github.com/deepseek-ai/DeepSeek-Harness/blob/master/docs/user/develop/basic/publish.zh.md)
|
|
153
|
+
y el [cookbook de paquetes](https://deepseek-harness.github.io/deepseek-harness/en/reference/cookbook/adding-a-package)):
|
|
154
|
+
|
|
155
|
+
| Requisito | Estado |
|
|
156
|
+
|---|---|
|
|
157
|
+
| `dsh.bundle.patch` con un archivo existente | `./cordis.patch.yml` |
|
|
158
|
+
| La fila del patch usa el **nombre del paquete** (no una ruta) | `dsh-eslat` |
|
|
159
|
+
| `name` + `version` no vacíos (identidad en el inventario) | `dsh-eslat@1.0.0` |
|
|
160
|
+
| Mitad Cliente **ya construida**: nadie ejecuta tu build al instalar | `lib/client.js` versionado |
|
|
161
|
+
| `dsh.client.platform: 'web'` y `exports["./client"]` | presentes |
|
|
162
|
+
| `files` incluye todo lo que hace falta en ejecución | bundle, map, patch, `locale/*.json` |
|
|
163
|
+
| `engines.dsh` declarado | `>=0.2.0-rc.2` (solo mínimo; sin techo) |
|
|
164
|
+
|
|
165
|
+
`test/verify.mjs` comprueba todas esas condiciones, incluido que `package.json`, la fila del patch y
|
|
166
|
+
el `id` del bundle se llamen igual, y que `files` no deje fuera el artefacto. `prepublishOnly`
|
|
167
|
+
encadena build + verificación + pruebas, así que un `publish` no puede salir con el bundle obsoleto.
|
|
168
|
+
|
|
169
|
+
### Pasos
|
|
170
|
+
|
|
171
|
+
```powershell
|
|
172
|
+
# 1. Comprobar que todo sigue en verde y que el bundle está al día
|
|
173
|
+
npm run verify
|
|
174
|
+
|
|
175
|
+
# 2. Revisar el contenido exacto del paquete (9 archivos, ~19 kB)
|
|
176
|
+
npm pack --dry-run
|
|
177
|
+
|
|
178
|
+
# 3. Publicar en npm (la primera vez: npm adduser)
|
|
179
|
+
npm publish
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Si el `dsh-eslat` ya estuviera ocupado en el registro, publica con tu ámbito:
|
|
183
|
+
|
|
184
|
+
```powershell
|
|
185
|
+
# cambiar el nombre en package.json, cordis.patch.yml y reconstruir:
|
|
186
|
+
# "name": "@tu-usuario/dsh-eslat"
|
|
187
|
+
node tools/build.mjs
|
|
188
|
+
npm publish --access public
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
El `id` del módulo del navegador sale de `package.json`, así que reconstruir es obligatorio: la
|
|
192
|
+
verificación falla si el bundle, el patch y el manifiesto discrepan.
|
|
193
|
+
|
|
194
|
+
### Notas de compatibilidad
|
|
195
|
+
|
|
196
|
+
- **Sin `peerDependencies` sobre `@deepseek-ai/dsh*`** a propósito: DSH rechaza instalar y arrancar
|
|
197
|
+
un bundle cuyos peers (o su `engines.dsh`) no satisfagan el runtime. Este plugin no importa nada
|
|
198
|
+
de DSH —solo usa servicios ambientales del cliente—, así que no declara ninguno y no queda atado a
|
|
199
|
+
una versión concreta. `engines.dsh` solo pone el mínimo.
|
|
200
|
+
- **`engines.dsh` sin techo superior**: `>=0.2.0-rc.2` documenta el mínimo real (la versión cuyos
|
|
201
|
+
diccionarios se verifican) sin bloquear versiones futuras.
|
|
202
|
+
- **Sin scripts de instalación**: no hay `prepare`, `install` ni `postinstall`, así que instalar
|
|
203
|
+
desde Git o tarball no pide autorizar la ejecución de código en la máquina del usuario.
|
|
204
|
+
- **Sin actualización automática**: DSH no actualiza plugins instalados; una versión nueva se
|
|
205
|
+
instala desinstalando la anterior.
|
|
206
|
+
- **Descubrimiento**: en `0.2.0-rc.2` no hay catálogo de terceros ni formulario de envío. El grupo
|
|
207
|
+
**Official** de la página Plugins es lo que la instalación de DSH trae consigo, no un canal de
|
|
208
|
+
publicación. La distribución es npm (o Git/tarball), y el descubrimiento pasa por las palabras
|
|
209
|
+
clave del `package.json`, el repositorio y las listas de la comunidad.
|
|
210
|
+
|
|
211
|
+
## Estructura
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
package.json manifiesto: dsh.bundle.patch + dsh.client (platform web)
|
|
215
|
+
cordis.patch.yml capa de parche del bundle: inserta la fila locale-es-labels
|
|
216
|
+
lib/index.js mitad Host: inerte, solo mantiene el paquete en el árbol del Loader
|
|
217
|
+
lib/client.js mitad Cliente construida (generada) — todo el comportamiento vive aquí
|
|
218
|
+
lib/client.js.map source map de identidad del bundle
|
|
219
|
+
locale/{en,es}.json título y descripción del plugin en la página Plugins
|
|
220
|
+
LICENSE MIT
|
|
221
|
+
src/*.es.json diccionarios españoles editables (la fuente de verdad)
|
|
222
|
+
src/language.json definición del idioma: id, etiqueta y respaldo
|
|
223
|
+
tools/build.mjs construye lib/client.js a partir de src/
|
|
224
|
+
tools/extract-shipped-keys.mjs regenera la instantánea de claves inglesas de DSH
|
|
225
|
+
test/verify.mjs claves, marcadores, frescura del bundle y requisitos de publicación
|
|
226
|
+
test/smoke.mjs ejecuta la mitad Cliente contra dobles de prueba
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Solo se publica la primera mitad: `src/`, `tools/` y `test/` son material del repositorio. La
|
|
230
|
+
instantánea `test/shipped-en.json` es lo que permite verificar el paquete sin tener DSH delante.
|
|
231
|
+
|
|
232
|
+
### Por qué la mitad Cliente es un archivo construido
|
|
233
|
+
|
|
234
|
+
DSH sirve cada plugin del navegador como un bundle *lazy-CJS* ya construido: el host lee
|
|
235
|
+
`exports["./client"]` y el navegador evalúa el archivo, que debe estar en la forma del cargador de
|
|
236
|
+
módulos (`window.__ModuleLoader__.load({ id, factory })`) y no puede importar nada, porque el
|
|
237
|
+
protocolo no admite `require` relativos entre bundles.
|
|
238
|
+
|
|
239
|
+
Por eso los diccionarios viven en `src/*.es.json` y se incorporan al bundle generado. Editar el
|
|
240
|
+
JSON y reconstruir es todo el ciclo de trabajo:
|
|
241
|
+
|
|
242
|
+
```powershell
|
|
243
|
+
node tools/build.mjs # regenera lib/client.js y su map
|
|
244
|
+
node test/verify.mjs # claves, marcadores {…}, frescura del bundle
|
|
245
|
+
node test/smoke.mjs # comportamiento de la mitad Cliente
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
`test/shipped-en.json` es una instantánea de los diccionarios ingleses extraídos de DSH
|
|
249
|
+
`0.2.0-rc.2`: si una versión futura renombra o elimina una clave, `verify` falla y lo dice, en lugar
|
|
250
|
+
de dejar la etiqueta en inglés en silencio.
|
|
251
|
+
|
|
252
|
+
## Limitaciones
|
|
253
|
+
|
|
254
|
+
- **Interfaz mixta por diseño** — solo se sustituyen las etiquetas de herramientas y de estado; el
|
|
255
|
+
resto sigue en inglés a través del respaldo `en`.
|
|
256
|
+
- **Claves atadas a una versión** — la verificación está anclada a DSH `0.2.0-rc.2`. Una clave
|
|
257
|
+
renombrada aguas arriba revierte esa etiqueta al inglés hasta que se actualice el diccionario.
|
|
258
|
+
- **Enumeraciones de tres o más elementos** — DSH une los resúmenes cerrados con `message.stepProcess.comma`
|
|
259
|
+
y no ofrece una ranura para la conjunción final, así que una lista de tres sale como
|
|
260
|
+
«Se leyeron archivos, se buscó en el código, se ejecutaron comandos» en lugar de usar «y» antes
|
|
261
|
+
del último. Con dos elementos sí aparece la «y».
|
|
262
|
+
- **Sin reglas de plural propias** — los plurales usan las ranuras `.one`/`.other` que DSH ya
|
|
263
|
+
consulta; `es` comparte con `en` la regla de singular y plural.
|
|
264
|
+
- **Separador de millares y fechas** — se aplican las convenciones de España (`1.234` y `dd/mm`).
|
|
265
|
+
- **Sin configuración** — el plugin no declara esquema de configuración: activarlo o desactivarlo en
|
|
266
|
+
la página Plugins es el único mando, y así se evita depender de librerías fuera del paquete.
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Bundle patch layer for dsh-eslat (EsLat): applied after the dsh-base and
|
|
2
|
+
# dsh-web-app layers, before this profile's own cordis.patch.yml.
|
|
3
|
+
#
|
|
4
|
+
# One row: the Spanish label pack. Its host half is an inert entry that keeps
|
|
5
|
+
# the package in the Loader tree; the browser half arrives through the
|
|
6
|
+
# package's `dsh.client` declaration (exports["./client"]).
|
|
7
|
+
- insert:
|
|
8
|
+
- id: eslat
|
|
9
|
+
name: 'dsh-eslat'
|
package/icon.svg
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- EsLat, stacked: "Es" above "Lat" in the same palette — blue gradient over cyan accent.
|
|
3
|
+
textLength pins each line to an exact width and text-anchor keeps both centred, so the
|
|
4
|
+
stack neither clips nor drifts when the host resolves a different sans-serif (an <img>
|
|
5
|
+
cannot load webfonts). -->
|
|
6
|
+
<text x="18" y="17" text-anchor="middle" font-family="Inter, 'Segoe UI', system-ui, -apple-system, Arial, sans-serif" font-size="14" font-weight="800" letter-spacing="-0.3" textLength="17" lengthAdjust="spacingAndGlyphs" fill="url(#eslat-es)">Es</text>
|
|
7
|
+
<text x="18" y="29" text-anchor="middle" font-family="Inter, 'Segoe UI', system-ui, -apple-system, Arial, sans-serif" font-size="11" font-weight="700" letter-spacing="0.1" textLength="16.5" lengthAdjust="spacingAndGlyphs" fill="#45D9E7">Lat</text>
|
|
8
|
+
<defs>
|
|
9
|
+
<linearGradient id="eslat-es" x1="9.5" y1="7" x2="26.5" y2="18" gradientUnits="userSpaceOnUse">
|
|
10
|
+
<stop stop-color="#7AC2FF"/>
|
|
11
|
+
<stop offset="1" stop-color="#4A65E8"/>
|
|
12
|
+
</linearGradient>
|
|
13
|
+
</defs>
|
|
14
|
+
</svg>
|
package/lib/client.js
ADDED
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* dsh-eslat — built client half. Do not edit: generated by tools/build.mjs from src/.
|
|
3
|
+
*
|
|
4
|
+
* Registers the Spanish ("es") language and its dictionaries for the namespaces that own
|
|
5
|
+
* tool-call copy and status summaries, then selects Spanish once (see activateOnce).
|
|
6
|
+
*/
|
|
7
|
+
window.__ModuleLoader__.load({
|
|
8
|
+
id: "dsh-eslat",
|
|
9
|
+
factory: (require) => {
|
|
10
|
+
var module = { exports: {} };
|
|
11
|
+
var exports = module.exports;
|
|
12
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
13
|
+
|
|
14
|
+
//#region src/language.json
|
|
15
|
+
const LANGUAGE = {
|
|
16
|
+
"id": "es",
|
|
17
|
+
"label": "Español",
|
|
18
|
+
"fallback": "en",
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/conversation.es.json
|
|
22
|
+
const CONVERSATION_ES = {
|
|
23
|
+
"todo.title": "Tareas",
|
|
24
|
+
"todo.progress.done": "{done} completadas",
|
|
25
|
+
"todo.progress.active": "{active} en curso",
|
|
26
|
+
"todo.progress.pending": "{pending} pendientes",
|
|
27
|
+
"todo.status.completed": "Completada",
|
|
28
|
+
"todo.status.inProgress": "En curso",
|
|
29
|
+
"todo.status.pending": "Pendiente",
|
|
30
|
+
"todo.rowTitle": "Actualizar la lista de tareas",
|
|
31
|
+
"tool.title.createGoal": "Crear objetivo",
|
|
32
|
+
"tool.title.getGoal": "Ver objetivo",
|
|
33
|
+
"tool.title.updateGoal": "Actualizar objetivo",
|
|
34
|
+
"tool.preparing.content": "Preparando contenido: {kilobytes} KB",
|
|
35
|
+
"tool.title.createSchedule": "Crear recordatorio",
|
|
36
|
+
"tool.title.listSchedules": "Listar recordatorios",
|
|
37
|
+
"tool.title.deleteSchedule": "Eliminar recordatorio",
|
|
38
|
+
"tool.title.updateSchedule": "Actualizar recordatorio",
|
|
39
|
+
"detail.state": "Estado",
|
|
40
|
+
"detail.todo.completed": "Completada",
|
|
41
|
+
"detail.todo.in_progress": "En curso",
|
|
42
|
+
"detail.todo.pending": "Pendiente",
|
|
43
|
+
"detail.todo.empty": "La lista de tareas está vacía",
|
|
44
|
+
"todo.diff.initial": "Lista inicial",
|
|
45
|
+
"todo.diff.compare": "Cambios desde la lista anterior",
|
|
46
|
+
"todo.diff.unavailable": "La lista anterior no está disponible",
|
|
47
|
+
"todo.diff.noChanges": "Sin cambios en la lista",
|
|
48
|
+
"todo.diff.added": "{count} añadidas",
|
|
49
|
+
"todo.diff.updated": "{count} actualizadas",
|
|
50
|
+
"todo.diff.removed": "{count} eliminadas",
|
|
51
|
+
"todo.diff.unchanged": "{count} sin cambios",
|
|
52
|
+
"todo.diff.addedItem": "Añadida",
|
|
53
|
+
"todo.diff.updatedItem": "Estado cambiado",
|
|
54
|
+
"todo.diff.movedItem": "Reordenada",
|
|
55
|
+
"todo.diff.removedItem": "Eliminada",
|
|
56
|
+
"detail.goal.empty": "Sin objetivo",
|
|
57
|
+
"detail.goal.active": "Activo",
|
|
58
|
+
"detail.goal.disarmed": "En espera de continuación",
|
|
59
|
+
"detail.goal.paused": "En pausa",
|
|
60
|
+
"detail.goal.blocked": "Bloqueado",
|
|
61
|
+
"detail.goal.complete": "Completado",
|
|
62
|
+
"detail.goal.rounds": "Rondas",
|
|
63
|
+
"detail.goal.reason": "Bloqueo",
|
|
64
|
+
"detail.days": "{count} d",
|
|
65
|
+
"detail.hours": "{count} h",
|
|
66
|
+
"detail.minutes": "{count} min",
|
|
67
|
+
"detail.seconds": "{count} s",
|
|
68
|
+
"detail.schedule.once": "Una vez",
|
|
69
|
+
"detail.schedule.every": "Cada {interval}",
|
|
70
|
+
"detail.schedule.when": "Programado para",
|
|
71
|
+
"detail.schedule.frequency": "Repetición",
|
|
72
|
+
"detail.schedule.scheduled": "Programado",
|
|
73
|
+
"detail.schedule.overdue": "Atrasado, esperando a reanudar la sesión",
|
|
74
|
+
"detail.schedule.empty": "Sin recordatorios",
|
|
75
|
+
"detail.schedule.deleted": "Eliminado",
|
|
76
|
+
"detail.schedule.count": "{count} recordatorios",
|
|
77
|
+
"detail.schedule.daily": "Todos los días a las {time} ({zone})",
|
|
78
|
+
"detail.schedule.weekly": "Cada semana los {days} a las {time} ({zone})",
|
|
79
|
+
"detail.schedule.cron": "Cron {expression} ({zone})",
|
|
80
|
+
"detail.weekday.1": "lun",
|
|
81
|
+
"detail.weekday.2": "mar",
|
|
82
|
+
"detail.weekday.3": "mié",
|
|
83
|
+
"detail.weekday.4": "jue",
|
|
84
|
+
"detail.weekday.5": "vie",
|
|
85
|
+
"detail.weekday.6": "sáb",
|
|
86
|
+
"detail.weekday.7": "dom",
|
|
87
|
+
"detail.weekday.join": ", ",
|
|
88
|
+
"tool.title.inspectProviders": "Inspeccionar proveedores",
|
|
89
|
+
"tool.title.queryRuntime": "Consultar el entorno de ejecución",
|
|
90
|
+
"tool.title.inspectPlugins": "Inspeccionar plugins",
|
|
91
|
+
"tool.title.workflow": "Ejecutar flujo de trabajo",
|
|
92
|
+
"tool.title.ralph": "Ejecutar bucle ralph",
|
|
93
|
+
"tool.title.readEvent": "Leer evento",
|
|
94
|
+
"tool.title.searchEvents": "Buscar eventos",
|
|
95
|
+
"tool.title.traceEvent": "Rastrear evento",
|
|
96
|
+
"tool.title.searchSessions": "Buscar sesiones",
|
|
97
|
+
"tool.title.traceSession": "Rastrear sesión",
|
|
98
|
+
"tool.title.listModels": "Listar modelos",
|
|
99
|
+
"tool.title.subagent": "Crear subagente",
|
|
100
|
+
"tool.title.listAgents": "Listar subagentes",
|
|
101
|
+
"tool.title.sendMessage": "Enviar mensaje",
|
|
102
|
+
"tool.title.interruptAgent": "Interrumpir agente",
|
|
103
|
+
"tool.title.listJobs": "Listar tareas en segundo plano",
|
|
104
|
+
"tool.title.readJob": "Leer la salida de la tarea",
|
|
105
|
+
"tool.title.killJob": "Cancelar tarea en segundo plano",
|
|
106
|
+
"tool.title.openTerminal": "Abrir terminal",
|
|
107
|
+
"tool.title.readTerminal": "Leer terminal",
|
|
108
|
+
"tool.title.listTerminals": "Listar terminales",
|
|
109
|
+
"tool.title.signalTerminal": "Enviar señal a la terminal",
|
|
110
|
+
"tool.title.closeTerminal": "Cerrar terminal",
|
|
111
|
+
"tool.title.lsp": "Consultar símbolos de código",
|
|
112
|
+
"tool.title.findDefinition": "Buscar definición",
|
|
113
|
+
"tool.title.findReferences": "Buscar referencias",
|
|
114
|
+
"tool.title.findImplementation": "Buscar implementación",
|
|
115
|
+
"tool.title.hoverSymbol": "Inspeccionar símbolo",
|
|
116
|
+
"tool.title.spawnTeammate": "Crear compañero",
|
|
117
|
+
"tool.title.createTeamTask": "Crear tarea de equipo",
|
|
118
|
+
"tool.title.getTeamTask": "Leer tarea de equipo",
|
|
119
|
+
"tool.title.updateTeamTask": "Actualizar tarea de equipo",
|
|
120
|
+
"tool.title.listTeamTasks": "Listar tareas de equipo",
|
|
121
|
+
"tool.title.waitAgent": "Esperar al subagente",
|
|
122
|
+
"detail.recordedResult": "Resultado registrado",
|
|
123
|
+
"detail.empty": "Sin resultados",
|
|
124
|
+
"detail.none": "Ninguno",
|
|
125
|
+
"detail.yes": "Sí",
|
|
126
|
+
"detail.no": "No",
|
|
127
|
+
"detail.moreInInspect": "{count} elementos más disponibles en Inspeccionar",
|
|
128
|
+
"detail.status.running": "En ejecución",
|
|
129
|
+
"detail.status.idle": "Inactivo",
|
|
130
|
+
"detail.status.ready": "Listo",
|
|
131
|
+
"detail.status.inactive": "Inactivo",
|
|
132
|
+
"detail.status.provisioning": "Aprovisionando",
|
|
133
|
+
"detail.status.failed": "Fallido",
|
|
134
|
+
"detail.status.completed": "Completado",
|
|
135
|
+
"detail.status.deleted": "Eliminado",
|
|
136
|
+
"detail.status.killed": "Cancelado",
|
|
137
|
+
"detail.status.accepted": "Aceptado",
|
|
138
|
+
"detail.status.queued": "En cola",
|
|
139
|
+
"detail.status.exited": "Finalizado",
|
|
140
|
+
"detail.field.id": "ID",
|
|
141
|
+
"detail.field.revision": "Revisión",
|
|
142
|
+
"detail.field.platform": "Plataforma",
|
|
143
|
+
"detail.field.provider": "Proveedor",
|
|
144
|
+
"detail.field.model": "Modelo",
|
|
145
|
+
"detail.field.role": "Rol",
|
|
146
|
+
"detail.field.context": "Contexto",
|
|
147
|
+
"detail.field.owner": "Propietario",
|
|
148
|
+
"detail.field.ready": "Listo",
|
|
149
|
+
"detail.field.dependencies": "Dependencias",
|
|
150
|
+
"detail.field.writeScopes": "Ámbitos de escritura",
|
|
151
|
+
"detail.field.warnings": "Avisos",
|
|
152
|
+
"detail.field.diagnostics": "Diagnósticos",
|
|
153
|
+
"detail.field.methods": "Métodos",
|
|
154
|
+
"detail.field.inputSchema": "Esquema de entrada",
|
|
155
|
+
"detail.field.outputSchema": "Esquema de salida",
|
|
156
|
+
"detail.field.currentPackage": "Paquete actual",
|
|
157
|
+
"detail.field.nextPackage": "Paquete siguiente",
|
|
158
|
+
"detail.field.latestRun": "Última ejecución",
|
|
159
|
+
"detail.field.packages": "Paquetes",
|
|
160
|
+
"detail.field.registrations": "Registros",
|
|
161
|
+
"detail.field.props": "Propiedades",
|
|
162
|
+
"detail.field.data": "Datos",
|
|
163
|
+
"detail.field.source": "Origen",
|
|
164
|
+
"detail.field.content": "Contenido",
|
|
165
|
+
"detail.field.message": "Mensaje",
|
|
166
|
+
"detail.field.messageId": "ID del mensaje",
|
|
167
|
+
"detail.field.root": "Raíz",
|
|
168
|
+
"detail.field.pid": "ID del proceso",
|
|
169
|
+
"detail.field.type": "Tipo",
|
|
170
|
+
"detail.field.time": "Hora",
|
|
171
|
+
"detail.field.seq": "Secuencia del evento",
|
|
172
|
+
"detail.field.turn": "Turno",
|
|
173
|
+
"detail.field.step": "Paso",
|
|
174
|
+
"detail.field.callId": "ID de la llamada",
|
|
175
|
+
"detail.field.agents": "Agentes iniciados",
|
|
176
|
+
"detail.field.result": "Resultado",
|
|
177
|
+
"detail.field.parent": "Padre",
|
|
178
|
+
"detail.field.depth": "Profundidad",
|
|
179
|
+
"detail.field.exitCode": "Código de salida",
|
|
180
|
+
"detail.field.signal": "Señal",
|
|
181
|
+
"detail.field.previousStatus": "Estado anterior",
|
|
182
|
+
"detail.field.agent": "ID del agente",
|
|
183
|
+
"detail.field.job": "ID de la tarea",
|
|
184
|
+
"detail.field.task": "Tarea",
|
|
185
|
+
"detail.field.processGroup": "Grupo de procesos",
|
|
186
|
+
"detail.field.availability": "Disponibilidad",
|
|
187
|
+
"detail.field.bestMatch": "Mejor coincidencia",
|
|
188
|
+
"detail.field.target": "Evento de destino",
|
|
189
|
+
"detail.field.surface": "Estado del registro",
|
|
190
|
+
"detail.agents.count": "{count} agentes",
|
|
191
|
+
"detail.jobs.count": "{count} tareas en segundo plano",
|
|
192
|
+
"detail.terminals.count": "{count} terminales",
|
|
193
|
+
"detail.tasks.count": "{count} tareas de equipo",
|
|
194
|
+
"detail.tasks.nextPage": "Hay más tareas disponibles; el cursor siguiente es {cursor}",
|
|
195
|
+
"detail.locations.count": "{count} ubicaciones",
|
|
196
|
+
"detail.location": "Línea {line}, columna {column}",
|
|
197
|
+
"detail.receipt.delivered": "Mensaje entregado",
|
|
198
|
+
"detail.receipt.interrupt": "Interrupción solicitada",
|
|
199
|
+
"detail.receipt.started": "Iniciado",
|
|
200
|
+
"detail.receipt.cancel": "Cancelación solicitada",
|
|
201
|
+
"detail.receipt.alreadyFinished": "Ya había finalizado",
|
|
202
|
+
"detail.receipt.signal": "Señal entregada",
|
|
203
|
+
"detail.receipt.closed": "Cerrado",
|
|
204
|
+
"detail.receipt.closing": "Cerrando",
|
|
205
|
+
"detail.wait.noProgress": "No hay subagentes activos",
|
|
206
|
+
"detail.wait.title": "Actividad de los subagentes",
|
|
207
|
+
"detail.wait.timeout": "Se agotó el tiempo de espera",
|
|
208
|
+
"detail.wait.changed": "Se detectó un cambio",
|
|
209
|
+
"detail.agent.reply": "Respuesta del agente",
|
|
210
|
+
"detail.models.title": "Modelos disponibles",
|
|
211
|
+
"detail.output.lines": "Líneas {begin}–{end} de {total}",
|
|
212
|
+
"detail.output.truncated": "Salida truncada",
|
|
213
|
+
"detail.providers.count": "{count} proveedores de inspección",
|
|
214
|
+
"detail.plugins.count": "{count} plugins dinámicos",
|
|
215
|
+
"detail.workflow.script": "Script del flujo de trabajo",
|
|
216
|
+
"detail.ralph.reportedComplete": "El trabajador informó de que terminó",
|
|
217
|
+
"detail.ralph.reportedBlocker": "El trabajador informó de un bloqueo",
|
|
218
|
+
"detail.ralph.limit": "Se alcanzó el límite de rondas",
|
|
219
|
+
"detail.report.nextSteps": "Trabajo pendiente",
|
|
220
|
+
"detail.trace.replacedBy": "Reemplazado por",
|
|
221
|
+
"detail.trace.replacementChain": "Cadena de reemplazos",
|
|
222
|
+
"detail.trace.replaces": "Eventos reemplazados",
|
|
223
|
+
"detail.trace.sources": "Eventos de origen",
|
|
224
|
+
"detail.trace.derived": "Eventos derivados",
|
|
225
|
+
"detail.trace.ancestors": "Sesiones antecesoras",
|
|
226
|
+
"detail.trace.descendants": "Sesiones descendientes",
|
|
227
|
+
"detail.matches.count": "{count} coincidencias",
|
|
228
|
+
"detail.matches.capped": "Se alcanzó el límite de resultados; acota la búsqueda para ver más",
|
|
229
|
+
"detail.event.neighbors": "Eventos contiguos",
|
|
230
|
+
"todo.completed": "{done}/{total} completadas",
|
|
231
|
+
"ask.rowTitle": "Hacer una pregunta",
|
|
232
|
+
"ask.waiting": "esperando",
|
|
233
|
+
"ask.pending": "continuó; la respuesta sigue disponible",
|
|
234
|
+
"ask.pendingDetail": "Estas preguntas pendientes aún se pueden responder desde el cuadro de mensaje.",
|
|
235
|
+
"ask.reopen": "Responder",
|
|
236
|
+
"ask.review": "Ver respuestas",
|
|
237
|
+
"ask.closed": "cerrada",
|
|
238
|
+
"ask.closedDetail": "Esta pregunta está cerrada; el resultado aparece en la conversación de abajo.",
|
|
239
|
+
"ask.cancelled": "cancelada",
|
|
240
|
+
"ask.cancelledDetail": "Este conjunto de preguntas se canceló antes de enviar respuestas.",
|
|
241
|
+
"ask.interrupted": "interrumpida",
|
|
242
|
+
"ask.interruptedDetail": "Este conjunto de preguntas se interrumpió antes de enviar respuestas.",
|
|
243
|
+
"ask.answered": "{answered}/{total} respondidas",
|
|
244
|
+
"ask.skipped": "Sin responder",
|
|
245
|
+
"bash.running": "En ejecución",
|
|
246
|
+
"bash.failed": "Fallido",
|
|
247
|
+
"bash.stopped": "Detenido",
|
|
248
|
+
"row.running": "En ejecución",
|
|
249
|
+
"row.preparing": "Preparando la llamada",
|
|
250
|
+
"row.failed": "Fallida",
|
|
251
|
+
"row.stopped": "Detenida",
|
|
252
|
+
"row.input": "ENT",
|
|
253
|
+
"row.output": "SAL",
|
|
254
|
+
"row.inspect": "Inspeccionar",
|
|
255
|
+
"tool.title.search": "Buscar",
|
|
256
|
+
"tool.title.read": "Leer",
|
|
257
|
+
"tool.title.bash": "Bash",
|
|
258
|
+
"tool.title.write": "Escribir",
|
|
259
|
+
"tool.title.edit": "Editar",
|
|
260
|
+
"tool.title.code": "Código",
|
|
261
|
+
"tool.title.generic": "Llamada a herramienta",
|
|
262
|
+
"tool.title.inspect": "Consultar el entorno Cordis",
|
|
263
|
+
"tool.title.runCordis": "Ejecutar plugin de Cordis",
|
|
264
|
+
"tool.title.stopCordis": "Detener plugin de Cordis",
|
|
265
|
+
"tool.title.removeCordis": "Eliminar plugin de Cordis",
|
|
266
|
+
"tool.title.pwsh": "PowerShell",
|
|
267
|
+
"tool.title.readImage": "Leer imagen",
|
|
268
|
+
"tool.title.grep": "Buscar en el contenido",
|
|
269
|
+
"tool.title.glob": "Buscar archivos",
|
|
270
|
+
"tool.title.webSearch": "Buscar en la web",
|
|
271
|
+
"tool.title.webFetch": "Obtener página web",
|
|
272
|
+
"tool.autoReviewRejected": "Rechazada por la revisión automática",
|
|
273
|
+
"tool.autoReviewNotExecuted": "La herramienta no se ejecutó. Motivo: {reason}",
|
|
274
|
+
"tool.autoReviewReasonFallback": "La revisión automática no autorizó esta acción",
|
|
275
|
+
"diff.collapseAria": "Contraer diferencias",
|
|
276
|
+
"diff.expandAria": "Expandir {count} líneas de diferencias más",
|
|
277
|
+
"diff.expandRest": "… {count} líneas más",
|
|
278
|
+
"read.window": "Mostrando {shown} de {total} líneas",
|
|
279
|
+
"read.collapseAria": "Contraer contenido",
|
|
280
|
+
"read.expandAria": "Expandir {count} líneas más",
|
|
281
|
+
"read.expandRest": "… {count} líneas más",
|
|
282
|
+
"search.paths": "{shown} rutas",
|
|
283
|
+
"search.paths.truncated": "Mostrando {shown} de {total} rutas",
|
|
284
|
+
"search.matches": "{shown} coincidencias · {files} archivos",
|
|
285
|
+
"search.matches.truncated": "Mostrando {shown} de {total} coincidencias · {files} archivos",
|
|
286
|
+
"search.noResults": "Sin resultados",
|
|
287
|
+
"search.collapseAria": "Contraer resultados",
|
|
288
|
+
"search.expandAria": "Expandir {count} líneas de resultados más",
|
|
289
|
+
"search.expandRest": "… {count} líneas más",
|
|
290
|
+
"web.noResults": "No se encontraron resultados",
|
|
291
|
+
"web.sourcesTruncated": "Lista de fuentes truncada",
|
|
292
|
+
"web.http": "HTTP",
|
|
293
|
+
"web.contentTruncated": "Contenido truncado",
|
|
294
|
+
"details.running": "En ejecución…",
|
|
295
|
+
"terminal.signal": "señal {signal}",
|
|
296
|
+
"terminal.exitCode": "código de salida {code}",
|
|
297
|
+
"terminal.noExitCode": "sin código de salida",
|
|
298
|
+
"terminal.running": "En ejecución",
|
|
299
|
+
"terminal.failed": "Fallido",
|
|
300
|
+
"terminal.done": "Listo",
|
|
301
|
+
"terminal.noOutput": "Sin salida",
|
|
302
|
+
"terminal.collapseAria": "Contraer salida",
|
|
303
|
+
"terminal.expandAria": "Expandir las {n} líneas de salida restantes",
|
|
304
|
+
"terminal.expandRest": "… {n} líneas más",
|
|
305
|
+
"terminal.sendInput": "(enviar entrada)",
|
|
306
|
+
"terminal.session": "Terminal {sessionId}",
|
|
307
|
+
};
|
|
308
|
+
//#endregion
|
|
309
|
+
//#region src/chat.es.json
|
|
310
|
+
const CHAT_ES = {
|
|
311
|
+
"message.stepProcess.thinking": "Analizando la solicitud",
|
|
312
|
+
"message.stepProcess.read": "Leyendo archivos",
|
|
313
|
+
"message.stepProcess.readImage": "Leyendo imágenes",
|
|
314
|
+
"message.stepProcess.write": "Escribiendo archivos",
|
|
315
|
+
"message.stepProcess.search": "Buscando en el código",
|
|
316
|
+
"message.stepProcess.edit": "Editando archivos",
|
|
317
|
+
"message.stepProcess.commands": "Ejecutando comandos",
|
|
318
|
+
"message.stepProcess.code": "Ejecutando código",
|
|
319
|
+
"message.stepProcess.webSearch": "Buscando en la web",
|
|
320
|
+
"message.stepProcess.webFetch": "Visitando páginas web",
|
|
321
|
+
"message.stepProcess.subagents": "Coordinando subagentes",
|
|
322
|
+
"message.stepProcess.plan": "Actualizando el plan",
|
|
323
|
+
"message.stepProcess.questions": "Esperando tu acción",
|
|
324
|
+
"message.stepProcess.tools": "Llamando a herramientas",
|
|
325
|
+
"message.stepProcess.prepare.read": "Preparando la lectura de archivos",
|
|
326
|
+
"message.stepProcess.prepare.readImage": "Preparando la lectura de imágenes",
|
|
327
|
+
"message.stepProcess.prepare.write": "Preparando la escritura de archivos",
|
|
328
|
+
"message.stepProcess.prepare.search": "Preparando la búsqueda en el código",
|
|
329
|
+
"message.stepProcess.prepare.edit": "Preparando la edición de archivos",
|
|
330
|
+
"message.stepProcess.prepare.commands": "Preparando la ejecución de comandos",
|
|
331
|
+
"message.stepProcess.prepare.code": "Preparando la ejecución de código",
|
|
332
|
+
"message.stepProcess.prepare.webSearch": "Preparando la búsqueda en la web",
|
|
333
|
+
"message.stepProcess.prepare.webFetch": "Preparando la visita a páginas web",
|
|
334
|
+
"message.stepProcess.prepare.subagents": "Preparando la coordinación de subagentes",
|
|
335
|
+
"message.stepProcess.prepare.plan": "Preparando la actualización del plan",
|
|
336
|
+
"message.stepProcess.prepare.questions": "Preparando preguntas",
|
|
337
|
+
"message.stepProcess.prepare.tools": "Preparando llamadas a herramientas",
|
|
338
|
+
"message.stepProcess.done.thinking": "Análisis completado",
|
|
339
|
+
"message.stepProcess.done.read": "Se leyeron archivos",
|
|
340
|
+
"message.stepProcess.done.readImage": "Se leyeron imágenes",
|
|
341
|
+
"message.stepProcess.done.write": "Se escribieron archivos",
|
|
342
|
+
"message.stepProcess.done.search": "Se buscó en el código",
|
|
343
|
+
"message.stepProcess.done.edit": "Se editaron archivos",
|
|
344
|
+
"message.stepProcess.done.commands": "Se ejecutaron comandos",
|
|
345
|
+
"message.stepProcess.done.code": "Se ejecutó código",
|
|
346
|
+
"message.stepProcess.done.webSearch": "Se buscó en la web",
|
|
347
|
+
"message.stepProcess.done.webFetch": "Se visitaron páginas web",
|
|
348
|
+
"message.stepProcess.done.subagents": "Se coordinaron subagentes",
|
|
349
|
+
"message.stepProcess.done.plan": "Se actualizó el plan",
|
|
350
|
+
"message.stepProcess.done.questions": "Se hicieron preguntas",
|
|
351
|
+
"message.stepProcess.done.tools": "Se llamó a herramientas",
|
|
352
|
+
"message.stepProcess.joinTwo": "{first} y {second}",
|
|
353
|
+
"message.stepProcess.comma": ", ",
|
|
354
|
+
"message.stepProcess.sharedPrefix": "",
|
|
355
|
+
"message.stepProcess.more": "{title}, etc.",
|
|
356
|
+
"message.trigger.request": "Ejecución solicitada",
|
|
357
|
+
"message.trigger.goal": "Continuando el objetivo",
|
|
358
|
+
"message.trigger.agent": "Mensaje de tarea recibido",
|
|
359
|
+
"message.trigger.team": "Mensaje de equipo recibido",
|
|
360
|
+
"message.trigger.subagent": "Estado de la subtarea actualizado",
|
|
361
|
+
"message.trigger.github": "Evento de GitHub recibido",
|
|
362
|
+
"message.trigger.webhook": "Evento externo recibido",
|
|
363
|
+
"message.trigger.schedule": "Tarea automatizada",
|
|
364
|
+
"message.trigger.job": "Tarea en segundo plano actualizada",
|
|
365
|
+
"message.trigger.plugin": "Estado del plugin actualizado",
|
|
366
|
+
"message.trigger.explanation": "Esta notificación inició esta respuesta.",
|
|
367
|
+
"message.turnProcess.worked": "Completado",
|
|
368
|
+
"message.turnProcess.took": "Completado en ",
|
|
369
|
+
"message.turnProcess.failed": "Se produjo un error",
|
|
370
|
+
"message.turnProcess.toolCalls.one": "{count} llamada a herramienta",
|
|
371
|
+
"message.turnProcess.toolCalls.other": "{count} llamadas a herramientas",
|
|
372
|
+
"message.turnProcess.messages.one": "{count} mensaje",
|
|
373
|
+
"message.turnProcess.messages.other": "{count} mensajes",
|
|
374
|
+
"message.turnProcess.subagents.one": "{count} subagente",
|
|
375
|
+
"message.turnProcess.subagents.other": "{count} subagentes",
|
|
376
|
+
"message.turnProcess.thoughtForAWhile": "Pensó un rato",
|
|
377
|
+
"message.turnProcess.separator": " · ",
|
|
378
|
+
"message.stopped": "Detenido",
|
|
379
|
+
"message.retry.active": "Reintentando la solicitud al modelo",
|
|
380
|
+
"message.retry.cancelled": "Reintento de la solicitud al modelo cancelado",
|
|
381
|
+
"message.retry.started": "Se reintentó la solicitud al modelo",
|
|
382
|
+
"message.retry.scheduled": "Esperando para reintentar la solicitud al modelo",
|
|
383
|
+
"message.retry.status": "{label} ({retry}/{maximum}) · {seconds} s",
|
|
384
|
+
"message.retry.delay": "Retardo del reintento: ",
|
|
385
|
+
"message.retry.failure": "Motivo del fallo: ",
|
|
386
|
+
"message.turnError": "Este turno falló",
|
|
387
|
+
"message.maxTokens": "Se alcanzó el límite de tokens de salida",
|
|
388
|
+
"message.maxTokens.hint": "La respuesta se cortó; la salida anterior se conserva en la conversación. Envía «continúa» para que el modelo siga.",
|
|
389
|
+
"message.tokensPerSecond": "{tps} tok/s",
|
|
390
|
+
"message.turnUsage.title": "Uso del turno",
|
|
391
|
+
"message.turnUsage.consumed": "Uso {total}",
|
|
392
|
+
"message.turnUsage.model": "Proveedor / modelo",
|
|
393
|
+
"message.turnUsage.cacheHit": "Aciertos de caché",
|
|
394
|
+
"message.turnUsage.input": "Entrada sin caché",
|
|
395
|
+
"message.turnUsage.cacheRead": "Lectura de caché",
|
|
396
|
+
"message.turnUsage.cacheWrite": "Escritura en caché",
|
|
397
|
+
"message.turnUsage.output": "Salida",
|
|
398
|
+
"message.turnUsage.reasoning": " ({tokens} de razonamiento)",
|
|
399
|
+
"message.turnUsage.count": "{count} tok",
|
|
400
|
+
"duration.compactSeconds": "{seconds} s",
|
|
401
|
+
"duration.compactMinutes": "{minutes} min {seconds} s",
|
|
402
|
+
"duration.milliseconds": "{milliseconds} ms",
|
|
403
|
+
"duration.secondUnit": " s",
|
|
404
|
+
"duration.minuteUnit": " min ",
|
|
405
|
+
"duration.hourUnit": " h ",
|
|
406
|
+
"stats.counts": "{turns} turnos {steps} pasos",
|
|
407
|
+
"stats.cacheHit": "Aciertos de caché {percent}%",
|
|
408
|
+
"chat.deepDiving": "Profundizando",
|
|
409
|
+
"chat.deepDivingFor": "Profundizando desde hace {duration} ···",
|
|
410
|
+
"command.running": "En ejecución…",
|
|
411
|
+
"command.failed": "El comando falló",
|
|
412
|
+
"command.done": "Completado",
|
|
413
|
+
"command.title": "Comando",
|
|
414
|
+
"row.running": "En ejecución",
|
|
415
|
+
"row.failed": "Fallido",
|
|
416
|
+
"json.truncated": "… truncado, {total} caracteres en total",
|
|
417
|
+
"number.groupSeparator": ".",
|
|
418
|
+
"clock.md": "{d}/{m}",
|
|
419
|
+
"clock.ymd": "{d}/{m}/{y}",
|
|
420
|
+
};
|
|
421
|
+
//#endregion
|
|
422
|
+
//#region src/common.es.json
|
|
423
|
+
const COMMON_ES = {
|
|
424
|
+
"ok": "Aceptar",
|
|
425
|
+
"cancel": "Cancelar",
|
|
426
|
+
"close": "Cerrar",
|
|
427
|
+
"copy": "Copiar",
|
|
428
|
+
"copied": "Copiado",
|
|
429
|
+
"codeBlock.title": "Bloque de código",
|
|
430
|
+
"codeBlock.wrap": "Ajustar líneas",
|
|
431
|
+
"codeBlock.unwrap": "No ajustar líneas",
|
|
432
|
+
"copy.failed": "No se pudo copiar",
|
|
433
|
+
"copy.value": "Copiar valor",
|
|
434
|
+
"copy.json": "Copiar JSON",
|
|
435
|
+
"copy.path": "Copiar ruta de la propiedad",
|
|
436
|
+
"copy.prettyJson": "Copiar JSON con formato",
|
|
437
|
+
"copy.compactJson": "Copiar JSON compacto",
|
|
438
|
+
"copy.optionsHint": "{action}; haz clic con el botón derecho para ver las opciones de copia",
|
|
439
|
+
"retry": "Reintentar",
|
|
440
|
+
"loading": "Cargando…",
|
|
441
|
+
"load.failed": "No se pudo cargar",
|
|
442
|
+
"submit": "Enviar",
|
|
443
|
+
"submitting": "Enviando…",
|
|
444
|
+
"next": "Siguiente",
|
|
445
|
+
"previous": "Anterior",
|
|
446
|
+
"skip": "Omitir",
|
|
447
|
+
"delete": "Eliminar",
|
|
448
|
+
"edit": "Editar",
|
|
449
|
+
"save": "Guardar",
|
|
450
|
+
"search": "Buscar",
|
|
451
|
+
"more": "Más",
|
|
452
|
+
"collapse": "Contraer",
|
|
453
|
+
"expand": "Expandir",
|
|
454
|
+
"back": "Atrás",
|
|
455
|
+
"brand.localBuild": "Compilación local de DSH",
|
|
456
|
+
"workspace.defaultName": "Espacio de trabajo predeterminado",
|
|
457
|
+
"unknown": "Desconocido",
|
|
458
|
+
"none": "Ninguno",
|
|
459
|
+
"truncated": "Truncado",
|
|
460
|
+
"json.label": "JSON",
|
|
461
|
+
"markdown.footnotes": "Notas al pie",
|
|
462
|
+
"markdown.truncatedCharacters": "… truncado en {total} caracteres",
|
|
463
|
+
"number.thousand": "{value} mil",
|
|
464
|
+
"number.million": "{value} M",
|
|
465
|
+
};
|
|
466
|
+
//#endregion
|
|
467
|
+
//#region src/settings-locale.es.json
|
|
468
|
+
const SETTINGS_LOCALE_ES = {
|
|
469
|
+
"language.title": "Idioma",
|
|
470
|
+
};
|
|
471
|
+
//#endregion
|
|
472
|
+
|
|
473
|
+
/** Every namespace this pack translates for its locale, in registration order. */
|
|
474
|
+
const NAMESPACES = [
|
|
475
|
+
{ ns: "conversation", dictionary: CONVERSATION_ES },
|
|
476
|
+
{ ns: "chat", dictionary: CHAT_ES },
|
|
477
|
+
{ ns: "common", dictionary: COMMON_ES },
|
|
478
|
+
{ ns: "settings.locale", dictionary: SETTINGS_LOCALE_ES },
|
|
479
|
+
];
|
|
480
|
+
|
|
481
|
+
/** Required service: the dictionary registry and the locale preference owner. */
|
|
482
|
+
const inject = ["locale"];
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Storage key recording how this browser left the pack, so a later load can tell an
|
|
486
|
+
* explicit language choice apart from a shell re-supplying its own default.
|
|
487
|
+
*/
|
|
488
|
+
const ACTIVATION_MARKER = "dsh-eslat:activation";
|
|
489
|
+
|
|
490
|
+
/** Stored when this pack selected Spanish itself. */
|
|
491
|
+
const ACTIVATION_AUTO = "auto";
|
|
492
|
+
|
|
493
|
+
/** Stored when the user left Spanish: the pack never selects it again. */
|
|
494
|
+
const ACTIVATION_OPTED_OUT = "opted-out";
|
|
495
|
+
|
|
496
|
+
/** Locale the automatic switch replaces; any other active locale is a choice. */
|
|
497
|
+
const DEFAULT_LOCALE = "en";
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Read the activation marker.
|
|
501
|
+
* @returns the stored value, null when absent, or undefined when web storage is unavailable.
|
|
502
|
+
*/
|
|
503
|
+
function readMarker() {
|
|
504
|
+
try {
|
|
505
|
+
return window.localStorage.getItem(ACTIVATION_MARKER);
|
|
506
|
+
} catch {
|
|
507
|
+
return void 0;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Store the activation marker, ignoring a storage refusal.
|
|
513
|
+
* @param value - the marker value to store.
|
|
514
|
+
*/
|
|
515
|
+
function writeMarker(value) {
|
|
516
|
+
try {
|
|
517
|
+
window.localStorage.setItem(ACTIVATION_MARKER, value);
|
|
518
|
+
} catch {
|
|
519
|
+
/* A private-mode or sandboxed store only costs the pack its memory. */
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Select Spanish where the interface still shows the default locale, then remember
|
|
525
|
+
* how this browser left the pack.
|
|
526
|
+
*
|
|
527
|
+
* Only the default locale is replaced: a user reading Chinese or any other chosen
|
|
528
|
+
* language keeps it. Choosing anything but Spanish afterwards retires the automatic
|
|
529
|
+
* switch for good, while a stored "auto" marker still re-applies Spanish when a native
|
|
530
|
+
* shell hands back its own default on the next load.
|
|
531
|
+
* @param ctx - the client root context, for the opt-out subscription.
|
|
532
|
+
* @param locale - the locale service face.
|
|
533
|
+
*/
|
|
534
|
+
function activateOnce(ctx, locale) {
|
|
535
|
+
const marked = readMarker();
|
|
536
|
+
if (marked === ACTIVATION_OPTED_OUT) return;
|
|
537
|
+
if (locale.getLocale().active === DEFAULT_LOCALE) locale.setLocale(LANGUAGE.id);
|
|
538
|
+
if (marked === null) writeMarker(ACTIVATION_AUTO);
|
|
539
|
+
ctx.effect(
|
|
540
|
+
() => locale.subscribe(() => {
|
|
541
|
+
if (locale.getLocale().active !== LANGUAGE.id) writeMarker(ACTIVATION_OPTED_OUT);
|
|
542
|
+
}),
|
|
543
|
+
"dsh-eslat: opt-out watch",
|
|
544
|
+
);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* Client plugin body: register the language and its dictionaries, then select it once.
|
|
549
|
+
* @param ctx - the client root context.
|
|
550
|
+
*/
|
|
551
|
+
function apply(ctx) {
|
|
552
|
+
const locale = ctx.locale;
|
|
553
|
+
ctx.effect(() => locale.addLanguage(LANGUAGE), "dsh-eslat: language");
|
|
554
|
+
for (const entry of NAMESPACES) {
|
|
555
|
+
ctx.effect(
|
|
556
|
+
() => locale.register(entry.ns, LANGUAGE.id, entry.dictionary),
|
|
557
|
+
`dsh-eslat: ${entry.ns} dictionary`,
|
|
558
|
+
);
|
|
559
|
+
}
|
|
560
|
+
activateOnce(ctx, locale);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
exports.apply = apply;
|
|
564
|
+
exports.inject = inject;
|
|
565
|
+
return module.exports;
|
|
566
|
+
}
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["client.js"],"sourcesContent":["/*\n * dsh-eslat — built client half. Do not edit: generated by tools/build.mjs from src/.\n *\n * Registers the Spanish (\"es\") language and its dictionaries for the namespaces that own\n * tool-call copy and status summaries, then selects Spanish once (see activateOnce).\n */\nwindow.__ModuleLoader__.load({\n\tid: \"dsh-eslat\",\n\tfactory: (require) => {\n\t\tvar module = { exports: {} };\n\t\tvar exports = module.exports;\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \"Module\" });\n\n\t\t//#region src/language.json\n\t\tconst LANGUAGE = {\n\t\t\t\"id\": \"es\",\n\t\t\t\"label\": \"Español\",\n\t\t\t\"fallback\": \"en\",\n\t\t};\n\t\t//#endregion\n\t\t//#region src/conversation.es.json\n\t\tconst CONVERSATION_ES = {\n\t\t\t\"todo.title\": \"Tareas\",\n\t\t\t\"todo.progress.done\": \"{done} completadas\",\n\t\t\t\"todo.progress.active\": \"{active} en curso\",\n\t\t\t\"todo.progress.pending\": \"{pending} pendientes\",\n\t\t\t\"todo.status.completed\": \"Completada\",\n\t\t\t\"todo.status.inProgress\": \"En curso\",\n\t\t\t\"todo.status.pending\": \"Pendiente\",\n\t\t\t\"todo.rowTitle\": \"Actualizar la lista de tareas\",\n\t\t\t\"tool.title.createGoal\": \"Crear objetivo\",\n\t\t\t\"tool.title.getGoal\": \"Ver objetivo\",\n\t\t\t\"tool.title.updateGoal\": \"Actualizar objetivo\",\n\t\t\t\"tool.preparing.content\": \"Preparando contenido: {kilobytes} KB\",\n\t\t\t\"tool.title.createSchedule\": \"Crear recordatorio\",\n\t\t\t\"tool.title.listSchedules\": \"Listar recordatorios\",\n\t\t\t\"tool.title.deleteSchedule\": \"Eliminar recordatorio\",\n\t\t\t\"tool.title.updateSchedule\": \"Actualizar recordatorio\",\n\t\t\t\"detail.state\": \"Estado\",\n\t\t\t\"detail.todo.completed\": \"Completada\",\n\t\t\t\"detail.todo.in_progress\": \"En curso\",\n\t\t\t\"detail.todo.pending\": \"Pendiente\",\n\t\t\t\"detail.todo.empty\": \"La lista de tareas está vacía\",\n\t\t\t\"todo.diff.initial\": \"Lista inicial\",\n\t\t\t\"todo.diff.compare\": \"Cambios desde la lista anterior\",\n\t\t\t\"todo.diff.unavailable\": \"La lista anterior no está disponible\",\n\t\t\t\"todo.diff.noChanges\": \"Sin cambios en la lista\",\n\t\t\t\"todo.diff.added\": \"{count} añadidas\",\n\t\t\t\"todo.diff.updated\": \"{count} actualizadas\",\n\t\t\t\"todo.diff.removed\": \"{count} eliminadas\",\n\t\t\t\"todo.diff.unchanged\": \"{count} sin cambios\",\n\t\t\t\"todo.diff.addedItem\": \"Añadida\",\n\t\t\t\"todo.diff.updatedItem\": \"Estado cambiado\",\n\t\t\t\"todo.diff.movedItem\": \"Reordenada\",\n\t\t\t\"todo.diff.removedItem\": \"Eliminada\",\n\t\t\t\"detail.goal.empty\": \"Sin objetivo\",\n\t\t\t\"detail.goal.active\": \"Activo\",\n\t\t\t\"detail.goal.disarmed\": \"En espera de continuación\",\n\t\t\t\"detail.goal.paused\": \"En pausa\",\n\t\t\t\"detail.goal.blocked\": \"Bloqueado\",\n\t\t\t\"detail.goal.complete\": \"Completado\",\n\t\t\t\"detail.goal.rounds\": \"Rondas\",\n\t\t\t\"detail.goal.reason\": \"Bloqueo\",\n\t\t\t\"detail.days\": \"{count} d\",\n\t\t\t\"detail.hours\": \"{count} h\",\n\t\t\t\"detail.minutes\": \"{count} min\",\n\t\t\t\"detail.seconds\": \"{count} s\",\n\t\t\t\"detail.schedule.once\": \"Una vez\",\n\t\t\t\"detail.schedule.every\": \"Cada {interval}\",\n\t\t\t\"detail.schedule.when\": \"Programado para\",\n\t\t\t\"detail.schedule.frequency\": \"Repetición\",\n\t\t\t\"detail.schedule.scheduled\": \"Programado\",\n\t\t\t\"detail.schedule.overdue\": \"Atrasado, esperando a reanudar la sesión\",\n\t\t\t\"detail.schedule.empty\": \"Sin recordatorios\",\n\t\t\t\"detail.schedule.deleted\": \"Eliminado\",\n\t\t\t\"detail.schedule.count\": \"{count} recordatorios\",\n\t\t\t\"detail.schedule.daily\": \"Todos los días a las {time} ({zone})\",\n\t\t\t\"detail.schedule.weekly\": \"Cada semana los {days} a las {time} ({zone})\",\n\t\t\t\"detail.schedule.cron\": \"Cron {expression} ({zone})\",\n\t\t\t\"detail.weekday.1\": \"lun\",\n\t\t\t\"detail.weekday.2\": \"mar\",\n\t\t\t\"detail.weekday.3\": \"mié\",\n\t\t\t\"detail.weekday.4\": \"jue\",\n\t\t\t\"detail.weekday.5\": \"vie\",\n\t\t\t\"detail.weekday.6\": \"sáb\",\n\t\t\t\"detail.weekday.7\": \"dom\",\n\t\t\t\"detail.weekday.join\": \", \",\n\t\t\t\"tool.title.inspectProviders\": \"Inspeccionar proveedores\",\n\t\t\t\"tool.title.queryRuntime\": \"Consultar el entorno de ejecución\",\n\t\t\t\"tool.title.inspectPlugins\": \"Inspeccionar plugins\",\n\t\t\t\"tool.title.workflow\": \"Ejecutar flujo de trabajo\",\n\t\t\t\"tool.title.ralph\": \"Ejecutar bucle ralph\",\n\t\t\t\"tool.title.readEvent\": \"Leer evento\",\n\t\t\t\"tool.title.searchEvents\": \"Buscar eventos\",\n\t\t\t\"tool.title.traceEvent\": \"Rastrear evento\",\n\t\t\t\"tool.title.searchSessions\": \"Buscar sesiones\",\n\t\t\t\"tool.title.traceSession\": \"Rastrear sesión\",\n\t\t\t\"tool.title.listModels\": \"Listar modelos\",\n\t\t\t\"tool.title.subagent\": \"Crear subagente\",\n\t\t\t\"tool.title.listAgents\": \"Listar subagentes\",\n\t\t\t\"tool.title.sendMessage\": \"Enviar mensaje\",\n\t\t\t\"tool.title.interruptAgent\": \"Interrumpir agente\",\n\t\t\t\"tool.title.listJobs\": \"Listar tareas en segundo plano\",\n\t\t\t\"tool.title.readJob\": \"Leer la salida de la tarea\",\n\t\t\t\"tool.title.killJob\": \"Cancelar tarea en segundo plano\",\n\t\t\t\"tool.title.openTerminal\": \"Abrir terminal\",\n\t\t\t\"tool.title.readTerminal\": \"Leer terminal\",\n\t\t\t\"tool.title.listTerminals\": \"Listar terminales\",\n\t\t\t\"tool.title.signalTerminal\": \"Enviar señal a la terminal\",\n\t\t\t\"tool.title.closeTerminal\": \"Cerrar terminal\",\n\t\t\t\"tool.title.lsp\": \"Consultar símbolos de código\",\n\t\t\t\"tool.title.findDefinition\": \"Buscar definición\",\n\t\t\t\"tool.title.findReferences\": \"Buscar referencias\",\n\t\t\t\"tool.title.findImplementation\": \"Buscar implementación\",\n\t\t\t\"tool.title.hoverSymbol\": \"Inspeccionar símbolo\",\n\t\t\t\"tool.title.spawnTeammate\": \"Crear compañero\",\n\t\t\t\"tool.title.createTeamTask\": \"Crear tarea de equipo\",\n\t\t\t\"tool.title.getTeamTask\": \"Leer tarea de equipo\",\n\t\t\t\"tool.title.updateTeamTask\": \"Actualizar tarea de equipo\",\n\t\t\t\"tool.title.listTeamTasks\": \"Listar tareas de equipo\",\n\t\t\t\"tool.title.waitAgent\": \"Esperar al subagente\",\n\t\t\t\"detail.recordedResult\": \"Resultado registrado\",\n\t\t\t\"detail.empty\": \"Sin resultados\",\n\t\t\t\"detail.none\": \"Ninguno\",\n\t\t\t\"detail.yes\": \"Sí\",\n\t\t\t\"detail.no\": \"No\",\n\t\t\t\"detail.moreInInspect\": \"{count} elementos más disponibles en Inspeccionar\",\n\t\t\t\"detail.status.running\": \"En ejecución\",\n\t\t\t\"detail.status.idle\": \"Inactivo\",\n\t\t\t\"detail.status.ready\": \"Listo\",\n\t\t\t\"detail.status.inactive\": \"Inactivo\",\n\t\t\t\"detail.status.provisioning\": \"Aprovisionando\",\n\t\t\t\"detail.status.failed\": \"Fallido\",\n\t\t\t\"detail.status.completed\": \"Completado\",\n\t\t\t\"detail.status.deleted\": \"Eliminado\",\n\t\t\t\"detail.status.killed\": \"Cancelado\",\n\t\t\t\"detail.status.accepted\": \"Aceptado\",\n\t\t\t\"detail.status.queued\": \"En cola\",\n\t\t\t\"detail.status.exited\": \"Finalizado\",\n\t\t\t\"detail.field.id\": \"ID\",\n\t\t\t\"detail.field.revision\": \"Revisión\",\n\t\t\t\"detail.field.platform\": \"Plataforma\",\n\t\t\t\"detail.field.provider\": \"Proveedor\",\n\t\t\t\"detail.field.model\": \"Modelo\",\n\t\t\t\"detail.field.role\": \"Rol\",\n\t\t\t\"detail.field.context\": \"Contexto\",\n\t\t\t\"detail.field.owner\": \"Propietario\",\n\t\t\t\"detail.field.ready\": \"Listo\",\n\t\t\t\"detail.field.dependencies\": \"Dependencias\",\n\t\t\t\"detail.field.writeScopes\": \"Ámbitos de escritura\",\n\t\t\t\"detail.field.warnings\": \"Avisos\",\n\t\t\t\"detail.field.diagnostics\": \"Diagnósticos\",\n\t\t\t\"detail.field.methods\": \"Métodos\",\n\t\t\t\"detail.field.inputSchema\": \"Esquema de entrada\",\n\t\t\t\"detail.field.outputSchema\": \"Esquema de salida\",\n\t\t\t\"detail.field.currentPackage\": \"Paquete actual\",\n\t\t\t\"detail.field.nextPackage\": \"Paquete siguiente\",\n\t\t\t\"detail.field.latestRun\": \"Última ejecución\",\n\t\t\t\"detail.field.packages\": \"Paquetes\",\n\t\t\t\"detail.field.registrations\": \"Registros\",\n\t\t\t\"detail.field.props\": \"Propiedades\",\n\t\t\t\"detail.field.data\": \"Datos\",\n\t\t\t\"detail.field.source\": \"Origen\",\n\t\t\t\"detail.field.content\": \"Contenido\",\n\t\t\t\"detail.field.message\": \"Mensaje\",\n\t\t\t\"detail.field.messageId\": \"ID del mensaje\",\n\t\t\t\"detail.field.root\": \"Raíz\",\n\t\t\t\"detail.field.pid\": \"ID del proceso\",\n\t\t\t\"detail.field.type\": \"Tipo\",\n\t\t\t\"detail.field.time\": \"Hora\",\n\t\t\t\"detail.field.seq\": \"Secuencia del evento\",\n\t\t\t\"detail.field.turn\": \"Turno\",\n\t\t\t\"detail.field.step\": \"Paso\",\n\t\t\t\"detail.field.callId\": \"ID de la llamada\",\n\t\t\t\"detail.field.agents\": \"Agentes iniciados\",\n\t\t\t\"detail.field.result\": \"Resultado\",\n\t\t\t\"detail.field.parent\": \"Padre\",\n\t\t\t\"detail.field.depth\": \"Profundidad\",\n\t\t\t\"detail.field.exitCode\": \"Código de salida\",\n\t\t\t\"detail.field.signal\": \"Señal\",\n\t\t\t\"detail.field.previousStatus\": \"Estado anterior\",\n\t\t\t\"detail.field.agent\": \"ID del agente\",\n\t\t\t\"detail.field.job\": \"ID de la tarea\",\n\t\t\t\"detail.field.task\": \"Tarea\",\n\t\t\t\"detail.field.processGroup\": \"Grupo de procesos\",\n\t\t\t\"detail.field.availability\": \"Disponibilidad\",\n\t\t\t\"detail.field.bestMatch\": \"Mejor coincidencia\",\n\t\t\t\"detail.field.target\": \"Evento de destino\",\n\t\t\t\"detail.field.surface\": \"Estado del registro\",\n\t\t\t\"detail.agents.count\": \"{count} agentes\",\n\t\t\t\"detail.jobs.count\": \"{count} tareas en segundo plano\",\n\t\t\t\"detail.terminals.count\": \"{count} terminales\",\n\t\t\t\"detail.tasks.count\": \"{count} tareas de equipo\",\n\t\t\t\"detail.tasks.nextPage\": \"Hay más tareas disponibles; el cursor siguiente es {cursor}\",\n\t\t\t\"detail.locations.count\": \"{count} ubicaciones\",\n\t\t\t\"detail.location\": \"Línea {line}, columna {column}\",\n\t\t\t\"detail.receipt.delivered\": \"Mensaje entregado\",\n\t\t\t\"detail.receipt.interrupt\": \"Interrupción solicitada\",\n\t\t\t\"detail.receipt.started\": \"Iniciado\",\n\t\t\t\"detail.receipt.cancel\": \"Cancelación solicitada\",\n\t\t\t\"detail.receipt.alreadyFinished\": \"Ya había finalizado\",\n\t\t\t\"detail.receipt.signal\": \"Señal entregada\",\n\t\t\t\"detail.receipt.closed\": \"Cerrado\",\n\t\t\t\"detail.receipt.closing\": \"Cerrando\",\n\t\t\t\"detail.wait.noProgress\": \"No hay subagentes activos\",\n\t\t\t\"detail.wait.title\": \"Actividad de los subagentes\",\n\t\t\t\"detail.wait.timeout\": \"Se agotó el tiempo de espera\",\n\t\t\t\"detail.wait.changed\": \"Se detectó un cambio\",\n\t\t\t\"detail.agent.reply\": \"Respuesta del agente\",\n\t\t\t\"detail.models.title\": \"Modelos disponibles\",\n\t\t\t\"detail.output.lines\": \"Líneas {begin}–{end} de {total}\",\n\t\t\t\"detail.output.truncated\": \"Salida truncada\",\n\t\t\t\"detail.providers.count\": \"{count} proveedores de inspección\",\n\t\t\t\"detail.plugins.count\": \"{count} plugins dinámicos\",\n\t\t\t\"detail.workflow.script\": \"Script del flujo de trabajo\",\n\t\t\t\"detail.ralph.reportedComplete\": \"El trabajador informó de que terminó\",\n\t\t\t\"detail.ralph.reportedBlocker\": \"El trabajador informó de un bloqueo\",\n\t\t\t\"detail.ralph.limit\": \"Se alcanzó el límite de rondas\",\n\t\t\t\"detail.report.nextSteps\": \"Trabajo pendiente\",\n\t\t\t\"detail.trace.replacedBy\": \"Reemplazado por\",\n\t\t\t\"detail.trace.replacementChain\": \"Cadena de reemplazos\",\n\t\t\t\"detail.trace.replaces\": \"Eventos reemplazados\",\n\t\t\t\"detail.trace.sources\": \"Eventos de origen\",\n\t\t\t\"detail.trace.derived\": \"Eventos derivados\",\n\t\t\t\"detail.trace.ancestors\": \"Sesiones antecesoras\",\n\t\t\t\"detail.trace.descendants\": \"Sesiones descendientes\",\n\t\t\t\"detail.matches.count\": \"{count} coincidencias\",\n\t\t\t\"detail.matches.capped\": \"Se alcanzó el límite de resultados; acota la búsqueda para ver más\",\n\t\t\t\"detail.event.neighbors\": \"Eventos contiguos\",\n\t\t\t\"todo.completed\": \"{done}/{total} completadas\",\n\t\t\t\"ask.rowTitle\": \"Hacer una pregunta\",\n\t\t\t\"ask.waiting\": \"esperando\",\n\t\t\t\"ask.pending\": \"continuó; la respuesta sigue disponible\",\n\t\t\t\"ask.pendingDetail\": \"Estas preguntas pendientes aún se pueden responder desde el cuadro de mensaje.\",\n\t\t\t\"ask.reopen\": \"Responder\",\n\t\t\t\"ask.review\": \"Ver respuestas\",\n\t\t\t\"ask.closed\": \"cerrada\",\n\t\t\t\"ask.closedDetail\": \"Esta pregunta está cerrada; el resultado aparece en la conversación de abajo.\",\n\t\t\t\"ask.cancelled\": \"cancelada\",\n\t\t\t\"ask.cancelledDetail\": \"Este conjunto de preguntas se canceló antes de enviar respuestas.\",\n\t\t\t\"ask.interrupted\": \"interrumpida\",\n\t\t\t\"ask.interruptedDetail\": \"Este conjunto de preguntas se interrumpió antes de enviar respuestas.\",\n\t\t\t\"ask.answered\": \"{answered}/{total} respondidas\",\n\t\t\t\"ask.skipped\": \"Sin responder\",\n\t\t\t\"bash.running\": \"En ejecución\",\n\t\t\t\"bash.failed\": \"Fallido\",\n\t\t\t\"bash.stopped\": \"Detenido\",\n\t\t\t\"row.running\": \"En ejecución\",\n\t\t\t\"row.preparing\": \"Preparando la llamada\",\n\t\t\t\"row.failed\": \"Fallida\",\n\t\t\t\"row.stopped\": \"Detenida\",\n\t\t\t\"row.input\": \"ENT\",\n\t\t\t\"row.output\": \"SAL\",\n\t\t\t\"row.inspect\": \"Inspeccionar\",\n\t\t\t\"tool.title.search\": \"Buscar\",\n\t\t\t\"tool.title.read\": \"Leer\",\n\t\t\t\"tool.title.bash\": \"Bash\",\n\t\t\t\"tool.title.write\": \"Escribir\",\n\t\t\t\"tool.title.edit\": \"Editar\",\n\t\t\t\"tool.title.code\": \"Código\",\n\t\t\t\"tool.title.generic\": \"Llamada a herramienta\",\n\t\t\t\"tool.title.inspect\": \"Consultar el entorno Cordis\",\n\t\t\t\"tool.title.runCordis\": \"Ejecutar plugin de Cordis\",\n\t\t\t\"tool.title.stopCordis\": \"Detener plugin de Cordis\",\n\t\t\t\"tool.title.removeCordis\": \"Eliminar plugin de Cordis\",\n\t\t\t\"tool.title.pwsh\": \"PowerShell\",\n\t\t\t\"tool.title.readImage\": \"Leer imagen\",\n\t\t\t\"tool.title.grep\": \"Buscar en el contenido\",\n\t\t\t\"tool.title.glob\": \"Buscar archivos\",\n\t\t\t\"tool.title.webSearch\": \"Buscar en la web\",\n\t\t\t\"tool.title.webFetch\": \"Obtener página web\",\n\t\t\t\"tool.autoReviewRejected\": \"Rechazada por la revisión automática\",\n\t\t\t\"tool.autoReviewNotExecuted\": \"La herramienta no se ejecutó. Motivo: {reason}\",\n\t\t\t\"tool.autoReviewReasonFallback\": \"La revisión automática no autorizó esta acción\",\n\t\t\t\"diff.collapseAria\": \"Contraer diferencias\",\n\t\t\t\"diff.expandAria\": \"Expandir {count} líneas de diferencias más\",\n\t\t\t\"diff.expandRest\": \"… {count} líneas más\",\n\t\t\t\"read.window\": \"Mostrando {shown} de {total} líneas\",\n\t\t\t\"read.collapseAria\": \"Contraer contenido\",\n\t\t\t\"read.expandAria\": \"Expandir {count} líneas más\",\n\t\t\t\"read.expandRest\": \"… {count} líneas más\",\n\t\t\t\"search.paths\": \"{shown} rutas\",\n\t\t\t\"search.paths.truncated\": \"Mostrando {shown} de {total} rutas\",\n\t\t\t\"search.matches\": \"{shown} coincidencias · {files} archivos\",\n\t\t\t\"search.matches.truncated\": \"Mostrando {shown} de {total} coincidencias · {files} archivos\",\n\t\t\t\"search.noResults\": \"Sin resultados\",\n\t\t\t\"search.collapseAria\": \"Contraer resultados\",\n\t\t\t\"search.expandAria\": \"Expandir {count} líneas de resultados más\",\n\t\t\t\"search.expandRest\": \"… {count} líneas más\",\n\t\t\t\"web.noResults\": \"No se encontraron resultados\",\n\t\t\t\"web.sourcesTruncated\": \"Lista de fuentes truncada\",\n\t\t\t\"web.http\": \"HTTP\",\n\t\t\t\"web.contentTruncated\": \"Contenido truncado\",\n\t\t\t\"details.running\": \"En ejecución…\",\n\t\t\t\"terminal.signal\": \"señal {signal}\",\n\t\t\t\"terminal.exitCode\": \"código de salida {code}\",\n\t\t\t\"terminal.noExitCode\": \"sin código de salida\",\n\t\t\t\"terminal.running\": \"En ejecución\",\n\t\t\t\"terminal.failed\": \"Fallido\",\n\t\t\t\"terminal.done\": \"Listo\",\n\t\t\t\"terminal.noOutput\": \"Sin salida\",\n\t\t\t\"terminal.collapseAria\": \"Contraer salida\",\n\t\t\t\"terminal.expandAria\": \"Expandir las {n} líneas de salida restantes\",\n\t\t\t\"terminal.expandRest\": \"… {n} líneas más\",\n\t\t\t\"terminal.sendInput\": \"(enviar entrada)\",\n\t\t\t\"terminal.session\": \"Terminal {sessionId}\",\n\t\t};\n\t\t//#endregion\n\t\t//#region src/chat.es.json\n\t\tconst CHAT_ES = {\n\t\t\t\"message.stepProcess.thinking\": \"Analizando la solicitud\",\n\t\t\t\"message.stepProcess.read\": \"Leyendo archivos\",\n\t\t\t\"message.stepProcess.readImage\": \"Leyendo imágenes\",\n\t\t\t\"message.stepProcess.write\": \"Escribiendo archivos\",\n\t\t\t\"message.stepProcess.search\": \"Buscando en el código\",\n\t\t\t\"message.stepProcess.edit\": \"Editando archivos\",\n\t\t\t\"message.stepProcess.commands\": \"Ejecutando comandos\",\n\t\t\t\"message.stepProcess.code\": \"Ejecutando código\",\n\t\t\t\"message.stepProcess.webSearch\": \"Buscando en la web\",\n\t\t\t\"message.stepProcess.webFetch\": \"Visitando páginas web\",\n\t\t\t\"message.stepProcess.subagents\": \"Coordinando subagentes\",\n\t\t\t\"message.stepProcess.plan\": \"Actualizando el plan\",\n\t\t\t\"message.stepProcess.questions\": \"Esperando tu acción\",\n\t\t\t\"message.stepProcess.tools\": \"Llamando a herramientas\",\n\t\t\t\"message.stepProcess.prepare.read\": \"Preparando la lectura de archivos\",\n\t\t\t\"message.stepProcess.prepare.readImage\": \"Preparando la lectura de imágenes\",\n\t\t\t\"message.stepProcess.prepare.write\": \"Preparando la escritura de archivos\",\n\t\t\t\"message.stepProcess.prepare.search\": \"Preparando la búsqueda en el código\",\n\t\t\t\"message.stepProcess.prepare.edit\": \"Preparando la edición de archivos\",\n\t\t\t\"message.stepProcess.prepare.commands\": \"Preparando la ejecución de comandos\",\n\t\t\t\"message.stepProcess.prepare.code\": \"Preparando la ejecución de código\",\n\t\t\t\"message.stepProcess.prepare.webSearch\": \"Preparando la búsqueda en la web\",\n\t\t\t\"message.stepProcess.prepare.webFetch\": \"Preparando la visita a páginas web\",\n\t\t\t\"message.stepProcess.prepare.subagents\": \"Preparando la coordinación de subagentes\",\n\t\t\t\"message.stepProcess.prepare.plan\": \"Preparando la actualización del plan\",\n\t\t\t\"message.stepProcess.prepare.questions\": \"Preparando preguntas\",\n\t\t\t\"message.stepProcess.prepare.tools\": \"Preparando llamadas a herramientas\",\n\t\t\t\"message.stepProcess.done.thinking\": \"Análisis completado\",\n\t\t\t\"message.stepProcess.done.read\": \"Se leyeron archivos\",\n\t\t\t\"message.stepProcess.done.readImage\": \"Se leyeron imágenes\",\n\t\t\t\"message.stepProcess.done.write\": \"Se escribieron archivos\",\n\t\t\t\"message.stepProcess.done.search\": \"Se buscó en el código\",\n\t\t\t\"message.stepProcess.done.edit\": \"Se editaron archivos\",\n\t\t\t\"message.stepProcess.done.commands\": \"Se ejecutaron comandos\",\n\t\t\t\"message.stepProcess.done.code\": \"Se ejecutó código\",\n\t\t\t\"message.stepProcess.done.webSearch\": \"Se buscó en la web\",\n\t\t\t\"message.stepProcess.done.webFetch\": \"Se visitaron páginas web\",\n\t\t\t\"message.stepProcess.done.subagents\": \"Se coordinaron subagentes\",\n\t\t\t\"message.stepProcess.done.plan\": \"Se actualizó el plan\",\n\t\t\t\"message.stepProcess.done.questions\": \"Se hicieron preguntas\",\n\t\t\t\"message.stepProcess.done.tools\": \"Se llamó a herramientas\",\n\t\t\t\"message.stepProcess.joinTwo\": \"{first} y {second}\",\n\t\t\t\"message.stepProcess.comma\": \", \",\n\t\t\t\"message.stepProcess.sharedPrefix\": \"\",\n\t\t\t\"message.stepProcess.more\": \"{title}, etc.\",\n\t\t\t\"message.trigger.request\": \"Ejecución solicitada\",\n\t\t\t\"message.trigger.goal\": \"Continuando el objetivo\",\n\t\t\t\"message.trigger.agent\": \"Mensaje de tarea recibido\",\n\t\t\t\"message.trigger.team\": \"Mensaje de equipo recibido\",\n\t\t\t\"message.trigger.subagent\": \"Estado de la subtarea actualizado\",\n\t\t\t\"message.trigger.github\": \"Evento de GitHub recibido\",\n\t\t\t\"message.trigger.webhook\": \"Evento externo recibido\",\n\t\t\t\"message.trigger.schedule\": \"Tarea automatizada\",\n\t\t\t\"message.trigger.job\": \"Tarea en segundo plano actualizada\",\n\t\t\t\"message.trigger.plugin\": \"Estado del plugin actualizado\",\n\t\t\t\"message.trigger.explanation\": \"Esta notificación inició esta respuesta.\",\n\t\t\t\"message.turnProcess.worked\": \"Completado\",\n\t\t\t\"message.turnProcess.took\": \"Completado en \",\n\t\t\t\"message.turnProcess.failed\": \"Se produjo un error\",\n\t\t\t\"message.turnProcess.toolCalls.one\": \"{count} llamada a herramienta\",\n\t\t\t\"message.turnProcess.toolCalls.other\": \"{count} llamadas a herramientas\",\n\t\t\t\"message.turnProcess.messages.one\": \"{count} mensaje\",\n\t\t\t\"message.turnProcess.messages.other\": \"{count} mensajes\",\n\t\t\t\"message.turnProcess.subagents.one\": \"{count} subagente\",\n\t\t\t\"message.turnProcess.subagents.other\": \"{count} subagentes\",\n\t\t\t\"message.turnProcess.thoughtForAWhile\": \"Pensó un rato\",\n\t\t\t\"message.turnProcess.separator\": \" · \",\n\t\t\t\"message.stopped\": \"Detenido\",\n\t\t\t\"message.retry.active\": \"Reintentando la solicitud al modelo\",\n\t\t\t\"message.retry.cancelled\": \"Reintento de la solicitud al modelo cancelado\",\n\t\t\t\"message.retry.started\": \"Se reintentó la solicitud al modelo\",\n\t\t\t\"message.retry.scheduled\": \"Esperando para reintentar la solicitud al modelo\",\n\t\t\t\"message.retry.status\": \"{label} ({retry}/{maximum}) · {seconds} s\",\n\t\t\t\"message.retry.delay\": \"Retardo del reintento: \",\n\t\t\t\"message.retry.failure\": \"Motivo del fallo: \",\n\t\t\t\"message.turnError\": \"Este turno falló\",\n\t\t\t\"message.maxTokens\": \"Se alcanzó el límite de tokens de salida\",\n\t\t\t\"message.maxTokens.hint\": \"La respuesta se cortó; la salida anterior se conserva en la conversación. Envía «continúa» para que el modelo siga.\",\n\t\t\t\"message.tokensPerSecond\": \"{tps} tok/s\",\n\t\t\t\"message.turnUsage.title\": \"Uso del turno\",\n\t\t\t\"message.turnUsage.consumed\": \"Uso {total}\",\n\t\t\t\"message.turnUsage.model\": \"Proveedor / modelo\",\n\t\t\t\"message.turnUsage.cacheHit\": \"Aciertos de caché\",\n\t\t\t\"message.turnUsage.input\": \"Entrada sin caché\",\n\t\t\t\"message.turnUsage.cacheRead\": \"Lectura de caché\",\n\t\t\t\"message.turnUsage.cacheWrite\": \"Escritura en caché\",\n\t\t\t\"message.turnUsage.output\": \"Salida\",\n\t\t\t\"message.turnUsage.reasoning\": \" ({tokens} de razonamiento)\",\n\t\t\t\"message.turnUsage.count\": \"{count} tok\",\n\t\t\t\"duration.compactSeconds\": \"{seconds} s\",\n\t\t\t\"duration.compactMinutes\": \"{minutes} min {seconds} s\",\n\t\t\t\"duration.milliseconds\": \"{milliseconds} ms\",\n\t\t\t\"duration.secondUnit\": \" s\",\n\t\t\t\"duration.minuteUnit\": \" min \",\n\t\t\t\"duration.hourUnit\": \" h \",\n\t\t\t\"stats.counts\": \"{turns} turnos {steps} pasos\",\n\t\t\t\"stats.cacheHit\": \"Aciertos de caché {percent}%\",\n\t\t\t\"chat.deepDiving\": \"Profundizando\",\n\t\t\t\"chat.deepDivingFor\": \"Profundizando desde hace {duration} ···\",\n\t\t\t\"command.running\": \"En ejecución…\",\n\t\t\t\"command.failed\": \"El comando falló\",\n\t\t\t\"command.done\": \"Completado\",\n\t\t\t\"command.title\": \"Comando\",\n\t\t\t\"row.running\": \"En ejecución\",\n\t\t\t\"row.failed\": \"Fallido\",\n\t\t\t\"json.truncated\": \"… truncado, {total} caracteres en total\",\n\t\t\t\"number.groupSeparator\": \".\",\n\t\t\t\"clock.md\": \"{d}/{m}\",\n\t\t\t\"clock.ymd\": \"{d}/{m}/{y}\",\n\t\t};\n\t\t//#endregion\n\t\t//#region src/common.es.json\n\t\tconst COMMON_ES = {\n\t\t\t\"ok\": \"Aceptar\",\n\t\t\t\"cancel\": \"Cancelar\",\n\t\t\t\"close\": \"Cerrar\",\n\t\t\t\"copy\": \"Copiar\",\n\t\t\t\"copied\": \"Copiado\",\n\t\t\t\"codeBlock.title\": \"Bloque de código\",\n\t\t\t\"codeBlock.wrap\": \"Ajustar líneas\",\n\t\t\t\"codeBlock.unwrap\": \"No ajustar líneas\",\n\t\t\t\"copy.failed\": \"No se pudo copiar\",\n\t\t\t\"copy.value\": \"Copiar valor\",\n\t\t\t\"copy.json\": \"Copiar JSON\",\n\t\t\t\"copy.path\": \"Copiar ruta de la propiedad\",\n\t\t\t\"copy.prettyJson\": \"Copiar JSON con formato\",\n\t\t\t\"copy.compactJson\": \"Copiar JSON compacto\",\n\t\t\t\"copy.optionsHint\": \"{action}; haz clic con el botón derecho para ver las opciones de copia\",\n\t\t\t\"retry\": \"Reintentar\",\n\t\t\t\"loading\": \"Cargando…\",\n\t\t\t\"load.failed\": \"No se pudo cargar\",\n\t\t\t\"submit\": \"Enviar\",\n\t\t\t\"submitting\": \"Enviando…\",\n\t\t\t\"next\": \"Siguiente\",\n\t\t\t\"previous\": \"Anterior\",\n\t\t\t\"skip\": \"Omitir\",\n\t\t\t\"delete\": \"Eliminar\",\n\t\t\t\"edit\": \"Editar\",\n\t\t\t\"save\": \"Guardar\",\n\t\t\t\"search\": \"Buscar\",\n\t\t\t\"more\": \"Más\",\n\t\t\t\"collapse\": \"Contraer\",\n\t\t\t\"expand\": \"Expandir\",\n\t\t\t\"back\": \"Atrás\",\n\t\t\t\"brand.localBuild\": \"Compilación local de DSH\",\n\t\t\t\"workspace.defaultName\": \"Espacio de trabajo predeterminado\",\n\t\t\t\"unknown\": \"Desconocido\",\n\t\t\t\"none\": \"Ninguno\",\n\t\t\t\"truncated\": \"Truncado\",\n\t\t\t\"json.label\": \"JSON\",\n\t\t\t\"markdown.footnotes\": \"Notas al pie\",\n\t\t\t\"markdown.truncatedCharacters\": \"… truncado en {total} caracteres\",\n\t\t\t\"number.thousand\": \"{value} mil\",\n\t\t\t\"number.million\": \"{value} M\",\n\t\t};\n\t\t//#endregion\n\t\t//#region src/settings-locale.es.json\n\t\tconst SETTINGS_LOCALE_ES = {\n\t\t\t\"language.title\": \"Idioma\",\n\t\t};\n\t\t//#endregion\n\n\t\t/** Every namespace this pack translates for its locale, in registration order. */\n\t\tconst NAMESPACES = [\n\t\t\t{ ns: \"conversation\", dictionary: CONVERSATION_ES },\n\t\t\t{ ns: \"chat\", dictionary: CHAT_ES },\n\t\t\t{ ns: \"common\", dictionary: COMMON_ES },\n\t\t\t{ ns: \"settings.locale\", dictionary: SETTINGS_LOCALE_ES },\n\t\t];\n\n\t\t/** Required service: the dictionary registry and the locale preference owner. */\n\t\tconst inject = [\"locale\"];\n\n\t\t/**\n\t\t * Storage key recording how this browser left the pack, so a later load can tell an\n\t\t * explicit language choice apart from a shell re-supplying its own default.\n\t\t */\n\t\tconst ACTIVATION_MARKER = \"dsh-eslat:activation\";\n\n\t\t/** Stored when this pack selected Spanish itself. */\n\t\tconst ACTIVATION_AUTO = \"auto\";\n\n\t\t/** Stored when the user left Spanish: the pack never selects it again. */\n\t\tconst ACTIVATION_OPTED_OUT = \"opted-out\";\n\n\t\t/** Locale the automatic switch replaces; any other active locale is a choice. */\n\t\tconst DEFAULT_LOCALE = \"en\";\n\n\t\t/**\n\t\t * Read the activation marker.\n\t\t * @returns the stored value, null when absent, or undefined when web storage is unavailable.\n\t\t */\n\t\tfunction readMarker() {\n\t\t\ttry {\n\t\t\t\treturn window.localStorage.getItem(ACTIVATION_MARKER);\n\t\t\t} catch {\n\t\t\t\treturn void 0;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Store the activation marker, ignoring a storage refusal.\n\t\t * @param value - the marker value to store.\n\t\t */\n\t\tfunction writeMarker(value) {\n\t\t\ttry {\n\t\t\t\twindow.localStorage.setItem(ACTIVATION_MARKER, value);\n\t\t\t} catch {\n\t\t\t\t/* A private-mode or sandboxed store only costs the pack its memory. */\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Select Spanish where the interface still shows the default locale, then remember\n\t\t * how this browser left the pack.\n\t\t *\n\t\t * Only the default locale is replaced: a user reading Chinese or any other chosen\n\t\t * language keeps it. Choosing anything but Spanish afterwards retires the automatic\n\t\t * switch for good, while a stored \"auto\" marker still re-applies Spanish when a native\n\t\t * shell hands back its own default on the next load.\n\t\t * @param ctx - the client root context, for the opt-out subscription.\n\t\t * @param locale - the locale service face.\n\t\t */\n\t\tfunction activateOnce(ctx, locale) {\n\t\t\tconst marked = readMarker();\n\t\t\tif (marked === ACTIVATION_OPTED_OUT) return;\n\t\t\tif (locale.getLocale().active === DEFAULT_LOCALE) locale.setLocale(LANGUAGE.id);\n\t\t\tif (marked === null) writeMarker(ACTIVATION_AUTO);\n\t\t\tctx.effect(\n\t\t\t\t() => locale.subscribe(() => {\n\t\t\t\t\tif (locale.getLocale().active !== LANGUAGE.id) writeMarker(ACTIVATION_OPTED_OUT);\n\t\t\t\t}),\n\t\t\t\t\"dsh-eslat: opt-out watch\",\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Client plugin body: register the language and its dictionaries, then select it once.\n\t\t * @param ctx - the client root context.\n\t\t */\n\t\tfunction apply(ctx) {\n\t\t\tconst locale = ctx.locale;\n\t\t\tctx.effect(() => locale.addLanguage(LANGUAGE), \"dsh-eslat: language\");\n\t\t\tfor (const entry of NAMESPACES) {\n\t\t\t\tctx.effect(\n\t\t\t\t\t() => locale.register(entry.ns, LANGUAGE.id, entry.dictionary),\n\t\t\t\t\t`dsh-eslat: ${entry.ns} dictionary`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tactivateOnce(ctx, locale);\n\t\t}\n\n\t\texports.apply = apply;\n\t\texports.inject = inject;\n\t\treturn module.exports;\n\t}\n});\n\n//# sourceMappingURL=client.js.map\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host half of dsh-locale-es-labels.
|
|
3
|
+
*
|
|
4
|
+
* This plugin is a browser-only language pack: every behavior lives in the
|
|
5
|
+
* client half that the client-module system serves from `exports["./client"]`
|
|
6
|
+
* (see `lib/client.js`, generated from `src/` by `tools/build.mjs`).
|
|
7
|
+
*
|
|
8
|
+
* The host entry exists so the package appears as an ordinary Loader row and
|
|
9
|
+
* can be enabled, disabled, and listed like any other plugin. It intentionally
|
|
10
|
+
* registers nothing: no Host service, no settings namespace, no tool.
|
|
11
|
+
*/
|
|
12
|
+
export function apply() {}
|
package/locale/en.json
ADDED
package/locale/es.json
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,72 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-eslat",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "EsLat — etiquetas en español para las llamadas a herramientas y los resúmenes de estado de la interfaz web de DeepSeek Harness (DSH)",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"dsh",
|
|
7
|
+
"dsh-plugin",
|
|
8
|
+
"deepseek-harness",
|
|
9
|
+
"eslat",
|
|
10
|
+
"locale",
|
|
11
|
+
"i18n",
|
|
12
|
+
"l10n",
|
|
13
|
+
"spanish",
|
|
14
|
+
"espanol",
|
|
15
|
+
"es",
|
|
16
|
+
"translation",
|
|
17
|
+
"tool-calls"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"icon": "./icon.svg",
|
|
21
|
+
"main": "lib/index.js",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": "./lib/index.js",
|
|
24
|
+
"./client": "./lib/client.js",
|
|
25
|
+
"./package.json": "./package.json",
|
|
26
|
+
"./locale/*.json": "./locale/*.json"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"lib/index.js",
|
|
30
|
+
"lib/client.js",
|
|
31
|
+
"lib/client.js.map",
|
|
32
|
+
"locale/*.json",
|
|
33
|
+
"cordis.patch.yml",
|
|
34
|
+
"icon.svg",
|
|
35
|
+
"README.md",
|
|
36
|
+
"LICENSE"
|
|
37
|
+
],
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "node tools/build.mjs",
|
|
40
|
+
"snapshot": "node tools/extract-shipped-keys.mjs",
|
|
41
|
+
"verify": "node test/verify.mjs && node test/smoke.mjs",
|
|
42
|
+
"prepublishOnly": "node tools/build.mjs && node test/verify.mjs && node test/smoke.mjs"
|
|
43
|
+
},
|
|
44
|
+
"author": "Amador Aguilar (@amador_aguilar)",
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "git+https://github.com/Amador-Aguilar/dsh-eslat.git"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/Amador-Aguilar/dsh-eslat#readme",
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/Amador-Aguilar/dsh-eslat/issues"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"dsh": ">=0.2.0-rc.2"
|
|
55
|
+
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public"
|
|
58
|
+
},
|
|
59
|
+
"license": "MIT",
|
|
60
|
+
"dsh": {
|
|
61
|
+
"manifestVersion": 1,
|
|
62
|
+
"bundle": {
|
|
63
|
+
"patch": "./cordis.patch.yml"
|
|
64
|
+
},
|
|
65
|
+
"client": {
|
|
66
|
+
"platform": "web",
|
|
67
|
+
"inject": [
|
|
68
|
+
"@deepseek-ai/dsh-client-locale"
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|