dsh-click 0.3.10 → 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 +16 -0
- package/README-es.md +13 -2
- package/README-hi.md +13 -2
- package/README-pt.md +13 -2
- package/README-zh.md +13 -2
- package/README.md +12 -2
- package/lib/index.js +33 -17
- package/lib/types/actions.d.ts +2 -0
- package/lib/types/actions.d.ts.map +1 -1
- package/lib/types/events.d.ts +16 -5
- package/lib/types/events.d.ts.map +1 -1
- package/lib/types/index.d.ts +2 -2
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/tools.d.ts.map +1 -1
- package/lib/types/version.d.ts +1 -1
- package/native/win32/dsh-click-helper.ps1 +65 -11
- package/package.json +12 -10
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,22 @@ 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
|
+
|
|
8
24
|
## [0.3.10] - 2026-09-12
|
|
9
25
|
|
|
10
26
|
### Changed
|
package/README-es.md
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)
|
|
11
|
+
[](https://gitee.com/perrylink/dsh-click)
|
|
11
12
|
[](https://github.com/topics/dsh-plugin)
|
|
12
13
|
[](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
|
|
13
14
|
[](#)
|
|
@@ -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 [
|
|
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/
|
|
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
|
|
package/README-hi.md
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*पहले स्क्रीन देखें, फिर काम करें — हर क्लिक स्वीकृत, हर क्रिया ऑडिटेड।*
|
|
9
9
|
|
|
10
10
|
[](LICENSE)
|
|
11
|
+
[](https://gitee.com/perrylink/dsh-click)
|
|
11
12
|
[](https://github.com/topics/dsh-plugin)
|
|
12
13
|
[](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
|
|
13
14
|
[](#)
|
|
@@ -178,7 +179,7 @@ pnpm pack # प्रकाशित tarball
|
|
|
178
179
|
|
|
179
180
|
## PerryLink DSH Plugin Family
|
|
180
181
|
|
|
181
|
-
यह प्रोजेक्ट [PerryLink](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/
|
|
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
|
|
package/README-pt.md
CHANGED
|
@@ -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)
|
|
11
|
+
[](https://gitee.com/perrylink/dsh-click)
|
|
11
12
|
[](https://github.com/topics/dsh-plugin)
|
|
12
13
|
[](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
|
|
13
14
|
[](#)
|
|
@@ -178,7 +179,7 @@ pnpm pack # o tarball publicado
|
|
|
178
179
|
|
|
179
180
|
## PerryLink DSH Plugin Family
|
|
180
181
|
|
|
181
|
-
Este projeto é um dos [
|
|
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/
|
|
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
|
|
package/README-zh.md
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*先看清屏幕,再动手 —— 每次点击都过审批,每次操作都留审计。*
|
|
9
9
|
|
|
10
10
|
[](LICENSE)
|
|
11
|
+
[](https://gitee.com/perrylink/dsh-click)
|
|
11
12
|
[](https://github.com/topics/dsh-plugin)
|
|
12
13
|
[](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
|
|
13
14
|
[](#)
|
|
@@ -178,7 +179,7 @@ pnpm pack # 发布用 tarball
|
|
|
178
179
|
|
|
179
180
|
## PerryLink DSH Plugin Family
|
|
180
181
|
|
|
181
|
-
这是 [PerryLink](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/
|
|
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
|
@@ -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 [
|
|
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/
|
|
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
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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,
|
|
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.
|
|
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
|
-
/**
|
|
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,
|
|
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
|
package/lib/types/actions.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/lib/types/events.d.ts
CHANGED
|
@@ -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
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
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):
|
|
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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAA6B,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAElF,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,gFAAgF;IAChF,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAA;IACpB,+CAA+C;IAC/C,SAAS,EAAE,cAAc,CAAA;IACzB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAA;CACf;AAED,OAAO,QAAQ,gCAAgC,CAAC;IAC9C,UAAU,eAAe;QACvB;;;;;WAKG;QACH,oBAAoB,EAAE;YACpB,mDAAmD;YACnD,aAAa,EAAE,MAAM,CAAA;YACrB,8BAA8B;YAC9B,QAAQ,EAAE,MAAM,CAAA;YAChB,oCAAoC;YACpC,SAAS,EAAE,MAAM,CAAA;YACjB,0DAA0D;YAC1D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;YAC7B,8BAA8B;YAC9B,WAAW,EAAE,MAAM,CAAA;YACnB,iDAAiD;YACjD,YAAY,EAAE,MAAM,CAAA;YACpB,8DAA8D;YAC9D,KAAK,CAAC,EAAE,aAAa,CAAA;SACtB,CAAA;QACD;;;;WAIG;QACH,kBAAkB,EAAE;YAClB,gCAAgC;YAChC,IAAI,EAAE,MAAM,CAAA;YACZ,sFAAsF;YACtF,QAAQ,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,CAAA;YAC3C,+DAA+D;YAC/D,OAAO,EAAE,IAAI,GAAG,OAAO,CAAA;YACvB,8DAA8D;YAC9D,aAAa,CAAC,EAAE,MAAM,CAAA;YACtB,gEAAgE;YAChE,QAAQ,CAAC,EAAE,MAAM,CAAA;YACjB,mDAAmD;YACnD,aAAa,CAAC,EAAE,YAAY,CAAA;YAC5B,kDAAkD;YAClD,YAAY,CAAC,EAAE,YAAY,CAAA;YAC3B,oEAAoE;YACpE,QAAQ,CAAC,EAAE,OAAO,CAAA;YAClB,kEAAkE;YAClE,MAAM,CAAC,EAAE,MAAM,CAAA;SAChB,CAAA;KACF;CACF;AAED,wCAAwC;AACxC,eAAO,MAAM,cAAc,EAAG,oBAA6B,CAAA;AAE3D,mCAAmC;AACnC,eAAO,MAAM,YAAY,EAAG,kBAA2B,CAAA;AAEvD,6CAA6C;AAC7C,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB,CAAA;AAED,wCAAwC;AACxC,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,CAAA;IAC3C,OAAO,EAAE,IAAI,GAAG,OAAO,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,YAAY,CAAA;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"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"}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -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
|
|
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';
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/lib/types/tools.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/lib/types/version.d.ts
CHANGED
|
@@ -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.
|
|
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
|
|
@@ -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
|
-
|
|
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) {
|
|
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) {
|
|
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) {
|
|
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) {
|
|
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) {
|
|
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
|
-
|
|
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.
|
|
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",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"LICENSE"
|
|
38
38
|
],
|
|
39
39
|
"dsh": {
|
|
40
|
+
"manifestVersion": 1,
|
|
40
41
|
"bundle": {
|
|
41
42
|
"patch": "./cordis.patch.yml"
|
|
42
43
|
}
|
|
@@ -74,7 +75,7 @@
|
|
|
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": {
|