dsh-click 0.3.9 → 0.3.11

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 CHANGED
@@ -5,6 +5,29 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.3.11] - 2026-09-18
9
+
10
+ ### Fixed
11
+
12
+ - Declare `subprocess` as a hard inject. The Windows backend spawns `native/win32/dsh-click-helper.ps1` through `ctx.subprocess`, but the dependency was never declared — a composition without the subprocess row mounted the tools and then failed at call time instead of keeping the plugin pending until its dependency existed.
13
+ - The audit gate no longer probes the append implementation's source text. On the `0.1.6-alpha.2` line `Session.append`'s third parameter carries a `SurfaceIntent` and only for surface-eligible event types, so an out-of-repo non-surface type can never be stamped with an `ignorable` marker; an unmarked unknown event would make a later reader refuse the stored log. `appendAuditEvent` now returns `'appended' | 'skipped-unknown-host'` and the two call sites surface the skip once per session as a warning. Tool outcomes are unchanged.
14
+ - `app_launch` with no arguments omits `-ArgumentList` instead of binding an empty array, which could fail the launch outright.
15
+ - Clicks and wheel posts map screen coordinates to the client area through `ScreenToClient`/`GetClientRect` instead of subtracting the window rectangle (which includes the border and title bar, so the old mapping landed roughly 8px/31px off). The mapping is non-regressive: if the interop call is unavailable the rectangle arithmetic and its containment check still run.
16
+ - A refused focus fallback is now visible: `focusFallback: 'allow'` records the `SetForegroundWindow` verdict in the action outcome's `detail` instead of discarding it, so the model can see that the OS kept another window in front.
17
+
18
+ ### Changed
19
+
20
+ - Document the real tool surface: `screen_find` is part of `capability.invocation`, and the "eight tools" wording in the source headers is now "nine tools" (the registry has registered nine all along).
21
+ - Declare `dsh.manifestVersion: 1` and the canonical three-clause `engines.dsh` (G-3).
22
+ - Implement the new `SubprocessRuntime.terminalEnvironment` member and `SubprocessHandle.control` field in the scripted test providers (0.1.6-alpha.1 extended the subprocess seam); the Loader composition profile now carries the `dsh-subprocess-local` row the new hard inject requires.
23
+
24
+ ## [0.3.10] - 2026-09-12
25
+
26
+ ### Changed
27
+
28
+ - Rename the four translated READMEs to `README-<lang>.md`. npm selects the package-page readme as the first markdown file matching its `{README,README.*}` glob (`@npmcli/package-json`, publish path), and that glob order puts `README.<lang>.md` ahead of `README.md` — so npm was serving the Simplified-Chinese file for this package too (measured on 15/15 sampled packages of the family). The new names sit outside the glob, so the English source is served again. No content changed apart from the language-switcher link each translation holds to its siblings, and the repo readme gate still passes. Takes effect with the next release; an already-published version cannot gain a corrected readme retroactively.
29
+ - Pin the `@deepseek-ai/dsh-*` dev/test dependencies to the published `0.1.5-rc.2` line and record `0.1.5-rc.2` in `dshWorkshop.compatibility.dshVersions`; the monthly Compat workflow now runs against `0.1.5-rc.2`. The peer range `>=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0` is unchanged, so no supported host line is dropped.
30
+
8
31
  ## [0.3.9] - 2026-09-10
9
32
 
10
33
  ### Changed
@@ -8,6 +8,7 @@
8
8
  *Mira la pantalla y luego actúa — cada clic autorizado, cada acción auditada.*
9
9
 
