dsh-click 0.3.26 → 0.3.28
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/CHANGELOG.md +14 -5
- package/README.en.md +441 -0
- package/README.es.md +441 -0
- package/README.hi.md +441 -0
- package/README.md +262 -194
- package/README.pt.md +441 -0
- package/lib/index.js +31 -16
- package/lib/types/version.d.ts +1 -1
- package/native/win32/dsh-click-helper.ps1 +70 -0
- package/package.json +32 -29
- package/README-es.md +0 -377
- package/README-hi.md +0 -377
- package/README-pt.md +0 -377
- package/README-zh.md +0 -377
package/README.es.md
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-click-hero-en-dark.webp">
|
|
5
|
+
<img src="docs/assets/dsh-click-hero-en-light.webp" width="100%" alt="dsh-click: los elementos de accesibilidad de una ventana (e12 Edit, e13 Button) se leen con screen_read y producen un observationId; las acciones lo citan en basedOn, cruzan el límite de seguridad de frescura, aprobación e identidad del proceso, se ejecutan mediante el helper UIA de Windows y quedan en los eventos de auditoría dsh-click/observed y dsh-click/action">
|
|
6
|
+
</picture>
|
|
7
|
+
|
|
8
|
+
# dsh-click
|
|
9
|
+
|
|
10
|
+
**Ver la pantalla y luego actuar: cada clic se autoriza y cada observación y acción queda auditada.**
|
|
11
|
+
|
|
12
|
+
Control nativo del escritorio para DeepSeek Harness (Windows primero): el árbol de accesibilidad y las pistas de píxeles permiten que un modelo de solo texto «vea», el clic y la entrada con ámbito de ventana le permiten «actuar», y la aprobación, la frescura y la identidad del proceso quedan en medio.
|
|
13
|
+
|
|
14
|
+
[Instalar](#instalación-en-tres-pasos) · [Configuración](#configuración) · [FAQ](#faq) · [简体中文](README.md) · [English](README.en.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
|
|
15
|
+
|
|
16
|
+
[](LICENSE)
|
|
17
|
+
[](#compatibilidad)
|
|
18
|
+
[](https://www.npmjs.com/package/dsh-click)
|
|
19
|
+
[](https://github.com/PerryLink/dsh-click/actions/workflows/ci.yml)
|
|
20
|
+
[](#compatibilidad)
|
|
21
|
+
|
|
22
|
+
[](https://github.com/PerryLink/dsh-click/stargazers)
|
|
23
|
+
[](https://www.npmjs.com/package/dsh-click)
|
|
24
|
+
[](https://dshfind.com/plugins/PerryLink/dsh-click?ref=badge)
|
|
25
|
+
[](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-click)
|
|
26
|
+
[](https://dsh.market/)
|
|
27
|
+
[](https://gitee.com/perrylink/dsh-click)
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
dsh plugin --profile <name> add dsh-click
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<sub>Plugin de la comunidad, no afiliado a DeepSeek. Repositorio canónico: <https://github.com/PerryLink/dsh-click> (Gitee es un espejo).</sub>
|
|
36
|
+
|
|
37
|
+
## Qué es
|
|
38
|
+
|
|
39
|
+
`dsh-click` da al modelo un bucle completo de observar → actuar: `screen_read` lee el árbol de accesibilidad de una ventana (ids de elemento, tipos, nombres, rectángulos, patrones soportados) más pistas de posición y color, o `screen_shot` captura una imagen; después `click` / `type` / `scroll` / `key` actúan sobre esa misma ventana por id de elemento o por coordenadas. Cada acción mutante debe citar una observación fresca (`basedOn`): si la pantalla cambió o la observación caducó, se rechaza con una razón legible para el modelo; además pasa por `ctx.approval` por defecto y la identidad del proceso destino se verifica antes y después. No roba el foco de primer plano por defecto (`focusFallback: never`), y cada observación y acción queda como evento de auditoría `dsh-click/observed` / `dsh-click/action` ya saneado.
|
|
40
|
+
|
|
41
|
+
<picture>
|
|
42
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-click-flow-v5-dark.svg">
|
|
43
|
+
<img src="docs/assets/dsh-click-flow-v5-light.svg" width="100%" alt="Estructura de doble lado de dsh-click: el plano de observación de solo lectura de la izquierda produce un observationId; el SAFETY BOUNDARY central comprueba basedOn, frescura, aprobación, despacho al helper e identidad del proceso, y devuelve los rechazos a screen_read; el plano de acciones mutantes de la derecha actúa mediante el helper; los dos eventos de auditoría saneados están en la barra inferior">
|
|
44
|
+
</picture>
|
|
45
|
+
|
|
46
|
+
## Instalación en tres pasos
|
|
47
|
+
|
|
48
|
+
1. **Instala** (elige un canal):
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
# canal git (último main; equivalente a git+https://github.com/PerryLink/dsh-click.git)
|
|
52
|
+
dsh plugin --profile web add github:PerryLink/dsh-click
|
|
53
|
+
# canal npm (versiones publicadas)
|
|
54
|
+
dsh plugin --profile web add dsh-click
|
|
55
|
+
# canal tarball: pnpm pack en este repo y luego
|
|
56
|
+
dsh plugin --profile web add ./dsh-click-<version>.tgz
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
El script `prepare` del canal git compila solo con dependencias de producción.
|
|
60
|
+
|
|
61
|
+
2. **Configuración mínima** (los valores por defecto ya funcionan; toca `autoApproveWindows` solo para eximir ventanas concretas):
|
|
62
|
+
|
|
63
|
+
```yaml
|
|
64
|
+
- insert:
|
|
65
|
+
- id: dsh-click
|
|
66
|
+
name: dsh-click
|
|
67
|
+
config:
|
|
68
|
+
requireApproval: true
|
|
69
|
+
autoApproveWindows: ['^Notepad']
|
|
70
|
+
focusFallback: never
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
3. **Verifica que se monta** (tras reiniciar):
|
|
74
|
+
|
|
75
|
+
```sh
|
|
76
|
+
dsh --profile web --dump-config | grep -A3 'id: dsh-click'
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Luego pide al agente que mire una ventana y actúe: el aviso de aprobación aparece para cada acción mutante:
|
|
80
|
+
|
|
81
|
+
```text
|
|
82
|
+
> Abre el Bloc de notas, escribe "hello" y vuelve a leer lo que hay en pantalla.
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Desinstalar**: `dsh plugin --profile web remove dsh-click` (o elimina la fila del patch del perfil).
|
|
86
|
+
|
|
87
|
+
> Si pnpm informa `ERR_PNPM_IGNORED_BUILDS` para este paquete (la validación inofensiva del binario de plataforma de esbuild), añade `allowBuilds: { esbuild: true }` a tu `pnpm-workspace.yaml`; la CLI de `dsh` imprime el fragmento exacto.
|
|
88
|
+
|
|
89
|
+
<details>
|
|
90
|
+
<summary>Instalar desde el mercado de DSH Desktop</summary>
|
|
91
|
+
|
|
92
|
+
Todos los plugins de PerryLink pueden explorarse en el mercado integrado de DSH Desktop: **Market → Sources → add source → pegar** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ seleccionarlo**. La instalación sigue pasando por la verificación de identidad npm del mercado y tu confirmación.
|
|
93
|
+
|
|
94
|
+
</details>
|
|
95
|
+
|
|
96
|
+
## Capacidades clave
|
|
97
|
+
|
|
98
|
+
`dsh-click` separa el escritorio nativo en una cara de observación y otra de acción, ambas auditables:
|
|
99
|
+
|
|
100
|
+
- **`screen_shot`** — captura una ventana (o la pantalla principal) y la escala a `maxScreenshotSide`. Con un modelo capaz de ver imágenes el resultado lleva la imagen; los modelos de solo texto reciben una descripción textual y siguen funcionando.
|
|
101
|
+
- **`screen_read`** — la observación estructurada: el árbol de accesibilidad (ids de elemento, tipos, nombres, rectángulos, patrones soportados) más pistas de posición de píxeles con colores; texto plano, sin necesidad de modelo de imagen.
|
|
102
|
+
- **`screen_find`** — para aplicaciones sin árbol de accesibilidad, busca texto clicable o un objetivo visual descrito mediante OCR opcional (`ocr.*`, tesseract sondeado al montar) o grounding visual, y devuelve coordenadas de pantalla más un `observationId`; es de solo lectura y nunca pide aprobación.
|
|
103
|
+
- **`click` / `type` / `scroll` / `key`** — acciones con ámbito de ventana direccionadas por id de elemento o coordenadas. La entrega prefiere la invocación UIA y recurre a mensajes de ventana publicados, y por defecto nunca roba el foco de primer plano; `type` usa la vía rápida `ValuePattern` de UIA y, si falla, inyecta pulsaciones reales con `SendInput` (seguro para CJK); `key` informa con honestidad cuando una app ignora la entrada publicada.
|
|
104
|
+
- **`app_list` / `app_launch`** — enumera las aplicaciones en ejecución y sus ventanas visibles; lanza una por nombre o ruta del ejecutable.
|
|
105
|
+
|
|
106
|
+
Toda acción mutante cruza la misma frontera de seguridad:
|
|
107
|
+
|
|
108
|
+
1. **Frescura** — la acción debe citar una observación `basedOn`; la ventana se vuelve a capturar justo antes de actuar y la acción se rechaza si cambió el hash de píxeles (`staleCheckPixels`) o el árbol (`staleCheckTree`), o si la observación supera `maxObservationAgeMs`.
|
|
109
|
+
2. **Aprobación** — `ctx.approval` controla cada acción por defecto; los regex de título/ejecutable de `autoApproveWindows` pueden eximir ventanas concretas (siguen pasando frescura, identidad de proceso y auditoría).
|
|
110
|
+
3. **Identidad del proceso** — el pid y la ruta del ejecutable propietario se verifican antes **y** después de actuar; un cambio a mitad de la acción la falla en voz alta (`PROCESS_CHANGED`).
|
|
111
|
+
4. **Auditoría** — observaciones y acciones quedan en el registro de sesión como eventos `dsh-click/observed` / `dsh-click/action` (saneados, solo registro).
|
|
112
|
+
|
|
113
|
+
```text
|
|
114
|
+
modelo harness
|
|
115
|
+
│ screen_read ──▶ observationId (+ elementos, píxeles) ← texto estructurado
|
|
116
|
+
│ click {basedOn, target} ──▶ chequeo de frescura ──▶ aprobación ──▶ helper (UIA)
|
|
117
|
+
│ ¿hash de píxeles cambió? ── rechaza + re-observa
|
|
118
|
+
│ ¿pid/exe cambió tras actuar? ── PROCESS_CHANGED
|
|
119
|
+
│ ◀── JSON canónico + eventos de auditoría (dsh-click/action)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Superficie de herramientas
|
|
123
|
+
|
|
124
|
+
| Herramienta | Solo lectura | Requiere aprobación | Notas |
|
|
125
|
+
|---|---|---|---|
|
|
126
|
+
| `screen_shot` | ✅ | — | Devuelve un `observationId` que las acciones posteriores citan en `basedOn`; adjunta imagen cuando el modelo acepta imágenes |
|
|
127
|
+
| `screen_read` | ✅ | — | Árbol de accesibilidad + pistas de píxeles; los ids de elemento son la dirección de las acciones |
|
|
128
|
+
| `screen_find` | ✅ | — | OCR/grounding visual cuando no hay árbol UIA; devuelve objetivos por coordenadas + un `observationId` |
|
|
129
|
+
| `click` | | ✅ | Exactamente uno de `elementId` o `(x, y)`; se prefiere UIA invoke, con mensajes publicados como respaldo |
|
|
130
|
+
| `type` | | ✅ | Solo elementos con patrón de valor; hace copia de seguridad y restaura el texto del control si falla |
|
|
131
|
+
| `scroll` | | ✅ | Elemento (patrón scroll) o ventana (rueda publicada) |
|
|
132
|
+
| `key` | | ✅ | Combinaciones de teclas publicadas (`"Ctrl+S"`); las apps que ignoran la entrada publicada se rechazan en voz alta |
|
|
133
|
+
| `app_list` | ✅ | — | Aplicaciones en ejecución y sus ventanas visibles |
|
|
134
|
+
| `app_launch` | | ✅ | Por nombre o ruta del ejecutable, con argumentos opcionales |
|
|
135
|
+
|
|
136
|
+
### Ejemplos
|
|
137
|
+
|
|
138
|
+
Son los puntos de entrada reales del plugin; instala una vez y llama a uno.
|
|
139
|
+
|
|
140
|
+
**Ejemplo detallado** — comando `app_list`, entrada:
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Salida:
|
|
147
|
+
|
|
148
|
+
```text
|
|
149
|
+
1 running application(s) with windows:
|
|
150
|
+
- Demo (pid 4242, C:\Apps\demo.exe)
|
|
151
|
+
- [windowId 1122867] "Demo App" at (10, 20) 800x600
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
*Observed from `plugins/dsh-click/tests/tools.spec.ts:159-185; renderer at src/tools.ts:933-942`*
|
|
155
|
+
|
|
156
|
+
**Rama de fallo** — entrada:
|
|
157
|
+
|
|
158
|
+
```text
|
|
159
|
+
{}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Salida:
|
|
163
|
+
|
|
164
|
+
```text
|
|
165
|
+
Error: dsh-click backend unavailable on linux: Linux backend is reserved but not implemented yet (Windows-first); only Windows can act today
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
*Observed from `plugins/dsh-click/src/platform/selection.ts:61-62,81; plugins/dsh-click/src/tools.ts:133-136; plugins/dsh-click/tests/tools.spec.ts:226-245`*
|
|
169
|
+
|
|
170
|
+
**Ejemplos breves**: `screen_read` · `app_list`
|
|
171
|
+
|
|
172
|
+
## Configuración
|
|
173
|
+
|
|
174
|
+
Todas las opciones son campos Schemastery `Config` (modificables desde cordis.yml). Una sobrescritura por id reemplaza la fila entera: repite cada clave que necesites. `cordis.patch.yml` documenta cada clave en línea.
|
|
175
|
+
|
|
176
|
+
Claves más usadas:
|
|
177
|
+
|
|
178
|
+
| Clave | Predeterminado | Significado |
|
|
179
|
+
|---|---|---|
|
|
180
|
+
| `requireApproval` | `true` | Toda acción mutante pasa por aprobación; los observadores nunca preguntan |
|
|
181
|
+
| `autoApproveWindows` | `[]` | Regex de título/ejecutable que omiten la pregunta de aprobación (siguen con frescura, identidad de proceso y auditoría) |
|
|
182
|
+
| `focusFallback` | `never` | Si una acción puede traer la ventana destino al primer plano como último recurso (`never` / `allow`) |
|
|
183
|
+
| `imageMode` | `auto` | Render de `screen_shot`: `auto` (imagen cuando el modelo acepta imágenes, texto si no) o `text` |
|
|
184
|
+
| `staleCheckPixels` | `true` | Compara un hash de píxeles fresco antes de cada acción y rechaza si cambió |
|
|
185
|
+
| `staleCheckTree` | `target` | Frescura del árbol de accesibilidad: `target` verifica el elemento direccionado (por defecto), `strict` rechaza cualquier nodo cambiado, `off` omite el hash del árbol (identidad/edad/píxeles siguen aplicando) |
|
|
186
|
+
| `maxObservationAgeMs` | `30000` | Antigüedad máxima en ms de una observación que una acción puede citar (1000..600000) |
|
|
187
|
+
| `auditSessionEvents` | `true` | Si se añaden los eventos de auditoría `dsh-click/observed` / `dsh-click/action`; `false` detiene por completo los appends de auditoría |
|
|
188
|
+
|
|
189
|
+
<details>
|
|
190
|
+
<summary>Tabla de configuración completa (17 filas)</summary>
|
|
191
|
+
|
|
192
|
+
| Clave | Predeterminado | Significado |
|
|
193
|
+
|---|---|---|
|
|
194
|
+
| `requireApproval` | `true` | Toda acción mutante pasa por aprobación; los observadores nunca preguntan |
|
|
195
|
+
| `autoApproveWindows` | `[]` | Regex de título/ejecutable que omiten la pregunta de aprobación (siguen con frescura, identidad de proceso y auditoría) |
|
|
196
|
+
| `auditSessionEvents` | `true` | Añade los eventos de sesión `dsh-click/observed` / `dsh-click/action`. La puerta adaptativa ya omite el append en hosts sin sobre (rc.6–rc.8, 0.1.1-rc.2 y 0.1.2-rc.1, que falla cerrado ante tipos desconocidos al leer); `false` detiene por completo los appends de auditoría. `0.1.2-rc.1` (adaptado el 2026-09-02): el sobre de sesión conserva su campo ignorable solo para compatibilidad de lectura de logs almacenados — `Session.append` aún no puede estamparlo, así que el comportamiento de la puerta no cambia |
|
|
197
|
+
| `focusFallback` | `never` | Si una acción puede traer la ventana destino al primer plano como último recurso (`never` / `allow`) |
|
|
198
|
+
| `imageMode` | `auto` | Render de `screen_shot`: `auto` (imagen cuando el modelo acepta imágenes, texto si no) o `text` |
|
|
199
|
+
| `helperTimeoutMs` | `30000` | Tiempo máximo por llamada al helper en ms (1..300000) |
|
|
200
|
+
| `maxHelperOutputBytes` | `25165824` | Tope de una respuesta del helper en bytes (1024..67108864) |
|
|
201
|
+
| `maxScreenshotSide` | `2560` | Lado más largo de una captura en píxeles (320..7680); las capturas mayores se escalan |
|
|
202
|
+
| `staleCheckPixels` | `true` | Compara un hash de píxeles fresco antes de cada acción y rechaza si cambió |
|
|
203
|
+
| `staleCheckTree` | `target` | Frescura del árbol de accesibilidad: `target` verifica el elemento direccionado (por defecto), `strict` rechaza cualquier nodo cambiado, `off` omite el hash del árbol completo en ventanas con reloj/cursor en movimiento (identidad/edad/píxeles siguen aplicando) |
|
|
204
|
+
| `maxObservationAgeMs` | `30000` | Antigüedad máxima en ms de una observación que una acción puede citar (1000..600000) |
|
|
205
|
+
| `maxCachedObservations` | `8` | Tope LRU de observaciones en caché (1..64) |
|
|
206
|
+
| `maxElements` | `500` | Tope de elementos de accesibilidad por `screen_read` (1..2000) |
|
|
207
|
+
| `maxTreeDepth` | `32` | Profundidad máxima del recorrido del árbol de accesibilidad (1..64) |
|
|
208
|
+
| `maxTextLength` | `200` | Longitud de truncado de las cadenas visibles para el modelo ya saneadas (16..10000) |
|
|
209
|
+
| `rollbackEnabled` | `true` | Copia de seguridad y restauración del texto del control cuando `type` falla |
|
|
210
|
+
| `ocr.enabled` / `command` / `language` | `true` / `tesseract` / `eng` | OCR opcional para la ruta `screen_find` (sondeado al montar; degrada a no disponible sin tesseract) |
|
|
211
|
+
|
|
212
|
+
</details>
|
|
213
|
+
|
|
214
|
+
Ejemplo de sobrescritura en tu patch de perfil:
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
- insert:
|
|
218
|
+
- id: dsh-click
|
|
219
|
+
name: dsh-click
|
|
220
|
+
config:
|
|
221
|
+
requireApproval: true
|
|
222
|
+
autoApproveWindows: ['^Notepad']
|
|
223
|
+
focusFallback: never
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## FAQ
|
|
227
|
+
|
|
228
|
+
<details>
|
|
229
|
+
<summary>¿Dónde viven las capturas y las observaciones? ¿Puede el contenido de pantalla acabar en disco?</summary>
|
|
230
|
+
|
|
231
|
+
La imagen de `screen_shot` va al attachment store del harness (direccionado por contenido, bajo la política de adjuntos del host) y se entrega al modelo solo a través de ese resultado de herramienta. Las observaciones se quedan en memoria (LRU acotada, `maxCachedObservations`, se pierden al reiniciar); más allá de eso el plugin no escribe nada en disco, no hace peticiones de red y no guarda credenciales. Lo único que llega al registro de sesión son los eventos de auditoría `dsh-click/*`, y los títulos de ventana, las rutas y el texto libre se sanean y truncan antes de escribirse o mostrarse.
|
|
232
|
+
|
|
233
|
+
</details>
|
|
234
|
+
|
|
235
|
+
<details>
|
|
236
|
+
<summary>¿Qué pasa en macOS / Linux? ¿Fallos silenciosos?</summary>
|
|
237
|
+
|
|
238
|
+
Nada es silencioso. Ambos backends están reservados pero no implementados, así que cada llamada falla cerrada con una razón legible para el modelo (`dsh-click backend unavailable on linux: ...`), y el perfil arranca igualmente en cualquier plataforma. En Windows, un servicio `subprocess` ausente o un helper no disponible rechazan la llamada en voz alta en lugar de fingir éxito.
|
|
239
|
+
|
|
240
|
+
</details>
|
|
241
|
+
|
|
242
|
+
<details>
|
|
243
|
+
<summary>¿Pelea con otros plugins por comandos, servicios o slots?</summary>
|
|
244
|
+
|
|
245
|
+
No provee ninguna clave de servicio y solo consume dos seams opcionales (`dsh-click/backend`, `dsh-click/grounding`, para pruebas/embeddings); no registra slots de cliente, ni rutas `webServer`, ni listeners waterfall; cada evento de auditoría vive en el espacio de nombres `dsh-click/*`. Cada registro de herramienta va dentro de `ctx.effect`, así que parar o recargar en caliente elimina exactamente las herramientas que registró.
|
|
246
|
+
|
|
247
|
+
</details>
|
|
248
|
+
|
|
249
|
+
<details>
|
|
250
|
+
<summary>¿Cuánto coste de rendimiento supone? ¿Cada acción vuelve a capturar la pantalla?</summary>
|
|
251
|
+
|
|
252
|
+
Las observaciones se producen bajo demanda: `screen_read` solo recorre el árbol de accesibilidad (texto plano), mientras que `screen_shot` codifica un PNG. Cada acción mutante vuelve a capturar una vez la ventana destino para la comparación de frescura (hash de píxeles más árbol por defecto), y eso es parte de la frontera de seguridad. Las llamadas al helper están acotadas por `helperTimeoutMs` / `maxHelperOutputBytes`, y la caché de observaciones guarda 8 entradas por defecto.
|
|
253
|
+
|
|
254
|
+
</details>
|
|
255
|
+
|
|
256
|
+
## Límites de seguridad
|
|
257
|
+
|
|
258
|
+
- **Observar antes de actuar, siempre.** Las acciones deben citar una observación fresca; una pantalla cambiada (hash de píxeles) o una observación caducada se rechazan con una razón legible para el modelo que exige re-observar.
|
|
259
|
+
- **La aprobación es lo predeterminado.** `requireApproval: true` salvo que eximas ventanas concretas; cada acción —permitida o no— queda auditada.
|
|
260
|
+
- **Sin robo de primer plano.** El helper nunca trae una ventana destino al primer plano (`focusFallback: 'never'` por defecto); la entrada se entrega por UIA o mensajes publicados para no molestar a las ventanas en segundo plano. `focusFallback: 'allow'` es la única excepción sancionada.
|
|
261
|
+
- **La identidad del proceso se re-verifica** justo antes y después de cada acción; un cambio de proceso a mitad de la acción falla el resultado (`PROCESS_CHANGED`).
|
|
262
|
+
- **Salida saneada.** Los caracteres de control se eliminan, las tabulaciones se colapsan y los valores con forma de credencial (claves, tokens, JWT, cabeceras bearer) se redactan antes de llegar al modelo o al registro.
|
|
263
|
+
- **Fallo cerrado.** Plataformas no soportadas, un servicio de subproceso ausente o un helper no disponible rechazan cada llamada en voz alta; los perfiles siguen arrancando en todas partes.
|
|
264
|
+
|
|
265
|
+
## Permisos y datos
|
|
266
|
+
|
|
267
|
+
- **Permisos**: las acciones mutantes cruzan el seam oficial `ctx.approval`; el plugin nunca lo reimplementa ni lo elude. `autoApproveWindows` solo *omite la pregunta para ventanas concretas*; no puede desactivar las comprobaciones de frescura ni de identidad de proceso. El manifest `dshWorkshop` declara `fs:read`, `subprocess:spawn`, `session:append`, `network:none`, `native-code:none`.
|
|
268
|
+
- **Datos**: el plugin no guarda nada en disco salvo las capturas que conserva el attachment store (direccionadas por contenido, bajo la política de adjuntos del harness). Las observaciones se cachean en memoria (LRU acotada). Sin peticiones de red ni almacenamiento de credenciales.
|
|
269
|
+
- **Registro de sesión**: `dsh-click/observed` y `dsh-click/action` son eventos de auditoría solo-registro que llevan hechos saneados de ventana/proceso; los títulos, las rutas y el texto libre se redactan y truncan antes de escribirse o mostrarse.
|
|
270
|
+
|
|
271
|
+
## Limitaciones conocidas
|
|
272
|
+
|
|
273
|
+
- **Windows primero.** Los backends de macOS y Linux están reservados; en esas plataformas cada llamada falla cerrada con una razón clara.
|
|
274
|
+
- **Fidelidad de solo texto.** `screen_read` depende de que la aplicación exponga UIAutomation; las apps sin árbol accesible solo dan pistas de píxeles, más la ruta OCR/grounding de `screen_find`. Los clics por coordenadas siguen disponibles.
|
|
275
|
+
- **Apps de entrada publicada.** Algunas aplicaciones ignoran los mensajes de ventana publicados (juegos, algunas superficies Electron); `key` lo reporta con honestidad en lugar de fingir éxito. Desde 0.3.24 el respaldo `SendInput` de `type` cubre entrada de teclado real y texto CJK, pero sigue limitado por el modelo de entrada de la app destino.
|
|
276
|
+
- **Auditoría de sesión en builds sin sobre.** Los eventos de auditoría pasan por una puerta adaptativa: los hosts que conocen el vocabulario añaden sin más, los hosts con sobre `ignorable` añaden con el marcador, y los hosts sin sobre — `0.1.0-rc.6`–`0.1.0-rc.8`, `0.1.1-rc.2` y `0.1.2-rc.1` (que no puede estampar el marcador ignorable —el campo del sobre se conserva solo para compatibilidad de lectura de logs almacenados— y falla cerrado ante tipos desconocidos al leer) — no reciben append de auditoría; los resultados de las herramientas siguen siendo el rastro de auditoría reconstruible. Pon `auditSessionEvents: false` para detener por completo los appends de auditoría.
|
|
277
|
+
|
|
278
|
+
## Interoperabilidad con otros plugins DSH
|
|
279
|
+
|
|
280
|
+
`dsh-click` solo expone una superficie de herramientas y no se une a los seams de otros plugins:
|
|
281
|
+
|
|
282
|
+
- **Solo dos servicios duros.** `inject = ['tools', 'subprocess']`; no provee ninguna clave de servicio, así que no puede colisionar en una.
|
|
283
|
+
- **Sin recursos de cliente ni HTTP.** No registra slots de cliente, ni rutas `webServer`, ni listeners waterfall `agent/pre-step` / `tools/post-execute`, y no muta globales.
|
|
284
|
+
- **Auditoría con espacio de nombres.** Solo escribe `dsh-click/observed` y `dsh-click/action`; cuando un host no conoce el vocabulario, la puerta adaptativa los omite y los resultados de las herramientas siguen siendo el rastro reconstruible.
|
|
285
|
+
- **Seams opcionales que degradan.** `dsh-click/backend` y `dsh-click/grounding` existen solo para pruebas/embeddings; los despliegues reales caen a la selección de plataforma y no requieren ningún otro plugin.
|
|
286
|
+
- **Los registros son efectos.** Cada `ctx.tools.register` va envuelto en `ctx.effect`, así que parar o recargar en caliente elimina exactamente las herramientas que registró.
|
|
287
|
+
|
|
288
|
+
## Compatibilidad
|
|
289
|
+
|
|
290
|
+
| Superficie | Estado |
|
|
291
|
+
|---|---|
|
|
292
|
+
| Harness | DeepSeek Harness `dsh-v0.2.1-alpha.1` (tag de GitHub, verificado el 2026-09-25). Verificado el 2026-09-11 contra el checkout master `dsh-v0.1.7-alpha.1` (cadena completa de puertas + smoke de instalación de perfil). `engines.dsh`: `>=0.2.1-0 <0.3.0 \|\| >=0.2.2-0 <0.3.0` |
|
|
293
|
+
| Node | `^22.19.0 \|\| >=24.9.0` |
|
|
294
|
+
| Plataformas | **Windows primero** (UIAutomation + entrada Win32, vía un helper PowerShell incluido); los backends de macOS/Linux están reservados y fallan cerrado con una razón clara |
|
|
295
|
+
| Modelo | Modelos de solo texto totalmente soportados (`screen_read` devuelve texto estructurado); los modelos de visión además reciben imágenes de `screen_shot` |
|
|
296
|
+
|
|
297
|
+
## Ecosistema y calidad
|
|
298
|
+
|
|
299
|
+
- [Espejo de Gitee](https://gitee.com/perrylink/dsh-click) (espejo sincronizado; GitHub es el canónico)
|
|
300
|
+
- [Página del plugin en dshfind](https://dshfind.com/plugins/PerryLink/dsh-click) (instalaciones y ranking)
|
|
301
|
+
- [Informe de OpenSSF Scorecard](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-click) (impulsado por [.github/workflows/scorecard.yml](.github/workflows/scorecard.yml))
|
|
302
|
+
- [Informe de verificación de dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章) (K10–K13 todos `pass`)
|
|
303
|
+
- [DSH Market](https://dsh.market/) (listado)
|
|
304
|
+
- **Canal de la tienda 1024**: `npm i -g dsh1024` una vez y luego `dsh1024 plugin --profile web add dsh-click` (cuenta para el ranking de instalaciones de [deepseek1024.com](https://deepseek1024.com))
|
|
305
|
+
- [Base de conocimiento del ecosistema](https://perrylink.github.io/dsh-plugin-guide/) — datos medidos, no marketing: guía de desarrollo de plugins · datos de selección · criterios de mantenimiento
|
|
306
|
+
|
|
307
|
+
## Desarrollo
|
|
308
|
+
|
|
309
|
+
```sh
|
|
310
|
+
pnpm install # node ^22.19 || >=24
|
|
311
|
+
pnpm run typecheck # tsc: src + tests contra el checkout local del harness
|
|
312
|
+
pnpm run typecheck:ci # tsc contra los tipos publicados del host (sin paths)
|
|
313
|
+
pnpm test # vitest: 79 pruebas, 13 archivos (el smoke del helper corre en Windows)
|
|
314
|
+
pnpm run build # bundle tsdown + declaraciones tsc (lib/)
|
|
315
|
+
pnpm run verify:self-contained # las specs de dependencias se resuelven desde el registry
|
|
316
|
+
pnpm run verify:artifacts # cara ESM construida + helper nativo presente
|
|
317
|
+
pnpm run check:readmes # consistencia de los README en cinco idiomas
|
|
318
|
+
pnpm pack # el tarball publicado
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
Las imágenes del README se generan programáticamente con [`scripts/gen-readme-assets.py`](scripts/gen-readme-assets.py) (Python + Pillow) y se pueden reejecutar sin riesgo: `python scripts/gen-readme-assets.py`.
|
|
322
|
+
|
|
323
|
+
Topics: `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `computer-use`, `windows-automation`, `uiautomation`, `desktop-control`, `screen-reader`
|
|
324
|
+
|
|
325
|
+
## Familia y agradecimientos
|
|
326
|
+
|
|
327
|
+
Este proyecto forma parte de la familia de plugins de DeepSeek Harness de [PerryLink](https://github.com/PerryLink) (todos Apache-2.0). Si te resulta útil, **una estrella ayuda a que la siguiente persona lo encuentre** — no hay nada bloqueado tras ella.
|
|
328
|
+
|
|
329
|
+
- [Lista de humo del helper de Windows](docs/windows-smoke.md) — verificación real de entrada/foco para 0.3.24+.
|
|
330
|
+
- [@LIU12312-Source](https://github.com/LIU12312-Source) — respaldo real de `SendInput`/foco en primer plano para el helper de Windows (PR #21).
|
|
331
|
+
- [@Mchsd](https://github.com/Mchsd) — añadió la opción `auditSessionEvents` para hosts cuyo lector de sesión rechaza los eventos de auditoría de `dsh-click` (#2).
|
|
332
|
+
- [@PerryLink](https://github.com/PerryLink) — creador y mantenedor: superficie de herramientas, frontera de seguridad de acciones, helper nativo de Windows, saneadores y la documentación en cinco idiomas.
|
|
333
|
+
|
|
334
|
+
<details>
|
|
335
|
+
<summary>Expandir todos los plugins</summary>
|
|
336
|
+
|
|
337
|
+
| Plugin | Estado |
|
|
338
|
+
|---|---|
|
|
339
|
+
| **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
|
|
340
|
+
| **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
|
|
341
|
+
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
|
|
342
|
+
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | 🧊 CONGELADO — ver el README del repo |
|
|
343
|
+
| **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
|
|
344
|
+
| **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
|
|
345
|
+
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | 🧊 CONGELADO — ver el README del repo |
|
|
346
|
+
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
|
|
347
|
+
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
|
|
348
|
+
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
|
|
349
|
+
| **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
|
|
350
|
+
| **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
|
|
351
|
+
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | 🧊 CONGELADO — ver el README del repo |
|
|
352
|
+
| **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
|
|
353
|
+
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
|
|
354
|
+
| **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
|
|
355
|
+
| **[dsh-eia-guide-check](https://github.com/PerryLink/dsh-eia-guide-check)** | |
|
|
356
|
+
| **[dsh-emergency-plan](https://github.com/PerryLink/dsh-emergency-plan)** | |
|
|
357
|
+
| **[dsh-essay-rubric-check](https://github.com/PerryLink/dsh-essay-rubric-check)** | |
|
|
358
|
+
| **[dsh-evidence-check](https://github.com/PerryLink/dsh-evidence-check)** | |
|
|
359
|
+
| **[dsh-export-ctl-check](https://github.com/PerryLink/dsh-export-ctl-check)** | |
|
|
360
|
+
| **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | |
|
|
361
|
+
| **[dsh-fmea-table-check](https://github.com/PerryLink/dsh-fmea-table-check)** | |
|
|
362
|
+
| **[dsh-forecast-penalty](https://github.com/PerryLink/dsh-forecast-penalty)** | |
|
|
363
|
+
| **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | |
|
|
364
|
+
| **[dsh-github](https://github.com/PerryLink/dsh-github)** | |
|
|
365
|
+
| **[dsh-gongwen-flow-check](https://github.com/PerryLink/dsh-gongwen-flow-check)** | |
|
|
366
|
+
| **[dsh-gongwen-word-check](https://github.com/PerryLink/dsh-gongwen-word-check)** | |
|
|
367
|
+
| **[dsh-guard-plan-qc](https://github.com/PerryLink/dsh-guard-plan-qc)** | |
|
|
368
|
+
| **[dsh-hazchem-check](https://github.com/PerryLink/dsh-hazchem-check)** | |
|
|
369
|
+
| **[dsh-hazplan-check](https://github.com/PerryLink/dsh-hazplan-check)** | |
|
|
370
|
+
| **[dsh-hidden-risk-map](https://github.com/PerryLink/dsh-hidden-risk-map)** | |
|
|
371
|
+
| **[dsh-hs-classify](https://github.com/PerryLink/dsh-hs-classify)** | |
|
|
372
|
+
| **[dsh-icd-rule-check](https://github.com/PerryLink/dsh-icd-rule-check)** | |
|
|
373
|
+
| **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | |
|
|
374
|
+
| **[dsh-lawcite-adapter](https://github.com/PerryLink/dsh-lawcite-adapter)** | |
|
|
375
|
+
| **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | |
|
|
376
|
+
| **[dsh-lc-doc-check](https://github.com/PerryLink/dsh-lc-doc-check)** | |
|
|
377
|
+
| **[dsh-learning-gap-check](https://github.com/PerryLink/dsh-learning-gap-check)** | |
|
|
378
|
+
| **[dsh-library](https://github.com/PerryLink/dsh-library)** | |
|
|
379
|
+
| **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | |
|
|
380
|
+
| **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | |
|
|
381
|
+
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
|
|
382
|
+
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
|
|
383
|
+
| **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
|
|
384
|
+
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | 🧊 CONGELADO — ver el README del repo |
|
|
385
|
+
| **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
|
|
386
|
+
| **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
|
|
387
|
+
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
|
|
388
|
+
| **[dsh-origin-rvc-check](https://github.com/PerryLink/dsh-origin-rvc-check)** | |
|
|
389
|
+
| **[dsh-ota-review-check](https://github.com/PerryLink/dsh-ota-review-check)** | |
|
|
390
|
+
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | |
|
|
391
|
+
| **[dsh-paper-doc-adapter](https://github.com/PerryLink/dsh-paper-doc-adapter)** | |
|
|
392
|
+
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | |
|
|
393
|
+
| **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
|
|
394
|
+
| **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
|
|
395
|
+
| **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
|
|
396
|
+
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | 🚫 RETIRADO (repo archivado) |
|
|
397
|
+
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
|
|
398
|
+
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | 🚫 RETIRADO (repo archivado) |
|
|
399
|
+
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | 🚫 RETIRADO (repo archivado) |
|
|
400
|
+
| **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
|
|
401
|
+
| **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
|
|
402
|
+
| **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
|
|
403
|
+
| **[dsh-ppap-check](https://github.com/PerryLink/dsh-ppap-check)** | |
|
|
404
|
+
| **[dsh-protest-deadline](https://github.com/PerryLink/dsh-protest-deadline)** | |
|
|
405
|
+
| **[dsh-railway-window](https://github.com/PerryLink/dsh-railway-window)** | |
|
|
406
|
+
| **[dsh-repair-order-qc](https://github.com/PerryLink/dsh-repair-order-qc)** | |
|
|
407
|
+
| **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | |
|
|
408
|
+
| **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
|
|
409
|
+
| **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
|
|
410
|
+
| **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
|
|
411
|
+
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | 🧊 CONGELADO — ver el README del repo |
|
|
412
|
+
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
|
|
413
|
+
| **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
|
|
414
|
+
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
|
|
415
|
+
| **[dsh-soe-decision-check](https://github.com/PerryLink/dsh-soe-decision-check)** | |
|
|
416
|
+
| **[dsh-soilwater-check](https://github.com/PerryLink/dsh-soilwater-check)** | |
|
|
417
|
+
| **[dsh-sop-sync-check](https://github.com/PerryLink/dsh-sop-sync-check)** | |
|
|
418
|
+
| **[dsh-spc-gbt-adapter](https://github.com/PerryLink/dsh-spc-gbt-adapter)** | |
|
|
419
|
+
| **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | |
|
|
420
|
+
| **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
|
|
421
|
+
| **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
|
|
422
|
+
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
|
|
423
|
+
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | 🚫 RETIRADO (repo archivado) |
|
|
424
|
+
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
|
|
425
|
+
| **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
|
|
426
|
+
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 CONGELADO — ver el README del repo |
|
|
427
|
+
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 CONGELADO — ver el README del repo |
|
|
428
|
+
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 CONGELADO — ver el README del repo |
|
|
429
|
+
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 CONGELADO — ver el README del repo |
|
|
430
|
+
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 CONGELADO — ver el README del repo |
|
|
431
|
+
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 RETIRADO (repo archivado) |
|
|
432
|
+
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 RETIRADO (repo archivado) |
|
|
433
|
+
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 RETIRADO (repo archivado) |
|
|
434
|
+
|
|
435
|
+
</details>
|
|
436
|
+
|
|
437
|
+
## Licencia
|
|
438
|
+
|
|
439
|
+
[LICENSE](LICENSE) (Apache License 2.0) © 2026 dsh-click contributors
|
|
440
|
+
|
|
441
|
+
<p align="center"><sub>Apache-2.0 · Plugin de la comunidad, no afiliado a DeepSeek.</sub></p>
|