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 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
- # Temporary Holding Version
1
+ # dsh-eslat · EsLat
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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.
@@ -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
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "EsLat",
4
+ "description": "Spanish labels for tool calls and status summaries in the DSH web GUI; the rest of the interface keeps its English fallback"
5
+ }
6
+ }
package/locale/es.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "EsLat",
4
+ "description": "Etiquetas en español para las llamadas a herramientas y los resúmenes de estado de la interfaz web de DSH; el resto de la interfaz mantiene el inglés como respaldo"
5
+ }
6
+ }
package/package.json CHANGED
@@ -1,6 +1,72 @@
1
1
  {
2
2
  "name": "dsh-eslat",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
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
+ }