10
10
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
11
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-click)
11
12
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
12
13
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-click.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
13
14
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
@@ -16,7 +17,7 @@
16
17
  [![npm version](https://img.shields.io/npm/v/dsh-click)](https://www.npmjs.com/package/dsh-click)
17
18
  [![npm downloads](https://img.shields.io/npm/dm/dsh-click)](https://www.npmjs.com/package/dsh-click)
18
19
 
19
- [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
20
+ [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
20
21
 
21
22
  </div>
22
23
 
@@ -26,7 +27,7 @@
26
27
 
27
28
  | Superficie | Estado |
28
29
  |---|---|
29
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.1` (tag de GitHub, verificado el 2026-09-10). Verificado el 2026-09-10 contra el checkout master dsh-v0.1.5-rc.1 (cadena completa de gates + smoke de instalación de perfil). |
30
+ | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (tag de GitHub, verificado el 2026-09-11). Verificado el 2026-09-11 contra el checkout master dsh-v0.1.5-rc.2 (cadena completa de gates + smoke de instalación de perfil). |
30
31
  | Node | `^22.19.0 \|\| >=24.0.0` |
31
32
  | Plataformas | **Windows primero** (UIAutomation + entrada Win32, mediante un helper de PowerShell incluido); los backends de macOS/Linux están reservados y fallan cerrado con un motivo claro |
32
33
  | Modelo | Modelos solo-texto totalmente compatibles (`screen_read` devuelve texto estructurado); los modelos con visión reciben además las imágenes de `screen_shot` |
@@ -159,7 +160,7 @@ Ejemplo de sobrescritura en el parche de tu perfil:
159
160
  ```sh
160
161
  pnpm install # node ^22.19 || >=24
161
162
  pnpm run typecheck # tsc: src + tests contra el checkout local del harness
162
- pnpm run typecheck:ci # tsc contra los tipos publicados 0.1.5-rc.1 (sin paths)
163
+ pnpm run typecheck:ci # tsc contra los tipos publicados 0.1.5-rc.2 (sin paths)
163
164
  pnpm test # vitest: 66 tests, 11 archivos (el smoke del helper corre en Windows)
164
165
  pnpm run build # bundle tsdown + declaraciones tsc (lib/)
165
166
  pnpm run verify:self-contained # las especificaciones de dependencias resuelven desde el registry
@@ -178,7 +179,7 @@ pnpm pack # el tarball publicado
178
179
 
179
180
  ## PerryLink DSH Plugin Family
180
181
 
181
- Este proyecto es uno de los [37 complementos de DeepSeek Harness](https://github.com/PerryLink) mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, probablemente los demás también:
182
+ Este proyecto es uno de los [40 complementos de DeepSeek Harness](https://github.com/PerryLink) mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, probablemente los demás también:
182
183
 
183
184
  | Plugin | One-liner |
184
185
  |---|---|
@@ -208,6 +209,7 @@ Este proyecto es uno de los [37 complementos de DeepSeek Harness](https://github
208
209
  | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Reglas de permisos declarativas allow/deny/ask estilo Claude Code con auditoría | |
209
210
  | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | Inyector de directivas personales con interruptor en la barra superior (edición framework) |
210
211
  | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Base de conocimiento de desarrollo de plugins como habilidad de agente bajo demanda | |
212
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
211
213
  | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Motor de informes de investigación verificables con evidencia direccionada por contenido | |
212
214
  | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Puntuación de calidad multidimensional para plugins de DeepSeek Harness. | |
213
215
  | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Fija sesiones en la barra lateral web con orden durable | |
@@ -217,7 +219,16 @@ Este proyecto es uno de los [37 complementos de DeepSeek Harness](https://github
217
219
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Pruebas de instalación y humo aisladas para plugins de DeepSeek Harness. | |
218
220
  | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | Puente de tareas TickTick/Dida365: panel de cabecera de sesión + 11 herramientas |
219
221
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Traducción de parámetros entre proveedores y reparación determinista de JSON para DeepSeek Harness. | |
220
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | Puente WeChat ↔ DSH (bot Tencent iLink): texto/imagen/archivo/voz, aprobaciones en el chat |
222
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | Puente WeChat ↔ DSH (bot Tencent iLink): texto/imagen/archivo/voz, aprobaciones en el chat |
223
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
224
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
225
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
226
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
227
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
228
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
229
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
230
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
231
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
221
232
 
222
233
  ## License
223
234
 
@@ -8,6 +8,7 @@
8
8
  *पहले स्क्रीन देखें, फिर काम करें — हर क्लिक स्वीकृत, हर क्रिया ऑडिटेड।*
9
9
 
10
10
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
11
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-click)
11
12
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
12
13
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-click.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
13
14
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
@@ -16,7 +17,7 @@
16
17
  [![npm version](https://img.shields.io/npm/v/dsh-click)](https://www.npmjs.com/package/dsh-click)
17
18
  [![npm downloads](https://img.shields.io/npm/dm/dsh-click)](https://www.npmjs.com/package/dsh-click)
18
19
 
19
- [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
20
+ [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
20
21
 
21
22
  </div>
22
23
 
@@ -26,7 +27,7 @@
26
27
 
27
28
  | सतह | स्थिति |
28
29
  |---|---|
29
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.1` (GitHub tag, 2026-09-10 को सत्यापित)। 2026-09-10 को dsh-v0.1.5-rc.1 master checkout के विरुद्ध सत्यापित (पूर्ण gate chain + profile install smoke)। |
30
+ | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (GitHub tag, 2026-09-11 को सत्यापित)। 2026-09-11 को dsh-v0.1.5-rc.2 master checkout के विरुद्ध सत्यापित (पूर्ण gate chain + profile install smoke)। |
30
31
  | Node | `^22.19.0 \|\| >=24.0.0` |
31
32
  | प्लेटफ़ॉर्म | **Windows पहले** (UIAutomation + Win32 इनपुट, बंडल किए गए PowerShell हेल्पर के ज़रिए); macOS/Linux बैकएंड आरक्षित हैं और स्पष्ट कारण के साथ fail-closed होते हैं |
32
33
  | मॉडल | केवल-टेक्स्ट मॉडल पूरी तरह समर्थित (`screen_read` संरचित टेक्स्ट लौटाता है); विज़न मॉडल को अतिरिक्त रूप से `screen_shot` की छवियाँ मिलती हैं |
@@ -159,7 +160,7 @@ dsh --profile web --dump-config | grep -A2 'id: dsh-click'
159
160
  ```sh
160
161
  pnpm install # node ^22.19 || >=24
161
162
  pnpm run typecheck # tsc: src + tests स्थानीय हार्नेस चेकआउट के विरुद्ध
162
- pnpm run typecheck:ci # tsc प्रकाशित 0.1.5-rc.1 प्रकारों के विरुद्ध (बिना paths)
163
+ pnpm run typecheck:ci # tsc प्रकाशित 0.1.5-rc.2 प्रकारों के विरुद्ध (बिना paths)
163
164
  pnpm test # vitest: 66 टेस्ट, 11 फ़ाइलें (हेल्पर स्मोक Windows पर चलता है)
164
165
  pnpm run build # tsdown बंडल + tsc घोषणाएँ (lib/)
165
166
  pnpm run verify:self-contained # निर्भरता स्पेक registry से हल होती हैं
@@ -178,7 +179,7 @@ pnpm pack # प्रकाशित tarball
178
179
 
179
180
  ## PerryLink DSH Plugin Family
180
181
 
181
- यह प्रोजेक्ट [PerryLink](https://github.com/PerryLink) द्वारा अनुरक्षित [37 DeepSeek Harness प्लगइनों](https://github.com/PerryLink) में से एक है। अगर यह आपकी मदद करता है, तो बाकी भी करेंगे:
182
+ यह प्रोजेक्ट [PerryLink](https://github.com/PerryLink) द्वारा अनुरक्षित [40 DeepSeek Harness प्लगइनों](https://github.com/PerryLink) में से एक है। अगर यह आपकी मदद करता है, तो बाकी भी करेंगे:
182
183
 
183
184
  | Plugin | One-liner |
184
185
  |---|---|
@@ -208,6 +209,7 @@ pnpm pack # प्रकाशित tarball
208
209
  | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | ऑडिट के साथ Claude Code-शैली घोषणात्मक allow/deny/ask अनुमति नियम | |
209
210
  | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | शीर्ष-बार टॉगल के साथ व्यक्तिगत निर्देश इंजेक्टर (फ्रेमवर्क संस्करण) |
210
211
  | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | माँग पर एजेंट कौशल के रूप में प्लगइन-विकास ज्ञान आधार | |
212
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
211
213
  | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | सामग्री-पता साक्ष्य और सीलबंद संस्करणों वाला सत्यापन-योग्य अनुसंधान-रिपोर्ट इंजन | |
212
214
  | **[dsh-score](https://github.com/PerryLink/dsh-score)** | DeepSeek Harness प्लगिनों की बहु-आयामी गुणवत्ता स्कोरिंग। | |
213
215
  | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | टिकाऊ क्रम के साथ वेब साइडबार में सत्र पिन करें | |
@@ -217,7 +219,16 @@ pnpm pack # प्रकाशित tarball
217
219
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | DeepSeek Harness प्लगिनों के लिए पृथक इंस्टॉल-एंड-स्मोक टेस्ट ड्राइव। | |
218
220
  | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 कार्य ब्रिज: सत्र-हेडर पैनल + 11 टूल |
219
221
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | DeepSeek Harness के लिए वेंडर पैरामीटर अनुवाद और नियतात्मक JSON मरम्मत। | |
220
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | WeChat ↔ DSH ब्रिज (Tencent iLink bot): टेक्स्ट/इमेज/फ़ाइल/आवाज़, चैट में अनुमोदन |
222
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | WeChat ↔ DSH ब्रिज (Tencent iLink bot): टेक्स्ट/इमेज/फ़ाइल/आवाज़, चैट में अनुमोदन |
223
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
224
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
225
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
226
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
227
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
228
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
229
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
230
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
231
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
221
232
 
222
233
  ## License
223
234
 
@@ -8,6 +8,7 @@
8
8
  *Olhe para a tela e então aja — cada clique autorizado, cada ação auditada.*
9
9
 
10
10
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
11
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-click)
11
12
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
12
13
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-click.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
13
14
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
@@ -16,7 +17,7 @@
16
17
  [![npm version](https://img.shields.io/npm/v/dsh-click)](https://www.npmjs.com/package/dsh-click)
17
18
  [![npm downloads](https://img.shields.io/npm/dm/dsh-click)](https://www.npmjs.com/package/dsh-click)
18
19
 
19
- [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
20
+ [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
20
21
 
21
22
  </div>
22
23
 
@@ -26,7 +27,7 @@
26
27
 
27
28
  | Superfície | Status |
28
29
  |---|---|
29
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.1` (tag do GitHub, verificado em 2026-09-10). Verificado em 2026-09-10 contra o checkout master dsh-v0.1.5-rc.1 (cadeia completa de gates + smoke de instalação de perfil). |
30
+ | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (tag do GitHub, verificado em 2026-09-11). Verificado em 2026-09-11 contra o checkout master dsh-v0.1.5-rc.2 (cadeia completa de gates + smoke de instalação de perfil). |
30
31
  | Node | `^22.19.0 \|\| >=24.0.0` |
31
32
  | Plataformas | **Windows primeiro** (UIAutomation + entrada Win32, via um helper PowerShell embutido); os backends macOS/Linux estão reservados e falham fechado com um motivo claro |
32
33
  | Modelo | Modelos somente texto totalmente suportados (`screen_read` retorna texto estruturado); modelos com visão recebem também as imagens do `screen_shot` |
@@ -159,7 +160,7 @@ Exemplo de sobrescrita no patch do seu perfil:
159
160
  ```sh
160
161
  pnpm install # node ^22.19 || >=24
161
162
  pnpm run typecheck # tsc: src + tests contra o checkout local do harness
162
- pnpm run typecheck:ci # tsc contra os tipos publicados 0.1.5-rc.1 (sem paths)
163
+ pnpm run typecheck:ci # tsc contra os tipos publicados 0.1.5-rc.2 (sem paths)
163
164
  pnpm test # vitest: 66 testes, 11 arquivos (o smoke do helper roda no Windows)
164
165
  pnpm run build # bundle tsdown + declarações tsc (lib/)
165
166
  pnpm run verify:self-contained # especificações de dependências resolvem pelo registry
@@ -178,7 +179,7 @@ pnpm pack # o tarball publicado
178
179
 
179
180
  ## PerryLink DSH Plugin Family
180
181
 
181
- Este projeto é um dos [37 plugins de DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este ajuda você, os outros provavelmente também:
182
+ Este projeto é um dos [40 plugins de DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este ajuda você, os outros provavelmente também:
182
183
 
183
184
  | Plugin | One-liner |
184
185
  |---|---|
@@ -208,6 +209,7 @@ Este projeto é um dos [37 plugins de DeepSeek Harness](https://github.com/Perry
208
209
  | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Regras de permissão declarativas allow/deny/ask estilo Claude Code com auditoria | |
209
210
  | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | Injetor de diretivas pessoais com alternância na barra superior (edição framework) |
210
211
  | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Base de conhecimento de desenvolvimento de plugins como habilidade de agente sob demanda | |
212
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
211
213
  | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Motor de relatórios de pesquisa verificáveis com evidência endereçada por conteúdo | |
212
214
  | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Pontuação de qualidade multidimensional para plugins de DeepSeek Harness. | |
213
215
  | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Fixe sessões na barra lateral web com ordenação durável | |
@@ -217,7 +219,16 @@ Este projeto é um dos [37 plugins de DeepSeek Harness](https://github.com/Perry
217
219
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Test drives isolados de instalação e smoke para plugins de DeepSeek Harness. | |
218
220
  | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | Ponte de tarefas TickTick/Dida365: painel no cabeçalho da sessão + 11 ferramentas |
219
221
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Tradução de parâmetros entre fornecedores e reparo determinístico de JSON para DeepSeek Harness. | |
220
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | Ponte WeChat ↔ DSH (bot Tencent iLink): texto/imagem/arquivo/voz, aprovações no chat |
222
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | Ponte WeChat ↔ DSH (bot Tencent iLink): texto/imagem/arquivo/voz, aprovações no chat |
223
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
224
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
225
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
226
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
227
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
228
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
229
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
230
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
231
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
221
232
 
222
233
  ## License
223
234
 
@@ -8,6 +8,7 @@
8
8
  *先看清屏幕,再动手 —— 每次点击都过审批,每次操作都留审计。*
9
9
 
10
10
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
11
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-click)
11
12
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
12
13
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-click.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
13
14
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
@@ -16,7 +17,7 @@
16
17
  [![npm version](https://img.shields.io/npm/v/dsh-click)](https://www.npmjs.com/package/dsh-click)
17
18
  [![npm downloads](https://img.shields.io/npm/dm/dsh-click)](https://www.npmjs.com/package/dsh-click)
18
19
 
19
- [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
20
+ [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
20
21
 
21
22
  </div>
22
23
 
@@ -26,7 +27,7 @@
26
27
 
27
28
  | 方面 | 状态 |
28
29
  |---|---|
29
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.1`(GitHub tag,2026-09-10 已核验)。已于 2026-09-10 对照 dsh-v0.1.5-rc.1 master checkout 核验(完整门禁链 + profile 安装冒烟)。 |
30
+ | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2`(GitHub tag,2026-09-11 已核验)。已于 2026-09-11 对照 dsh-v0.1.5-rc.2 master checkout 核验(完整门禁链 + profile 安装冒烟)。 |
30
31
  | Node | `^22.19.0 \|\| >=24.0.0` |
31
32
  | 平台 | **Windows 优先**(UIAutomation + Win32 输入,经由内置 PowerShell 辅助进程);macOS/Linux 后端已预留,失败时以明确原因关闭 |
32
33
  | 模型 | 纯文本模型完整可用(`screen_read` 输出结构化文本);视觉模型额外获得 `screen_shot` 图像 |
@@ -159,7 +160,7 @@ profile patch 中的覆盖示例:
159
160
  ```sh
160
161
  pnpm install # node ^22.19 || >=24
161
162
  pnpm run typecheck # tsc:src + tests,对照本地 harness checkout
162
- pnpm run typecheck:ci # tsc:对照已发布的 0.1.5-rc.1 类型(无 paths)
163
+ pnpm run typecheck:ci # tsc:对照已发布的 0.1.5-rc.2 类型(无 paths)
163
164
  pnpm test # vitest:66 个测试、11 个文件(helper 冒烟在 Windows 上运行)
164
165
  pnpm run build # tsdown bundle + tsc 声明(lib/)
165
166
  pnpm run verify:self-contained # 依赖声明全部来自 registry
@@ -178,7 +179,7 @@ pnpm pack # 发布用 tarball
178
179
 
179
180
  ## PerryLink DSH Plugin Family
180
181
 
181
- 这是 [PerryLink](https://github.com/PerryLink) 维护的 [37 个 DeepSeek Harness 插件](https://github.com/PerryLink) 之一。如果它能帮到你,其他的也会:
182
+ 这是 [PerryLink](https://github.com/PerryLink) 维护的 [40 个 DeepSeek Harness 插件](https://github.com/PerryLink) 之一。如果它能帮到你,其他的也会:
182
183
 
183
184
  | Plugin | One-liner |
184
185
  |---|---|
@@ -208,6 +209,7 @@ pnpm pack # 发布用 tarball
208
209
  | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code 风格声明式 allow/deny/ask 权限规则,带审计 | |
209
210
  | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | 个人指令注入器:顶栏开关(框架版) |
210
211
  | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | 作为按需代理技能的插件开发知识库 | |
212
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
211
213
  | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | 可验证研究报告引擎:内容寻址证据账本与封存版本 | |
212
214
  | **[dsh-score](https://github.com/PerryLink/dsh-score)** | DeepSeek Harness 插件的多维质量评分。 | |
213
215
  | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 在 Web 侧栏置顶会话,带持久排序 | |
@@ -217,7 +219,16 @@ pnpm pack # 发布用 tarball
217
219
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | DeepSeek Harness 插件的隔离试装冒烟。 | |
218
220
  | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/滴答清单任务桥接:会话头面板 + 11 个工具 |
219
221
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | DeepSeek Harness 的厂商参数翻译与确定性 JSON 修复。 | |
220
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | 微信 ↔ DSH 桥接(Tencent iLink 机器人):文本/图片/文件/语音,聊天内审批卡片 |
222
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | 微信 ↔ DSH 桥接(Tencent iLink 机器人):文本/图片/文件/语音,聊天内审批卡片 |
223
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
224
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
225
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
226
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
227
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
228
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
229
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
230
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
231
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
221
232
 
222
233
  ## License
223
234
 
package/README.md CHANGED
@@ -17,7 +17,7 @@
17
17
  [![npm version](https://img.shields.io/npm/v/dsh-click)](https://www.npmjs.com/package/dsh-click)
18
18
  [![npm downloads](https://img.shields.io/npm/dm/dsh-click)](https://www.npmjs.com/package/dsh-click)
19
19
 
20
- [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
20
+ [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
21
21
 
22
22
  </div>
23
23
 
@@ -27,7 +27,7 @@
27
27
 
28
28
  | Surface | Status |
29
29
  |---|---|
30
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.1` (GitHub tag, verified 2026-09-10). Verified 2026-09-10 against the dsh-v0.1.5-rc.1 master checkout (full gate chain + profile install smoke). |
30
+ | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (GitHub tag, verified 2026-09-11). Verified 2026-09-11 against the dsh-v0.1.5-rc.2 master checkout (full gate chain + profile install smoke). |
31
31
  | Node | `^22.19.0 \|\| >=24.0.0` |
32
32
  | Platforms | **Windows first** (UIAutomation + Win32 input, via a bundled PowerShell helper); macOS/Linux backends are reserved and fail closed with a clear reason |
33
33
  | Model | Text-only models fully supported (`screen_read` returns structured text); vision models additionally get `screen_shot` images |
@@ -160,7 +160,7 @@ Example override in your profile patch:
160
160
  ```sh
161
161
  pnpm install # node ^22.19 || >=24
162
162
  pnpm run typecheck # tsc: src + tests against the local harness checkout
163
- pnpm run typecheck:ci # tsc against the published 0.1.5-rc.1 types (no paths)
163
+ pnpm run typecheck:ci # tsc against the published 0.1.5-rc.2 types (no paths)
164
164
  pnpm test # vitest: 66 tests, 11 files (helper smoke runs on Windows)
165
165
  pnpm run build # tsdown bundle + tsc declarations (lib/)
166
166
  pnpm run verify:self-contained # dependency specs resolve from the registry
@@ -179,7 +179,7 @@ pnpm pack # the published tarball
179
179
 
180
180
  ## PerryLink DSH Plugin Family
181
181
 
182
- This project is one of the [37 DeepSeek Harness plugins](https://github.com/PerryLink) maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
182
+ This project is one of the [40 DeepSeek Harness plugins](https://github.com/PerryLink) maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
183
183
 
184
184
  | Plugin | One-liner |
185
185
  |---|---|
@@ -209,6 +209,7 @@ This project is one of the [37 DeepSeek Harness plugins](https://github.com/Perr
209
209
  | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit | |
210
210
  | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | Personal directive injector with top-bar toggle (framework edition) |
211
211
  | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
212
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
212
213
  | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
213
214
  | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional quality scoring for DeepSeek Harness plugins. | |
214
215
  | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions in the Web sidebar with durable ordering | |
@@ -218,7 +219,16 @@ This project is one of the [37 DeepSeek Harness plugins](https://github.com/Perr
218
219
  | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives for DeepSeek Harness plugins. | |
219
220
  | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel + 11 tools |
220
221
  | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair for DeepSeek Harness. | |
221
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | WeChat ↔ DSH bridge (Tencent iLink bot): text/image/file/voice, approvals in chat |
222
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | WeChat ↔ DSH bridge (Tencent iLink bot): text/image/file/voice, approvals in chat |
223
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
224
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
225
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
226
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
227
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
228
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
229
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
230
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
231
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
222
232
 
223
233
  ### Install from the DSH Desktop Market
224
234
 
package/lib/index.js CHANGED
@@ -13,22 +13,28 @@ const OBSERVED_EVENT = "dsh-click/observed";
13
13
  /** The action audit event type. */
14
14
  const ACTION_EVENT = "dsh-click/action";
15
15
  /**
16
- * Append one dsh-click audit event when the host can carry it safely; skip
17
- * silently otherwise (the tool/call + tool/result events remain the
18
- * model-visible log, so nothing model-visible is lost). See the module doc
19
- * for the three host classes.
16
+ * Append one dsh-click audit event when the host's known-type set covers the
17
+ * vocabulary; otherwise skip and report the outcome so the caller can surface
18
+ * it (the tool/call + tool/result events remain the model-visible log, so
19
+ * nothing model-visible is lost).
20
+ *
21
+ * HARD RULE (measured on the 0.1.6-alpha.2 line): `Session.append`'s third
22
+ * parameter carries a `SurfaceIntent`, and only for surface-eligible event
23
+ * types; it is never an `ignorable` envelope. An out-of-repo non-surface type
24
+ * therefore cannot be stamped, and an unmarked unknown event makes a 0.1.5+
25
+ * reader refuse the whole stored log — so there is deliberately no probe path
26
+ * and never an unconditional append here.
20
27
  * @param session - the calling session.
21
28
  * @param type - the audit event type.
22
29
  * @param data - the audit payload.
30
+ * @returns `'appended'` when the event was written, `'skipped-unknown-host'`
31
+ * when this host's vocabulary does not cover the type.
23
32
  */
24
33
  function appendAuditEvent(session, type, data) {
25
- if (KNOWN_SESSION_EVENT_TYPES.has(type)) {
26
- if (type === "dsh-click/observed") session.append(type, data);
27
- else session.append(type, data);
28
- return;
29
- }
30
- const append = session.append;
31
- if (Function.prototype.toString.call(append).includes("ignorable")) append.call(session, type, data, { ignorable: true });
34
+ if (!KNOWN_SESSION_EVENT_TYPES.has(type)) return "skipped-unknown-host";
35
+ if (type === "dsh-click/observed") session.append(type, data);
36
+ else session.append(type, data);
37
+ return "appended";
32
38
  }
33
39
  //#endregion
34
40
  //#region src/sanitize.ts
@@ -151,6 +157,8 @@ const APPROVAL_DETAIL = {
151
157
  /** Executes mutating desktop actions behind the full safety boundary. */
152
158
  var ActionExecutor = class {
153
159
  deps;
160
+ /** Whether the one-time audit-skip notice has been emitted. */
161
+ warnedAuditSkip = false;
154
162
  /** @param deps - executor dependencies. */
155
163
  constructor(deps) {
156
164
  this.deps = deps;
@@ -169,7 +177,10 @@ var ActionExecutor = class {
169
177
  const session = exec.agent?.session;
170
178
  if (session === void 0) return;
171
179
  try {
172
- appendAuditEvent(session, ACTION_EVENT, event);
180
+ if (appendAuditEvent(session, "dsh-click/action", event) === "skipped-unknown-host" && !this.warnedAuditSkip) {
181
+ this.warnedAuditSkip = true;
182
+ this.deps.ctx.logger("dsh-click").warn("dsh-click: this host does not admit dsh-click/action audit events (unknown non-surface type); the tool results remain the audit trail");
183
+ }
173
184
  } catch {}
174
185
  }
175
186
  /**
@@ -575,7 +586,7 @@ var ObservationStore = class {
575
586
  * @module dsh-click/version
576
587
  */
577
588
  /** Plugin version advertised in the helper-protocol handshake. */
578
- const VERSION = "0.3.9";
589
+ const VERSION = "0.3.11";
579
590
  /** The helper protocol revision; bump only on incompatible wire changes. */
580
591
  const HELPER_PROTOCOL_VERSION = 1;
581
592
  //#endregion
@@ -1208,13 +1219,18 @@ function observedWindowInfo(info, maxTextLength) {
1208
1219
  visible: info.visible
1209
1220
  };
1210
1221
  }
1211
- /** Append the `dsh-click/observed` audit event; a failed append is swallowed. */
1222
+ /** Whether the one-time audit-skip notice has been emitted (module-scope: the tool definitions share one host). */
1223
+ let warnedAuditSkip = false;
1224
+ /** Append the `dsh-click/observed` audit event; a failed append is swallowed, a host-side skip is reported once. */
1212
1225
  function auditObservation(exec, event, auditSessionEvents = true) {
1213
1226
  if (!auditSessionEvents) return;
1214
1227
  const session = exec.agent?.session;
1215
1228
  if (session === void 0) return;
1216
1229
  try {
1217
- appendAuditEvent(session, OBSERVED_EVENT, event);
1230
+ if (appendAuditEvent(session, "dsh-click/observed", event) === "skipped-unknown-host" && !warnedAuditSkip) {
1231
+ warnedAuditSkip = true;
1232
+ console.warn("dsh-click: this host does not admit dsh-click/observed audit events (unknown non-surface type); the tool results remain the audit trail");
1233
+ }
1218
1234
  } catch {}
1219
1235
  }
1220
1236
  /** One-line window identity for render text. */
@@ -2196,8 +2212,8 @@ function allTools(services) {
2196
2212
  //#endregion
2197
2213
  //#region src/index.ts
2198
2214
  const name = "dsh-click";
2199
- /** Hard services: the tool registry every contribution lands in. */
2200
- const inject = ["tools"];
2215
+ /** Hard services: the tool registry every contribution lands in, plus the subprocess runtime the Windows helper spawns through. */
2216
+ const inject = ["tools", "subprocess"];
2201
2217
  /**
2202
2218
  * Mount the plugin: resolve config, select the platform backend, probe the
2203
2219
  * optional OCR provider, read the optional visual-grounding seam, and register
@@ -29,6 +29,8 @@ export interface ActionExecutorDeps {
29
29
  /** Executes mutating desktop actions behind the full safety boundary. */
30
30
  export declare class ActionExecutor {
31
31
  private readonly deps;
32
+ /** Whether the one-time audit-skip notice has been emitted. */
33
+ private warnedAuditSkip;
32
34
  /** @param deps - executor dependencies. */
33
35
  constructor(deps: ActionExecutorDeps);
34
36
  /** The mounting context. */
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,gBAAgB,EAA0B,MAAM,cAAc,CAAA;AAEvE,OAAO,EAAiB,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAuB,MAAM,qBAAqB,CAAA;AAErI,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAA;AAS5D,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAA;CACxC;AAED,yEAAyE;AACzE,qBAAa,cAAc;IAEb,OAAO,CAAC,QAAQ,CAAC,IAAI;IADjC,2CAA2C;gBACd,IAAI,EAAE,kBAAkB;IAErD,4BAA4B;IAC5B,OAAO,KAAK,GAAG,GAEd;IAED,2BAA2B;IAC3B,OAAO,KAAK,MAAM,GAEjB;IAED,gFAAgF;IAChF,OAAO,CAAC,KAAK;IAYb;;;;;;;;OAQG;YACW,kBAAkB;IAyBhC;;;;;;;;;;;OAWG;YACW,IAAI;IAuClB;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAS9B;;;;;;;;;;OAUG;IACG,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,cAAc,EACpB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,OAAO,CAAC,aAAa,CAAC,GACtD,OAAO,CAAC,aAAa,CAAC;IAwCzB;;;;;;;;;OASG;IACG,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CAoBlG"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,gBAAgB,EAA0B,MAAM,cAAc,CAAA;AAEvE,OAAO,EAAiB,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAuB,MAAM,qBAAqB,CAAA;AAErI,yDAAyD;AACzD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAA;AAS5D,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAA;CACxC;AAED,yEAAyE;AACzE,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,+DAA+D;IAC/D,OAAO,CAAC,eAAe,CAAQ;IAC/B,2CAA2C;gBACd,IAAI,EAAE,kBAAkB;IAErD,4BAA4B;IAC5B,OAAO,KAAK,GAAG,GAEd;IAED,2BAA2B;IAC3B,OAAO,KAAK,MAAM,GAEjB;IAED,gFAAgF;IAChF,OAAO,CAAC,KAAK;IAkBb;;;;;;;;OAQG;YACW,kBAAkB;IAyBhC;;;;;;;;;;;OAWG;YACW,IAAI;IAuClB;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAS9B;;;;;;;;;;OAUG;IACG,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,cAAc,EACpB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,OAAO,CAAC,aAAa,CAAC,GACtD,OAAO,CAAC,aAAa,CAAC;IAwCzB;;;;;;;;;OASG;IACG,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CAoBlG"}
@@ -115,14 +115,25 @@ export type ActionEvent = {
115
115
  restored?: boolean;
116
116
  detail?: string;
117
117
  };
118
+ /** The outcome of one audit append attempt. */
119
+ export type AuditAppendOutcome = 'appended' | 'skipped-unknown-host';
118
120
  /**
119
- * Append one dsh-click audit event when the host can carry it safely; skip
120
- * silently otherwise (the tool/call + tool/result events remain the
121
- * model-visible log, so nothing model-visible is lost). See the module doc
122
- * for the three host classes.
121
+ * Append one dsh-click audit event when the host's known-type set covers the
122
+ * vocabulary; otherwise skip and report the outcome so the caller can surface
123
+ * it (the tool/call + tool/result events remain the model-visible log, so
124
+ * nothing model-visible is lost).
125
+ *
126
+ * HARD RULE (measured on the 0.1.6-alpha.2 line): `Session.append`'s third
127
+ * parameter carries a `SurfaceIntent`, and only for surface-eligible event
128
+ * types; it is never an `ignorable` envelope. An out-of-repo non-surface type
129
+ * therefore cannot be stamped, and an unmarked unknown event makes a 0.1.5+
130
+ * reader refuse the whole stored log — so there is deliberately no probe path
131
+ * and never an unconditional append here.
123
132
  * @param session - the calling session.
124
133
  * @param type - the audit event type.
125
134
  * @param data - the audit payload.
135
+ * @returns `'appended'` when the event was written, `'skipped-unknown-host'`
136
+ * when this host's vocabulary does not cover the type.
126
137
  */
127
- export declare function appendAuditEvent(session: Session, type: typeof OBSERVED_EVENT | typeof ACTION_EVENT, data: ObservedEvent | ActionEvent): void;
138
+ export declare function appendAuditEvent(session: Session, type: typeof OBSERVED_EVENT | typeof ACTION_EVENT, data: ObservedEvent | ActionEvent): AuditAppendOutcome;
128
139
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * (Windows first, macOS/Linux backends reserved).
4
4
  *
5
5
  * Host-only function plugin — no default export (the Loader unwraps
6
- * `exports.default ?? exports`). It registers eight tools behind one shared
6
+ * `exports.default ?? exports`). It registers nine tools behind one shared
7
7
  * safety boundary: observations are structured text (accessibility tree +
8
8
  * pixel hints) so text-only models work, mutating actions must cite a fresh
9
9
  * observation and pass approval (or the configured window allowlist), the
@@ -15,7 +15,7 @@
15
15
  import type { Context } from '@deepseek-ai/cordis';
16
16
  import { Config } from './config.js';
17
17
  export declare const name = "dsh-click";
18
- /** Hard services: the tool registry every contribution lands in. */
18
+ /** Hard services: the tool registry every contribution lands in, plus the subprocess runtime the Windows helper spawns through. */
19
19
  export declare const inject: string[];
20
20
  export { Config, resolveConfig } from './config.js';
21
21
  export { VERSION, HELPER_PROTOCOL_VERSION } from './version.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAA;AAQnD,eAAO,MAAM,IAAI,cAAc,CAAA;AAE/B,oEAAoE;AACpE,eAAO,MAAM,MAAM,UAAY,CAAA;AAE/B,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/G,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AACzF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AACnH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC5F,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,OAAO,GACb,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,4BAA4B,EAC5B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE1D;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAA;AAQnD,eAAO,MAAM,IAAI,cAAc,CAAA;AAE/B,mIAAmI;AACnI,eAAO,MAAM,MAAM,UAA0B,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/G,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AACzF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AACnH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC5F,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,OAAO,GACb,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,4BAA4B,EAC5B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE1D;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAG/C,OAAO,EAA0B,KAAK,WAAW,EAAE,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC1G,OAAO,KAAK,EAAE,cAAc,EAA0B,IAAI,EAAyC,MAAM,qBAAqB,CAAA;AAE9H,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAA;IACvC,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAA;CAC5C;AAED,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE,OAAO,CAAA;CACpB;AAgFD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDAoIpD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDA+IpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDAsJpD;AAiED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,mDAoD/C;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,mDAyC9C;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,YAAY,mDA0ChD;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,YAAY,mDAkC7C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,mDA+EjD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,mDAwCnD;AAED,oDAAoD;AACpD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,qDAY9C"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAG/C,OAAO,EAA0B,KAAK,WAAW,EAAE,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC1G,OAAO,KAAK,EAAE,cAAc,EAA0B,IAAI,EAAyC,MAAM,qBAAqB,CAAA;AAE9H,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAA;IACvC,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAA;CAC5C;AAED,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE,OAAO,CAAA;CACpB;AAyFD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDAoIpD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDA+IpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,mDAsJpD;AAiED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,mDAoD/C;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,mDAyC9C;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,YAAY,mDA0ChD;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,YAAY,mDAkC7C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,mDA+EjD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,mDAwCnD;AAED,oDAAoD;AACpD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,qDAY9C"}
@@ -7,7 +7,7 @@
7
7
  * @module dsh-click/version
8
8
  */
9
9
  /** Plugin version advertised in the helper-protocol handshake. */
10
- export declare const VERSION = "0.3.9";
10
+ export declare const VERSION = "0.3.11";
11
11
  /** The helper protocol revision; bump only on incompatible wire changes. */
12
12
  export declare const HELPER_PROTOCOL_VERSION = 1;
13
13
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,kEAAkE;AAClE,eAAO,MAAM,OAAO,UAAU,CAAA;AAE9B,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB,IAAI,CAAA"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,kEAAkE;AAClE,eAAO,MAAM,OAAO,WAAW,CAAA;AAE/B,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB,IAAI,CAAA"}
@@ -57,6 +57,15 @@ public static class DshClickWin32 {
57
57
  [DllImport("user32.dll")]
58
58
  public static extern bool SetForegroundWindow(IntPtr hWnd);
59
59
 
60
+ [StructLayout(LayoutKind.Sequential)]
61
+ public struct POINT { public int X; public int Y; }
62
+
63
+ [DllImport("user32.dll")]
64
+ public static extern bool ScreenToClient(IntPtr hWnd, ref POINT point);
65
+
66
+ [DllImport("user32.dll")]
67
+ public static extern bool GetClientRect(IntPtr hWnd, out RECT rect);
68
+
60
69
  [DllImport("user32.dll")]
61
70
  public static extern int GetSystemMetrics(int index);
62
71
 
@@ -401,7 +410,25 @@ function Get-ElementCenter($element) {
401
410
  return @{ x = [int]($bounds.X + $bounds.Width / 2); y = [int]($bounds.Y + $bounds.Height / 2) }
402
411
  }
403
412
 
404
- function Get-ClientPoint($windowRect, $screenX, $screenY) {
413
+ function Get-ClientPoint($hwnd, $windowRect, $screenX, $screenY) {
414
+ # Exact client-area mapping via ScreenToClient (window rects include the
415
+ # border and title bar, so plain subtraction lands ~8px/~31px off). The
416
+ # mapping is non-regressive: if the interop call is unavailable, fall back to
417
+ # the rectangle arithmetic and the old containment check.
418
+ try {
419
+ $point = New-Object DshClickWin32+POINT
420
+ $point.X = [int]$screenX
421
+ $point.Y = [int]$screenY
422
+ $client = New-Object DshClickWin32+RECT
423
+ if ([DshClickWin32]::ScreenToClient($hwnd, [ref]$point) -and [DshClickWin32]::GetClientRect($hwnd, [ref]$client)) {
424
+ if ($point.X -lt 0 -or $point.Y -lt 0 -or $point.X -ge $client.Right -or $point.Y -ge $client.Bottom) {
425
+ throw "point ($screenX, $screenY) lies outside the client area of window $hwnd"
426
+ }
427
+ return @{ x = $point.X; y = $point.Y }
428
+ }
429
+ } catch [System.Management.Automation.RuntimeException] {
430
+ throw
431
+ } catch { }
405
432
  $cx = $screenX - $windowRect.x
406
433
  $cy = $screenY - $windowRect.y
407
434
  if ($cx -lt 0 -or $cy -lt 0 -or $cx -ge $windowRect.width -or $cy -ge $windowRect.height) {
@@ -695,15 +722,33 @@ function Get-ActionOutcome($hwnd, $action, $delivered, $restored, $detail) {
695
722
  processAfter = $after
696
723
  }
697
724
  if ($restored -ne $null) { $outcome.restored = [bool]$restored }
698
- if ($detail -ne $null) { $outcome.detail = [string]$detail }
725
+ # The focus-fallback verdict rides every action outcome: a refused
726
+ # SetForegroundWindow must be visible to the model, not silently discarded.
727
+ $merged = @()
728
+ if ($detail -ne $null) { $merged += [string]$detail }
729
+ if ($script:focusFallbackDetail -ne $null) { $merged += [string]$script:focusFallbackDetail }
730
+ if ($merged.Count -gt 0) { $outcome.detail = ($merged -join '; ') }
699
731
  return $outcome
700
732
  }
701
733
 
734
+ # The sanctioned focus escape hatch: attempt to bring the window forward and
735
+ # record the verdict for the outcome. Never throws - the action itself has
736
+ # already been delivered or is about to be.
737
+ function Set-DshFocusFallback($hwnd) {
738
+ try {
739
+ if (-not [DshClickWin32]::SetForegroundWindow($hwnd)) {
740
+ $script:focusFallbackDetail = 'focusFallback requested but the OS refused SetForegroundWindow; the action was delivered without foreground focus'
741
+ }
742
+ } catch {
743
+ $script:focusFallbackDetail = "focusFallback requested but SetForegroundWindow threw: $($_.Exception.Message)"
744
+ }
745
+ }
746
+
702
747
  function Invoke-OpClick($opArgs) {
703
748
  $request = $opArgs.request
704
749
  $focusFallback = if ($opArgs.focusFallback -ne $null) { [bool]$opArgs.focusFallback } else { $false }
705
750
  $hwnd = Resolve-Window @{ windowId = $request.windowId }
706
- if ($focusFallback) { [void][DshClickWin32]::SetForegroundWindow($hwnd) }
751
+ if ($focusFallback) { Set-DshFocusFallback $hwnd }
707
752
  $windowRect = Get-WindowRectInfo $hwnd
708
753
  $delivered = 'posted'
709
754
  $windowElement = Get-UiaElement $hwnd
@@ -716,13 +761,13 @@ function Invoke-OpClick($opArgs) {
716
761
  $delivered = 'uia'
717
762
  } else {
718
763
  $center = Get-ElementCenter $element
719
- $client = Get-ClientPoint $windowRect $center.x $center.y
764
+ $client = Get-ClientPoint $hwnd $windowRect $center.x $center.y
720
765
  Post-Click $hwnd $client.x $client.y ([string]$request.button)
721
766
  $delivered = 'posted'
722
767
  }
723
768
  } else {
724
769
  if ($request.x -eq $null -or $request.y -eq $null) { throw 'click requires elementId or (x, y)' }
725
- $client = Get-ClientPoint $windowRect ([int]$request.x) ([int]$request.y)
770
+ $client = Get-ClientPoint $hwnd $windowRect ([int]$request.x) ([int]$request.y)
726
771
  Post-Click $hwnd $client.x $client.y ([string]$request.button)
727
772
  $delivered = 'posted'
728
773
  }
@@ -734,7 +779,7 @@ function Invoke-OpType($opArgs) {
734
779
  $focusFallback = if ($opArgs.focusFallback -ne $null) { [bool]$opArgs.focusFallback } else { $false }
735
780
  $rollback = if ($request.rollback -ne $null) { [bool]$request.rollback } else { $true }
736
781
  $hwnd = Resolve-Window @{ windowId = $request.windowId }
737
- if ($focusFallback) { [void][DshClickWin32]::SetForegroundWindow($hwnd) }
782
+ if ($focusFallback) { Set-DshFocusFallback $hwnd }
738
783
  $windowElement = Get-UiaElement $hwnd
739
784
  $element = Find-ElementByRuntimeId $windowElement ([string]$request.elementId)
740
785
  if ($element -eq $null) { throw "element '$($request.elementId)' not found in window $hwnd (re-run screen_read)" }
@@ -782,7 +827,7 @@ function Invoke-OpScroll($opArgs) {
782
827
  }
783
828
  }
784
829
  if ($scroll -ne $null) {
785
- if ($focusFallback) { [void][DshClickWin32]::SetForegroundWindow($hwnd) }
830
+ if ($focusFallback) { Set-DshFocusFallback $hwnd }
786
831
  $vertical = [System.Windows.Automation.ScrollAmount]::NoAmount
787
832
  switch ([string]$request.direction) {
788
833
  'up' { $vertical = [System.Windows.Automation.ScrollAmount]::SmallIncrement }
@@ -796,7 +841,7 @@ function Invoke-OpScroll($opArgs) {
796
841
  }
797
842
  return (Get-ActionOutcome $hwnd 'scroll' 'uia' $null $null)
798
843
  }
799
- if ($focusFallback) { [void][DshClickWin32]::SetForegroundWindow($hwnd) }
844
+ if ($focusFallback) { Set-DshFocusFallback $hwnd }
800
845
  $direction = [string]$request.direction
801
846
  $page = ($direction -eq 'page-up' -or $direction -eq 'page-down')
802
847
  $sign = if ($direction -eq 'up' -or $direction -eq 'page-up') { 1 } else { -1 }
@@ -804,7 +849,7 @@ function Invoke-OpScroll($opArgs) {
804
849
  $delta = [int]($sign * $notches * $amount * 120)
805
850
  $wparam = [IntPtr][int64]($delta * 65536)
806
851
  $rect = Get-WindowRectInfo $hwnd
807
- $client = Get-ClientPoint $rect ([int]($rect.x + $rect.width / 2)) ([int]($rect.y + $rect.height / 2))
852
+ $client = Get-ClientPoint $hwnd $rect ([int]($rect.x + $rect.width / 2)) ([int]($rect.y + $rect.height / 2))
808
853
  [void][DshClickWin32]::PostMessage($hwnd, 0x20A, $wparam, (Get-LParam $client.x $client.y))
809
854
  return (Get-ActionOutcome $hwnd 'scroll' 'posted' $null 'posted wheel message to the window')
810
855
  }
@@ -813,7 +858,7 @@ function Invoke-OpKey($opArgs) {
813
858
  $request = $opArgs.request
814
859
  $focusFallback = if ($opArgs.focusFallback -ne $null) { [bool]$opArgs.focusFallback } else { $false }
815
860
  $hwnd = Resolve-Window @{ windowId = $request.windowId }
816
- if ($focusFallback) { [void][DshClickWin32]::SetForegroundWindow($hwnd) }
861
+ if ($focusFallback) { Set-DshFocusFallback $hwnd }
817
862
  Post-KeyCombo $hwnd ([string]$request.keys)
818
863
  return (Get-ActionOutcome $hwnd 'key' 'posted' $null $null)
819
864
  }
@@ -829,7 +874,13 @@ function Invoke-OpLaunch($opArgs) {
829
874
  $command = Get-Command $name -ErrorAction SilentlyContinue
830
875
  if ($command -ne $null) { $target = $command.Source } else { throw "cannot resolve application '$name' on the search path" }
831
876
  }
832
- $process = Start-Process -FilePath $target -ArgumentList $launchArgs -PassThru
877
+ # An empty -ArgumentList binds to nothing useful and can fail the launch
878
+ # outright, so the parameter is omitted when there are no arguments.
879
+ if ($launchArgs.Count -gt 0) {
880
+ $process = Start-Process -FilePath $target -ArgumentList $launchArgs -PassThru
881
+ } else {
882
+ $process = Start-Process -FilePath $target -PassThru
883
+ }
833
884
  $path = $null
834
885
  try {
835
886
  $path = $process.Path
@@ -847,6 +898,9 @@ try {
847
898
  $request = $raw | ConvertFrom-Json
848
899
  $opArgs = if ($request.args -ne $null) { $request.args } else { @{} }
849
900
  $result = $null
901
+ # Per-request focus-fallback verdict (set by Set-DshFocusFallback, consumed by
902
+ # Get-ActionOutcome); one helper process serves exactly one request.
903
+ $script:focusFallbackDetail = $null
850
904
  switch ([string]$request.op) {
851
905
  'windows' { $result = Invoke-OpWindows }
852
906
  'apps' { $result = Invoke-OpApps }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-click",
3
- "version": "0.3.9",
3
+ "version": "0.3.11",
4
4
  "description": "Cross-platform native desktop control tools for DeepSeek Harness (Windows first): screen_shot, screen_read (accessibility tree + pixel description for text-only models), click/type/scroll/key, and app_list/app_launch — every mutating action gated by approval, never stealing foreground focus, with stale-observation rejection and process-identity checks",
5
5
  "repository": {
6
6
  "type": "git",
@@ -30,13 +30,14 @@
30
30
  "THIRD_PARTY_NOTICES.md",
31
31
  "SECURITY.md",
32
32
  "README.md",
33
- "README.zh.md",
34
- "README.es.md",
35
- "README.pt.md",
36
- "README.hi.md",
33
+ "README-zh.md",
34
+ "README-es.md",
35
+ "README-pt.md",
36
+ "README-hi.md",
37
37
  "LICENSE"
38
38
  ],
39
39
  "dsh": {
40
+ "manifestVersion": 1,
40
41
  "bundle": {
41
42
  "patch": "./cordis.patch.yml"
42
43
  }
@@ -68,13 +69,13 @@
68
69
  "compatibility": {
69
70
  "dshVersions": [
70
71
  "0.1.2-rc.1",
71
- "0.1.5-rc.1"
72
+ "0.1.5-rc.2"
72
73
  ]
73
74
  },
74
75
  "capability": {
75
76
  "id": "desktop-control",
76
77
  "kind": "tool",
77
- "invocation": "screen_shot, screen_read, click, type, scroll, key, app_list, app_launch",
78
+ "invocation": "screen_shot, screen_read, screen_find, click, type, scroll, key, app_list, app_launch",
78
79
  "expected": "observes native application windows (screenshot and structured accessibility tree with pixel hints) and performs window-scoped actions gated by approval, without stealing foreground focus"
79
80
  },
80
81
  "evidence": {
@@ -97,18 +98,19 @@
97
98
  "screen-reader"
98
99
  ],
99
100
  "engines": {
100
- "node": "^22.19.0 || >=24.0.0"
101
+ "node": "^22.19.0 || >=24.0.0",
102
+ "dsh": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0"
101
103
  },
102
104
  "packageManager": "pnpm@11.7.0",
103
105
  "peerDependencies": {
104
106
  "@deepseek-ai/cordis": "^4.0.2",
105
- "@deepseek-ai/dsh-agent": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0",
106
- "@deepseek-ai/dsh-attachment": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0",
107
- "@deepseek-ai/dsh-llm": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0",
108
- "@deepseek-ai/dsh-session": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0",
109
- "@deepseek-ai/dsh-subprocess": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0",
110
- "@deepseek-ai/dsh-tools": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0",
111
- "@deepseek-ai/dsh-user-approval": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0",
107
+ "@deepseek-ai/dsh-agent": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0",
108
+ "@deepseek-ai/dsh-attachment": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0",
109
+ "@deepseek-ai/dsh-llm": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0",
110
+ "@deepseek-ai/dsh-session": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0",
111
+ "@deepseek-ai/dsh-subprocess": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0",
112
+ "@deepseek-ai/dsh-tools": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0",
113
+ "@deepseek-ai/dsh-user-approval": ">=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-0 <0.2.0",
112
114
  "@deepseek-ai/schemastery": "^3.18.2"
113
115
  },
114
116
  "dependencies": {
@@ -119,15 +121,15 @@
119
121
  "@deepseek-ai/cordis": "^4.0.2",
120
122
  "@deepseek-ai/cordis-plugin-include": "^1.0.7",
121
123
  "@deepseek-ai/cordis-plugin-loader": "^1.0.3",
122
- "@deepseek-ai/dsh-agent": "0.1.5-rc.1",
123
- "@deepseek-ai/dsh-attachment": "0.1.5-rc.1",
124
- "@deepseek-ai/dsh-llm": "0.1.5-rc.1",
125
- "@deepseek-ai/dsh-session": "0.1.5-rc.1",
126
- "@deepseek-ai/dsh-subprocess": "0.1.5-rc.1",
127
- "@deepseek-ai/dsh-subprocess-local": "0.1.5-rc.1",
128
- "@deepseek-ai/dsh-system-prompt": "0.1.5-rc.1",
129
- "@deepseek-ai/dsh-tools": "0.1.5-rc.1",
130
- "@deepseek-ai/dsh-user-approval": "0.1.5-rc.1",
124
+ "@deepseek-ai/dsh-agent": "0.1.5-rc.2",
125
+ "@deepseek-ai/dsh-attachment": "0.1.5-rc.2",
126
+ "@deepseek-ai/dsh-llm": "0.1.5-rc.2",
127
+ "@deepseek-ai/dsh-session": "0.1.5-rc.2",
128
+ "@deepseek-ai/dsh-subprocess": "0.1.5-rc.2",
129
+ "@deepseek-ai/dsh-subprocess-local": "0.1.5-rc.2",
130
+ "@deepseek-ai/dsh-system-prompt": "0.1.5-rc.2",
131
+ "@deepseek-ai/dsh-tools": "0.1.5-rc.2",
132
+ "@deepseek-ai/dsh-user-approval": "0.1.5-rc.2",
131
133
  "@deepseek-ai/schemastery": "^3.18.2",
132
134
  "@types/node": "^22.19.0",
133
135
  "@vitest/coverage-v8": "3.2.0",