dsh-deeppilot 0.9.6 → 0.9.7
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/COMPATIBILITY.md +52 -16
- package/README.md +11 -10
- package/README.zh-CN.md +7 -7
- package/docs/DSH_RELEASE_MEMORY.md +217 -8
- package/docs/NPM_PUBLISHING.md +8 -0
- package/package.json +12 -12
package/COMPATIBILITY.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# Compatibility
|
|
2
2
|
|
|
3
|
-
This branch targets exactly **
|
|
4
|
-
`latest`/`next` channels point at, and `0.2.1-alpha.3
|
|
5
|
-
the `alpha` channel has pointed at in turn. All
|
|
6
|
-
`engines.dsh` and `peerDependencies`; no other version is accepted.
|
|
7
|
-
that declaration before composing a profile — on every start, not
|
|
8
|
-
install — so a newly published DSH release deactivates this plugin until
|
|
9
|
-
list is widened deliberately. That is the intended trade: a plugin that
|
|
10
|
-
run on an unaudited host fails visibly instead of misbehaving quietly.
|
|
11
|
-
decision and the reversal it represents are recorded in
|
|
3
|
+
This branch targets exactly **four DSH releases**: `0.2.0-rc.2`, which the npm
|
|
4
|
+
`latest`/`next` channels point at, and `0.2.1-alpha.3`, `0.2.1-alpha.4`, and
|
|
5
|
+
`0.2.1-alpha.5`, which the `alpha` channel has pointed at in turn. All four are
|
|
6
|
+
named in both `engines.dsh` and `peerDependencies`; no other version is accepted.
|
|
7
|
+
DSH evaluates that declaration before composing a profile — on every start, not
|
|
8
|
+
only on install — so a newly published DSH release deactivates this plugin until
|
|
9
|
+
the list is widened deliberately. That is the intended trade: a plugin that
|
|
10
|
+
cannot run on an unaudited host fails visibly instead of misbehaving quietly.
|
|
11
|
+
The decision and the reversal it represents are recorded in
|
|
12
12
|
[`docs/决策记录.md`](./docs/决策记录.md) (章节一), with the supporting audit in
|
|
13
13
|
[`docs/DSH_RELEASE_MEMORY.md`](./docs/DSH_RELEASE_MEMORY.md).
|
|
14
14
|
|
|
@@ -19,7 +19,7 @@ is covered by the isolated compose and live-runs recorded in the release memory.
|
|
|
19
19
|
| Component | Current contract | Evidence |
|
|
20
20
|
|---|---|---|
|
|
21
21
|
| Node.js | 22 or newer | Package engine and CI |
|
|
22
|
-
| DSH CLI and Host API | `engines.dsh` and `peerDependencies` both name `0.2.0-rc.2 \|\| 0.2.1-alpha.3 \|\| 0.2.1-alpha.4` (dev pins `0.2.0-rc.2`) | Peer metadata, source typecheck, unit tests, bundle build, and config schema projection against a real 0.2.0-rc.2 CLI, plus isolated composes and live phone-protocol runs with the published 0.2.1-alpha.2, 0.2.1-alpha.3, and 0.2.1-alpha.4 CLIs |
|
|
22
|
+
| DSH CLI and Host API | `engines.dsh` and `peerDependencies` both name `0.2.0-rc.2 \|\| 0.2.1-alpha.3 \|\| 0.2.1-alpha.4 \|\| 0.2.1-alpha.5` (dev pins `0.2.0-rc.2`) | Peer metadata, source typecheck, unit tests, bundle build, and config schema projection against a real 0.2.0-rc.2 CLI, plus isolated composes and live phone-protocol runs with the published 0.2.1-alpha.2, 0.2.1-alpha.3, and 0.2.1-alpha.4 CLIs, and an isolated 0.2.1-alpha.5 host where this plugin now composes, starts, and answers `/phone/health` with 200 on its own LAN listener (audit below) |
|
|
23
23
|
| iOS bridge | DeepPilot protocol v2 | Bridge protocol tests; device behavior must be checked with the running Host and app |
|
|
24
24
|
| Remote access | Tailscale Funnel on ports 443, 8443, or 10000 | Helper and supervisor tests |
|
|
25
25
|
|
|
@@ -71,6 +71,39 @@ carries the old top-level `debug: true` is accepted but that value is ignored:
|
|
|
71
71
|
verbose logging must be turned on again from the settings page. No other config
|
|
72
72
|
field changed shape, and the old key is not read anywhere in this version.
|
|
73
73
|
|
|
74
|
+
## 0.2.1-alpha.5 audit outcome
|
|
75
|
+
|
|
76
|
+
The source-level audit of `dsh-v0.2.1-alpha.5` against `dsh-v0.2.1-alpha.4` found
|
|
77
|
+
no runtime break. Of the ten peer packages, **nine have byte-identical `lib/`
|
|
78
|
+
trees** — including `dsh-api-gateway` and the three Client faces the resident
|
|
79
|
+
interaction client loads — so every alpha.3 fix still holds unchanged. Only
|
|
80
|
+
`dsh-api-remotes/lib/client.js` differs: three hunks / 36 lines, all inside the
|
|
81
|
+
`account/getUnnotifiedBonuses` result schema, where the new optional `title`
|
|
82
|
+
field arrives while `campaign`, `amount`, `currency`, and `grantedAt` become
|
|
83
|
+
optional and are forwarded without validation. The file's exported symbols are
|
|
84
|
+
identical, and this plugin does not consume that endpoint, so the change is
|
|
85
|
+
additive from here.
|
|
86
|
+
|
|
87
|
+
The vendor peers need no widening either: both hosts' vendor pins moved from
|
|
88
|
+
prerelease to GA — `cordis 4.0.5-alpha.2` → `4.0.5` and `schemastery
|
|
89
|
+
3.18.5-alpha.2` → `3.18.5` — and both GA releases already satisfy the existing
|
|
90
|
+
`~4.0.5-alpha.1` / `~3.18.5-alpha.1` ranges.
|
|
91
|
+
|
|
92
|
+
The activation verdict is the same shape as alpha.4, with one difference: alpha.5
|
|
93
|
+
resolves the requirements path from a declared `engines.dsh` alone, so its
|
|
94
|
+
refusal names that single requirement rather than the ten peers. Adding
|
|
95
|
+
`0.2.1-alpha.5` to the closed list therefore makes it activate, and the four
|
|
96
|
+
audited hosts pass while `0.2.1-alpha.1`, `0.2.1-alpha.2`, `0.2.0-rc.1`, `0.2.0`,
|
|
97
|
+
`0.2.1-rc.1`, `0.2.1`, `0.3.0-rc.1`, `0.3.0`, `1.0.0`, and `0.1.7-rc.2` remain
|
|
98
|
+
refused.
|
|
99
|
+
|
|
100
|
+
**Audit limits, stated rather than implied.** Loading this plugin on a real
|
|
101
|
+
isolated `0.2.1-alpha.5` host, and the full release check set (unit tests,
|
|
102
|
+
typecheck, build, config-schema check, helper tests) against that host, had
|
|
103
|
+
**not** been completed when this entry was written. Until they are, this release
|
|
104
|
+
is recorded as audited at the declaration and source-diff level only; no plugin
|
|
105
|
+
release has been made from this tree, and nothing here claims one.
|
|
106
|
+
|
|
74
107
|
## 0.2.1-alpha.4 audit outcome
|
|
75
108
|
|
|
76
109
|
The source-level audit of `dsh-v0.2.1-alpha.4` against `dsh-v0.2.1-alpha.3` found
|
|
@@ -89,10 +122,11 @@ plugin's `engines.dsh` range **alone**, ignoring `peerDependencies` entirely
|
|
|
89
122
|
whenever that field is present. A package that declares no `engines.dsh` — as
|
|
90
123
|
this one did — keeps the older peer evaluation, so the previously exact peer
|
|
91
124
|
list rejected `0.2.1-alpha.4` and the plugin would not have activated on it.
|
|
92
|
-
Both declarations
|
|
93
|
-
|
|
94
|
-
changing anything, and the
|
|
95
|
-
while `0.2.1-alpha.2`,
|
|
125
|
+
Both declarations were widened from the previous three-release list to the same
|
|
126
|
+
four releases. The audit reproduced that refusal against the published
|
|
127
|
+
`evaluatePluginCompatibility` of both hosts before changing anything, and the
|
|
128
|
+
same harness confirms the four audited hosts pass while `0.2.1-alpha.2`,
|
|
129
|
+
`0.2.1`, and `0.3.0` still fail.
|
|
96
130
|
|
|
97
131
|
Nothing else moved. Protocol v2, pairing state, and device records are untouched,
|
|
98
132
|
so no paired phone needs to re-pair, and the vendor peers need no widening: both
|
|
@@ -175,8 +209,10 @@ needs a documentation update, not a peer-range widening.
|
|
|
175
209
|
> versions actually audited, `0.2.0-rc.2` and `0.2.1-alpha.3`; see the
|
|
176
210
|
> 0.2.1-alpha.3 outcome above and `docs/决策记录.md` (章节一). The paragraphs in
|
|
177
211
|
> this historical entry describe the policy as it stood on 2026-09-29.
|
|
178
|
-
> `0.2.1-alpha.4` was added the next day by
|
|
179
|
-
> the
|
|
212
|
+
> **This note is in turn superseded:** `0.2.1-alpha.4` was added the next day by
|
|
213
|
+
> the same deliberate audit step, `0.2.1-alpha.5` on 2026-10-16, and the closed
|
|
214
|
+
> four-release list now lives in `engines.dsh` as well as in `peerDependencies`.
|
|
215
|
+
> See the 0.2.1-alpha.5 outcome above.
|
|
180
216
|
|
|
181
217
|
## 0.2.0-rc.1 audit outcome
|
|
182
218
|
|
package/README.md
CHANGED
|
@@ -32,17 +32,18 @@ Host on your own computer and does not replace or modify the DSH Web UI.
|
|
|
32
32
|
|
|
33
33
|
## Install from npm
|
|
34
34
|
|
|
35
|
-
This source checkout targets Node.js 22+ and the
|
|
35
|
+
This source checkout targets Node.js 22+ and the four DSH releases it has been
|
|
36
36
|
audited against — `0.2.0-rc.2` (the `latest`/`next` channels) and the `alpha`
|
|
37
|
-
channel releases `0.2.1-alpha.3` and `0.2.1-alpha.
|
|
38
|
-
checks a plugin's declared requirements before composing a
|
|
39
|
-
start rather than only on install, so any other host version
|
|
40
|
-
this plugin. From DSH `0.2.1-alpha.4` on, that check reads
|
|
41
|
-
ignores `peerDependencies`; older hosts know only the peer
|
|
42
|
-
the same
|
|
43
|
-
and Windows on amd64/arm64; trusted-LAN mode does not require
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
channel releases `0.2.1-alpha.3`, `0.2.1-alpha.4`, and `0.2.1-alpha.5` — with a
|
|
38
|
+
`web` profile. DSH checks a plugin's declared requirements before composing a
|
|
39
|
+
profile, on every start rather than only on install, so any other host version
|
|
40
|
+
refuses to activate this plugin. From DSH `0.2.1-alpha.4` on, that check reads
|
|
41
|
+
`engines.dsh` and ignores `peerDependencies`; older hosts know only the peer
|
|
42
|
+
range, so both name the same four releases. The package includes Funnel helpers
|
|
43
|
+
for macOS, Linux, and Windows on amd64/arm64; trusted-LAN mode does not require
|
|
44
|
+
the helper.
|
|
45
|
+
|
|
46
|
+
The current working tree names exactly those four versions in `engines.dsh` and
|
|
46
47
|
`peerDependencies` and is built/typechecked against `0.2.0-rc.2`. A previously
|
|
47
48
|
published plugin package may still carry its own older compatibility
|
|
48
49
|
declaration until a release is made from this tree.
|
package/README.zh-CN.md
CHANGED
|
@@ -30,16 +30,16 @@
|
|
|
30
30
|
|
|
31
31
|
## 从 npm 安装
|
|
32
32
|
|
|
33
|
-
当前源码面向 Node.js 22+ 与带 `web` profile
|
|
34
|
-
`0.2.0-rc.2`(`latest`/`next` 通道),以及 `alpha` 通道的 `0.2.1-alpha.3
|
|
35
|
-
与 `0.2.1-alpha.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
`peerDependencies`;更早的宿主只认 peer
|
|
33
|
+
当前源码面向 Node.js 22+ 与带 `web` profile 的**四个已审计 DSH 版本**:
|
|
34
|
+
`0.2.0-rc.2`(`latest`/`next` 通道),以及 `alpha` 通道的 `0.2.1-alpha.3`、
|
|
35
|
+
`0.2.1-alpha.4` 与 `0.2.1-alpha.5`。DSH 在组合 profile 前会校验插件声明的
|
|
36
|
+
兼容要求,且**每次启动都会校验**(不只是安装时),因此其他宿主版本会拒绝
|
|
37
|
+
激活本插件。从 DSH `0.2.1-alpha.4` 起,该校验只读 `engines.dsh` 并忽略
|
|
38
|
+
`peerDependencies`;更早的宿主只认 peer 范围,因此两处列出同一组四个版本。
|
|
39
39
|
npm 包内置 macOS、Linux、Windows 的 amd64/arm64 Funnel helper;可信局域网
|
|
40
40
|
模式不依赖 helper。
|
|
41
41
|
|
|
42
|
-
当前工作树的 `engines.dsh` 与 `peerDependencies`
|
|
42
|
+
当前工作树的 `engines.dsh` 与 `peerDependencies` 精确列出这四个版本,构建与
|
|
43
43
|
类型检查针对 `0.2.0-rc.2`。从此工作树发布新版本前,已发布的旧插件包仍可能
|
|
44
44
|
带有各自旧的兼容声明。
|
|
45
45
|
|
|
@@ -3,7 +3,100 @@
|
|
|
3
3
|
> This is the durable audit record for DeepPilot's public DSH plugin. Re-audit
|
|
4
4
|
> the next DSH release instead of assuming that an rc upgrade is runtime-safe.
|
|
5
5
|
|
|
6
|
-
## Current decision — `dsh-v0.2.1-alpha.
|
|
6
|
+
## Current decision — `dsh-v0.2.1-alpha.5`
|
|
7
|
+
|
|
8
|
+
- **Audited release:** `dsh-v0.2.1-alpha.5`, the newest `alpha` channel release.
|
|
9
|
+
It is **not** `latest`; `latest`/`next` still point at `0.2.0-rc.2`.
|
|
10
|
+
- **Comparison baseline:** `dsh-v0.2.1-alpha.4` (the previous audited tag).
|
|
11
|
+
- **Plugin runtime verdict: no break, and no `src/` change was needed.** Nine of
|
|
12
|
+
the ten peer packages ship a byte-identical `lib/` tree, including
|
|
13
|
+
`dsh-api-gateway` and the three Client faces the resident interaction client
|
|
14
|
+
loads, so every alpha.3 fix still holds unchanged.
|
|
15
|
+
- **The one code difference is schema-only and additive.**
|
|
16
|
+
`@deepseek-ai/dsh-api-remotes/lib/client.js` is the only differing `lib/` file
|
|
17
|
+
among the ten peers: **three hunks, 36 changed lines** (14 insertions, 22
|
|
18
|
+
deletions), all inside the `account/getUnnotifiedBonuses` result schema. The
|
|
19
|
+
new `title` field is added as optional; `campaign`, `amount`, `currency`, and
|
|
20
|
+
`grantedAt` are relaxed to optional and the first three lose their validation
|
|
21
|
+
(`campaign` becomes "forwarded without validation", `amount` and `currency`
|
|
22
|
+
become unconstrained JSON); only the descriptions of `expiresAt` changed.
|
|
23
|
+
`orderId`, `expiresAt`, and `message` stay required. The module's **exported
|
|
24
|
+
symbols are identical** — both versions assign exactly `exports.apply` and
|
|
25
|
+
`exports.inject` — and this plugin does not consume that endpoint, so the
|
|
26
|
+
change cannot reach any call it makes.
|
|
27
|
+
- **Activation verdict: the new release is admitted by both declarations.** This
|
|
28
|
+
is the third consecutive release on this line to trip the deliberate
|
|
29
|
+
closed-list policy: alpha.5 was refused before the widening. alpha.5 reads a
|
|
30
|
+
declared `engines.dsh` alone, so its refusal reported a **single**
|
|
31
|
+
`engines.dsh` requirement rather than ten peers, and `exempted: false` — the
|
|
32
|
+
list is the only thing that admits a host, and no exemption fallback exists on
|
|
33
|
+
this machine (no profile `compatibility.json`).
|
|
34
|
+
- **Evidence: reproduced against the published evaluator, plus an isolated
|
|
35
|
+
host run.** The audit called alpha.5's own published
|
|
36
|
+
`evaluatePluginCompatibility` with empty exemptions against this plugin's real
|
|
37
|
+
`package.json`, over one candidate list. Raw output:
|
|
38
|
+
`.alpha5-verify/tmp-matrix-early.out.json` (13 candidates, `matrixAllPass:
|
|
39
|
+
true`) and `.alpha5-verify/stage1-baseline.out.json` (the pre-change baseline).
|
|
40
|
+
Accepted after the change: `0.2.1-alpha.5`, `0.2.1-alpha.3`,
|
|
41
|
+
`0.2.1-alpha.4`, and the stable `latest` host. Still refused:
|
|
42
|
+
`0.2.1-alpha.1`, `0.2.1-alpha.2`, `0.2.0-rc.1`, `0.2.0`, `0.2.1-rc.1`,
|
|
43
|
+
`0.2.1`, `0.3.0-rc.1`, `0.3.0`, `1.0.0`, and `0.1.7-rc.2`. The same file
|
|
44
|
+
confirms declaration sync: `engines.dsh` equals the `@deepseek-ai/dsh` peer
|
|
45
|
+
range, all ten peers share one range, and the token count is 4.
|
|
46
|
+
`.alpha5-verify/VERIFICATION.md` separately records the refusal on an isolated
|
|
47
|
+
alpha.5 host: `dsh: skipping profile bundle "dsh-deeppilot": … incompatible
|
|
48
|
+
with dsh 0.2.1-alpha.5: requirements {"engines.dsh":…}`, with the host itself
|
|
49
|
+
still booting (`/phone/health` → 404, so the plugin was genuinely not loaded).
|
|
50
|
+
`.alpha5-verify/stage1-dumpconfig-phaseA.stderr.txt`,
|
|
51
|
+
`stage1-dumpconfig-phaseA.stdout.txt`, and `stage1-host-phaseA.log` hold the
|
|
52
|
+
raw logs.
|
|
53
|
+
- **Vendor pins promoted to GA, with no range change needed.** Both hosts'
|
|
54
|
+
vendored third parties moved from prerelease to GA — `cordis
|
|
55
|
+
4.0.5-alpha.2` → `4.0.5`, `schemastery 3.18.5-alpha.2` → `3.18.5`. Both GA
|
|
56
|
+
releases already satisfy the existing `~4.0.5-alpha.1` / `~3.18.5-alpha.1`
|
|
57
|
+
ranges, so the two vendor peers stay as they are.
|
|
58
|
+
`.alpha5-verify/stage1-semver-vendor.out.json` cross-checks that with four
|
|
59
|
+
independent solver paths (host `semver` and repo `semver`, each with and
|
|
60
|
+
without `includePrerelease`), all four agreeing.
|
|
61
|
+
- **Install verdict: the two declarations now agree on four releases.**
|
|
62
|
+
`engines.dsh` and all ten `@deepseek-ai/dsh*` peers name `0.2.0-rc.2 ||
|
|
63
|
+
0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5`, mirrored in
|
|
64
|
+
`tests/compatibility-metadata.test.ts`, `package-lock.json` (root entry only),
|
|
65
|
+
both READMEs, `COMPATIBILITY.md`, `AGENTS.md`, and the local
|
|
66
|
+
`docs/决策记录.md` (章节一, 条目4). The dev pins and `DSH_BASELINE` stay at the
|
|
67
|
+
exact `0.2.0-rc.2` this branch builds and typechecks against.
|
|
68
|
+
- **Protocol verdict: no phone-protocol change.** Protocol v2, pairing state, and
|
|
69
|
+
device records are untouched by this release; no phone needs to re-pair.
|
|
70
|
+
- **Post-widening verification — completed for the 0.9.7 preparation.**
|
|
71
|
+
- **C7 — real load on an isolated alpha.5 host: passed.** With the widened
|
|
72
|
+
declaration in place, the profile that used to be refused now composes and
|
|
73
|
+
starts. `--dump-config` writes nothing to stderr and no longer emits
|
|
74
|
+
`skipping profile bundle` (the pre-change baseline emitted 21 such lines); the
|
|
75
|
+
composed tree contains `# == dsh-deeppilot` together with
|
|
76
|
+
`# == @deepseek-ai/dsh-web-app, patched by dsh-deeppilot`; the running host
|
|
77
|
+
logs four `[deeppilot]` lines (`device registry loaded`, `data plane active`,
|
|
78
|
+
`LAN TLS identity created`, `local transport listening on https://0.0.0.0:3098`);
|
|
79
|
+
and `https://127.0.0.1:3098/phone/health` answers `200` with
|
|
80
|
+
`{"ok":true,"enabled":true,"protocolVersion":2,"serverVersion":"0.9.6","dataPlane":true}`.
|
|
81
|
+
- **Probe note — use the plugin's own listener, not DSH's web port.** The
|
|
82
|
+
pre-change baseline cited `http://127.0.0.1:3281/phone/health = 404` as its
|
|
83
|
+
refusal evidence. That probe has no discriminating power: `/phone/health` is
|
|
84
|
+
served by this plugin's own narrow LAN listener (`src/phone-server.ts`), which
|
|
85
|
+
by design never inherits DSH's wider web/API route surface, so the DSH web
|
|
86
|
+
port answers 404 whether or not the plugin loaded. The valid refusal evidence
|
|
87
|
+
was the skip warning; the valid positive evidence is port 3098.
|
|
88
|
+
- **C5/C6 — the full check set: passed in the release tree.** Clean `npm ci`,
|
|
89
|
+
repo-wide `npm test` (564 tests, 563 pass, 0 fail, 1 pre-existing TODO),
|
|
90
|
+
`npm run typecheck`, `npm run build` (regenerated `lib/` byte-identical to the
|
|
91
|
+
committed tree), `npm run check:config-schema` against the pinned
|
|
92
|
+
`0.2.0-rc.2` CLI, `go test ./...` for the helper, and all six
|
|
93
|
+
`bin/SHA256SUMS` entries verified.
|
|
94
|
+
- **Nothing has been published from this tree yet.** `package.json` reads `0.9.7`
|
|
95
|
+
on the release branch; no tag, registry version, or GitHub release corresponds
|
|
96
|
+
to it yet. This entry records an audit, a declaration sync, and the local
|
|
97
|
+
preparation of 0.9.7 — **not** a published release.
|
|
98
|
+
|
|
99
|
+
### Previous decision — `dsh-v0.2.1-alpha.4`
|
|
7
100
|
|
|
8
101
|
- **Audited release:** `dsh-v0.2.1-alpha.4` (official release page:
|
|
9
102
|
<https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.1-alpha.4>),
|
|
@@ -45,15 +138,20 @@
|
|
|
45
138
|
hosts admit all three audited releases; alpha.4 reports a **single**
|
|
46
139
|
`engines.dsh` requirement instead of ten peers when it refuses; and
|
|
47
140
|
`0.2.1-alpha.2`, `0.2.1-alpha.5`, `0.2.1`, and `0.3.0` are still refused.
|
|
141
|
+
*(Historical: `0.2.1-alpha.5` was admitted the next day by the audit above.)*
|
|
48
142
|
alpha.3 ignores `engines.dsh` entirely — the field did not exist yet — and
|
|
49
143
|
keeps deciding on `peerDependencies`, which is why both declarations must name
|
|
50
144
|
the same list.
|
|
51
|
-
- **Install verdict: the two declarations
|
|
52
|
-
`@deepseek-ai/dsh*` peers
|
|
53
|
-
|
|
145
|
+
- **Install verdict: the two declarations agreed at that point (widened since).**
|
|
146
|
+
`engines.dsh` and all ten `@deepseek-ai/dsh*` peers named `0.2.0-rc.2 ||
|
|
147
|
+
0.2.1-alpha.3 || 0.2.1-alpha.4`, mirrored in
|
|
148
|
+
`tests/compatibility-metadata.test.ts`, `package-lock.json`, both
|
|
54
149
|
READMEs, `COMPATIBILITY.md`, `AGENTS.md`, and the local `docs/决策记录.md`
|
|
55
150
|
(章节一, 条目3). The dev pins and `DSH_BASELINE` stay at the exact
|
|
56
|
-
`0.2.0-rc.2` this branch builds and typechecks against.
|
|
151
|
+
`0.2.0-rc.2` this branch builds and typechecks against. **Historical note:**
|
|
152
|
+
`0.2.1-alpha.5` was appended to both lists on 2026-10-16 by the audit above,
|
|
153
|
+
which now owns the current list; the four documentation mirrors that still
|
|
154
|
+
said「三个版本」were corrected there.
|
|
57
155
|
- **Vendor peers need no widening.** Both hosts still vendor `cordis
|
|
58
156
|
4.0.5-alpha.2` and `schemastery 3.18.5-alpha.2`; neither package published a
|
|
59
157
|
`dsh-0-2-1-alpha-4` dist-tag, and the existing `~4.0.5-alpha.1` /
|
|
@@ -389,6 +487,116 @@
|
|
|
389
487
|
bundle" below. The plugin needs no code change; the phone's copy now points
|
|
390
488
|
at the bundle.
|
|
391
489
|
|
|
490
|
+
## 2026-10-16 — audit of `dsh-v0.2.1-alpha.5`
|
|
491
|
+
|
|
492
|
+
The first release on this line whose entire plugin-facing change surface is
|
|
493
|
+
additive. It is the third consecutive release to trip the closed-list policy: a
|
|
494
|
+
new DSH tag refuses to activate this plugin until the list is widened by an
|
|
495
|
+
audit, which is the behaviour the 2026-10-14 reversal chose on purpose.
|
|
496
|
+
|
|
497
|
+
### Method
|
|
498
|
+
|
|
499
|
+
The comparison used the **installed artifacts** of the alpha.4 and alpha.5 hosts
|
|
500
|
+
already unpacked on this machine, not release notes and not the monorepo: every
|
|
501
|
+
`@deepseek-ai/dsh*` peer package's `lib/` directory was compared file by file,
|
|
502
|
+
and the single differing file was then read as a diff. `dsh-client-ui-slots` is
|
|
503
|
+
not hoisted into either host's `node_modules` root (it resolves only inside a
|
|
504
|
+
composed profile), so both of its published versions were pulled from npm
|
|
505
|
+
(`0.2.1-alpha.4` and `0.2.1-alpha.5`, 31,973 bytes each) and compared in full to
|
|
506
|
+
close that gap rather than assume it.
|
|
507
|
+
|
|
508
|
+
### Change surface
|
|
509
|
+
|
|
510
|
+
- **Nine of the ten peer packages carry a byte-identical `lib/` tree**:
|
|
511
|
+
`dsh`, `dsh-api-gateway`, `dsh-client-connection`, `dsh-client-locale`,
|
|
512
|
+
`dsh-client-ui-settings`, `dsh-client-ui-slots`, `dsh-settings`,
|
|
513
|
+
`dsh-typert-protocol`, `dsh-typert-registry`. The tenth is `dsh-api-remotes`.
|
|
514
|
+
- **`dsh-api-remotes/lib/client.js` — three hunks, 36 changed lines.** Every
|
|
515
|
+
hunk is the `account/getUnnotifiedBonuses` result schema:
|
|
516
|
+
- `title` is added, optional, described as a server-localised plain-text title
|
|
517
|
+
that absent responses replace with the localised bonus title.
|
|
518
|
+
- `campaign`, `amount`, `currency`, and `grantedAt` become optional; `campaign`
|
|
519
|
+
becomes unvalidated pass-through JSON, `amount` and `currency` lose their
|
|
520
|
+
string / `CNY|USD` constraints, and `grantedAt` loses its description.
|
|
521
|
+
- The JSON Schema side mirrors that: `title` is added to `properties`, and
|
|
522
|
+
`campaign`, `amount`, `currency`, and `grantedAt` are dropped from
|
|
523
|
+
`required`. `orderId`, `expiresAt`, and `message` remain required.
|
|
524
|
+
- **The exported symbols are unchanged**: the module assigns exactly
|
|
525
|
+
`exports.apply` and `exports.inject` on both sides.
|
|
526
|
+
- This plugin does not call `account/getUnnotifiedBonuses`, so even the field
|
|
527
|
+
that did tighten (`expiresAt`'s documented semantics) cannot reach it.
|
|
528
|
+
- **The vendor pins moved from prerelease to GA.** The `dsh` CLI's vendored
|
|
529
|
+
third parties went `cordis 4.0.5-alpha.2` → `4.0.5` and `schemastery
|
|
530
|
+
3.18.5-alpha.2` → `3.18.5`. Both GA releases already satisfy the plugin's
|
|
531
|
+
existing `~4.0.5-alpha.1` / `~3.18.5-alpha.1` ranges, so **no vendor widening
|
|
532
|
+
was needed**; the ranges were left untouched.
|
|
533
|
+
- **The activation rule did not change again.** alpha.5 keeps alpha.4's
|
|
534
|
+
requirements path: a declared `engines.dsh` decides alone and short-circuits the
|
|
535
|
+
peer loop. That is why the refusal is reported as one requirement instead of
|
|
536
|
+
ten.
|
|
537
|
+
|
|
538
|
+
### Validation evidence
|
|
539
|
+
|
|
540
|
+
- **Compatibility matrix against the published evaluator.** alpha.5's own
|
|
541
|
+
published `evaluatePluginCompatibility`, called with empty exemptions against
|
|
542
|
+
this plugin's real `package.json` over 13 candidates →
|
|
543
|
+
`.alpha5-verify/tmp-matrix-early.out.json`, `matrixAllPass: true`. Accepted:
|
|
544
|
+
`0.2.1-alpha.5` (the target), `0.2.1-alpha.3`, `0.2.1-alpha.4`, and the stable
|
|
545
|
+
host. Refused, each with `exempted: false`: `0.2.1-alpha.1`,
|
|
546
|
+
`0.2.1-alpha.2`, `0.2.0-rc.1`, `0.2.0`, `0.2.1-rc.1`, `0.2.1`, `0.3.0-rc.1`,
|
|
547
|
+
`0.3.0`, `1.0.0`, `0.1.7-rc.2`. The same file's `declarationSync` block
|
|
548
|
+
reports `engines.dsh === @deepseek-ai/dsh peer range`, all ten peers on one
|
|
549
|
+
range, and four unique `engines.dsh` tokens.
|
|
550
|
+
- **Pre-change baseline, the same evaluator.** `.alpha5-verify/stage1-baseline.out.json`
|
|
551
|
+
shows the unchanged declaration refusing `0.2.1-alpha.5` with
|
|
552
|
+
`requirements: { "engines.dsh": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4" }`
|
|
553
|
+
and `exempted: false` — the failure this audit removes.
|
|
554
|
+
- **Isolated alpha.5 host, pre-change.** `.alpha5-verify/VERIFICATION.md` and
|
|
555
|
+
`stage1-dumpconfig-phaseA.stderr.txt` record the real CLI refusing the plugin:
|
|
556
|
+
`dsh: skipping profile bundle "dsh-deeppilot": Error: Plugin
|
|
557
|
+
dsh-deeppilot@0.9.6 is incompatible with dsh 0.2.1-alpha.5: requirements
|
|
558
|
+
{"engines.dsh":…}`, `Exact-version exemption: not active`. The host still
|
|
559
|
+
booted (`stage1-host-phaseA.log`, `--port 3280`) and `/phone/health` returned
|
|
560
|
+
404, which is what shows the plugin really was not loaded rather than silently
|
|
561
|
+
active.
|
|
562
|
+
- **Vendor semver, four independent paths.** `.alpha5-verify/stage1-semver-vendor.out.json`
|
|
563
|
+
resolves the two vendor ranges with the host tree's `semver` and the repo's
|
|
564
|
+
`semver`, each with and without `includePrerelease`; all four agree that
|
|
565
|
+
`4.0.5` and `3.18.5` (and the previously audited `4.0.4`, `4.0.5-alpha.2`,
|
|
566
|
+
`3.18.4`, `3.18.5-alpha.2`) satisfy, and that `9.9.9` does not.
|
|
567
|
+
- **Targeted unit test.** `node --import tsx --test tests/compatibility-metadata.test.ts`
|
|
568
|
+
→ 5 tests, 5 pass, 0 fail, after `DSH_PEER_RANGE`, `DSH_ENGINES_RANGE`,
|
|
569
|
+
`DSH_ALPHA_HOSTS`, the rejection lists, and the vendor pins were updated. The
|
|
570
|
+
test file's contrast set still refuses `0.2.1-alpha.1`, `0.2.1-alpha.2`,
|
|
571
|
+
`0.2.0`, `0.2.1-rc.1`, `0.2.1`, `0.3.0`, and `1.0.0`, so the widening did not
|
|
572
|
+
turn into an open range.
|
|
573
|
+
|
|
574
|
+
### Verification status
|
|
575
|
+
|
|
576
|
+
- **C7 — real load on an isolated alpha.5 host: passed.** The same isolated
|
|
577
|
+
profile that was refused before the widening now composes and starts: no
|
|
578
|
+
`skipping profile bundle` warning (0 bytes on stderr, was 21 lines), the tree
|
|
579
|
+
contains `# == dsh-deeppilot` and the web-app patch, the host logs four
|
|
580
|
+
`[deeppilot]` lines, and `https://127.0.0.1:3098/phone/health` answers `200`
|
|
581
|
+
with `serverVersion` matching the tree under test. The run happened before the
|
|
582
|
+
version bump, so that field read `0.9.6`; the release tree differs from the tree
|
|
583
|
+
under test only in the declaration documents and the version fields. Port 3098 —
|
|
584
|
+
not DSH's web port — is the probe with discriminating power; see the note under
|
|
585
|
+
Current decision.
|
|
586
|
+
- **The full check set for this tree (C5/C6): passed.** Clean `npm ci`, repo-wide
|
|
587
|
+
`npm test` (564 tests, 563 pass, 0 fail, 1 pre-existing TODO),
|
|
588
|
+
`npm run typecheck`, `npm run build` with a byte-identical regenerated `lib/`,
|
|
589
|
+
`npm run check:config-schema` against the pinned `0.2.0-rc.2` CLI, the Go helper
|
|
590
|
+
tests, and the six `bin/SHA256SUMS` entries.
|
|
591
|
+
- **No release action yet.** `package.json` reads `0.9.7` on the release branch;
|
|
592
|
+
nothing was published, tagged, or pushed. The widened list reaches users only
|
|
593
|
+
through that release.
|
|
594
|
+
- **The declaration mirrors have drifted historically.** `README.md`,
|
|
595
|
+
`README.zh-CN.md`, `COMPATIBILITY.md`, and `AGENTS.md` all said "three
|
|
596
|
+
releases" while `package.json` already named four; that contradiction was
|
|
597
|
+
corrected in this pass. Any future widening must update all of them together —
|
|
598
|
+
the unit test only pins `package.json` and `package-lock.json`.
|
|
599
|
+
|
|
392
600
|
## 2026-10-15 — audit of `dsh-v0.2.1-alpha.4`
|
|
393
601
|
|
|
394
602
|
`dsh-v0.2.1-alpha.4` reached npm on 2026-10-15T13:08:08Z, roughly 24 hours after
|
|
@@ -470,9 +678,10 @@ substitution the peer path performs, so any `workspace:` range there is unmet.
|
|
|
470
678
|
peers as unmet. With the added `engines.dsh` range, both hosts admit all three
|
|
471
679
|
audited releases; alpha.4 reports a **single** `engines.dsh` requirement
|
|
472
680
|
instead of ten peers when it refuses; and `0.2.1-alpha.2`, `0.2.1-alpha.5`,
|
|
473
|
-
`0.2.1`, and `0.3.0` remain refused.
|
|
474
|
-
|
|
475
|
-
|
|
681
|
+
`0.2.1`, and `0.3.0` remain refused.
|
|
682
|
+
*(Historical: `0.2.1-alpha.5` was admitted the next day — see the audit of that
|
|
683
|
+
release above.)* alpha.3 ignores `engines.dsh` entirely and keeps deciding
|
|
684
|
+
on `peerDependencies`, which is why both declarations must name the same list.
|
|
476
685
|
- **Live A/B install on the published alpha.4 CLI — the evidence that matters.**
|
|
477
686
|
Under an isolated `DSH_HOME`, the **unchanged** package was rejected outright:
|
|
478
687
|
`dsh: installation rejected: Plugin dsh-deeppilot@0.9.5 is incompatible with
|
package/docs/NPM_PUBLISHING.md
CHANGED
|
@@ -79,6 +79,14 @@
|
|
|
79
79
|
4. `0.9.5` 已完成首次 OIDC 身份认证发布;npm 绑定显示 `Valid`(有效),
|
|
80
80
|
来源证明签名、压缩包摘要与两个支持宿主的注册表安装核验通过。首次运行的末尾
|
|
81
81
|
核对因缓存失败,其上传步骤成功;发布证据及边界见 `docs/DSH_RELEASE_MEMORY.md`。
|
|
82
|
+
5. `0.9.6` 复现了同一形态:OIDC 上传与来源证明步骤成功,紧随其后的核对步骤在
|
|
83
|
+
12 次重试后仍抛 `读取 npm 发布信息失败(dsh-deeppilot/0.9.6,HTTP 404)`,
|
|
84
|
+
整次运行结论因此为失败。事后核验 `npm view dsh-deeppilot dist-tags --prefer-online`
|
|
85
|
+
得到 `latest = 0.9.6`、发布时间与该版本的来源证明均齐全,确认根因是注册表元数据
|
|
86
|
+
的可见性延迟,不是上传失败。该窗口已在 0.9.7 放宽:最多 24 次核对、间隔 5 秒
|
|
87
|
+
线性递增并封顶 20 秒(约 7 分钟),仍然只读元数据、不重复上传包。这样既避免
|
|
88
|
+
「上传成功 + 核对延迟」在 Actions 页留下误导性的红色结论,也不会把真正的失败
|
|
89
|
+
伪装成成功——超出窗口依旧抛错。
|
|
82
90
|
|
|
83
91
|
## 五、官方资料
|
|
84
92
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-deeppilot",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.7",
|
|
4
4
|
"description": "DeepPilot companion plugin for DeepSeek Harness: use DSH from a native iPhone app over an authenticated, direct connection to your own computer.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
},
|
|
84
84
|
"engines": {
|
|
85
85
|
"node": ">=22",
|
|
86
|
-
"dsh": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4"
|
|
86
|
+
"dsh": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5"
|
|
87
87
|
},
|
|
88
88
|
"publishConfig": {
|
|
89
89
|
"access": "public"
|
|
@@ -95,16 +95,16 @@
|
|
|
95
95
|
},
|
|
96
96
|
"peerDependencies": {
|
|
97
97
|
"@deepseek-ai/cordis": "~4.0.4 || ~4.0.5-alpha.1",
|
|
98
|
-
"@deepseek-ai/dsh": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4",
|
|
99
|
-
"@deepseek-ai/dsh-api-gateway": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4",
|
|
100
|
-
"@deepseek-ai/dsh-api-remotes": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4",
|
|
101
|
-
"@deepseek-ai/dsh-client-connection": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4",
|
|
102
|
-
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4",
|
|
103
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4",
|
|
104
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4",
|
|
105
|
-
"@deepseek-ai/dsh-settings": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4",
|
|
106
|
-
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4",
|
|
107
|
-
"@deepseek-ai/dsh-typert-registry": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4",
|
|
98
|
+
"@deepseek-ai/dsh": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
|
|
99
|
+
"@deepseek-ai/dsh-api-gateway": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
|
|
100
|
+
"@deepseek-ai/dsh-api-remotes": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
|
|
101
|
+
"@deepseek-ai/dsh-client-connection": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
|
|
102
|
+
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
|
|
103
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
|
|
104
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
|
|
105
|
+
"@deepseek-ai/dsh-settings": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
|
|
106
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
|
|
107
|
+
"@deepseek-ai/dsh-typert-registry": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
|
|
108
108
|
"@deepseek-ai/schemastery": "~3.18.4 || ~3.18.5-alpha.1",
|
|
109
109
|
"react": "^19.2.8"
|
|
110
110
|
},
|