dsh-codex-style-computer-use 2.2.7 → 2.2.9
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/README.md +2 -0
- package/README.zh.md +2 -0
- package/lib/core/bin/dsh-computer-use-worker.exe +0 -0
- package/lib/core/bin/dsh-computer-use-worker.exe.json +2 -2
- package/lib/core/worker.cs +15 -3
- package/package.json +3 -2
- package/scripts/check-behavior.mjs +1 -1
- package/scripts/verify-package.mjs +8 -0
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Codex-style Computer Use
|
|
2
2
|
|
|
3
|
+
[](https://dshopen.org/zh/plugins/dsh-codex-style-computer-use/)
|
|
4
|
+
|
|
3
5
|
**The most precise way to drive Windows from DeepSeek Harness — and the cheapest per task.**
|
|
4
6
|
|
|
5
7
|
Describe the goal. Your agent reads exact control identities, acts through the controls themselves, verifies the result — and finishes a known sequence in one model round trip instead of ten.
|
package/README.zh.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Codex 风格 Computer Use
|
|
2
2
|
|
|
3
|
+
[](https://dshopen.org/zh/plugins/dsh-codex-style-computer-use/)
|
|
4
|
+
|
|
3
5
|
**全市场最精准的 Windows 桌面操控,也是单个任务成本最低的。**
|
|
4
6
|
|
|
5
7
|
你描述目标,AI 读准控件身份、按真实控件执行、回读结果——一段已知流程一轮模型往返就跑完,而不是每个动作各花一轮。
|
|
Binary file
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"format": 1,
|
|
3
3
|
"platform": "win32",
|
|
4
4
|
"architecture": "x64",
|
|
5
|
-
"sourceSha256": "
|
|
6
|
-
"binarySha256": "
|
|
5
|
+
"sourceSha256": "327d3f04c983bfffd22b26d852364224eca839a6110c48379a815757d7312b70",
|
|
6
|
+
"binarySha256": "baed6576f360f9dc777a0c8e718bb82b4edec40593b077e887d0fcc31fd74452"
|
|
7
7
|
}
|
package/lib/core/worker.cs
CHANGED
|
@@ -4938,6 +4938,12 @@ namespace DshComputerUse.Worker
|
|
|
4938
4938
|
// no button), so it is allowed even while the brake is on — which is exactly when
|
|
4939
4939
|
// you want to ask "would this click land where I think?" before re-arming. It must
|
|
4940
4940
|
// never THROW: a failed precondition is the answer it was asked for.
|
|
4941
|
+
// A host click that passed GuardHostDriving (debug mode + full permission) must not
|
|
4942
|
+
// fall through to the generic `blocked != null` refusal below: the gate ALLOWS it,
|
|
4943
|
+
// while `blocked` still carries the preliminary "HOST-GUARDED" label. Clearing both
|
|
4944
|
+
// fields here is what makes the two gates actually usable (the 2026-11-09 report:
|
|
4945
|
+
// host-debug ON, danger-full-access, click still refused as HOST-GUARDED).
|
|
4946
|
+
bool hostClickAllowed = hostVictim && HostDrivingAllowed();
|
|
4941
4947
|
if (dryRun)
|
|
4942
4948
|
{
|
|
4943
4949
|
Dictionary<string, object> dry = Dict(
|
|
@@ -4945,11 +4951,17 @@ namespace DshComputerUse.Worker
|
|
|
4945
4951
|
"receives", under == IntPtr.Zero ? null : (object)(Short(WinTitleOf(under), 50) + " (pid " + PidOf(under) + ")"),
|
|
4946
4952
|
"receivesHwnd", under.ToInt64(),
|
|
4947
4953
|
"expected", want == IntPtr.Zero ? null : (object)(Short(WinTitleOf(want), 50) + " (pid " + PidOf(want) + ")"),
|
|
4948
|
-
"wouldBlock", blocked,
|
|
4949
|
-
"verdict",
|
|
4954
|
+
"wouldBlock", hostClickAllowed ? null : blocked,
|
|
4955
|
+
"verdict", hostClickAllowed ? "ok — host-driving gates are open for this click"
|
|
4956
|
+
: detail == null ? "ok — the pixel belongs to the intended window" : (blocked + ": " + detail));
|
|
4950
4957
|
return dry;
|
|
4951
4958
|
}
|
|
4952
|
-
if (hostVictim)
|
|
4959
|
+
if (hostVictim)
|
|
4960
|
+
{
|
|
4961
|
+
GuardHostDriving(unchecked((int)PidOf(under)), "click");
|
|
4962
|
+
blocked = null;
|
|
4963
|
+
detail = null;
|
|
4964
|
+
}
|
|
4953
4965
|
bool allowCovered = GetB(a, "allowCovered", false);
|
|
4954
4966
|
// NARROWED (2026-11-07): allowCovered is an escape for the target app's OWN embedded
|
|
4955
4967
|
// renderer only. It used to authorise the click whatever owned the pixel, so an
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-codex-style-computer-use",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.9",
|
|
4
4
|
"description": "Codex-style Computer Use for DeepSeek Harness: Windows desktop control, screenshots, UI Automation, human input handoff, approval gates and prebuilt native workers. Install and update from dsh-market without PowerShell 7 or build steps.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"exports": {
|
|
12
12
|
".": "./lib/index.js",
|
|
13
13
|
"./package.json": "./package.json",
|
|
14
|
-
"./cordis.patch.yml": "./cordis.patch.yml"
|
|
14
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
15
|
+
"./client": "./client.js"
|
|
15
16
|
},
|
|
16
17
|
"files": [
|
|
17
18
|
"icon.svg",
|
|
@@ -32,7 +32,7 @@ const excluded = {
|
|
|
32
32
|
}
|
|
33
33
|
const reviewed = new Set([
|
|
34
34
|
'action-feedback', 'agent-pointer', 'approval-attribution', 'ask-invariants', 'ask-merge', 'ask-orphan', 'ask-release',
|
|
35
|
-
'attention-native', 'attention', 'audit-completion', 'batch-coverage', 'buildusermessage', 'bundled-skill',
|
|
35
|
+
'attention-native', 'attention', 'audit-completion', 'batch-coverage', 'buildusermessage', 'bundled-skill', 'client-export',
|
|
36
36
|
'coactive', 'compact-feedback', 'control-targets', 'core-system-recovery', 'cursor', 'cycle-completion',
|
|
37
37
|
'cycle-no-timeout', 'cycle-open', 'desktop-acceptance-io', 'desktop-ownership', 'drag-options', 'evidence-protocol',
|
|
38
38
|
'exit-coherence', 'feedback-cache-integration', 'feedback-policy', 'glow-pump', 'glow-visual', 'handoff-continuation',
|
|
@@ -6,6 +6,14 @@ const root = path.resolve(process.argv[2] || path.join(import.meta.dirname, '..'
|
|
|
6
6
|
const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'))
|
|
7
7
|
assert.equal(pkg.name, 'dsh-codex-style-computer-use')
|
|
8
8
|
assert.equal(pkg.dsh?.bundle?.patch, './cordis.patch.yml')
|
|
9
|
+
// dsh-client-modules discovers the settings bundle through exports["./client"]; without it the
|
|
10
|
+
// client.js below becomes a silent dead file and the settings section never appears.
|
|
11
|
+
assert.equal(pkg.dsh?.client?.platform, 'web', 'dsh.client platform must be web')
|
|
12
|
+
const clientExport = pkg.exports?.['./client']
|
|
13
|
+
assert.ok(clientExport, 'exports["./client"] is required for the settings client bundle')
|
|
14
|
+
const clientTarget = typeof clientExport === 'string' ? clientExport : clientExport?.default
|
|
15
|
+
assert.equal(clientTarget, './client.js', 'exports["./client"] must resolve to ./client.js')
|
|
16
|
+
assert(fs.existsSync(path.join(root, 'client.js')), 'client.js is missing')
|
|
9
17
|
assert.equal(pkg.packageManager, undefined, 'git installs must not invoke a nested package manager')
|
|
10
18
|
for (const hook of ['prepare', 'prepack', 'prepublish', 'prepublishOnly', 'preinstall', 'install', 'postinstall']) assert.equal(pkg.scripts?.[hook], undefined, hook)
|
|
11
19
|
const patch = fs.readFileSync(path.join(root, 'cordis.patch.yml'), 'utf8')
|